UniSaSA  1.0
C Gateway
serialConnector.c
1 /*=====================================================================
2 // arduino-serial-lib --
3 // simple library for reading/writing serial ports
4 //
5 // 2006-2013, Tod E. Kurt, http://todbot.com/blog/
6 //
7 * The MIT License (MIT)
8 
9 * Copyright (c) 2014 Tod E. Kurt
10 *
11 * Permission is hereby granted, free of charge, to any person obtaining
12 * a copy of this software and associated documentation files
13 * (the "Software"), to deal in the Software without restriction,
14 * including without limitation the rights to use, copy, modify, merge,
15 * publish, distribute, sublicense, and/or sell copies of the Software,
16 * and to permit persons to whom the Software is furnished to do so,
17 * subject to the following conditions:
18 *
19 * The above copyright notice and this permission notice shall be
20 * included in all copies or substantial portions of the Software.
21 *
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
25 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
26 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 */
30 
31 #include <stdio.h> // Standard input/output definitions
32 #include <unistd.h> // UNIX standard function definitions
33 #include <fcntl.h> // File control definitions
34 #include <errno.h> // Error number definitions
35 #include <termios.h> // POSIX terminal control definitions
36 #include <string.h> // String function definitions
37 #include <sys/ioctl.h>
38 
39 int serialport_init(const char* serialport, int baud)
40 {
41  struct termios toptions;
42  int fd;
43 
44  //fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
45  fd = open(serialport, O_RDWR | O_NONBLOCK );
46 
47  if (fd == -1) {
48  perror("serialport_init: Unable to open port ");
49  return -1;
50  }
51 
52  //int iflags = TIOCM_DTR;
53  //ioctl(fd, TIOCMBIS, &iflags); // turn on DTR
54  //ioctl(fd, TIOCMBIC, &iflags); // turn off DTR
55 
56  if (tcgetattr(fd, &toptions) < 0) {
57  perror("serialport_init: Couldn't get term attributes");
58  return -1;
59  }
60  speed_t brate = baud; // let you override switch below if needed
61  switch(baud) {
62  case 4800: brate=B4800; break;
63  case 9600: brate=B9600; break;
64 #ifdef B14400
65  case 14400: brate=B14400; break;
66 #endif
67  case 19200: brate=B19200; break;
68 #ifdef B28800
69  case 28800: brate=B28800; break;
70 #endif
71  case 38400: brate=B38400; break;
72  case 57600: brate=B57600; break;
73  case 115200: brate=B115200; break;
74  }
75  cfsetispeed(&toptions, brate);
76  cfsetospeed(&toptions, brate);
77 
78  // 8N1
79  toptions.c_cflag &= ~PARENB;
80  toptions.c_cflag &= ~CSTOPB;
81  toptions.c_cflag &= ~CSIZE;
82  toptions.c_cflag |= CS8;
83  // no flow control
84  toptions.c_cflag &= ~CRTSCTS;
85 
86  //toptions.c_cflag &= ~HUPCL; // disable hang-up-on-close to avoid reset
87 
88  toptions.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
89  toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl
90 
91  toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
92  toptions.c_oflag &= ~OPOST; // make raw
93 
94  // see: http://unixwiz.net/techtips/termios-vmin-vtime.html
95  toptions.c_cc[VMIN] = 0;
96  toptions.c_cc[VTIME] = 0;
97  //toptions.c_cc[VTIME] = 20;
98 
99  tcsetattr(fd, TCSANOW, &toptions);
100  if( tcsetattr(fd, TCSAFLUSH, &toptions) < 0) {
101  perror("init_serialport: Couldn't set term attributes");
102  return -1;
103  }
104 
105  return fd;
106 }
107 
108 /* ================================================================== */
109 
110 #include "connector.h"
111 
112 // global variables
113 int fd_serial_device;
114 
115 void concatArray(unsigned char *first, int firstLen, unsigned char *second, int secondLen)
116 {
117  int i=0;
118  for (i=0;i<secondLen;i++)
119  {
120  first[i + firstLen] = second[i];
121  }
122 }
123 
124 void serial_blocking_read(int fd, void *buf, size_t nbytes)
125 {
126  unsigned char tmp_buf[255];
127  int counter=0;
128  int curr_bytes=0;
129 
130  while(counter < nbytes)
131  {
132  curr_bytes = read(fd,tmp_buf,nbytes);
133  if(curr_bytes < 1 )
134  continue;
135  concatArray(buf,counter,tmp_buf,curr_bytes);
136  counter += curr_bytes;
137  }
138 }
139 
140 union {
141  unsigned int integer;
142  unsigned char byte[256];
143 } converter;
144 
145 void copyArraySerialConn(unsigned char* src,unsigned char *dest,unsigned int len)
146 {
147  int i=0;
148  for(i=0;i<len;i++)
149  dest[i]=src[i];
150 }
151 
152 unsigned int discoverySerialImpl (discoveredDevice_t *devs)
153 {
154  printf("Start Discovery\n");
155 
156  unsigned char message[256];
157 
158  message[0]= DISCOVERY;
159  write(fd_serial_device,message,1);
160 
161 
162  /*
163  * 1 byte sizeAddr 1 byte
164  * sizeAddr | addr | sizeIOMsg | ...
165  * (A) (B) (C)
166  *
167  * 1 byte sizeIDSen sizeIDSen 2 byte 1 byte 1 byte
168  * | sizeIDSen | num Sens | ID Sen | type Sen | size Out | type Out|
169  * (D) (E) (F) (G) (H) (I)
170  *
171  * 1 byte sizeIDAct sizeIDAct 2 byte 1 byte 1 byte
172  * | sizeIDAct | num Acts | ID Act | type Act | size In | type In |
173  * (J) (K) (L) (M) (N) (O)
174  */
175 
176  serial_blocking_read(fd_serial_device,message,1); // (A)
177  unsigned int sizeAddress = message[0];
178  printf("Size Address %u\n",sizeAddress);
179 
180  serial_blocking_read(fd_serial_device,message,sizeAddress); // (B)
181  //using file descriptor for address
182  devs[0].address.integer=fd_serial_device;
183  printf("(Address (used fd): %u)\n",message[0]);
184 
185  serial_blocking_read(fd_serial_device,message,1); // (C)
186  devs[0].sizeIODevice=message[0];
187  //printf(" %u\n",);
188 
189  serial_blocking_read(fd_serial_device,message,1); // (D)
190  devs[0].sizeIDSensor=message[0];
191  printf("SizeIDSensor: %u\n",devs[0].sizeIDSensor);
192 
193  serial_blocking_read(fd_serial_device,message,devs[0].sizeIDSensor); // (E)
194  converter.integer=0;
195  copyArraySerialConn(message,converter.byte,devs[0].sizeIDSensor);
196  devs[0].numSensors=converter.integer;
197  printf("Num Sensors: %u\n",devs[0].numSensors);
198 
199  unsigned int s=0;
200  for(s=0;s<devs[0].numSensors;s++)
201  {
202  serial_blocking_read(fd_serial_device,message,devs[0].sizeIDSensor); // (F)
203  converter.integer=0;
204  copyArraySerialConn(message,converter.byte,devs[0].sizeIDSensor);
205  devs[0].sensors[s].ID.integer=converter.integer;
206  printf("Sensor ID: %u\n",devs[0].sensors[s].ID.integer);
207 
208  serial_blocking_read(fd_serial_device,message,SIZE_TYPE_SENSOR); // (G)
209  converter.integer=0;
210  copyArraySerialConn(message,converter.byte,SIZE_TYPE_SENSOR);
211  devs[0].sensors[s].typeSensor.integer=converter.integer;
212  printf("Sensor Type: %u\n",devs[0].sensors[s].typeSensor.integer);
213 
214  serial_blocking_read(fd_serial_device,message,1); // (H)
215  devs[0].sensors[s].sizeOutput=message[0];
216  printf("Sensor sizeOutput: %u\n",devs[0].sensors[s].sizeOutput);
217 
218  serial_blocking_read(fd_serial_device,message,1); //(I)
219  devs[0].sensors[s].typeOutput=message[0];
220  printf("Sensor typeOutput: %u\n",devs[0].sensors[s].typeOutput);
221  }
222 
223  serial_blocking_read(fd_serial_device,message,1); // (J)
224  devs[0].sizeIDActuator=message[0];
225  printf("Size ID Actuator %u\n",devs[0].sizeIDActuator);
226 
227  serial_blocking_read(fd_serial_device,message,devs[0].sizeIDActuator); // (K)
228  converter.integer=0;
229  copyArraySerialConn(message,converter.byte,devs[0].sizeIDActuator);
230  devs[0].numActuators=converter.integer;
231  printf("Num Actuators %u\n",devs[0].numActuators);
232 
233  unsigned int a=0;
234  for(a=0;a<devs[0].numActuators;a++)
235  {
236  serial_blocking_read(fd_serial_device,message,devs[0].sizeIDActuator); // (L)
237  converter.integer=0;
238  copyArraySerialConn(message,converter.byte,devs[0].sizeIDActuator);
239  devs[0].actuators[a].ID.integer=converter.integer;
241 
242  serial_blocking_read(fd_serial_device,message,SIZE_TYPE_ACTUATOR); // (M)
243  converter.integer=0;
244  copyArraySerialConn(message,converter.byte,SIZE_TYPE_ACTUATOR);
245  devs[0].actuators[a].typeActuator.integer=converter.integer;
247 
248  serial_blocking_read(fd_serial_device,message,1); // (N)
249  devs[0].actuators[a].sizeInput=message[0];
250  //printf("Act sizeInput %u\n", mesage[0]);
251 
252  serial_blocking_read(fd_serial_device,message,1); //(O)
253  devs[0].actuators[a].typeInput=message[0];
254  //printf("Act typeInput %u\n", message[0]);
255  }
256 
257  return 1;
258 
259 }
260 
261 int checkDeviceSerialImpl ( unsigned char* addr)
262 {
263  unsigned int ad = (addr[0] << 8) + addr[1];
264  int check=0;
265  if(ad == 35 || ad == 5 || ad == 500)
266  check=1;
267  return check;
268 }
269 
270 void msgToDeviceSerialImpl (unsigned char* addr, unsigned char sizeData, unsigned char* data)
271 {
272  unsigned char msg[255];
273 
274  msg[0] = MSG_TO_DEVICE;
275  write(fd_serial_device,msg,SIZE_OPERATION);
276  write(fd_serial_device,data,sizeData);
277 }
278 
279 void msgAndAnswerToDeviceSerialImpl (unsigned char* addr, unsigned char sizeReqAns, unsigned char* request, unsigned char* answer)
280 {
281  unsigned char msg[255];
282  msg[0] = MSG_AND_ANSWER_TO_DEVICE;
283  write(fd_serial_device,msg,SIZE_OPERATION);
284  write(fd_serial_device,request,sizeReqAns);
285 
286  serial_blocking_read(fd_serial_device,answer,sizeReqAns);
287 }
288 
289 void getSensorValueSerialImpl (unsigned char* addr, unsigned char sizeIDSen, unsigned char* IDSen, unsigned char sizeValue, unsigned char* value)
290 {
291  unsigned char msg[255];
292  msg[0] = GET_SENSOR_VALUE;
293  write(fd_serial_device,msg,SIZE_OPERATION);
294  write(fd_serial_device,IDSen,sizeIDSen);
295 
296  serial_blocking_read(fd_serial_device,value,sizeValue);
297 }
298 
299 void setActuatorValueSerialImpl (unsigned char* addr, unsigned char sizeIDAct,unsigned char* IDAct, unsigned char sizeValue ,unsigned char* value)
300 {
301  unsigned char msg[255];
302  msg[0] = SET_ACTUATOR_VALUE;
303  write(fd_serial_device,msg,SIZE_OPERATION);
304  write(fd_serial_device,IDAct,sizeIDAct);
305  write(fd_serial_device,value,sizeValue);
306 }
307 
308 
309 connectorInterface_t createSerialConnector(const char* serialport, int baud)
310 {
311  fd_serial_device = serialport_init(serialport,baud);
312  sleep(3);
313 
315 
316  conn.name = "SerialConnector";
317  conn.sizeAddress = sizeof(int); // file descriptor
318  conn.discovery = discoverySerialImpl;
319  conn.checkDevice = checkDeviceSerialImpl;
320  conn.msgToDevice = msgToDeviceSerialImpl;
321  conn.msgAndAnswerToDevice = msgAndAnswerToDeviceSerialImpl;
322  conn.getSensorValue = getSensorValueSerialImpl;
323  conn.setActuatorValue = setActuatorValueSerialImpl;
324 
325  return conn;
326 }
327 
328