blob: a5c90ac273c3fb3bb230868fc5094344e91ee26b [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();
23
Sabina Davis1ffa4172019-02-01 22:38:33 -080024 // All of the DMA-related set_* calls must be made before this, and it
25 // doesn't hurt to do all of them.
26 void set_dma(::std::unique_ptr<DMA> dma);
27
Sabina Davisadc58542019-02-01 22:23:00 -080028 void set_pwm_trigger(::std::unique_ptr<frc::DigitalInput> pwm_trigger);
29
30 protected:
31 void RunPWMDetecter();
32
33 ::std::unique_ptr<frc::DigitalInput> pwm_trigger_;
34
35 frc::DigitalGlitchFilter fast_encoder_filter_, medium_encoder_filter_,
36 hall_filter_;
37
38 // Mutex to manage access to the period and tick time variables.
39 ::aos::stl_mutex tick_time_mutex_;
40 monotonic_clock::time_point last_tick_time_monotonic_timepoint_ =
41 monotonic_clock::min_time;
42 chrono::nanoseconds last_period_ = chrono::microseconds(5050);
43
Sabina Davis1ffa4172019-02-01 22:38:33 -080044 ::std::unique_ptr<::frc971::wpilib::DMASynchronizer> dma_synchronizer_;
45
Sabina Davisadc58542019-02-01 22:23:00 -080046 ::std::atomic<bool> run_{true};
47};
48
49} // namespace wpilib
50} // namespace frc971
51
52#endif // FRC971_WPILIB_SENSOR_READER_H_