root / trunk / code / projects / hunter_prey / testbench / main.c @ 1439
History | View | Annotate | Download (4.65 KB)
1 | 1434 | alevkoy | /* testbench for Lab 2 first checkpoint
|
---|---|---|---|
2 | * determine whether robot under test complies with communication standard
|
||
3 | * to be conducted using XBee USB dongle
|
||
4 | */
|
||
5 | 1433 | alevkoy | |
6 | 1434 | alevkoy | /* The tests shall be as follows
|
7 | 1438 | alevkoy | * 1. Receive a TAG, send an ACK
|
8 | 1434 | alevkoy | * - Robot passes if it sends a tag and changes to prey state
|
9 | 1438 | alevkoy | * 2. Send a TAG, receive an ACK
|
10 | 1434 | alevkoy | * - Pass if sends ACK, changes to wait state, then hunter state
|
11 | 1438 | alevkoy | * 3. Receive TAG, send slightly delayed (< 1s) ACK
|
12 | 1434 | alevkoy | * - Pass if sends one and only one TAG packet (and changes state appropriately)
|
13 | 1438 | alevkoy | * 4. Receive TAG, do not send ACK
|
14 | 1434 | alevkoy | * - Pass if sends one and only one TAG packet (and does not change state)
|
15 | 1438 | alevkoy | * 5. Receive TAG, send ACK to incorrect robot
|
16 | 1434 | alevkoy | * - Pass if goes to wait state, then back to hunter state
|
17 | 1438 | alevkoy | * 6. Simulate TAG from robot A to B, ACK from B to A
|
18 | 1434 | alevkoy | * - Pass if ignores TAG, goes to wait then hunter in response to ACK
|
19 | */
|
||
20 | |||
21 | 1433 | alevkoy | #include <stdlib.h> |
22 | #include <stdio.h> |
||
23 | 1438 | alevkoy | #include <time.h> |
24 | 1433 | alevkoy | #include <wl_basic.h> |
25 | 1438 | alevkoy | #include "../../libwireless/lib/wireless.h" |
26 | 1433 | alevkoy | #include "hunter_prey.h" |
27 | |||
28 | 1434 | alevkoy | #define CHANNEL 0xF // channel for wireless communication |
29 | #define TYPE 42 // packet type for wireless communication |
||
30 | 1438 | alevkoy | #define ROBOTID 255 // make up a robot id because the PC doesn't have one |
31 | 1434 | alevkoy | |
32 | 1438 | alevkoy | int main(int argc, char *argv[]) |
33 | 1433 | alevkoy | { |
34 | 1434 | alevkoy | char send_buffer[2]; // holds data to send |
35 | int data_length; // length of data received |
||
36 | unsigned char *packet_data; // data received |
||
37 | 1433 | alevkoy | |
38 | 1434 | alevkoy | // set up wireless
|
39 | wl_basic_init_default(); |
||
40 | wl_set_channel(CHANNEL); |
||
41 | 1438 | alevkoy | wl_set_com_port("/dev/ttyUSB0");
|
42 | 1434 | alevkoy | |
43 | printf("Testing communications\n\n");
|
||
44 | |||
45 | // Receive TAG, send ACK
|
||
46 | printf("Receive TAG, send ACK... ");
|
||
47 | // Wait until we receive a packet
|
||
48 | while (!(packet_data = wl_basic_do_default(&data_length)));
|
||
49 | |||
50 | if (data_length > 2) |
||
51 | printf("Excessive TAG packet length... ");
|
||
52 | |||
53 | if (data_length >= 2 && packet_data[0] == HUNTER_PREY_ACTION_TAG) |
||
54 | { |
||
55 | // send back an ACK
|
||
56 | 1438 | alevkoy | send_buffer[0] = HUNTER_PREY_ACTION_ACK;
|
57 | 1434 | alevkoy | send_buffer[1] = packet_data[1]; |
58 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
59 | |||
60 | 1438 | alevkoy | printf("PASSED\n");
|
61 | 1434 | alevkoy | } |
62 | else
|
||
63 | 1438 | alevkoy | printf("FAILED\n");
|
64 | |||
65 | // Send a TAG, receive an ACK
|
||
66 | printf("Send TAG, wait for ACK... ");
|
||
67 | |||
68 | send_buffer[0] = HUNTER_PREY_ACTION_TAG;
|
||
69 | send_buffer[1] = ROBOTID;
|
||
70 | // robot number stays the same
|
||
71 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
72 | |||
73 | // Wait for an ACK
|
||
74 | delay_ms(800); // wait for 800 ms before sending ACK |
||
75 | packet_data = wl_basic_do_default(&data_length); |
||
76 | |||
77 | // Check ACK for presence and correctness
|
||
78 | if (!packet_data || data_length < 2 || |
||
79 | packet_data[0] != HUNTER_PREY_ACTION_ACK ||
|
||
80 | packet_data[1] != ROBOTID)
|
||
81 | printf("FAILED\n");
|
||
82 | else
|
||
83 | printf("PASSED\n");
|
||
84 | |||
85 | // Receive a TAG, send a delayed ACK
|
||
86 | printf("Receive a TAG, send a delayed ACK... ");
|
||
87 | |||
88 | while (!(packet_data = wl_basic_do_default(&data_length)));
|
||
89 | |||
90 | if (data_length >= 2 && packet_data[0] == HUNTER_PREY_ACTION_TAG) |
||
91 | { |
||
92 | // wait before sending ACK back
|
||
93 | delay_ms(900);
|
||
94 | |||
95 | if (wl_basic_do_default(&data_length))
|
||
96 | printf("FAILED\n");
|
||
97 | else
|
||
98 | { |
||
99 | // send packet
|
||
100 | send_buffer[0] = HUNTER_PREY_ACTION_ACK;
|
||
101 | send_buffer[1] = packet_data[1]; |
||
102 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
103 | |||
104 | printf("PASSED\n");
|
||
105 | } |
||
106 | } |
||
107 | |||
108 | else
|
||
109 | printf("FAILED\n");
|
||
110 | |||
111 | // Receive a TAG, never send an ACK
|
||
112 | printf("Receive TAG, never send ACK... ");
|
||
113 | |||
114 | while (!(packet_data = wl_basic_do_default(&data_length)));
|
||
115 | |||
116 | if (data_length >= 2 && packet_data[0] == HUNTER_PREY_ACTION_TAG) |
||
117 | { |
||
118 | delay_ms(5000); // wait 5 seconds to see if they TAG again |
||
119 | |||
120 | if (wl_basic_do_default(&data_length))
|
||
121 | printf("FAILED\n");
|
||
122 | else
|
||
123 | printf("PASSED\n");
|
||
124 | } |
||
125 | |||
126 | else
|
||
127 | printf("FAILED\n");
|
||
128 | |||
129 | // Receive TAG, send ACK to incorrect robot
|
||
130 | printf("Receive TAG, send ACK to incorrect robot... ");
|
||
131 | |||
132 | // Wait until we receive a packet
|
||
133 | while (!(packet_data = wl_basic_do_default(&data_length)));
|
||
134 | |||
135 | if (data_length >= 2 && packet_data[0] == HUNTER_PREY_ACTION_TAG) |
||
136 | { |
||
137 | // send back an ACK
|
||
138 | send_buffer[0] = HUNTER_PREY_ACTION_ACK;
|
||
139 | send_buffer[1] = packet_data[1] + 1; |
||
140 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
141 | |||
142 | printf("PASSED\n");
|
||
143 | } |
||
144 | else
|
||
145 | printf("FAILED\n");
|
||
146 | |||
147 | // Simulate TAG from robot A to B, ACK from robot B to A
|
||
148 | printf("Send TAG from robot A to B, ACK from B to A... ");
|
||
149 | |||
150 | // TAG
|
||
151 | send_buffer[0] = HUNTER_PREY_ACTION_TAG;
|
||
152 | send_buffer[1] = packet_data[1] - 1; // robot other than testee |
||
153 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
154 | |||
155 | // ACK
|
||
156 | send_buffer[0] = HUNTER_PREY_ACTION_ACK;
|
||
157 | // send_buffer[1] stays the same
|
||
158 | wl_basic_send_global_packet(TYPE, send_buffer, 2);
|
||
159 | |||
160 | if (wl_basic_do_default(&data_length))
|
||
161 | printf("FAILED\n");
|
||
162 | else
|
||
163 | printf("PASSED\n");
|
||
164 | |||
165 | return 0; |
||
166 | 1433 | alevkoy | } |