Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / mapping / robot / robot_main.c @ 979

History | View | Annotate | Download (4.14 KB)

1
#include <dragonfly_lib.h>
2
#include <wireless.h>
3
#include <encoders.h>
4
#include "odometry.h"
5

    
6
#define CHAN 0xE
7

    
8
#define POLLING_INTERVAL 50    //interval in ms to get sensor data
9
#define MAP 1        // packet group for sending data points
10
#define POINT_ODO 2
11

    
12
#define WL_CNTL_GROUP 4
13

    
14
#define CNTL_FORWARD 0
15
#define CNTL_BACK    1
16
#define CNTL_LEFT    2
17
#define CNTL_RIGHT   3
18
#define CNTL_LEFT_CURVE 4
19
#define CNTL_RIGHT_CURVE 5
20
#define CNTL_STOP    6
21
#define CNTL_VEL_UP  7
22
#define CNTL_VEL_DOWN 8
23

    
24
int state;
25
int velocity;
26
char buf[100];
27

    
28
void packet_receive (char type, int source, unsigned char* packet, int length);
29
void set_motion (void);
30

    
31
PacketGroupHandler packetHandler = {WL_CNTL_GROUP, NULL, NULL, &packet_receive, NULL};
32

    
33
int main(void)
34
{
35
    /* initialize components and join the token ring */
36
    dragonfly_init(ALL_ON);
37
    odometry_init(); // breaks motors (interrupt-related?)
38
    orb_enable();
39
    wl_init();
40
    wl_set_channel(CHAN);
41
    wl_register_packet_group(&packetHandler);
42
   
43
    // initial control values
44
    velocity = 190;
45
    state = CNTL_STOP;
46
    
47
    // use when sending odometry data
48
    int x, y;
49
    double theta;
50

    
51
    int store[9];
52
    char *send;   // for transmission
53

    
54
    while(1)
55
    {
56
        wl_do();
57
        delay_ms(POLLING_INTERVAL);        // until it's time to grab map data
58
        x = odometry_dx(); // use when sending odometry data
59
        y = odometry_dy();
60
        theta = odometry_angle();
61
        store[0] = x;
62
        store[1] = y;
63
        *((double*)(store + 2)) = theta;
64
        store[4] = range_read_distance(IR1);        // IR1 range
65
        store[5] = range_read_distance(IR2);        // IR2 range
66
        store[6] = range_read_distance(IR3);        // IR3 range
67
        store[7] = range_read_distance(IR4);        // IR4 range
68
        store[8] = range_read_distance(IR5);        // IR5 range
69
        sprintf( buf, "%d %d %f %d %d %d %d %d\n", store[0], store[1],
70
                 *((double *)(store+2)), store[4], store[5], store[6],
71
                 store[7], store[8] );
72
        usb_puts(buf);
73

    
74
        send = (char*) store;
75

    
76
        wl_send_global_packet(MAP, POINT_ODO, send, 18, 0);
77
    }
78

    
79
    wl_terminate();
80
    return 0;
81
}
82

    
83
void packet_receive (char type, int source, unsigned char* packet, int length) {
84
    sprintf(buf, "received packet: %d\n", type);
85
    usb_puts(buf);
86
    switch (type) {
87
        case CNTL_FORWARD:
88
            state = CNTL_FORWARD;
89
            break;
90
        case CNTL_BACK:
91
            state = CNTL_BACK;
92
            break;
93
        case CNTL_LEFT:
94
            state = CNTL_LEFT;
95
            break;
96
        case CNTL_RIGHT:
97
            state = CNTL_RIGHT;
98
            break;
99
        case CNTL_LEFT_CURVE:
100
            state = CNTL_LEFT_CURVE;
101
            break;
102
        case CNTL_RIGHT_CURVE:
103
            state = CNTL_RIGHT_CURVE;
104
            break;
105
        case CNTL_STOP:
106
            state = CNTL_STOP;
107
            break;
108
        case CNTL_VEL_UP:
109
            if (velocity > 250)
110
                velocity = 250;
111
            else
112
                velocity += 5;
113
            break;
114
        case CNTL_VEL_DOWN:
115
            velocity -= 5;
116
            if (velocity < 150)
117
                velocity = 150;
118
            break;
119
        default:
120
            state = CNTL_STOP;
121
            break;
122
    }
123
    set_motion();
124
}
125

    
126
void set_motion (void) {
127
    switch (state) {
128
        case CNTL_FORWARD:
129
            orb_set_color(GREEN);
130
            move(velocity, 0);
131
            break;
132
        case CNTL_BACK:
133
            orb_set_color(BLUE);
134
            move(-velocity, 0);
135
            break;
136
        case CNTL_LEFT:
137
            orb_set_color(ORANGE);
138
            motor1_set(0, velocity);
139
            motor2_set(1, velocity);
140
            break;
141
        case CNTL_RIGHT:
142
            orb_set_color(YELLOW);
143
            motor1_set(1, velocity);
144
            motor2_set(0, velocity);
145
            break;
146
        case CNTL_LEFT_CURVE:
147
            orb_set_color(MAGENTA);
148
            motor1_set(1, 150);
149
            motor2_set(1, velocity);
150
            break;
151
        case CNTL_RIGHT_CURVE:
152
            orb_set_color(CYAN);
153
            motor1_set(1, velocity);
154
            motor2_set(1, 150);
155
            break;
156
        case CNTL_STOP:
157
            orb_set_color(RED);
158
            move(0, 0);
159
            break;
160
    }
161
}
162