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 inLocoId, byte inCvId);
78  static void writeCv(volatile RegisterList *inReg, int inLocoId, int inCvId, byte inCvValue);
79  static void setFunctions(volatile RegisterList *inReg, int nReg, int inLocoId, FunctionsState &inStates);
80 
81  public:
82  static volatile RegisterList mainRegs, progRegs;
83  static CurrentMonitor mainMonitor;
84  static CurrentMonitor progMonitor;
85 
86  public:
87  // begins
90  static void begin();
97  static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
104  static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor);
105 
108  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); }
111  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); }
112 
115  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); }
118  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); }
119 #ifdef USE_ETHERNET
120 
125  static void beginEthernet(uint8_t *inMac, uint8_t *inIp, EthernetProtocol inProtocol = EthernetProtocol::TCP);
126 #endif
127 
128  // DCCpp global functions
129 
132  static void loop();
136  static void panicStop(bool inStop);
139  static void powerOn();
142  static void powerOff();
146  static inline void setCurrentSampleMaxMain(float inMax) { mainMonitor.currentSampleMax = inMax; }
150  static inline void setCurrentSampleMaxProg(float inMax) { progMonitor.currentSampleMax = inMax; }
154  static inline float getCurrentMain() { return mainMonitor.pin == UNDEFINED_PIN ? 0 : mainMonitor.current; }
158  static inline float getCurrentProg() { return progMonitor.pin == UNDEFINED_PIN ? 0 : progMonitor.current; }
159 
160  // Main driving functions
168  static inline bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(mainRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
174  static inline int readCvMain(int inLocoId, byte inCvId) { return readCv(&(mainRegs), inLocoId, inCvId); }
180  static inline void writeCvMain(int inLocoId, int inCvId, byte inValue) { writeCv(&(mainRegs), inLocoId, inCvId, inValue); }
186  static inline void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(mainRegs), nReg, inLocoId, inStates); }
187 
188  // Programming driving functions
189 
197  static inline bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward) { return setThrottle(&(progRegs), nReg, inLocoId, inStepsNumber, inNewSpeed, inForward); }
203  static inline int readCvProg(int inLocoId, byte inCvId) { return readCv(&(progRegs), inLocoId, inCvId); }
209  static inline void writeCvProg(int inLocoId, int inCvId, byte inValue) { writeCv(&(progRegs), inLocoId, inCvId, inValue); }
215  static inline void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates) { setFunctions(&(progRegs), nReg, inLocoId, inStates); }
216 
217  // Accessories
218 
224  static void setAccessory(int inAddress, byte inSubAddress, byte inActivate);
225 
226 #ifdef DCCPP_PRINT_DCCPP
227 
230  static void showConfiguration();
231 #endif
232 };
233 
234 //-------------------------------------------------------------------
235 #endif
236 //-------------------------------------------------------------------
static void setFunctionsProg(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:215
static void writeCvProg(int inLocoId, int inCvId, byte inValue)
Definition: DCCpp.hpp:209
static bool setSpeedProg(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:197
static void setFunctionsMain(int nReg, int inLocoId, FunctionsState &inStates)
Definition: DCCpp.hpp:186
static int readCvMain(int inLocoId, byte inCvId)
Definition: DCCpp.hpp:174
static bool setSpeedMain(int nReg, int inLocoId, int inStepsNumber, int inNewSpeed, bool inForward)
Definition: DCCpp.hpp:168
static float getCurrentProg()
Definition: DCCpp.hpp:158
static float getCurrentMain()
Definition: DCCpp.hpp:154
static void setCurrentSampleMaxProg(float inMax)
Definition: DCCpp.hpp:150
static void setAccessory(int inAddress, byte inSubAddress, byte inActivate)
Definition: DCCpp.cpp:736
float currentSampleMax
static void setCurrentSampleMaxMain(float inMax)
Definition: DCCpp.hpp:146
bool isActivated(byte inFunctionNumber)
Definition: DCCpp.cpp:50
static int readCvProg(int inLocoId, byte inCvId)
Definition: DCCpp.hpp:203
FunctionsState()
Definition: DCCpp.cpp:24
static void begin()
Definition: DCCpp.cpp:291
void clear()
Definition: DCCpp.cpp:29
void activate(byte inFunctionNumber)
Definition: DCCpp.cpp:40
void inactivate(byte inFunctionNumber)
Definition: DCCpp.cpp:45
void statesSent()
Definition: DCCpp.cpp:60
Definition: DCCpp.hpp:70
static void beginProgMotorShield()
Definition: DCCpp.hpp:111
static void beginProgPololu()
Definition: DCCpp.hpp:118
static void beginProg(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:181
static void beginMain(uint8_t inOptionalDirectionMotor, uint8_t inSignalPin, uint8_t inSignalEnablePin, uint8_t inCurrentMonitor)
Definition: DCCpp.cpp:117
static void beginMainMotorShield()
Definition: DCCpp.hpp:108
static void powerOff()
Definition: DCCpp.cpp:558
static void beginMainPololu()
Definition: DCCpp.hpp:115
static void powerOn()
Definition: DCCpp.cpp:546
static void loop()
Definition: DCCpp.cpp:92
static void writeCvMain(int inLocoId, int inCvId, byte inValue)
Definition: DCCpp.hpp:180
bool isActivationChanged(byte inFunctionNumber)
Definition: DCCpp.cpp:55
static void panicStop(bool inStop)
Definition: DCCpp.cpp:529