Revision 1807 trunk/code/behaviors/formation_control/circle/circle.c
| circle.c (revision 1807) | ||
|---|---|---|
| 25 | 25 |
student representative Chris Mar. |
| 26 | 26 |
|
| 27 | 27 |
AUTHORS: James Carroll, Steve DeVincentis, Hanzhang (Echo) Hu, Nico Paris, |
| 28 |
Joel Rey, Reva Street, Alex Zirbel */ |
|
| 28 |
Joel Rey, Reva Street, Alex Zirbel |
|
| 29 |
*/ |
|
| 29 | 30 |
|
| 30 | 31 |
|
| 31 | 32 |
#include <dragonfly_lib.h> |
| ... | ... | |
| 49 | 50 |
|
| 50 | 51 |
-Consider using the center bot to check distances |
| 51 | 52 |
|
| 52 |
-More testing is always good and necessary. */ |
|
| 53 |
-More testing is always good and necessary. |
|
| 54 |
*/ |
|
| 53 | 55 |
|
| 54 | 56 |
/*** BOT LOG *** |
| 55 | 57 |
|
| 56 | 58 |
4-1-2010: BOT 7 as BEACON and BOT 1 as EDGE worked extremely well. |
| 57 | 59 |
4-2-2010: BOT 7 and BOT 14 worked extremely well, no matter states. BOT 1 |
| 58 |
started well, but malfunctioned later. */ |
|
| 60 |
started well, but malfunctioned later. |
|
| 61 |
*/ |
|
| 59 | 62 |
|
| 60 | 63 |
/*** TERMINOLOGY *** |
| 61 | 64 |
|
| 62 |
WAITINGSTATE: |
|
| 63 |
The robot waits to be given a signal to do something. Wireless is on, in |
|
| 64 |
case the robot is called on to turn into an EDGE. The color should be LIME |
|
| 65 |
or YELLOW-GREEN. |
|
| 65 |
WAITINGSTATE: |
|
| 66 |
The robot waits to be given a signal to do something. Wireless is on, |
|
| 67 |
in case the robot is called on to turn into an EDGE. The color should be LIME |
|
| 68 |
or YELLOW-GREEN. |
|
| 66 | 69 |
|
| 67 |
BEACON_CONTROL: |
|
| 68 |
The code that executes commands when a robot is turned to BEACON mode. This |
|
| 69 |
code may run predefined methods for simplicity. One goal is to make these |
|
| 70 |
methods change the robot turn to to BEACON_MACHINE mode for a while, and then |
|
| 71 |
return to the CONTROL code where they left off. |
|
| 70 |
BEACON_CONTROL: |
|
| 71 |
The code that executes commands when a robot is turned to BEACON mode. This |
|
| 72 |
code may run predefined methods for simplicity. One goal is to make these |
|
| 73 |
methods change the robot turn to to BEACON_MACHINE mode for a while, and then |
|
| 74 |
return to the CONTROL code where they left off. |
|
| 72 | 75 |
|
| 73 |
EDGE_CONTROL: |
|
| 74 |
Like BEACON_CONTROL, executes whatever orders are required of the robot as an |
|
| 75 |
EDGE. |
|
| 76 |
EDGE_CONTROL: |
|
| 77 |
Like BEACON_CONTROL, executes whatever orders are required of the robot as an |
|
| 78 |
EDGE. |
|
| 76 | 79 |
|
| 77 |
BEACON_MACHINE: |
|
| 78 |
A hardcoded list of functions which the robot is capable of running through. |
|
| 79 |
Consists of a finite state machine, where the robot executes a set of commands |
|
| 80 |
in a procedural manner and then returns to wherever it was in the control code. |
|
| 80 |
BEACON_MACHINE: |
|
| 81 |
A hardcoded list of functions which the robot is capable of running through. |
|
| 82 |
Consists of a finite state machine, where the robot executes a set of commands |
|
| 83 |
in a procedural manner and then returns to wherever it was in the control code. |
|
| 81 | 84 |
|
| 82 |
EDGE_MACHINE: |
|
| 83 |
Like the BEACON_MACHINE, but contains the same sort of procedural information |
|
| 84 |
for EDGE robots. |
|
| 85 |
EDGE_MACHINE: |
|
| 86 |
Like the BEACON_MACHINE, but contains the same sort of procedural information |
|
| 87 |
for EDGE robots. |
|
| 85 | 88 |
|
| 86 |
END: |
|
| 87 |
A terminal state of the machine, where the robot just sits and waits. The |
|
| 88 |
color should be GREEN and WHITE. |
|
| 89 |
END: |
|
| 90 |
A terminal state of the machine, where the robot just sits and waits. The |
|
| 91 |
color should be GREEN and WHITE. |
|
| 89 | 92 |
|
| 90 | 93 |
|
| 91 |
TYPES OF WIRELESS PACKETS: |
|
| 92 |
CIRCLE_ACTION_EXIST 'E' |
|
| 93 |
CIRCLE_ACTION_POSITION 'P' |
|
| 94 |
CIRCLE_ACTION_ACK 'A' |
|
| 95 |
A general acknowledgement package. |
|
| 96 |
CIRCLE_ACTION_DONE 'D' |
|
| 97 |
Used by robots to tell when they have finished their action. |
|
| 98 |
CIRCLE_ACTION_GOTYOU 'G' |
|
| 99 |
Used by the BEACON to tell a robot when it has been checked off. |
|
| 100 |
At this point, the EDGE has been recognized. Used for times when |
|
| 101 |
all EDGE robots have to communicate to the center via the spam method. |
|
| 102 |
CIRCLE_ACTION_FORWARD 'F' |
|
| 103 |
The BEACON tells the rest of the robots to move forward. |
|
| 104 |
CIRCLE_CLAIM_CENTER 'C' |
|
| 105 |
Sent out by a robot when it takes over as BEACON. */ |
|
| 94 |
TYPES OF WIRELESS PACKETS: |
|
| 106 | 95 |
|
| 96 |
CIRCLE_ACTION_EXIST 'E' |
|
| 97 |
CIRCLE_ACTION_POSITION 'P' |
|
| 98 |
CIRCLE_ACTION_ACK 'A' |
|
| 99 |
A general acknowledgement package. |
|
| 100 |
CIRCLE_ACTION_DONE 'D' |
|
| 101 |
Used by robots to tell when they have finished their action. |
|
| 102 |
CIRCLE_ACTION_GOTYOU 'G' |
|
| 103 |
Used by the BEACON to tell a robot when it has been checked off. |
|
| 104 |
At this point, the EDGE has been recognized. Used for times when |
|
| 105 |
all EDGE robots have to communicate to the center via the spam method. |
|
| 106 |
CIRCLE_ACTION_FORWARD 'F' |
|
| 107 |
The BEACON tells the rest of the robots to move forward. |
|
| 108 |
CIRCLE_CLAIM_CENTER 'C' |
|
| 109 |
Sent out by a robot when it takes over as BEACON. |
|
| 110 |
*/ |
|
| 107 | 111 |
|
| 108 | 112 |
|
| 113 |
/* Define some variables to keep track of the state machine.*/ |
|
| 109 | 114 |
int END = 100; |
| 110 |
int WAITINGSTATE = 0; /* Define some variables to keep track of the state machine.*/ |
|
| 115 |
int WAITINGSTATE = 0; |
|
| 111 | 116 |
int EDGE_CONTROL = 1; |
| 112 | 117 |
int BEACON_CONTROL = 2; |
| 113 | 118 |
int EDGE_MACHINE = 3; |
| ... | ... | |
| 117 | 122 |
int CIRCLEUP = 1; |
| 118 | 123 |
int ORIENT = 2; |
| 119 | 124 |
int DRIVE = 3; |
| 125 |
int TURNL = 4; |
|
| 126 |
int TURNR = 5; |
|
| 120 | 127 |
|
| 121 | 128 |
int currentPos = 0; |
| 122 | 129 |
int state = 0; |
| 123 | 130 |
|
| 131 |
// keep track of the speed and duration of group movements. |
|
| 132 |
int speed = 20; |
|
| 133 |
int duration = 2; |
|
| 124 | 134 |
|
| 125 | 135 |
int timeout = 0; |
| 126 | 136 |
int sending = 0; |
| ... | ... | |
| 144 | 154 |
} |
| 145 | 155 |
} |
| 146 | 156 |
|
| 147 |
void forward(int speed){ // set the motors to this forward speed.
|
|
| 157 |
// set the motors to this forward speed. |
|
| 158 |
void forward(int speed) |
|
| 159 |
{
|
|
| 148 | 160 |
motor_l_set(FORWARD,speed); |
| 149 | 161 |
motor_r_set(FORWARD,speed); |
| 150 | 162 |
} |
| 151 |
void left(int speed){ // turn left at this speed.
|
|
| 163 |
// turn left at this speed. |
|
| 164 |
void left(int speed) |
|
| 165 |
{
|
|
| 152 | 166 |
motor_l_set(BACKWARD,speed); |
| 153 | 167 |
motor_r_set(FORWARD,speed); |
| 154 | 168 |
} |
| 155 |
void right(int speed){
|
|
| 169 |
void right(int speed) |
|
| 170 |
{
|
|
| 156 | 171 |
motor_l_set(FORWARD,speed); |
| 157 | 172 |
motor_r_set(BACKWARD,speed); |
| 158 | 173 |
} |
| 159 |
void stop(void){ // could be set to motors_off(), or just use this as an alternative.
|
|
| 160 |
motor_l_set(BACKWARD,0); // stop() is better - motors_off() creates a slight delay to turn them back on. |
|
| 174 |
// stop() is better than motors_off(), which creates a slight delay when |
|
| 175 |
// reactivating the motors. Stop() is faster. |
|
| 176 |
void stop(void) |
|
| 177 |
{
|
|
| 178 |
motor_l_set(BACKWARD,0); |
|
| 161 | 179 |
motor_r_set(FORWARD,0); |
| 162 | 180 |
} |
| 163 |
void setforward(int spd1, int spd2){
|
|
| 181 |
void setforward(int spd1, int spd2) |
|
| 182 |
{
|
|
| 164 | 183 |
motor_l_set(FORWARD,spd1); |
| 165 | 184 |
motor_r_set(FORWARD,spd2); |
| 166 | 185 |
} |
| 167 |
void backward(int speed){
|
|
| 186 |
void backward(int speed) |
|
| 187 |
{
|
|
| 168 | 188 |
motor_l_set(BACKWARD, speed); |
| 169 | 189 |
motor_r_set(BACKWARD, speed); |
| 170 | 190 |
} |
| 171 |
int get_distance(void){ // takes an averaged reading of the front rangefinder
|
|
| 172 |
int temp,distance,kk=5; // kk sets this to 5 readings. |
|
| 191 |
// takes an averaged reading of the front rangefinder |
|
| 192 |
int get_distance(void) |
|
| 193 |
{
|
|
| 194 |
// kk sets this to 5 readings. |
|
| 195 |
int temp,distance,kk=5; |
|
| 173 | 196 |
distance =0; |
| 174 |
for (int i=0; i<kk; i++){
|
|
| 197 |
for (int i=0; i<kk; i++) |
|
| 198 |
{
|
|
| 175 | 199 |
temp = range_read_distance(IR2); |
| 176 | 200 |
if (temp == -1) |
| 177 | 201 |
{
|
| ... | ... | |
| 208 | 232 |
} |
| 209 | 233 |
|
| 210 | 234 |
/* |
| 211 |
Orients the robot so that it is facing the beacon (or the broadcasting BOM). |
|
| 212 |
|
|
| 235 |
Orients the robot so that it is facing the beacon (or the broadcasting BOM). |
|
| 213 | 236 |
*/ |
| 214 | 237 |
void faceFront(void) |
| 215 | 238 |
{
|
| ... | ... | |
| 236 | 259 |
return; |
| 237 | 260 |
} |
| 238 | 261 |
|
| 262 |
/* |
|
| 263 |
Turns the robot slowly to the right until it reaches the BOM reading goal. |
|
| 264 |
More stable code than what was implemented ealier, with smart turning, |
|
| 265 |
but slower. |
|
| 266 |
*/ |
|
| 239 | 267 |
void aboutFace(int goal) |
| 240 | 268 |
{
|
| 241 | 269 |
int bomNum = -1; |
| 242 | 270 |
int speed = 170; // speed with which to turn |
| 243 | 271 |
|
| 244 |
orb1_set_color(BLUE); // BLUE and PURPLE |
|
| 272 |
orb1_set_color(BLUE); // BLUE and PURPLE |
|
| 245 | 273 |
|
| 246 | 274 |
while(bomNum != goal) |
| 247 | 275 |
{
|
| ... | ... | |
| 256 | 284 |
|
| 257 | 285 |
|
| 258 | 286 |
/* |
| 259 |
BLINK the given number times |
|
| 287 |
BLINK the given number times |
|
| 260 | 288 |
*/ |
| 261 | 289 |
void blink(int num) |
| 262 | 290 |
{
|
| ... | ... | |
| 271 | 299 |
} |
| 272 | 300 |
|
| 273 | 301 |
/* |
| 274 |
BLINK slowly the given number times |
|
| 302 |
BLINK slowly the given number times |
|
| 275 | 303 |
*/ |
| 276 | 304 |
void slowblink(int num) |
| 277 | 305 |
{
|
| ... | ... | |
| 285 | 313 |
orb_set_color(ORB_OFF); |
| 286 | 314 |
} |
| 287 | 315 |
|
| 316 |
/* |
|
| 317 |
A method for the higher-level code for the BEACON. The beacon can make |
|
| 318 |
any of the preprogrammed commands, and this code sends the packet and |
|
| 319 |
transitions the robots correctly. |
|
| 320 |
*/ |
|
| 288 | 321 |
void order(int action) |
| 289 | 322 |
{
|
| 290 | 323 |
currentPos++; |
| ... | ... | |
| 292 | 325 |
state = 20 + action; |
| 293 | 326 |
} |
| 294 | 327 |
|
| 328 |
/* |
|
| 329 |
A method for the higher-level code for the BEACON. The beacond sends |
|
| 330 |
not only the command, but also the speed and duration for which the |
|
| 331 |
(movement) command is to be executed. |
|
| 332 |
*/ |
|
| 333 |
void orderMove(int action, int newSpeed, int newDuration) |
|
| 334 |
{
|
|
| 335 |
currentPos++; |
|
| 336 |
speed = newSpeed; |
|
| 337 |
duration = newDuration; |
|
| 338 |
send2(CIRCLE_EXECUTE, action); |
|
| 339 |
state = 20 + action; |
|
| 340 |
} |
|
| 341 |
|
|
| 342 |
/* |
|
| 343 |
Turns off the motors, sends an EXECUTE packet, and blinks green and white |
|
| 344 |
forever. |
|
| 345 |
*/ |
|
| 295 | 346 |
void terminate(void) |
| 296 | 347 |
{
|
| 348 |
motors_off(); |
|
| 297 | 349 |
send2(CIRCLE_EXECUTE, 100); |
| 298 | 350 |
orb_set_color(GREEN); |
| 299 | 351 |
orb2_set_color(WHITE); |
| ... | ... | |
| 301 | 353 |
} |
| 302 | 354 |
|
| 303 | 355 |
|
| 356 |
//****************************************************************************** |
|
| 357 |
//****************************************************************************** |
|
| 358 |
//****************************************************************************** |
|
| 304 | 359 |
|
| 305 | 360 |
|
| 306 |
//***************************************************************************************************************************************************************************************** |
|
| 307 |
//***************************************************************************************************************************************************************************************** |
|
| 308 |
//***************************************************************************************************************************************************************************************** |
|
| 309 | 361 |
|
| 310 |
|
|
| 311 | 362 |
/* |
| 312 |
A state machine with five states. The robot starts out in WAITINGSTATE mode, from which |
|
| 313 |
it recieves a signal of some sort and moves to a different state. |
|
| 363 |
A state machine with five states. The robot starts out in WAITINGSTATE mode, |
|
| 364 |
from which it recieves a signal of some sort and moves to a different state. |
|
| 314 | 365 |
*/ |
| 315 | 366 |
int main(void) |
| 316 | 367 |
{
|
| ... | ... | |
| 322 | 373 |
wl_set_channel(24); |
| 323 | 374 |
|
| 324 | 375 |
int robotid = get_robotid(); |
| 325 |
int centerid = 0; // once the EDGE gets the first signal from a center, it stores who the center is. |
|
| 326 |
int used[17]; // stores a list of bots which are in the group by storing a "1" in the array if the robot of that index is in the group. |
|
| 327 |
for (int i=0; i<17; i++) used[i] = 0; // initially, no robots in the group. |
|
| 328 | 376 |
|
| 329 |
int data_length; // keeps track of the length of wireless packets received. |
|
| 377 |
// once the EDGE gets the first signal from a center, it stores who the // center is. |
|
| 378 |
int centerid = 0; |
|
| 379 |
|
|
| 380 |
// stores a list of bots which are in the group by storing a "1" in the |
|
| 381 |
// array if the robot of that index is in the group. |
|
| 382 |
int used[17]; |
|
| 383 |
int numOk; |
|
| 384 |
|
|
| 385 |
// initially, no robots in the group. |
|
| 386 |
for (int i=0; i<17; i++) |
|
| 387 |
used[i] = 0; |
|
| 388 |
|
|
| 389 |
// keeps track of the length of wireless packets received. |
|
| 390 |
int data_length; |
|
| 330 | 391 |
unsigned char *packet_data=wl_basic_do_default(&data_length); |
| 331 |
|
|
| 332 |
int beacon_State=0; // these variables keep track of the inner state machines in the procedural MACHINE states. |
|
| 392 |
|
|
| 393 |
// these variables keep track of the inner state machines in the |
|
| 394 |
// procedural MACHINE states. |
|
| 395 |
int beacon_State=0; |
|
| 333 | 396 |
int edge_State=0; |
| 334 | 397 |
|
| 335 | 398 |
int waitingCounter=0; |
| 336 |
int robotsReceived=0; // an important variable that stores the size of the group. |
|
| 337 |
int offset = 20; // offset for the approaching: how far off the rangefinders can be |
|
| 399 |
|
|
| 400 |
// an important variable that stores the size of the group. |
|
| 401 |
int robotsReceived=0; |
|
| 402 |
|
|
| 403 |
// offset for the approaching: how far off the rangefinders can be |
|
| 404 |
int offset = 20; |
|
| 338 | 405 |
int time=0; |
| 339 |
int direction = 4; // keeps track of which way robots are facing relative to the center |
|
| 340 |
int distance=1000; // how far away the robot is. Initialized to a large value to ensure that the robot doesn't think it is already the |
|
| 341 |
// right distance away. |
|
| 342 |
int onefoot = 250; // how far away to stop. |
|
| 406 |
|
|
| 407 |
// keeps track of which way robots are facing relative to the center |
|
| 408 |
int direction = 4; |
|
| 409 |
|
|
| 410 |
// how far away the robot is. Initialized to a large value to ensure |
|
| 411 |
// that the robot doesn't think it is already the right distance away. |
|
| 412 |
int distance=1000; |
|
| 413 |
int onefoot = 250; // how far away to stop. |
|
| 343 | 414 |
|
| 344 | 415 |
while(1) |
| 345 | 416 |
{
|
| 346 | 417 |
bom_refresh(BOM_ALL); |
| 347 | 418 |
|
| 348 |
/* |
|
| 349 |
*******EXPECTED MOVES ********** (OUT OF DATE. Will be updated once changes have been made.) |
|
| 350 |
The designed movement: |
|
| 351 |
1. one center robot, several edge robots are on; |
|
| 352 |
2. center robots: button 1 is pressed; |
|
| 353 |
3. center robots: send global package telling edges that he exists; |
|
| 354 |
4. EDGE robots response with ACK. |
|
| 355 |
5. EDGE robots wait for center robots to finish counting (DONE package) |
|
| 356 |
6. EDGE robtos approach the center robtot and stop at the "onefoot" distance, send message to the center |
|
| 357 |
*/ |
|
| 419 |
/***EXPECTED MOVES*** |
|
| 420 |
(OUT OF DATE. Will be updated once changes have been made.) |
|
| 421 |
The designed movement: |
|
| 422 |
1. one center robot, several edge robots are on; |
|
| 423 |
2. center robots: button 1 is pressed; |
|
| 424 |
3. center robots: send global package telling edges that he exists; |
|
| 425 |
4. EDGE robots response with ACK. |
|
| 426 |
5. EDGE robots wait for center robots to finish counting (DONE package) |
|
| 427 |
6. EDGE robtos approach the center robtot and stop at the "onefoot" |
|
| 428 |
distance, send message to the center |
|
| 429 |
*/ |
|
| 358 | 430 |
|
| 359 | 431 |
|
| 360 |
/* This is the MAIN SWITCH LOOP, which governs the overall status of the robot. */ |
|
| 432 |
/* |
|
| 433 |
This is the MAIN SWITCH LOOP, which governs the overall |
|
| 434 |
status of the robot. |
|
| 435 |
*/ |
|
| 361 | 436 |
switch(state) |
| 362 | 437 |
{
|
| 363 | 438 |
|
| 364 | 439 |
|
| 365 |
/* |
|
| 366 |
The WAITINGSTATE. This state constantly checks for wireless packets, |
|
| 367 |
and updates its state as soon as it receives a signal. |
|
| 368 |
*/ |
|
| 369 |
case 0: |
|
| 440 |
/* |
|
| 441 |
The WAITINGSTATE. This state constantly checks for wireless |
|
| 442 |
packets, |
|
| 443 |
and updates its state as soon as it receives a signal. |
|
| 444 |
*/ |
|
| 445 |
case 0: |
|
| 370 | 446 |
|
| 371 |
orb_set_color(YELLOW); |
|
| 372 |
packet_data=wl_basic_do_default(&data_length); |
|
| 373 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_CLAIM_CENTER) |
|
| 374 |
{
|
|
| 375 |
centerid = packet_data[1]; |
|
| 447 |
orb_set_color(YELLOW); |
|
| 448 |
packet_data=wl_basic_do_default(&data_length); |
|
| 449 |
if(packet_data != 0 && data_length>=2 |
|
| 450 |
&& packet_data[0]==CIRCLE_CLAIM_CENTER) |
|
| 451 |
{
|
|
| 452 |
centerid = packet_data[1]; |
|
| 453 |
state = 1; |
|
| 454 |
} |
|
| 376 | 455 |
|
| 377 |
state = 1; |
|
| 378 |
} |
|
| 456 |
if(button1_read()) |
|
| 457 |
{
|
|
| 458 |
// becomes the center if button1 is clicked. |
|
| 459 |
send2(CIRCLE_CLAIM_CENTER, robotid); |
|
| 460 |
state = 2; |
|
| 461 |
} |
|
| 462 |
break; |
|
| 379 | 463 |
|
| 380 |
if(button1_read()) |
|
| 381 |
{
|
|
| 382 |
send2(CIRCLE_CLAIM_CENTER, robotid); // becomes the center if button1 is clicked. |
|
| 383 |
state = 2; |
|
| 384 |
} |
|
| 385 | 464 |
|
| 386 |
break; |
|
| 387 | 465 |
|
| 466 |
//****************************************************************************** |
|
| 467 |
//****************************************************************************** |
|
| 388 | 468 |
|
| 389 | 469 |
|
| 390 |
//*********************************************************************************************************************************************************************************** |
|
| 470 |
/* |
|
| 471 |
The CONTROL for the EDGE state. This sets a certain procedure |
|
| 472 |
to follow, in the form of simple |
|
| 473 |
commands, for a robot to follow if it is set to an EDGE. |
|
| 474 |
*/ |
|
| 391 | 475 |
|
| 476 |
case 1: |
|
| 477 |
orb_set_color(CYAN); |
|
| 478 |
orb1_set_color(YELLOW); |
|
| 392 | 479 |
|
| 480 |
int command = -1; |
|
| 481 |
|
|
| 482 |
packet_data=wl_basic_do_default(&data_length); |
|
| 393 | 483 |
|
| 394 |
/* |
|
| 395 |
The CONTROL for the EDGE state. This sets a certain procedure to follow, in the form of simple |
|
| 396 |
commands, for a robot to follow if it is set to an EDGE. |
|
| 397 |
*/ |
|
| 484 |
if(packet_data != 0 && data_length>=2 && |
|
| 485 |
packet_data[0]==CIRCLE_EXECUTE) |
|
| 486 |
{
|
|
| 487 |
command = packet_data[1]; |
|
| 488 |
} |
|
| 398 | 489 |
|
| 399 |
case 1: |
|
| 400 |
orb_set_color(CYAN); |
|
| 401 |
orb1_set_color(YELLOW); |
|
| 402 |
|
|
| 403 |
int command = -1; |
|
| 404 |
|
|
| 405 |
packet_data=wl_basic_do_default(&data_length); |
|
| 406 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_EXECUTE) |
|
| 490 |
if(command != -1) |
|
| 491 |
{
|
|
| 492 |
edge_State = 0; |
|
| 493 |
switch(command) |
|
| 407 | 494 |
{
|
| 408 |
command = packet_data[1]; |
|
| 409 |
} |
|
| 495 |
case 0: |
|
| 496 |
state = 10; break; |
|
| 410 | 497 |
|
| 411 |
if(command != -1) |
|
| 412 |
{
|
|
| 413 |
edge_State = 0; |
|
| 414 |
switch(command) |
|
| 415 |
{
|
|
| 416 |
case 0: |
|
| 417 |
state = 10; break; |
|
| 498 |
case 1: |
|
| 499 |
state = 11; break; |
|
| 418 | 500 |
|
| 419 |
case 1: |
|
| 420 |
state = 11; break; |
|
| 501 |
case 2: |
|
| 502 |
state = 12; break; |
|
| 421 | 503 |
|
| 422 |
case 2: |
|
| 423 |
state = 12; break; |
|
| 504 |
case 3: |
|
| 505 |
state = 13; break; |
|
| 424 | 506 |
|
| 425 |
case 3: |
|
| 426 |
state = 13; break; |
|
| 507 |
case 4: |
|
| 508 |
state = 14; break; |
|
| 427 | 509 |
|
| 428 |
case 100: |
|
| 429 |
terminate(); break; |
|
| 430 |
} |
|
| 510 |
case 5: |
|
| 511 |
state = 15; break; |
|
| 512 |
|
|
| 513 |
case 100: |
|
| 514 |
terminate(); break; |
|
| 431 | 515 |
} |
| 516 |
} |
|
| 432 | 517 |
|
| 433 |
break; |
|
| 518 |
break; |
|
| 434 | 519 |
|
| 435 | 520 |
|
| 436 | 521 |
|
| 437 |
//*********************************************************************************************************************************************************************************** |
|
| 522 |
//****************************************************************************** |
|
| 523 |
//****************************************************************************** |
|
| 438 | 524 |
|
| 439 | 525 |
|
| 526 |
/* |
|
| 527 |
The CONTROL for the BEACON state. This sets a certain procedure |
|
| 528 |
to follow, in the form of simple commands, for a robot to follow |
|
| 529 |
if it is set to a BEACON. |
|
| 530 |
*/ |
|
| 531 |
case 2: |
|
| 532 |
orb_set_color(PURPLE); |
|
| 533 |
beacon_State = 0; |
|
| 440 | 534 |
|
| 441 |
/* |
|
| 442 |
The CONTROL for the BEACON state. This sets a certain procedure to follow, in the form of simple |
|
| 443 |
commands, for a robot to follow if it is set to a BEACON. |
|
| 444 |
*/ |
|
| 445 |
case 2: |
|
| 446 |
orb_set_color(PURPLE); |
|
| 447 |
beacon_State = 0; |
|
| 448 |
|
|
| 449 |
switch(currentPos) |
|
| 450 |
{
|
|
| 451 |
case 0: |
|
| 452 |
order(COUNT); break; |
|
| 535 |
switch(currentPos) |
|
| 536 |
{
|
|
| 537 |
case 0: |
|
| 538 |
order(COUNT); break; |
|
| 453 | 539 |
|
| 454 |
case 1: |
|
| 455 |
order(CIRCLEUP); break; |
|
| 540 |
case 1: |
|
| 541 |
order(CIRCLEUP); break; |
|
| 456 | 542 |
|
| 457 |
case 2: |
|
| 458 |
order(ORIENT); break; |
|
| 543 |
case 2: |
|
| 544 |
order(ORIENT); break; |
|
| 459 | 545 |
|
| 460 |
case 3: |
|
| 461 |
order(DRIVE); break; |
|
| 546 |
case 3: |
|
| 547 |
orderMove(TURNL,20,2); break; |
|
| 462 | 548 |
|
| 463 |
case 4: |
|
| 464 |
terminate(); break; |
|
| 465 |
} |
|
| 549 |
case 4: |
|
| 550 |
terminate(); break; |
|
| 551 |
} |
|
| 466 | 552 |
|
| 467 |
break; |
|
| 553 |
break; |
|
| 468 | 554 |
|
| 469 | 555 |
|
| 556 |
//****************************************************************************** |
|
| 557 |
//****************************************************************************** |
|
| 470 | 558 |
|
| 471 |
//*********************************************************************************************************************************************************************************** |
|
| 472 | 559 |
|
| 560 |
/* The following states are MACHINE states for the EDGE robot. */ |
|
| 473 | 561 |
|
| 474 |
/* The following states are MACHINE states for the EDGE robot. */ |
|
| 562 |
/* |
|
| 563 |
EDGE on COUNT |
|
| 564 |
*/ |
|
| 565 |
case 10: |
|
| 475 | 566 |
|
| 476 |
/* |
|
| 477 |
EDGE on COUNT |
|
| 478 |
*/ |
|
| 479 |
case 10: |
|
| 567 |
switch(edge_State) |
|
| 568 |
{
|
|
| 569 |
/* |
|
| 570 |
0. EDGE robots are on. |
|
| 571 |
1. They are waiting for EXIST pacakage from the |
|
| 572 |
Center robots |
|
| 573 |
2. After they receive the package, they send ACK |
|
| 574 |
package to center. |
|
| 575 |
3. Done for now: display green. |
|
| 576 |
*/ |
|
| 577 |
case 0: |
|
| 578 |
bom_off(); |
|
| 579 |
orb1_set_color(YELLOW); |
|
| 580 |
orb2_set_color(BLUE); |
|
| 581 |
packet_data=wl_basic_do_default(&data_length); |
|
| 480 | 582 |
|
| 481 |
|
|
| 482 |
switch(edge_State) |
|
| 583 |
if(packet_data != 0 && data_length>=2 && |
|
| 584 |
packet_data[0]==CIRCLE_ACTION_EXIST) |
|
| 483 | 585 |
{
|
| 484 |
/* |
|
| 485 |
0. EDGE robots are on. |
|
| 486 |
1. They are waiting for EXIST pacakage from the Center robots |
|
| 487 |
2. After they receive the package, they send ACK package to center. |
|
| 488 |
3. Done for now: display green. |
|
| 489 |
*/ |
|
| 490 |
case 0: |
|
| 491 |
bom_off(); |
|
| 492 |
orb1_set_color(YELLOW); |
|
| 493 |
orb2_set_color(BLUE); |
|
| 494 |
packet_data=wl_basic_do_default(&data_length); |
|
| 495 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_EXIST) |
|
| 496 |
{
|
|
| 497 |
centerid = packet_data[1]; |
|
| 586 |
centerid = packet_data[1]; |
|
| 498 | 587 |
|
| 499 |
send2(CIRCLE_ACTION_ACK,robotid); |
|
| 588 |
send2(CIRCLE_ACTION_ACK,robotid); |
|
| 500 | 589 |
|
| 501 |
edge_State=1; |
|
| 502 |
} |
|
| 503 |
break; |
|
| 504 |
/* |
|
| 505 |
1. Wait for DONE package |
|
| 506 |
2. The counting process is DONE |
|
| 507 |
*/ |
|
| 508 |
case 1: |
|
| 590 |
edge_State=1; |
|
| 591 |
} |
|
| 592 |
break; |
|
| 593 |
|
|
| 594 |
/* |
|
| 595 |
1. Wait for DONE package |
|
| 596 |
2. The counting process is DONE |
|
| 597 |
*/ |
|
| 598 |
case 1: |
|
| 509 | 599 |
|
| 510 |
orb_set_color(YELLOW); |
|
| 511 |
orb2_set_color(PURPLE); |
|
| 600 |
orb_set_color(YELLOW); |
|
| 601 |
orb2_set_color(PURPLE); |
|
| 512 | 602 |
|
| 513 |
send2(CIRCLE_ACTION_ACK,robotid); // keep sending the packet until we get a response |
|
| 603 |
// keep sending the packet until we get a |
|
| 604 |
// response |
|
| 605 |
send2(CIRCLE_ACTION_ACK,robotid); |
|
| 514 | 606 |
|
| 515 |
packet_data=wl_basic_do_default(&data_length); |
|
| 516 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_GOTYOU && packet_data[1] == robotid) |
|
| 517 |
{
|
|
| 518 |
edge_State=2; |
|
| 519 |
} |
|
| 520 |
break; |
|
| 607 |
packet_data=wl_basic_do_default(&data_length); |
|
| 608 |
if(packet_data != 0 && data_length>=2 && |
|
| 609 |
packet_data[0]==CIRCLE_ACTION_GOTYOU && |
|
| 610 |
packet_data[1] == robotid) |
|
| 611 |
{
|
|
| 612 |
edge_State=2; |
|
| 613 |
} |
|
| 614 |
break; |
|
| 521 | 615 |
|
| 522 |
case 2: // wait for the second, general, done packet. |
|
| 616 |
// wait for the second, general, done packet. |
|
| 617 |
case 2: |
|
| 523 | 618 |
|
| 524 |
orb_set_color(YELLOW); |
|
| 525 |
packet_data=wl_basic_do_default(&data_length); |
|
| 526 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_DONE && packet_data[1] == centerid) |
|
| 527 |
{
|
|
| 528 |
state = 1; |
|
| 529 |
} |
|
| 530 |
break; |
|
| 619 |
orb_set_color(YELLOW); |
|
| 620 |
packet_data=wl_basic_do_default(&data_length); |
|
| 621 |
if(packet_data != 0 && data_length>=2 && |
|
| 622 |
packet_data[0]==CIRCLE_ACTION_DONE && |
|
| 623 |
packet_data[1] == centerid) |
|
| 624 |
{
|
|
| 625 |
state = 1; |
|
| 531 | 626 |
} |
| 532 |
|
|
| 533 | 627 |
break; |
| 628 |
} |
|
| 534 | 629 |
|
| 535 |
/* The CIRCLEUP command for EDGE */ |
|
| 630 |
break; |
|
| 536 | 631 |
|
| 537 |
case 11: |
|
| 632 |
/* The CIRCLEUP command for EDGE */ |
|
| 538 | 633 |
|
| 539 |
switch(edge_State) |
|
| 540 |
{
|
|
| 634 |
case 11: |
|
| 635 |
|
|
| 636 |
switch(edge_State) |
|
| 637 |
{
|
|
| 541 | 638 |
|
| 542 |
case 0: |
|
| 543 |
// COLOR afer DONE ---> MAGENTA |
|
| 544 |
orb_set_color(MAGENTA); |
|
| 545 |
faceFront(); // turn to face the beacon |
|
| 546 |
forward(175); |
|
| 547 |
//range_init(); |
|
| 639 |
case 0: |
|
| 640 |
// COLOR afer DONE ---> MAGENTA |
|
| 641 |
orb_set_color(MAGENTA); |
|
| 642 |
// turn to face the beacon |
|
| 643 |
faceFront(); |
|
| 644 |
forward(175); |
|
| 645 |
//range_init(); |
|
| 548 | 646 |
|
| 549 | 647 |
|
| 550 |
distance = get_distance(); |
|
| 648 |
distance = get_distance(); |
|
| 649 |
time=0; |
|
| 650 |
while ((distance-offset)>=onefoot || |
|
| 651 |
distance==0 || (distance+offset)<onefoot) |
|
| 652 |
{
|
|
| 653 |
if(distance==0) |
|
| 654 |
orb_set_color(WHITE); |
|
| 655 |
else if(distance-offset>=onefoot) |
|
| 656 |
forward(175); |
|
| 657 |
else |
|
| 658 |
backward(175); |
|
| 659 |
distance = get_distance(); |
|
| 660 |
delay_ms(14); |
|
| 661 |
time+=14; |
|
| 662 |
if(time>50) |
|
| 663 |
{
|
|
| 664 |
faceFront(); |
|
| 551 | 665 |
time=0; |
| 552 |
while ((distance-offset)>=onefoot || distance==0 || (distance+offset)<onefoot) |
|
| 553 |
{
|
|
| 554 |
if(distance==0) |
|
| 555 |
orb_set_color(WHITE); |
|
| 556 |
else if(distance-offset>=onefoot) |
|
| 557 |
forward(175); |
|
| 558 |
else |
|
| 559 |
backward(175); |
|
| 560 |
distance = get_distance(); |
|
| 561 |
delay_ms(14); |
|
| 562 |
time+=14; |
|
| 563 |
if(time>50) |
|
| 564 |
{
|
|
| 565 |
faceFront; |
|
| 566 |
time=0; |
|
| 567 |
} |
|
| 568 |
} |
|
| 666 |
} |
|
| 667 |
} |
|
| 569 | 668 |
|
| 570 |
stop(); |
|
| 571 |
orb_set_color(GREEN); |
|
| 669 |
stop(); |
|
| 670 |
orb_set_color(GREEN); |
|
| 572 | 671 |
|
| 573 |
send2(CIRCLE_ACTION_ACK, robotid); |
|
| 672 |
send2(CIRCLE_ACTION_ACK, robotid); |
|
| 574 | 673 |
|
| 575 |
stop(); |
|
| 576 |
state = 1; |
|
| 577 |
break; |
|
| 674 |
stop(); |
|
| 675 |
state = 1; |
|
| 676 |
break; |
|
| 677 |
} |
|
| 578 | 678 |
|
| 579 |
} |
|
| 580 | 679 |
|
| 581 |
|
|
| 582 |
break; |
|
| 680 |
break; |
|
| 583 | 681 |
|
| 584 |
/* An ORIENT series of steps for the EDGE robot. */ |
|
| 682 |
/* An ORIENT series of steps for the EDGE robot. */ |
|
| 585 | 683 |
|
| 586 |
case 12: |
|
| 684 |
case 12: |
|
| 587 | 685 |
|
| 686 |
switch(edge_State) |
|
| 687 |
{
|
|
| 588 | 688 |
|
| 589 |
switch(edge_State) |
|
| 689 |
// waits for a packet to tell it to turn on the bom. |
|
| 690 |
case 0: |
|
| 691 |
packet_data=wl_basic_do_default(&data_length); |
|
| 692 |
if(packet_data != 0 && data_length==2 && |
|
| 693 |
packet_data[0]==CIRCLE_ACTION_GOTYOU && |
|
| 694 |
packet_data[1] == robotid) |
|
| 590 | 695 |
{
|
| 696 |
bom_on(); |
|
| 697 |
orb_set_color(ORANGE); |
|
| 698 |
send2(CIRCLE_ACTION_ACK,centerid); |
|
| 699 |
edge_State = 1; |
|
| 700 |
} |
|
| 701 |
break; |
|
| 591 | 702 |
|
| 592 |
// waits for a packet to tell it to turn on the bom. |
|
| 593 |
case 0: |
|
| 594 |
packet_data=wl_basic_do_default(&data_length); |
|
| 595 |
if(packet_data != 0 && data_length==2 && packet_data[0]==CIRCLE_ACTION_GOTYOU && packet_data[1] == robotid) |
|
| 596 |
{
|
|
| 597 |
bom_on(); |
|
| 598 |
orb_set_color(ORANGE); |
|
| 599 |
send2(CIRCLE_ACTION_ACK,centerid); |
|
| 600 |
edge_State = 1; |
|
| 601 |
} |
|
| 602 |
break; |
|
| 703 |
// waits for a packet to tell it that it has been |
|
| 704 |
// received. |
|
| 705 |
case 1: |
|
| 706 |
orb2_set_color(YELLOW); |
|
| 707 |
packet_data=wl_basic_do_default(&data_length); |
|
| 708 |
if(packet_data != 0 && data_length==3 && |
|
| 709 |
packet_data[0]==CIRCLE_ACTION_GOTYOU && |
|
| 710 |
packet_data[1] == robotid) |
|
| 711 |
{
|
|
| 712 |
bom_off(); |
|
| 713 |
direction = packet_data[2]; |
|
| 714 |
orb_set_color(YELLOW); |
|
| 715 |
edge_State = 2; |
|
| 716 |
} |
|
| 717 |
break; |
|
| 603 | 718 |
|
| 604 |
// waits for a packet to tell it that it has been received. |
|
| 605 |
case 1: |
|
| 606 |
orb2_set_color(YELLOW); |
|
| 607 |
packet_data=wl_basic_do_default(&data_length); |
|
| 608 |
if(packet_data != 0 && data_length==3 && packet_data[0]==CIRCLE_ACTION_GOTYOU && packet_data[1] == robotid) |
|
| 609 |
{
|
|
| 610 |
bom_off(); |
|
| 611 |
direction = packet_data[2]; |
|
| 612 |
orb_set_color(YELLOW); |
|
| 613 |
edge_State = 2; |
|
| 614 |
} |
|
| 615 |
break; |
|
| 719 |
/* |
|
| 720 |
Wait for the center bot to send a DONE packet; then |
|
| 721 |
turn to face the right direction. |
|
| 722 |
*/ |
|
| 723 |
case 2: |
|
| 724 |
orb_set_color(GREEN); |
|
| 725 |
packet_data=wl_basic_do_default(&data_length); |
|
| 726 |
if(packet_data != 0 && data_length>=2 && |
|
| 727 |
packet_data[0]==CIRCLE_ACTION_DONE) |
|
| 728 |
{
|
|
| 729 |
orb_set_color(WHITE); |
|
| 730 |
orb2_set_color(CYAN); |
|
| 731 |
edge_State = 3; |
|
| 732 |
} |
|
| 733 |
break; |
|
| 616 | 734 |
|
| 617 |
/* Wait for the center bot to send a DONE packet; then turn to face the right direction. */ |
|
| 618 |
case 2: |
|
| 619 |
orb_set_color(GREEN); |
|
| 620 |
packet_data=wl_basic_do_default(&data_length); |
|
| 621 |
if(packet_data != 0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_DONE) |
|
| 622 |
{
|
|
| 623 |
orb_set_color(WHITE); |
|
| 624 |
orb2_set_color(CYAN); |
|
| 625 |
edge_State = 3; |
|
| 626 |
} |
|
| 627 |
break; |
|
| 735 |
/* Turn until we reach the right direction */ |
|
| 736 |
case 3: |
|
| 737 |
aboutFace(direction); |
|
| 738 |
stop(); |
|
| 739 |
orb_set_color(YELLOW); |
|
| 740 |
send2(CIRCLE_ACTION_DONE,robotid); |
|
| 741 |
state = 1; |
|
| 742 |
break; |
|
| 628 | 743 |
|
| 629 |
/* Turn until we reach the right direction (DIRECTION) */ |
|
| 630 |
case 3: |
|
| 631 |
aboutFace(direction); |
|
| 632 |
break; |
|
| 744 |
} |
|
| 633 | 745 |
|
| 634 |
} |
|
| 746 |
break; |
|
| 635 | 747 |
|
| 636 | 748 |
|
| 637 |
break; |
|
| 749 |
/* The DRIVE steps for the EDGE robot */ |
|
| 638 | 750 |
|
| 751 |
case 13: |
|
| 639 | 752 |
|
| 640 |
/* The MOVE steps for the EDGE robot */ |
|
| 753 |
switch(edge_State) |
|
| 754 |
{
|
|
| 755 |
|
|
| 756 |
/* Wait for the command to move forward. */ |
|
| 757 |
case 0: |
|
| 758 |
packet_data=wl_basic_do_default(&data_length); |
|
| 759 |
if(packet_data != 0 && data_length>=3 && |
|
| 760 |
packet_data[0]==CIRCLE_ACTION_FORWARD) |
|
| 761 |
{
|
|
| 762 |
orb_set_color(BLUE); |
|
| 763 |
forward(packet_data[1]*10); |
|
| 764 |
delay_ms(packet_data[2]*1000); |
|
| 765 |
stop(); |
|
| 766 |
state = 1; |
|
| 767 |
} |
|
| 768 |
break; |
|
| 641 | 769 |
|
| 642 |
case 13: |
|
| 643 | 770 |
|
| 644 |
switch(edge_State) |
|
| 645 |
{
|
|
| 646 |
|
|
| 647 |
/* Wait for the command to move forward. */ |
|
| 648 |
case 0: |
|
| 649 |
packet_data=wl_basic_do_default(&data_length); |
|
| 650 |
if(packet_data != 0 && data_length>=3 && packet_data[0]==CIRCLE_ACTION_FORWARD) |
|
| 651 |
{
|
|
| 652 |
orb_set_color(BLUE); |
|
| 653 |
forward(packet_data[1]*10); |
|
| 654 |
delay_ms(packet_data[2]*1000); |
|
| 655 |
edge_State = 1; |
|
| 656 |
} |
|
| 657 |
break; |
|
| 771 |
} |
|
| 658 | 772 |
|
| 659 |
/* Terminal. */ |
|
| 660 |
case 1: |
|
| 661 |
stop(); |
|
| 662 |
state = 1; |
|
| 663 |
break; |
|
| 773 |
break; |
|
| 664 | 774 |
|
| 775 |
/* The TURNL steps for the EDGE robot */ |
|
| 776 |
case 14: |
|
| 777 |
orb_set_color(RED); |
|
| 665 | 778 |
|
| 666 |
} // end the EdgeState switch |
|
| 779 |
/* Wait for specifications for the turn. */ |
|
| 667 | 780 |
|
| 668 |
break; // break the Edge state in the main switch loop |
|
| 669 |
|
|
| 670 |
// END for EDGE robots |
|
| 671 |
|
|
| 781 |
packet_data=wl_basic_do_default(&data_length); |
|
| 782 |
if(packet_data != 0 && data_length>=3 && |
|
| 783 |
packet_data[0]==CIRCLE_ACTION_TURN) |
|
| 784 |
{
|
|
| 785 |
orb_set_color(BLUE); |
|
| 672 | 786 |
|
| 787 |
left(packet_data[1]*10); |
|
| 788 |
delay_ms(packet_data[2]*1000); |
|
| 789 |
stop(); |
|
| 790 |
state = 1; |
|
| 791 |
} |
|
| 792 |
break; |
|
| 673 | 793 |
|
| 794 |
/* The TURNR steps for the EDGE robot */ |
|
| 795 |
case 15: |
|
| 796 |
orb_set_color(RED); |
|
| 674 | 797 |
|
| 798 |
/* Wait for specifications for the turn. */ |
|
| 675 | 799 |
|
| 800 |
packet_data=wl_basic_do_default(&data_length); |
|
| 801 |
if(packet_data != 0 && data_length>=3 && |
|
| 802 |
packet_data[0]==CIRCLE_ACTION_TURN) |
|
| 803 |
{
|
|
| 804 |
orb_set_color(BLUE); |
|
| 676 | 805 |
|
| 677 |
//*********************************************************************************************************************************************************************************** |
|
| 806 |
right(packet_data[1]*10); |
|
| 807 |
delay_ms(packet_data[2]*1000); |
|
| 808 |
stop(); |
|
| 809 |
state = 1; |
|
| 810 |
} |
|
| 811 |
break; |
|
| 812 |
|
|
| 813 |
// END for EDGE robots |
|
| 814 |
|
|
| 678 | 815 |
|
| 679 | 816 |
|
| 817 |
//****************************************************************************** |
|
| 818 |
//****************************************************************************** |
|
| 680 | 819 |
|
| 681 | 820 |
|
| 682 |
/* |
|
| 683 |
The MACHINE for the BEACON state |
|
| 684 |
*/ |
|
| 821 |
/* |
|
| 822 |
The MACHINE for the BEACON state |
|
| 823 |
*/ |
|
| 685 | 824 |
|
| 686 |
/* the COUNT code for the BEACON */ |
|
| 687 |
case 20: |
|
| 688 |
switch(beacon_State) |
|
| 689 |
{
|
|
| 825 |
/* the COUNT code for the BEACON */ |
|
| 826 |
case 20: |
|
| 827 |
switch(beacon_State) |
|
| 828 |
{
|
|
| 690 | 829 |
|
| 691 |
/* 0. center robots on wait for pressing button 1 */ |
|
| 692 |
case 0: |
|
| 693 |
bom_on(); |
|
| 694 |
orb_set_color(BLUE); |
|
| 695 |
robotsReceived = 0; |
|
| 696 |
beacon_State=1; |
|
| 697 |
break; |
|
| 830 |
/* 0. center robots on wait for pressing button 1 */ |
|
| 831 |
case 0: |
|
| 832 |
bom_on(); |
|
| 833 |
orb_set_color(BLUE); |
|
| 834 |
robotsReceived = 0; |
|
| 835 |
beacon_State=1; |
|
| 836 |
break; |
|
| 698 | 837 |
|
| 699 |
/* 1. Send EXIST package to EDGE robots */ |
|
| 700 |
case 1: |
|
| 701 |
orb_set_color(RED); |
|
| 702 |
send2(CIRCLE_ACTION_EXIST,robotid); |
|
| 703 |
beacon_State=2; |
|
| 704 |
break; |
|
| 838 |
/* 1. Send EXIST package to EDGE robots */ |
|
| 839 |
case 1: |
|
| 840 |
orb_set_color(RED); |
|
| 841 |
send2(CIRCLE_ACTION_EXIST,robotid); |
|
| 842 |
beacon_State=2; |
|
| 843 |
break; |
|
| 705 | 844 |
|
| 706 |
/* 2. Count the number of the EDGE robots *******NOTE: at most 1000 times of loop ****** */ |
|
| 707 |
case 2: |
|
| 708 |
waitingCounter++; |
|
| 709 |
orb1_set_color(YELLOW); |
|
| 710 |
orb2_set_color(BLUE); |
|
| 711 |
packet_data=wl_basic_do_default(&data_length); |
|
| 845 |
/* 2. Count the number of the EDGE robots |
|
| 846 |
*******NOTE: at most 1000 times of loop ****** */ |
|
| 847 |
case 2: |
|
| 848 |
waitingCounter++; |
|
| 849 |
orb1_set_color(YELLOW); |
|
| 850 |
orb2_set_color(BLUE); |
|
| 851 |
packet_data=wl_basic_do_default(&data_length); |
|
| 712 | 852 |
|
| 713 |
if(packet_data!=0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_ACK) |
|
| 714 |
{
|
|
| 715 |
orb_set_color(RED); |
|
| 716 |
orb2_set_color(BLUE); |
|
| 717 |
//only add to robots seen if you haven't gotten an ACK from this robot |
|
| 718 |
if(used[packet_data[1]]==0) |
|
| 719 |
{
|
|
| 720 |
robotsReceived++; |
|
| 721 |
used[packet_data[1]] = 1; |
|
| 853 |
if(packet_data!=0 && data_length>=2 && |
|
| 854 |
packet_data[0]==CIRCLE_ACTION_ACK) |
|
| 855 |
{
|
|
| 856 |
orb_set_color(RED); |
|
| 857 |
orb2_set_color(BLUE); |
|
| 858 |
// only add to list seen if you haven't |
|
| 859 |
// gotten an ACK from this robot |
|
| 860 |
if(used[packet_data[1]]==0) |
|
| 861 |
{
|
|
| 862 |
robotsReceived++; |
|
| 863 |
used[packet_data[1]] = 1; |
|
| 722 | 864 |
|
| 723 |
usb_puts("Added: ");
|
|
| 724 |
usb_puti(packet_data[1]); |
|
| 725 |
usb_puts("\r\n");
|
|
| 726 |
} |
|
| 865 |
usb_puts("Added: ");
|
|
| 866 |
usb_puti(packet_data[1]); |
|
| 867 |
usb_puts("\r\n");
|
|
| 868 |
} |
|
| 727 | 869 |
|
| 728 |
// NEW: sends a packet to each robot it receives telling them to be done. |
|
| 729 |
send2(CIRCLE_ACTION_GOTYOU,packet_data[1]); |
|
| 730 |
} |
|
| 731 |
if(waitingCounter >= 300){
|
|
| 732 |
beacon_State=3; |
|
| 733 |
} |
|
| 734 |
break; |
|
| 735 |
|
|
| 736 |
/* COUNTing is DONE. Sending DONE package. */ |
|
| 737 |
case 3: |
|
| 738 |
blink(robotsReceived); |
|
| 739 |
orb_set_color(GREEN); |
|
| 740 |
send2(CIRCLE_ACTION_DONE, robotid); |
|
| 741 |
state = 2; |
|
| 742 |
break; |
|
| 870 |
// NEW: sends a packet to each robot it |
|
| 871 |
// receives telling them to be done. |
|
| 872 |
send2(CIRCLE_ACTION_GOTYOU, |
|
| 873 |
packet_data[1]); |
|
| 743 | 874 |
} |
| 875 |
if(waitingCounter >= 300) |
|
| 876 |
{
|
|
| 877 |
beacon_State=3; |
|
| 878 |
} |
|
| 879 |
break; |
|
| 744 | 880 |
|
| 881 |
/* COUNTing is DONE. Sending DONE package. */ |
|
| 882 |
case 3: |
|
| 883 |
blink(robotsReceived); |
|
| 884 |
orb_set_color(GREEN); |
|
| 885 |
send2(CIRCLE_ACTION_DONE, robotid); |
|
| 886 |
state = 2; |
|
| 745 | 887 |
break; |
| 888 |
} |
|
| 746 | 889 |
|
| 747 |
/* The CIRCLEUP method for BEACON */ |
|
| 748 |
case 21: |
|
| 890 |
break; |
|
| 749 | 891 |
|
| 750 |
switch(beacon_State) |
|
| 892 |
/* The CIRCLEUP method for BEACON */ |
|
| 893 |
case 21: |
|
| 894 |
|
|
| 895 |
switch(beacon_State) |
|
| 896 |
{
|
|
| 897 |
|
|
| 898 |
/* Wait for all the robots to get to right distance */ |
|
| 899 |
case 0: |
|
| 900 |
left(170); |
|
| 901 |
orb1_set_color(YELLOW); |
|
| 902 |
orb2_set_color(WHITE); |
|
| 903 |
|
|
| 904 |
numOk = 0; |
|
| 905 |
|
|
| 906 |
while(numOk<robotsReceived) |
|
| 751 | 907 |
{
|
| 752 |
|
|
| 753 |
/* Wait for all the robots to get to right distance/position */ |
|
| 754 |
case 0: |
|
| 755 |
left(170); |
|
| 756 |
orb1_set_color(YELLOW); |
|
| 757 |
orb2_set_color(WHITE); |
|
| 908 |
packet_data= |
|
| 909 |
wl_basic_do_default(&data_length); |
|
| 910 |
if(packet_data!=0 && data_length>=2 && |
|
| 911 |
packet_data[0]==CIRCLE_ACTION_ACK) |
|
| 912 |
{
|
|
| 913 |
numOk++; |
|
| 914 |
} |
|
| 915 |
} |
|
| 758 | 916 |
|
| 759 |
int numOk = 0; |
|
| 760 |
|
|
| 761 |
while(numOk<robotsReceived) |
|
| 762 |
{
|
|
| 763 |
packet_data=wl_basic_do_default(&data_length); |
|
| 764 |
if(packet_data!=0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_ACK) |
|
| 765 |
{
|
|
| 766 |
numOk++; |
|
| 767 |
} |
|
| 768 |
} |
|
| 769 |
|
|
| 770 |
state = 2; |
|
| 771 |
break; |
|
| 772 |
} |
|
| 773 |
|
|
| 917 |
state = 2; |
|
| 774 | 918 |
break; |
| 919 |
} |
|
| 775 | 920 |
|
| 921 |
break; |
|
| 776 | 922 |
|
| 777 |
/* The ORIENT code for the beacon */ |
|
| 778 |
case 22: |
|
| 779 | 923 |
|
| 780 |
switch(beacon_State) |
|
| 924 |
/* The ORIENT code for the beacon */ |
|
| 925 |
case 22: |
|
| 926 |
|
|
| 927 |
switch(beacon_State) |
|
| 928 |
{
|
|
| 929 |
/* Turns all the robots in the same direction */ |
|
| 930 |
case 0: |
|
| 931 |
stop(); |
|
| 932 |
bom_off(); |
|
| 933 |
orb_set_color(ORANGE); |
|
| 934 |
|
|
| 935 |
// for each robot, tells them to turn their bom |
|
| 936 |
// on, then tells them which way to face. |
|
| 937 |
for(int i=0; i < 17; i++) |
|
| 781 | 938 |
{
|
| 782 |
/* Turns all the robots in the same direction */ |
|
| 783 |
case 0: |
|
| 784 |
stop(); |
|
| 785 |
bom_off(); |
|
| 939 |
if(used[i] == 1) |
|
| 940 |
{
|
|
| 941 |
send2(CIRCLE_ACTION_GOTYOU, i); |
|
| 942 |
// waits for a response so it knows the |
|
| 943 |
// BOM is on. |
|
| 944 |
while(1) |
|
| 945 |
{
|
|
| 946 |
orb_set_color(RED); |
|
| 947 |
orb2_set_color(WHITE); |
|
| 948 |
packet_data=wl_basic_do_default( |
|
| 949 |
&data_length); |
|
| 950 |
if(packet_data!=0 && data_length>=2 |
|
| 951 |
&& packet_data[0]== |
|
| 952 |
CIRCLE_ACTION_ACK) |
|
| 953 |
{
|
|
| 786 | 954 |
orb_set_color(ORANGE); |
| 787 |
|
|
| 788 |
// for each robot, tells them to turn their bom on, then tells them which way they should face. |
|
| 789 |
for(int i=0; i < 17; i++) |
|
| 790 |
{
|
|
| 791 |
if(used[i] == 1) |
|
| 792 |
{
|
|
| 793 |
send2(CIRCLE_ACTION_GOTYOU, i); |
|
| 794 |
while(1) // waits for a response so it knows the BOM is on. |
|
| 795 |
{
|
|
| 796 |
orb_set_color(RED); |
|
| 797 |
orb2_set_color(WHITE); |
|
| 798 |
packet_data=wl_basic_do_default(&data_length); |
|
| 799 |
if(packet_data!=0 && data_length>=2 && packet_data[0]==CIRCLE_ACTION_ACK) |
|
| 800 |
{
|
|
| 801 |
orb_set_color(ORANGE); |
|
| 802 |
break; |
|
| 803 |
} |
|
| 804 |
} |
|
| 955 |
break; |
|
| 956 |
} |
|
| 957 |
} |
|
| 958 |
delay_ms(20); |
|
| 959 |
bom_refresh(BOM_ALL); |
|
| 960 |
direction = bom_get_max(); |
|
| 961 |
|
|
| 962 |
direction += 8; |
|
| 963 |
if(direction > 15) direction -= 16; |
|
| 805 | 964 |
|
| 806 |
bom_refresh(BOM_ALL); |
|
| 807 |
direction = bom_get_max(); |
|
| 808 |
direction += 8; |
|
| 809 |
if(direction > 15) direction -= 16; |
|
| 810 |
send3(CIRCLE_ACTION_GOTYOU, i, direction); |
|
| 811 |
delay_ms(20); |
|
| 812 |
} |
|
| 813 |
} |
|
| 814 |
beacon_State = 1; |
|
| 815 |
break; |
|
| 965 |
delay_ms(20); |
|
| 816 | 966 |
|
| 817 |
/* Sends a DONE packet to signify that it has read in all the robots' directions and sent packets. |
|
| 818 |
Edge robots should now turn to face the right direction. */ |
|
| 819 |
case 1: |
|
| 820 |
send2(CIRCLE_ACTION_DONE,robotid); |
|
| 821 |
bom_on(); |
|
| 822 |
state = 2; |
|
| 823 |
break; |
|
| 967 |
send3(CIRCLE_ACTION_GOTYOU, i, |
|
| 968 |
direction); |
|
| 969 |
|
|
| 970 |
delay_ms(20); |
|
| 971 |
} |
|
| 824 | 972 |
} |
| 973 |
beacon_State = 1; |
|
| 974 |
break; |
|
| 975 |
|
|
| 976 |
/* |
|
| 977 |
Sends a DONE packet to signify that it has read in all |
|
| 978 |
the robots' directions and sent packets. |
|
| 979 |
Edge robots should now turn to face the right direction. |
|
| 980 |
*/ |
|
| 981 |
case 1: |
|
| 982 |
send2(CIRCLE_ACTION_DONE,robotid); |
|
| 983 |
bom_on(); |
|
| 984 |
beacon_State = 2; |
|
| 985 |
break; |
|
| 986 |
|
|
| 987 |
case 2: |
|
| 988 |
numOk = 0; |
|
| 825 | 989 |
|
| 990 |
while(numOk < robotsReceived) |
|
| 991 |
{
|
|
| 992 |
orb_set_color(ORANGE); |
|
| 993 |
packet_data=wl_basic_do_default( |
|
| 994 |
&data_length); |
|
| 995 |
|
|
| 996 |
if(packet_data!=0 && data_length>=2 && |
|
| 997 |
packet_data[0]==CIRCLE_ACTION_DONE) |
|
| 998 |
{
|
|
| 999 |
numOk++; |
|
| 1000 |
} |
|
| 1001 |
} |
|
| 1002 |
state = 2; |
|
| 826 | 1003 |
break; |
| 1004 |
} |
|
| 827 | 1005 |
|
| 1006 |
break; |
|
| 828 | 1007 |
|
| 829 |
/* The DRIVE code for the beacon */ |
|
| 830 |
case 23: |
|
| 831 | 1008 |
|
| 832 |
switch(beacon_State) |
|
| 833 |
{
|
|
| 1009 |
/* The DRIVE code for the beacon */ |
|
| 1010 |
case 23: |
|
| 834 | 1011 |
|
| 835 |
/* Tells the robots to move forward and moves itself. */ |
|
| 836 |
case 0: |
|
| 837 |
orb_set_color(YELLOW); |
|
| 838 |
delay_ms(5000); |
|
| 1012 |
switch(beacon_State) |
|
| 1013 |
{
|
|
| 839 | 1014 |
|
| 840 |
// format: type of ack, speed divided by 10, time in seconds. |
|
| 841 |
send3(CIRCLE_ACTION_FORWARD,20,2); |
|
| 842 |
orb_set_color(BLUE); |
|
| 843 |
forward(200); |
|
| 844 |
delay_ms(2000); |
|
| 845 |
stop(); |
|
| 846 |
beacon_State = 1; |
|
| 847 |
break; |
|
| 1015 |
/* Tells the robots to move forward and moves itself. */ |
|
| 1016 |
case 0: |
|
| 1017 |
orb_set_color(YELLOW); |
|
| 1018 |
delay_ms(50); |
|
| 848 | 1019 |
|
| 849 |
/* Terminal. */ |
|
| 850 |
case 1: |
|
| 851 |
stop(); |
|
| 852 |
state = 2; |
|
| 853 |
break; |
|
| 854 |
} |
|
| 1020 |
// format: type of ack, speed divided by 10, |
|
| 1021 |
// time in seconds. |
|
| 1022 |
send3(CIRCLE_ACTION_FORWARD,speed,duration); |
|
| 1023 |
orb_set_color(BLUE); |
|
| 1024 |
forward(speed*10); |
|
| 1025 |
delay_ms(duration*1000); |
|
| 1026 |
stop(); |
|
| 1027 |
beacon_State = 1; |
|
| 855 | 1028 |
break; |
| 856 | 1029 |
|
| 857 |
//*********************************************************************************************************************************************************************************** |
|
| 858 |
|
|
| 1030 |
/* Terminal. */ |
|
| 1031 |
case 1: |
|
| 1032 |
stop(); |
|
| 1033 |
state = 2; |
|
| 1034 |
break; |
|
| 1035 |
} |
|
| 1036 |
break; |
|
| 1037 |
|
|
| 1038 |
/* The TURNL code for the beacon */ |
|
| 1039 |
case 24: |
|
| 1040 |
|
|
| 1041 |
orb_set_color(YELLOW); |
|
| 1042 |
delay_ms(50); |
|
| 1043 |
|
|
| 1044 |
// format: type of ack, speed divided by 10, |
|
| 1045 |
// time in seconds. |
|
| 1046 |
for(int i = 0 ; i < 5; i++) |
|
| 1047 |
send3(CIRCLE_ACTION_TURN,speed,duration); |
|
| 1048 |
orb_set_color(BLUE); |
|
| 1049 |
left(speed*10); |
|
| 1050 |
delay_ms(duration*1000); |
|
| 1051 |
stop(); |
|
| 1052 |
state = 2; |
|
| 1053 |
|
|
| 1054 |
break; |
|
| 1055 |
|
|
| 1056 |
/* The TURNR code for the beacon */ |
|
| 1057 |
case 25: |
|
| 1058 |
|
|
| 1059 |
orb_set_color(YELLOW); |
|
| 1060 |
delay_ms(50); |
|
| 1061 |
|
|
| 1062 |
// format: type of ack, speed divided by 10, |
|
| 1063 |
// time in seconds. |
|
| 1064 |
for(int i = 0 ; i < 5; i++) |
|
| 1065 |
send3(CIRCLE_ACTION_TURN,speed,duration); |
|
| 1066 |
orb_set_color(BLUE); |
|
| 1067 |
right(speed*10); |
|
| 1068 |
delay_ms(duration*1000); |
|
| 1069 |
stop(); |
|
| 1070 |
state = 2; |
|
| 1071 |
|
|
| 1072 |
break; |
|
| 1073 |
|
|
| 1074 |
|
|
| 1075 |
//****************************************************************************** |
|
| 1076 |
//****************************************************************************** |
|
| 1077 |
|
|
| 859 | 1078 |
} // ends the main switch |
| 860 | 1079 |
} // ends the main while loop |
| 861 | 1080 |
|
| 862 |
orb_set_color(RED); // error, we should never break from the while loop! |
|
| 1081 |
// error, we should never break from the while loop! |
|
| 1082 |
orb_set_color(RED); |
|
| 863 | 1083 |
|
| 864 |
while(1); /* END HERE, just in case something happened. This way we can see the red orb. */ |
|
| 1084 |
/* |
|
| 1085 |
END HERE, just in case something happened. |
|
| 1086 |
This way we can see the red orb. |
|
| 1087 |
*/ |
|
| 1088 |
while(1); |
|
| 865 | 1089 |
} |
| 866 |
|
|
| 867 |
|
|
Also available in: Unified diff