[hal] Rename PowerDistributionPanel to PowerDistribution (#3466)

Makes HAL more generic for the PDP, to enable the Rev PDH in the future.
This commit is contained in:
Thad House
2021-08-04 20:31:17 -07:00
committed by GitHub
parent 2014115bca
commit 1ac73a247e
50 changed files with 1612 additions and 1177 deletions

View File

@@ -1,124 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#include "PDPSimGui.h"
#include <glass/hardware/PDP.h>
#include <cstdio>
#include <cstring>
#include <memory>
#include <vector>
#include <hal/Ports.h>
#include <hal/simulation/PDPData.h>
#include "HALDataSource.h"
#include "HALSimGui.h"
using namespace halsimgui;
namespace {
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED(PDPTemperature, "PDP Temp");
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED(PDPVoltage, "PDP Voltage");
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED2(PDPCurrent, "PDP Current");
class PDPSimModel : public glass::PDPModel {
public:
explicit PDPSimModel(int32_t index)
: m_index{index}, m_temp{index}, m_voltage{index} {
const int numChannels = HAL_GetNumPDPChannels();
m_currents.reserve(numChannels);
for (int i = 0; i < numChannels; ++i) {
m_currents.emplace_back(std::make_unique<PDPCurrentSource>(index, i));
}
}
void Update() override {}
bool Exists() override { return HALSIM_GetPDPInitialized(m_index); }
int GetNumChannels() const override { return m_currents.size(); }
glass::DataSource* GetTemperatureData() override { return &m_temp; }
glass::DataSource* GetVoltageData() override { return &m_voltage; }
glass::DataSource* GetCurrentData(int channel) override {
return m_currents[channel].get();
}
void SetTemperature(double val) override {
HALSIM_SetPDPTemperature(m_index, val);
}
void SetVoltage(double val) override { HALSIM_SetPDPVoltage(m_index, val); }
void SetCurrent(int channel, double val) override {
HALSIM_SetPDPCurrent(m_index, channel, val);
}
private:
int32_t m_index;
PDPTemperatureSource m_temp;
PDPVoltageSource m_voltage;
std::vector<std::unique_ptr<PDPCurrentSource>> m_currents;
};
class PDPsSimModel : public glass::PDPsModel {
public:
PDPsSimModel() : m_models(HAL_GetNumPDPModules()) {}
void Update() override;
bool Exists() override { return true; }
void ForEachPDP(
wpi::function_ref<void(glass::PDPModel& model, int index)> func) override;
private:
std::vector<std::unique_ptr<PDPSimModel>> m_models;
};
} // namespace
void PDPsSimModel::Update() {
for (int32_t i = 0, iend = static_cast<int32_t>(m_models.size()); i < iend;
++i) {
auto& model = m_models[i];
if (HALSIM_GetPDPInitialized(i)) {
if (!model) {
model = std::make_unique<PDPSimModel>(i);
}
} else {
model.reset();
}
}
}
void PDPsSimModel::ForEachPDP(
wpi::function_ref<void(glass::PDPModel& model, int index)> func) {
for (int32_t i = 0, iend = static_cast<int32_t>(m_models.size()); i < iend;
++i) {
if (auto model = m_models[i].get()) {
func(*model, i);
}
}
}
static bool PDPsAnyInitialized() {
static const int32_t num = HAL_GetNumPDPModules();
for (int32_t i = 0; i < num; ++i) {
if (HALSIM_GetPDPInitialized(i)) {
return true;
}
}
return false;
}
void PDPSimGui::Initialize() {
HALSimGui::halProvider.Register(
"PDPs", PDPsAnyInitialized,
[] { return std::make_unique<PDPsSimModel>(); },
[](glass::Window* win, glass::Model* model) {
win->SetDefaultPos(245, 155);
return glass::MakeFunctionView(
[=] { DisplayPDPs(static_cast<PDPsSimModel*>(model)); });
});
}

View File

@@ -0,0 +1,136 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#include "PowerDistributionSimGui.h"
#include <glass/hardware/PowerDistribution.h>
#include <cstdio>
#include <cstring>
#include <memory>
#include <vector>
#include <hal/Ports.h>
#include <hal/simulation/PowerDistributionData.h>
#include "HALDataSource.h"
#include "HALSimGui.h"
using namespace halsimgui;
namespace {
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED(PowerDistributionTemperature,
"Power Distribution Temp");
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED(PowerDistributionVoltage,
"Power Distribution Voltage");
HALSIMGUI_DATASOURCE_DOUBLE_INDEXED2(PowerDistributionCurrent,
"Power Distribution Current");
class PowerDistributionSimModel : public glass::PowerDistributionModel {
public:
explicit PowerDistributionSimModel(int32_t index)
: m_index{index}, m_temp{index}, m_voltage{index} {
const int numChannels = HAL_GetNumPDPChannels();
m_currents.reserve(numChannels);
for (int i = 0; i < numChannels; ++i) {
m_currents.emplace_back(
std::make_unique<PowerDistributionCurrentSource>(index, i));
}
}
void Update() override {}
bool Exists() override {
return HALSIM_GetPowerDistributionInitialized(m_index);
}
int GetNumChannels() const override { return m_currents.size(); }
glass::DataSource* GetTemperatureData() override { return &m_temp; }
glass::DataSource* GetVoltageData() override { return &m_voltage; }
glass::DataSource* GetCurrentData(int channel) override {
return m_currents[channel].get();
}
void SetTemperature(double val) override {
HALSIM_SetPowerDistributionTemperature(m_index, val);
}
void SetVoltage(double val) override {
HALSIM_SetPowerDistributionVoltage(m_index, val);
}
void SetCurrent(int channel, double val) override {
HALSIM_SetPowerDistributionCurrent(m_index, channel, val);
}
private:
int32_t m_index;
PowerDistributionTemperatureSource m_temp;
PowerDistributionVoltageSource m_voltage;
std::vector<std::unique_ptr<PowerDistributionCurrentSource>> m_currents;
};
class PowerDistributionsSimModel : public glass::PowerDistributionsModel {
public:
PowerDistributionsSimModel() : m_models(HAL_GetNumPDPModules()) {}
void Update() override;
bool Exists() override { return true; }
void ForEachPowerDistribution(
wpi::function_ref<void(glass::PowerDistributionModel& model, int index)>
func) override;
private:
std::vector<std::unique_ptr<PowerDistributionSimModel>> m_models;
};
} // namespace
void PowerDistributionsSimModel::Update() {
for (int32_t i = 0, iend = static_cast<int32_t>(m_models.size()); i < iend;
++i) {
auto& model = m_models[i];
if (HALSIM_GetPowerDistributionInitialized(i)) {
if (!model) {
model = std::make_unique<PowerDistributionSimModel>(i);
}
} else {
model.reset();
}
}
}
void PowerDistributionsSimModel::ForEachPowerDistribution(
wpi::function_ref<void(glass::PowerDistributionModel& model, int index)>
func) {
for (int32_t i = 0, iend = static_cast<int32_t>(m_models.size()); i < iend;
++i) {
if (auto model = m_models[i].get()) {
func(*model, i);
}
}
}
static bool PowerDistributionsAnyInitialized() {
static const int32_t num = HAL_GetNumPDPModules();
for (int32_t i = 0; i < num; ++i) {
if (HALSIM_GetPowerDistributionInitialized(i)) {
return true;
}
}
return false;
}
void PowerDistributionSimGui::Initialize() {
HALSimGui::halProvider.Register(
"PowerDistributions", PowerDistributionsAnyInitialized,
[] { return std::make_unique<PowerDistributionsSimModel>(); },
[](glass::Window* win, glass::Model* model) {
win->SetDefaultPos(245, 155);
return glass::MakeFunctionView([=] {
DisplayPowerDistributions(
static_cast<PowerDistributionsSimModel*>(model));
});
});
}

View File

@@ -6,7 +6,7 @@
namespace halsimgui {
class PDPSimGui {
class PowerDistributionSimGui {
public:
static void Initialize();
};

View File

@@ -24,8 +24,8 @@
#include "HALSimGui.h"
#include "NetworkTablesSimGui.h"
#include "PCMSimGui.h"
#include "PDPSimGui.h"
#include "PWMSimGui.h"
#include "PowerDistributionSimGui.h"
#include "RelaySimGui.h"
#include "RoboRioSimGui.h"
#include "SimDeviceGui.h"
@@ -62,7 +62,7 @@ __declspec(dllexport)
gui::AddInit(DIOSimGui::Initialize);
gui::AddInit(NetworkTablesSimGui::Initialize);
gui::AddInit(PCMSimGui::Initialize);
gui::AddInit(PDPSimGui::Initialize);
gui::AddInit(PowerDistributionSimGui::Initialize);
gui::AddInit(PWMSimGui::Initialize);
gui::AddInit(RelaySimGui::Initialize);
gui::AddInit(RoboRioSimGui::Initialize);