blob: 62e0e3764436de75597e1ea4085a720b0b401634 [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
11namespace frc971 {
12namespace wpilib {
13
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070014namespace chrono = ::std::chrono;
Brian Silverman25ff5052016-01-02 14:13:46 -080015
Austin Schuh217a9782019-12-21 23:02:50 -080016PDPFetcher::PDPFetcher(::aos::ShmEventLoop *event_loop)
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070017 : event_loop_(event_loop),
Alex Perrycb7da4b2019-08-28 19:35:56 -070018 pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")),
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070019 pdp_(new frc::PowerDistributionPanel()) {
Austin Schuh217a9782019-12-21 23:02:50 -080020 event_loop->set_name("PDPFetcher");
Brian Silverman25ff5052016-01-02 14:13:46 -080021
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070022 // SCHED_OTHER on purpose.
23 event_loop_->AddPhasedLoop([this](int iterations) { Loop(iterations); },
24 chrono::milliseconds(20), chrono::milliseconds(4));
25}
26
27PDPFetcher::~PDPFetcher() {}
28
29void PDPFetcher::Loop(int iterations) {
30 if (iterations != 1) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070031 AOS_LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070032 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070033 std::array<double, 16> currents;
34 for (size_t i = 0; i < currents.size(); ++i) {
35 currents[i] = pdp_->GetCurrent(i);
Austin Schuhbd1fe9c2019-06-29 16:35:48 -070036 }
Alex Perrycb7da4b2019-08-28 19:35:56 -070037
38 auto builder = pdp_values_sender_.MakeBuilder();
39 flatbuffers::Offset<flatbuffers::Vector<double>> currents_offset =
40 builder.fbb()->CreateVector(currents.begin(), currents.size());
41
42 PDPValues::Builder pdp_builder = builder.MakeBuilder<PDPValues>();
43 pdp_builder.add_voltage(pdp_->GetVoltage());
44 pdp_builder.add_temperature(pdp_->GetTemperature());
45 pdp_builder.add_power(pdp_->GetTotalPower());
46 pdp_builder.add_currents(currents_offset);
47
48 if (!builder.Send(pdp_builder.Finish())) {
Austin Schuhf257f3c2019-10-27 21:00:43 -070049 AOS_LOG(WARNING, "sending pdp values failed\n");
Brian Silverman425492b2015-12-30 15:23:55 -080050 }
51}
52
53} // namespace wpilib
54} // namespace frc971