--- a/LPCBus.py Tue Dec 09 17:27:37 2014 +0100
+++ b/LPCBus.py Wed Dec 10 18:32:59 2014 +0100
@@ -80,8 +80,6 @@
/* LPCBus confnode functions */
int __init_%(location_str)s(int argc,char **argv)
@@ -94,12 +92,10 @@
void __retrieve_%(location_str)s(void)
void __publish_%(location_str)s(void)
@@ -140,25 +136,26 @@
/* XXX TODO #include "smarteh.h" */
+#define DEVICEFILENAME "rightbus" bzero(&rightReadBuf, sizeof(rightReadBuf_t));
bzero(&rightWriteBuf, sizeof(rightWriteBuf_t));
bzero(&rightI2CMod, sizeof(rightI2CMod_t));
-#define DEVICEFILENAME "rightbus"
rightbusfd = rt_dev_open( DEVICEFILENAME, 0);
- printf("can't open %s rtdm device, %s\\n", DEVICEFILENAME,
+ printf("can't open %%s rtdm device, %%s\\n", DEVICEFILENAME, err = rt_dev_ioctl(rightbusfd, RTSMT_RTIOC_INIT, &rightI2CMod);
- printf("error while RTSMT_RTIOC_INIT, %s\\n",
+ printf("error while RTSMT_RTIOC_INIT, %%s\\n", rt_dev_close(rightbusfd);
@@ -166,8 +163,10 @@
rt_dev_ioctl(rightbusfd, RTSMT_RTIOC_READ, &rightReadBuf);
rt_dev_ioctl(rightbusfd, RTSMT_RTIOC_WRITE, &rightWriteBuf);
@@ -181,22 +180,96 @@
(initialized by Composer) */
unsigned char onBoardDev[MAX_ONBOARD_DEVICES][2];
bzero(&onBoardDev, sizeof(onBoardDev));
+ "retrieve":"%(retrieve_code)s", + "publish":"%(publish_code)s", #include <native/mutex.h>
+#include <native/timer.h> +static struct termios oldterminfo; +void closeserial(int fd) + tcsetattr(fd, TCSANOW, &oldterminfo); + perror("closeserial()"); + if (ioctl(fd, TIOCMBIS, &bit) == -1) { + perror("setRTS(): TIOCMGET"); + if (ioctl(fd, TIOCMBIC, &bit) == -1) { + perror("clearRTS(): TIOCMGET"); +int openserial(char *devicename) + speed_t baud = B115200; /* baud rate */ + if ((fd = open(devicename, O_RDWR)) == -1) { + perror("openserial(): open()"); + if (tcgetattr(fd, &oldterminfo) == -1) { + perror("openserial(): tcgetattr()"); + // attr.c_cflag |= CRTSCTS | CLOCAL; + attr.c_cflag |= CLOCAL; + attr.c_cflag &= ~CRTSCTS; + attr.c_cflag &= ~PARENB; /* no parity */ + attr.c_cflag &= ~CSTOPB; /* 1 stop bit */ + attr.c_cflag &= ~CSIZE; + attr.c_cflag |= CS8 ; /* 8 bits */ + cfsetospeed(&attr, baud); /* baud rate */ + if (tcflush(fd, TCIOFLUSH) == -1) { + perror("openserial(): tcflush()"); + if (tcsetattr(fd, TCSANOW, &attr) == -1) { + perror("initserial(): tcsetattr()"); + /* Turn to write mode*/ typedef struct /* Type definition for timers for right modules */
@@ -204,6 +277,7 @@
RTIME actValue; /* Actual timer value */
RTIME toValue; /* Timeout value - initialized at startup */
@@ -226,7 +300,7 @@
uartDevReadBuf_t uartDevReadBufB;
uartDevReadBuf_t *uartDevReadBuf_drv;
uartDevReadBuf_t *uartDevReadBuf_plc;
-/* MC8 compatibility crap */
#define uartDevReadBuf (*uartDevReadBuf_drv)
/* Buffers for writing data to UART port devices */
@@ -235,19 +309,28 @@
uartDevWriteBuf_t uartDevWriteBufB;
uartDevWriteBuf_t *uartDevWriteBuf_drv;
uartDevWriteBuf_t *uartDevWriteBuf_plc;
-/* MC8 compatibility crap */
#define uartDevWriteBuf (*uartDevWriteBuf_drv)
int uartDevWriteBuf_plc_state;
int uartDevReadBuf_plc_state;
+/* Function interface definition for modules on UART (RS485) bus */ +typedef void (*uartPortFunct)(char*, char*, char); +/* Table describing module positions on UART (RS485) bus (parsed from Composer data) */ +uartPortFunct uartPortDevices[MAX_UART_DEVICES] = {NULL}; +/* Table of timers (one for each position) */ +static commTimer uartPortTim[MAX_UART_DEVICES]; static RT_TASK UART_task;
static RT_MUTEX UART_WriteMutex;
static RT_MUTEX UART_ReadMutex;
void UART_task_proc(void *arg)
while (rt_task_sleep_until(TM_INFINITE) == -EINTR){
+ printf("Hellllo world\\n"); if(!rt_mutex_acquire(&UART_WriteMutex, TM_INFINITE )){
if(uartDevWriteBuf_plc_state == FULL){
uartDevWriteBuf_t *uartDevWriteBuf_tmp;
@@ -259,9 +342,44 @@
rt_mutex_release(&UART_WriteMutex);
- /* XXX use data from uartDevWriteBuf_drv */
+ /* Scan all positions for attached UART port modules */ + for(i=0;i<MAX_UART_DEVICES;i++) + RTIME now = rt_timer_read(); + /* Timers for right modules */ + if(uartPortTim[i].status != TIM_DISABLED) + if(now - uartPortTim[i].actValue < uartPortTim[i].toValue) + uartPortTim[i].status = TIM_EN_RUNNING; + uartPortTim[i].status = TIM_EN_EXPIRED; + if(uartPortDevices[i] != NULL) + if((uartPortTim[i].status == TIM_DISABLED) + || (uartPortTim[i].status == TIM_EN_EXPIRED)) + // Communicate with device + &uartDevWriteBuf[i][0], - /* XXX write data to uartDevReadBuf_drv */
+ // If timer is enabled, reset it's value, + // otherwise keep it disabled + if(uartPortTim[i].status != TIM_DISABLED) + uartPortTim[i].actValue = now; + uartPortTim[i].status = TIM_EN_RUNNING; + else /* Keep timer disabled */ + uartPortTim[i].status = TIM_DISABLED; if(!rt_mutex_acquire(&UART_ReadMutex, TM_INFINITE )){
if(uartDevReadBuf_plc_state == EMPTY){
@@ -275,8 +393,203 @@
+/**************************************************************************//** +* Calculate checksum of a buffer +* @param [in] buffer Pointer to buffer +* @return Checksum values on buffer locations 23 & 24 +******************************************************************************/ +void Checksum(unsigned char *buffer) + unsigned char i=0, j=0; + unsigned char checksum1=0, checksum2=0; + unsigned char checksum1Temp=0; + checksum1Temp=buffer[i]; + for(j=0;j<8;j++) // Compute number of '1' of whole buff. + if((checksum1Temp & 0x01)>0) + checksum1Temp = checksum1Temp >> 1; + checksum2 = checksum2 ^ buffer[i]; // Compute XOR of whole buffer + buffer[45] = checksum2; // Write number of '1' to buffer + buffer[46] = checksum1; // Write XOR to buffer +/**************************************************************************//** +* Check if checksum values of received buffer are valid +* @param [in] buffer Pointer to buffer +* @return TRUE if valid, otherwise FALSE +******************************************************************************/ +unsigned char ChecksumValid(unsigned char *buffer) + unsigned char i=0, j=0; + unsigned char checksum1=0, checksum2=0; + unsigned char checksum1Temp=0; + checksum1Temp = buffer[i]; + for(j=0;j<8;j++) // Compute number of '1' of whole buff. + if((checksum1Temp & 0x01)>0) + checksum1Temp = checksum1Temp >> 1; // Compute XOR of whole buffer + checksum2 = checksum2^buffer[i]; + if((checksum2==buffer[45]) && (checksum1==buffer[46])) // Check if computed checksums are the same as those in buffer (=> no error) +/*************************************************************************//** +* Support for UART modules +* @param [in] readBuf Pointer to read buffer (for previously polled UART device!) +* @param [out] writeBuf Pointer to write buffer (for current device) +* @param [in] address UART device address +*****************************************************************************/ +void UARTDevice(char* readBuf, char* writeBuf, char address) + struct timeval timeout; + // writeBuf[45] = address; + char tmp[UART_BUFSIZE]; + Checksum((unsigned char*)writeBuf+1); + // for (i=0; i<UART_BUFSIZE; i++){ + // printf("|%%c:%%d", writeBuf[i], writeBuf[i]); + //rt_task_sleep(rt_timer_ns2ticks(500000)); + if(write(UART_fd, writeBuf, UART_BUFSIZE) != UART_BUFSIZE){ + FD_ZERO(&set); /* clear the set */ + FD_SET(UART_fd, &set); /* add our file descriptor to the set */ + timeout.tv_usec = 50000; + /* Turn to listen mode*/ + rv = select(UART_fd + 1, &set, NULL, NULL, &timeout); + perror("select"); /* an error accured */ + printf("timeout"); /* a timeout occured */ + else if(read(UART_fd, tmp, UART_BUFSIZE) == UART_BUFSIZE){ + memcpy(readBuf,tmp,UART_BUFSIZE); + /* Turn to transmit mode*/ + tcflush(UART_fd, TCIOFLUSH); +/* Macro to transform milliseconds to xenomai ticks */ +#define msTOxn(ms) rt_timer_ns2ticks(1000000L*ms) +void InitUartPortDevices(void) + for(i=0;i<MAX_UART_DEVICES;i++) + case(130): /* P01, P02, P01V, P02V */ + uartPortDevices[i] = &UARTDevice; + uartPortTim[i].toValue = msTOxn(200); /* 200ms */ + uartPortTim[i].status = TIM_EN_RUNNING; + uartPortDevices[i] = &UARTDevice; + uartPortTim[i].toValue = msTOxn(600); /* 600ms */ + uartPortTim[i].status = TIM_EN_RUNNING; + case(170): /* ID1, ID2, ID3 */ + uartPortDevices[i] = &UARTDevice; + uartPortTim[i].toValue = msTOxn(400); /* 400ms */ + uartPortTim[i].status = TIM_EN_RUNNING; + uartPortDevices[i] = &UARTDevice; + uartPortTim[i].toValue = msTOxn(400); /* 400ms */ + uartPortTim[i].status = TIM_EN_RUNNING; + uartPortDevices[i] = NULL; /* "Empty" or unknown module */ + uartPortTim[i].status = TIM_DISABLED;
+char *serialdev = "/dev/ttyAPP1"; uartDevWriteBuf_plc_state = EMPTY;
uartDevReadBuf_plc_state = EMPTY;
bzero(&uartDev, sizeof(uartDev));
@@ -290,9 +603,8 @@
bzero(&uartDevWriteBufB, sizeof(uartDevWriteBuf_t));
uartDevWriteBuf_drv = &uartDevWriteBufA;
uartDevWriteBuf_plc = &uartDevWriteBufB;
if((err = rt_mutex_create (&UART_WriteMutex, "UART_WriteMutex")))
@@ -300,6 +612,16 @@
if((err = rt_mutex_create (&UART_ReadMutex, "UART_ReadMutex")))
+UART_fd = openserial(serialdev); + fprintf(stderr, "Error while initializing %%s.\\n", serialdev); if((err = rt_task_create(&UART_task, "UART_task", 0, 50, T_JOINABLE)))
@@ -319,7 +641,7 @@
- /* XXX use uartDevReadBuf_plc */
uartDevReadBuf_plc_state = EMPTY;
@@ -337,7 +659,7 @@
rt_mutex_release(&UART_WriteMutex);
- /* XXX use uartDevWriteBuf_plc */
uartDevWriteBuf_plc_state = FULL;
@@ -349,6 +671,7 @@
rt_task_delete(&UART_task);
rt_task_join(&UART_task);
rt_mutex_delete(&UART_WriteMutex);
rt_mutex_delete(&UART_ReadMutex);
@@ -541,27 +864,12 @@
# define a unique name for the generated C file
location_str = "_".join(map(str, current_location))
- BusName = LPCarch + ":" + self.BaseParams.getName()
- bcode = bus_code.get(BusName,{"decl":"",
code_str = {"location_str": location_str,
- "bus_decl":bcode["decl"],
- "buffer_init": bcode["buffer_init"],
- "bus_init_code": bcode["init"],
- "bus_cleanup_code": bcode["cleanup"],
- "bus_retrieve_code": bcode["retrieve"],
- "bus_publish_code": bcode["publish"],
for module in GetModuleChildren(self):
@@ -609,6 +917,24 @@
code_str["publish_code"] += " " + var["Publish"] % ("*" + var["location"]) + "\n"
+ BusName = LPCarch + ":" + self.BaseParams.getName() + return bus_code.get(BusName,{"decl":"", + "init":"%(init_code)s", + "retrieve":"%(retrieve_code)s", + "publish":"%(publish_code)s", + "bus_decl":bcode("decl"), + "bus_init_code": bcode("init"), + "bus_cleanup_code": bcode("cleanup"), + "bus_retrieve_code": bcode("retrieve"), + "bus_publish_code": bcode("publish"), if LPCarch not in bus_template_code:
raise Exception, "Unknown arch %s. Please use %s"%(
LPCarch,repr(bus_template_code.keys()))