Brian Silverman | 425492b | 2015-12-30 15:23:55 -0800 | [diff] [blame] | 1 | #include "frc971/wpilib/pdp_fetcher.h" |
| 2 | |
Austin Schuh | 8aec1ed | 2016-05-01 13:29:20 -0700 | [diff] [blame] | 3 | #include <chrono> |
| 4 | |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame^] | 5 | #include "aos/events/event_loop.h" |
| 6 | #include "aos/logging/logging.h" |
Parker Schuh | d3b7a887 | 2018-02-19 16:42:27 -0800 | [diff] [blame] | 7 | #include "frc971/wpilib/ahal/PowerDistributionPanel.h" |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame^] | 8 | #include "frc971/wpilib/pdp_values_generated.h" |
Brian Silverman | 425492b | 2015-12-30 15:23:55 -0800 | [diff] [blame] | 9 | |
| 10 | namespace frc971 { |
| 11 | namespace wpilib { |
| 12 | |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 13 | namespace chrono = ::std::chrono; |
Brian Silverman | 25ff505 | 2016-01-02 14:13:46 -0800 | [diff] [blame] | 14 | |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 15 | PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop) |
| 16 | : event_loop_(event_loop), |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame^] | 17 | pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")), |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 18 | pdp_(new frc::PowerDistributionPanel()) { |
| 19 | event_loop_->set_name("PDPFetcher"); |
Brian Silverman | 25ff505 | 2016-01-02 14:13:46 -0800 | [diff] [blame] | 20 | |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 21 | // SCHED_OTHER on purpose. |
| 22 | event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); }, |
| 23 | chrono::milliseconds(20), chrono::milliseconds(4)); |
| 24 | } |
| 25 | |
| 26 | PDPFetcher::~PDPFetcher() {} |
| 27 | |
| 28 | void PDPFetcher::Loop(int iterations) { |
| 29 | if (iterations != 1) { |
Austin Schuh | f257f3c | 2019-10-27 21:00:43 -0700 | [diff] [blame] | 30 | AOS_LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1); |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 31 | } |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame^] | 32 | std::array<double, 16> currents; |
| 33 | for (size_t i = 0; i < currents.size(); ++i) { |
| 34 | currents[i] = pdp_->GetCurrent(i); |
Austin Schuh | bd1fe9c | 2019-06-29 16:35:48 -0700 | [diff] [blame] | 35 | } |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame^] | 36 | |
| 37 | auto builder = pdp_values_sender_.MakeBuilder(); |
| 38 | flatbuffers::Offset<flatbuffers::Vector<double>> currents_offset = |
| 39 | builder.fbb()->CreateVector(currents.begin(), currents.size()); |
| 40 | |
| 41 | PDPValues::Builder pdp_builder = builder.MakeBuilder<PDPValues>(); |
| 42 | pdp_builder.add_voltage(pdp_->GetVoltage()); |
| 43 | pdp_builder.add_temperature(pdp_->GetTemperature()); |
| 44 | pdp_builder.add_power(pdp_->GetTotalPower()); |
| 45 | pdp_builder.add_currents(currents_offset); |
| 46 | |
| 47 | if (!builder.Send(pdp_builder.Finish())) { |
Austin Schuh | f257f3c | 2019-10-27 21:00:43 -0700 | [diff] [blame] | 48 | AOS_LOG(WARNING, "sending pdp values failed\n"); |
Brian Silverman | 425492b | 2015-12-30 15:23:55 -0800 | [diff] [blame] | 49 | } |
| 50 | } |
| 51 | |
| 52 | } // namespace wpilib |
| 53 | } // namespace frc971 |