[OSADL-svn-commits] r57 - in fddi-20070618-1-trunk: include/osadl src tests
OSADL repository commits
osadl-svn-commits at lists.osadl.org
Tue Oct 2 11:45:14 CEST 2007
Author: robert
Date: Thu Jul 12 17:49:32 2007
New Revision: 57
Log:
more modbus additions (not working yet)
Modified:
fddi-20070618-1-trunk/include/osadl/fddi_tpu.h
fddi-20070618-1-trunk/src/libfddi.c
fddi-20070618-1-trunk/src/libfddi_libmodbus.c
fddi-20070618-1-trunk/tests/GNUmakefile.am
fddi-20070618-1-trunk/tests/test_fddi_libmodbus1.c
Modified: fddi-20070618-1-trunk/include/osadl/fddi_tpu.h
==============================================================================
--- fddi-20070618-1-trunk/include/osadl/fddi_tpu.h (original)
+++ fddi-20070618-1-trunk/include/osadl/fddi_tpu.h Thu Jul 12 17:49:32 2007
@@ -40,10 +40,14 @@
/* private */
struct fddi_tpu *next; /* TODO: generic list */
struct fddi_tpu *previous;
+
fddi_pv_t *pv_list_head;
unsigned long flags;
char *payload;
+ void *callback_arg;
+ int (*callback) (fddi_tpu_t *tpu, void *arg);
+
void *priv;
};
@@ -53,9 +57,9 @@
extern int fddi_tpu_getid(fddi_tpu_t *tpu, fddi_id_t *id);
extern int fddi_tpu_gettimestamp(fddi_tpu_t *tpu, int *timestamp); /* FIXME tv */
extern int fddi_tpu_getflags(fddi_tpu_t *tpu, unsigned long *flags);
-extern int fddi_tpu_setcallback(fddi_tpu_t *tpu, int(*tpu_callback)(fddi_tpu_t *tpu));
+extern int fddi_tpu_setcallback(fddi_tpu_t *tpu, int(*tpu_callback)(fddi_tpu_t *tpu, void *arg), void *arg);
extern int fddi_tpu_getpvlist(fddi_tpu_t *tpu, fddi_pv_t **pv);
extern int fddi_tpu_getpayload(fddi_tpu_t *tpu, char **payload);
-extern int fddi_tpu_send(fddi_tpu_t *tpu);
+extern int fddi_tpu_transfer(fddi_tpu_t *tpu);
#endif
Modified: fddi-20070618-1-trunk/src/libfddi.c
==============================================================================
--- fddi-20070618-1-trunk/src/libfddi.c (original)
+++ fddi-20070618-1-trunk/src/libfddi.c Thu Jul 12 17:49:32 2007
@@ -428,12 +428,15 @@
return 0;
}
-int fddi_tpu_setcallback(fddi_tpu_t *tpu, int(*tpu_callback)(fddi_tpu_t *tpu))
+int fddi_tpu_setcallback(fddi_tpu_t *tpu, int(*tpu_callback)(fddi_tpu_t *tpu, void *arg), void *arg)
{
if ((!tpu) || (!tpu_callback))
return EINVAL;
- return -1; /* FIXME: not implemented yet */
+ tpu->callback = tpu_callback;
+ tpu->callback_arg = arg;
+
+ return 0;
}
int fddi_tpu_getpvlist(fddi_tpu_t *tpu, fddi_pv_t **pv)
@@ -454,9 +457,19 @@
return 0;
}
-int fddi_tpu_send(fddi_tpu_t *tpu)
+int fddi_tpu_transfer(fddi_tpu_t *tpu)
{
- return -1; /* FIXME: not implemented yet */
+ if ((tpu->direction == IN) || (tpu->direction == INOUT)) {
+
+
+ }
+
+ if ((tpu->direction == OUT) || (tpu->direction == INOUT)) {
+
+
+ }
+
+ return 0;
}
Modified: fddi-20070618-1-trunk/src/libfddi_libmodbus.c
==============================================================================
--- fddi-20070618-1-trunk/src/libfddi_libmodbus.c (original)
+++ fddi-20070618-1-trunk/src/libfddi_libmodbus.c Thu Jul 12 17:49:32 2007
@@ -3,8 +3,12 @@
*/
#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <time.h>
+
#include <osadl/fddi.h>
static fddi_tpu_t tpu = {
@@ -13,7 +17,7 @@
.index = -1,
.postfix = "",
},
- .direction = IN,
+ .direction = OUT,
.cycletime = (10*1000*1000),
};
@@ -56,12 +60,27 @@
.bit = 1,
};
+/* modbus cycle timer */
+
+static timer_t modbus_timer;
+static struct sigevent modbus_timer_event;
+static struct itimerspec modbus_timer_spec;
+
+void flagset_sig_handler(sigval_t sigval)
+{
+ return;
+}
+
+/* fddi backend functions */
+
int fddi_backend_configure(fddi_iface_t *iface, const char *configfile, void *data);
int fddi_backend_setstate(fddi_iface_t *iface, fddi_state_enum_t state);
int fddi_backend_cmd(fddi_iface_t *iface, fddi_cmd_enum_t cmd);
int fddi_backend_configure(fddi_iface_t *iface, const char *configfile, void *data)
{
+ int ret;
+
printf("parsing configfile: %s\n", configfile);
printf("for interface: %s\n", iface->id.id_as_string); /* FIXME private */
@@ -75,7 +94,19 @@
pv2.next = &pv3;
pv3.previous = &pv2;
- /* FIXME: setup thread here which handles the cycle */
+ /* modbus has no hardware bus cycle, emulate one */
+
+ modbus_timer_event.sigev_notify = SIGEV_THREAD;
+ modbus_timer_event.sigev_notify_function = flagset_sig_handler;
+ modbus_timer_event.sigev_notify_attributes = NULL;
+ modbus_timer_event.sigev_value.sival_ptr = NULL;
+
+ if ((ret = timer_create(CLOCK_REALTIME, &modbus_timer_event, &modbus_timer)) < 0 ) {
+ perror("timer create");
+ return -1;
+ }
+
+ /* we are ready now and go into preoperational state */
fddi_backend_setstate(iface, STATE_PREOPERATIONAL);
@@ -108,8 +139,37 @@
int retval = -1;
switch (cmd) {
+
case CMD_START:
+
+ /* FIXME */
+ modbus_timer_spec.it_value.tv_sec = 1;
+ modbus_timer_spec.it_value.tv_nsec = 0;
+ modbus_timer_spec.it_interval.tv_sec = 0;
+ modbus_timer_spec.it_interval.tv_nsec = 500*1000*1000;
+
+ if ((retval = timer_settime(modbus_timer, 0, &modbus_timer_spec, NULL)) < 0 ) {
+ perror("timer settime");
+ return -1;
+ }
+
+ retval = 0;
+ break;
+
case CMD_STOP:
+
+ modbus_timer_spec.it_value.tv_sec = 0;
+ modbus_timer_spec.it_value.tv_nsec = 0;
+ modbus_timer_spec.it_interval.tv_sec = 0;
+ modbus_timer_spec.it_interval.tv_nsec = 0;
+
+ if ((retval = timer_settime(modbus_timer, 0, &modbus_timer_spec, NULL)) < 0 ) {
+ perror("timer settime");
+ return -1;
+ }
+
+
+
case CMD_RESET:
case CMD_IDENTIFY:
case CMD_QUITERR:
@@ -117,6 +177,7 @@
break;
default:
break;
+
}
return retval;
Modified: fddi-20070618-1-trunk/tests/GNUmakefile.am
==============================================================================
--- fddi-20070618-1-trunk/tests/GNUmakefile.am (original)
+++ fddi-20070618-1-trunk/tests/GNUmakefile.am Thu Jul 12 17:49:32 2007
@@ -165,6 +165,7 @@
test_fddi_libmodbus1.c
test_fddi_libmodbus1_LDADD = \
+ -lpthread -lrt \
$(top_builddir)/src/libfddi_libmodbus.la
test_fddi_libmodbus1_DEPENDENCIES = \
Modified: fddi-20070618-1-trunk/tests/test_fddi_libmodbus1.c
==============================================================================
--- fddi-20070618-1-trunk/tests/test_fddi_libmodbus1.c (original)
+++ fddi-20070618-1-trunk/tests/test_fddi_libmodbus1.c Thu Jul 12 17:49:32 2007
@@ -1,21 +1,54 @@
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
#include <osadl/fddi.h>
static int endme;
-static int countdown = 500;
+
+void signalhandler(int sig)
+{
+ if (sig == SIGPIPE)
+ return;
+ if (sig == SIGHUP) {
+ fprintf(stderr, "SIGHUP received\n");
+ }
+ if (sig == SIGTERM || sig == SIGINT) {
+ fprintf(stderr, "ctrl-c pressed, shutting down\n");
+ endme = 1;
+ }
+}
+
+
+int tpu_callback(fddi_tpu_t *tpu, void *arg)
+{
+ printf("callback\n");
+ return 0;
+}
/* FIXME: we have to agree on a bus start workflow! */
int main(void)
{
+ struct sigaction action;
+
fddi_iface_attr_t modbus0_attr;
fddi_iface_t modbus0_iface;
fddi_id_t modbus0_id;
+ fddi_tpu_t *tpu;
int ret;
+ /* setup signal handler */
+ action.sa_handler = signalhandler;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = 0;
+ sigaction(SIGTERM, &action, 0); /* catches kill from the shell */
+ sigaction(SIGINT, &action, 0); /* catches Ctrl-C from the shell */
+ sigaction(SIGPIPE, &action, 0); /* catches Broken Pipe exception */
+ sigaction(SIGHUP, &action, 0); /* catches HUP */
+
fddi_id_init(&modbus0_id, "modbus", 0, NULL);
/* instanciate io_interface */
@@ -35,7 +68,12 @@
return ret;
}
- /* TODO: attach callbacks to TPUs here */
+ /* attach callbacks to TPUs */
+ fddi_iface_gettpulist(&modbus0_iface, &tpu);
+ while (tpu) {
+ fddi_tpu_setcallback(tpu, tpu_callback, NULL);
+ fddi_tpu_getnext(&tpu);
+ }
/* everything is configured, now we can start */
ret = fddi_iface_cmd(&modbus0_iface, CMD_START);
@@ -44,11 +82,9 @@
return ret;
}
- while (!endme) {
- countdown--;
- if (countdown == 0)
- endme = 1;
- }
+ printf("entering main loop, press ctrl-c to end\n");
+ while (!endme)
+ sleep(1);
/* destruct io_interface */
fddi_iface_destroy(&modbus0_iface);
More information about the OSADL-svn-commits
mailing list