blob: 81e4190c1ad0bbd90af049d93c5bb415b332a241 [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"
James Kuszmaulf7f5ec12013-11-01 17:58:58 -07008#include "bot3/control_loops/shooter/shooter_motor.q.h"
Daniel Petti3fe36542013-09-25 04:18:24 +00009#include "frc971/queues/GyroAngle.q.h"
Daniel Petti0663d302013-10-27 05:39:39 +000010#include "frc971/input/usb_receiver.h"
Daniel Petti3fe36542013-09-25 04:18:24 +000011
12#ifndef M_PI
13#define M_PI 3.14159265358979323846
14#endif
15
Daniel Petti1f448512013-10-19 19:35:55 +000016using ::bot3::control_loops::drivetrain;
James Kuszmaulf7f5ec12013-11-01 17:58:58 -070017using ::bot3::control_loops::shooter;
Daniel Petti3fe36542013-09-25 04:18:24 +000018using ::frc971::sensors::gyro;
Daniel Petti0663d302013-10-27 05:39:39 +000019using ::aos::util::WrappingCounter;
20using ::frc971::USBReceiver;
Daniel Petti3fe36542013-09-25 04:18:24 +000021
Daniel Petti1f448512013-10-19 19:35:55 +000022namespace bot3 {
Daniel Petti3fe36542013-09-25 04:18:24 +000023namespace {
24
Daniel Petti03f58112013-11-09 16:35:55 +000025const double kWheelRadius = 1.964;
Daniel Pettiaba9c612013-11-14 10:17:35 -080026const double kTapeThickness = 3.12;
Daniel Petti03f58112013-11-09 16:35:55 +000027
Daniel Petti3fe36542013-09-25 04:18:24 +000028inline double drivetrain_translate(int32_t in) {
29 return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) *
Daniel Petti53b11092013-11-02 05:53:16 +000030 (32.0 / 44.0 /*encoder gears*/) * // the encoders are on the wheels.
Daniel Pettib046c532013-10-29 03:40:40 +000031 (3.5 /*wheel diameter*/ * 2.54 / 100 * M_PI);
Daniel Petti3fe36542013-09-25 04:18:24 +000032}
33
Daniel Petti44ad53a2013-11-04 05:47:52 +000034inline double shooter_translate(int32_t in) {
Daniel Petti00185262013-11-23 14:05:02 -080035 LOG(DEBUG, "raw %" PRId32 "\n", in);
36 if (in == 0) {
37 return 0;
38 }
Daniel Petti5003b772013-11-07 02:19:50 +000039 return 1.0 / (static_cast<double>(in) / (10 ^ 8)/*ticks per sec*/)
Daniel Petti03f58112013-11-09 16:35:55 +000040 / (1 - (kTapeThickness / (2 * kWheelRadius * M_PI))) * (2 * M_PI);
Daniel Petti53b11092013-11-02 05:53:16 +000041}
42
43inline double gyro_translate(int64_t in) {
44 return in / 16.0 / 1000.0 / (180.0 / M_PI);
45}
46
Daniel Petti3fe36542013-09-25 04:18:24 +000047} // namespace
48
Daniel Petti0663d302013-10-27 05:39:39 +000049class GyroSensorReceiver : public USBReceiver {
Daniel Petti53b11092013-11-02 05:53:16 +000050 public:
51 GyroSensorReceiver() : USBReceiver(1) {}
Daniel Petti3fe36542013-09-25 04:18:24 +000052
Daniel Petti53b11092013-11-02 05:53:16 +000053 virtual void ProcessData(const ::aos::time::Time &/*timestamp*/) override {
Daniel Petti3fe36542013-09-25 04:18:24 +000054 gyro.MakeWithBuilder()
Daniel Petti53b11092013-11-02 05:53:16 +000055 .angle(gyro_translate(data()->gyro_angle))
Daniel Petti3fe36542013-09-25 04:18:24 +000056 .Send();
57
Daniel Petti53b11092013-11-02 05:53:16 +000058 LOG(DEBUG, "right drive: %f, left drive: %f\n",
59 drivetrain_translate(data()->main.shooter_angle),
60 drivetrain_translate(data()->main.indexer));
Daniel Petti3fe36542013-09-25 04:18:24 +000061 drivetrain.position.MakeWithBuilder()
James Kuszmaulf601eaa2013-10-31 06:25:09 -070062 .right_encoder(drivetrain_translate(data()->main.wrist))
63 .left_encoder(drivetrain_translate(data()->main.shooter))
Daniel Petti3fe36542013-09-25 04:18:24 +000064 .Send();
James Kuszmaulb74c8112013-11-03 16:13:45 -080065 /*drivetrain.position.MakeWithBuilder()
66 .right_encoder(0)
67 .left_encoder(0)
68 .Send();*/
Daniel Petti44ad53a2013-11-04 05:47:52 +000069
Daniel Petti00185262013-11-23 14:05:02 -080070 LOG(DEBUG, "shooter: %f\n", shooter_translate(data()->bot3.shooter_cycle_ticks));
Daniel Petti44ad53a2013-11-04 05:47:52 +000071 shooter.position.MakeWithBuilder()
Daniel Petti03f58112013-11-09 16:35:55 +000072 .velocity(shooter_translate(data()->bot3.shooter_cycle_ticks))
73 .Send();
Daniel Petti3fe36542013-09-25 04:18:24 +000074 }
Daniel Petti3fe36542013-09-25 04:18:24 +000075};
76
Daniel Petti1f448512013-10-19 19:35:55 +000077} // namespace bot3
Daniel Petti3fe36542013-09-25 04:18:24 +000078
79int main() {
Daniel Petti53b11092013-11-02 05:53:16 +000080 ::aos::Init(frc971::USBReceiver::kRelativePriority);
Daniel Petti0663d302013-10-27 05:39:39 +000081 ::bot3::GyroSensorReceiver receiver;
Daniel Petti3fe36542013-09-25 04:18:24 +000082 while (true) {
83 receiver.RunIteration();
84 }
85 ::aos::Cleanup();
86}