[OSADL-svn-commits] r58 - in fddi-20070618-1-trunk: include/osadl src tests

OSADL repository commits osadl-svn-commits at lists.osadl.org
Tue Oct 2 11:45:17 CEST 2007


Author: robert
Date: Fri Jul 13 11:00:53 2007
New Revision: 58

Log:
first version which makes noise on the modbus coupler

Modified:
   fddi-20070618-1-trunk/include/osadl/fddi_iface.h
   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/libfddi_examplebus.c
   fddi-20070618-1-trunk/tests/test_fddi_libmodbus1.c

Modified: fddi-20070618-1-trunk/include/osadl/fddi_iface.h
==============================================================================
--- fddi-20070618-1-trunk/include/osadl/fddi_iface.h	(original)
+++ fddi-20070618-1-trunk/include/osadl/fddi_iface.h	Fri Jul 13 11:00:53 2007
@@ -34,6 +34,8 @@
 
 struct fddi_iface_backend_ops {
 
+	int (*init) (fddi_iface_t *iface);
+	int (*destroy) (fddi_iface_t *iface);
 	int (*configure) (fddi_iface_t *iface, const char *configfile, void *data);
 	int (*setstate) (fddi_iface_t *iface, fddi_state_enum_t state);
 	int (*cmd) (fddi_iface_t *iface, fddi_cmd_enum_t cmd);

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	Fri Jul 13 11:00:53 2007
@@ -42,7 +42,6 @@
 	struct fddi_tpu *previous;
 
 	fddi_pv_t *pv_list_head;
-	unsigned long flags;
 	char *payload;
 
 	void *callback_arg;
@@ -56,7 +55,6 @@
 extern int fddi_tpu_getnext(fddi_tpu_t **tpu);
 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, 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);

Modified: fddi-20070618-1-trunk/src/libfddi.c
==============================================================================
--- fddi-20070618-1-trunk/src/libfddi.c	(original)
+++ fddi-20070618-1-trunk/src/libfddi.c	Fri Jul 13 11:00:53 2007
@@ -72,6 +72,7 @@
 int fddi_iface_init(fddi_iface_t *iface, fddi_iface_attr_t *attr)
 {
 	const char *error_string;
+	int ret = 0;
 
 	if ((!iface) || (!attr))
 		return EINVAL;
@@ -101,6 +102,18 @@
 	lt_dlerror();
 
 	/* register backend functions */
+	iface->backend.init = lt_dlsym(iface->backend_lib, "fddi_backend_init");
+	if ((error_string = lt_dlerror())) {
+		pthread_mutex_unlock(&lt_dl_mutex);
+		goto iface_init_err;
+	}
+
+	iface->backend.destroy = lt_dlsym(iface->backend_lib, "fddi_backend_destroy");
+	if ((error_string = lt_dlerror())) {
+		pthread_mutex_unlock(&lt_dl_mutex);
+		goto iface_init_err;
+	}
+
 	iface->backend.configure = lt_dlsym(iface->backend_lib, "fddi_backend_configure");
 	if ((error_string = lt_dlerror())) {
 		pthread_mutex_unlock(&lt_dl_mutex);
@@ -121,7 +134,11 @@
 
 	pthread_mutex_unlock(&lt_dl_mutex);
 
-	return 0;
+	ret = iface->backend.init(iface);
+	if (ret)
+		fprintf(stderr, "error: backend init returned %i\n", ret);
+
+	return ret;
 
 iface_init_err:
 
@@ -134,14 +151,20 @@
 
 int fddi_iface_destroy(fddi_iface_t *iface)
 {
+	int ret = 0;
+
 	if (!iface)
 		return EINVAL;
 
+	ret = iface->backend.destroy(iface);
+	if (ret)
+		fprintf(stderr, "error: backend init returned %i\n", ret);
+
 	pthread_mutex_lock(&lt_dl_mutex);
 	lt_dlclose(iface->backend_lib);
 	pthread_mutex_unlock(&lt_dl_mutex);
 
-	return 0;
+	return ret;
 }
 
 int fddi_iface_configure(fddi_iface_t *iface, const char *configfile, void *data)
@@ -184,7 +207,7 @@
 
 	memcpy(id, &iface->id, sizeof(fddi_id_t));
 
-	return 0;	
+	return 0;
 }
 
 int fddi_iface_setid(fddi_iface_t *iface, fddi_id_t id)
@@ -419,15 +442,6 @@
 	return 0;
 }
 
