10 #include <wpi/mutex.h>
12 #include "hal/ChipObject.h"
13 #include "hal/Types.h"
29 void SetOutputMode(int32_t* status) {
30 m_dio->writeOutputEnable(m_setOutputDirReg, status);
33 void SetInputMode(int32_t* status) {
34 m_dio->writeOutputEnable(m_unsetOutputDirReg, status);
37 void SetOutputTrue(int32_t* status) {
38 m_dio->writeDO(m_setOutputStateReg, status);
41 void SetOutputFalse(int32_t* status) {
42 m_dio->writeDO(m_unsetOutputStateReg, status);
45 tDIO::tOutputEnable m_setOutputDirReg;
46 tDIO::tOutputEnable m_unsetOutputDirReg;
47 tDIO::tDO m_setOutputStateReg;
48 tDIO::tDO m_unsetOutputStateReg;
52 wpi::mutex& UnsafeGetDIOMutex();
53 tDIO* UnsafeGetDigialSystem();
54 int32_t ComputeDigitalMask(HAL_DigitalHandle handle, int32_t* status);
68 template <
typename Functor>
69 void UnsafeManipulateDIO(HAL_DigitalHandle handle, int32_t* status,
71 auto port = digitalChannelHandles->Get(handle, HAL_HandleEnum::DIO);
72 if (port ==
nullptr) {
73 *status = HAL_HANDLE_ERROR;
76 wpi::mutex& dioMutex = detail::UnsafeGetDIOMutex();
77 tDIO* dSys = detail::UnsafeGetDigialSystem();
78 auto mask = detail::ComputeDigitalMask(handle, status);
79 if (status != 0)
return;
80 std::lock_guard<wpi::mutex> lock(dioMutex);
82 tDIO::tOutputEnable enableOE = dSys->readOutputEnable(status);
83 enableOE.value |= mask;
84 auto disableOE = enableOE;
85 disableOE.value &= ~mask;
86 tDIO::tDO enableDO = dSys->readDO(status);
87 enableDO.value |= mask;
88 auto disableDO = enableDO;
89 disableDO.value &= ~mask;
91 DIOSetProxy dioData{enableOE, disableOE, enableDO, disableDO, dSys};
Definition: NotifyListenerVector.h:18
Proxy class for directly manipulating the DIO pins.
Definition: UnsafeDIO.h:23