root / trunk / code / projects / colonet / robot / joystick / joystick.c @ 682
History | View | Annotate | Download (4.69 KB)
1 | 682 | gtress | #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 | } |