blob: f375f20667c67a7c93ca28924926827d27d83963 [file] [log] [blame]
Brian Silverman1ba46c72013-10-31 16:05:57 -07001#include <inttypes.h>
2
Brian Silverman14fd0fb2014-01-14 21:42:01 -08003#include "aos/linux_code/init.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -07004#include "aos/common/logging/logging.h"
Brian Silvermanf4937f62013-10-16 10:32:00 -07005#include "aos/common/util/wrapping_counter.h"
Brian Silverman7d16c572014-01-03 20:27:57 -08006#include "aos/common/time.h"
Brian Silvermanb4a1f9f2014-02-14 17:59:55 -08007#include "aos/common/logging/queue_logging.h"
Brian Silverman7d16c572014-01-03 20:27:57 -08008
9#include "bbb/sensor_reader.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070010
11#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Brian Silverman756f9ff2014-01-17 23:40:23 -080012#include "frc971/queues/gyro_angle.q.h"
Brian Silverman6eb51f12013-11-02 14:39:01 -070013#include "frc971/constants.h"
Brian Silvermanb4a1f9f2014-02-14 17:59:55 -080014#include "frc971/queues/to_log.q.h"
Brian Silverman5b433df2014-02-17 11:57:37 -080015#include "frc971/control_loops/shooter/shooter.q.h"
16#include "frc971/control_loops/claw/claw.q.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070017
18#ifndef M_PI
19#define M_PI 3.14159265358979323846
20#endif
21
22using ::frc971::control_loops::drivetrain;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070023using ::frc971::sensors::gyro;
Brian Silvermanf4937f62013-10-16 10:32:00 -070024using ::aos::util::WrappingCounter;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070025
26namespace frc971 {
27namespace {
28
Brian Silverman5b433df2014-02-17 11:57:37 -080029struct State {
30 struct HallEffectCounters {
31 WrappingCounter posedges, negedges;
32 };
33
34 HallEffectCounters plunger, pusher_distal, pusher_proximal, latch;
35
36 struct SingleClawState {
37 HallEffectCounters front, calibration, back;
38 } top_claw, bottom_claw;
39};
40
Brian Silverman6eb51f12013-11-02 14:39:01 -070041double drivetrain_translate(int32_t in) {
Brian Silverman02b23c32014-02-17 17:26:48 -080042 return static_cast<double>(in)
43 / (256.0 /*cpr*/ * 4.0 /*quad*/)
44 * (18.0 / 50.0 /*output stage*/) * (56.0 / 30.0 /*encoder gears*/)
45 // * constants::GetValues().drivetrain_encoder_ratio
46 * (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070047}
48
Brian Silverman74acd622013-10-26 14:47:14 -070049// Translates values from the ADC into voltage.
Brian Silverman5b433df2014-02-17 11:57:37 -080050// TODO(brian): Fix this.
Brian Silverman6eb51f12013-11-02 14:39:01 -070051double adc_translate(uint16_t in) {
Brian Silvermanc8efb5e2014-02-18 21:03:24 -080052 static const double kVcc = 5;
Austin Schuh78d55462014-02-23 01:39:30 -080053 //static const double kR1 = 5, kR2 = 6.65;
Brian Silvermanc8efb5e2014-02-18 21:03:24 -080054 static const uint16_t kMaximumValue = 0x3FF;
Austin Schuh78d55462014-02-23 01:39:30 -080055 return (kVcc * static_cast<double>(in) / static_cast<double>(kMaximumValue));
Brian Silverman74acd622013-10-26 14:47:14 -070056}
57
Brian Silverman6eb51f12013-11-02 14:39:01 -070058double gyro_translate(int64_t in) {
Brian Silvermana280ae02013-10-28 18:21:15 -070059 return in / 16.0 / 1000.0 / (180.0 / M_PI);
60}
61
Brian Silverman6eb51f12013-11-02 14:39:01 -070062double battery_translate(uint16_t in) {
63 static const double kDividerBig = 98.9, kDividerSmall = 17.8;
64 return adc_translate(in) * kDividerBig / kDividerSmall;
65}
66
67double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
68 const double voltage = adc_translate(in);
69 return (voltage - k.low) / (k.high - k.low);
Brian Silverman1ba46c72013-10-31 16:05:57 -070070}
71
Brian Silverman258349f2014-02-17 21:38:53 -080072double claw_translate(int32_t in) {
Brian Silverman02b23c32014-02-17 17:26:48 -080073 return static_cast<double>(in)
74 / (256.0 /*cpr*/ * 4.0 /*quad*/)
Brian Silverman258349f2014-02-17 21:38:53 -080075 / (18.0 / 48.0 /*encoder gears*/)
76 / (12.0 / 60.0 /*chain reduction*/)
Austin Schuh78d55462014-02-23 01:39:30 -080077 * (M_PI / 180.0)
78 * 2.0 /*TODO(austin): Debug this, encoders read too little*/;
Brian Silverman5b433df2014-02-17 11:57:37 -080079}
80
Brian Silverman258349f2014-02-17 21:38:53 -080081double shooter_translate(int32_t in) {
Brian Silverman02b23c32014-02-17 17:26:48 -080082 return static_cast<double>(in)
83 / (256.0 /*cpr*/ * 4.0 /*quad*/)
84 * 16 /*sprocket teeth*/ * 0.375 /*chain pitch*/
85 * (2.54 / 100.0 /*in to m*/);
Brian Silverman5b433df2014-02-17 11:57:37 -080086}
87
Brian Silvermanfac5c292014-02-17 15:26:57 -080088template<typename Structure>
89void CopyHallEffectEdges(Structure *output,
Brian Silverman5b433df2014-02-17 11:57:37 -080090 const ::bbb::HallEffectEdges &input,
91 State::HallEffectCounters *state) {
92 output->posedge_count = state->posedges.Update(input.posedges);
93 output->negedge_count = state->negedges.Update(input.negedges);
94}
95
96void CopyClawPosition(control_loops::HalfClawPosition *output,
97 const ::bbb::SingleClawPosition &input,
Brian Silverman258349f2014-02-17 21:38:53 -080098 State::SingleClawState *state,
99 bool reversed) {
Brian Silverman5b433df2014-02-17 11:57:37 -0800100 CopyHallEffectEdges(&output->front, input.front, &state->front);
Brian Silverman258349f2014-02-17 21:38:53 -0800101 output->front.current = input.bools.front;
Brian Silverman5b433df2014-02-17 11:57:37 -0800102 CopyHallEffectEdges(&output->calibration, input.calibration,
103 &state->calibration);
Brian Silverman258349f2014-02-17 21:38:53 -0800104 output->calibration.current = input.bools.calibration;
Brian Silverman5b433df2014-02-17 11:57:37 -0800105 CopyHallEffectEdges(&output->back, input.back, &state->back);
Brian Silverman258349f2014-02-17 21:38:53 -0800106 output->back.current = input.bools.back;
Brian Silverman5b433df2014-02-17 11:57:37 -0800107
Brian Silverman258349f2014-02-17 21:38:53 -0800108 const double multiplier = reversed ? -1.0 : 1.0;
109
110 output->position = multiplier * claw_translate(input.position);
111 output->posedge_value = multiplier * claw_translate(input.posedge_position);
112 output->negedge_value = multiplier * claw_translate(input.negedge_position);
Brian Silverman5b433df2014-02-17 11:57:37 -0800113}
114
Brian Silverman7d16c572014-01-03 20:27:57 -0800115void PacketReceived(const ::bbb::DataStruct *data,
Brian Silverman5b433df2014-02-17 11:57:37 -0800116 const ::aos::time::Time &cape_timestamp,
117 State *state) {
Brian Silverman258349f2014-02-17 21:38:53 -0800118 ::frc971::logging_structs::CapeReading reading_to_log(
119 cape_timestamp.sec(), cape_timestamp.nsec(),
120 data->main.ultrasonic_pulse_length);
Brian Silvermanb4a1f9f2014-02-14 17:59:55 -0800121 LOG_STRUCT(DEBUG, "cape reading", reading_to_log);
Brian Silverman7d16c572014-01-03 20:27:57 -0800122 bool bad_gyro;
123 if (data->uninitialized_gyro) {
124 LOG(DEBUG, "uninitialized gyro\n");
125 bad_gyro = true;
126 } else if (data->zeroing_gyro) {
127 LOG(DEBUG, "zeroing gyro\n");
128 bad_gyro = true;
129 } else if (data->bad_gyro) {
130 LOG(ERROR, "bad gyro\n");
131 bad_gyro = true;
132 gyro.MakeWithBuilder().angle(0).Send();
133 } else if (data->old_gyro_reading) {
134 LOG(WARNING, "old/bad gyro reading\n");
135 bad_gyro = true;
136 } else {
137 bad_gyro = false;
138 }
Brian Silverman756f9ff2014-01-17 23:40:23 -0800139
140 if (!bad_gyro) {
141 gyro.MakeWithBuilder()
142 .angle(gyro_translate(data->gyro_angle))
143 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -0800144 }
Brian Silverman756f9ff2014-01-17 23:40:23 -0800145
146 drivetrain.position.MakeWithBuilder()
147 .right_encoder(drivetrain_translate(data->main.right_drive))
148 .left_encoder(-drivetrain_translate(data->main.left_drive))
149 .left_shifter_position(hall_translate(constants::GetValues().left_drive,
150 data->main.left_drive_hall))
151 .right_shifter_position(hall_translate(
152 constants::GetValues().right_drive, data->main.right_drive_hall))
153 .battery_voltage(battery_translate(data->main.battery_voltage))
154 .Send();
Brian Silverman5b433df2014-02-17 11:57:37 -0800155
156 {
157 auto claw_position = control_loops::claw_queue_group.position.MakeMessage();
158 CopyClawPosition(&claw_position->top, data->main.top_claw,
Brian Silverman258349f2014-02-17 21:38:53 -0800159 &state->top_claw, false);
Brian Silverman5b433df2014-02-17 11:57:37 -0800160 CopyClawPosition(&claw_position->bottom, data->main.bottom_claw,
Brian Silverman258349f2014-02-17 21:38:53 -0800161 &state->bottom_claw, true);
Brian Silverman5b433df2014-02-17 11:57:37 -0800162 claw_position.Send();
163 }
164
165 {
166 auto shooter_position =
167 control_loops::shooter_queue_group.position.MakeMessage();
168
Brian Silvermanfac5c292014-02-17 15:26:57 -0800169 shooter_position->plunger = data->main.bools.plunger;
Brian Silverman5b433df2014-02-17 11:57:37 -0800170 CopyHallEffectEdges(&shooter_position->pusher_distal,
171 data->main.pusher_distal, &state->pusher_distal);
172 shooter_position->pusher_distal.current = data->main.bools.pusher_distal;
173 CopyHallEffectEdges(&shooter_position->pusher_proximal,
174 data->main.pusher_proximal, &state->pusher_proximal);
175 shooter_position->pusher_proximal.current =
176 data->main.bools.pusher_proximal;
Brian Silvermanfac5c292014-02-17 15:26:57 -0800177 shooter_position->latch = data->main.bools.latch;
Brian Silverman5b433df2014-02-17 11:57:37 -0800178
179 shooter_position->position = shooter_translate(data->main.shooter_position);
Brian Silvermanfac5c292014-02-17 15:26:57 -0800180 shooter_position->pusher_distal.posedge_value =
181 shooter_translate(data->main.pusher_distal_posedge_position);
182 shooter_position->pusher_proximal.posedge_value =
183 shooter_translate(data->main.pusher_proximal_posedge_position);
Brian Silverman5b433df2014-02-17 11:57:37 -0800184
185 shooter_position.Send();
186 }
Brian Silverman7d16c572014-01-03 20:27:57 -0800187}
188
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700189} // namespace
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700190} // namespace frc971
191
192int main() {
Brian Silverman7d16c572014-01-03 20:27:57 -0800193 ::aos::Init(::bbb::SensorReader::kRelativePriority);
Brian Silvermane364e382014-02-08 21:51:33 -0800194 ::bbb::SensorReader reader("comp");
Brian Silverman5b433df2014-02-17 11:57:37 -0800195 ::frc971::State state;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700196 while (true) {
Brian Silverman5b433df2014-02-17 11:57:37 -0800197 ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp(),
198 &state);
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700199 }
200 ::aos::Cleanup();
201}