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, int inCvId, int callBack = 100, int callBackSub = 200) { return inReg->readCV(inCvId, callBack, callBackSub); }
78  static bool 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  static bool IsPowerOnMain;
88  static bool IsPowerOnProg;
89 
90  public:
91  // begins
94  static void begin();
95 #ifndef USE_ONLY1_INTERRUPT
96 
102  static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
109  static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
110 
111 #ifdef ARDUINO_ARCH_AVR
112 
114  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); }
117  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); }
118 
121  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); }
124  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); }
125 #endif
126 #else
127 
133  static void beginMain(uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
140  static void beginProg(uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
141 
142 #ifdef ARDUINO_ARCH_AVR
143 
145  static inline void beginMainMotorShield() { beginMain(DCC_SIGNAL_PIN_MAIN, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_MAIN, MOTOR_SHIELD_CURRENT_MONITOR_PIN_MAIN); }
148  static inline void beginProgMotorShield() { beginProg(DCC_SIGNAL_PIN_PROG, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_PROG, MOTOR_SHIELD_CURRENT_MONITOR_PIN_PROG); }
149 
152  static inline void beginMainPololu() { beginMain(DCC_SIGNAL_PIN_MAIN, POLOLU_SIGNAL_ENABLE_PIN_MAIN, POLOLU_CURRENT_MONITOR_PIN_MAIN); }
155  static inline void beginProgPololu() { beginProg(DCC_SIGNAL_PIN_PROG, POLOLU_SIGNAL_ENABLE_PIN_PROG, POLOLU_CURRENT_MONITOR_PIN_PROG); }
156 #endif
157 #endif
158 
159  // The next two functions are redefined for each kind of Arduino... See DccSignal*.cpp
163  static void beginMainDccSignal(uint8_t inSignalPin);
167  static void beginProgDccSignal(uint8_t inSignalPin);
171  static void setDebugDccMode();
172 
173 #ifdef USE_ETHERNET
174 
179  static void beginEthernet(uint8_t *inMac, uint8_t *inIp, EthernetProtocol inProtocol = EthernetProtocol::TCP);
180 #endif
181 
182  // DCCpp global functions
183 
188  static bool IsMainTrack(volatile RegisterList *apRegs) { return apRegs == &mainRegs; }
189 
193  static bool IsMainTrackDeclared() { return DCCppConfig::SignalEnablePinMain != UNDEFINED_PIN; }
194 
198  static bool IsProgTrackDeclared() { return DCCppConfig::SignalEnablePinProg != UNDEFINED_PIN; }
199 
202  static void loop();
203 
207  static void panicStop(bool inStop);
208 
213  static void powerOn(bool inMain = true, bool inProg = true);
214 
219  static void powerOff(bool inMain = true, bool inProg = true);
220 
225  static byte setAckThreshold(byte inNewValue);
226 
230  static inline void setCurrentSampleMaxMain(float inMax) { mainMonitor.currentSampleMax = inMax; }
231 
235  static inline void setCurrentSampleMaxProg(float inMax) { progMonitor.currentSampleMax = inMax; }
236 
240  static inline float getCurrentMain() { return mainMonitor.pin == UNDEFINED_PIN ? 0 : mainMonitor.current; }
241 
245  static inline float getCurrentProg() { return progMonitor.pin == UNDEFINED_PIN ? 0 : progMonitor.current; }
246 
247  // Main track functions
248 
257  static inline bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(mainRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
258 
262  static inline int identifyLocoIdMain() { return identifyLocoId(&(mainRegs)); }
263 
271  static inline int readCvMain(int inCvId, int callBack = 100, int callBackSub = 200) { return mainRegs.readCVmain(inCvId, callBack, callBackSub); }
272 
280  static inline void writeCvMain(int inCvId, byte inValue, int callBack = 100, int callBackSub = 200) { writeCv(&(mainRegs), inCvId, inValue, callBack, callBackSub); }
281 
287  static inline void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(mainRegs), nReg, inLocoId, inStates); }
288 
289  // Programming track functions
290 
299  static inline bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(progRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
300 
304  static inline int identifyLocoIdProg() { return identifyLocoId(&(progRegs)); }
305 
313  static inline int readCvProg(int inCvId, int callBack = 100, int callBackSub = 200) { return progRegs.readCV(inCvId, callBack, callBackSub); }
314 
322  static inline bool writeCvProg(int inCvId, byte inValue, int callBack = 100, int callBackSub = 200) { return writeCv(&(progRegs), inCvId, inValue, callBack, callBackSub); }
323 
329  static inline void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(progRegs), nReg, inLocoId, inStates); }
330 
331  // Accessories
332 
338  static void setAccessory(int inAddress, byte inSubAddress, byte inActivate);
339 
340 public:
341 
342 #ifdef DCCPP_DEBUG_MODE
343 
348  static void CheckPowerConnectionsWithLeds(uint8_t aDirPin, unsigned int inDelay);
349 #endif
350 
351 #ifdef DCCPP_PRINT_DCCPP
352 
353  #define PRINT_DCCPP DCCpp::showConfiguration();
354 
357  static void showConfiguration();
358 #else
359  #define PRINT_DCCPP
360 #endif
361 };
362 
363 //-------------------------------------------------------------------
364 #endif
365 //-------------------------------------------------------------------
static void showConfiguration()
Definition: DCCpp.cpp:260
static void setAccessory(int inAddress, byte inSubAddress, byte inActivate)
Definition: DCCpp.cpp:634
static void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:329
static bool writeCvProg(int inCvId, byte inValue, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:322
static int readCvProg(int inCvId, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:313
static int identifyLocoIdProg()
Definition: DCCpp.hpp:304
static bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:299
static void writeCvMain(int inCvId, byte inValue, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:280
void statesSent()
Definition: DCCpp.cpp:63
FunctionsState()
Definition: DCCpp.cpp:27
static void begin()
Definition: DCCpp.cpp:188
static void beginMainDccSignal(uint8_t inSignalPin)
void activate(byte inFunctionNumber)
Definition: DCCpp.cpp:43
void inactivate(byte inFunctionNumber)
Definition: DCCpp.cpp:48
bool isActivated(byte inFunctionNumber)
Definition: DCCpp.cpp:53
static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:121
static void setCurrentSampleMaxProg(float inMax)
Definition: DCCpp.hpp:235
Definition: DCCpp.hpp:70
static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:159
static void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:287
static void beginProgDccSignal(uint8_t inSignalPin)
static void setDebugDccMode()
void clear()
Definition: DCCpp.cpp:32
static bool IsMainTrack(volatile RegisterList *apRegs)
Definition: DCCpp.hpp:188
static byte setAckThreshold(byte inNewValue)
Definition: DCCpp.cpp:442
static bool IsMainTrackDeclared()
Definition: DCCpp.hpp:193
static float getCurrentMain()
Definition: DCCpp.hpp:240
static bool IsProgTrackDeclared()
Definition: DCCpp.hpp:198
static void panicStop(bool inStop)
Definition: DCCpp.cpp:374
bool isActivationChanged(byte inFunctionNumber)
Definition: DCCpp.cpp:58
static void powerOff(bool inMain=true, bool inProg=true)
Definition: DCCpp.cpp:417
static void loop()
Definition: DCCpp.cpp:95
static void setCurrentSampleMaxMain(float inMax)
Definition: DCCpp.hpp:230
float currentSampleMax
static float getCurrentProg()
Definition: DCCpp.hpp:245
static bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:257
static int identifyLocoIdMain()
Definition: DCCpp.hpp:262
static void powerOn(bool inMain=true, bool inProg=true)
Definition: DCCpp.cpp:391
static int readCvMain(int inCvId, int callBack=100, int callBackSub=200)
Definition: DCCpp.hpp:271