Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / robot / wl_network_colonet / colonet.c @ 481

History | View | Annotate | Download (8.52 KB)

1
/* Eugene Marinelli, ...
2
 * 10/26/06
3
 * 
4
 * colonet.c - Colonet library for colony robots
5
 */
6

    
7
#include <firefly+_lib.h>
8

    
9
#include "colonet.h"
10

    
11
typedef struct {
12
  unsigned char msgId;
13
  void (*handler)(void);
14
} UserHandler;
15

    
16
/* Globals (internal) */
17
static UserHandler user_handlers[USER_DEFINED_MSG_TOTAL];
18

    
19
/* Internal function prototypes */
20
void packet_string_to_struct(ColonetPacket* dest_pkt, char* pkt_buf);
21
unsigned int two_bytes_to_int(char high, char low);
22

    
23
/* Public functions */
24
int colonet_handle_message(unsigned char robot_id, char* pkt_buf)
25
{
26
  ColonetPacket pkt;
27
  unsigned char* args; //up to 7 char args
28
  unsigned int int_args[3]; //up to 3 int (2-byte) args
29

    
30
  packet_string_to_struct(&pkt, pkt_buf);
31

    
32
  if(pkt.msg_dest != GLOBAL_DEST && pkt.msg_dest != robot_id){ 
33
    //message not intended for us
34
    return 1;
35
  }
36

    
37
  args = pkt.data;
38
  
39
  /* Hack - could be done more 1337ly with casting, but this way we don't have
40
   * to worry about little/big endian stuff */
41
  int_args[0] = two_bytes_to_int(args[0], args[1]);
42
  int_args[1] = two_bytes_to_int(args[2], args[3]);
43
  int_args[2] = two_bytes_to_int(args[4], args[5]);
44

    
45
  if(pkt.msg_type == COLONET_REQUEST){
46
    switch(pkt.msg_code){
47
      //Sharp
48
    case READ_DISTANCE:
49
      break;
50
    case LINEARIZE_DISTANCE:
51
      break;
52
    case LOG_DISTANCE:
53
      break;
54

    
55
      //Serial
56
    case SERIAL_GETCHAR:
57
      break;
58
    case SERIAL_GETCHAR_NB:
59
      break;
60
    case SERIAL1_GETCHAR:
61
      break;
62
    case SERIAL1_GETCHAR_NB:
63
      break;
64

    
65
      //Analog
66
    case ANALOG8:
67
      break;
68
    case ANALOG10:
69
      break;
70
    case WHEEL:
71
      break;
72
    case BATTERY:
73
      break;
74

    
75
      //BOM
76
    case GETMAXBOM:
77
      break;
78

    
79
      //Dio
80
    case DIGITAL_INPUT:
81
      break;
82
    case BUTTON1_READ:
83
      break;
84
    case BUTTON2_READ:
85
      break;
86

    
87
      //Bumper
88
    case DETECT_BUMP:
89
      break;
90
    }
91

    
92
    /* TODO - send back data! */
93

    
94
  }else if(pkt.msg_type == COLONET_COMMAND){
95
    if(pkt.msg_code >= USER_DEFINED_MSG_ID_START && 
96
       pkt.msg_code <= USER_DEFINED_MSG_ID_END){
97
      user_handlers[pkt.msg_code - USER_DEFINED_MSG_ID_START].handler();
98
      return 0;
99
    }
100

    
101
    switch(pkt.msg_code){
102
    default:
103
      printf("%s: Error - message code %d not implemented\n", __FUNCTION__,
104
             pkt.msg_code);
105
      return -1;
106
      break;
107

    
108
      //Buzzer
109
    case BUZZER_INIT:
110
      buzzer_init();
111
      break;
112
    case BUZZER_SET_VAL:
113
      buzzer_set_val(args[0]);
114
      break;
115
    case BUZZER_SET_FREQ:
116
      buzzer_set_freq(args[0]);
117
      break;
118
    case BUZZER_CHIRP:
119
      buzzer_chirp(int_args[0], int_args[1]);
120
      break;
121
    case BUZZER_OFF:
122
      buzzer_off();
123
      break;
124
      
125
      //LCD
126
    case LCD_INIT:
127
      lcd_init();
128
      break;
129
    case LCD_CLEAR_SCREEN:
130
      lcd_clear_screen();
131
      break;
132
    case LCD_PUTBYTE:
133
      lcd_putbyte(args[0]);
134
      break;
135
    case LCD_PUTCHAR:
136
      lcd_putchar((char)args[0]);
137
      break;
138
    case LCD_PUTSTR:
139
      lcd_putstr((char*)args);
140
      break;
141
    case LCD_GOTOXY: 
142
      lcd_gotoxy(int_args[0], int_args[1]);
143
      break;
144
    case LCD_PUTINT: 
145
      lcd_putint(int_args[0]);
146
      break;
147
    case ORB_INIT:
148
      orb_init();
149
      break;
150
      //Orb
151
    case ORB_SET:
152
      orb_set(args[0], args[1], args[2]);
153
      break;
154
    case ORB_SET_COLOR:
155
      orb_set_color(int_args[0]);
156
      break;
157
    case ORB_DISABLE:
158
      orb_disable();
159
      break;
160
    case ORB_ENABLE:
161
      orb_enable();
162
      break;
163
    case ORB_SET_DIO:
164
      orb_set_dio(int_args[0], int_args[1], int_args[2]);
165
      break;
166
    case LED_INIT:
167
      led_init();
168
      break;
169
    case LED_USER:
170
      led_user(int_args[0]);
171
      break;
172
    case ORB_SET_NUM_NS:
173
      //orb_set_num_ns(args[0], two_bytes_to_int(args[1],args[2]),
174
      //               two_bytes_to_int(args[3],args[4]), 
175
      //               two_bytes_to_int(args[5],args[6]));
176
      break;
177
    case ORB_SET_NUM:
178
      //orb_set_num_ns(args[0], two_bytes_to_int(args[1],args[2]),
179
      //               two_bytes_to_int(args[3],args[4]), 
180
      //               two_bytes_to_int(args[5],args[6]));
181
      break;
182
    case ORB_SEND:
183
      //orb_send();
184
      break;
185
      //Motors
186
    case MOTORS_INIT:
187
      motors_init();
188
      break;
189
    case MOTOR1_SET:
190
      printf("motor1_set %d %d\n", int_args[0], int_args[1]);
191
      motor1_set(int_args[0], int_args[1]);
192
      break;
193
    case MOTOR2_SET:
194
      motor2_set(int_args[0], int_args[1]);
195
      break;
196
    case MOTORS_OFF:
197
      motors_off();
198
      break;
199

    
200
      /*
201
    case MOVE:
202
      
203
      break;
204
      */
205

    
206
      //OLED
207
    case DRAWCIRCLE:
208
      //drawcircle((char)args[0], (char)args[1], (char)args[2], 
209
      //           (int)two_bytes_to_int(args[3], args[4]),
210
      //           (int)two_bytes_to_int(args[5], args[6]));
211
      break;
212
      /*
213
      //Packet isn't large enough for args of this function
214
    case DRAWRECT:
215
      break;
216
      */
217
    case DRAWLINE:
218
      //drawline((char)args[0], (char)args[1], (char)args[2], (char)args[3], 
219
      //         (int)int_args[2]);
220
      break;
221
    case DRAWCOPY:
222
      //drawcopy((char)args[0], (char)args[1], (char)args[2], (char)args[3], 
223
      //         (char)args[4], (char)args[5]);
224
      break;
225
    case DRAWFILL:
226
      //drawfill((char)args[0]);
227
      break;
228
    case DRAWCLEAR:
229
      //drawclear();
230
      break;
231
    case DRAWSCROLL:
232
      //drawscroll((char)args[0], (char)args[1], (char)args[2], (char)args[3]);
233
      break;
234
    case OLED_INIT:
235
      //OLED_init();
236
      break;
237

    
238
      //SHARP
239
    case ENABLE_IR:
240
      //enable_IR();
241
      break;
242
    case DISABLE_IR:
243
      //disable_IR();
244
      break;
245

    
246
      //SERIAL
247
    case SERIAL_INIT:
248
      serial_init(int_args[0]);
249
      break;
250
    case SERIAL_PUTCHAR:
251
      serial_putchar((char)args[0]);
252
      break;
253
    case SERIAL1_INIT:
254
      //serial1_init();
255
      break;
256
    case SERIAL1_PUTCHAR:
257
      serial1_putchar((char)args[0]);
258
      break;
259
    case PRINTF:
260
      printf("%s", pkt.data);
261
      break;
262

    
263
      //Time
264
    case DELAY_MS:
265
      delay_ms(int_args[0]);
266
      break;
267

    
268
      //Analog
269
    case ANALOG_INIT:
270
      analog_init();
271
      break;
272
    case SET_ADC_MUX:
273
      //set_adc_mux(int_args[0]);
274
      break;
275
    case ENABLE_ANALOG:
276
      //enable_analog(int_args[0]);
277
      break;
278

    
279
      //BOM
280
    case BOM_ON:
281
      bom_on();
282
      break;
283
    case BOM_OFF:
284
      bom_off();
285
      break;
286
    case OUTPUT_HIGH:
287
      output_high(int_args[0]);
288
      break;
289
    case OUTPUT_LOW:
290
      output_low(int_args[0]);
291
      break;
292

    
293
      //Dio
294
    case DIGITAL_OUTPUT:
295
      digital_output(int_args[0], int_args[1]);
296
      break;
297
    case BUTTON1_WAIT:
298
      button1_wait();
299
      break;
300
    case BUTTON1_WAIT_LED:
301
      button1_wait_led();
302
      break;
303
    case BUTTON2_WAIT:
304
      button2_wait();
305
      break;
306
    case BUTTON2_WAIT_LED:
307
      button2_wait_led();
308
      break;
309

    
310
      //WL
311
    case WL_INIT:
312
      wl_init();
313
      break;
314
    case PARSE_BUFFER:
315
      parse_buffer();
316
      break;
317
    case WL_SEND:
318
      wl_send();
319
      break;
320
    case WL_CREATE_PACKET:
321
      wl_create_packet();
322
      break;
323
    case WL_DEATH_HANDLER:
324
      wl_death_handler();
325
      break;
326
    case WL_ERROR_HANDLER:
327
      //wl_error_handler();
328
      break;
329
    case WL_TIMEOUT_HANDLER:
330
      wl_timeout_handler();
331
      break;
332
    case DISPLAY_DEBUG:
333
      display_debug();
334
      break;
335
    case BOM_TEST:
336
      bom_test();
337
      break;
338
    }
339
  }else{
340
    printf("%s: Error: Invalid colonet message type", __FUNCTION__);
341
    return -1;
342
  }
343

    
344
  return 0;
345
}
346

    
347
/* colonet_add_message
348
 * Adds a user-defined message
349
 */
