blob: 2d7af87eab2bdcd2fd72f0ea3a668f0f4ec2c6da [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 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;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070021using ::frc971::sensors::gyro;
Brian Silvermanf4937f62013-10-16 10:32:00 -070022using ::aos::util::WrappingCounter;
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070023
24namespace frc971 {
25namespace {
26
Brian Silverman6eb51f12013-11-02 14:39:01 -070027double drivetrain_translate(int32_t in) {
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070028 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
Brian Silverman1a6590d2013-11-04 14:46:46 -080029 constants::GetValues().drivetrain_encoder_ratio *
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070030 (3.5 /*wheel diameter*/ * 2.54 / 100.0 * M_PI);
31}
32
Brian Silverman74acd622013-10-26 14:47:14 -070033// Translates values from the ADC into voltage.
Brian Silverman6eb51f12013-11-02 14:39:01 -070034double adc_translate(uint16_t in) {
Brian Silverman74acd622013-10-26 14:47:14 -070035 static const double kVRefN = 0;
36 static const double kVRefP = 3.3;
Brian Silverman6eb51f12013-11-02 14:39:01 -070037 static const int kMaximumValue = 0xFFF;
38 static const double kDividerGnd = 31.6, kDividerOther = 28;
39 return (kVRefN +
Brian Silverman74acd622013-10-26 14:47:14 -070040 (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
Brian Silverman6eb51f12013-11-02 14:39:01 -070041 (kVRefP - kVRefN))) * (kDividerGnd + kDividerOther) / kDividerGnd;
Brian Silverman74acd622013-10-26 14:47:14 -070042}
43
Brian Silverman6eb51f12013-11-02 14:39:01 -070044double gyro_translate(int64_t in) {
Brian Silvermana280ae02013-10-28 18:21:15 -070045 return in / 16.0 / 1000.0 / (180.0 / M_PI);
46}
47
Brian Silverman6eb51f12013-11-02 14:39:01 -070048double battery_translate(uint16_t in) {
49 static const double kDividerBig = 98.9, kDividerSmall = 17.8;
50 return adc_translate(in) * kDividerBig / kDividerSmall;
51}
52
53double hall_translate(const constants::ShifterHallEffect &k, uint16_t in) {
54 const double voltage = adc_translate(in);
55 return (voltage - k.low) / (k.high - k.low);
Brian Silverman1ba46c72013-10-31 16:05:57 -070056}
57
Brian Silverman7d16c572014-01-03 20:27:57 -080058void PacketReceived(const ::bbb::DataStruct *data,
59 const ::aos::time::Time &cape_timestamp) {
Brian Silvermanb4a1f9f2014-02-14 17:59:55 -080060 ::frc971::logging_structs::CapeReading reading_to_log(cape_timestamp.sec(),
61 cape_timestamp.nsec());
62 LOG_STRUCT(DEBUG, "cape reading", reading_to_log);
Brian Silverman7d16c572014-01-03 20:27:57 -080063 bool bad_gyro;
64 if (data->uninitialized_gyro) {
65 LOG(DEBUG, "uninitialized gyro\n");
66 bad_gyro = true;
67 } else if (data->zeroing_gyro) {
68 LOG(DEBUG, "zeroing gyro\n");
69 bad_gyro = true;
70 } else if (data->bad_gyro) {
71 LOG(ERROR, "bad gyro\n");
72 bad_gyro = true;
73 gyro.MakeWithBuilder().angle(0).Send();
74 } else if (data->old_gyro_reading) {
75 LOG(WARNING, "old/bad gyro reading\n");
76 bad_gyro = true;
77 } else {
78 bad_gyro = false;
79 }
Brian Silverman756f9ff2014-01-17 23:40:23 -080080
81 if (!bad_gyro) {
82 gyro.MakeWithBuilder()
83 .angle(gyro_translate(data->gyro_angle))
84 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -080085 }
Brian Silverman756f9ff2014-01-17 23:40:23 -080086
87 drivetrain.position.MakeWithBuilder()
88 .right_encoder(drivetrain_translate(data->main.right_drive))
89 .left_encoder(-drivetrain_translate(data->main.left_drive))
90 .left_shifter_position(hall_translate(constants::GetValues().left_drive,
91 data->main.left_drive_hall))
92 .right_shifter_position(hall_translate(
93 constants::GetValues().right_drive, data->main.right_drive_hall))
94 .battery_voltage(battery_translate(data->main.battery_voltage))
95 .Send();
Brian Silverman7d16c572014-01-03 20:27:57 -080096}
97
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070098} // namespace
Brian Silverman2e0dcfd2013-03-30 22:44:40 -070099} // namespace frc971
100
101int main() {
Brian Silverman7d16c572014-01-03 20:27:57 -0800102 ::aos::Init(::bbb::SensorReader::kRelativePriority);
Brian Silvermane364e382014-02-08 21:51:33 -0800103 ::bbb::SensorReader reader("comp");
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700104 while (true) {
Brian Silverman7d16c572014-01-03 20:27:57 -0800105 ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp());
Brian Silverman2e0dcfd2013-03-30 22:44:40 -0700106 }
107 ::aos::Cleanup();
108}