blob: 5b02bb5842e541a4656b250ea0bb70248ea385ae [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"
Austin Schuh217a9782019-12-21 23:02:50 -08006#include "aos/events/shm_event_loop.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07007#include "aos/logging/logging.h"
Parker Schuhd3b7a8872018-02-19 16:42:27 -08008#include "frc971/wpilib/ahal/PowerDistributionPanel.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -07009#include "frc971/wpilib/pdp_values_generated.h"
Brian Silverman425492b2015-12-30 15:23:55 -080010
Stephan Pleinesf63bde82024-01-13 15:59:33 -080011namespace frc971::wpilib {
Brian Silverman425492b2015-12-30 15:23:55 -080012
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070013namespace chrono = ::std::chrono;
Brian Silverman25ff5052016-01-02 14:13:46 -080014
Austin Schuh217a9782019-12-21 23:02:50 -080015PDPFetcher::PDPFetcher(::aos::ShmEventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070016 : 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()) {
Austin Schuh217a9782019-12-21 23:02:50 -080019 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
milind1f1dca32021-07-03 13:50:07 -070047 if (builder.Send(pdp_builder.Finish()) != aos::RawSender::Error::kOk) {
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
Stephan Pleinesf63bde82024-01-13 15:59:33 -080052} // namespace frc971::wpilib