1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-24 00:26:13 +01:00
CommandStation-EX/CommandStation-EX.ino

139 lines
4.3 KiB
Arduino
Raw Normal View History

////////////////////////////////////////////////////////////////////////////////////
2021-02-06 11:55:11 +01:00
// DCC-EX CommandStation-EX Please see https://DCC-EX.com
//
2021-02-06 11:55:11 +01:00
// This file is the main sketch for the Command Station.
//
// CONFIGURATION:
// Configuration is normally performed by editing a file called config.h.
// This file is NOT shipped with the code so that if you pull a later version
// of the code, your configuration will not be overwritten.
//
2021-02-06 11:55:11 +01:00
// If you used the automatic installer program, config.h will have been created automatically.
//
// To obtain a starting copy of config.h please copy the file config.example.h which is
// shipped with the code and may be updated as new features are added.
//
// If config.h is not found, config.example.h will be used with all defaults.
////////////////////////////////////////////////////////////////////////////////////
2021-02-06 11:55:11 +01:00
#if __has_include ( "config.h")
#include "config.h"
#else
2021-02-07 11:27:46 +01:00
#warning config.h not found. Using defaults from config.example.h
2021-02-06 11:55:11 +01:00
#include "config.example.h"
#endif
/*
* © 2020,2021 Chris Harlow, Harald Barth, David Cutting,
* Fred Decker, Gregor Baues, Anthony W - Dayton All rights reserved.
*
*
* This 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.
*
* It 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. If not, see <https://www.gnu.org/licenses/>.
*/
#include "DCCEX.h"
2020-09-25 19:51:08 +02:00
// Create a serial command parser for the USB connection,
// This supports JMRI or manual diagnostics and commands
// to be issued from the USB serial console.
DCCEXParser serialParser;
2020-09-12 00:27:46 +02:00
void setup()
{
2020-09-12 00:27:46 +02:00
// The main sketch has responsibilities during setup()
// Responsibility 1: Start the usb connection for diagnostics
2020-09-12 00:27:46 +02:00
// This is normally Serial but uses SerialUSB on a SAMD processor
Serial.begin(115200);
DIAG(F("DCC++ EX v%S"),F(VERSION));
CONDITIONAL_LCD_START {
// This block is ignored if LCD not in use
LCD(0,F("DCC++ EX v%S"),F(VERSION));
LCD(1,F("Starting"));
}
// Start the WiFi interface on a MEGA, Uno cannot currently handle WiFi
#if WIFI_ON
2021-02-13 18:20:45 +01:00
WifiInterface::setup(WIFI_SERIAL_LINK_SPEED, F(WIFI_SSID), F(WIFI_PASSWORD), F(WIFI_HOSTNAME), IP_PORT);
#endif // WIFI_ON
2020-09-12 00:27:46 +02:00
2020-10-30 14:00:02 +01:00
#if ETHERNET_ON
EthernetInterface::setup();
#endif // ETHERNET_ON
// Responsibility 3: Start the DCC engine.
// Note: this provides DCC with two motor drivers, main and prog, which handle the motor shield(s)
// Standard supported devices have pre-configured macros but custome hardware installations require
// detailed pin mappings and may also require modified subclasses of the MotorDriver to implement specialist logic.
// STANDARD_MOTOR_SHIELD, POLOLU_MOTOR_SHIELD, FIREBOX_MK1, FIREBOX_MK1S are pre defined in MotorShields.h
DCC::begin(MOTOR_SHIELD_TYPE);
2021-01-07 21:58:23 +01:00
#if defined(RMFT_ACTIVE)
RMFT::begin();
#endif
2021-01-07 21:58:23 +01:00
#if __has_include ( "mySetup.h")
#define SETUP(cmd) serialParser.parse(F(cmd))
#include "mySetup.h"
#undef SETUP
#endif
LCD(1,F("Ready"));
2020-09-12 00:27:46 +02:00
}
void loop()
{
2020-09-12 00:27:46 +02:00
// The main sketch has responsibilities during loop()
2020-09-12 00:27:46 +02:00
// Responsibility 1: Handle DCC background processes
// (loco reminders and power checks)
DCC::loop();
2020-09-12 00:27:46 +02:00
// Responsibility 2: handle any incoming commands on USB connection
serialParser.loop(Serial);
// Responsibility 3: Optionally handle any incoming WiFi traffic
#if WIFI_ON
2020-09-12 00:27:46 +02:00
WifiInterface::loop();
#endif
2020-10-30 14:00:02 +01:00
#if ETHERNET_ON
EthernetInterface::loop();
#endif
#if defined(RMFT_ACTIVE)
RMFT::loop();
#endif
LCDDisplay::loop(); // ignored if LCD not in use
// Optionally report any decrease in memory (will automatically trigger on first call)
#if ENABLE_FREE_MEM_WARNING
static int ramLowWatermark = 32767; // replaced on first loop
int freeNow = freeMemory();
if (freeNow < ramLowWatermark)
{
ramLowWatermark = freeNow;
LCD(2,F("Free RAM=%5db"), ramLowWatermark);
}
#endif
2020-09-12 00:27:46 +02:00
}