root / trunk / code / projects / colonet / robot / joystick / joystick.c @ 682
History | View | Annotate | Download (4.69 KB)
1 |
#include <dragonfly_lib.h> |
---|---|
2 |
#include <wireless.h> |
3 |
#include "../../common/colonet_defs.h" |
4 |
|
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)) |
13 |
|
14 |
#define TRIGGER_PRESSED 1 |
15 |
#define TRIGGER_RELEASED (1<<1) |
16 |
#define BUTTON_PRESSED (1<<2) |
17 |
#define BUTTON_RELEASED (1<<3) |
18 |
#define MOVED_LEFT (1<<4) |
19 |
#define MOVED_CENTER_X (1<<5) |
20 |
#define MOVED_RIGHT (1<<6) |
21 |
#define MOVED_UP (1<<7) |
22 |
#define MOVED_CENTER_Y (1<<8) |
23 |
#define MOVED_DOWN (1<<9) |
24 |
|
25 |
int joystick_status (void); |
26 |
int joystick_change (int old, int new); |
27 |
|
28 |
int last_status = 0; |
29 |
int cur_status = 0; |
30 |
|
31 |
int main (void) { |
32 |
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); |
36 |
|
37 |
int status, change;
|
38 |
while (1) { |
39 |
last_status = cur_status; |
40 |
cur_status = joystick_status(); |
41 |
change = joystick_change(old_status, cur_status); |
42 |
if (change | TRIGGER_PRESSED)
|
43 |
orb_set_color(GREEN); |
44 |
if (change | TRIGGER_RELEASED)
|
45 |
orb_set_color(BLUE); |
46 |
delay_ms(100);
|
47 |
} |
48 |
|
49 |
} |
50 |
|
51 |
int joystick_change (int old, int new) { |
52 |
int trigger_change = 0; |
53 |
int button_change = 0; |
54 |
int x_change = 0; |
55 |
int y_change = 0; |
56 |
/* Check for trigger change */
|
57 |
if (TRIGGER_DOWN(old) && !TRIGGER_DOWN(new))
|
58 |
trigger_change = TRIGGER_RELEASED; |
59 |
if (!TRIGGER_DOWN(old) && TRIGGER_DOWN(new))
|
60 |
trigger_change = TRIGGER_PRESSED; |
61 |
/* Check for button change */
|
62 |
if (BUTTON_DOWN(old) && !BUTTON_DOWN(new))
|
63 |
button_change = BUTTON_RELEASED; |
64 |
if (!BUTTON_DOWN(old) && BUTTON_DOWN(new))
|
65 |
button_change = BUTTON_PRESSED; |
66 |
/* 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; |
73 |
/* 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; |
80 |
return trigger_change | button_change | x_change | y_change;
|
81 |
} |
82 |
|
83 |
/**
|
84 |
* Get the current status of the joystick.
|
85 |
* 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 |
*/
|
88 |
int joystick_status (void) { |
89 |
int trigger_status = 0; |
90 |
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 |
int x_status = 0; |
93 |
int y_status = 0; |
94 |
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 |
|
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 |
} |
125 |
|
126 |
xval = analog_get8(AN4); |
127 |
yval = analog_get8(AN5); |
128 |
|
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 |
} |
149 |
|
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 |
} |
170 |
|
171 |
return trigger_status | (button_status << 1) | (x_status << 2) | (y_status << 5); |
172 |
} |