blob: a7005a4d69bc7076887f5a876228123a97c913c6 [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 Silverman2e0dcfd2013-03-30 22:44:40 -070042 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
Brian Silverman1a6590d2013-11-04 14:46:46 -080043 constants::GetValues().drivetrain_encoder_ratio *
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070044 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
45}
46
Brian Silverman74acd622013-10-26 14:47:14 -070047// Translates values from the ADC into voltage.
Brian Silverman5b433df2014-02-17 11:57:37 -080048// TODO(brian): Fix this.
Brian Silverman6eb51f12013-11-02 14:39:01 -070049double adc_translate(uint16_t in) {
Brian Silverman74acd622013-10-26 14:47:14 -070050 static const double kVRefN = 0;
51 static const double kVRefP = 3.3;
Brian Silverman6eb51f12013-11-02 14:39:01 -070052 static const int kMaximumValue = 0xFFF;
53 static const double kDividerGnd = 31.6, kDividerOther = 28;
54 return (kVRefN +
Brian Silverman74acd622013-10-26 14:47:14 -070055 (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
Brian Silverman6eb51f12013-11-02 14:39:01 -070056 (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
Brian Silverman74acd622013-10-26 14:47:14 -070057}
58
Brian Silverman6eb51f12013-11-02 14:39:01 -070059double gyro_translate(int64_t in) {
Brian Silvermana280ae02013-10-28 18:21:15 -070060 return in / 16.0 / 1000.0 / (180.0 / M_PI);
61}
62
Brian Silverman6eb51f12013-11-02 14:39:01 -070063double battery_translate(uint16_t in) {
64 static const double kDividerBig = 98.9, kDividerSmall = 17.8;
65 return adc_translate(in) * kDividerBig / kDividerSmall;
66}
67
68double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
69 const double voltage = adc_translate(in);
70 return (voltage - k.low) / (k.high - k.low);
Brian Silverman1ba46c72013-10-31 16:05:57 -070071}
72
Brian Silverman5b433df2014-02-17 11:57:37 -080073double shooter_translate(int32_t in) {
74 // TODO(brians): Put real numbers in.
75 return in;
76}
77
78double claw_translate(int32_t in) {
79 // TODO(brians): Put real numbers in.
80 return in;
81}
82
83void CopyHallEffectEdges(HallEffectStruct *output,
84 const ::bbb::HallEffectEdges &input,
85 State::HallEffectCounters *state) {
86 output->posedge_count = state->posedges.Update(input.posedges);
87 output->negedge_count = state->negedges.Update(input.negedges);
88}
89
90void CopyClawPosition(control_loops::HalfClawPosition *output,
91 const ::bbb::SingleClawPosition &input,
92 State::SingleClawState *state) {
93 CopyHallEffectEdges(&output->front, input.front, &state->front);
94 CopyHallEffectEdges(&output->calibration, input.calibration,
95 &state->calibration);
96 CopyHallEffectEdges(&output->back, input.back, &state->back);
97
98 output->position = claw_translate(input.position);
99 output->posedge_value = claw_translate(input.posedge_position);
100 output->negedge_value = claw_translate(input.negedge_position);
101}
102
Brian Silverman7d16c572014-01-03 20:27:57 -0800103void PacketReceived(const ::bbb::DataStruct *data,
Brian Silverman5b433df2014-02-17 11:57:37 -0800104 const ::aos::time::Time &cape_timestamp,
105 State *state) {
Brian Silvermanb4a1f9f2014-02-14 17:59:55 -0800106 ::frc971::logging_structs::CapeReading reading_to_log(cape_timestamp.sec(),
107 cape_timestamp.nsec());
108 LOG_STRUCT(DEBUG, "cape reading", reading_to_log);
Brian Silverman7d16c572014-01-03 20:27:57 -0800109 bool bad_gyro;
110 if (data->uninitialized_gyro) {
111 LOG(DEBUG, "uninitialized gyro\n");
112 bad_gyro = true;
113 } else if (data->zeroing_gyro) {
114 LOG(DEBUG, "zeroing gyro\n");
115 bad_gyro = true;
116 } else if (data->bad_gyro) {
117 LOG(ERROR, "bad gyro\n");
118 bad_gyro = true;
119 gyro.MakeWithBuilder().angle(0).Send();
120 } else if (data->old_gyro_reading) {
121 LOG(WARNING, "old/bad gyro reading\n");
122 bad_gyro = true;
123 } else {
124 bad_gyro = false;
125 }
Brian Silverman756f9ff2014-01-17 23:40:23 -0800126
127 if (!bad_gyro) {
128 gyro.MakeWithBuilder()
129 .angle(gyro_translate(data->gyro_angle))
130 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -0800131 }
Brian Silverman756f9ff2014-01-17 23:40:23 -0800132
133 drivetrain.position.MakeWithBuilder()
134 .right_encoder(drivetrain_translate(data->main.right_drive))
135 .left_encoder(-drivetrain_translate(data->main.left_drive))
136 .left_shifter_position(hall_translate(constants::GetValues().left_drive,
137 data->main.left_drive_hall))
138 .right_shifter_position(hall_translate(
139 constants::GetValues().right_drive, data->main.right_drive_hall))
140 .battery_voltage(battery_translate(data->main.battery_voltage))
141 .Send();
Brian Silverman5b433df2014-02-17 11:57:37 -0800142
143 {
144 auto claw_position = control_loops::claw_queue_group.position.MakeMessage();
145 CopyClawPosition(&claw_position->top, data->main.top_claw,
146 &state->top_claw);
147 CopyClawPosition(&claw_position->bottom, data->main.bottom_claw,
148 &state->bottom_claw);
149 claw_position.Send();
150 }
151
152 {
153 auto shooter_position =
154 control_loops::shooter_queue_group.position.MakeMessage();
155
156 CopyHallEffectEdges(&shooter_position->plunger, data->main.plunger,
157 &state->plunger);
158 shooter_position->plunger.current = data->main.bools.plunger;
159 CopyHallEffectEdges(&shooter_position->pusher_distal,
160 data->main.pusher_distal, &state->pusher_distal);
161 shooter_position->pusher_distal.current = data->main.bools.pusher_distal;
162 CopyHallEffectEdges(&shooter_position->pusher_proximal,
163 data->main.pusher_proximal, &state->pusher_proximal);
164 shooter_position->pusher_proximal.current =
165 data->main.bools.pusher_proximal;
166 CopyHallEffectEdges(&shooter_position->latch, data->main.latch,
167 &state->latch);
168 shooter_position->latch.current = data->main.bools.latch;
169
170 shooter_position->position = shooter_translate(data->main.shooter_position);
171 shooter_position->pusher_posedge_value =
172 shooter_translate(data->main.shooter_posedge_position);
173 shooter_position->pusher_negedge_value =
174 shooter_translate(data->main.shooter_negedge_position);
175
176 shooter_position.Send();
177 }
Brian Silverman7d16c572014-01-03 20:27:57 -0800178}
179
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700180} // namespace
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700181} // namespace frc971
182
183int main() {
Brian Silverman7d16c572014-01-03 20:27:57 -0800184 ::aos::Init(::bbb::SensorReader::kRelativePriority);
Brian Silvermane364e382014-02-08 21:51:33 -0800185 ::bbb::SensorReader reader("comp");
Brian Silverman5b433df2014-02-17 11:57:37 -0800186 ::frc971::State state;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700187 while (true) {
Brian Silverman5b433df2014-02-17 11:57:37 -0800188 ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp(),
189 &state);
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700190 }
191 ::aos::Cleanup();
192}