[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