blob: c55417361cb02bd654e9b7fc0a26707a0975edb3 [file] [log] [blame]
Brian Silverman1ba46c72013-10-31 16:05:57 -07001#include <inttypes.h>
2
Brian Silverman2e0dcfd2013-03-30 22:44:40 -07003#include "aos/atom_code/init.h"
4#include "aos/common/logging/logging.h"
Brian Silvermanf4937f62013-10-16 10:32:00 -07005#include "aos/common/util/wrapping_counter.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -07006
7#include "frc971/control_loops/drivetrain/drivetrain.q.h"
8#include "frc971/control_loops/wrist/wrist_motor.q.h"
9#include "frc971/control_loops/angle_adjust/angle_adjust_motor.q.h"
10#include "frc971/control_loops/index/index_motor.q.h"
11#include "frc971/control_loops/shooter/shooter_motor.q.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070012#include "frc971/queues/GyroAngle.q.h"
Brian Silverman1e869f32013-10-25 18:00:20 -070013#include "frc971/input/usb_receiver.h"
Brian Silverman6eb51f12013-11-02 14:39:01 -070014#include "frc971/constants.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070015
16#ifndef M_PI
17#define M_PI 3.14159265358979323846
18#endif
19
20using ::frc971::control_loops::drivetrain;
21using ::frc971::control_loops::wrist;
22using ::frc971::control_loops::angle_adjust;
23using ::frc971::control_loops::shooter;
24using ::frc971::control_loops::index_loop;
25using ::frc971::sensors::gyro;
Brian Silvermanf4937f62013-10-16 10:32:00 -070026using ::aos::util::WrappingCounter;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070027
28namespace frc971 {
29namespace {
30
Brian Silverman6eb51f12013-11-02 14:39:01 -070031double drivetrain_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070032 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
33 (19.0 / 50.0) /*output reduction*/ * (64.0 / 24.0) /*encoder gears*/ *
34 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
35}
36
Brian Silverman6eb51f12013-11-02 14:39:01 -070037double wrist_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070038 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
39 (14.0 / 50.0 * 20.0 / 84.0) /*gears*/ * (2 * M_PI);
40}
41
Brian Silverman6eb51f12013-11-02 14:39:01 -070042double angle_adjust_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070043 static const double kCableDiameter = 0.060;
44 return -static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
45 ((0.75 + kCableDiameter) / (16.61125 + kCableDiameter)) /*pulleys*/ *
46 (2 * M_PI);
47}
48
Brian Silverman6eb51f12013-11-02 14:39:01 -070049double shooter_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070050 return static_cast<double>(in) / (32.0 /*cpr*/ * 4.0 /*quad*/) *
51 (15.0 / 34.0) /*gears*/ * (2 * M_PI);
52}
53
Brian Silverman6eb51f12013-11-02 14:39:01 -070054double index_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070055 return -static_cast<double>(in) / (128.0 /*cpr*/ * 4.0 /*quad*/) *
56 (1.0) /*gears*/ * (2 * M_PI);
57}
58
Brian Silverman74acd622013-10-26 14:47:14 -070059// Translates values from the ADC into voltage.
Brian Silverman6eb51f12013-11-02 14:39:01 -070060double adc_translate(uint16_t in) {
Brian Silverman74acd622013-10-26 14:47:14 -070061 static const double kVRefN = 0;
62 static const double kVRefP = 3.3;
Brian Silverman6eb51f12013-11-02 14:39:01 -070063 static const int kMaximumValue = 0xFFF;
64 static const double kDividerGnd = 31.6, kDividerOther = 28;
65 return (kVRefN +
Brian Silverman74acd622013-10-26 14:47:14 -070066 (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
Brian Silverman6eb51f12013-11-02 14:39:01 -070067 (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
Brian Silverman74acd622013-10-26 14:47:14 -070068}
69
Brian Silverman6eb51f12013-11-02 14:39:01 -070070double gyro_translate(int64_t in) {
Brian Silvermana280ae02013-10-28 18:21:15 -070071 return in / 16.0 / 1000.0 / (180.0 / M_PI);
72}
73
Brian Silverman6eb51f12013-11-02 14:39:01 -070074double battery_translate(uint16_t in) {
75 static const double kDividerBig = 98.9, kDividerSmall = 17.8;
76 return adc_translate(in) * kDividerBig / kDividerSmall;
77}
78
79double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
80 const double voltage = adc_translate(in);
81 return (voltage - k.low) / (k.high - k.low);
Brian Silverman1ba46c72013-10-31 16:05:57 -070082}
83
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070084} // namespace
85
Brian Silverman1e869f32013-10-25 18:00:20 -070086class GyroSensorReceiver : public USBReceiver {
Brian Silvermana280ae02013-10-28 18:21:15 -070087 public:
88 GyroSensorReceiver() : USBReceiver(2) {}
Brian Silvermanf4937f62013-10-16 10:32:00 -070089
Brian Silverman332a2542013-10-31 17:50:41 -070090 virtual void PacketReceived(const ::aos::time::Time &/*timestamp*/) override {
91 if (data()->bad_gyro) {
92 LOG(ERROR, "bad gyro\n");
93 bad_gyro_ = true;
94 gyro.MakeWithBuilder().angle(0).Send();
95 } else if (data()->old_gyro_reading) {
96 LOG(WARNING, "old gyro reading\n");
97 bad_gyro_ = true;
98 } else {
99 bad_gyro_ = false;
100 }
101 }
102
Brian Silvermana280ae02013-10-28 18:21:15 -0700103 virtual void ProcessData(const ::aos::time::Time &/*timestamp*/) override {
Brian Silverman332a2542013-10-31 17:50:41 -0700104 if (!bad_gyro_) {
105 gyro.MakeWithBuilder()
106 .angle(gyro_translate(data()->gyro_angle))
107 .Send();
108 }
Brian Silvermanf4937f62013-10-16 10:32:00 -0700109
110 drivetrain.position.MakeWithBuilder()
111 .right_encoder(drivetrain_translate(data()->main.right_drive))
112 .left_encoder(-drivetrain_translate(data()->main.left_drive))
113 .Send();
114
115 wrist.position.MakeWithBuilder()
116 .pos(wrist_translate(data()->main.wrist))
Brian Silvermancaeed862013-10-25 17:32:19 -0700117 .hall_effect(data()->main.wrist_hall_effect)
Brian Silvermanf4937f62013-10-16 10:32:00 -0700118 .calibration(wrist_translate(data()->main.capture_wrist_rise))
119 .Send();
120
121 angle_adjust.position.MakeWithBuilder()
122 .angle(angle_adjust_translate(data()->main.shooter_angle))
Brian Silvermancaeed862013-10-25 17:32:19 -0700123 .bottom_hall_effect(data()->main.angle_adjust_bottom_hall_effect)
Brian Silvermanf4937f62013-10-16 10:32:00 -0700124 .middle_hall_effect(false)
125 .bottom_calibration(angle_adjust_translate(
126 data()->main.capture_shooter_angle_rise))
127 .middle_calibration(angle_adjust_translate(
128 0))
129 .Send();
130
131 shooter.position.MakeWithBuilder()
132 .position(shooter_translate(data()->main.shooter))
133 .Send();
134
135 index_loop.position.MakeWithBuilder()
136 .index_position(index_translate(data()->main.indexer))
Brian Silvermancaeed862013-10-25 17:32:19 -0700137 .top_disc_detect(data()->main.top_disc)
Brian Silvermanf4937f62013-10-16 10:32:00 -0700138 .top_disc_posedge_count(top_rise_.Update(data()->main.top_rise_count))
139 .top_disc_posedge_position(
140 index_translate(data()->main.capture_top_rise))
141 .top_disc_negedge_count(top_fall_.Update(data()->main.top_fall_count))
142 .top_disc_negedge_position(
143 index_translate(data()->main.capture_top_fall))
Brian Silvermancaeed862013-10-25 17:32:19 -0700144 .bottom_disc_detect(data()->main.bottom_disc)
Brian Silvermanf4937f62013-10-16 10:32:00 -0700145 .bottom_disc_posedge_count(
146 bottom_rise_.Update(data()->main.bottom_rise_count))
147 .bottom_disc_negedge_count(
148 bottom_fall_.Update(data()->main.bottom_fall_count))
149 .bottom_disc_negedge_wait_position(index_translate(
150 data()->main.capture_bottom_fall_delay))
151 .bottom_disc_negedge_wait_count(
152 bottom_fall_delay_.Update(data()->main.bottom_fall_delay_count))
153 .loader_top(data()->main.loader_top)
154 .loader_bottom(data()->main.loader_bottom)
155 .Send();
Brian Silverman1ba46c72013-10-31 16:05:57 -0700156
157 LOG(DEBUG, "battery %f %f %" PRIu16 "\n",
158 battery_translate(data()->main.battery_voltage),
159 adc_translate(data()->main.battery_voltage),
160 data()->main.battery_voltage);
Brian Silverman6eb51f12013-11-02 14:39:01 -0700161 LOG(DEBUG, "halls l=%f r=%f %" PRIx16 " %" PRIx16 "\n",
Brian Silverman1ba46c72013-10-31 16:05:57 -0700162 adc_translate(data()->main.left_drive_hall),
Brian Silverman6eb51f12013-11-02 14:39:01 -0700163 adc_translate(data()->main.right_drive_hall),
164 data()->main.left_drive_hall,
165 data()->main.right_drive_hall);
166 LOG(DEBUG, "real l=%f r=%f\n",
167 hall_translate(constants::GetValues().left_drive,
168 data()->main.left_drive_hall),
169 hall_translate(constants::GetValues().right_drive,
170 data()->main.right_drive_hall));
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700171 }
172
Brian Silverman332a2542013-10-31 17:50:41 -0700173 bool bad_gyro_;
174
Brian Silvermanf4937f62013-10-16 10:32:00 -0700175 WrappingCounter top_rise_;
176 WrappingCounter top_fall_;
177 WrappingCounter bottom_rise_;
178 WrappingCounter bottom_fall_delay_;
179 WrappingCounter bottom_fall_;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700180};
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700181
182} // namespace frc971
183
184int main() {
Brian Silvermanf3cfbd72013-10-28 16:26:09 -0700185 ::aos::Init(frc971::USBReceiver::kRelativePriority);
Brian Silvermanf4937f62013-10-16 10:32:00 -0700186 ::frc971::GyroSensorReceiver receiver;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700187 while (true) {
188 receiver.RunIteration();
189 }
190 ::aos::Cleanup();
191}