blob: a956a5d24ae5d8e87b9ffe6c0faa129d217014a8 [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) {
163 // TODO(brians): need to test this on hardware, but I think this should be
164 // below the EXTPOLAR set
Brian Silverman6ad00b82013-03-27 19:02:38 -0700165 SC->EXTINT = 0x2;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700166 int fiopin = GPIO2->FIOPIN;
167 if (((fiopin >> 1) ^ fiopin) & 0x800) {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700168 ++encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700169 } else {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700170 --encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700171 }
Brian Silverman6ad00b82013-03-27 19:02:38 -0700172 SC->EXTPOLAR ^= 0x2;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000173}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700174// ENC1B 2.12
Brian Silvermanab2e6762013-03-29 17:27:41 -0700175void EINT2_IRQHandler(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700176 SC->EXTINT = 0x4;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700177 int fiopin = GPIO2->FIOPIN;
178 if (((fiopin >> 1) ^ fiopin) & 0x800) {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700179 --encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700180 } else {
Brian Silvermanab2e6762013-03-29 17:27:41 -0700181 ++encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700182 }
Brian Silverman6ad00b82013-03-27 19:02:38 -0700183 SC->EXTPOLAR ^= 0x4;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000184}
185
Brian Silverman6ad00b82013-03-27 19:02:38 -0700186// GPIO Interrupt handlers
Brian Silvermand2411482013-03-28 21:36:32 -0700187static void NoGPIO() {}
188static void Encoder2ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700189 GPIOINT->IO0IntClr |= (1 << 22);
190 if (GPIO0->FIOPIN & (1 << 21)) {
191 ++encoder2_val;
192 } else {
193 --encoder2_val;
194 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000195}
Brian Silvermand2411482013-03-28 21:36:32 -0700196static void Encoder2AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700197 GPIOINT->IO0IntClr |= (1 << 22);
198 if (GPIO0->FIOPIN & (1 << 21)) {
199 --encoder2_val;
200 } else {
201 ++encoder2_val;
202 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000203}
Brian Silvermand2411482013-03-28 21:36:32 -0700204static void Encoder2BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700205 GPIOINT->IO0IntClr |= (1 << 21);
206 if (GPIO0->FIOPIN & (1 << 22)) {
207 --encoder2_val;
208 } else {
209 ++encoder2_val;
210 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000211}
Brian Silvermand2411482013-03-28 21:36:32 -0700212static void Encoder2BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700213 GPIOINT->IO0IntClr |= (1 << 21);
214 if (GPIO0->FIOPIN & (1 << 22)) {
215 ++encoder2_val;
216 } else {
217 --encoder2_val;
218 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000219}
220
Brian Silvermand2411482013-03-28 21:36:32 -0700221static void Encoder3ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700222 GPIOINT->IO0IntClr |= (1 << 20);
223 if (GPIO0->FIOPIN & (1 << 19)) {
224 ++encoder3_val;
225 } else {
226 --encoder3_val;
227 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000228}
Brian Silvermand2411482013-03-28 21:36:32 -0700229static void Encoder3AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700230 GPIOINT->IO0IntClr |= (1 << 20);
231 if (GPIO0->FIOPIN & (1 << 19)) {
232 --encoder3_val;
233 } else {
234 ++encoder3_val;
235 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000236}
Brian Silvermand2411482013-03-28 21:36:32 -0700237static void Encoder3BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700238 GPIOINT->IO0IntClr |= (1 << 19);
239 if (GPIO0->FIOPIN & (1 << 20)) {
240 --encoder3_val;
241 } else {
242 ++encoder3_val;
243 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000244}
Brian Silvermand2411482013-03-28 21:36:32 -0700245static void Encoder3BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700246 GPIOINT->IO0IntClr |= (1 << 19);
247 if (GPIO0->FIOPIN & (1 << 20)) {
248 ++encoder3_val;
249 } else {
250 --encoder3_val;
251 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000252}
253
Brian Silvermand2411482013-03-28 21:36:32 -0700254static void Encoder4ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700255 GPIOINT->IO2IntClr |= (1 << 0);
256 if (GPIO2->FIOPIN & (1 << 1)) {
257 ++encoder4_val;
258 } else {
259 --encoder4_val;
260 }
261}
Brian Silvermand2411482013-03-28 21:36:32 -0700262static void Encoder4AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700263 GPIOINT->IO2IntClr |= (1 << 0);
264 if (GPIO2->FIOPIN & (1 << 1)) {
265 --encoder4_val;
266 } else {
267 ++encoder4_val;
268 }
269}
Brian Silvermand2411482013-03-28 21:36:32 -0700270static void Encoder4BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700271 GPIOINT->IO2IntClr |= (1 << 1);
272 if (GPIO2->FIOPIN & (1 << 0)) {
273 --encoder4_val;
274 } else {
275 ++encoder4_val;
276 }
277}
Brian Silvermand2411482013-03-28 21:36:32 -0700278static void Encoder4BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700279 GPIOINT->IO2IntClr |= (1 << 1);
280 if (GPIO2->FIOPIN & (1 << 0)) {
281 ++encoder4_val;
282 } else {
283 --encoder4_val;
284 }
285}
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000286
Brian Silvermand2411482013-03-28 21:36:32 -0700287static void Encoder5ARise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700288 GPIOINT->IO2IntClr |= (1 << 2);
289 if (GPIO2->FIOPIN & (1 << 3)) {
290 ++encoder5_val;
291 } else {
292 --encoder5_val;
293 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000294}
Brian Silvermand2411482013-03-28 21:36:32 -0700295static void Encoder5AFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700296 GPIOINT->IO2IntClr |= (1 << 2);
297 if (GPIO2->FIOPIN & (1 << 3)) {
298 --encoder5_val;
299 } else {
300 ++encoder5_val;
301 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000302}
Brian Silvermand2411482013-03-28 21:36:32 -0700303static void Encoder5BRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700304 GPIOINT->IO2IntClr |= (1 << 3);
305 if (GPIO2->FIOPIN & (1 << 2)) {
306 --encoder5_val;
307 } else {
308 ++encoder5_val;
309 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000310}
Brian Silvermand2411482013-03-28 21:36:32 -0700311static void Encoder5BFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700312 GPIOINT->IO2IntClr |= (1 << 3);
313 if (GPIO2->FIOPIN & (1 << 2)) {
314 ++encoder5_val;
315 } else {
316 --encoder5_val;
317 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000318}
319
320volatile int32_t capture_top_rise;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700321volatile int8_t top_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700322static void IndexerTopRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700323 GPIOINT->IO0IntClr |= (1 << 5);
324 // edge counting encoder capture
325 ++top_rise_count;
326 capture_top_rise = encoder3_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000327}
328volatile int32_t capture_top_fall;
329volatile int8_t top_fall_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700330static void IndexerTopFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700331 GPIOINT->IO0IntClr |= (1 << 5);
332 // edge counting encoder capture
333 ++top_fall_count;
334 capture_top_fall = encoder3_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000335}
336volatile int8_t bottom_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700337static void IndexerBottomRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700338 GPIOINT->IO0IntClr |= (1 << 4);
339 // edge counting
340 ++bottom_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000341}
342volatile int32_t capture_bottom_fall_delay;
343volatile int8_t bottom_fall_delay_count;
344volatile int32_t dirty_delay;
345portTickType xDelayTimeFrom;
346static portTASK_FUNCTION(vDelayCapture, pvParameters)
347{
Brian Silvermand2411482013-03-28 21:36:32 -0700348 portTickType xSleepFrom = xTaskGetTickCount();
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000349
Brian Silvermand2411482013-03-28 21:36:32 -0700350 for (;;) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700351 NVIC_DisableIRQ(EINT3_IRQn);
Brian Silvermand2411482013-03-28 21:36:32 -0700352 if (dirty_delay != 0) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700353 xSleepFrom = xDelayTimeFrom;
354 dirty_delay = 0;
355 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000356
Brian Silvermand2411482013-03-28 21:36:32 -0700357 vTaskDelayUntil(&xSleepFrom, kBottomFallDelayTime / portTICK_RATE_MS);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000358
Brian Silverman6ad00b82013-03-27 19:02:38 -0700359 NVIC_DisableIRQ(EINT3_IRQn);
Brian Silvermand2411482013-03-28 21:36:32 -0700360 ++bottom_fall_delay_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700361 capture_bottom_fall_delay = encoder3_val;
362 NVIC_EnableIRQ(EINT3_IRQn);
363 } else {
364 NVIC_EnableIRQ(EINT3_IRQn);
365 vTaskDelayUntil(&xSleepFrom, 10 / portTICK_RATE_MS);
366 }
367 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000368}
369
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000370volatile int8_t bottom_fall_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700371static void IndexerBottomFall() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700372 GPIOINT->IO0IntClr |= (1 << 4);
Brian Silvermand2411482013-03-28 21:36:32 -0700373 ++bottom_fall_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700374 // edge counting start delayed capture
375 xDelayTimeFrom = xTaskGetTickCount();
376 dirty_delay = 1;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000377}
378volatile int32_t capture_wrist_rise;
379volatile int8_t wrist_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700380static void WristHallRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700381 GPIOINT->IO0IntClr |= (1 << 6);
382 // edge counting encoder capture
Brian Silvermand2411482013-03-28 21:36:32 -0700383 ++wrist_rise_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700384 capture_wrist_rise = (int32_t)QEI->QEIPOS;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000385}
386volatile int32_t capture_shooter_angle_rise;
387volatile int8_t shooter_angle_rise_count;
Brian Silvermand2411482013-03-28 21:36:32 -0700388static void ShooterHallRise() {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700389 GPIOINT->IO0IntClr |= (1 << 7);
390 // edge counting encoder capture
Brian Silvermand2411482013-03-28 21:36:32 -0700391 ++shooter_angle_rise_count;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700392 capture_shooter_angle_rise = encoder2_val;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000393}
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000394
Brian Silverman6ad00b82013-03-27 19:02:38 -0700395// Count leading zeros.
396// Returns 0 if bit 31 is set etc.
Brian Silvermanab2e6762013-03-29 17:27:41 -0700397__attribute__((always_inline)) static __INLINE uint32_t __clz(uint32_t value) {
398 uint32_t result;
399 __asm__("clz %0, %1" : "=r" (result) : "r" (value));
Brian Silverman6ad00b82013-03-27 19:02:38 -0700400 return result;
401}
402inline static void IRQ_Dispatch(void) {
Brian Silvermand2411482013-03-28 21:36:32 -0700403 // TODO(brians): think about adding a loop here so that we can handle multiple
404 // interrupts right on top of each other faster
Brian Silvermanab2e6762013-03-29 17:27:41 -0700405 uint32_t index = __clz(GPIOINT->IO2IntStatR | GPIOINT->IO0IntStatR |
Brian Silverman6ad00b82013-03-27 19:02:38 -0700406 (GPIOINT->IO2IntStatF << 28) | (GPIOINT->IO0IntStatF << 4));
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000407
Brian Silvermanab2e6762013-03-29 17:27:41 -0700408 typedef void (*Handler)(void);
Brian Silverman6ad00b82013-03-27 19:02:38 -0700409 const static Handler table[] = {
410 Encoder5BFall, // index 0: P2.3 Fall #bit 31 //Encoder 5 B //Dio 10
411 Encoder5AFall, // index 1: P2.2 Fall #bit 30 //Encoder 5 A //Dio 9
412 Encoder4BFall, // index 2: P2.1 Fall #bit 29 //Encoder 4 B //Dio 8
413 Encoder4AFall, // index 3: P2.0 Fall #bit 28 //Encoder 4 A //Dio 7
414 NoGPIO, // index 4: NO GPIO #bit 27
415 Encoder2AFall, // index 5: P0.22 Fall #bit 26 //Encoder 2 A
416 Encoder2BFall, // index 6: P0.21 Fall #bit 25 //Encoder 2 B
417 Encoder3AFall, // index 7: P0.20 Fall #bit 24 //Encoder 3 A
418 Encoder3BFall, // index 8: P0.19 Fall #bit 23 //Encoder 3 B
419 Encoder2ARise, // index 9: P0.22 Rise #bit 22 //Encoder 2 A
420 Encoder2BRise, // index 10: P0.21 Rise #bit 21 //Encoder 2 B
421 Encoder3ARise, // index 11: P0.20 Rise #bit 20 //Encoder 3 A
422 Encoder3BRise, // index 12: P0.19 Rise #bit 19 //Encoder 3 B
423 NoGPIO, // index 13: NO GPIO #bit 18
424 NoGPIO, // index 14: NO GPIO #bit 17
425 NoGPIO, // index 15: NO GPIO #bit 16
426 NoGPIO, // index 16: NO GPIO #bit 15
427 NoGPIO, // index 17: NO GPIO #bit 14
428 NoGPIO, // index 18: NO GPIO #bit 13
429 NoGPIO, // index 19: NO GPIO #bit 12
430 NoGPIO, // index 20: NO GPIO #bit 11
431 NoGPIO, // index 21: NO GPIO #bit 10
432 IndexerTopFall, // index 22: P0.5 Fall #bit 9 //Indexer Top //Dio 2
433 IndexerBottomFall, // index 23: P0.4 Fall #bit 8 //Indexer Bottom //Dio 1
434 ShooterHallRise, // index 24: P0.7 Rise #bit 7 //Shooter Hall //Dio 4
435 WristHallRise, // index 25: P0.6 Rise #bit 6 //Wrist Hall //Dio 3
436 IndexerTopRise, // index 26: P0.5 Rise #bit 5 //Indexer Top //Dio 2
437 IndexerBottomRise, // index 27: P0.4 Rise #bit 4 //Indexer Bottom //Dio 1
438 Encoder5BRise, // index 28: P2.3 Rise #bit 3 //Encoder 5 B //Dio 10
439 Encoder5ARise, // index 29: P2.2 Rise #bit 2 //Encoder 5 A //Dio 9
440 Encoder4BRise, // index 30: P2.1 Rise #bit 1 //Encoder 4 B //Dio 8
441 Encoder4ARise, // index 31: P2.0 Rise #bit 0 //Encoder 4 A //Dio 7
442 NoGPIO // index 32: NO BITS SET #False Alarm
443 };
444 table[index]();
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000445}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700446void EINT3_IRQHandler(void) {
Brian Silvermand2411482013-03-28 21:36:32 -0700447 // Have to disable it here or else it re-fires the interrupt while the code
448 // reads to figure out which pin the interrupt is for.
449 // TODO(brians): figure out details + look for an alternative
Brian Silverman6ad00b82013-03-27 19:02:38 -0700450 NVIC_DisableIRQ(EINT3_IRQn);
451 IRQ_Dispatch();
452 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000453}
Brian Silvermand2411482013-03-28 21:36:32 -0700454int32_t encoder_val(int chan) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700455 int32_t val;
Brian Silvermand2411482013-03-28 21:36:32 -0700456 switch (chan) {
457 case 0: // Wrist
Brian Silverman6ad00b82013-03-27 19:02:38 -0700458 return (int32_t)QEI->QEIPOS;
Brian Silvermand2411482013-03-28 21:36:32 -0700459 case 1: // Shooter Wheel
Brian Silverman6ad00b82013-03-27 19:02:38 -0700460 NVIC_DisableIRQ(EINT1_IRQn);
461 NVIC_DisableIRQ(EINT2_IRQn);
462 val = encoder1_val;
463 NVIC_EnableIRQ(EINT2_IRQn);
464 NVIC_EnableIRQ(EINT1_IRQn);
465 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700466 case 2: // Shooter Angle
Brian Silverman6ad00b82013-03-27 19:02:38 -0700467 NVIC_DisableIRQ(EINT3_IRQn);
468 val = encoder2_val;
469 NVIC_EnableIRQ(EINT3_IRQn);
470 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700471 case 3: // Indexer
Brian Silverman6ad00b82013-03-27 19:02:38 -0700472 NVIC_DisableIRQ(EINT3_IRQn);
473 val = encoder3_val;
474 NVIC_EnableIRQ(EINT3_IRQn);
475 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700476 case 4: // Drive R
Brian Silverman6ad00b82013-03-27 19:02:38 -0700477 NVIC_DisableIRQ(EINT3_IRQn);
478 val = encoder4_val;
479 NVIC_EnableIRQ(EINT3_IRQn);
480 return val;
Brian Silvermand2411482013-03-28 21:36:32 -0700481 case 5: // Drive L
Brian Silverman6ad00b82013-03-27 19:02:38 -0700482 NVIC_DisableIRQ(EINT3_IRQn);
483 val = encoder5_val;
484 NVIC_EnableIRQ(EINT3_IRQn);
485 return val;
486 default:
487 return -1;
488 }
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000489}
Brian Silverman6ad00b82013-03-27 19:02:38 -0700490void fillSensorPacket(struct DataStruct *packet) {
491 packet->gyro_angle = gyro_angle;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000492
Brian Silverman6ad00b82013-03-27 19:02:38 -0700493 packet->shooter = encoder1_val;
Brian Silverman6ad00b82013-03-27 19:02:38 -0700494 packet->right_drive = encoder4_val;
495 packet->left_drive = encoder5_val;
496 packet->shooter_angle = encoder2_val;
497 packet->indexer = encoder3_val;
Brian Silvermand2411482013-03-28 21:36:32 -0700498 packet->wrist = (int32_t)QEI->QEIPOS;
499
500 // TODO(brians): should we re-enable it in between here so that it's disabled
501 // for shorter chunks?
502 NVIC_DisableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000503
Brian Silverman6ad00b82013-03-27 19:02:38 -0700504 packet->capture_top_rise = capture_top_rise;
505 packet->top_rise_count = top_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000506
Brian Silverman6ad00b82013-03-27 19:02:38 -0700507 packet->capture_top_fall = capture_top_fall;
508 packet->top_fall_count = top_fall_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000509
Brian Silverman6ad00b82013-03-27 19:02:38 -0700510 packet->capture_bottom_fall_delay = capture_bottom_fall_delay;
511 packet->bottom_fall_delay_count = bottom_fall_delay_count;
512 packet->bottom_fall_count = bottom_fall_count;
513
514 packet->capture_wrist_rise = capture_wrist_rise;
515 packet->wrist_rise_count = wrist_rise_count;
516
517 packet->capture_shooter_angle_rise = capture_shooter_angle_rise;
518 packet->shooter_angle_rise_count = shooter_angle_rise_count;
519
520 NVIC_EnableIRQ(EINT3_IRQn);
521
Brian Silvermand2411482013-03-28 21:36:32 -0700522 packet->bottom_rise_count = bottom_rise_count;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000523}
524
Brian Silvermand2411482013-03-28 21:36:32 -0700525void encoder_init(void) {
Brian Silverman6ad00b82013-03-27 19:02:38 -0700526 // Setup the encoder interface.
527 SC->PCONP |= PCONP_PCQEI;
528 PINCON->PINSEL3 = ((PINCON->PINSEL3 & 0xffff3dff) | 0x00004100);
529 // Reset the count and velocity.
530 QEI->QEICON = 0x00000005;
531 QEI->QEICONF = 0x00000004;
532 // Wrap back to 0 when we wrap the int and vice versa.
533 QEI->QEIMAXPOS = 0xFFFFFFFF;
brians0ab60bb2013-01-31 02:21:51 +0000534
Brian Silverman6ad00b82013-03-27 19:02:38 -0700535 // Set up encoder 1.
536 // Make GPIOs 2.11 and 2.12 trigger EINT1 and EINT2 (respectively).
537 // PINSEL4[23:22] = {0 1}
538 // PINSEL4[25:24] = {0 1}
539 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 22)) | (0x1 << 22);
540 PINCON->PINSEL4 = (PINCON->PINSEL4 & ~(0x3 << 24)) | (0x1 << 24);
541 // Clear the interrupt flags for EINT1 and EINT2 (0x6 = 0b0110).
542 SC->EXTMODE = 0x6;
543 SC->EXTINT = 0x6;
544 NVIC_EnableIRQ(EINT1_IRQn);
545 NVIC_EnableIRQ(EINT2_IRQn);
546 encoder1_val = 0;
brians0ab60bb2013-01-31 02:21:51 +0000547
Brian Silverman6ad00b82013-03-27 19:02:38 -0700548 // Set up encoder 2.
549 GPIOINT->IO0IntEnF |= (1 << 22); // Set GPIO falling interrupt.
550 GPIOINT->IO0IntEnR |= (1 << 22); // Set GPIO rising interrupt.
551 GPIOINT->IO0IntEnF |= (1 << 21); // Set GPIO falling interrupt.
552 GPIOINT->IO0IntEnR |= (1 << 21); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700553 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700554 PINCON->PINSEL1 &= ~(0x3 << 12);
555 PINCON->PINSEL1 &= ~(0x3 << 10);
556 encoder2_val = 0;
brians0ab60bb2013-01-31 02:21:51 +0000557
Brian Silverman6ad00b82013-03-27 19:02:38 -0700558 // Set up encoder 3.
559 GPIOINT->IO0IntEnF |= (1 << 20); // Set GPIO falling interrupt.
560 GPIOINT->IO0IntEnR |= (1 << 20); // Set GPIO rising interrupt.
561 GPIOINT->IO0IntEnF |= (1 << 19); // Set GPIO falling interrupt.
562 GPIOINT->IO0IntEnR |= (1 << 19); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700563 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700564 PINCON->PINSEL1 &= ~(0x3 << 8);
565 PINCON->PINSEL1 &= ~(0x3 << 6);
566 encoder3_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000567
Brian Silverman6ad00b82013-03-27 19:02:38 -0700568 // Set up encoder 4.
569 GPIOINT->IO2IntEnF |= (1 << 0); // Set GPIO falling interrupt.
570 GPIOINT->IO2IntEnR |= (1 << 0); // Set GPIO rising interrupt.
571 GPIOINT->IO2IntEnF |= (1 << 1); // Set GPIO falling interrupt.
572 GPIOINT->IO2IntEnR |= (1 << 1); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700573 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700574 PINCON->PINSEL4 &= ~(0x3 << 0);
575 PINCON->PINSEL4 &= ~(0x3 << 2);
576 encoder4_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000577
Brian Silverman6ad00b82013-03-27 19:02:38 -0700578 // Set up encoder 5.
579 GPIOINT->IO2IntEnF |= (1 << 2); // Set GPIO falling interrupt.
580 GPIOINT->IO2IntEnR |= (1 << 2); // Set GPIO rising interrupt.
581 GPIOINT->IO2IntEnF |= (1 << 3); // Set GPIO falling interrupt.
582 GPIOINT->IO2IntEnR |= (1 << 3); // Set GPIO rising interrupt.
Brian Silvermand2411482013-03-28 21:36:32 -0700583 // Make sure they're in mode 00 (the default, aka nothing special).
Brian Silverman6ad00b82013-03-27 19:02:38 -0700584 PINCON->PINSEL4 &= ~(0x3 << 4);
585 PINCON->PINSEL4 &= ~(0x3 << 6);
586 encoder5_val = 0;
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000587
Brian Silverman6ad00b82013-03-27 19:02:38 -0700588 // Enable interrupts from the GPIO pins.
589 NVIC_EnableIRQ(EINT3_IRQn);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000590
Brian Silverman6ad00b82013-03-27 19:02:38 -0700591 xTaskCreate(vDelayCapture,
592 (signed char *) "SENSORs",
Brian Silvermanab2e6762013-03-29 17:27:41 -0700593 configMINIMAL_STACK_SIZE + 100,
594 NULL /*parameters*/,
595 tskIDLE_PRIORITY + 5,
596 NULL /*return task handle*/);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000597
Brian Silverman6ad00b82013-03-27 19:02:38 -0700598 GPIOINT->IO0IntEnF |= (1 << 4); // Set GPIO falling interrupt
599 GPIOINT->IO0IntEnR |= (1 << 4); // Set GPIO rising interrupt
600 PINCON->PINSEL0 &= ~(0x3 << 8);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000601
Brian Silverman6ad00b82013-03-27 19:02:38 -0700602 GPIOINT->IO0IntEnF |= (1 << 5); // Set GPIO falling interrupt
603 GPIOINT->IO0IntEnR |= (1 << 5); // Set GPIO rising interrupt
604 PINCON->PINSEL0 &= ~(0x3 << 10);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000605
Brian Silverman6ad00b82013-03-27 19:02:38 -0700606 GPIOINT->IO0IntEnR |= (1 << 6); // Set GPIO rising interrupt
607 PINCON->PINSEL0 &= ~(0x3 << 12);
Austin Schuh63d0e9b2013-03-27 04:43:14 +0000608
Brian Silverman6ad00b82013-03-27 19:02:38 -0700609 GPIOINT->IO0IntEnR |= (1 << 7); // Set GPIO rising interrupt
610 PINCON->PINSEL0 &= ~(0x3 << 14);
brians0ab60bb2013-01-31 02:21:51 +0000611}