Project

General

Profile

Statistics
| Revision:

root / branches / slam / code / projects / colonet / DataRequests / robot / data_response.c @ 393

History | View | Annotate | Download (3.29 KB)

1
#include "dragonfly_lib.h"
2
#include "data_response.h"
3
#include "wl_token_ring.h"
4
#include "wireless.h"
5
#include "serial.h"
6

    
7
PacketGroupHandler pgh;
8

    
9
void handle_receive(char type, int source, unsigned char* packet, int length);
10
int generate_bom_packet(char** buf);
11
int generate_IR_packet(char** buf);
12

    
13

    
14
/** 
15
* @brief The only function that should be called by user code.
16
  Prepares the robot to receive and respond to data requests.
17
*/
18
void data_response_init(void){
19
  usb_init();
20
  usb_puts("USB initialized!\n\r");
21
  range_init();
22
  pgh.groupCode=DATA_REQUEST_GROUP; 
23
  pgh.timeout_handler = NULL;
24
  pgh.handle_response = NULL;
25
  pgh.handle_receive = handle_receive;
26
  pgh.unregister = NULL;
27
  wl_register_packet_group(&pgh);
28
  usb_puts("Packet Group Registered!\n\r");
29
}
30

    
31

    
32
/**
33
* Sorry for the lack of modularity, I didn't want to deal with memory issues for too long, plus it'll be faster!
34
*/
35
void handle_receive(char type, int source, unsigned char* packet, int length){
36
  
37
  char buf[MAX_PACKET_LENGTH]; 
38
  int size, i;
39
  usb_puts("Got a packet!\n\r");
40
  switch(type){
41
  case BOM_TYPE:
42
    
43
    short int i=0, robot_id; 
44
    wl_token_iterator_begin();
45
    while(wl_token_iterator_has_next() && i<=96){
46
      robot_id = wl_token_iterator_next();
47
      (*buf)[i++] = (char)((robot_id>>8) & 255);
48
      (*buf)[i++] = (char)(robot_id & 255);
49
      //TODO Ensure that wl_token_get.... returns the expected char. 
50
      (*buf)[i++] = (char)(wl_token_get_my_sensor_reading(robot_id));
51
    }
52
    
53
    //i is one greater than the index of the last byte... the size.
54
    wl_send_robot_to_robot_global_packet(DATA_REQUEST_GROUP,BOM_TYPE,buf,i,source,0);
55
  
56
  case IR_TYPE:
57

    
58
    usb_puts("Generating an IR packet.\n");
59
    char ranges[] = {IR1,IR2,IR3,IR4,IR5}; 
60
    int i;
61
    short ir_value; 
62
    for(i=0;i<5;i++){
63
      ir_value = (short)range_read_distance(ranges[i]);
64
      buf[2*i] = (char)((ir_value>>8)&255);   
65
      buf[2*i+1] = (ir_value&255);   
66
      usb_puts("Distance :\t");
67
      usb_puti(ir_value);
68
      usb_puts("\n");
69
    }
70
    size = 10;
71

    
72
    usb_puts("Packet Contents: ");
73
    for(i = 0; i<size;i++){
74
        usb_puti(buf[i]);
75
        usb_putc(' ');
76
    }
77
    wl_send_robot_to_robot_global_packet(DATA_REQUEST_GROUP,IR_TYPE,buf,size,source,0);
78
  
79
  
80
  
81
  case ENCODER_TYPE:
82
    break; 
83
    //Not yet supported.
84
  }
85
}
86

    
87
/** 
88
* @brief  Generates a BOM Data packet. **NO LONGER USED** Delete once this code is used often.
89
*/
90
int generate_bom_packet(char** buf){
91
  short int i=0, robot_id; 
92
  wl_token_iterator_begin();
93
  while(wl_token_iterator_has_next() && i<=96){
94
    robot_id = wl_token_iterator_next();
95
    (*buf)[i++] = (char)((robot_id>>8) & 0xFF);
96
    (*buf)[i++] = (char)(robot_id & 0xFF);
97
    (*buf)[i++] = (char)(wl_token_get_my_sensor_reading(robot_id));
98
  }
99
  //i is one greater than the index of the last byte... the size.
100
  return i;
101
}
102

    
103
/** 
104
* @brief Generates an IR Packet **NO LONGER USED** Delete once this code is used often.
105
* 
106
*/
107
int generate_IR_packet(char** buf){
108
  usb_puts("Generating an IR packet.\n");
109
  char ranges[] = {IR1,IR2,IR3,IR4,IR5}; 
110
  int i;
111
  short ir_value; 
112
  for(i=0;i<5;i++){
113
    ir_value = (short)range_read_distance(ranges[i]);
114
    (*buf)[2*i] = (char)((ir_value>>8)&255);   
115
    (*buf)[2*i+1] = (ir_value&255);   
116
    usb_puts("Distance :\t");
117
    usb_puti(ir_value);
118
    usb_puts("\n");
119
  }
120
  return 10;
121
}