[hal, wpilib] Add initial systemcore counter implementation (#7723)

This commit is contained in:
Thad House
2025-01-28 08:58:34 -08:00
committed by GitHub
parent b799b285b3
commit 48ce2dcc8d
47 changed files with 201 additions and 4357 deletions

View File

@@ -5,10 +5,11 @@
#include "frc/counter/UpDownCounter.h"
#include <memory>
#include <string>
#include <hal/Counter.h>
#include <hal/FRCUsageReporting.h>
#include <wpi/NullDeleter.h>
#include <wpi/StackTrace.h>
#include <wpi/sendable/SendableBuilder.h>
#include "frc/DigitalSource.h"
@@ -16,84 +17,39 @@
using namespace frc;
UpDownCounter::UpDownCounter(DigitalSource& upSource, DigitalSource& downSource)
: UpDownCounter({&upSource, wpi::NullDeleter<DigitalSource>()},
{&downSource, wpi::NullDeleter<DigitalSource>()}) {}
UpDownCounter::UpDownCounter(std::shared_ptr<DigitalSource> upSource,
std::shared_ptr<DigitalSource> downSource) {
m_upSource = upSource;
m_downSource = downSource;
UpDownCounter::UpDownCounter(int channel, EdgeConfiguration configuration)
: m_channel{channel} {
int32_t status = 0;
m_handle = HAL_InitializeCounter(HAL_Counter_Mode::HAL_Counter_kTwoPulse,
&m_index, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
if (m_upSource) {
HAL_SetCounterUpSource(m_handle, m_upSource->GetPortHandleForRouting(),
static_cast<HAL_AnalogTriggerType>(
m_upSource->GetAnalogTriggerTypeForRouting()),
&status);
FRC_CheckErrorStatus(status, "{}", m_index);
HAL_SetCounterUpSourceEdge(m_handle, true, false, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
}
if (m_downSource) {
HAL_SetCounterDownSource(
m_handle, m_downSource->GetPortHandleForRouting(),
static_cast<HAL_AnalogTriggerType>(
m_downSource->GetAnalogTriggerTypeForRouting()),
&status);
FRC_CheckErrorStatus(status, "{}", m_index);
HAL_SetCounterDownSourceEdge(m_handle, true, false, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
}
std::string stackTrace = wpi::GetStackTrace(1);
m_handle = HAL_InitializeCounter(
channel, configuration == EdgeConfiguration::kRisingEdge,
stackTrace.c_str(), &status);
FRC_CheckErrorStatus(status, "{}", channel);
Reset();
HAL_Report(HALUsageReporting::kResourceType_Counter, m_index + 1);
wpi::SendableRegistry::Add(this, "UpDown Counter", m_index);
HAL_Report(HALUsageReporting::kResourceType_Counter, channel + 1);
wpi::SendableRegistry::Add(this, "UpDown Counter", channel);
}
int UpDownCounter::GetCount() const {
int32_t status = 0;
int val = HAL_GetCounter(m_handle, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
FRC_CheckErrorStatus(status, "{}", m_channel);
return val;
}
void UpDownCounter::SetReverseDirection(bool reverseDirection) {
int32_t status = 0;
HAL_SetCounterReverseDirection(m_handle, reverseDirection, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
}
void UpDownCounter::Reset() {
int32_t status = 0;
HAL_ResetCounter(m_handle, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
FRC_CheckErrorStatus(status, "{}", m_channel);
}
void UpDownCounter::SetUpEdgeConfiguration(EdgeConfiguration configuration) {
void UpDownCounter::SetEdgeConfiguration(EdgeConfiguration configuration) {
int32_t status = 0;
bool rising = configuration == EdgeConfiguration::kRisingEdge ||
configuration == EdgeConfiguration::kBoth;
bool falling = configuration == EdgeConfiguration::kFallingEdge ||
configuration == EdgeConfiguration::kBoth;
HAL_SetCounterUpSourceEdge(m_handle, rising, falling, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
}
void UpDownCounter::SetDownEdgeConfiguration(EdgeConfiguration configuration) {
int32_t status = 0;
bool rising = configuration == EdgeConfiguration::kRisingEdge ||
configuration == EdgeConfiguration::kBoth;
bool falling = configuration == EdgeConfiguration::kFallingEdge ||
configuration == EdgeConfiguration::kBoth;
HAL_SetCounterDownSourceEdge(m_handle, rising, falling, &status);
FRC_CheckErrorStatus(status, "{}", m_index);
bool rising = configuration == EdgeConfiguration::kRisingEdge;
HAL_SetCounterEdgeConfiguration(m_handle, rising, &status);
FRC_CheckErrorStatus(status, "{}", m_channel);
}
void UpDownCounter::InitSendable(wpi::SendableBuilder& builder) {