blob: 735036e39bb23cef22436ec87b93cc76c2c1fb37 [file] [log] [blame]
#include "frc971/wpilib/pdp_fetcher.h"
#include "aos/common/logging/queue_logging.h"
#include "aos/linux_code/init.h"
#include "aos/common/util/phased_loop.h"
namespace frc971 {
namespace wpilib {
PDPFetcher::PDPFetcher() : pdp_(new PowerDistributionPanel()) {
pdp_values_.Zero();
}
void PDPFetcher::GetValues(::aos::PDPValues *pdp_values) {
::aos::MutexLocker locker(&values_lock_);
*pdp_values = pdp_values_;
}
void PDPFetcher::operator()() {
::aos::SetCurrentThreadName("PDPFetcher");
::aos::time::PhasedLoop phased_loop(::aos::time::Time::InMS(20),
::aos::time::Time::InMS(4));
while (true) {
{
const int iterations = phased_loop.SleepUntilNext();
if (iterations != 1) {
LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
}
}
{
const double voltage = pdp_->GetVoltage();
::aos::MutexLocker locker(&values_lock_);
pdp_values_.voltage = voltage;
}
{
const double temperature = pdp_->GetTemperature();
::aos::MutexLocker locker(&values_lock_);
pdp_values_.temperature = temperature;
}
{
const double power = pdp_->GetTotalPower();
::aos::MutexLocker locker(&values_lock_);
pdp_values_.power = power;
}
for (int i = 0; i < 16; ++i) {
const double current = pdp_->GetCurrent(i);
::aos::MutexLocker locker(&values_lock_);
pdp_values_.currents[i] = current;
}
{
::aos::MutexLocker locker(&values_lock_);
LOG_STRUCT(DEBUG, "finished fetching", pdp_values_);
}
}
}
} // namespace wpilib
} // namespace frc971