Project

General

Profile

Statistics
| Revision:

root / branches / rbom / code / projects / slam / robot_main.c @ 1390

History | View | Annotate | Download (2.89 KB)

1
#include "dragonfly_lib.h"
2
#include "wireless.h"
3
#include "wl_token_ring.h"
4
#include "smart_run_around_fsm.h"
5
#include "slam_defs.h"
6

    
7
#define BOM_POST_DELAY 50
8
#define PACKET_BUFFER_SIZE 101 
9

    
10
void bom_pre(void);
11
void bom_post(void);
12

    
13
//Packet Handler Functions
14
void timeout_handle(void);
15
void response_handle(int frame, int received);
16
void receive_handle(char type, int source, unsigned char* packet, int length);
17
void unregister(void);
18

    
19
int make_request_packet(char** packet);
20

    
21
int IR[5];
22

    
23
int main(void)
24
{
25

    
26
  dragonfly_init(ALL_ON);
27
  
28
  wl_init();
29
 
30
  wl_token_ring_register();
31
  wl_token_ring_join();
32
  wl_token_ring_set_bom_functions(bom_pre, bom_post, get_max_bom);
33

    
34
  PacketGroupHandler packet_group_handler;
35
  packet_group_handler.groupCode=SLAM_PACKET_GROUP;
36
  packet_group_handler.timeout_handler=timeout_handle;
37
  packet_group_handler.handle_response=response_handle;
38
  packet_group_handler.handle_receive=receive_handle;
39
  packet_group_handler.unregister=unregister;
40

    
41
  wl_register_packet_group(&packet_group_handler);
42
  
43
  int i;
44
  while(1){
45
    wl_do();
46
    run_around_FSM(); 
47
    for(i=0;i<5;i++){
48
      IR[i]=range_read_distance(i);
49
    }
50
  }
51

    
52
  wl_unregister_packet_group(&packet_group_handler); 
53
}
54

    
55
void bom_pre(void){
56
    bom_on();
57
}
58

    
59
void bom_post(void){
60
    delay_ms(BOM_POST_DELAY);
61
    bom_off();
62
}
63

    
64
//These can probably be NULL..
65

    
66
void timeout_handle(void){
67

    
68
}
69

    
70
void response_handle(int frame, int received){
71
  
72
}
73

    
74
void receive_handle(char type, int source, unsigned char* packet, int length){
75
  int i; 
76
  if(type==REQUEST_PACKET_TYPE){
77
    
78
    /*Send a message back to our computer overlord.*/
79
    char buf[PACKET_BUFFER_SIZE]; 
80
    int len = make_request_packet(&buf);
81
    char packet[len];
82
    for(i=0; i< len ; i++){
83
      packet[i]=buf[i];
84
    } 
85
    
86
    wl_send_robot_to_robot_packet(SLAM_PACKET_GROUP, ROBOT_RESPONSE, packet, len, source , 0);
87
  }
88
  else if(type == CONTROL_PACKET_TYPE){
89
    for(i=0;i<length;i++){
90
      
91
    }
92
  }
93
}
94

    
95

    
96
/**
97

98
Packets are structured {IR1, IR2, IR3, IR4, IR5,
99
BomID1, ... , BomValue1, BomID2, ... , BomValue2, etc.} 
100
Total size is 5 + 3*numRobots. So Xbee should support
101
up to 31 robots before we need to restructure the 
102
communication between the computer and the robot.
103

104
*/
105
int make_request_packet(char** packet){
106
  int i,j;
107
  for(i=0;i<5;i++){
108
      (*packet)[i] = IR[i];
109
  } 
110
  i=5; 
111
  wl_token_iterator_begin();
112
  int id = wl_get_xbee_id();  
113
  
114
  while(wl_token_iterator_has_next()){
115
    int robot_in_view = wl_token_iterator_next(); 
116
    
117
    //Robot int's are two bytes. 
118
    (*packet)[i] = robot_in_view; 
119
    i+=2;
120
    
121
    int bom_number = wl_token_get_sensor_reading(id,robot_in_view);
122
    //Bom reading of 255 denotes an unseen node. 
123
    if(bom_number<0) bom_number = 255; 
124
    bom_number %= 256;
125
    char bom_value = (char) bom_number;
126
    (*packet)[i] = bom_value;
127
    i++;
128
  }
129
  //Size is one bom byte towards every robot, and 5 IR bytes. 
130
  return wl_token_get_num_robots()+5;
131
}
132