Commanders
Arduino buttons/bus library
DccCommanderNMRA.hpp
1 //-------------------------------------------------------------------
2 #ifndef __dccCommanderNMRA_H__
3 #define __dccCommanderNMRA_H__
4 //-------------------------------------------------------------------
5 
6 #include <Commanders.h>
7 
8 #ifndef NO_DCCCOMMANDERNMRA
9 
10 #include <NmraDcc.h>
11 
13 #define DccCommanderNMRA DccCommanderNMRAClass::GetCurrent()
14 
15 //-------------------------------------------------------------------
16 
17 typedef void(*DccAccDecoderPacket)(int address, boolean activate, uint8_t data);
18 
19 // A dcc id is a long int with accessory id * 10000 + dcc id .
20 #define DCCID(id) ((id) % 10000)
21 #define DCCACTIVATION(id) ((uint8_t)((id) / 10000))
22 #define DCCINT(id, acc) ((acc) * 10000UL + (id))
23 
86 {
87  private:
88  unsigned long lastDccId;
89  unsigned long lastEventDate;
90  boolean raiseEventOnActivation;
91  boolean rocoMode;
92  int raiseEventDebounceDelay;
93  static DccCommanderNMRAClass *pDccCommander;
94 
95  public:
96  static NmraDcc Dcc;
97 
100 
110  void beginByPin(int inManufacturerId, int inVersionId, int interruptNumber, boolean inInterruptMonitor = false, boolean inRocoMode = false);
111 
117  void RaiseEventWhen(boolean inRaiseEventOnActivation, int inRaiseEventDebounceDelay = 200);
118 
122  void PriorityLoop();
124  unsigned long loop();
126  static void SetAccessoryDecoderPacketHandler(DccAccDecoderPacket func);
132  static void DccAccessoryDecoderPacket(int address, boolean activate, uint8_t data);
134  inline unsigned long GetLastDccId() { return this->lastDccId; }
136  inline bool GetRocoMode() { return this->rocoMode; }
137 
139  static void CheckLastReception(uint16_t inBoardAddr, uint8_t inOutputPair, uint8_t inDirection, uint8_t inOutputPower);
140 
141  public:
146  {
147  if (pDccCommander == NULL)
148  pDccCommander = new DccCommanderNMRAClass();
149 
150  return *(DccCommanderNMRAClass::pDccCommander);
151  }
152 
153 #ifdef COMMANDERS_DEBUG_MODE
154  public:
158  static void printEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData);
159  #define PRINT_EVENT_DCC(id, type, data) DccCommanderNMRA.printEvent(id, type, data);
160 #else
161  #define PRINT_EVENT_DCC(id, type, data)
162 #endif
163 #ifdef COMMANDERS_PRINT_COMMANDERS
164  private:
165  int8_t Interrupt;
166  public:
170  void printCommander();
171 #endif
172 };
173 
174 //-------------------------------------------------------------------
175 #endif
176 #endif
177 //-------------------------------------------------------------------
static DccCommanderNMRAClass & GetCurrent()
static void CheckLastReception(uint16_t inBoardAddr, uint8_t inOutputPair, uint8_t inDirection, uint8_t inOutputPower)
static void DccAccessoryDecoderPacket(int address, boolean activate, uint8_t data)
static void SetAccessoryDecoderPacketHandler(DccAccDecoderPacket func)
COMMANDERS_EVENT_TYPE
Definition: Events.h:25
void RaiseEventWhen(boolean inRaiseEventOnActivation, int inRaiseEventDebounceDelay = 200)
static void printEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
unsigned long GetLastDccId()
void beginByPin(int inManufacturerId, int inVersionId, int interruptNumber, boolean inInterruptMonitor = false, boolean inRocoMode = false)