diff --git a/hal/src/main/native/include/MockData/I2CData.h b/hal/src/main/native/include/MockData/I2CData.h index 524361ea82..b46cf4c198 100644 --- a/hal/src/main/native/include/MockData/I2CData.h +++ b/hal/src/main/native/include/MockData/I2CData.h @@ -30,7 +30,7 @@ int32_t HALSIM_RegisterI2CReadCallback(int32_t index, void HALSIM_CancelI2CReadCallback(int32_t index, int32_t uid); int32_t HALSIM_RegisterI2CWriteCallback(int32_t index, - HAL_BufferCallback callback, + HAL_ConstBufferCallback callback, void* param); void HALSIM_CancelI2CWriteCallback(int32_t index, int32_t uid); diff --git a/hal/src/main/native/include/MockData/NotifyListener.h b/hal/src/main/native/include/MockData/NotifyListener.h index 42c6aed8cf..1982eabc00 100644 --- a/hal/src/main/native/include/MockData/NotifyListener.h +++ b/hal/src/main/native/include/MockData/NotifyListener.h @@ -15,6 +15,10 @@ typedef void (*HAL_NotifyCallback)(const char* name, void* param, typedef void (*HAL_BufferCallback)(const char* name, void* param, unsigned char* buffer, unsigned int count); +typedef void (*HAL_ConstBufferCallback)(const char* name, void* param, + const unsigned char* buffer, + unsigned int count); + namespace hal { template diff --git a/hal/src/main/native/include/MockData/NotifyListenerVector.h b/hal/src/main/native/include/MockData/NotifyListenerVector.h index 5547d83766..a6f5a8bbe1 100644 --- a/hal/src/main/native/include/MockData/NotifyListenerVector.h +++ b/hal/src/main/native/include/MockData/NotifyListenerVector.h @@ -132,5 +132,7 @@ void HalCallbackListenerVectorImpl::erase_impl(unsigned int uid) { typedef HalCallbackListenerVectorImpl NotifyListenerVector; typedef HalCallbackListenerVectorImpl BufferListenerVector; +typedef HalCallbackListenerVectorImpl + ConstBufferListenerVector; } // namespace hal diff --git a/hal/src/main/native/include/MockData/SPIData.h b/hal/src/main/native/include/MockData/SPIData.h index ffbe376da5..170a6cdd00 100644 --- a/hal/src/main/native/include/MockData/SPIData.h +++ b/hal/src/main/native/include/MockData/SPIData.h @@ -30,7 +30,7 @@ int32_t HALSIM_RegisterSPIReadCallback(int32_t index, void HALSIM_CancelSPIReadCallback(int32_t index, int32_t uid); int32_t HALSIM_RegisterSPIWriteCallback(int32_t index, - HAL_BufferCallback callback, + HAL_ConstBufferCallback callback, void* param); void HALSIM_CancelSPIWriteCallback(int32_t index, int32_t uid); diff --git a/hal/src/main/native/sim/MockData/I2CData.cpp b/hal/src/main/native/sim/MockData/I2CData.cpp index dee130c174..dc21866aef 100644 --- a/hal/src/main/native/sim/MockData/I2CData.cpp +++ b/hal/src/main/native/sim/MockData/I2CData.cpp @@ -80,7 +80,7 @@ void I2CData::CancelReadCallback(int32_t uid) { m_readCallbacks = CancelCallback(m_readCallbacks, uid); } -int32_t I2CData::RegisterWriteCallback(HAL_BufferCallback callback, +int32_t I2CData::RegisterWriteCallback(HAL_ConstBufferCallback callback, void* param) { // Must return -1 on a null callback for error handling if (callback == nullptr) return -1; @@ -141,7 +141,7 @@ void HALSIM_CancelI2CReadCallback(int32_t index, int32_t uid) { } int32_t HALSIM_RegisterI2CWriteCallback(int32_t index, - HAL_BufferCallback callback, + HAL_ConstBufferCallback callback, void* param) { return SimI2CData[index].RegisterWriteCallback(callback, param); } diff --git a/hal/src/main/native/sim/MockData/I2CDataInternal.h b/hal/src/main/native/sim/MockData/I2CDataInternal.h index 59cb28983a..ed172c7a81 100644 --- a/hal/src/main/native/sim/MockData/I2CDataInternal.h +++ b/hal/src/main/native/sim/MockData/I2CDataInternal.h @@ -32,7 +32,7 @@ class I2CData { int32_t RegisterReadCallback(HAL_BufferCallback callback, void* param); void CancelReadCallback(int32_t uid); - int32_t RegisterWriteCallback(HAL_BufferCallback callback, void* param); + int32_t RegisterWriteCallback(HAL_ConstBufferCallback callback, void* param); void CancelWriteCallback(int32_t uid); void Write(int32_t deviceAddress, const uint8_t* dataToSend, @@ -47,7 +47,7 @@ class I2CData { std::atomic m_initialized{false}; std::shared_ptr m_initializedCallbacks = nullptr; std::shared_ptr m_readCallbacks = nullptr; - std::shared_ptr m_writeCallbacks = nullptr; + std::shared_ptr m_writeCallbacks = nullptr; }; extern I2CData SimI2CData[]; } // namespace hal diff --git a/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.cpp b/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.cpp index 567d3f8f76..4edf646460 100644 --- a/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.cpp +++ b/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.cpp @@ -83,3 +83,30 @@ void InvokeCallback(std::shared_ptr currentVector, listener.callback(name, listener.param, buffer, count); } } + +std::shared_ptr RegisterCallback( + std::shared_ptr currentVector, const char* name, + HAL_ConstBufferCallback callback, void* param, int32_t* newUid) { + return RegisterCallbackImpl(currentVector, name, + callback, param, newUid); +} + +std::shared_ptr CancelCallback( + std::shared_ptr currentVector, int32_t uid) { + return CancelCallbackImpl( + currentVector, uid); +} + +void InvokeCallback(std::shared_ptr currentVector, + const char* name, const uint8_t* buffer, int32_t count) { + // Return if no callbacks are assigned + if (currentVector == nullptr) return; + // Get a copy of the shared_ptr, then iterate and callback listeners + auto newCallbacks = currentVector; + for (size_t i = 0; i < newCallbacks->size(); ++i) { + if (!(*newCallbacks)[i]) continue; // removed + auto listener = (*newCallbacks)[i]; + listener.callback(name, listener.param, buffer, count); + } +} diff --git a/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.h b/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.h index 7e598a481f..95c6ed9a48 100644 --- a/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.h +++ b/hal/src/main/native/sim/MockData/NotifyCallbackHelpers.h @@ -30,3 +30,15 @@ std::shared_ptr CancelCallback( void InvokeCallback(std::shared_ptr currentVector, const char* name, uint8_t* buffer, int32_t count); + +std::shared_ptr RegisterCallback( + std::shared_ptr currentVector, + const char* name, HAL_ConstBufferCallback callback, void* param, + int32_t* newUid); + +std::shared_ptr CancelCallback( + std::shared_ptr currentVector, int32_t uid); + +void InvokeCallback( + std::shared_ptr currentVector, + const char* name, const uint8_t* buffer, int32_t count); diff --git a/hal/src/main/native/sim/MockData/SPIData.cpp b/hal/src/main/native/sim/MockData/SPIData.cpp index 5ad1d08319..13150a548e 100644 --- a/hal/src/main/native/sim/MockData/SPIData.cpp +++ b/hal/src/main/native/sim/MockData/SPIData.cpp @@ -82,7 +82,7 @@ void SPIData::CancelReadCallback(int32_t uid) { m_readCallbacks = CancelCallback(m_readCallbacks, uid); } -int32_t SPIData::RegisterWriteCallback(HAL_BufferCallback callback, +int32_t SPIData::RegisterWriteCallback(HAL_ConstBufferCallback callback, void* param) { // Must return -1 on a null callback for error handling if (callback == nullptr) return -1; @@ -219,7 +219,7 @@ void HALSIM_CancelSPIReadCallback(int32_t index, int32_t uid) { } int32_t HALSIM_RegisterSPIWriteCallback(int32_t index, - HAL_BufferCallback callback, + HAL_ConstBufferCallback callback, void* param) { return SimSPIData[index].RegisterWriteCallback(callback, param); } diff --git a/hal/src/main/native/sim/MockData/SPIDataInternal.h b/hal/src/main/native/sim/MockData/SPIDataInternal.h index 242cc31783..e8f88ac6b2 100644 --- a/hal/src/main/native/sim/MockData/SPIDataInternal.h +++ b/hal/src/main/native/sim/MockData/SPIDataInternal.h @@ -32,7 +32,7 @@ class SPIData { int32_t RegisterReadCallback(HAL_BufferCallback callback, void* param); void CancelReadCallback(int32_t uid); - int32_t RegisterWriteCallback(HAL_BufferCallback callback, void* param); + int32_t RegisterWriteCallback(HAL_ConstBufferCallback callback, void* param); void CancelWriteCallback(int32_t uid); int32_t RegisterResetAccumulatorCallback(HAL_NotifyCallback callback, @@ -61,7 +61,7 @@ class SPIData { std::atomic m_accumulatorValue{false}; std::shared_ptr m_initializedCallbacks = nullptr; std::shared_ptr m_readCallbacks = nullptr; - std::shared_ptr m_writeCallbacks = nullptr; + std::shared_ptr m_writeCallbacks = nullptr; std::shared_ptr m_resetAccumulatorCallback = nullptr; std::shared_ptr m_setAccumulatorCallback = nullptr; };