mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
Change hal sim to use spinlocks (#1291)
This makes callback registration completely thread safe. This patch also uses templates and macros to dramatically reduce the amount of manual boilerplate.
This commit is contained in:
@@ -81,10 +81,9 @@ HAL_EncoderHandle HAL_InitializeEncoder(
|
||||
return HAL_kInvalidHandle;
|
||||
}
|
||||
int16_t index = getHandleIndex(handle);
|
||||
SimEncoderData[index].SetDigitalChannelA(
|
||||
getHandleIndex(digitalSourceHandleA));
|
||||
SimEncoderData[index].SetInitialized(true);
|
||||
SimEncoderData[index].SetReverseDirection(reverseDirection);
|
||||
SimEncoderData[index].digitalChannelA = getHandleIndex(digitalSourceHandleA);
|
||||
SimEncoderData[index].initialized = true;
|
||||
SimEncoderData[index].reverseDirection = reverseDirection;
|
||||
// TODO: Add encoding type to Sim data
|
||||
encoder->index = index;
|
||||
encoder->nativeHandle = nativeHandle;
|
||||
@@ -102,7 +101,7 @@ void HAL_FreeEncoder(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
} else if (isHandleType(encoder->nativeHandle, HAL_HandleEnum::Counter)) {
|
||||
counterHandles->Free(encoder->nativeHandle);
|
||||
}
|
||||
SimEncoderData[encoder->index].SetInitialized(false);
|
||||
SimEncoderData[encoder->index].initialized = false;
|
||||
}
|
||||
|
||||
static inline int EncodingScaleFactor(Encoder* encoder) {
|
||||
@@ -138,7 +137,7 @@ int32_t HAL_GetEncoder(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetCount();
|
||||
return SimEncoderData[encoder->index].count;
|
||||
}
|
||||
int32_t HAL_GetEncoderRaw(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
auto encoder = encoderHandles->Get(encoderHandle);
|
||||
@@ -147,7 +146,7 @@ int32_t HAL_GetEncoderRaw(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetCount() /
|
||||
return SimEncoderData[encoder->index].count /
|
||||
DecodingScaleFactor(encoder.get());
|
||||
}
|
||||
int32_t HAL_GetEncoderEncodingScale(HAL_EncoderHandle encoderHandle,
|
||||
@@ -167,9 +166,9 @@ void HAL_ResetEncoder(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
return;
|
||||
}
|
||||
|
||||
SimEncoderData[encoder->index].SetCount(0);
|
||||
SimEncoderData[encoder->index].SetPeriod(std::numeric_limits<double>::max());
|
||||
SimEncoderData[encoder->index].SetReset(true);
|
||||
SimEncoderData[encoder->index].count = 0;
|
||||
SimEncoderData[encoder->index].period = std::numeric_limits<double>::max();
|
||||
SimEncoderData[encoder->index].reset = true;
|
||||
}
|
||||
double HAL_GetEncoderPeriod(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
auto encoder = encoderHandles->Get(encoderHandle);
|
||||
@@ -178,7 +177,7 @@ double HAL_GetEncoderPeriod(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetPeriod();
|
||||
return SimEncoderData[encoder->index].period;
|
||||
}
|
||||
void HAL_SetEncoderMaxPeriod(HAL_EncoderHandle encoderHandle, double maxPeriod,
|
||||
int32_t* status) {
|
||||
@@ -188,7 +187,7 @@ void HAL_SetEncoderMaxPeriod(HAL_EncoderHandle encoderHandle, double maxPeriod,
|
||||
return;
|
||||
}
|
||||
|
||||
SimEncoderData[encoder->index].SetMaxPeriod(maxPeriod);
|
||||
SimEncoderData[encoder->index].maxPeriod = maxPeriod;
|
||||
}
|
||||
HAL_Bool HAL_GetEncoderStopped(HAL_EncoderHandle encoderHandle,
|
||||
int32_t* status) {
|
||||
@@ -198,8 +197,8 @@ HAL_Bool HAL_GetEncoderStopped(HAL_EncoderHandle encoderHandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetPeriod() >
|
||||
SimEncoderData[encoder->index].GetMaxPeriod();
|
||||
return SimEncoderData[encoder->index].period >
|
||||
SimEncoderData[encoder->index].maxPeriod;
|
||||
}
|
||||
HAL_Bool HAL_GetEncoderDirection(HAL_EncoderHandle encoderHandle,
|
||||
int32_t* status) {
|
||||
@@ -209,7 +208,7 @@ HAL_Bool HAL_GetEncoderDirection(HAL_EncoderHandle encoderHandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetDirection();
|
||||
return SimEncoderData[encoder->index].direction;
|
||||
}
|
||||
double HAL_GetEncoderDistance(HAL_EncoderHandle encoderHandle,
|
||||
int32_t* status) {
|
||||
@@ -219,7 +218,7 @@ double HAL_GetEncoderDistance(HAL_EncoderHandle encoderHandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetCount() * encoder->distancePerPulse;
|
||||
return SimEncoderData[encoder->index].count * encoder->distancePerPulse;
|
||||
}
|
||||
double HAL_GetEncoderRate(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
auto encoder = encoderHandles->Get(encoderHandle);
|
||||
@@ -228,7 +227,7 @@ double HAL_GetEncoderRate(HAL_EncoderHandle encoderHandle, int32_t* status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return encoder->distancePerPulse / SimEncoderData[encoder->index].GetPeriod();
|
||||
return encoder->distancePerPulse / SimEncoderData[encoder->index].period;
|
||||
}
|
||||
void HAL_SetEncoderMinRate(HAL_EncoderHandle encoderHandle, double minRate,
|
||||
int32_t* status) {
|
||||
@@ -243,8 +242,8 @@ void HAL_SetEncoderMinRate(HAL_EncoderHandle encoderHandle, double minRate,
|
||||
return;
|
||||
}
|
||||
|
||||
SimEncoderData[encoder->index].SetMaxPeriod(encoder->distancePerPulse /
|
||||
minRate);
|
||||
SimEncoderData[encoder->index].maxPeriod =
|
||||
encoder->distancePerPulse / minRate;
|
||||
}
|
||||
void HAL_SetEncoderDistancePerPulse(HAL_EncoderHandle encoderHandle,
|
||||
double distancePerPulse, int32_t* status) {
|
||||
@@ -259,7 +258,7 @@ void HAL_SetEncoderDistancePerPulse(HAL_EncoderHandle encoderHandle,
|
||||
return;
|
||||
}
|
||||
encoder->distancePerPulse = distancePerPulse;
|
||||
SimEncoderData[encoder->index].SetDistancePerPulse(distancePerPulse);
|
||||
SimEncoderData[encoder->index].distancePerPulse = distancePerPulse;
|
||||
}
|
||||
void HAL_SetEncoderReverseDirection(HAL_EncoderHandle encoderHandle,
|
||||
HAL_Bool reverseDirection,
|
||||
@@ -270,7 +269,7 @@ void HAL_SetEncoderReverseDirection(HAL_EncoderHandle encoderHandle,
|
||||
return;
|
||||
}
|
||||
|
||||
SimEncoderData[encoder->index].SetReverseDirection(reverseDirection);
|
||||
SimEncoderData[encoder->index].reverseDirection = reverseDirection;
|
||||
}
|
||||
void HAL_SetEncoderSamplesToAverage(HAL_EncoderHandle encoderHandle,
|
||||
int32_t samplesToAverage, int32_t* status) {
|
||||
@@ -280,7 +279,7 @@ void HAL_SetEncoderSamplesToAverage(HAL_EncoderHandle encoderHandle,
|
||||
return;
|
||||
}
|
||||
|
||||
SimEncoderData[encoder->index].SetSamplesToAverage(samplesToAverage);
|
||||
SimEncoderData[encoder->index].samplesToAverage = samplesToAverage;
|
||||
}
|
||||
int32_t HAL_GetEncoderSamplesToAverage(HAL_EncoderHandle encoderHandle,
|
||||
int32_t* status) {
|
||||
@@ -290,7 +289,7 @@ int32_t HAL_GetEncoderSamplesToAverage(HAL_EncoderHandle encoderHandle,
|
||||
return 0;
|
||||
}
|
||||
|
||||
return SimEncoderData[encoder->index].GetSamplesToAverage();
|
||||
return SimEncoderData[encoder->index].samplesToAverage;
|
||||
}
|
||||
|
||||
void HAL_SetEncoderIndexSource(HAL_EncoderHandle encoderHandle,
|
||||
|
||||
Reference in New Issue
Block a user