[hal] Add support for Pulse-Per-Second signal (#4819)

This commit is contained in:
Thad House
2022-12-14 18:15:34 -08:00
committed by GitHub
parent 518916ba02
commit ee02fb7ba7
7 changed files with 100 additions and 0 deletions

View File

@@ -240,6 +240,30 @@ void HAL_SetDigitalPWMDutyCycle(HAL_DigitalPWMHandle pwmGenerator,
}
}
void HAL_SetDigitalPWMPPS(HAL_DigitalPWMHandle pwmGenerator, double dutyCycle,
int32_t* status) {
auto port = digitalPWMHandles->Get(pwmGenerator);
if (port == nullptr) {
*status = HAL_HANDLE_ERROR;
return;
}
int32_t id = *port;
digitalSystem->writePWMPeriodPower(0xffff, status);
double rawDutyCycle = 31.0 * dutyCycle;
if (rawDutyCycle > 30.5) {
rawDutyCycle = 30.5;
}
{
std::scoped_lock lock(digitalPwmMutex);
if (id < 4)
digitalSystem->writePWMDutyCycleA(id, static_cast<uint8_t>(rawDutyCycle),
status);
else
digitalSystem->writePWMDutyCycleB(
id - 4, static_cast<uint8_t>(rawDutyCycle), status);
}
}
void HAL_SetDigitalPWMOutputChannel(HAL_DigitalPWMHandle pwmGenerator,
int32_t channel, int32_t* status) {
auto port = digitalPWMHandles->Get(pwmGenerator);

View File

@@ -260,6 +260,20 @@ Java_edu_wpi_first_hal_DIOJNI_setDigitalPWMDutyCycle
CheckStatus(env, status);
}
/*
* Class: edu_wpi_first_hal_DIOJNI
* Method: setDigitalPWMPPS
* Signature: (ID)V
*/
JNIEXPORT void JNICALL
Java_edu_wpi_first_hal_DIOJNI_setDigitalPWMPPS
(JNIEnv* env, jclass, jint id, jdouble value)
{
int32_t status = 0;
HAL_SetDigitalPWMPPS((HAL_DigitalPWMHandle)id, value, &status);
CheckStatus(env, status);
}
/*
* Class: edu_wpi_first_hal_DIOJNI
* Method: setDigitalPWMOutputChannel

View File

@@ -94,6 +94,16 @@ void HAL_SetDigitalPWMRate(double rate, int32_t* status);
void HAL_SetDigitalPWMDutyCycle(HAL_DigitalPWMHandle pwmGenerator,
double dutyCycle, int32_t* status);
/**
* Configures the digital PWM to be a PPS signal with specified duty cycle.
*
* @param[in] pwmGenerator the digital PWM handle
* @param[in] dutyCycle the percent duty cycle to output [0..1]
* @param[out] status Error status variable. 0 on success.
*/
void HAL_SetDigitalPWMPPS(HAL_DigitalPWMHandle pwmGenerator, double dutyCycle,
int32_t* status);
/**
* Configures which DO channel the PWM signal is output on.
*

View File

@@ -151,6 +151,23 @@ void HAL_SetDigitalPWMDutyCycle(HAL_DigitalPWMHandle pwmGenerator,
SimDigitalPWMData[id].dutyCycle = dutyCycle;
}
void HAL_SetDigitalPWMPPS(HAL_DigitalPWMHandle pwmGenerator, double dutyCycle,
int32_t* status) {
auto port = digitalPWMHandles->Get(pwmGenerator);
if (port == nullptr) {
*status = HAL_HANDLE_ERROR;
return;
}
int32_t id = *port;
if (dutyCycle > 1.0) {
dutyCycle = 1.0;
}
if (dutyCycle < 0.0) {
dutyCycle = 0.0;
}
SimDigitalPWMData[id].dutyCycle = dutyCycle;
}
void HAL_SetDigitalPWMOutputChannel(HAL_DigitalPWMHandle pwmGenerator,
int32_t channel, int32_t* status) {
auto port = digitalPWMHandles->Get(pwmGenerator);