DCCpp
This is the library version of a program for Arduino to control railroading DCC devices.
DCCpp.hpp
1 //-------------------------------------------------------------------
2 #ifndef __DCCpp_hpp__
3 #define __DCCpp_hpp__
4 //-------------------------------------------------------------------
5 
6 #include "DCCpp.h"
7 
14 {
15  private:
18  byte activeFlags[4];
19 
23  byte activeFlagsSent[4];
24 
25  inline byte byteNumber(byte inFunctionNumber) { return inFunctionNumber / 8; }
26  inline byte bitNumber(byte inFunctionNumber) { return inFunctionNumber % 8; }
27 
28  public:
32 
35  void clear();
39  void activate(byte inFunctionNumber);
43  void inactivate(byte inFunctionNumber);
48  bool isActivated(byte inFunctionNumber);
50  void statesSent();
56  bool isActivationChanged(byte inFunctionNumber);
57 
58 #ifdef DCCPP_DEBUG_MODE
59 
62  void printActivated();
63 #endif
64 };
65 
70 class DCCpp
71 {
72  private:
73  static bool programMode;
74  static bool panicStopped;
75 
76  static bool setThrottle(volatile RegisterList *inReg, int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward);
77  //static int readCv(volatile RegisterList *inReg, byte inCvId, int callBack = 100, int callBackSub = 200) { return inReg->readCV(inCvId, callBack, callBackSub); }
78  static void writeCv(volatile RegisterList *inReg, int inCvId, byte inCvValue, int callBack = 100, int callBackSub = 200);
79  static int identifyLocoId(volatile RegisterList *inReg);
80  static void setFunctions(volatile RegisterList *inReg, int nReg, int inLocoId, FunctionsState &inStates);
81 
82  public:
83  static byte ackThreshold;
84  static volatile RegisterList mainRegs, progRegs;
85  static CurrentMonitor mainMonitor;
86  static CurrentMonitor progMonitor;
87 
88  public:
89  // begins
92  static void begin();
93 #ifndef USE_ONLY1_INTERRUPT
94 
100  static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
107  static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
108 
109 #ifdef ARDUINO_ARCH_AVR
110 
112  static inline void beginMainMotorShield() { beginMain(MOTOR_SHIELD_DIRECTION_MOTOR_CHANNEL_PIN_A, DCC_SIGNAL_PIN_MAIN, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_MAIN, MOTOR_SHIELD_CURRENT_MONITOR_PIN_MAIN); }
115  static inline void beginProgMotorShield() { beginProg(MOTOR_SHIELD_DIRECTION_MOTOR_CHANNEL_PIN_B, DCC_SIGNAL_PIN_PROG, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_PROG, MOTOR_SHIELD_CURRENT_MONITOR_PIN_PROG); }
116 
119  static inline void beginMainPololu() { beginMain(POLOLU_DIRECTION_MOTOR_CHANNEL_PIN_A, DCC_SIGNAL_PIN_MAIN, POLOLU_SIGNAL_ENABLE_PIN_MAIN, POLOLU_CURRENT_MONITOR_PIN_MAIN); }
122  static inline void beginProgPololu() { beginProg(POLOLU_DIRECTION_MOTOR_CHANNEL_PIN_B, DCC_SIGNAL_PIN_PROG, POLOLU_SIGNAL_ENABLE_PIN_PROG, POLOLU_CURRENT_MONITOR_PIN_PROG); }
123 #endif
124 #else
125 
131  static void beginMain(uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
138  static void beginProg(uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
139 
140 #ifdef ARDUINO_ARCH_AVR
141 
143  static inline void beginMainMotorShield() { beginMain(DCC_SIGNAL_PIN_MAIN, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_MAIN, MOTOR_SHIELD_CURRENT_MONITOR_PIN_MAIN); }
146  static inline void beginProgMotorShield() { beginProg(DCC_SIGNAL_PIN_PROG, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_PROG, MOTOR_SHIELD_CURRENT_MONITOR_PIN_PROG); }
147 
150  static inline void beginMainPololu() { beginMain(DCC_SIGNAL_PIN_MAIN, POLOLU_SIGNAL_ENABLE_PIN_MAIN, POLOLU_CURRENT_MONITOR_PIN_MAIN); }
153  static inline void beginProgPololu() { beginProg(DCC_SIGNAL_PIN_PROG, POLOLU_SIGNAL_ENABLE_PIN_PROG, POLOLU_CURRENT_MONITOR_PIN_PROG); }
154 #endif
155 #endif
156 
157  // The next two functions are redefined for each kind of Arduino... See DccSignal*.cpp
161  static void beginMainDccSignal(uint8_t inSignalPin);
165  static void beginProgDccSignal(uint8_t inSignalPin);
169  static void setDebugDccMode();
170 
171 #ifdef USE_ETHERNET
172 
177  static void beginEthernet(uint8_t *inMac, uint8_t *inIp, EthernetProtocol inProtocol = EthernetProtocol::TCP);
178 #endif
179 
180  // DCCpp global functions
181 
186  static bool IsMainTrack(volatile RegisterList *apRegs) { return apRegs == &mainRegs; }
187 
190  static void loop();
191 
195  static void panicStop(bool inStop);
196 
201  static void powerOn(bool inMain = true, bool inProg = true);
202 
207  static void powerOff(bool inMain = true, bool inProg = true);
208 
213  static byte setAckThreshold(byte inNewValue);
214 
218  static inline void setCurrentSampleMaxMain(float inMax) { mainMonitor.currentSampleMax = inMax; }
219 
223  static inline void setCurrentSampleMaxProg(float inMax) { progMonitor.currentSampleMax = inMax; }
224 
228  static inline float getCurrentMain() { return mainMonitor.pin == UNDEFINED_PIN ? 0 : mainMonitor.current; }
229 
233  static inline float getCurrentProg() { return progMonitor.pin == UNDEFINED_PIN ? 0 : progMonitor.current; }
234 
235  // Main track functions
236 
244  static inline bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(mainRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
245 
249  static inline int identifyLocoIdMain() { return identifyLocoId(&(mainRegs)); }
250 
258  static inline int readCvMain(int inCvId, int callBack = 100, int callBackSub = 200) { return mainRegs.readCVmain(inCvId, callBack, callBackSub); }
259 
267  static inline void writeCvMain(int inCvId, byte inValue, int callBack = 100, int callBackSub = 200) { writeCv(&(mainRegs), inCvId, inValue, callBack, callBackSub); }
268 
274  static inline void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(mainRegs), nReg, inLocoId, inStates); }
275 
276  // Programming track functions
277 
285  static inline bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(progRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
286 
290  static inline int identifyLocoIdProg() { return identifyLocoId(&(progRegs)); }
291 
299  static inline int readCvProg(int inCvId, int callBack = 100, int callBackSub = 200) { return progRegs.readCV(inCvId, callBack, callBackSub); }
300 
307  static inline void writeCvProg(int inCvId, byte inValue, int callBack = 100, int callBackSub = 200) { writeCv(&(progRegs), inCvId, inValue, callBack, callBackSub); }
308 
314  static inline void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(progRegs), nReg, inLocoId, inStates); }
315 
316  // Accessories
317 
323  static void setAccessory(int inAddress, byte inSubAddress, byte inActivate);
324 
325 public:
326 
327 #ifdef DCCPP_DEBUG_MODE
328 
333  static void CheckPowerConnectionsWithLeds(uint8_t aDirPin, unsigned int inDelay);
334 #endif
335 
336 #ifdef DCCPP_PRINT_DCCPP
337 
338  #define PRINT_DCCPP DCCpp::showConfiguration();
339 
342  static void showConfiguration();
343 #else
344  #define PRINT_DCCPP
345 #endif
346 };
347 
348 //-------------------------------------------------------------------
349 #endif
350 //-------------------------------------------------------------------
static void setAccessory(int inAddress, byte inSubAddress, byte inActivate)
Definition: DCCpp.cpp:626
static void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:314
static void writeCvProg(int inCvId, byte inValue, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:307
static int identifyLocoIdProg()
Definition: DCCpp.hpp:290
static bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:285
FunctionsState()
Definition: DCCpp.cpp:25
void clear()
Definition: DCCpp.cpp:30
static bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:244
void inactivate(byte inFunctionNumber)
Definition: DCCpp.cpp:46
static float getCurrentProg()
Definition: DCCpp.hpp:233
bool isActivated(byte inFunctionNumber)
Definition: DCCpp.cpp:51
static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:119
static void setCurrentSampleMaxProg(float inMax)
Definition: DCCpp.hpp:223
bool isActivationChanged(byte inFunctionNumber)
Definition: DCCpp.cpp:56
static void powerOn(bool inMain=true, bool inProg=true)
Definition: DCCpp.cpp:389
static int readCvMain(int inCvId, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:258
static int readCvProg(int inCvId, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:299
static void begin()
Definition: DCCpp.cpp:186
static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:157
static void beginMainDccSignal(uint8_t inSignalPin)
static void setDebugDccMode()
static bool IsMainTrack(volatile RegisterList *apRegs)
Definition: DCCpp.hpp:186
static byte setAckThreshold(byte inNewValue)
Definition: DCCpp.cpp:436
static void powerOff(bool inMain=true, bool inProg=true)
Definition: DCCpp.cpp:413
static void loop()
Definition: DCCpp.cpp:93
static void panicStop(bool inStop)
Definition: DCCpp.cpp:372
void statesSent()
Definition: DCCpp.cpp:61
Definition: DCCpp.hpp:70
static void setCurrentSampleMaxMain(float inMax)
Definition: DCCpp.hpp:218
void activate(byte inFunctionNumber)
Definition: DCCpp.cpp:41
float currentSampleMax
static float getCurrentMain()
Definition: DCCpp.hpp:228
static int identifyLocoIdMain()
Definition: DCCpp.hpp:249
static void writeCvMain(int inCvId, byte inValue, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:267
static void beginProgDccSignal(uint8_t inSignalPin)
static void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:274