mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-30 02:31:44 +00:00
[hal, wpilib] Fix up DIO pulse API (#4387)
The FPGA API takes microseconds directly, instead of a scaled value. Also add a new HAL level API to trigger multiple DIOs with the same pulse at once.
This commit is contained in:
@@ -408,13 +408,24 @@ HAL_Bool HAL_GetDIODirection(HAL_DigitalHandle dioPortHandle, int32_t* status) {
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLength,
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLengthSeconds,
|
||||
int32_t* status) {
|
||||
auto port = digitalChannelHandles->Get(dioPortHandle, HAL_HandleEnum::DIO);
|
||||
if (port == nullptr) {
|
||||
*status = HAL_HANDLE_ERROR;
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t pulseLengthMicroseconds =
|
||||
static_cast<uint32_t>(pulseLengthSeconds * 1e6);
|
||||
|
||||
if (pulseLengthMicroseconds <= 0 || pulseLengthMicroseconds > 0xFFFF) {
|
||||
*status = PARAMETER_OUT_OF_RANGE;
|
||||
hal::SetLastError(status,
|
||||
"Length must be between 1 and 65535 microseconds");
|
||||
return;
|
||||
}
|
||||
|
||||
tDIO::tPulse pulse;
|
||||
|
||||
if (port->channel >= kNumDigitalHeaders + kNumDigitalMXPChannels) {
|
||||
@@ -426,9 +437,29 @@ void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLength,
|
||||
}
|
||||
|
||||
digitalSystem->writePulseLength(
|
||||
static_cast<uint16_t>(1.0e9 * pulseLength /
|
||||
(pwmSystem->readLoopTiming(status) * 25)),
|
||||
status);
|
||||
static_cast<uint16_t>(pulseLengthMicroseconds), status);
|
||||
digitalSystem->writePulse(pulse, status);
|
||||
}
|
||||
|
||||
void HAL_PulseMultiple(uint32_t channelMask, double pulseLengthSeconds,
|
||||
int32_t* status) {
|
||||
uint32_t pulseLengthMicroseconds =
|
||||
static_cast<uint32_t>(pulseLengthSeconds * 1e6);
|
||||
|
||||
if (pulseLengthMicroseconds <= 0 || pulseLengthMicroseconds > 0xFFFF) {
|
||||
*status = PARAMETER_OUT_OF_RANGE;
|
||||
hal::SetLastError(status,
|
||||
"Length must be between 1 and 65535 microseconds");
|
||||
return;
|
||||
}
|
||||
|
||||
tDIO::tPulse pulse;
|
||||
pulse.Headers = channelMask & 0x2FF;
|
||||
pulse.MXP = (channelMask & 0xFFFF) >> 10;
|
||||
pulse.SPIPort = (channelMask & 0x1F) >> 26;
|
||||
|
||||
digitalSystem->writePulseLength(
|
||||
static_cast<uint16_t>(pulseLengthMicroseconds), status);
|
||||
digitalSystem->writePulse(pulse, status);
|
||||
}
|
||||
|
||||
|
||||
@@ -144,6 +144,20 @@ Java_edu_wpi_first_hal_DIOJNI_pulse
|
||||
CheckStatus(env, status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_hal_DIOJNI
|
||||
* Method: pulseMultiple
|
||||
* Signature: (JD)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_edu_wpi_first_hal_DIOJNI_pulseMultiple
|
||||
(JNIEnv* env, jclass, jlong channelMask, jdouble value)
|
||||
{
|
||||
int32_t status = 0;
|
||||
HAL_PulseMultiple(static_cast<uint32_t>(channelMask), value, &status);
|
||||
CheckStatus(env, status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: edu_wpi_first_hal_DIOJNI
|
||||
* Method: isPulsing
|
||||
|
||||
@@ -150,12 +150,25 @@ HAL_Bool HAL_GetDIODirection(HAL_DigitalHandle dioPortHandle, int32_t* status);
|
||||
* single pulse going at any time.
|
||||
*
|
||||
* @param[in] dioPortHandle the digital port handle
|
||||
* @param[in] pulseLength the active length of the pulse (in seconds)
|
||||
* @param[in] pulseLengthSeconds the active length of the pulse (in seconds)
|
||||
* @param[out] status Error status variable. 0 on success.
|
||||
*/
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLength,
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLengthSeconds,
|
||||
int32_t* status);
|
||||
|
||||
/**
|
||||
* Generates a single digital pulse on multiple channels.
|
||||
*
|
||||
* Write a pulse to the channels enabled by the mask. There can only be a
|
||||
* single pulse going at any time.
|
||||
*
|
||||
* @param[in] channelMask the channel mask
|
||||
* @param[in] pulseLengthSeconds the active length of the pulse (in seconds)
|
||||
* @param[out] status Error status variable. 0 on success.
|
||||
*/
|
||||
void HAL_PulseMultiple(uint32_t channelMask, double pulseLengthSeconds,
|
||||
int32_t* status);
|
||||
|
||||
/**
|
||||
* Checks a DIO line to see if it is currently generating a pulse.
|
||||
*
|
||||
|
||||
@@ -225,7 +225,7 @@ HAL_Bool HAL_GetDIODirection(HAL_DigitalHandle dioPortHandle, int32_t* status) {
|
||||
return value;
|
||||
}
|
||||
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLength,
|
||||
void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLengthSeconds,
|
||||
int32_t* status) {
|
||||
auto port = digitalChannelHandles->Get(dioPortHandle, HAL_HandleEnum::DIO);
|
||||
if (port == nullptr) {
|
||||
@@ -235,6 +235,11 @@ void HAL_Pulse(HAL_DigitalHandle dioPortHandle, double pulseLength,
|
||||
// TODO (Thad) Add this
|
||||
}
|
||||
|
||||
void HAL_PulseMultiple(uint32_t channelMask, double pulseLengthSeconds,
|
||||
int32_t* status) {
|
||||
// TODO (Thad) Add this
|
||||
}
|
||||
|
||||
HAL_Bool HAL_IsPulsing(HAL_DigitalHandle dioPortHandle, int32_t* status) {
|
||||
auto port = digitalChannelHandles->Get(dioPortHandle, HAL_HandleEnum::DIO);
|
||||
if (port == nullptr) {
|
||||
|
||||
Reference in New Issue
Block a user