/* * main.cpp * * This file is part of CommandStation-DCC. * * CommandStation-DCC is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CommandStation-DCC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with CommandStation-DCC. If not, see . */ #include #include #include #include "Config.h" #include "FreeMemory.h" #if defined(ARDUINO_ARCH_AVR) int ramLowWatermark = 32767; #else int ramLowWatermark = 256000; #endif const uint8_t kIRQmicros = 29; const uint8_t kNumLocos = 50; #if defined CONFIG_WSM_FIREBOX_MK1 DCCMain* mainTrack = DCCMain::Create_WSM_FireBox_MK1_Main(kNumLocos); DCCService* progTrack = DCCService::Create_WSM_FireBox_MK1_Prog(); #elif defined CONFIG_WSM_FIREBOX_MK1S DCCMain* mainTrack = DCCMain::Create_WSM_FireBox_MK1S_Main(kNumLocos); 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 DCCMain* mainTrack = DCCMain::Create_Pololu_MC33926Shield_Main(kNumLocos); DCCService* progTrack = DCCService::Create_Pololu_MC33926Shield_Prog(); #else #error "Cannot compile - no board selected in Config.h" #endif void waveform_IrqHandler() { bool mainInterrupt = mainTrack->interrupt1(); bool progInterrupt = progTrack->interrupt1(); if(mainInterrupt) mainTrack->interrupt2(); if(progInterrupt) progTrack->interrupt2(); } #if defined(ARDUINO_ARCH_SAMD) void SERCOM4_Handler() { mainTrack->railcom.getSerial()->IrqHandler(); } #elif defined(ARDUINO_ARCH_SAMC) void SERCOM0_Handler() { mainTrack->railcom.getSerial()->IrqHandler(); } #endif void setup() { mainTrack->setup(); progTrack->setup(); // 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 TimerA.initialize(); TimerA.setPeriod(kIRQmicros); TimerA.attachInterrupt(waveform_IrqHandler); TimerA.start(); mainTrack->hdw.config_setTrackPowerCallback(DCCEXParser::trackPowerCallback); progTrack->hdw.config_setTrackPowerCallback(DCCEXParser::trackPowerCallback); // Register the serial interface #if defined (ARDUINO_ARCH_SAMD) CommManager::registerInterface(new USBInterface(SerialUSB)); while(!SerialUSB) {} // Wait for USB to come online (remove once wifi is implemented) Wire.begin(); // Needed for EEPROM to work EEStore::init(&SerialUSB); #elif defined (ARDUINO_ARCH_SAMC) CommManager::registerInterface(new SerialInterface(Serial)); Wire.begin(); // Needed for EEPROM to work EEStore::init(&Serial); #elif defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR) CommManager::registerInterface(new SerialInterface(Serial)); EEStore::init(&Serial); #endif // Set up the string parser to accept commands from the interfaces DCCEXParser::init(mainTrack, progTrack); CommManager::showInitInfo(); } void loop() { CommManager::update(); mainTrack->loop(); progTrack->loop(); int freeNow=freeMemory(); if (freeNow