WPILibC++  unspecified
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Pages
CtreCanNode.h
1 #ifndef CtreCanNode_H_
2 #define CtreCanNode_H_
3 #include "ctre.h" //BIT Defines + Typedefs
4 #include <map>
5 #include <string.h> // memcpy
6 #include <sys/time.h>
8 {
9 public:
10  CtreCanNode(UINT8 deviceNumber);
11  ~CtreCanNode();
12 
13  UINT8 GetDeviceNumber()
14  {
15  return _deviceNumber;
16  }
17 protected:
18 
19 
20  template <typename T> class txTask{
21  public:
22  uint32_t arbId;
23  T * toSend;
24  T * operator -> ()
25  {
26  return toSend;
27  }
28  T & operator*()
29  {
30  return *toSend;
31  }
32  bool IsEmpty()
33  {
34  if(toSend == 0)
35  return true;
36  return false;
37  }
38  };
39  template <typename T> class recMsg{
40  public:
41  uint32_t arbId;
42  uint8_t bytes[8];
43  CTR_Code err;
44  T * operator -> ()
45  {
46  return (T *)bytes;
47  }
48  T & operator*()
49  {
50  return *(T *)bytes;
51  }
52  };
53  UINT8 _deviceNumber;
54  void RegisterRx(uint32_t arbId);
60  void RegisterTx(uint32_t arbId, uint32_t periodMs);
69  void RegisterTx(uint32_t arbId, uint32_t periodMs, uint32_t dlc, const uint8_t * initialFrame);
70  void UnregisterTx(uint32_t arbId);
71 
72  CTR_Code GetRx(uint32_t arbId,uint8_t * dataBytes,uint32_t timeoutMs);
73  void FlushTx(uint32_t arbId);
74  bool ChangeTxPeriod(uint32_t arbId, uint32_t periodMs);
75 
76  template<typename T> txTask<T> GetTx(uint32_t arbId)
77  {
78  txTask<T> retval = {0, nullptr};
79  txJobs_t::iterator i = _txJobs.find(arbId);
80  if(i != _txJobs.end()){
81  retval.arbId = i->second.arbId;
82  retval.toSend = (T*)i->second.toSend;
83  }
84  return retval;
85  }
86  template<class T> void FlushTx(T & par)
87  {
88  FlushTx(par.arbId);
89  }
90 
91  template<class T> recMsg<T> GetRx(uint32_t arbId, uint32_t timeoutMs)
92  {
93  recMsg<T> retval;
94  retval.err = GetRx(arbId,retval.bytes, timeoutMs);
95  return retval;
96  }
97 
98 private:
99 
100  class txJob_t {
101  public:
102  uint32_t arbId;
103  uint8_t toSend[8];
104  uint32_t periodMs;
105  uint8_t dlc;
106  };
107 
108  class rxEvent_t{
109  public:
110  uint8_t bytes[8];
111  struct timespec time;
112  rxEvent_t()
113  {
114  bytes[0] = 0;
115  bytes[1] = 0;
116  bytes[2] = 0;
117  bytes[3] = 0;
118  bytes[4] = 0;
119  bytes[5] = 0;
120  bytes[6] = 0;
121  bytes[7] = 0;
122  }
123  };
124 
125  typedef std::map<uint32_t,txJob_t> txJobs_t;
126  txJobs_t _txJobs;
127 
128  typedef std::map<uint32_t,rxEvent_t> rxRxEvents_t;
129  rxRxEvents_t _rxRxEvents;
130 };
131 #endif
Definition: CtreCanNode.h:20
Common header for all CTRE HAL modules.
Definition: CtreCanNode.h:7
CTR_Code
Definition: ctre.h:44
void RegisterTx(uint32_t arbId, uint32_t periodMs)
Schedule a CAN Frame for periodic transmit.
Definition: CtreCanNode.h:39