blob: eb2bb9a3b899b46f4eae136bed93b303c296c998 [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"
7
8#include "bbb/sensor_reader.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -07009
10#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Brian Silverman756f9ff2014-01-17 23:40:23 -080011#include "frc971/queues/gyro_angle.q.h"
Brian Silverman6eb51f12013-11-02 14:39:01 -070012#include "frc971/constants.h"
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070013
14#ifndef M_PI
15#define M_PI 3.14159265358979323846
16#endif
17
18using ::frc971::control_loops::drivetrain;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070019using ::frc971::sensors::gyro;
Brian Silvermanf4937f62013-10-16 10:32:00 -070020using ::aos::util::WrappingCounter;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070021
22namespace frc971 {
23namespace {
24
Brian Silverman6eb51f12013-11-02 14:39:01 -070025double drivetrain_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070026 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
Brian Silverman1a6590d2013-11-04 14:46:46 -080027 constants::GetValues().drivetrain_encoder_ratio *
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070028 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
29}
30
Brian Silverman74acd622013-10-26 14:47:14 -070031// Translates values from the ADC into voltage.
Brian Silverman6eb51f12013-11-02 14:39:01 -070032double adc_translate(uint16_t in) {
Brian Silverman74acd622013-10-26 14:47:14 -070033 static const double kVRefN = 0;
34 static const double kVRefP = 3.3;
Brian Silverman6eb51f12013-11-02 14:39:01 -070035 static const int kMaximumValue = 0xFFF;
36 static const double kDividerGnd = 31.6, kDividerOther = 28;
37 return (kVRefN +
Brian Silverman74acd622013-10-26 14:47:14 -070038 (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
Brian Silverman6eb51f12013-11-02 14:39:01 -070039 (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
Brian Silverman74acd622013-10-26 14:47:14 -070040}
41
Brian Silverman6eb51f12013-11-02 14:39:01 -070042double gyro_translate(int64_t in) {
Brian Silvermana280ae02013-10-28 18:21:15 -070043 return in / 16.0 / 1000.0 / (180.0 / M_PI);
44}
45
Brian Silverman6eb51f12013-11-02 14:39:01 -070046double battery_translate(uint16_t in) {
47 static const double kDividerBig = 98.9, kDividerSmall = 17.8;
48 return adc_translate(in) * kDividerBig / kDividerSmall;
49}
50
51double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
52 const double voltage = adc_translate(in);
53 return (voltage - k.low) / (k.high - k.low);
Brian Silverman1ba46c72013-10-31 16:05:57 -070054}
55
Brian Silverman7d16c572014-01-03 20:27:57 -080056void PacketReceived(const ::bbb::DataStruct *data,
57 const ::aos::time::Time &cape_timestamp) {
58 LOG(DEBUG, "cape timestamp %010" PRId32 ".%09" PRId32 "s\n",
59 cape_timestamp.sec(), cape_timestamp.nsec());
60 bool bad_gyro;
61 if (data->uninitialized_gyro) {
62 LOG(DEBUG, "uninitialized gyro\n");
63 bad_gyro = true;
64 } else if (data->zeroing_gyro) {
65 LOG(DEBUG, "zeroing gyro\n");
66 bad_gyro = true;
67 } else if (data->bad_gyro) {
68 LOG(ERROR, "bad gyro\n");
69 bad_gyro = true;
70 gyro.MakeWithBuilder().angle(0).Send();
71 } else if (data->old_gyro_reading) {
72 LOG(WARNING, "old/bad gyro reading\n");
73 bad_gyro = true;
74 } else {
75 bad_gyro = false;
76 }
Brian Silverman756f9ff2014-01-17 23:40:23 -080077
78 if (!bad_gyro) {
79 gyro.MakeWithBuilder()
80 .angle(gyro_translate(data->gyro_angle))
81 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -080082 }
Brian Silverman756f9ff2014-01-17 23:40:23 -080083
84 drivetrain.position.MakeWithBuilder()
85 .right_encoder(drivetrain_translate(data->main.right_drive))
86 .left_encoder(-drivetrain_translate(data->main.left_drive))
87 .left_shifter_position(hall_translate(constants::GetValues().left_drive,
88 data->main.left_drive_hall))
89 .right_shifter_position(hall_translate(
90 constants::GetValues().right_drive, data->main.right_drive_hall))
91 .battery_voltage(battery_translate(data->main.battery_voltage))
92 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -080093}
94
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070095} // namespace
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070096} // namespace frc971
97
98int main() {
Brian Silverman7d16c572014-01-03 20:27:57 -080099 ::aos::Init(::bbb::SensorReader::kRelativePriority);
100 ::bbb::SensorReader reader("main");
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700101 while (true) {
Brian Silverman7d16c572014-01-03 20:27:57 -0800102 ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp());
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700103 }
104 ::aos::Cleanup();
105}