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 
20  inline byte byteNumber(byte inFunctionNumber) { return inFunctionNumber / 8; }
21  inline byte bitNumber(byte inFunctionNumber) { return inFunctionNumber % 8; }
22 
23  public:
27 
30  void clear();
34  void activate(byte inFunctionNumber);
38  void inactivate(byte inFunctionNumber);
43  bool isActivated(byte inFunctionNumber);
44 
45 #ifdef DCCPP_DEBUG_MODE
46 
49  void printActivated();
50 #endif
51 };
52 
57 class DCCpp
58 {
59  private:
60  static bool programMode;
61  static bool panicStopped;
62 
63  static bool setThrottle(volatile RegisterList *inReg, int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward);
64  static int readCv(volatile RegisterList *inReg, int inLocoId, byte inCvId);
65  static void writeCv(volatile RegisterList *inReg, int inLocoId, int inCvId, byte inCvValue);
66  static void setFunctions(volatile RegisterList *inReg, int nReg, int inLocoId, FunctionsState inStates);
67 
68  public:
69  static volatile RegisterList mainRegs, progRegs;
70  static CurrentMonitor mainMonitor;
71  static CurrentMonitor progMonitor;
72 
73  public:
74  // begins
77  static void begin();
84  static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
91  static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
92 
95  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); }
98  static inline void beginProgMotorShield() { beginMain(MOTOR_SHIELD_DIRECTION_MOTOR_CHANNEL_PIN_B, DCC_SIGNAL_PIN_PROG, MOTOR_SHIELD_SIGNAL_ENABLE_PIN_PROG, MOTOR_SHIELD_CURRENT_MONITOR_PIN_PROG); }
99 
102  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); }
105  static inline void beginProgPololu() { beginMain(POLOLU_DIRECTION_MOTOR_CHANNEL_PIN_B, DCC_SIGNAL_PIN_PROG, POLOLU_SIGNAL_ENABLE_PIN_PROG, POLOLU_CURRENT_MONITOR_PIN_PROG); }
106 #ifdef USE_ETHERNET
107 
112  static void beginEthernet(uint8_t *inMac, uint8_t *inIp, EthernetProtocol inProtocol = EthernetProtocol::TCP);
113 #endif
114 
115  // DCCpp global functions
116 
119  static void loop();
123  static void panicStop(bool inStop);
126  static void powerOn();
129  static void powerOff();
133  static inline void setCurrentSampleMaxMain(float inMax) { mainMonitor.currentSampleMax = inMax; }
137  static inline void setCurrentSampleMaxProg(float inMax) { progMonitor.currentSampleMax = inMax; }
141  static inline float getCurrentMain() { return mainMonitor.pin == UNDEFINED_PIN ? 0 : mainMonitor.current; }
145  static inline float getCurrentProg() { return progMonitor.pin == UNDEFINED_PIN ? 0 : progMonitor.current; }
146 
147  // Main driving functions
155  static inline bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(mainRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
161  static inline int readCvMain(int inLocoId, byte inCvId) { return readCv(&(mainRegs), inLocoId, inCvId); }
167  static inline void writeCvMain(int inLocoId, int inCvId, byte inValue) { writeCv(&(mainRegs), inLocoId, inCvId, inValue); }
173  static inline void setFunctionsMain(int nReg, int inLocoId, const FunctionsState &inStates) { setFunctions(&(mainRegs), nReg, inLocoId, inStates); }
174 
175  // Programming driving functions
176 
184  static inline bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(progRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
190  static inline int readCvProg(int inLocoId, byte inCvId) { return readCv(&(progRegs), inLocoId, inCvId); }
196  static inline void writeCvProg(int inLocoId, int inCvId, byte inValue) { writeCv(&(progRegs), inLocoId, inCvId, inValue); }
202  static inline void setFunctionsProg(int nReg, int inLocoId, FunctionsState inStates) { setFunctions(&(progRegs), nReg, inLocoId, inStates); }
203 
204  // Accessories
205 
211  static void setAccessory(int inAddress, byte inSubAddress, byte inActivate);
212 
213 #ifdef DCCPP_PRINT_DCCPP
214 
217  static void showConfiguration();
218 #endif
219 };
220 
221 //-------------------------------------------------------------------
222 #endif
223 //-------------------------------------------------------------------
static int readCvProg(int inLocoId, byte inCvId)
Definition: DCCpp.hpp:190
static bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:184
static void writeCvMain(int inLocoId, int inCvId, byte inValue)
Definition: DCCpp.hpp:167
static int readCvMain(int inLocoId, byte inCvId)
Definition: DCCpp.hpp:161
static bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:155
static void setFunctionsProg(int nReg, int inLocoId, FunctionsState inStates)
Definition: DCCpp.hpp:202
static float getCurrentProg()
Definition: DCCpp.hpp:145
static float getCurrentMain()
Definition: DCCpp.hpp:141
float currentSampleMax
static void writeCvProg(int inLocoId, int inCvId, byte inValue)
Definition: DCCpp.hpp:196
static void setCurrentSampleMaxMain(float inMax)
Definition: DCCpp.hpp:133
static void panicStop(bool inStop)
Definition: DCCpp.cpp:516
static void loop()
Definition: DCCpp.cpp:79
static void beginEthernet(uint8_t *inMac, uint8_t *inIp, EthernetProtocol inProtocol = EthernetProtocol::TCP)
Definition: DCCpp.cpp:314
static void beginProgMotorShield()
Definition: DCCpp.hpp:98
static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:168
static void setFunctionsMain(int nReg, int inLocoId, const FunctionsState &inStates)
Definition: DCCpp.hpp:173
static void powerOff()
Definition: DCCpp.cpp:545
static void powerOn()
Definition: DCCpp.cpp:533
static void beginMainPololu()
Definition: DCCpp.hpp:102
static void beginMainMotorShield()
Definition: DCCpp.hpp:95
Definition: DCCpp.hpp:57
static void beginProgPololu()
Definition: DCCpp.hpp:105
bool isActivated(byte inFunctionNumber)
Definition: DCCpp.cpp:48
void inactivate(byte inFunctionNumber)
Definition: DCCpp.cpp:43
static void setCurrentSampleMaxProg(float inMax)
Definition: DCCpp.hpp:137
void activate(byte inFunctionNumber)
Definition: DCCpp.cpp:38
static void begin()
Definition: DCCpp.cpp:278
void clear()
Definition: DCCpp.cpp:29
static void setAccessory(int inAddress, byte inSubAddress, byte inActivate)
Definition: DCCpp.cpp:716
FunctionsState()
Definition: DCCpp.cpp:24
static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:104