root / trunk / code / projects / mapping / robot / robot_main.c @ 917
History | View | Annotate | Download (4.69 KB)
1 | 898 | alevkoy | #include <dragonfly_lib.h> |
---|---|---|---|
2 | #include <wireless.h> |
||
3 | 912 | alevkoy | #include <encoders.h> |
4 | 915 | cmar | #include "odometry.h" |
5 | 722 | justin | |
6 | 917 | cmar | #define POLLING_INTERVAL 50 //interval in ms to get sensor data |
7 | 898 | alevkoy | #define MAP 1 // packet group for sending data points |
8 | #define POINT_RAW 1 // packet type for map data points w/ raw encoder data |
||
9 | #define POINT_ODO 2 // packet type for map data points w/ odometry data |
||
10 | |||
11 | 900 | cmar | #define WL_CNTL_GROUP 4 |
12 | |||
13 | 912 | alevkoy | #define CNTL_FORWARD 0 |
14 | #define CNTL_BACK 1 |
||
15 | #define CNTL_LEFT 2 |
||
16 | #define CNTL_RIGHT 3 |
||
17 | #define CNTL_LEFT_CURVE 4 |
||
18 | #define CNTL_RIGHT_CURVE 5 |
||
19 | #define CNTL_STOP 6 |
||
20 | 915 | cmar | #define CNTL_VEL_UP 7 |
21 | #define CNTL_VEL_DOWN 8 |
||
22 | 900 | cmar | |
23 | int state;
|
||
24 | int velocity;
|
||
25 | char buf[100]; |
||
26 | |||
27 | void packet_receive (char type, int source, unsigned char* packet, int length); |
||
28 | void set_motion (void); |
||
29 | |||
30 | PacketGroupHandler packetHandler = {WL_CNTL_GROUP, NULL, NULL, &packet_receive, NULL}; |
||
31 | 899 | alevkoy | PacketGroupHandler love_handle = {MAP, NULL, NULL, NULL, NULL}; |
32 | |||
33 | 898 | alevkoy | int main(void) |
34 | { |
||
35 | /* initialize components and join the token ring */
|
||
36 | 899 | alevkoy | dragonfly_init(ALL_ON); |
37 | 915 | cmar | //range_init();
|
38 | //encoders_init();
|
||
39 | odometry_init(); |
||
40 | 899 | alevkoy | wl_init(); |
41 | wl_set_channel(0xF);
|
||
42 | wl_register_packet_group(&love_handle); |
||
43 | 900 | cmar | wl_register_packet_group(&packetHandler); |
44 | orb_enable(); |
||
45 | 898 | alevkoy | //data_response_init();
|
46 | //wl_token_ring_register();
|
||
47 | //wl_token_ring_join();
|
||
48 | 900 | cmar | //run_around_init();
|
49 | 898 | alevkoy | |
50 | 917 | cmar | //usb_puti(xbee_get_address());
|
51 | //return 0;
|
||
52 | |||
53 | 900 | cmar | velocity = 160;
|
54 | 912 | alevkoy | state = CNTL_STOP; |
55 | 900 | cmar | |
56 | 915 | cmar | int x, y; // use when sending odometry data |
57 | double theta;
|
||
58 | 898 | alevkoy | |
59 | 915 | cmar | int store[9]; |
60 | 899 | alevkoy | char *send; // for transmission |
61 | 898 | alevkoy | |
62 | while(1) |
||
63 | { |
||
64 | 900 | cmar | wl_do(); |
65 | //run_around_FSM(); /* traverse the environment and avoid obstacles ... */
|
||
66 | 898 | alevkoy | delay_ms(POLLING_INTERVAL); /* until it's time to grab map data */
|
67 | 915 | cmar | x = odometry_dx(); // use when sending odometry data
|
68 | y = odometry_dy(); |
||
69 | theta = odometry_angle(); |
||
70 | //store[0] = encoder_get_dx(LEFT); // left encoder distance
|
||
71 | //store[1] = encoder_get_dx(RIGHT); // right encoder distance
|
||
72 | store[0] = x;
|
||
73 | store[1] = y;
|
||
74 | 917 | cmar | *((double*)(store + 2)) = theta; |
75 | 915 | cmar | store[4] = range_read_distance(IR1); // IR1 range |
76 | store[5] = range_read_distance(IR2); // IR2 range |
||
77 | store[6] = range_read_distance(IR3); // IR3 range |
||
78 | store[7] = range_read_distance(IR4); // IR4 range |
||
79 | store[8] = range_read_distance(IR5); // IR5 range |
||
80 | sprintf( buf, "%d %d %f %d %d %d %d %d\n", store[0], store[1], |
||
81 | 917 | cmar | *((double *)(store+2)), store[4], store[5], store[6], |
82 | 915 | cmar | store[7], store[8] ); |
83 | usb_puts(buf); |
||
84 | 898 | alevkoy | |
85 | 899 | alevkoy | send = (char*) store;
|
86 | 898 | alevkoy | |
87 | // send point w/ raw encoder data
|
||
88 | 915 | cmar | // wl_send_global_packet(MAP, POINT_RAW, send, 14, 0);
|
89 | 898 | alevkoy | |
90 | // send point w/ odometry data
|
||
91 | 915 | cmar | wl_send_global_packet(MAP, POINT_ODO, send, 18, 0); |
92 | 898 | alevkoy | |
93 | } |
||
94 | |||
95 | 899 | alevkoy | wl_terminate(); |
96 | 898 | alevkoy | return 0; |
97 | 722 | justin | } |
98 | 898 | alevkoy | |
99 | 900 | cmar | void packet_receive (char type, int source, unsigned char* packet, int length) { |
100 | sprintf(buf, "received packet: %d\n", type);
|
||
101 | usb_puts(buf); |
||
102 | switch (type) {
|
||
103 | 912 | alevkoy | case CNTL_FORWARD:
|
104 | state = CNTL_FORWARD; |
||
105 | 900 | cmar | break;
|
106 | 912 | alevkoy | case CNTL_BACK:
|
107 | state = CNTL_BACK; |
||
108 | 900 | cmar | break;
|
109 | 912 | alevkoy | case CNTL_LEFT:
|
110 | state = CNTL_LEFT; |
||
111 | 900 | cmar | break;
|
112 | 912 | alevkoy | case CNTL_RIGHT:
|
113 | state = CNTL_RIGHT; |
||
114 | 900 | cmar | break;
|
115 | 912 | alevkoy | case CNTL_LEFT_CURVE:
|
116 | state = CNTL_LEFT_CURVE; |
||
117 | 900 | cmar | break;
|
118 | 912 | alevkoy | case CNTL_RIGHT_CURVE:
|
119 | state = CNTL_RIGHT_CURVE; |
||
120 | 900 | cmar | break;
|
121 | 912 | alevkoy | case CNTL_STOP:
|
122 | state = CNTL_STOP; |
||
123 | 900 | cmar | break;
|
124 | 915 | cmar | case CNTL_VEL_UP:
|
125 | 900 | cmar | if (velocity > 250) |
126 | velocity = 250;
|
||
127 | else
|
||
128 | velocity += 5;
|
||
129 | break;
|
||
130 | 915 | cmar | case CNTL_VEL_DOWN:
|
131 | 900 | cmar | velocity -= 5;
|
132 | if (velocity < 150) |
||
133 | velocity = 150;
|
||
134 | break;
|
||
135 | default:
|
||
136 | 912 | alevkoy | state = CNTL_STOP; |
137 | 900 | cmar | break;
|
138 | } |
||
139 | set_motion(); |
||
140 | } |
||
141 | |||
142 | void set_motion (void) { |
||
143 | switch (state) {
|
||
144 | 912 | alevkoy | case CNTL_FORWARD:
|
145 | 900 | cmar | orb_set_color(GREEN); |
146 | move(velocity, 0);
|
||
147 | break;
|
||
148 | 912 | alevkoy | case CNTL_BACK:
|
149 | 900 | cmar | orb_set_color(BLUE); |
150 | move(-velocity, 0);
|
||
151 | break;
|
||
152 | 912 | alevkoy | case CNTL_LEFT:
|
153 | 900 | cmar | orb_set_color(ORANGE); |
154 | motor1_set(0, velocity);
|
||
155 | motor2_set(1, velocity);
|
||
156 | break;
|
||
157 | 912 | alevkoy | case CNTL_RIGHT:
|
158 | 900 | cmar | orb_set_color(YELLOW); |
159 | motor1_set(1, velocity);
|
||
160 | motor2_set(0, velocity);
|
||
161 | break;
|
||
162 | 912 | alevkoy | case CNTL_LEFT_CURVE:
|
163 | 900 | cmar | orb_set_color(MAGENTA); |
164 | motor1_set(1, 150); |
||
165 | motor2_set(1, velocity);
|
||
166 | break;
|
||
167 | 912 | alevkoy | case CNTL_RIGHT_CURVE:
|
168 | 900 | cmar | orb_set_color(CYAN); |
169 | motor1_set(1, velocity);
|
||
170 | motor2_set(1, 150); |
||
171 | break;
|
||
172 | 912 | alevkoy | case CNTL_STOP:
|
173 | 900 | cmar | orb_set_color(RED); |
174 | move(0, 0); |
||
175 | break;
|
||
176 | } |
||
177 | } |