Project

General

Profile

Statistics
| Revision:

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
}