Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / hunter_prey / main.c @ 1410

History | View | Annotate | Download (4.36 KB)

1
#include <dragonfly_lib.h>
2
#include <wireless.h>
3
#include <wl_basic.h>
4
#include "smart_run_around_fsm.h"
5

    
6
#define CHAN 0xF
7
#define TAG_TIME 5
8
#define TAG_RANGE 150
9
#define TAG_PAUSE 2000
10

    
11
#define ROBOT_HUNTER 0
12
#define ROBOT_PREY 1
13
#define ROBOT_TAGGED 2
14

    
15
void packet_receive(char type, int source, unsigned char* packet, int length);
16

    
17
volatile uint8_t robotState = ROBOT_HUNTER;
18
volatile uint8_t color;
19
volatile uint8_t tagAck;
20
volatile uint8_t tagger;
21
uint8_t id;
22

    
23
void test_bom() {
24
  int i;
25
  int val;
26

    
27
  while(1) {
28
    bom_refresh(BOM_ALL);
29

    
30
    for(i=0; i<16; i++) {
31
      val = bom_get(i);
32
      usb_puti(val);
33
      usb_putc(' ');
34
    }
35

    
36
    usb_puts("| ");
37

    
38
    usb_puti(range_read_distance (IR1));
39
    usb_putc(' ');
40
    usb_puti(range_read_distance (IR2));
41
    usb_putc(' ');
42
    usb_puti(range_read_distance (IR3));
43
    usb_putc(' ');
44
    usb_puti(range_read_distance (IR4));
45
    usb_putc(' ');
46
    usb_puti(range_read_distance (IR5));
47

    
48
    usb_putc('\n');
49
    delay_ms(500);
50
  }
51

    
52
}
53

    
54
void chase(uint8_t angle) {
55

    
56
  int omega = angle - 4;
57

    
58
  if(angle > 16)
59
    return;
60

    
61
  if(omega >  8)
62
    omega = omega - 16;
63

    
64
  omega *= 255/8;
65

    
66
/*   usb_puti(omega); */
67
/*   usb_putc('\n'); */
68

    
69
  move(140, omega);
70

    
71
}
72

    
73
int main(void) {
74

    
75
  int frontRange;
76
  uint8_t angle;
77
  uint8_t i;
78
  int onTarget = 0;
79
  char packet[2];
80
  uint8_t bom = 0;
81
  
82
  //intialize the robot and wireless
83
  dragonfly_init(ALL_ON);
84

    
85
  //  test_bom();
86

    
87
  id = get_robotid();
88
  packet[1] = id;
89
  usb_puts("hello, I am robot \n");
90
  usb_puti(id);
91
  usb_putc('\n');
92

    
93
  usb_puts("wireless.\n");
94

    
95
  wl_basic_init(&packet_receive);
96

    
97
  usb_puts("run around.\n");
98

    
99
  run_around_init();
100

    
101
  usb_puts("channel\n");
102

    
103
  //use a specific channel to avoid interfering with other tasks
104
  wl_set_channel(CHAN);
105

    
106
  usb_puts("orb set\n");
107

    
108
  orb_set_color(BLUE);
109
  color = BLUE;
110

    
111
  //if button 2 is held, you are prey
112
  if(button2_read()) {
113
    robotState = ROBOT_PREY;
114
    bom_on();
115
  }
116

    
117

    
118
  while(1) {
119

    
120
    if(robotState==ROBOT_TAGGED) {
121
      usb_puts("tagged, waiting to send ACK\n");
122
      move(0,0);
123
      delay_ms(TAG_PAUSE);
124
      usb_puts("sending ACK to ");
125
      usb_puti(tagger);
126
      usb_putc('\n');
127
      packet[0] = 'A';
128
      packet[1] = tagger;
129
      wl_basic_send_global_packet (0, packet, 2);
130
      usb_puts("sent\n");
131
      move(0,0);
132
      robotState = ROBOT_HUNTER; //no longer prey
133
    }
134

    
135
    else if(robotState == ROBOT_PREY) {
136
      run_around_FSM();
137
    }
138

    
139
    else { //ROBOT_HUNTER
140

    
141
      bom_refresh(BOM_ALL);
142

    
143
      frontRange = range_read_distance (IR2);
144

    
145
/*       usb_puti(frontRange); */
146
/*       usb_putc(','); */
147

    
148
      //BUG: when get_max_bom is called, the rangefinder seems to stop
149
      //working
150
      angle = bom_get_max();
151
/*       usb_puti(angle); */
152
/*       usb_putc('\n'); */
153

    
154
      chase(angle);
155

    
156
      if(angle < 7 && angle > 1 && frontRange > 0 && frontRange < TAG_RANGE) {
157
        if(onTarget == 0) {
158
          onTarget = TAG_TIME;
159
          if(color != GREEN) {
160
            color = GREEN;
161
            orb_set_color(GREEN);
162
          }
163
          usb_puts("On target!\n");
164
        }
165
        else {
166
          if(--onTarget <= 0) {
167
            orb_set_color(YELLOW);
168
            color = YELLOW;
169
            usb_puts("TAG!\n");
170
            tagAck = 0;
171
            packet[0] = 'T';
172
            packet[1] = id;
173
            wl_basic_send_global_packet (0, packet, 2);
174
            move(0,0);
175
            while(!tagAck)
176
              wl_do();
177

    
178
            if(tagAck == id) { //if the ack was for us
179
              usb_puts("ACK!\n");
180
              //              delay_ms(TAG_PAUSE);
181
              robotState = ROBOT_PREY;
182
              bom_on();
183
            }
184
            else {
185
              usb_puts("ACK failed!\n");
186
            }
187
          }
188
        }
189
      }
190
      else{
191
        if(color != BLUE) {
192
          color = BLUE;
193
          orb_set_color(BLUE);
194
        }
195

    
196
        //don't reset onTarget because the robot got too close
197
        if(frontRange > 0)
198
          onTarget = 0;
199
      }
200

    
201
    }
202

    
203
    wl_do();
204
  }
205

    
206
  return 0;
207
}
208

    
209
void packet_receive(char type, int source, unsigned char* packet, int length)
210
{
211
  if(type==0 && length>=2){
212
    if(packet[0] == 'T') {
213
      if(robotState == ROBOT_PREY) {
214
        robotState = ROBOT_TAGGED;
215
        bom_off();
216
        color = BLUE;
217
        orb_set_color(BLUE);
218
        tagger = packet[1];
219
      }
220
      else {
221
        usb_puts("tagged, but I'm not it!\n");
222
      }
223
    }
224
    else if(packet[0] == 'A' && robotState == ROBOT_HUNTER) {
225
      tagAck = packet[1];
226
    }
227
    else {
228
      usb_puts("got '");
229
      usb_putc(packet[0]);
230
      usb_puti(packet[1]);
231
      usb_puts("'\n");
232
    }
233
  }
234
  else {
235
    usb_puts("got unkown packet! type=");
236
    usb_puti(type);
237
    usb_puts(" length=");
238
    usb_puti(length);
239
    usb_putc('\n');
240
  }
241
}
242