Revision 683
Joystick control works using xbee_putc
joystick.c | ||
---|---|---|
1 | 1 |
#include <dragonfly_lib.h> |
2 | 2 |
#include <wireless.h> |
3 |
#include <wl_defs.h> |
|
3 | 4 |
#include "../../common/colonet_defs.h" |
5 |
#include <serial.h> |
|
6 |
#include <stdio.h> |
|
4 | 7 |
|
5 |
#define IS_TRIGGER_DOWN(status) (status & (1)) |
|
6 |
#define IS_BUTTON_DOWN(status) (status & (1<<1)) |
|
7 |
#define IS_RIGHT(status) (status & (1<<2)) |
|
8 |
#define IS_X_CENTER(status) (status & (1<<3)) |
|
9 |
#define IS_LEFT(status) (status & (1<<4)) |
|
10 |
#define IS_DOWN(status) (status & (1<<5)) |
|
11 |
#define IS_Y_CENTER(status) (status & (1<<6)) |
|
12 |
#define IS_UP(status) (status & (1<<7)) |
|
8 |
/* Current state codes */ |
|
9 |
#define TRIGGER_DOWN 1 |
|
10 |
#define TRIGGER_UP (1<<1) |
|
11 |
#define BUTTON_DOWN (1<<2) |
|
12 |
#define BUTTON_UP (1<<3) |
|
13 |
#define X_LEFT (1<<4) |
|
14 |
#define X_CENTER (1<<5) |
|
15 |
#define X_RIGHT (1<<6) |
|
16 |
#define Y_UP (1<<7) |
|
17 |
#define Y_CENTER (1<<8) |
|
18 |
#define Y_DOWN (1<<9) |
|
13 | 19 |
|
20 |
/* State change codes */ |
|
14 | 21 |
#define TRIGGER_PRESSED 1 |
15 | 22 |
#define TRIGGER_RELEASED (1<<1) |
16 | 23 |
#define BUTTON_PRESSED (1<<2) |
17 | 24 |
#define BUTTON_RELEASED (1<<3) |
18 | 25 |
#define MOVED_LEFT (1<<4) |
19 |
#define MOVED_CENTER_X (1<<5)
|
|
26 |
#define MOVED_X_CENTER (1<<5)
|
|
20 | 27 |
#define MOVED_RIGHT (1<<6) |
21 | 28 |
#define MOVED_UP (1<<7) |
22 |
#define MOVED_CENTER_Y (1<<8)
|
|
29 |
#define MOVED_Y_CENTER (1<<8)
|
|
23 | 30 |
#define MOVED_DOWN (1<<9) |
24 | 31 |
|
25 | 32 |
int joystick_status (void); |
26 | 33 |
int joystick_change (int old, int new); |
27 | 34 |
|
28 |
int last_status = 0; |
|
29 |
int cur_status = 0; |
|
30 |
|
|
31 | 35 |
int main (void) { |
32 | 36 |
dragonfly_init(SERIAL | USB | COMM | ORB | ANALOG); |
33 |
ADCSRA = 0; |
|
34 |
ADCSRA |= _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); |
|
35 |
orb_set_color(BLUE); |
|
37 |
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); |
|
38 |
xbee_init(); |
|
39 |
|
|
40 |
orb_set_color(BLUE); |
|
36 | 41 |
|
37 |
int status, change; |
|
42 |
int change; |
|
43 |
int last_status = 0; |
|
44 |
int cur_status = 0; |
|
45 |
|
|
38 | 46 |
while (1) { |
39 | 47 |
last_status = cur_status; |
40 | 48 |
cur_status = joystick_status(); |
41 |
change = joystick_change(old_status, cur_status); |
|
42 |
if (change | TRIGGER_PRESSED) |
|
49 |
change = joystick_change(last_status, cur_status); |
|
50 |
|
|
51 |
char buf[100]; |
|
52 |
sprintf(buf, "status: %d\n", cur_status); |
|
53 |
usb_puts(buf); |
|
54 |
|
|
55 |
if (change & MOVED_UP) { |
|
43 | 56 |
orb_set_color(GREEN); |
44 |
if (change | TRIGGER_RELEASED) |
|
57 |
xbee_putc('f'); |
|
58 |
} |
|
59 |
if (change & MOVED_Y_CENTER) { |
|
60 |
orb_set_color(RED); |
|
61 |
xbee_putc('s'); |
|
62 |
} |
|
63 |
if (change & MOVED_DOWN) { |
|
45 | 64 |
orb_set_color(BLUE); |
65 |
xbee_putc('b'); |
|
66 |
} |
|
67 |
if (change & MOVED_LEFT) { |
|
68 |
orb_set_color(ORANGE); |
|
69 |
xbee_putc('l'); |
|
70 |
} |
|
71 |
if (change & MOVED_X_CENTER) { |
|
72 |
orb_set_color(RED); |
|
73 |
xbee_putc('s'); |
|
74 |
} |
|
75 |
if (change & MOVED_RIGHT) { |
|
76 |
orb_set_color(YELLOW); |
|
77 |
xbee_putc('r'); |
|
78 |
} |
|
79 |
if (change & TRIGGER_PRESSED) { |
|
80 |
orb_set_color(PURPLE); |
|
81 |
xbee_putc('t'); |
|
82 |
} |
|
83 |
if (change & BUTTON_PRESSED) { |
|
84 |
orb_set_color(YELLOW); |
|
85 |
xbee_putc('u'); |
|
86 |
} |
|
46 | 87 |
delay_ms(100); |
47 | 88 |
} |
48 | 89 |
|
... | ... | |
54 | 95 |
int x_change = 0; |
55 | 96 |
int y_change = 0; |
56 | 97 |
/* Check for trigger change */ |
57 |
if (TRIGGER_DOWN(old) && !TRIGGER_DOWN(new))
|
|
98 |
if ((old & TRIGGER_DOWN) && (new & TRIGGER_UP))
|
|
58 | 99 |
trigger_change = TRIGGER_RELEASED; |
59 |
if (!TRIGGER_DOWN(old) && TRIGGER_DOWN(new))
|
|
100 |
if ((old & TRIGGER_UP) && (new & TRIGGER_DOWN))
|
|
60 | 101 |
trigger_change = TRIGGER_PRESSED; |
61 | 102 |
/* Check for button change */ |
62 |
if (BUTTON_DOWN(old) && !BUTTON_DOWN(new))
|
|
103 |
if ((old & BUTTON_DOWN) && (new & BUTTON_UP))
|
|
63 | 104 |
button_change = BUTTON_RELEASED; |
64 |
if (!BUTTON_DOWN(old) && BUTTON_DOWN(new))
|
|
105 |
if ((old & BUTTON_UP) && (new & BUTTON_DOWN))
|
|
65 | 106 |
button_change = BUTTON_PRESSED; |
66 | 107 |
/* Check for X change */ |
67 |
if (IS_X_CENTER(old) && IS_RIGHT(new))
|
|
68 |
x_change = MOVE_RIGHT; |
|
69 |
if (IS_X_CENTER(old) && IS_LEFT(new))
|
|
70 |
x_change = MOVE_LEFT; |
|
71 |
if (!IS_X_CENTER(old) && IS_X_CENTER(new))
|
|
72 |
x_change = MOVE_X_CENTER; |
|
108 |
if ((old & X_CENTER) && (new & X_RIGHT))
|
|
109 |
x_change = MOVED_RIGHT;
|
|
110 |
if ((old & X_CENTER) && (new & X_LEFT))
|
|
111 |
x_change = MOVED_LEFT;
|
|
112 |
if (!(old & X_CENTER) && (new & X_CENTER))
|
|
113 |
x_change = MOVED_X_CENTER;
|
|
73 | 114 |
/* Check for Y change */ |
74 |
if (IS_Y_CENTER(old) && IS_UP(new))
|
|
75 |
y_change = MOVE_UP; |
|
76 |
if (IS_Y_CENTER(old) && IS_DOWN(new))
|
|
77 |
y_change = MOVE_DOWN; |
|
78 |
if (!IS_Y_CENTER(old) && IS_Y_CENTER(new))
|
|
79 |
y_change = MOVE_Y_CENTER; |
|
115 |
if ((old & Y_CENTER) && (new & Y_UP))
|
|
116 |
y_change = MOVED_UP;
|
|
117 |
if ((old & Y_CENTER) && (new & Y_DOWN))
|
|
118 |
y_change = MOVED_DOWN;
|
|
119 |
if (!(old & Y_CENTER) && (new & Y_CENTER))
|
|
120 |
y_change = MOVED_Y_CENTER;
|
|
80 | 121 |
return trigger_change | button_change | x_change | y_change; |
81 | 122 |
} |
82 | 123 |
|
83 | 124 |
/** |
84 | 125 |
* Get the current status of the joystick. |
85 | 126 |
* This includes the X and Y axes and the buttons. |
86 |
* Whenever this is called, the status is saved as part of the state. |
|
87 | 127 |
*/ |
88 | 128 |
int joystick_status (void) { |
89 | 129 |
int trigger_status = 0; |
90 | 130 |
int button_status = 0; |
91 |
/* For x and y status, use three LSB one-hot as follows: [L|C|R] and [U|C|D] */ |
|
92 | 131 |
int x_status = 0; |
93 | 132 |
int y_status = 0; |
94 | 133 |
int xval, yval; |
95 |
|
|
96 |
char buf[100]; |
|
97 |
|
|
98 |
/* |
|
99 |
sprintf(buf, "trigger: %d \t button: %d \t X: %d \t Y: %d \n", |
|
100 |
analog_get8(AN0), analog_get8(AN1), |
|
101 |
analog_get8(AN4), analog_get8(AN5)); |
|
102 |
usb_puts(buf); |
|
103 |
*/ |
|
104 | 134 |
|
105 |
if (trigger_status == 0 && analog_get8(AN0) > 200) { |
|
106 |
trigger_status = 1; |
|
107 |
sprintf(buf, "Trigger pressed\n"); |
|
108 |
usb_puts(buf); |
|
109 |
} |
|
110 |
if (trigger_status == 1 && analog_get8(AN0) < 100) { |
|
111 |
trigger_status = 0; |
|
112 |
sprintf(buf, "Trigger released\n"); |
|
113 |
usb_puts(buf); |
|
114 |
} |
|
115 |
if (button_status == 0 && analog_get8(AN1) > 200) { |
|
116 |
button_status = 1; |
|
117 |
sprintf(buf, "Button pressed\n"); |
|
118 |
usb_puts(buf); |
|
119 |
} |
|
120 |
if (button_status == 1 && analog_get8(AN1) < 100) { |
|
121 |
button_status = 0; |
|
122 |
sprintf(buf, "Button released\n"); |
|
123 |
usb_puts(buf); |
|
124 |
} |
|
135 |
if (analog_get8(AN0) > 200) |
|
136 |
trigger_status = TRIGGER_DOWN; |
|
137 |
else |
|
138 |
trigger_status = TRIGGER_UP; |
|
139 |
|
|
140 |
if (analog_get8(AN1) > 200) |
|
141 |
button_status = BUTTON_DOWN; |
|
142 |
else |
|
143 |
button_status = BUTTON_UP; |
|
125 | 144 |
|
126 | 145 |
xval = analog_get8(AN4); |
127 | 146 |
yval = analog_get8(AN5); |
128 | 147 |
|
129 |
if (x_status == 0 && xval > 150) { |
|
130 |
x_status = 1<<2; |
|
131 |
sprintf(buf, "moved left\n"); |
|
132 |
usb_puts(buf); |
|
133 |
} |
|
134 |
else if (x_status == 0 && xval < 75) { |
|
135 |
x_status = 1; |
|
136 |
sprintf(buf, "moved right\n"); |
|
137 |
usb_puts(buf); |
|
138 |
} |
|
139 |
else if (x_status == 1 && xval > 75) { |
|
140 |
x_status = 1<<1; |
|
141 |
sprintf(buf, "centered x\n"); |
|
142 |
usb_puts(buf); |
|
143 |
} |
|
144 |
else if (x_status == -1 && xval < 150) { |
|
145 |
x_status = 1<<1; |
|
146 |
sprintf(buf, "centered x\n"); |
|
147 |
usb_puts(buf); |
|
148 |
} |
|
148 |
if (xval > 150) |
|
149 |
x_status = X_LEFT; |
|
150 |
else if (xval < 75) |
|
151 |
x_status = X_RIGHT; |
|
152 |
else |
|
153 |
x_status = X_CENTER; |
|
149 | 154 |
|
150 |
if (y_status == 0 && yval > 150) { |
|
151 |
y_status = 1<<3; |
|
152 |
sprintf(buf, "moved up\n"); |
|
153 |
usb_puts(buf); |
|
154 |
} |
|
155 |
else if (y_status == 0 && yval < 75) { |
|
156 |
y_status = 1; |
|
157 |
sprintf(buf, "moved down\n"); |
|
158 |
usb_puts(buf); |
|
159 |
} |
|
160 |
else if (y_status == 1 && yval > 75) { |
|
161 |
y_status = 1<<1; |
|
162 |
sprintf(buf, "centered y\n"); |
|
163 |
usb_puts(buf); |
|
164 |
} |
|
165 |
else if (y_status == -1 && yval < 150) { |
|
166 |
y_status = 1<<1; |
|
167 |
sprintf(buf, "centered y\n"); |
|
168 |
usb_puts(buf); |
|
169 |
} |
|
155 |
if (yval > 150) |
|
156 |
y_status = Y_UP; |
|
157 |
else if (yval < 75) |
|
158 |
y_status = Y_DOWN; |
|
159 |
else |
|
160 |
y_status = Y_CENTER; |
|
170 | 161 |
|
171 |
return trigger_status | (button_status << 1) | (x_status << 2) | (y_status << 5); |
|
162 |
|
|
163 |
return trigger_status | button_status | x_status | y_status; |
|
172 | 164 |
} |
Also available in: Unified diff