blob: 379a29fdab37337bfb1846c4d4c746046e92f109 [file] [log] [blame]
Brian Silverman4da58072015-01-26 20:18:52 -05001#include "frc971/wpilib/encoder_and_potentiometer.h"
2
John Park398c74a2018-10-20 21:17:39 -07003#include "aos/init.h"
John Park33858a32018-09-28 23:05:48 -07004#include "aos/logging/logging.h"
Brian Silverman4da58072015-01-26 20:18:52 -05005
6namespace frc971 {
7namespace wpilib {
8
Brian Silverman7cce2d32017-02-19 21:48:48 -08009bool DMAEncoder::DoUpdateFromSample(const DMASample &sample) {
Brian Silverman4da58072015-01-26 20:18:52 -050010 if (index_last_value_) {
11 // It was already true last time, so check if it's reset back to false yet.
12 index_last_value_ = sample.Get(index_.get());
13 } else if (sample.Get(index_.get())) {
14 // This sample is posedge, so record all the values.
15 index_last_value_ = true;
16 ++index_posedge_count_;
17 last_encoder_value_ = sample.GetRaw(encoder_.get());
Brian Silverman7cce2d32017-02-19 21:48:48 -080018 return true;
Brian Silverman4da58072015-01-26 20:18:52 -050019 }
Brian Silverman7cce2d32017-02-19 21:48:48 -080020 return false;
Brian Silverman4da58072015-01-26 20:18:52 -050021}
22
23void InterruptEncoderAndPotentiometer::Start() {
24 CHECK_NE(nullptr, encoder_);
25 CHECK_NE(nullptr, index_);
26 CHECK_NE(nullptr, potentiometer_);
27 CHECK_NE(0, priority_);
28 thread_ = ::std::thread(::std::ref(*this));
29}
30
31void InterruptEncoderAndPotentiometer::operator()() {
32 ::aos::SetCurrentThreadName("IntEncPot_" +
33 ::std::to_string(potentiometer_->GetChannel()));
34
35 index_->RequestInterrupts();
36 index_->SetUpSourceEdge(true, false);
37
38 ::aos::SetCurrentThreadRealtimePriority(priority_);
39
40 InterruptableSensorBase::WaitResult result = InterruptableSensorBase::kBoth;
41 while (run_) {
42 result = index_->WaitForInterrupt(
43 0.1, result != InterruptableSensorBase::kTimeout);
44 if (result == InterruptableSensorBase::kTimeout) {
45 continue;
46 }
47
48 {
49 ::aos::MutexLocker locker(&mutex_);
50 last_potentiometer_voltage_ = potentiometer_->GetVoltage();
51 last_encoder_value_ = encoder_->GetRaw();
52 ++index_posedge_count_;
53 }
54 }
55}
56
57} // namespace wpilib
58} // namespace frc971