350
int colonet_add_message(unsigned char msgId, void (*handler)(void))
351
{
352
  if(msgId < USER_DEFINED_MSG_ID_START || msgId > USER_DEFINED_MSG_ID_END){
353
    return -1;
354
  }
355

    
356
  user_handlers[msgId-USER_DEFINED_MSG_ID_START].msgId = msgId;
357
  user_handlers[msgId-USER_DEFINED_MSG_ID_START].handler = handler;
358

    
359
  return 0;
360
}
361

    
362
/* Private functions */
363
void packet_string_to_struct(ColonetPacket* dest_pkt, char* pkt_buf)
364
{
365
  int i;
366
  
367
  printf("\npacket:");
368
  for(i = 0; i < 16; i++){
369
    printf("%d ", pkt_buf[i]);
370
  }
371

    
372
  printf("\n");
373

    
374
  dest_pkt->prefix[0] = pkt_buf[0];
375
  dest_pkt->prefix[1] = pkt_buf[1];
376
  dest_pkt->token_src = pkt_buf[2];
377
  dest_pkt->token_dest = pkt_buf[3];
378
  dest_pkt->msg_dest = pkt_buf[4];
379
  dest_pkt->msg_type = pkt_buf[5];
380
  dest_pkt->msg_code = pkt_buf[6];
381
  
382
  for(i = 0; i < PACKET_DATA_LEN; i++){
383
    dest_pkt->data[i] = pkt_buf[7+i];
384
  }
385

    
386
  dest_pkt->num_robots = pkt_buf[PACKET_SIZE-2];
387
  dest_pkt->checksum = pkt_buf[PACKET_SIZE-1];
388
}
389

    
390
/* two_bytes_to_int(char a, char b)
391
 * Returns int of form [high][low]
392
 */
393
unsigned int two_bytes_to_int(char high, char low)
394
{
395
  return (((unsigned int)high)<<8) + (unsigned int)low;
396
}