Work on RTU support, some cleanup in surrounding C code
--- a/LPCBus/MC9.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9.c Thu Mar 12 15:30:05 2015 +0100
@@ -32,6 +32,17 @@
+typedef struct /* Type definition for timers for right modules */ + unsigned char status; /* Current status of timer - running / expired */ + long long actValue; /* Actual timer value */ + long long toValue; /* Timeout value - initialized at startup */ +#define TIM_EN_RUNNING 1 +#define TIM_EN_EXPIRED 2 --- a/LPCBus/MC9_Devices_decl.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_Devices_decl.c Thu Mar 12 15:30:05 2015 +0100
@@ -36,7 +36,7 @@
struct gpio_device *RS485_GPIO_dev;
-int write_file_bool(int fd, int value)
+static int write_file_bool(int fd, int value) @@ -54,7 +54,7 @@
-struct gpio_device *gpio_open(int aGpioNum)
+static struct gpio_device *gpio_open(int aGpioNum) @@ -112,7 +112,7 @@
-int gpio_close(struct gpio_device *aDev)
+static int gpio_close(struct gpio_device *aDev) @@ -142,7 +142,7 @@
-int gpio_set_pin_value(struct gpio_device *aDev, int aValue)
+static int gpio_set_pin_value(struct gpio_device *aDev, int aValue) int pin_file = aDev->pin_file;
@@ -157,15 +157,8 @@
-int TransmitMode(int fd)
- return gpio_set_pin_value(RS485_GPIO_dev, 1);
- return gpio_set_pin_value(RS485_GPIO_dev, 0);
+#define TransmitMode gpio_set_pin_value(RS485_GPIO_dev, 1) +#define RecieveMode gpio_set_pin_value(RS485_GPIO_dev, 0) /*--------------------------- Serial Port handling ---------------------------*/
@@ -205,21 +198,11 @@
-typedef struct /* Type definition for timers for right modules */
- unsigned char status; /* Current status of timer - running / expired */
- long long actValue; /* Actual timer value */
- long long toValue; /* Timeout value - initialized at startup */
-#define TIM_EN_RUNNING 1
-#define TIM_EN_EXPIRED 2
@@ -429,7 +412,7 @@
while(count < UART_BUFSIZE){
@@ -467,7 +450,7 @@
/* Turn to transmit mode*/
/* Copy received buffer */
if(count == UART_BUFSIZE){
--- a/LPCBus/MC9_OnBoard_cleanup.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_OnBoard_cleanup.c Thu Mar 12 15:30:05 2015 +0100
@@ -1,1 +1,7 @@
+rt_task_delete(&RTU_UART_task); +rt_task_join(&RTU_UART_task); +rt_task_delete(&RTU_task); +rt_task_join(&RTU_task); +rt_mutex_delete(&RTU_BuffMutex); +gpio_close(RTU_GPIO_dev); --- a/LPCBus/MC9_OnBoard_decl.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_OnBoard_decl.c Thu Mar 12 15:30:05 2015 +0100
@@ -1,4 +1,268 @@
-#define MAX_ONBOARD_DEVICES 2
-/* Tables containing information about enabled on-board devices
- (initialized by Composer) */
-unsigned char onBoardDev[MAX_ONBOARD_DEVICES][2];
+/*------------------------- GPIO -------------------------------------*/ +/* from armadeus/target/packages/as_devices/c/as_gpio* */ +# define ERROR(fmt, ...) printf(fmt, ##__VA_ARGS__) +//# define ERROR(fmt, ...) /*fmt, ##__VA_ARGS__*/ + int pin_file; /* pin file for 2.6.29 interface*/ +struct gpio_device *RTU_GPIO_dev; +static int write_file_bool(int fd, int value) + ret = write(fd, value?"1":"0", 1); + ERROR("write error\n"); + if (lseek(fd, 0, SEEK_SET) < 0) { + ERROR("lseek error\n"); +static struct gpio_device *gpio_open(int aGpioNum) + struct gpio_device *dev; + export_file = open("/sys/class/gpio/export", O_WRONLY); + ERROR("Can't open /sys/class/gpio/export\nBe sure that gpiolib is under your kernel\n"); + snprintf(buf, BUFF_SIZE, "%%d", aGpioNum); + retval = write(export_file, buf, strlen(buf)); + ERROR("/sys/class/gpio/export can't be written\n"); + snprintf(buf, BUFF_SIZE, "/sys/class/gpio/gpio%%d/direction", aGpioNum); + gpio_dir_fd = open(buf, O_WRONLY); + ERROR("Can't open gpio%%d direction\n", aGpioNum); + ret = write(gpio_dir_fd, "out", 3); + ERROR("Error writing direction\n"); + snprintf(buf, BUFF_SIZE, "/sys/class/gpio/gpio%%d/value", aGpioNum); + pin_file = open(buf, O_RDWR); + ERROR("Can't export gpio number %%d\n", aGpioNum); + dev = malloc(sizeof(struct gpio_device)); + ERROR("Can't allocate gpio_device structure\n"); + dev->port_num = aGpioNum; + dev->pin_file = pin_file; +static int gpio_close(struct gpio_device *aDev) + ERROR("device is NULL\n"); + unexport_file = open("/sys/class/gpio/unexport", O_WRONLY); + if (unexport_file < 0) { + ERROR("Can't open /sys/class/gpio/unexport\nBe sure that gpiolib is under your kernel\n"); + snprintf(buf, BUFF_SIZE, "%%d", aDev->port_num); + retval = write(unexport_file, buf, strlen(buf)); + ERROR("/sys/class/gpio/unexport can't be written\n"); +static int gpio_set_pin_value(struct gpio_device *aDev, int aValue) + int pin_file = aDev->pin_file; + retval = write_file_bool(pin_file, aValue); + ERROR("Can't write value\n"); +#define REG_DISCRETE_START 0 /**< Input discrete start address */ +#define REG_DISCRETE_NREGS 511 /**< 512 bits (type: single bit, Read only) */ +#define REG_COILS_START 0 /**< Coils start address */ +#define REG_COILS_NREGS 511 /**< 512 bits (type: single bit, Read/Write) */ +#define REG_INPUT_START 0 /**< Input registers start address */ +#define REG_INPUT_NREGS 511 /**< 512 words (type: 16-bit word, Read only) */ +#define REG_HOLDING_START 0 /**< Holding registers start address */ +#define REG_HOLDING_NREGS 511 /**< 512 words (type: 16-bit word, Read/Write) */ +#define MAX_MOD_RTU_DEVICES 16 +typedef struct _mbRtuRdHoldingRegs { + unsigned short startAddr; + unsigned short* buffer; +typedef struct _mbRtuRdDiscInputs { + unsigned short startAddr; +// unsigned short* buffer; +typedef struct _mbRtuRdCoils { + unsigned short startAddr; +typedef struct _mbRtuWrSingleCoil { + unsigned short startAddr; +typedef struct _mbRtuWrCoils { + unsigned short startAddr; +typedef struct _mbRtuRdInputRegs { + unsigned short startAddr; + unsigned short* buffer; +typedef struct _mbRtuWrSingleReg { + unsigned short startAddr; + unsigned short* buffer; +typedef struct _mbRtuWrMultiRegs { + unsigned short startAddr; + unsigned short* buffer; +typedef struct _mbRtuSlaveConfig { + unsigned char slaveAddr; + mbRtuRdDiscInputs rdDiscInputs; + mbRtuWrSingleCoil wrSingleCoil; + mbRtuRdInputRegs rdInputRegs; + mbRtuRdHoldingRegs rdHoldingRegs; + mbRtuWrSingleReg wrSingleReg; + mbRtuWrMultiRegs wrMultiRegs; +mbRtuSlaveConfig mbRtuSlaveDev[MAX_MOD_RTU_DEVICES]; /**< Tables containing information about connected Modbus network devices (initialized by Composer) */ +commTimer mbRtuDevTim[MAX_MOD_RTU_DEVICES]; /**< Table of timers (one for each position) */ +unsigned short usRegInputValue[REG_INPUT_NREGS]; /**< Array of Modbus input registers */ +unsigned short usRegHoldingValue[REG_HOLDING_NREGS]; /**< Array of Modbus holding registers */ +unsigned char ubCoilValue[REG_COILS_NREGS/8]; /**< Array of Modbus coils (8 coils per byte) */ +unsigned char ubRegDiscreteValue[REG_DISCRETE_NREGS/8]; /**< Array of Modbus discrete inputs (8 inputs per byte) */ +/* prototypes for functions defined in shared library */ +void mbmrtu_BusUpdate(void); +static RT_TASK RTU_UART_task; +static RT_TASK RTU_task; +static RT_MUTEX RTU_BuffMutex; +void LockMBRTUBuffer(void){ + rt_mutex_acquire(&RTU_BuffMutex, TM_INFINITE ); +void UnLockMBRTUBuffer(void){ + rt_mutex_release(&RTU_BuffMutex); +typedef void (RTU_UART_task_proc_t*)(void*); +void CreateMBRTUSerialTask(RTU_UART_task_proc_t* RTU_UART_task_proc, void* param){ + if(rt_task_start(&RTU_UART_task, RTU_UART_task_proc, param)) +static void mbmrtu_BusUpdate_proc(void){ + while (rt_task_sleep_until(TM_INFINITE) == -EINTR){ +void TransmitMode(void){ + gpio_set_pin_value(RTU_GPIO_dev, 1); +void RecieveMode(int us){ + while(rt_task_sleep_until( + now + rt_timer_ns2ticks(1000LL*us) + gpio_set_pin_value(RTU_GPIO_dev, 0); --- a/LPCBus/MC9_OnBoard_init.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_OnBoard_init.c Thu Mar 12 15:30:05 2015 +0100
@@ -1,2 +1,75 @@
-bzero(&onBoardDev, sizeof(onBoardDev));
+bzero(&usRegInputValue , sizeof(usRegInputValue )); +bzero(&usRegHoldingValue , sizeof(usRegHoldingValue )); +bzero(&ubCoilValue , sizeof(ubCoilValue )); +bzero(&ubRegDiscreteValue, sizeof(ubRegDiscreteValue)); +bzero(&mbRtuSlaveDev , sizeof(mbRtuSlaveDev )); +bzero(&mbRtuDevTim , sizeof(mbRtuDevTim )); +// ******** STUB code for composer ************** +// for(i=0;i<MAX_MOD_RTU_DEVICES;i++) +// mbRtuSlaveDev[i].slaveAddr = INVALID_RTU_ADDR; +// mbRtuDevTim[i].toValue = 0; +// mbRtuDevTim[i].status = TIM_DISABLED; +// mbRtuSlaveDev[i].rdDiscInputs.use = FALSE; +// mbRtuSlaveDev[i].rdDiscInputs.startAddr = 0; +// mbRtuSlaveDev[i].rdDiscInputs.length = 0; +// mbRtuSlaveDev[i].rdDiscInputs.buffer = &ubRegDiscreteValue[0]; +// mbRtuSlaveDev[i].rdCoils.use = FALSE; +// mbRtuSlaveDev[i].rdCoils.startAddr = 0; +// mbRtuSlaveDev[i].rdCoils.length = 0; +// mbRtuSlaveDev[i].rdCoils.buffer = &ubCoilValue[0]; +// mbRtuSlaveDev[i].wrSingleCoil.use = FALSE; +// mbRtuSlaveDev[i].wrSingleCoil.startAddr = 0; +// mbRtuSlaveDev[i].wrSingleCoil.buffer = &ubCoilValue[0]; +// mbRtuSlaveDev[i].wrCoils.use = FALSE; +// mbRtuSlaveDev[i].wrCoils.startAddr = 0; +// mbRtuSlaveDev[i].wrCoils.length = 0; +// mbRtuSlaveDev[i].wrCoils.buffer = &ubCoilValue[0]; +// mbRtuSlaveDev[i].rdInputRegs.use = FALSE; +// mbRtuSlaveDev[i].rdInputRegs.startAddr = 0; +// mbRtuSlaveDev[i].rdInputRegs.length = 0; +// mbRtuSlaveDev[i].rdInputRegs.buffer = &usRegInputValue[0]; +// mbRtuSlaveDev[i].rdHoldingRegs.use = FALSE; +// mbRtuSlaveDev[i].rdHoldingRegs.startAddr = 0; +// mbRtuSlaveDev[i].rdHoldingRegs.length = 0; +// mbRtuSlaveDev[i].rdHoldingRegs.buffer = &usRegHoldingValue[0]; +// mbRtuSlaveDev[i].wrSingleReg.use = FALSE; +// mbRtuSlaveDev[i].wrSingleReg.startAddr = 0; +// mbRtuSlaveDev[i].wrSingleReg.buffer = &usRegHoldingValue[0]; +// mbRtuSlaveDev[i].wrMultiRegs.use = FALSE; +// mbRtuSlaveDev[i].wrMultiRegs.startAddr = 0; +// mbRtuSlaveDev[i].wrMultiRegs.length = 0; +// mbRtuSlaveDev[i].wrMultiRegs.buffer = &usRegHoldingValue[0]; +RTU_GPIO_dev = gpio_open(111); + fprintf(stderr, "Error while initializing RTU GPIO.\n"); +if((err = rt_mutex_create (&RTU_BuffMutex, "RTU_BuffMutex"))) +if((err = rt_task_create(&RTU_UART_task, "RTU_UART_task", 0, 50, T_JOINABLE))) +if((err = rt_task_create(&RTU_task, "RTU_task", 0, 50, T_JOINABLE))) +if(rt_task_start(&RTU_task, &mbmrtu_BusUpdate, NULL)) --- a/LPCBus/MC9_OnBoard_publish.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_OnBoard_publish.c Thu Mar 12 15:30:05 2015 +0100
@@ -1,1 +1,9 @@
+// setWord16(&usRegHoldingValue[0],*__MW4_1_1_0); +// setBit(&ubRegDiscreteValue[0],0,*__QX4_1_2_0); +// setBit(&ubCoilValue[0],0,*__MX4_1_0_0); +// setWord16(&usRegInputValue[0],*__QW4_1_3_0); +// setBit(&ubRegDiscreteValue[0],1,*__QX4_1_2_1); --- a/LPCBus/MC9_OnBoard_retrieve.c Tue Feb 10 11:44:28 2015 +0100
+++ b/LPCBus/MC9_OnBoard_retrieve.c Thu Mar 12 15:30:05 2015 +0100
@@ -1,1 +1,9 @@
+*__MW4_1_1_0=getWord16(&usRegHoldingValue[0]); +*__MX4_1_0_0=getBit(&ubCoilValue[0],0);