Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / diagnostic_station / robot / main.c @ 1313

History | View | Annotate | Download (5.47 KB)

1 1159 deffi
#include <dragonfly_lib.h>
2
#include <wireless.h>
3
#include <xbee.h>
4
5
#include "../common/comm_station_robot.h"
6 1193 emullini
#include "../../../lib/include/libdragonfly/encoders.h"
7 1159 deffi
8 1218 deffi
9
// **********************
10
// ** Command handlers **
11
// **********************
12
13 1159 deffi
static void message_set_orbs (int length, uint8_t *data)
14
{
15
        if (length>=6)
16
        {
17
                orbs_set (data[0], data[1], data[2], data[3], data[4], data[5]);
18
        }
19
}
20
21
static void message_set_motors (int length, uint8_t *data)
22
{
23
        if (length>=4)
24
        {
25
                motor1_set (data[0], data[1]);
26
                motor2_set (data[2], data[3]);
27
        }
28
}
29
30 1164 deffi
static void message_set_motors_time (int length, uint8_t *data)
31
{
32
        if (length>=6)
33
        {
34
                motor1_set (data[0], data[1]);
35
                motor2_set (data[2], data[3]);
36
                delay_ms (WORD(data[4], data[5]));
37
                motors_off ();
38
        }
39
}
40
41
static void message_set_motors_off (int length, uint8_t *data)
42
{
43
        motors_off ();
44
}
45
46 1159 deffi
static void message_set_bom (int length, uint8_t *data)
47
{
48
        if (length>=2)
49
        {
50
                uint16_t bitmask=WORD(data[0], data[1]);
51
52
                bom_set_leds (bitmask);
53
54
                if (bitmask==0)
55
                        bom_off ();
56
                else
57
                        bom_on ();
58
        }
59
}
60
61 1219 deffi
static void message_reset_encoders (int length, uint8_t *data)
62
{
63
        SYNC
64
        {
65
                encoder_rst_dx (LEFT);
66
                encoder_rst_dx (RIGHT);
67
        }
68
}
69 1218 deffi
70
// **********************
71
// ** Request handlers **
72
// **********************
73
74 1226 deffi
static void message_read_encoders (int length, uint8_t *data)
75 1218 deffi
{
76
        int16_t left, right;
77
78
        SYNC
79
        {
80 1219 deffi
                left = encoder_get_dx (LEFT);
81
                right = encoder_get_dx (RIGHT);
82 1218 deffi
        }
83
84
        char senddata[4];
85
        senddata[0]=WORD_BYTE_0 (left);
86
        senddata[1]=WORD_BYTE_1 (left);
87
        senddata[2]=WORD_BYTE_0 (right);
88
        senddata[3]=WORD_BYTE_1 (right);
89
90
        wl_send_global_packet (robot_station_group, robot_station_data_encoders, senddata, 4, 0);
91 1193 emullini
}
92
93 1263 deffi
static void message_read_rangefinder (int length, uint8_t *data)
94 1248 emullini
{
95
        int16_t value;
96
        int rangefinder_id = 0;
97
98
        switch(*data)
99
        {
100
                case 0: rangefinder_id = IR1; break;
101
                case 1: rangefinder_id = IR2; break;
102
                case 2: rangefinder_id = IR3; break;
103
                case 3: rangefinder_id = IR4; break;
104
                case 4: rangefinder_id = IR5; break;
105
        }
106
107
        value = range_read_distance(rangefinder_id);
108
109
        char senddata[2];
110
        senddata[0] = WORD_BYTE_0 (value);
111
        senddata[1] = WORD_BYTE_1 (value);
112
113 1263 deffi
        wl_send_global_packet (robot_station_group, robot_station_data_rangefinder, senddata, 2, 0);
114 1248 emullini
115
}
116
117 1258 emullini
static void message_read_bom (int length, uint8_t *data){
118 1264 emullini
        int16_t value;
119
        bom_refresh(BOM_ALL);
120 1270 emullini
        value = bom_get((*data));
121 1264 emullini
        char senddata[2];
122
        senddata[0] = WORD_BYTE_0 (value);
123
        senddata[1] = WORD_BYTE_1 (value);
124 1258 emullini
125 1264 emullini
        wl_send_global_packet (robot_station_group, robot_station_data_bom, senddata, 2, 0);
126 1258 emullini
}
127
128 1276 emullini
static void message_read_bom_all(int length, uint8_t *data){
129 1282 deffi
        int16_t value;
130 1276 emullini
        char senddata[32];
131 1282 deffi
132 1276 emullini
        bom_refresh(BOM_ALL);
133 1282 deffi
134
        for(uint8_t i=0; i<16; ++i){
135
                value=bom_get(i);
136
                senddata[2*i  ] = WORD_BYTE_0 (value);
137
                senddata[2*i+1] = WORD_BYTE_1 (value);
138 1276 emullini
        }
139
140
        wl_send_global_packet(robot_station_group, robot_station_data_bom_all, senddata, 32, 0);
141
}
142
143 1303 abuchan
static void message_read_eeprom(int length, uint8_t *data)
144
{
145
  char senddata[2];
146
  senddata[0] = get_robotid();
147
  senddata[1] = get_bom_type();
148
149
  wl_send_global_packet (robot_station_group, robot_station_data_eeprom, senddata, 2, 0);
150
}
151
152 1226 deffi
// ***************************
153
// ** Message acknowledging **
154
// ***************************
155 1218 deffi
156 1244 deffi
static void send_done (void)
157 1226 deffi
{
158
        wl_send_global_packet (robot_station_group, robot_station_done, NULL, 0, 0);
159
}
160
161 1218 deffi
// ***********************
162
// ** Receive callbacks **
163
// ***********************
164
165
static void station_robot_receive (char type, int source, unsigned char* packet, int length)
166 1159 deffi
{
167 1218 deffi
        orb_set (0, 0, 255);
168
169
        usb_puti (type);
170 1220 deffi
        usb_puts (" [");
171
        for (uint8_t i=0; i<length; ++i)
172
        {
173
                if (i!=0) usb_putc (' ');
174
                usb_puti (packet[i]);
175
        }
176
        usb_puts ("]\r\n");
177 1218 deffi
178 1159 deffi
        switch (type)
179
        {
180 1218 deffi
                // Command messages
181 1226 deffi
                case station_robot_set_orbs:        message_set_orbs        (length, packet); send_done (); break;
182
                case station_robot_set_motors:      message_set_motors      (length, packet); send_done (); break;
183
                case station_robot_set_bom:         message_set_bom         (length, packet); send_done (); break;
184
                case station_robot_set_motors_off:  message_set_motors_off  (length, packet); send_done (); break;
185
                case station_robot_set_motors_time: message_set_motors_time (length, packet); send_done (); break;
186
                case station_robot_reset_encoders:  message_reset_encoders  (length, packet); send_done (); break;
187 1218 deffi
188
                // Request messages
189 1263 deffi
                case station_robot_read_encoders:         message_read_encoders           (length, packet); break;
190
                case station_robot_read_rangefinder: message_read_rangefinder  (length, packet); break;
191
                case station_robot_read_bom:         message_read_bom                   (length, packet); break;
192 1276 emullini
                case station_robot_read_bom_all:         message_read_bom_all           (length, packet); break;
193 1303 abuchan
    case station_robot_read_eeprom:     message_read_eeprom(length, packet); break;
194 1159 deffi
        }
195 1218 deffi
196
        orb_set (255, 127, 0);
197 1159 deffi
}
198
199 1218 deffi
// **********
200
// ** Main **
201
// **********
202 1159 deffi
203
int main(void) {
204 1220 deffi
    dragonfly_init(ALL_ON);
205 1226 deffi
        encoders_init ();
206 1159 deffi
207 1267 deffi
        analog_init (ADC_START);
208 1271 deffi
        //bom_init ();
209 1267 deffi
210 1159 deffi
    usb_init ();
211
    usb_puts ("Diagnostic station robot starting up\r\n");
212
213 1220 deffi
        orb1_set (255, 127, 0);
214 1159 deffi
        xbee_init ();
215
        wl_init();
216 1313 deffi
//        xbee_set_channel(15);
217 1159 deffi
        orb2_set (255, 127, 0);
218
219 1218 deffi
        usb_puts ("PAN ID: ");  usb_puti (xbee_get_pan_id ());  usb_puts ("\r\n");        // -1
220
        usb_puts ("Channel: "); usb_puti (xbee_get_channel ()); usb_puts ("\r\n");        // 0
221
        usb_puts ("Address: "); usb_puti (xbee_get_address ()); usb_puts ("\r\n");        // 4/8
222 1159 deffi
223
        PacketGroupHandler receive_handler = {station_robot_group, NULL, NULL, &station_robot_receive, NULL};
224
        wl_register_packet_group(&receive_handler);
225
226
        while (1)
227
        {
228
                wl_do();
229
        }
230
}