WPILibC++  2018.4.1-20180924031742-1200-g1aa8446
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
UnsafeDIO.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2017-2018 FIRST. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #pragma once
9 
10 #include <wpi/mutex.h>
11 
12 #include "hal/ChipObject.h"
13 #include "hal/Types.h"
14 
15 namespace hal {
16 
23 struct DIOSetProxy {
24  DIOSetProxy(const DIOSetProxy&) = delete;
25  DIOSetProxy(DIOSetProxy&&) = delete;
26  DIOSetProxy& operator=(const DIOSetProxy&) = delete;
27  DIOSetProxy& operator=(DIOSetProxy&&) = delete;
28 
29  void SetOutputMode(int32_t* status) {
30  m_dio->writeOutputEnable(m_setOutputDirReg, status);
31  }
32 
33  void SetInputMode(int32_t* status) {
34  m_dio->writeOutputEnable(m_unsetOutputDirReg, status);
35  }
36 
37  void SetOutputTrue(int32_t* status) {
38  m_dio->writeDO(m_setOutputStateReg, status);
39  }
40 
41  void SetOutputFalse(int32_t* status) {
42  m_dio->writeDO(m_unsetOutputStateReg, status);
43  }
44 
45  tDIO::tOutputEnable m_setOutputDirReg;
46  tDIO::tOutputEnable m_unsetOutputDirReg;
47  tDIO::tDO m_setOutputStateReg;
48  tDIO::tDO m_unsetOutputStateReg;
49  tDIO* m_dio;
50 };
51 namespace detail {
52 wpi::mutex& UnsafeGetDIOMutex();
53 tDIO* UnsafeGetDigialSystem();
54 int32_t ComputeDigitalMask(HAL_DigitalHandle handle, int32_t* status);
55 } // namespace detail
56 
68 template <typename Functor>
69 void UnsafeManipulateDIO(HAL_DigitalHandle handle, int32_t* status,
70  Functor func) {
71  auto port = digitalChannelHandles->Get(handle, HAL_HandleEnum::DIO);
72  if (port == nullptr) {
73  *status = HAL_HANDLE_ERROR;
74  return;
75  }
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);
81 
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;
90 
91  DIOSetProxy dioData{enableOE, disableOE, enableDO, disableDO, dSys};
92  func(dioData);
93 }
94 
95 } // namespace hal
void UnsafeManipulateDIO(HAL_DigitalHandle handle, int32_t *status, Functor func)
Unsafe digital output set function This function can be used to perform fast and determinstically set...
Definition: UnsafeDIO.h:69
WPILib Hardware Abstraction Layer (HAL) namespace.
Definition: SimDataValue.h:19
Proxy class for directly manipulating the DIO pins.
Definition: UnsafeDIO.h:23