blob: 47ca95c62663db313a1a0a02cc8b61f6454ed391 [file] [log] [blame]
Sabina Davisadc58542019-02-01 22:23:00 -08001#ifndef FRC971_WPILIB_SENSOR_READER_H_
2#define FRC971_WPILIB_SENSOR_READER_H_
3
4#include <atomic>
5#include <chrono>
6
7#include "aos/stl_mutex/stl_mutex.h"
8#include "aos/time/time.h"
9#include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
10#include "frc971/wpilib/ahal/DigitalInput.h"
Sabina Davis1ffa4172019-02-01 22:38:33 -080011#include "frc971/wpilib/dma.h"
12#include "frc971/wpilib/dma_edge_counting.h"
Sabina Davisadc58542019-02-01 22:23:00 -080013
14using ::aos::monotonic_clock;
15namespace chrono = ::std::chrono;
16
17namespace frc971 {
18namespace wpilib {
19
20class SensorReader {
21 public:
22 SensorReader();
Austin Schuh2c2cc2e2019-02-02 20:19:45 -080023 virtual ~SensorReader() {}
Sabina Davisadc58542019-02-01 22:23:00 -080024
Austin Schuh45a549f2019-02-02 15:43:56 -080025 // Updates the fast and medium encoder filter frequencies.
26 void UpdateFastEncoderFilterHz(int hz);
27 void UpdateMediumEncoderFilterHz(int hz);
28
Sabina Davisb6317b72019-02-01 22:53:23 -080029 // Sets the left drivetrain encoder.
30 void set_drivetrain_left_encoder(::std::unique_ptr<frc::Encoder> encoder);
31
32 // Sets the right drivetrain encoder.
33 void set_drivetrain_right_encoder(::std::unique_ptr<frc::Encoder> encoder);
34
35 // Sets the dma.
Sabina Davis1ffa4172019-02-01 22:38:33 -080036 void set_dma(::std::unique_ptr<DMA> dma);
37
Austin Schuh2c2cc2e2019-02-02 20:19:45 -080038 void AddToDMA(DMASampleHandlerInterface *handler) {
39 dma_synchronizer_->Add(handler);
40 }
41
Sabina Davisb6317b72019-02-01 22:53:23 -080042 // Sets the pwm trigger.
Sabina Davisadc58542019-02-01 22:23:00 -080043 void set_pwm_trigger(::std::unique_ptr<frc::DigitalInput> pwm_trigger);
44
Sabina Davisa42cc352019-02-01 22:55:50 -080045 // Stops the pwm trigger on the next iteration.
46 void Quit() { run_ = false; }
47
Sabina Davis399dbd82019-02-01 23:06:08 -080048 virtual void RunIteration() = 0;
Austin Schuh2c2cc2e2019-02-02 20:19:45 -080049 virtual void RunDmaIteration() {}
Sabina Davis399dbd82019-02-01 23:06:08 -080050
51 void operator()();
52
Sabina Davisadc58542019-02-01 22:23:00 -080053 protected:
Austin Schuh45a549f2019-02-02 15:43:56 -080054 frc::DigitalGlitchFilter fast_encoder_filter_, medium_encoder_filter_;
55
56 ::std::unique_ptr<frc::Encoder> drivetrain_left_encoder_,
57 drivetrain_right_encoder_;
58
59 private:
Austin Schuh2c2cc2e2019-02-02 20:19:45 -080060 // Gets called right before the DMA synchronizer is up and running.
61 virtual void Start() {}
62
Sabina Davisb6317b72019-02-01 22:53:23 -080063 // Uses the pwm trigger to find the pwm cycle width and offset for that
64 // iteration.
Sabina Davisadc58542019-02-01 22:23:00 -080065 void RunPWMDetecter();
66
67 ::std::unique_ptr<frc::DigitalInput> pwm_trigger_;
68
Sabina Davisadc58542019-02-01 22:23:00 -080069 // Mutex to manage access to the period and tick time variables.
70 ::aos::stl_mutex tick_time_mutex_;
71 monotonic_clock::time_point last_tick_time_monotonic_timepoint_ =
72 monotonic_clock::min_time;
Austin Schuh45a549f2019-02-02 15:43:56 -080073 chrono::nanoseconds last_period_;
Sabina Davisadc58542019-02-01 22:23:00 -080074
Sabina Davis1ffa4172019-02-01 22:38:33 -080075 ::std::unique_ptr<::frc971::wpilib::DMASynchronizer> dma_synchronizer_;
76
Sabina Davisadc58542019-02-01 22:23:00 -080077 ::std::atomic<bool> run_{true};
Sabina Davisadc58542019-02-01 22:23:00 -080078};
79
80} // namespace wpilib
81} // namespace frc971
82
83#endif // FRC971_WPILIB_SENSOR_READER_H_