[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(<_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(<_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(<_dl_mutex);
@@ -121,7 +134,11 @@
pthread_mutex_unlock(<_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(<_dl_mutex);
lt_dlclose(iface->backend_lib);
pthread_mutex_unlock(<_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