blob: 7a47a2f7427a84bac4112114c6fd863c196c25be [file] [log] [blame]
brians0ab60bb2013-01-31 02:21:51 +00001// ****************************************************************************
2// CopyLeft qwerk Robotics unINC. 2010 All Rights Reserved.
3// ****************************************************************************
4
5// ****************************************************************************
6// **************** IO Pin Setup
7// ****************************************************************************
8
9#include "FreeRTOS.h"
Austin Schuh63d0e9b2013-03-27 04:43:14 +000010#include "queue.h"
11#include "task.h"
12
13#include "analog.h"
brians0ab60bb2013-01-31 02:21:51 +000014
Brian Silvermand2411482013-03-28 21:36:32 -070015// How long (in ms) to wait after a falling edge on the bottom indexer sensor
16// before reading the indexer encoder.
17static const int kBottomFallDelayTime = 32;
18
Brian Silverman6ad00b82013-03-27 19:02:38 -070019void analog_init(void) {
20 // b[1:0] CAN RD1 p0.0
21 // b[3:2] CAN TD1 p0.1
22 //PINCON->PINSEL0 = 0x00000005;
brians0ab60bb2013-01-31 02:21:51 +000023
Brian Silverman6ad00b82013-03-27 19:02:38 -070024 // b[29:28] USB_DMIN p0.30
25 // b[27:26] USB_DPLUS p0.29
26 // b[21:20] AD0.3 p0.26
27 // b[19:18] AD0.2 p0.25
28 // PINCON->PINSEL1 = 0x14140000;
brians0ab60bb2013-01-31 02:21:51 +000029
Brian Silverman6ad00b82013-03-27 19:02:38 -070030 // PINCON->PINSEL2 = 0x0;
brians0ab60bb2013-01-31 02:21:51 +000031
Brian Silverman6ad00b82013-03-27 19:02:38 -070032 // b[31:30] AD0.5 p1.31
33 // b[29:28] V_BUS p1.30
34 // b[21:20] MCOB1 p1.26
35 // b[19:18] MCOA1 p1.25
36 // b[15:14] MCI1 p1.23
37 // b[13:12] MCOB0 p1.22
38 // b[09:08] MCI0 p1.20
39 // b[07:06] MCOA0 p1.19
40 // b[05:04] USB_UP_LED p1.18
41 //PINCON->PINSEL3 = 0xE0145150;
42 SC->PCONP |= PCONP_PCAD;
brians0ab60bb2013-01-31 02:21:51 +000043
Brian Silverman6ad00b82013-03-27 19:02:38 -070044 // Enable AD0.0, AD0.1, AD0.2, AD0.3
45 PINCON->PINSEL1 &= 0xFFC03FFF;
46 PINCON->PINSEL1 |= 0x00D54000;
47 ADC->ADCR = 0x00200500;
brians0ab60bb2013-01-31 02:21:51 +000048}
49
50// ****************************************************************************
51// **************** ADC Functions
52// ****************************************************************************
53
54
55// **************** macros
Brian Silverman6ad00b82013-03-27 19:02:38 -070056// starts conversion [26:24] = 001
brians0ab60bb2013-01-31 02:21:51 +000057
58// **************** functions
Brian Silverman6ad00b82013-03-27 19:02:38 -070059int analog(int channel) {
60 ADC->ADCR = ((ADC->ADCR & 0xF8FFFF00) | (0x01000000 | (1 << channel)));
brians0ab60bb2013-01-31 02:21:51 +000061
Brian Silverman6ad00b82013-03-27 19:02:38 -070062 // Poll until it is done.
63 while(!(ADC->ADGDR & 0x80000000));
brians0ab60bb2013-01-31 02:21:51 +000064
Brian Silverman6ad00b82013-03-27 19:02:38 -070065 return ((ADC->ADGDR & 0x0000FFF0) >> 4);
brians0ab60bb2013-01-31 02:21:51 +000066}
67// GPIO1 P0.4
68// GPIO2 P0.5
69// GPIO3 P0.6
70// GPIO4 P0.7
71// GPIO5 P0.8
72// GPIO6 P0.9
73// GPIO7 P2.0
74// GPIO8 P2.1
75// GPIO9 P2.2
76// GPIO10 P2.3
77// GPIO11 P2.4
78// GPIO12 P2.5
79
80// DIP0 P1.29
81// DIP1 P2.13
82// DIP2 P0.11
83// DIP3 P0.10
Brian Silvermand2411482013-03-28 21:36:32 -070084#define readGPIO(gpio, chan) ((((gpio)->FIOPIN) >> (chan)) & 1)
Brian Silverman6ad00b82013-03-27 19:02:38 -070085inline int readGPIO_inline(int major, int minor) {
86 switch (major) {
87 case 0:
88 return readGPIO(GPIO0, minor);
89 case 1:
90 return readGPIO(GPIO1, minor);
91 case 2:
92 return readGPIO(GPIO2, minor);
93 default:
94 return -1;
95 }
brians0ab60bb2013-01-31 02:21:51 +000096}
Brian Silverman6ad00b82013-03-27 19:02:38 -070097int digital(int channel) {
98 if (channel < 1) {
99 return -1;
100 } else if (channel < 7) {
101 int chan = channel + 3;
Brian Silvermand2411482013-03-28 21:36:32 -0700102 return readGPIO(GPIO0, chan);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700103 } else if (channel < 13) {
104 int chan = channel - 7;
Brian Silvermand2411482013-03-28 21:36:32 -0700105 return readGPIO(GPIO2, chan);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700106 }
107 return -1;
brians0ab60bb2013-01-31 02:21:51 +0000108}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700109int dip(int channel) {
110 switch (channel) {
111 case 0:
112 return readGPIO(GPIO1, 29);
113 case 1:
114 return readGPIO(GPIO2, 13);
115 case 2:
116 return readGPIO(GPIO0, 11);
117 case 3:
118 return readGPIO(GPIO0, 10);
119 default:
120 return -1;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700121 }
brians0ab60bb2013-01-31 02:21:51 +0000122}
Brian Silvermand2411482013-03-28 21:36:32 -0700123// ENC0A 1.20
124// ENC0B 1.23
125// ENC1A 2.11
126// ENC1B 2.12
127// ENC2A 0.21
128// ENC2B 0.22
129// ENC3A 0.19
130// ENC3B 0.20
brians0ab60bb2013-01-31 02:21:51 +0000131
Brian Silvermand2411482013-03-28 21:36:32 -0700132#define ENC(gpio, a, b) readGPIO(gpio, a) * 2 + readGPIO(gpio, b)
Brian Silverman6ad00b82013-03-27 19:02:38 -0700133int encoder_bits(int channel) {
134 switch (channel) {
135 case 0:
136 return ENC(GPIO1, 20, 23);
137 case 1:
138 return ENC(GPIO2, 11, 12);
139 case 2:
140 return ENC(GPIO0, 21, 22);
141 case 3:
142 return ENC(GPIO0, 19, 20);
143 default:
144 return -1;
145 }
146 return -1;
brians0ab60bb2013-01-31 02:21:51 +0000147}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700148#undef ENC
brians0ab60bb2013-01-31 02:21:51 +0000149
Brian Silvermand2411482013-03-28 21:36:32 -0700150// Uses EINT1 and EINT2 on 2.11 and 2.12.
brians0ab60bb2013-01-31 02:21:51 +0000151volatile int32_t encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700152// On GPIO pins 0.22 and 0.21.
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000153volatile int32_t encoder2_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700154// On GPIO pins 0.20 and 0.19.
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000155volatile int32_t encoder3_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700156// On GPIO pins 2.0 and 2.1.
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000157volatile int32_t encoder4_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700158// On GPIO pins 2.2 and 2.3.
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000159volatile int32_t encoder5_val;
160
Brian Silverman6ad00b82013-03-27 19:02:38 -0700161// ENC1A 2.11
Brian Silvermanab2e6762013-03-29 17:27:41 -0700162void EINT1_IRQHandler(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700163 int fiopin = GPIO2->FIOPIN;
164 if (((fiopin >> 1) ^ fiopin) & 0x800) {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700165 ++encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700166 } else {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700167 --encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700168 }
Brian Silverman6ad00b82013-03-27 19:02:38 -0700169 SC->EXTPOLAR ^= 0x2;
Brian Silverman42a9c912013-03-29 23:37:46 -0700170 SC->EXTINT = 0x2;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000171}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700172// ENC1B 2.12
Brian Silvermanab2e6762013-03-29 17:27:41 -0700173void EINT2_IRQHandler(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700174 int fiopin = GPIO2->FIOPIN;
175 if (((fiopin >> 1) ^ fiopin) & 0x800) {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700176 --encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700177 } else {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700178 ++encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700179 }
Brian Silverman6ad00b82013-03-27 19:02:38 -0700180 SC->EXTPOLAR ^= 0x4;
Brian Silverman42a9c912013-03-29 23:37:46 -0700181 SC->EXTINT = 0x4;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000182}
183
Brian Silverman6ad00b82013-03-27 19:02:38 -0700184// GPIO Interrupt handlers
Brian Silvermand2411482013-03-28 21:36:32 -0700185static void NoGPIO() {}
186static void Encoder2ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700187 GPIOINT->IO0IntClr |= (1 << 22);
188 if (GPIO0->FIOPIN & (1 << 21)) {
189 ++encoder2_val;
190 } else {
191 --encoder2_val;
192 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000193}
Brian Silvermand2411482013-03-28 21:36:32 -0700194static void Encoder2AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700195 GPIOINT->IO0IntClr |= (1 << 22);
196 if (GPIO0->FIOPIN & (1 << 21)) {
197 --encoder2_val;
198 } else {
199 ++encoder2_val;
200 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000201}
Brian Silvermand2411482013-03-28 21:36:32 -0700202static void Encoder2BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700203 GPIOINT->IO0IntClr |= (1 << 21);
204 if (GPIO0->FIOPIN & (1 << 22)) {
205 --encoder2_val;
206 } else {
207 ++encoder2_val;
208 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000209}
Brian Silvermand2411482013-03-28 21:36:32 -0700210static void Encoder2BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700211 GPIOINT->IO0IntClr |= (1 << 21);
212 if (GPIO0->FIOPIN & (1 << 22)) {
213 ++encoder2_val;
214 } else {
215 --encoder2_val;
216 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000217}
218
Brian Silvermand2411482013-03-28 21:36:32 -0700219static void Encoder3ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700220 GPIOINT->IO0IntClr |= (1 << 20);
221 if (GPIO0->FIOPIN & (1 << 19)) {
222 ++encoder3_val;
223 } else {
224 --encoder3_val;
225 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000226}
Brian Silvermand2411482013-03-28 21:36:32 -0700227static void Encoder3AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700228 GPIOINT->IO0IntClr |= (1 << 20);
229 if (GPIO0->FIOPIN & (1 << 19)) {
230 --encoder3_val;
231 } else {
232 ++encoder3_val;
233 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000234}
Brian Silvermand2411482013-03-28 21:36:32 -0700235static void Encoder3BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700236 GPIOINT->IO0IntClr |= (1 << 19);
237 if (GPIO0->FIOPIN & (1 << 20)) {
238 --encoder3_val;
239 } else {
240 ++encoder3_val;
241 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000242}
Brian Silvermand2411482013-03-28 21:36:32 -0700243static void Encoder3BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700244 GPIOINT->IO0IntClr |= (1 << 19);
245 if (GPIO0->FIOPIN & (1 << 20)) {
246 ++encoder3_val;
247 } else {
248 --encoder3_val;
249 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000250}
251
Brian Silvermand2411482013-03-28 21:36:32 -0700252static void Encoder4ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700253 GPIOINT->IO2IntClr |= (1 << 0);
254 if (GPIO2->FIOPIN & (1 << 1)) {
255 ++encoder4_val;
256 } else {
257 --encoder4_val;
258 }
259}
Brian Silvermand2411482013-03-28 21:36:32 -0700260static void Encoder4AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700261 GPIOINT->IO2IntClr |= (1 << 0);
262 if (GPIO2->FIOPIN & (1 << 1)) {
263 --encoder4_val;
264 } else {
265 ++encoder4_val;
266 }
267}
Brian Silvermand2411482013-03-28 21:36:32 -0700268static void Encoder4BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700269 GPIOINT->IO2IntClr |= (1 << 1);
270 if (GPIO2->FIOPIN & (1 << 0)) {
271 --encoder4_val;
272 } else {
273 ++encoder4_val;
274 }
275}
Brian Silvermand2411482013-03-28 21:36:32 -0700276static void Encoder4BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700277 GPIOINT->IO2IntClr |= (1 << 1);
278 if (GPIO2->FIOPIN & (1 << 0)) {
279 ++encoder4_val;
280 } else {
281 --encoder4_val;
282 }
283}
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000284
Brian Silvermand2411482013-03-28 21:36:32 -0700285static void Encoder5ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700286 GPIOINT->IO2IntClr |= (1 << 2);
287 if (GPIO2->FIOPIN & (1 << 3)) {
288 ++encoder5_val;
289 } else {
290 --encoder5_val;
291 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000292}
Brian Silvermand2411482013-03-28 21:36:32 -0700293static void Encoder5AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700294 GPIOINT->IO2IntClr |= (1 << 2);
295 if (GPIO2->FIOPIN & (1 << 3)) {
296 --encoder5_val;
297 } else {
298 ++encoder5_val;
299 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000300}
Brian Silvermand2411482013-03-28 21:36:32 -0700301static void Encoder5BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700302 GPIOINT->IO2IntClr |= (1 << 3);
303 if (GPIO2->FIOPIN & (1 << 2)) {
304 --encoder5_val;
305 } else {
306 ++encoder5_val;
307 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000308}
Brian Silvermand2411482013-03-28 21:36:32 -0700309static void Encoder5BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700310 GPIOINT->IO2IntClr |= (1 << 3);
311 if (GPIO2->FIOPIN & (1 << 2)) {
312 ++encoder5_val;
313 } else {
314 --encoder5_val;
315 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000316}
317
318volatile int32_t capture_top_rise;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700319volatile int8_t top_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700320static void IndexerTopRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700321 GPIOINT->IO0IntClr |= (1 << 5);
322 // edge counting encoder capture
323 ++top_rise_count;
324 capture_top_rise = encoder3_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000325}
326volatile int32_t capture_top_fall;
327volatile int8_t top_fall_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700328static void IndexerTopFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700329 GPIOINT->IO0IntClr |= (1 << 5);
330 // edge counting encoder capture
331 ++top_fall_count;
332 capture_top_fall = encoder3_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000333}
334volatile int8_t bottom_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700335static void IndexerBottomRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700336 GPIOINT->IO0IntClr |= (1 << 4);
337 // edge counting
338 ++bottom_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000339}
340volatile int32_t capture_bottom_fall_delay;
341volatile int8_t bottom_fall_delay_count;
342volatile int32_t dirty_delay;
343portTickType xDelayTimeFrom;
344static portTASK_FUNCTION(vDelayCapture, pvParameters)
345{
Brian Silvermand2411482013-03-28 21:36:32 -0700346 portTickType xSleepFrom = xTaskGetTickCount();
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000347
Brian Silvermand2411482013-03-28 21:36:32 -0700348 for (;;) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700349 NVIC_DisableIRQ(EINT3_IRQn);
Brian Silvermand2411482013-03-28 21:36:32 -0700350 if (dirty_delay != 0) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700351 xSleepFrom = xDelayTimeFrom;
352 dirty_delay = 0;
353 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000354
Brian Silvermand2411482013-03-28 21:36:32 -0700355 vTaskDelayUntil(&xSleepFrom, kBottomFallDelayTime / portTICK_RATE_MS);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000356
Brian Silverman6ad00b82013-03-27 19:02:38 -0700357 NVIC_DisableIRQ(EINT3_IRQn);
Brian Silvermand2411482013-03-28 21:36:32 -0700358 ++bottom_fall_delay_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700359 capture_bottom_fall_delay = encoder3_val;
360 NVIC_EnableIRQ(EINT3_IRQn);
361 } else {
362 NVIC_EnableIRQ(EINT3_IRQn);
363 vTaskDelayUntil(&xSleepFrom, 10 / portTICK_RATE_MS);
364 }
365 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000366}
367
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000368volatile int8_t bottom_fall_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700369static void IndexerBottomFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700370 GPIOINT->IO0IntClr |= (1 << 4);
Brian Silvermand2411482013-03-28 21:36:32 -0700371 ++bottom_fall_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700372 // edge counting start delayed capture
373 xDelayTimeFrom = xTaskGetTickCount();
374 dirty_delay = 1;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000375}
376volatile int32_t capture_wrist_rise;
377volatile int8_t wrist_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700378static void WristHallRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700379 GPIOINT->IO0IntClr |= (1 << 6);
380 // edge counting encoder capture
Brian Silvermand2411482013-03-28 21:36:32 -0700381 ++wrist_rise_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700382 capture_wrist_rise = (int32_t)QEI->QEIPOS;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000383}
384volatile int32_t capture_shooter_angle_rise;
385volatile int8_t shooter_angle_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700386static void ShooterHallRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700387 GPIOINT->IO0IntClr |= (1 << 7);
388 // edge counting encoder capture
Brian Silvermand2411482013-03-28 21:36:32 -0700389 ++shooter_angle_rise_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700390 capture_shooter_angle_rise = encoder2_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000391}
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000392
Brian Silverman6ad00b82013-03-27 19:02:38 -0700393// Count leading zeros.
394// Returns 0 if bit 31 is set etc.
Brian Silvermanab2e6762013-03-29 17:27:41 -0700395__attribute__((always_inline)) static __INLINE uint32_t __clz(uint32_t value) {
396 uint32_t result;
397 __asm__("clz %0, %1" : "=r" (result) : "r" (value));
Brian Silverman6ad00b82013-03-27 19:02:38 -0700398 return result;
399}
400inline static void IRQ_Dispatch(void) {
Brian Silvermand2411482013-03-28 21:36:32 -0700401 // TODO(brians): think about adding a loop here so that we can handle multiple
402 // interrupts right on top of each other faster
Brian Silvermanab2e6762013-03-29 17:27:41 -0700403 uint32_t index = __clz(GPIOINT->IO2IntStatR | GPIOINT->IO0IntStatR |
Brian Silverman6ad00b82013-03-27 19:02:38 -0700404 (GPIOINT->IO2IntStatF << 28) | (GPIOINT->IO0IntStatF << 4));
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000405
Brian Silvermanab2e6762013-03-29 17:27:41 -0700406 typedef void (*Handler)(void);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700407 const static Handler table[] = {
408 Encoder5BFall, // index 0: P2.3 Fall #bit 31 //Encoder 5 B //Dio 10
409 Encoder5AFall, // index 1: P2.2 Fall #bit 30 //Encoder 5 A //Dio 9
410 Encoder4BFall, // index 2: P2.1 Fall #bit 29 //Encoder 4 B //Dio 8
411 Encoder4AFall, // index 3: P2.0 Fall #bit 28 //Encoder 4 A //Dio 7
412 NoGPIO, // index 4: NO GPIO #bit 27
413 Encoder2AFall, // index 5: P0.22 Fall #bit 26 //Encoder 2 A
414 Encoder2BFall, // index 6: P0.21 Fall #bit 25 //Encoder 2 B
415 Encoder3AFall, // index 7: P0.20 Fall #bit 24 //Encoder 3 A
416 Encoder3BFall, // index 8: P0.19 Fall #bit 23 //Encoder 3 B
417 Encoder2ARise, // index 9: P0.22 Rise #bit 22 //Encoder 2 A
418 Encoder2BRise, // index 10: P0.21 Rise #bit 21 //Encoder 2 B
419 Encoder3ARise, // index 11: P0.20 Rise #bit 20 //Encoder 3 A
420 Encoder3BRise, // index 12: P0.19 Rise #bit 19 //Encoder 3 B
421 NoGPIO, // index 13: NO GPIO #bit 18
422 NoGPIO, // index 14: NO GPIO #bit 17
423 NoGPIO, // index 15: NO GPIO #bit 16
424 NoGPIO, // index 16: NO GPIO #bit 15
425 NoGPIO, // index 17: NO GPIO #bit 14
426 NoGPIO, // index 18: NO GPIO #bit 13
427 NoGPIO, // index 19: NO GPIO #bit 12
428 NoGPIO, // index 20: NO GPIO #bit 11
429 NoGPIO, // index 21: NO GPIO #bit 10
430 IndexerTopFall, // index 22: P0.5 Fall #bit 9 //Indexer Top //Dio 2
431 IndexerBottomFall, // index 23: P0.4 Fall #bit 8 //Indexer Bottom //Dio 1
432 ShooterHallRise, // index 24: P0.7 Rise #bit 7 //Shooter Hall //Dio 4
433 WristHallRise, // index 25: P0.6 Rise #bit 6 //Wrist Hall //Dio 3
434 IndexerTopRise, // index 26: P0.5 Rise #bit 5 //Indexer Top //Dio 2
435 IndexerBottomRise, // index 27: P0.4 Rise #bit 4 //Indexer Bottom //Dio 1
436 Encoder5BRise, // index 28: P2.3 Rise #bit 3 //Encoder 5 B //Dio 10
437 Encoder5ARise, // index 29: P2.2 Rise #bit 2 //Encoder 5 A //Dio 9
438 Encoder4BRise, // index 30: P2.1 Rise #bit 1 //Encoder 4 B //Dio 8
439 Encoder4ARise, // index 31: P2.0 Rise #bit 0 //Encoder 4 A //Dio 7
440 NoGPIO // index 32: NO BITS SET #False Alarm
441 };
442 table[index]();
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000443}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700444void EINT3_IRQHandler(void) {
Brian Silvermand2411482013-03-28 21:36:32 -0700445 // Have to disable it here or else it re-fires the interrupt while the code
446 // reads to figure out which pin the interrupt is for.
447 // TODO(brians): figure out details + look for an alternative
Brian Silverman6ad00b82013-03-27 19:02:38 -0700448 NVIC_DisableIRQ(EINT3_IRQn);
449 IRQ_Dispatch();
450 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000451}
Brian Silvermand2411482013-03-28 21:36:32 -0700452int32_t encoder_val(int chan) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700453 int32_t val;
Brian Silvermand2411482013-03-28 21:36:32 -0700454 switch (chan) {
455 case 0: // Wrist
Brian Silverman6ad00b82013-03-27 19:02:38 -0700456 return (int32_t)QEI->QEIPOS;
Brian Silvermand2411482013-03-28 21:36:32 -0700457 case 1: // Shooter Wheel
Brian Silverman6ad00b82013-03-27 19:02:38 -0700458 NVIC_DisableIRQ(EINT1_IRQn);
459 NVIC_DisableIRQ(EINT2_IRQn);
460 val = encoder1_val;
461 NVIC_EnableIRQ(EINT2_IRQn);
462 NVIC_EnableIRQ(EINT1_IRQn);
463 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700464 case 2: // Shooter Angle
Brian Silverman6ad00b82013-03-27 19:02:38 -0700465 NVIC_DisableIRQ(EINT3_IRQn);
466 val = encoder2_val;
467 NVIC_EnableIRQ(EINT3_IRQn);
468 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700469 case 3: // Indexer
Brian Silverman6ad00b82013-03-27 19:02:38 -0700470 NVIC_DisableIRQ(EINT3_IRQn);
471 val = encoder3_val;
472 NVIC_EnableIRQ(EINT3_IRQn);
473 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700474 case 4: // Drive R
Brian Silverman6ad00b82013-03-27 19:02:38 -0700475 NVIC_DisableIRQ(EINT3_IRQn);
476 val = encoder4_val;
477 NVIC_EnableIRQ(EINT3_IRQn);
478 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700479 case 5: // Drive L
Brian Silverman6ad00b82013-03-27 19:02:38 -0700480 NVIC_DisableIRQ(EINT3_IRQn);
481 val = encoder5_val;
482 NVIC_EnableIRQ(EINT3_IRQn);
483 return val;
484 default:
485 return -1;
486 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000487}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700488void fillSensorPacket(struct DataStruct *packet) {
489 packet->gyro_angle = gyro_angle;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000490
Brian Silverman6ad00b82013-03-27 19:02:38 -0700491 packet->shooter = encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700492 packet->right_drive = encoder4_val;
493 packet->left_drive = encoder5_val;
494 packet->shooter_angle = encoder2_val;
495 packet->indexer = encoder3_val;
Brian Silvermand2411482013-03-28 21:36:32 -0700496
Brian Silverman1289ded2013-03-29 21:59:51 -0700497 NVIC_DisableIRQ(EINT1_IRQn);
498 NVIC_DisableIRQ(EINT2_IRQn);
499
500 packet->wrist = (int32_t)QEI->QEIPOS;
501 packet->wrist_hall_effect = digital(0);
502 packet->capture_wrist_rise = capture_wrist_rise;
503 packet->wrist_rise_count = wrist_rise_count;
504
505 NVIC_EnableIRQ(EINT1_IRQn);
506 NVIC_EnableIRQ(EINT2_IRQn);
507
Brian Silvermand2411482013-03-28 21:36:32 -0700508 NVIC_DisableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000509
Brian Silverman6ad00b82013-03-27 19:02:38 -0700510 packet->capture_top_rise = capture_top_rise;
511 packet->top_rise_count = top_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000512
Brian Silverman6ad00b82013-03-27 19:02:38 -0700513 packet->capture_top_fall = capture_top_fall;
514 packet->top_fall_count = top_fall_count;
Brian Silverman1289ded2013-03-29 21:59:51 -0700515 packet->top_disc = digital(4);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000516
Brian Silverman6ad00b82013-03-27 19:02:38 -0700517 packet->capture_bottom_fall_delay = capture_bottom_fall_delay;
518 packet->bottom_fall_delay_count = bottom_fall_delay_count;
519 packet->bottom_fall_count = bottom_fall_count;
Brian Silverman1289ded2013-03-29 21:59:51 -0700520 packet->bottom_disc = digital(3);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700521
522 packet->capture_shooter_angle_rise = capture_shooter_angle_rise;
523 packet->shooter_angle_rise_count = shooter_angle_rise_count;
Brian Silverman1289ded2013-03-29 21:59:51 -0700524 packet->angle_adjust_bottom_hall_effect = digital(2);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700525
526 NVIC_EnableIRQ(EINT3_IRQn);
527
Brian Silvermand2411482013-03-28 21:36:32 -0700528 packet->bottom_rise_count = bottom_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000529}
530
Brian Silvermand2411482013-03-28 21:36:32 -0700531void encoder_init(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700532 // Setup the encoder interface.
533 SC->PCONP |= PCONP_PCQEI;
534 PINCON->PINSEL3 = ((PINCON->PINSEL3 & 0xffff3dff) | 0x00004100);
535 // Reset the count and velocity.
536 QEI->QEICON = 0x00000005;
537 QEI->QEICONF = 0x00000004;
538 // Wrap back to 0 when we wrap the int and vice versa.
539 QEI->QEIMAXPOS = 0xFFFFFFFF;
brians0ab60bb2013-01-31 02:21:51 +0000540
Brian Silverman6ad00b82013-03-27 19:02:38 -0700541 // Set up encoder 1.
542 // Make GPIOs 2.11 and 2.12 trigger EINT1 and EINT2 (respectively).
543 // PINSEL4[23:22] = {0 1}
544 // PINSEL4[25:24] = {0 1}
545 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 22)) | (0x1 << 22);
546 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 24)) | (0x1 << 24);
547 // Clear the interrupt flags for EINT1 and EINT2 (0x6 = 0b0110).
548 SC->EXTMODE = 0x6;
549 SC->EXTINT = 0x6;
550 NVIC_EnableIRQ(EINT1_IRQn);
551 NVIC_EnableIRQ(EINT2_IRQn);
552 encoder1_val = 0;
brians0ab60bb2013-01-31 02:21:51 +0000553
Brian Silverman6ad00b82013-03-27 19:02:38 -0700554 // Set up encoder 2.
555 GPIOINT->IO0IntEnF |= (1 << 22); // Set GPIO falling interrupt.
556 GPIOINT->IO0IntEnR |= (1 << 22); // Set GPIO rising interrupt.
557 GPIOINT->IO0IntEnF |= (1 << 21); // Set GPIO falling interrupt.
558 GPIOINT->IO0IntEnR |= (1 << 21); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700559 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700560 PINCON->PINSEL1 &= ~(0x3 << 12);
561 PINCON->PINSEL1 &= ~(0x3 << 10);
562 encoder2_val = 0;
brians0ab60bb2013-01-31 02:21:51 +0000563
Brian Silverman6ad00b82013-03-27 19:02:38 -0700564 // Set up encoder 3.
565 GPIOINT->IO0IntEnF |= (1 << 20); // Set GPIO falling interrupt.
566 GPIOINT->IO0IntEnR |= (1 << 20); // Set GPIO rising interrupt.
567 GPIOINT->IO0IntEnF |= (1 << 19); // Set GPIO falling interrupt.
568 GPIOINT->IO0IntEnR |= (1 << 19); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700569 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700570 PINCON->PINSEL1 &= ~(0x3 << 8);
571 PINCON->PINSEL1 &= ~(0x3 << 6);
572 encoder3_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000573
Brian Silverman6ad00b82013-03-27 19:02:38 -0700574 // Set up encoder 4.
575 GPIOINT->IO2IntEnF |= (1 << 0); // Set GPIO falling interrupt.
576 GPIOINT->IO2IntEnR |= (1 << 0); // Set GPIO rising interrupt.
577 GPIOINT->IO2IntEnF |= (1 << 1); // Set GPIO falling interrupt.
578 GPIOINT->IO2IntEnR |= (1 << 1); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700579 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700580 PINCON->PINSEL4 &= ~(0x3 << 0);
581 PINCON->PINSEL4 &= ~(0x3 << 2);
582 encoder4_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000583
Brian Silverman6ad00b82013-03-27 19:02:38 -0700584 // Set up encoder 5.
585 GPIOINT->IO2IntEnF |= (1 << 2); // Set GPIO falling interrupt.
586 GPIOINT->IO2IntEnR |= (1 << 2); // Set GPIO rising interrupt.
587 GPIOINT->IO2IntEnF |= (1 << 3); // Set GPIO falling interrupt.
588 GPIOINT->IO2IntEnR |= (1 << 3); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700589 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700590 PINCON->PINSEL4 &= ~(0x3 << 4);
591 PINCON->PINSEL4 &= ~(0x3 << 6);
592 encoder5_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000593
Brian Silverman6ad00b82013-03-27 19:02:38 -0700594 // Enable interrupts from the GPIO pins.
595 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000596
Brian Silverman6ad00b82013-03-27 19:02:38 -0700597 xTaskCreate(vDelayCapture,
598 (signed char *) "SENSORs",
Brian Silvermanab2e6762013-03-29 17:27:41 -0700599 configMINIMAL_STACK_SIZE + 100,
600 NULL /*parameters*/,
601 tskIDLE_PRIORITY + 5,
602 NULL /*return task handle*/);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000603
Brian Silverman6ad00b82013-03-27 19:02:38 -0700604 GPIOINT->IO0IntEnF |= (1 << 4); // Set GPIO falling interrupt
605 GPIOINT->IO0IntEnR |= (1 << 4); // Set GPIO rising interrupt
606 PINCON->PINSEL0 &= ~(0x3 << 8);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000607
Brian Silverman6ad00b82013-03-27 19:02:38 -0700608 GPIOINT->IO0IntEnF |= (1 << 5); // Set GPIO falling interrupt
609 GPIOINT->IO0IntEnR |= (1 << 5); // Set GPIO rising interrupt
610 PINCON->PINSEL0 &= ~(0x3 << 10);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000611
Brian Silverman6ad00b82013-03-27 19:02:38 -0700612 GPIOINT->IO0IntEnR |= (1 << 6); // Set GPIO rising interrupt
613 PINCON->PINSEL0 &= ~(0x3 << 12);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000614
Brian Silverman6ad00b82013-03-27 19:02:38 -0700615 GPIOINT->IO0IntEnR |= (1 << 7); // Set GPIO rising interrupt
616 PINCON->PINSEL0 &= ~(0x3 << 14);
brians0ab60bb2013-01-31 02:21:51 +0000617}