mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-25 05:31:24 +01:00
Merge pull request #4 from DCC-EX/cs-issue24-boardMgmtSub
Moved to subclasses for board management
This commit is contained in:
commit
7c9597a4c0
@ -33,22 +33,21 @@ int ramLowWatermark = 256000;
|
|||||||
const uint8_t kIRQmicros = 29;
|
const uint8_t kIRQmicros = 29;
|
||||||
const uint8_t kNumLocos = 50;
|
const uint8_t kNumLocos = 50;
|
||||||
|
|
||||||
#if defined CONFIG_WSM_FIREBOX_MK1
|
Railcom* mainRailcom;
|
||||||
DCCMain* mainTrack = DCCMain::Create_WSM_FireBox_MK1_Main(kNumLocos);
|
|
||||||
DCCService* progTrack = DCCService::Create_WSM_FireBox_MK1_Prog();
|
#if defined CONFIG_ARDUINO_MOTOR_SHIELD
|
||||||
#elif defined CONFIG_WSM_FIREBOX_MK1S
|
BoardArduinoMotorShield* mainBoard;
|
||||||
DCCMain* mainTrack = DCCMain::Create_WSM_FireBox_MK1S_Main(kNumLocos);
|
BoardArduinoMotorShield* progBoard;
|
||||||
DCCService* progTrack = DCCService::Create_WSM_FireBox_MK1S_Prog();
|
|
||||||
#elif defined CONFIG_ARDUINO_MOTOR_SHIELD
|
|
||||||
DCCMain* mainTrack = DCCMain::Create_Arduino_L298Shield_Main(kNumLocos);
|
|
||||||
DCCService* progTrack = DCCService::Create_Arduino_L298Shield_Prog();
|
|
||||||
#elif defined CONFIG_POLOLU_MOTOR_SHIELD
|
#elif defined CONFIG_POLOLU_MOTOR_SHIELD
|
||||||
DCCMain* mainTrack = DCCMain::Create_Pololu_MC33926Shield_Main(kNumLocos);
|
BoardPololuMotorShield* mainBoard;
|
||||||
DCCService* progTrack = DCCService::Create_Pololu_MC33926Shield_Prog();
|
BoardPololuMotorShield* progBoard;
|
||||||
#else
|
#else
|
||||||
#error "Cannot compile - no board selected in Config.h"
|
#error "Cannot compile - no board selected in Config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
DCCMain* mainTrack;
|
||||||
|
DCCService* progTrack;
|
||||||
|
|
||||||
void waveform_IrqHandler() {
|
void waveform_IrqHandler() {
|
||||||
bool mainInterrupt = mainTrack->interrupt1();
|
bool mainInterrupt = mainTrack->interrupt1();
|
||||||
bool progInterrupt = progTrack->interrupt1();
|
bool progInterrupt = progTrack->interrupt1();
|
||||||
@ -59,18 +58,64 @@ void waveform_IrqHandler() {
|
|||||||
#if defined(ARDUINO_ARCH_SAMD)
|
#if defined(ARDUINO_ARCH_SAMD)
|
||||||
void SERCOM4_Handler()
|
void SERCOM4_Handler()
|
||||||
{
|
{
|
||||||
mainTrack->railcom.getSerial()->IrqHandler();
|
mainTrack->railcom->getSerial()->IrqHandler();
|
||||||
}
|
}
|
||||||
#elif defined(ARDUINO_ARCH_SAMC)
|
#elif defined(ARDUINO_ARCH_SAMC)
|
||||||
void SERCOM0_Handler()
|
void SERCOM0_Handler()
|
||||||
{
|
{
|
||||||
mainTrack->railcom.getSerial()->IrqHandler();
|
mainTrack->railcom->getSerial()->IrqHandler();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|
||||||
|
|
||||||
|
#if defined CONFIG_ARDUINO_MOTOR_SHIELD
|
||||||
|
BoardConfigArduinoMotorShield mainConfig;
|
||||||
|
BoardArduinoMotorShield::getDefaultConfigA(mainConfig);
|
||||||
|
mainConfig.track_power_callback = DCCEXParser::trackPowerCallback;
|
||||||
|
// Add modifications to pinouts, currents, etc here using mainConfig.setting = value; syntax
|
||||||
|
|
||||||
|
//
|
||||||
|
mainBoard = new BoardArduinoMotorShield(mainConfig);
|
||||||
|
|
||||||
|
BoardConfigArduinoMotorShield progConfig;
|
||||||
|
BoardArduinoMotorShield::getDefaultConfigB(progConfig);
|
||||||
|
progConfig.track_power_callback = DCCEXParser::trackPowerCallback;
|
||||||
|
// Add modifications to pinouts, currents, etc here using progConfig.setting = value; syntax
|
||||||
|
|
||||||
|
//
|
||||||
|
progBoard = new BoardArduinoMotorShield(progConfig);
|
||||||
|
#elif defined CONFIG_POLOLU_MOTOR_SHIELD
|
||||||
|
BoardConfigPololuMotorShield mainConfig;
|
||||||
|
BoardPololuMotorShield::getDefaultConfigA(mainConfig);
|
||||||
|
mainConfig.track_power_callback = DCCEXParser::trackPowerCallback;
|
||||||
|
// Add modifications to pinouts, currents, etc here using mainConfig.setting = value; syntax
|
||||||
|
|
||||||
|
//
|
||||||
|
mainBoard = new BoardPololuMotorShield(mainConfig);
|
||||||
|
|
||||||
|
BoardConfigPololuMotorShield progConfig;
|
||||||
|
BoardPololuMotorShield::getDefaultConfigB(progConfig);
|
||||||
|
progConfig.track_power_callback = DCCEXParser::trackPowerCallback;
|
||||||
|
// Add modifications to pinouts, currents, etc here using progConfig.setting = value; syntax
|
||||||
|
|
||||||
|
//
|
||||||
|
progBoard = new BoardPololuMotorShield(progConfig);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RailComConfig rcomConfig;
|
||||||
|
Railcom::getDefaultConfig(rcomConfig); // Default is off
|
||||||
|
mainRailcom = new Railcom(rcomConfig);
|
||||||
|
|
||||||
|
mainBoard->setup();
|
||||||
|
mainTrack = new DCCMain(kNumLocos, mainBoard, mainRailcom);
|
||||||
mainTrack->setup();
|
mainTrack->setup();
|
||||||
progTrack->setup();
|
|
||||||
|
progBoard->setup();
|
||||||
|
progTrack = new DCCService(progBoard);
|
||||||
|
progTrack->setup(); // Currently doesn't do anything, but may be extended later
|
||||||
|
progTrack->board->progMode(ON); // Limits current to 250mA. Current limit can be changed in config above.
|
||||||
|
|
||||||
// TimerA is TCC0 on SAMD21, Timer1 on MEGA2560, and Timer1 on MEGA328
|
// TimerA is TCC0 on SAMD21, Timer1 on MEGA2560, and Timer1 on MEGA328
|
||||||
// We will fire an interrupt every 29us to generate the signal on the track
|
// We will fire an interrupt every 29us to generate the signal on the track
|
||||||
@ -79,13 +124,10 @@ void setup() {
|
|||||||
TimerA.attachInterrupt(waveform_IrqHandler);
|
TimerA.attachInterrupt(waveform_IrqHandler);
|
||||||
TimerA.start();
|
TimerA.start();
|
||||||
|
|
||||||
mainTrack->hdw.config_setTrackPowerCallback(DCCEXParser::trackPowerCallback);
|
|
||||||
progTrack->hdw.config_setTrackPowerCallback(DCCEXParser::trackPowerCallback);
|
|
||||||
|
|
||||||
// Register the serial interface
|
// Register the serial interface
|
||||||
#if defined (ARDUINO_ARCH_SAMD)
|
#if defined (ARDUINO_ARCH_SAMD)
|
||||||
CommManager::registerInterface(new USBInterface(SerialUSB));
|
CommManager::registerInterface(new USBInterface(SerialUSB));
|
||||||
while(!SerialUSB) {} // Wait for USB to come online (remove once wifi is implemented)
|
while(!SerialUSB) {}
|
||||||
Wire.begin(); // Needed for EEPROM to work
|
Wire.begin(); // Needed for EEPROM to work
|
||||||
EEStore::init(&SerialUSB);
|
EEStore::init(&SerialUSB);
|
||||||
#elif defined (ARDUINO_ARCH_SAMC)
|
#elif defined (ARDUINO_ARCH_SAMC)
|
||||||
@ -97,8 +139,6 @@ void setup() {
|
|||||||
EEStore::init(&Serial);
|
EEStore::init(&Serial);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Set up the string parser to accept commands from the interfaces
|
// Set up the string parser to accept commands from the interfaces
|
||||||
DCCEXParser::init(mainTrack, progTrack);
|
DCCEXParser::init(mainTrack, progTrack);
|
||||||
|
|
||||||
@ -110,9 +150,11 @@ void loop() {
|
|||||||
mainTrack->loop();
|
mainTrack->loop();
|
||||||
progTrack->loop();
|
progTrack->loop();
|
||||||
|
|
||||||
|
#if defined(FREE_MEM_PRINT)
|
||||||
int freeNow=freeMemory();
|
int freeNow=freeMemory();
|
||||||
if (freeNow<ramLowWatermark) {
|
if (freeNow<ramLowWatermark) {
|
||||||
ramLowWatermark=freeNow;
|
ramLowWatermark=freeNow;
|
||||||
CommManager::broadcast(F("\nFree RAM=%d\n"),ramLowWatermark);
|
CommManager::broadcast(F("\n\rFree RAM=%d\n\r"),ramLowWatermark);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
3
Config.h
3
Config.h
@ -27,4 +27,7 @@
|
|||||||
#define CONFIG_ARDUINO_MOTOR_SHIELD
|
#define CONFIG_ARDUINO_MOTOR_SHIELD
|
||||||
//#define CONFIG_POLOLU_MOTOR_SHIELD
|
//#define CONFIG_POLOLU_MOTOR_SHIELD
|
||||||
|
|
||||||
|
// Comment out this line to disable printing free memory every time it shrinks
|
||||||
|
#define FREE_MEM_PRINT
|
||||||
|
|
||||||
#endif // COMMANDSTATION_DCC_CONFIG_H_
|
#endif // COMMANDSTATION_DCC_CONFIG_H_
|
||||||
|
Loading…
Reference in New Issue
Block a user