blob: cd17d890b13f0b8839a5faec0f35bcd5f808cc14 [file] [log] [blame]
Brian Silverman425492b2015-12-30 15:23:55 -08001#include "frc971/wpilib/pdp_fetcher.h"
2
Austin Schuh8aec1ed2016-05-01 13:29:20 -07003#include <chrono>
4
Alex Perrycb7da4b2019-08-28 19:35:56 -07005#include "aos/events/event_loop.h"
6#include "aos/logging/logging.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -08007#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07008#include "frc971/wpilib/pdp_values_generated.h"
Brian Silverman425492b2015-12-30 15:23:55 -08009
10namespace frc971 {
11namespace wpilib {
12
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070013namespace chrono = ::std::chrono;
Brian Silverman25ff5052016-01-02 14:13:46 -080014
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070015PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
16 : event_loop_(event_loop),
Alex Perrycb7da4b2019-08-28 19:35:56 -070017 pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")),
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070018 pdp_(new frc::PowerDistributionPanel()) {
19 event_loop_->set_name("PDPFetcher");
Brian Silverman25ff5052016-01-02 14:13:46 -080020
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070021 // SCHED_OTHER on purpose.
22 event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
23 chrono::milliseconds(20), chrono::milliseconds(4));
24}
25
26PDPFetcher::~PDPFetcher() {}
27
28void PDPFetcher::Loop(int iterations) {
29 if (iterations != 1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070030 AOS_LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070031 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070032 std::array<double, 16> currents;
33 for (size_t i = 0; i < currents.size(); ++i) {
34 currents[i] = pdp_->GetCurrent(i);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070035 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070036
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 Schuhf257f3c2019-10-27 21:00:43 -070048 AOS_LOG(WARNING, "sending pdp values failed\n");
Brian Silverman425492b2015-12-30 15:23:55 -080049 }
50}
51
52} // namespace wpilib
53} // namespace frc971