blob: c33dc36e4bf5e0a51090d3e4ff84350b9c0135af [file] [log] [blame]
Brian Silverman78670262014-01-17 23:40:47 -08001#include "cape/robot.h"
2
3#include <STM32F2XX.h>
4
5#include "cape/encoder.h"
6#include "cape/analog.h"
7#include "cape/digital.h"
8#include "cape/util.h"
Brian Silverman0bca3ba2014-03-26 14:07:55 -07009#include "cape/timer.h"
Brian Silverman78670262014-01-17 23:40:47 -080010
Brian Silvermanfac5c292014-02-17 15:26:57 -080011typedef struct {
12 uint32_t posedges, negedges;
13} EdgeCounts;
14
15#define COPY_EDGE_COUNTS(edge_counts, hall_effect_edges) \
Brian Silverman258349f2014-02-17 21:38:53 -080016 hall_effect_edges.posedges = edge_counts.negedges; \
17 hall_effect_edges.negedges = edge_counts.posedges;
Brian Silvermanfac5c292014-02-17 15:26:57 -080018
19#define HALL_CAPTURE(num, edges, encoder, capture) \
20 void digital_capture_##num##P(void) { \
21 ++edges.posedges; \
22 capture.posedge = encoder_read(encoder); \
23 } \
24 void digital_capture_##num##N(void) { \
25 ++edges.negedges; \
26 capture.negedge = encoder_read(encoder); \
27 }
28#define HALL_CAPTURE_DECL(num, edges, encoder, capture) \
29 static volatile EdgeCounts edges = {0, 0}; \
30 HALL_CAPTURE(num, edges, encoder, capture)
31
32static volatile struct {
33 int32_t posedge, negedge;
34} pusher_distal_captures, pusher_proximal_captures;
35
Brian Silverman258349f2014-02-17 21:38:53 -080036#define SHOOTER(plunger_num, pusher_distal_num, pusher_proximal_num, \
37 latch_num, encoder) \
38 HALL_CAPTURE_DECL(pusher_distal_num, pusher_distal, encoder, \
39 pusher_distal_captures); \
40 HALL_CAPTURE_DECL(pusher_proximal_num, pusher_proximal, encoder, \
41 pusher_proximal_captures); \
42 static inline void fill_shooter_values(struct DataStruct *packet) { \
43 digital_capture_disable(pusher_distal_num); \
44 digital_capture_disable(pusher_proximal_num); \
45 packet->main.shooter_position = encoder_read(encoder); \
46 packet->main.pusher_distal_posedge_position = \
47 pusher_distal_captures.negedge; \
48 packet->main.pusher_proximal_posedge_position = \
49 pusher_proximal_captures.negedge; \
50 packet->main.bools.pusher_distal = !digital_read(pusher_distal_num); \
51 packet->main.bools.pusher_proximal = !digital_read(pusher_proximal_num); \
52 COPY_EDGE_COUNTS(pusher_distal, packet->main.pusher_distal); \
53 COPY_EDGE_COUNTS(pusher_proximal, packet->main.pusher_proximal); \
54 digital_capture_enable(pusher_distal_num); \
55 digital_capture_enable(pusher_proximal_num); \
56 packet->main.bools.plunger = !digital_read(plunger_num); \
57 packet->main.bools.latch = !digital_read(latch_num); \
Brian Silvermanfac5c292014-02-17 15:26:57 -080058 }
59
Brian Silvermanfac5c292014-02-17 15:26:57 -080060typedef struct {
61 int32_t posedge, negedge;
62 EdgeCounts front, calibration, back;
63} SingleClawCaptures;
64
65#define CLAW(front_num, calibration_num, back_num, name, encoder) \
66 static volatile SingleClawCaptures name = {0, 0, {0, 0}, {0, 0}, {0, 0}}; \
67 HALL_CAPTURE(front_num, name.front, encoder, name); \
68 HALL_CAPTURE(calibration_num, name.calibration, encoder, name); \
69 HALL_CAPTURE(back_num, name.back, encoder, name); \
70 static inline void fill_##name##_values(struct DataStruct *packet) { \
71 digital_capture_disable(front_num); \
72 digital_capture_disable(calibration_num); \
73 digital_capture_disable(back_num); \
74 packet->main.name.position = encoder_read(encoder); \
Brian Silverman258349f2014-02-17 21:38:53 -080075 packet->main.name.negedge_position = name.posedge; \
76 packet->main.name.posedge_position = name.negedge; \
77 packet->main.name.bools.front = !digital_read(front_num); \
78 packet->main.name.bools.calibration = !digital_read(calibration_num); \
79 packet->main.name.bools.back = !digital_read(back_num); \
Brian Silvermanfac5c292014-02-17 15:26:57 -080080 COPY_EDGE_COUNTS(name.front, packet->main.name.front); \
81 COPY_EDGE_COUNTS(name.calibration, packet->main.name.calibration); \
82 COPY_EDGE_COUNTS(name.back, packet->main.name.back); \
83 digital_capture_enable(front_num); \
84 digital_capture_enable(calibration_num); \
85 digital_capture_enable(back_num); \
86 }
87
Brian Silverman258349f2014-02-17 21:38:53 -080088CLAW(1, 2, 0, top_claw, 2);
89CLAW(10, 11, 9, bottom_claw, 7);
Brian Silverman30a65dd2014-02-17 17:32:14 -080090SHOOTER(7, 5, 4, 8, 0)
Brian Silvermanfac5c292014-02-17 15:26:57 -080091
Brian Silverman0bca3ba2014-03-26 14:07:55 -070092// TIM11.1 on PB9, aka digital input 6.
93timer_declare(TIM11, TIM1_TR_GCOM_TIM11_IRQHandler, 1, 1, ultrasonic)
Brian Silverman78670262014-01-17 23:40:47 -080094
95void robot_init(void) {
Brian Silvermanc47182f2014-02-16 21:43:36 -080096 gpio_setup_alt(GPIOB, 9, 3);
Brian Silverman78670262014-01-17 23:40:47 -080097 RCC->APB2ENR |= RCC_APB2ENR_TIM11EN;
Brian Silverman78670262014-01-17 23:40:47 -080098 TIM11->CCMR1 = TIM_CCMR1_CC1S_0 /* input pin 1 -> timer input 1 */;
Brian Silverman0bca3ba2014-03-26 14:07:55 -070099 TIM11->PSC = 1200 - 1; // 100KHz timer
Brian Silverman355ab4b2014-03-26 20:46:05 -0700100 //timer_setup(TIM11, TIM1_TRG_COM_TIM11_IRQn, 1);
Brian Silverman78670262014-01-17 23:40:47 -0800101}
102
103void robot_fill_packet(struct DataStruct *packet) {
Brian Silvermanfac5c292014-02-17 15:26:57 -0800104 packet->main.left_drive = encoder_read(6);
105 packet->main.right_drive = encoder_read(5);
Austin Schuh809c2562014-03-02 11:50:19 -0800106 packet->main.low_left_drive_hall = analog_get(7);
107 packet->main.low_right_drive_hall = analog_get(0);
108 packet->main.high_left_drive_hall = analog_get(6);
109 packet->main.high_right_drive_hall = analog_get(1);
Brian Silvermanfac5c292014-02-17 15:26:57 -0800110
Brian Silverman56658322014-03-22 16:57:22 -0700111 packet->main.battery_voltage_high = analog_get(5);
112 packet->main.battery_voltage_low = analog_get(3);
113
Brian Silverman0bca3ba2014-03-26 14:07:55 -0700114 packet->main.ultrasonic_pulse_length = ultrasonic_length;
Brian Silvermanfac5c292014-02-17 15:26:57 -0800115
116 fill_top_claw_values(packet);
117 fill_bottom_claw_values(packet);
Brian Silverman258349f2014-02-17 21:38:53 -0800118 fill_shooter_values(packet);
Brian Silverman78670262014-01-17 23:40:47 -0800119}