Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 1 | #include "aos/atom_code/init.h" |
| 2 | #include "aos/common/logging/logging.h" |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 3 | #include "aos/common/util/wrapping_counter.h" |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 4 | |
Daniel Petti | 1f44851 | 2013-10-19 19:35:55 +0000 | [diff] [blame] | 5 | #include "bot3/control_loops/drivetrain/drivetrain.q.h" |
James Kuszmaul | f7f5ec1 | 2013-11-01 17:58:58 -0700 | [diff] [blame^] | 6 | #include "bot3/control_loops/shooter/shooter_motor.q.h" |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 7 | #include "frc971/queues/GyroAngle.q.h" |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 8 | #include "frc971/input/usb_receiver.h" |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 9 | |
| 10 | #ifndef M_PI |
| 11 | #define M_PI 3.14159265358979323846 |
| 12 | #endif |
| 13 | |
Daniel Petti | 1f44851 | 2013-10-19 19:35:55 +0000 | [diff] [blame] | 14 | using ::bot3::control_loops::drivetrain; |
James Kuszmaul | f7f5ec1 | 2013-11-01 17:58:58 -0700 | [diff] [blame^] | 15 | using ::bot3::control_loops::shooter; |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 16 | using ::frc971::sensors::gyro; |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 17 | using ::aos::util::WrappingCounter; |
| 18 | using ::frc971::USBReceiver; |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 19 | |
Daniel Petti | 1f44851 | 2013-10-19 19:35:55 +0000 | [diff] [blame] | 20 | namespace bot3 { |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 21 | namespace { |
| 22 | |
Daniel Petti | b046c53 | 2013-10-29 03:40:40 +0000 | [diff] [blame] | 23 | //TODO (danielp): Figure out whether the bigger gear is on the |
| 24 | // encoder or not. |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 25 | inline double drivetrain_translate(int32_t in) { |
| 26 | return static_cast<double>(in) / (256.0 /*cpr*/ * 4.0 /*quad*/) * |
James Kuszmaul | f7f5ec1 | 2013-11-01 17:58:58 -0700 | [diff] [blame^] | 27 | (32.0 / 44.0 /*encoder gears*/) * // the encoders are on the wheels. |
Daniel Petti | b046c53 | 2013-10-29 03:40:40 +0000 | [diff] [blame] | 28 | (3.5 /*wheel diameter*/ * 2.54 / 100 * M_PI); |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 29 | } |
| 30 | |
Daniel Petti | b046c53 | 2013-10-29 03:40:40 +0000 | [diff] [blame] | 31 | // TODO (danielp): This needs to be modified eventually. |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 32 | inline double shooter_translate(int32_t in) { |
| 33 | return static_cast<double>(in) / (32.0 /*cpr*/ * 4.0 /*quad*/) * |
| 34 | (15.0 / 34.0) /*gears*/ * (2 * M_PI); |
| 35 | } |
| 36 | |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 37 | } // namespace |
| 38 | |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 39 | class GyroSensorReceiver : public USBReceiver { |
| 40 | virtual void ProcessData() override { |
| 41 | if (data()->robot_id != 0) { |
| 42 | LOG(ERROR, "gyro board sent data for robot id %hhd!" |
| 43 | " dip switches are %x\n", |
| 44 | data()->robot_id, data()->base_status & 0xF); |
| 45 | return; |
| 46 | } else { |
| 47 | LOG(DEBUG, "processing a packet dip switches %x\n", |
| 48 | data()->base_status & 0xF); |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 49 | } |
| 50 | |
| 51 | gyro.MakeWithBuilder() |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 52 | .angle(data()->gyro_angle / 16.0 / 1000.0 / 180.0 * M_PI) |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 53 | .Send(); |
| 54 | |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 55 | drivetrain.position.MakeWithBuilder() |
James Kuszmaul | f601eaa | 2013-10-31 06:25:09 -0700 | [diff] [blame] | 56 | .right_encoder(drivetrain_translate(data()->main.wrist)) |
| 57 | .left_encoder(drivetrain_translate(data()->main.shooter)) |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 58 | .Send(); |
James Kuszmaul | f7f5ec1 | 2013-11-01 17:58:58 -0700 | [diff] [blame^] | 59 | LOG(DEBUG, "right: %lf left: %lf angle: %lld \n", |
| 60 | drivetrain_translate(data()->main.wrist), |
| 61 | drivetrain_translate(data()->main.shooter), data()->gyro_angle); |
| 62 | |
| 63 | shooter.position.MakeWithBuilder().position(drivetrain_translate(data()->main.shooter)).Send(); |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 64 | } |
| 65 | |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 66 | WrappingCounter top_rise_; |
| 67 | WrappingCounter top_fall_; |
| 68 | WrappingCounter bottom_rise_; |
| 69 | WrappingCounter bottom_fall_delay_; |
| 70 | WrappingCounter bottom_fall_; |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 71 | }; |
| 72 | |
Daniel Petti | 1f44851 | 2013-10-19 19:35:55 +0000 | [diff] [blame] | 73 | } // namespace bot3 |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 74 | |
| 75 | int main() { |
| 76 | ::aos::Init(); |
Daniel Petti | 0663d30 | 2013-10-27 05:39:39 +0000 | [diff] [blame] | 77 | ::bot3::GyroSensorReceiver receiver; |
Daniel Petti | 3fe3654 | 2013-09-25 04:18:24 +0000 | [diff] [blame] | 78 | while (true) { |
| 79 | receiver.RunIteration(); |
| 80 | } |
| 81 | ::aos::Cleanup(); |
| 82 | } |