37 #include <sys/ioctl.h> 39 int serialport_init(
const char* serialport,
int baud)
41 struct termios toptions;
45 fd = open(serialport, O_RDWR | O_NONBLOCK );
48 perror(
"serialport_init: Unable to open port ");
56 if (tcgetattr(fd, &toptions) < 0) {
57 perror(
"serialport_init: Couldn't get term attributes");
62 case 4800: brate=B4800;
break;
63 case 9600: brate=B9600;
break;
65 case 14400: brate=B14400;
break;
67 case 19200: brate=B19200;
break;
69 case 28800: brate=B28800;
break;
71 case 38400: brate=B38400;
break;
72 case 57600: brate=B57600;
break;
73 case 115200: brate=B115200;
break;
75 cfsetispeed(&toptions, brate);
76 cfsetospeed(&toptions, brate);
79 toptions.c_cflag &= ~PARENB;
80 toptions.c_cflag &= ~CSTOPB;
81 toptions.c_cflag &= ~CSIZE;
82 toptions.c_cflag |= CS8;
84 toptions.c_cflag &= ~CRTSCTS;
88 toptions.c_cflag |= CREAD | CLOCAL;
89 toptions.c_iflag &= ~(IXON | IXOFF | IXANY);
91 toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
92 toptions.c_oflag &= ~OPOST;
95 toptions.c_cc[VMIN] = 0;
96 toptions.c_cc[VTIME] = 0;
99 tcsetattr(fd, TCSANOW, &toptions);
100 if( tcsetattr(fd, TCSAFLUSH, &toptions) < 0) {
101 perror(
"init_serialport: Couldn't set term attributes");
113 int fd_serial_device;
115 void concatArray(
unsigned char *first,
int firstLen,
unsigned char *second,
int secondLen)
118 for (i=0;i<secondLen;i++)
120 first[i + firstLen] = second[i];
124 void serial_blocking_read(
int fd,
void *buf,
size_t nbytes)
126 unsigned char tmp_buf[255];
130 while(counter < nbytes)
132 curr_bytes = read(fd,tmp_buf,nbytes);
135 concatArray(buf,counter,tmp_buf,curr_bytes);
136 counter += curr_bytes;
141 unsigned int integer;
142 unsigned char byte[256];
145 void copyArraySerialConn(
unsigned char* src,
unsigned char *dest,
unsigned int len)
154 printf(
"Start Discovery\n");
156 unsigned char message[256];
158 message[0]= DISCOVERY;
159 write(fd_serial_device,message,1);
176 serial_blocking_read(fd_serial_device,message,1);
177 unsigned int sizeAddress = message[0];
178 printf(
"Size Address %u\n",sizeAddress);
180 serial_blocking_read(fd_serial_device,message,sizeAddress);
182 devs[0].address.integer=fd_serial_device;
183 printf(
"(Address (used fd): %u)\n",message[0]);
185 serial_blocking_read(fd_serial_device,message,1);
186 devs[0].sizeIODevice=message[0];
189 serial_blocking_read(fd_serial_device,message,1);
190 devs[0].sizeIDSensor=message[0];
191 printf(
"SizeIDSensor: %u\n",devs[0].sizeIDSensor);
193 serial_blocking_read(fd_serial_device,message,devs[0].sizeIDSensor);
195 copyArraySerialConn(message,converter.byte,devs[0].sizeIDSensor);
196 devs[0].numSensors=converter.integer;
197 printf(
"Num Sensors: %u\n",devs[0].numSensors);
200 for(s=0;s<devs[0].numSensors;s++)
202 serial_blocking_read(fd_serial_device,message,devs[0].sizeIDSensor);
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);
208 serial_blocking_read(fd_serial_device,message,SIZE_TYPE_SENSOR);
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);
214 serial_blocking_read(fd_serial_device,message,1);
215 devs[0].sensors[s].sizeOutput=message[0];
216 printf(
"Sensor sizeOutput: %u\n",devs[0].sensors[s].sizeOutput);
218 serial_blocking_read(fd_serial_device,message,1);
219 devs[0].sensors[s].typeOutput=message[0];
220 printf(
"Sensor typeOutput: %u\n",devs[0].sensors[s].typeOutput);
223 serial_blocking_read(fd_serial_device,message,1);
224 devs[0].sizeIDActuator=message[0];
225 printf(
"Size ID Actuator %u\n",devs[0].sizeIDActuator);
227 serial_blocking_read(fd_serial_device,message,devs[0].sizeIDActuator);
229 copyArraySerialConn(message,converter.byte,devs[0].sizeIDActuator);
230 devs[0].numActuators=converter.integer;
231 printf(
"Num Actuators %u\n",devs[0].numActuators);
234 for(a=0;a<devs[0].numActuators;a++)
236 serial_blocking_read(fd_serial_device,message,devs[0].sizeIDActuator);
238 copyArraySerialConn(message,converter.byte,devs[0].sizeIDActuator);
239 devs[0].actuators[a].ID.integer=converter.integer;
242 serial_blocking_read(fd_serial_device,message,SIZE_TYPE_ACTUATOR);
244 copyArraySerialConn(message,converter.byte,SIZE_TYPE_ACTUATOR);
245 devs[0].actuators[a].typeActuator.integer=converter.integer;
248 serial_blocking_read(fd_serial_device,message,1);
249 devs[0].actuators[a].sizeInput=message[0];
252 serial_blocking_read(fd_serial_device,message,1);
253 devs[0].actuators[a].typeInput=message[0];
261 int checkDeviceSerialImpl (
unsigned char* addr)
263 unsigned int ad = (addr[0] << 8) + addr[1];
265 if(ad == 35 || ad == 5 || ad == 500)
270 void msgToDeviceSerialImpl (
unsigned char* addr,
unsigned char sizeData,
unsigned char* data)
272 unsigned char msg[255];
274 msg[0] = MSG_TO_DEVICE;
275 write(fd_serial_device,msg,SIZE_OPERATION);
276 write(fd_serial_device,data,sizeData);
279 void msgAndAnswerToDeviceSerialImpl (
unsigned char* addr,
unsigned char sizeReqAns,
unsigned char* request,
unsigned char* answer)
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);
286 serial_blocking_read(fd_serial_device,answer,sizeReqAns);
289 void getSensorValueSerialImpl (
unsigned char* addr,
unsigned char sizeIDSen,
unsigned char* IDSen,
unsigned char sizeValue,
unsigned char* value)
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);
296 serial_blocking_read(fd_serial_device,value,sizeValue);
299 void setActuatorValueSerialImpl (
unsigned char* addr,
unsigned char sizeIDAct,
unsigned char* IDAct,
unsigned char sizeValue ,
unsigned char* value)
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);
311 fd_serial_device = serialport_init(serialport,baud);
316 conn.name =
"SerialConnector";
317 conn.sizeAddress =
sizeof(int);
318 conn.discovery = discoverySerialImpl;
319 conn.checkDevice = checkDeviceSerialImpl;
320 conn.msgToDevice = msgToDeviceSerialImpl;
321 conn.msgAndAnswerToDevice = msgAndAnswerToDeviceSerialImpl;
322 conn.getSensorValue = getSensorValueSerialImpl;
323 conn.setActuatorValue = setActuatorValueSerialImpl;