Robot Agent  1.0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
openinterface.c
Go to the documentation of this file.
1 
12 /* -- Includes -- */
13 /* system libraries */
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h> /* String function definitions */
17 #include <unistd.h> /* UNIX standard function definitions */
18 #include <sys/time.h>
19 #include <sys/select.h>
20 /* project libraries */
21 #include "openinterface.h"
22 #include "config.h"
23 #include "def.h"
24 #include "general.h"
25 
26 /* -- Defines -- */
27 
28 /* -- Functions -- */
29 
36 {
37  // Openinterface structure
38  openinterface_t *ois = (openinterface_t *) malloc(sizeof(openinterface_t));
39  // Openinterface sensor structure
40  ois->oiss = (openinterface_sensor_t *) malloc(sizeof(openinterface_sensor_t));
41 
42  // Open serial port
43  ois->sps = serialport_open(device_path);
44  // Configure serial port
45  serialport_config(ois->sps, 57600);
46 
47  // Start Open Interface
49  // Get full control over robot
50  openinterface_full(ois);
51 
52  // Turn on LEDs
53  openinterface_LEDs(ois, 1, 1, 255, 255);
54 
55  return ois;
56 }
57 
64 {
65  int res;
66 
67  // Stop robot if it still runs
68  openinterface_full(ois);
69  // Stop Motion
70  openinterface_drive(ois, 0, 0x8000);
71  // Turn on LEDs (So that user know that robot is still ON)
72  openinterface_LEDs(ois, 1, 1, 255, 255);
73 
74  // Close serial port
75  res = serialport_close(ois->sps);
76  // Free memory (OpenInterface Sensor struct)
77  free(ois->oiss);
78  // Free memory (OpenInterface struct)
79  free(ois);
80 
81  return res;
82 }
83 
90 {
91  // Start OI
93  return s_ERROR;
94  else
95  return s_OK;
96 }
97 
104 {
105  // Enable full control of OI
107  return s_ERROR;
108  else
109  return s_OK;
110 }
111 
119 int openinterface_drive(openinterface_t *ois, int velocity, int radius)
120 {
121  int res = 0;
122  unsigned char velocity_data[2], radius_data[2];
123 
124  // Convert velocity int to bytes
125  general_int2bytes(velocity, &velocity_data[0], &velocity_data[1]);
126  // Convert radius int to bytes
127  general_int2bytes(radius, &radius_data[0], &radius_data[1]);
128 
129  // Send command with drive parameters
130  res += serialport_byte(ois->sps, s_OI_CMD_DRIVE);
131  res += serialport_byte(ois->sps, velocity_data[0]);
132  res += serialport_byte(ois->sps, velocity_data[1]);
133  res += serialport_byte(ois->sps, radius_data[0]);
134  res += serialport_byte(ois->sps, radius_data[1]);
135 
136  // Error check
137  if(res < 5)
138  return s_ERROR;
139  else
140  return s_OK;
141 }
142 
150 int openinterface_drive_direct(openinterface_t *ois, int right, int left)
151 {
152  int res = 0;
153  unsigned char right_data[2], left_data[2];
154 
155  // Convert right int to bytes
156  general_int2bytes(right, &right_data[0], &right_data[1]);
157  // Convert left int to bytes
158  general_int2bytes(left, &left_data[0], &left_data[1]);
159 
160  // Send command with drive parameters
162  res += serialport_byte(ois->sps, right_data[0]);
163  res += serialport_byte(ois->sps, right_data[1]);
164  res += serialport_byte(ois->sps, left_data[0]);
165  res += serialport_byte(ois->sps, left_data[1]);
166 
167  // Error check
168  if(res < 5)
169  return s_ERROR;
170  else
171  return s_OK;
172 }
173 
182 int openinterface_sensor_get(openinterface_t *ois, const unsigned char id, const unsigned char len, unsigned char *data)
183 {
184  // Request packet
185  unsigned char req[2] = {s_OI_CMD_SENSORS, id};
186  // Read packet
187  unsigned char *bufptr; // Current char in buffer
188  int nbytes, tbytes, n; // Number of bytes read
189 
190  // Prepare select()
191  struct timeval tv;
192  tv.tv_sec = 1; // Set two second timeout
193  tv.tv_usec = 0;
194  fd_set infds;
195  FD_ZERO(&infds);
196  FD_SET(ois->sps->descriptor, &infds);
197 
198  // Request sensor update
199  serialport_write(ois->sps, req, 2);
200 
201  // Read sensor data
202  tbytes = 0;
203  bufptr = data;
204 
205  while((n = select(ois->sps->descriptor + 1, &infds, NULL, NULL, &tv)) > 0)
206  {
207  nbytes = (int)read(ois->sps->descriptor, bufptr, 1);
208 
209  if (tbytes < (len + 1)) {
210  tbytes += nbytes;
211  bufptr += nbytes;
212  }
213 
214  if (tbytes == len) {
215  break;
216  }
217  }
218 
219  return s_OK;
220 }
221 
222 
231 int openinterface_sensors_update(openinterface_t *ois, const unsigned int sensor_id, const unsigned int size)
232 {
233  // Array for data acquisition
234  unsigned char data[52];
235 
236  // Request all sensor data
237  openinterface_sensor_get(ois, sensor_id, size, data);
238 
239 
240  // Update sensor measurement values
241  // !!! FUNCTION IS NOT COMPLETE. UPDATES ONLY FEW SENSORS
242  switch(sensor_id)
243  {
244  // Sensor Packet 0
245  case s_OI_SENSOR_PACKET_0 :
246  ois->oiss->wheeldrop_bump = data[0];
247  ois->oiss->wall = data[1];
248  ois->oiss->distance = general_bytes2int(data[12], data[13]);
249  ois->oiss->angle = general_bytes2int(data[14], data[15]);
250  break;
251  // Sensor Packet 1
252  case s_OI_SENSOR_PACKET_1 :
253  ois->oiss->wheeldrop_bump = data[0];
254  ois->oiss->wall = data[1];
255  break;
256  // Sensor Packet 2
257  case s_OI_SENSOR_PACKET_2 :
258  ois->oiss->distance = general_bytes2int(data[2], data[3]);
259  ois->oiss->angle = general_bytes2int(data[4], data[5]);
260  break;
261  // Sensor Packet 3
262  case s_OI_SENSOR_PACKET_3 :
263  break;
264  // Sensor Packet 4
265  case s_OI_SENSOR_PACKET_4 :
266  ois->oiss->wall_signal = general_bytes2uint(data[0], data[1]);
267  ois->oiss->cliff_left_signal = general_bytes2uint(data[2], data[3]);
268  ois->oiss->cliff_front_left_signal = general_bytes2uint(data[4], data[5]);
269  ois->oiss->cliff_front_right_signal = general_bytes2uint(data[6], data[7]);
270  ois->oiss->cliff_right_signal = general_bytes2uint(data[8], data[9]);
271  break;
272  // Sensor Packet 5
273  case s_OI_SENSOR_PACKET_5 :
274  break;
275  // Sensor Packet 6
276  case s_OI_SENSOR_PACKET_6 :
277  ois->oiss->wheeldrop_bump = data[0];
278  ois->oiss->wall = data[1];
279  ois->oiss->distance = general_bytes2int(data[12], data[13]);
280  ois->oiss->angle = general_bytes2int(data[14], data[15]);
281  ois->oiss->wall_signal = general_bytes2uint(data[26], data[27]);
282  ois->oiss->cliff_left_signal = general_bytes2uint(data[28], data[29]);
283  ois->oiss->cliff_front_left_signal = general_bytes2uint(data[30], data[31]);
284  ois->oiss->cliff_front_right_signal = general_bytes2uint(data[32], data[33]);
285  ois->oiss->cliff_right_signal = general_bytes2uint(data[34], data[35]);
286  break;
287  // Other
288  default :
289  return s_ERROR;
290  break;
291  }
292 
293  return s_OK;
294 }
295 
302 {
303  unsigned char data[2];
304  int distance;
305 
306  // Request travelled distance measurement
307  openinterface_sensor_get(ois, 19, 2, data);
308 
309  //Convert to int (two's complement)
310  distance = general_bytes2int(data[0], data[1]);
311 
312  return distance;
313 }
314 
321 {
322  unsigned char data[2];
323  int angle;
324 
325  // Request angle change measurement
326  openinterface_sensor_get(ois, 20, 2, data);
327 
328  //Convert to int (two's complement)
329  angle = general_bytes2int(data[0], data[1]);
330 
331  return angle;
332 }
333 
344  int play,
345  int advance,
346  unsigned char power_color,
347  unsigned char power_intensity)
348 {
349  int res = 0;
350  unsigned char leds = 0;
351 
352  if(play > 0)
353  leds += 2;
354  if(advance > 0)
355  leds += 8;
356 
357  // Send command with drive parameters
358  res += serialport_byte(ois->sps, s_OI_CMD_LEDS);
359  res += serialport_byte(ois->sps, leds);
360  res += serialport_byte(ois->sps, power_color);
361  res += serialport_byte(ois->sps, power_intensity);
362 
363  // Error check
364  if(res < 4)
365  return s_ERROR;
366  else
367  return s_OK;
368 }
int openinterface_close(openinterface_t *ois)
Definition: openinterface.c:63
#define s_OI_CMD_START
#define s_OI_CMD_DRIVE
#define s_OI_SENSOR_PACKET_2
openinterface_sensor_t * oiss
serialport_t * serialport_open(const char *name)
Definition: serialport.c:33
#define s_OI_SENSOR_PACKET_0
Open Interface structure.
unsigned int general_bytes2uint(unsigned char byte_high, unsigned char byte_low)
Definition: general.c:52
openinterface_t * openinterface_open(char *device_path)
Definition: openinterface.c:35
void general_int2bytes(int integer, unsigned char *byte_high, unsigned char *byte_low)
Definition: general.c:69
int serialport_write(serialport_t *sps, unsigned char *data, unsigned int bytes)
Definition: serialport.c:166
unsigned int cliff_front_left_signal
Definition: openinterface.h:68
int openinterface_sensor_get(openinterface_t *ois, const unsigned char id, const unsigned char len, unsigned char *data)
#define s_OI_CMD_MODE_FULL
int openinterface_start(openinterface_t *ois)
Definition: openinterface.c:89
#define s_OK
Definition: def.h:64
#define s_OI_SENSOR_PACKET_6
Open Interface Sensor structure.
Definition: openinterface.h:23
#define s_OI_CMD_SENSORS
int openinterface_LEDs(openinterface_t *ois, int play, int advance, unsigned char power_color, unsigned char power_intensity)
int general_bytes2int(unsigned char byte_high, unsigned char byte_low)
Definition: general.c:29
#define s_OI_SENSOR_PACKET_5
int openinterface_angle_get(openinterface_t *ois)
int serialport_config(serialport_t *sps, unsigned int baud)
Definition: serialport.c:82
#define s_OI_SENSOR_PACKET_4
int openinterface_drive(openinterface_t *ois, int velocity, int radius)
int openinterface_sensors_update(openinterface_t *ois, const unsigned int sensor_id, const unsigned int size)
#define s_OI_CMD_DRIVE_DIRECT
int serialport_close(serialport_t *sps)
Definition: serialport.c:58
#define s_ERROR
Definition: def.h:65
unsigned int cliff_front_right_signal
Definition: openinterface.h:70
#define s_OI_SENSOR_PACKET_1
#define s_OI_CMD_LEDS
int serialport_byte(serialport_t *sps, unsigned char byte)
Definition: serialport.c:178
int openinterface_full(openinterface_t *ois)
int openinterface_drive_direct(openinterface_t *ois, int right, int left)
int openinterface_distance_get(openinterface_t *ois)
#define s_OI_SENSOR_PACKET_3