-int fddi_tpu_getflags(fddi_tpu_t *tpu, unsigned long *flags)
-{
-	if ((!tpu) || (!flags))
-		return EINVAL;
-
-	*flags = tpu->flags;
-	return 0;
-}
-
 int fddi_tpu_setcallback(fddi_tpu_t *tpu, int(*tpu_callback)(fddi_tpu_t *tpu, void *arg), void *arg)
 {
 	if ((!tpu) || (!tpu_callback))
@@ -513,7 +527,7 @@
 		fddi_id->prefix = strdup(prefix);
 		if (!fddi_id->prefix)
 			goto prefix_err;
-	} else 
+	} else
 		prefix_len = 0;
 
 	if (postfix) {
@@ -521,7 +535,7 @@
 		fddi_id->postfix = strdup(postfix);
 		if (!fddi_id->postfix)
 			goto postfix_err;
-	} else 
+	} else
 		postfix_len = 0;
 
 
@@ -531,7 +545,7 @@
 	if (!fddi_id->id_as_string)
 		goto id_as_str_err;
 
-	sprintf(fddi_id->id_as_string, "%s%s%s", 
+	sprintf(fddi_id->id_as_string, "%s%s%s",
 		fddi_id->prefix ? fddi_id->prefix : "",
 		index_as_string ? index_as_string : "",
 		fddi_id->postfix ? fddi_id->postfix: "");

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	Fri Jul 13 11:00:53 2007
@@ -9,9 +9,11 @@
 #include <stdlib.h>
 #include <time.h>
 
+#include <modbus.h>
+
 #include <osadl/fddi.h>
 
-static fddi_tpu_t tpu = {
+static fddi_tpu_t tpu1 = {
 	.id = {
 		.prefix = "dout",
 		.index = -1,
@@ -60,51 +62,123 @@
 	.bit = 1,
 };
 
-/* modbus cycle timer */
+struct modbus_tpu {
+	timer_t timer;
+	struct sigevent event;
+	struct itimerspec timer_spec;
+	modbus_dev_t *modbus_dev;
+};
+struct modbus_tpu modbus_tpu1;
+
+struct modbus_iface {
+	modbus_dev_t modbus_dev;
+};
+struct modbus_iface modbus_iface1;
+
+int coil;
 
-static timer_t modbus_timer;
-static struct sigevent modbus_timer_event;
-static struct itimerspec modbus_timer_spec;
+void _modbus_tpu_out(fddi_tpu_t *tpu)
+{
+	struct modbus_tpu *modbus_tpu = (struct modbus_tpu*)(tpu->priv); 
+
+	/* application callback */
+	if (tpu->callback)
+		tpu->callback(tpu, NULL);
+
+	/* bus transfer */
+	modbus_w_single_coil(modbus_tpu->modbus_dev, 1, coil);
+	coil = coil == 0 ? 1:0;
+}
 
-void flagset_sig_handler(sigval_t sigval)
+void _modbus_tpu_in(fddi_tpu_t *tpu)
 {
+	/* bus transfer */
+
+	/* application callback */
+	if (tpu->callback)
+		tpu->callback(tpu, NULL);
+}
+
+
+void modbus_timer_handler(sigval_t sigval)
+{
+	fddi_tpu_t *tpu = (fddi_tpu_t*)sigval.sival_ptr;
+
+	if ((tpu->direction == OUT) || (tpu->direction == INOUT))
+		_modbus_tpu_out(tpu);
+
+	if ((tpu->direction == IN) || (tpu->direction == INOUT))
+		_modbus_tpu_in(tpu);
+
 	return;
 }
 
-/* fddi backend functions */
+/* 
+ * fddi backend functions
+ */
 
+int fddi_backend_init(fddi_iface_t *iface);
+int fddi_backend_destroy(fddi_iface_t *iface);
 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_init(fddi_iface_t *iface)
+{
+	iface->priv = &modbus_iface1;
+	return 0;
+}
+
+int fddi_backend_destroy(fddi_iface_t *iface)
+{
+	modbus_dev_t *modbus_dev = (modbus_dev_t*)(iface->priv);
+
+	if (modbus_unbind (modbus_dev) == -1)
+		return -1;
+
+	return 0;
+}
+
 int fddi_backend_configure(fddi_iface_t *iface, const char *configfile, void *data)
 {
 	int ret;
+	modbus_dev_t *modbus_dev = (modbus_dev_t*)(iface->priv);
 
 	printf("parsing configfile: %s\n", configfile);
 	printf("for interface:      %s\n", iface->id.id_as_string); /* FIXME private */
 
-	/* FIXME: everything's hardcoded for now, we add an xml parser later */
+	/* FIXME: everything's hardcoded & static for now, we add an xml parser later */
 
-	iface->tpulist_head = &tpu;
-	tpu.pv_list_head = &pv1;
+	iface->tpulist_head = &tpu1;
+	tpu1.pv_list_head = &pv1;
 
 	pv1.next = &pv2;
 	pv2.previous = &pv1;
 	pv2.next = &pv3;
 	pv3.previous = &pv2;
 
-	/* modbus has no hardware bus cycle, emulate one */
+	/* modbus has no hardware bus cycle, emulate one for each tpu */
+	/* FIXME: loop */
+	{
+		modbus_tpu1.event.sigev_notify = SIGEV_THREAD;
+		modbus_tpu1.event.sigev_notify_function = modbus_timer_handler;
+		modbus_tpu1.event.sigev_notify_attributes = NULL;
+		modbus_tpu1.event.sigev_value.sival_ptr = &tpu1;
+		tpu1.priv = &modbus_tpu1;
 
-	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_tpu1.event, &modbus_tpu1.timer)) < 0 ) {
+			perror("timer create");
+			return -1;
+		}
+	}
 
-	if ((ret = timer_create(CLOCK_REALTIME, &modbus_timer_event, &modbus_timer)) < 0 ) {
-		perror("timer create");
+	if (modbus_bind(modbus_dev, "192.168.23.242", 502) == -1) {
+		fprintf(stderr, "modbus_bind() failed\n");
 		return -1;
 	}
+	
+	/* FIXME: modbus_dev must be put into the device, not iface! */
+	modbus_tpu1.modbus_dev = modbus_dev;
 
 	/* we are ready now and go into preoperational state */
 
@@ -142,15 +216,21 @@
 
 	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;
+		printf("start\n");
+		/* FIXME loop over all tpus here */
+		{
+			struct modbus_tpu *mtpu = ((struct modbus_tpu*)(iface->tpulist_head->priv));
+
+			mtpu->timer_spec.it_value.tv_sec = 1;
+			mtpu->timer_spec.it_value.tv_nsec = 0;
+			mtpu->timer_spec.it_interval.tv_sec = 0;
+			mtpu->timer_spec.it_interval.tv_nsec = 500*1000*1000;
+
+			if ((retval = timer_settime(mtpu->timer, 0, &mtpu->timer_spec, NULL)) < 0 ) {
+				perror("timer settime");
+				/* FIXME: disarm timers here */
+				return -1;
+			}
 		}
 
 		retval = 0;
@@ -158,17 +238,23 @@
 
 	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;
+		/* FIXME: loop over all tpus here */
+		{
+			struct modbus_tpu *mtpu = ((struct modbus_tpu*)(iface->tpulist_head->priv));
+
+			mtpu->timer_spec.it_value.tv_sec = 0;
+			mtpu->timer_spec.it_value.tv_nsec = 0;
+			mtpu->timer_spec.it_interval.tv_sec = 0;
+			mtpu->timer_spec.it_interval.tv_nsec = 0;
+
+			if ((retval = timer_settime(mtpu->timer, 0, &mtpu->timer_spec, NULL)) < 0 ) {
+				perror("timer settime");
+				return -1;
+			}
 		}
 
-
+		retval = 0;
+		break;
 
 	case CMD_RESET:
 	case CMD_IDENTIFY:

Modified: fddi-20070618-1-trunk/tests/libfddi_examplebus.c
==============================================================================
--- fddi-20070618-1-trunk/tests/libfddi_examplebus.c	(original)
+++ fddi-20070618-1-trunk/tests/libfddi_examplebus.c	Fri Jul 13 11:00:53 2007
@@ -5,6 +5,16 @@
 #include <stdio.h>
 #include <osadl/fddi.h>
 
+int fddi_backend_init(fddi_iface_t *iface)
+{
+	return 0;
+}
+
+int fddi_backend_destroy(fddi_iface_t *iface)
+{
+	return 0;
+}
+
 int fddi_backend_configure(fddi_iface_t *iface, const char *configfile, void *data)
 {
 	return 0;

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	Fri Jul 13 11:00:53 2007
@@ -27,7 +27,9 @@
 	return 0;
 }
 
-/* FIXME: we have to agree on a bus start workflow! */
+/*
+ * FIXME: we have to agree on a bus start workflow!
+ */
 
 int main(void)
 {


More information about the OSADL-svn-commits mailing list