blob: 927e0041ed97b7e833aa0f39dbfba012d04dc6af [file] [log] [blame]
Daniel Petti53b11092013-11-02 05:53:16 +00001#include <inttypes.h>
2
Daniel Petti3fe36542013-09-25 04:18:24 +00003#include "aos/atom_code/init.h"
4#include "aos/common/logging/logging.h"
Daniel Petti0663d302013-10-27 05:39:39 +00005#include "aos/common/util/wrapping_counter.h"
Daniel Petti3fe36542013-09-25 04:18:24 +00006
Daniel Petti1f448512013-10-19 19:35:55 +00007#include "bot3/control_loops/drivetrain/drivetrain.q.h"
Daniel Petti3fe36542013-09-25 04:18:24 +00008#include "frc971/queues/GyroAngle.q.h"
Daniel Petti0663d302013-10-27 05:39:39 +00009#include "frc971/input/usb_receiver.h"
Daniel Petti3fe36542013-09-25 04:18:24 +000010
11#ifndef M_PI
12#define M_PI 3.14159265358979323846
13#endif
14
Daniel Petti1f448512013-10-19 19:35:55 +000015using ::bot3::control_loops::drivetrain;
Daniel Petti3fe36542013-09-25 04:18:24 +000016using ::frc971::sensors::gyro;
Daniel Petti0663d302013-10-27 05:39:39 +000017using ::aos::util::WrappingCounter;
18using ::frc971::USBReceiver;
Daniel Petti3fe36542013-09-25 04:18:24 +000019
Daniel Petti1f448512013-10-19 19:35:55 +000020namespace bot3 {
Daniel Petti3fe36542013-09-25 04:18:24 +000021namespace {
22
Daniel Pettib046c532013-10-29 03:40:40 +000023//TODO (danielp): Figure out whether the bigger gear is on the
24// encoder or not.
Daniel Petti3fe36542013-09-25 04:18:24 +000025inline double drivetrain_translate(int32_t in) {
26 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
Daniel Petti53b11092013-11-02 05:53:16 +000027 (32.0 / 44.0 /*encoder gears*/) * // the encoders are on the wheels.
Daniel Pettib046c532013-10-29 03:40:40 +000028 (3.5 /*wheel diameter*/ * 2.54 / 100 * M_PI);
Daniel Petti3fe36542013-09-25 04:18:24 +000029}
30
Daniel Petti53b11092013-11-02 05:53:16 +000031// Translates values from the ADC into voltage.
32inline double adc_translate(uint16_t in) {
33 static const double kVRefN = 0;
34 static const double kVRefP = 3.3;
35 static const int kMaximumValue = 0x3FF;
36 return kVRefN +
37 (static_cast<double>(in) / static_cast<double>(kMaximumValue) *
38 (kVRefP - kVRefN));
39}
40
41inline double gyro_translate(int64_t in) {
42 return in / 16.0 / 1000.0 / (180.0 / M_PI);
43}
44
45inline double battery_translate(uint16_t in) {
46 return adc_translate(in) * 80.8 / 17.8;
Daniel Petti3fe36542013-09-25 04:18:24 +000047}
48
Daniel Petti3fe36542013-09-25 04:18:24 +000049} // namespace
50
Daniel Petti0663d302013-10-27 05:39:39 +000051class GyroSensorReceiver : public USBReceiver {
Daniel Petti53b11092013-11-02 05:53:16 +000052 public:
53 GyroSensorReceiver() : USBReceiver(1) {}
Daniel Petti3fe36542013-09-25 04:18:24 +000054
Daniel Petti53b11092013-11-02 05:53:16 +000055 virtual void ProcessData(const ::aos::time::Time &/*timestamp*/) override {
Daniel Petti3fe36542013-09-25 04:18:24 +000056 gyro.MakeWithBuilder()
Daniel Petti53b11092013-11-02 05:53:16 +000057 .angle(gyro_translate(data()->gyro_angle))
Daniel Petti3fe36542013-09-25 04:18:24 +000058 .Send();
59
Daniel Petti53b11092013-11-02 05:53:16 +000060 LOG(DEBUG, "right drive: %f, left drive: %f\n",
61 drivetrain_translate(data()->main.shooter_angle),
62 drivetrain_translate(data()->main.indexer));
Daniel Petti3fe36542013-09-25 04:18:24 +000063 drivetrain.position.MakeWithBuilder()
Daniel Petti0663d302013-10-27 05:39:39 +000064 .right_encoder(drivetrain_translate(data()->main.right_drive))
65 .left_encoder(-drivetrain_translate(data()->main.left_drive))
Daniel Petti3fe36542013-09-25 04:18:24 +000066 .Send();
Daniel Petti53b11092013-11-02 05:53:16 +000067
68 LOG(DEBUG, "battery %f %f %" PRIu16 "\n",
69 battery_translate(data()->main.battery_voltage),
70 adc_translate(data()->main.battery_voltage),
71 data()->main.battery_voltage);
72 LOG(DEBUG, "halls l=%f r=%f\n",
73 adc_translate(data()->main.left_drive_hall),
74 adc_translate(data()->main.right_drive_hall));
Daniel Petti3fe36542013-09-25 04:18:24 +000075 }
Daniel Petti3fe36542013-09-25 04:18:24 +000076};
77
Daniel Petti1f448512013-10-19 19:35:55 +000078} // namespace bot3
Daniel Petti3fe36542013-09-25 04:18:24 +000079
80int main() {
Daniel Petti53b11092013-11-02 05:53:16 +000081 ::aos::Init(frc971::USBReceiver::kRelativePriority);
Daniel Petti0663d302013-10-27 05:39:39 +000082 ::bot3::GyroSensorReceiver receiver;
Daniel Petti3fe36542013-09-25 04:18:24 +000083 while (true) {
84 receiver.RunIteration();
85 }
86 ::aos::Cleanup();
87}