1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-26 17:46:14 +01:00

Move call to mySetup into IODevice::begin().

Ensure that HAL devices are created before use by moving the call to mySetup into IODevice::begin().  The need for this became evident when it was noted that RMFT (EX-RAIL) interacts with HAL devices during its initialisation, by enabling pull-ups on digital inputs.
Any
This commit is contained in:
Neil McKechnie 2021-11-12 00:05:16 +00:00
parent 58fe81bf06
commit b384d6c14d
3 changed files with 38 additions and 74 deletions

View File

@ -88,16 +88,9 @@ void setup()
// Start RMFT (ignored if no automnation) // Start RMFT (ignored if no automnation)
RMFT::begin(); RMFT::begin();
// Link to and call mySetup() function (if defined in the build in mySetup.cpp).
// The contents will depend on the user's system hardware configuration.
// The mySetup.cpp file is a standard C++ module so has access to all of the DCC++EX APIs.
extern __attribute__((weak)) void mySetup();
if (mySetup) {
mySetup();
}
// Invoke any DCC++EX commands in the form "SETUP("xxxx");"" found in optional file mySetup.h. // Invoke any DCC++EX commands in the form "SETUP("xxxx");"" found in optional file mySetup.h.
// This can be used to create turnouts, outputs, sensors etc. throught the normal text commands. // This can be used to create turnouts, outputs, sensors etc. through the normal text commands.
#if __has_include ( "mySetup.h") #if __has_include ( "mySetup.h")
#define SETUP(cmd) serialParser.parse(F(cmd)) #define SETUP(cmd) serialParser.parse(F(cmd))
#include "mySetup.h" #include "mySetup.h"

View File

@ -28,6 +28,9 @@
#define USE_FAST_IO #define USE_FAST_IO
#endif #endif
// Link to mySetup function. If not defined, the function reference will be NULL.
extern __attribute__((weak)) void mySetup();
//================================================================================================================== //==================================================================================================================
// Static methods // Static methods
//------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------
@ -57,6 +60,13 @@ void IODevice::begin() {
dev->_begin(); dev->_begin();
} }
_initPhase = false; _initPhase = false;
// Call user's mySetup() function (if defined in the build in mySetup.cpp).
// The contents will depend on the user's system hardware configuration.
// The mySetup.cpp file is a standard C++ module so has access to all of the DCC++EX APIs.
if (mySetup) {
mySetup();
}
} }
// Overarching static loop() method for the IODevice subsystem. Works through the // Overarching static loop() method for the IODevice subsystem. Works through the
@ -148,6 +158,33 @@ void IODevice::_display() {
bool IODevice::configure(VPIN vpin, ConfigTypeEnum configType, int paramCount, int params[]) { bool IODevice::configure(VPIN vpin, ConfigTypeEnum configType, int paramCount, int params[]) {
IODevice *dev = findDevice(vpin); IODevice *dev = findDevice(vpin);
if (dev) return dev->_configure(vpin, configType, paramCount, params); if (dev) return dev->_configure(vpin, configType, paramCount, params);
#ifdef DIAG_IO
DIAG(F("IODevice::configure(): Vpin ID %d not found!"), (int)vpin);
#endif
return false;
}
// Read value from virtual pin.
int IODevice::read(VPIN vpin) {
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
if (dev->owns(vpin))
return dev->_read(vpin);
}
#ifdef DIAG_IO
DIAG(F("IODevice::read(): Vpin %d not found!"), (int)vpin);
#endif
return false;
}
// Read analogue value from virtual pin.
int IODevice::readAnalogue(VPIN vpin) {
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
if (dev->owns(vpin))
return dev->_readAnalogue(vpin);
}
#ifdef DIAG_IO
DIAG(F("IODevice::readAnalogue(): Vpin %d not found!"), (int)vpin);
#endif
return false; return false;
} }
@ -258,30 +295,6 @@ bool IODevice::owns(VPIN id) {
return (id >= _firstVpin && id < _firstVpin + _nPins); return (id >= _firstVpin && id < _firstVpin + _nPins);
} }
// Read value from virtual pin.
int IODevice::read(VPIN vpin) {
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
if (dev->owns(vpin))
return dev->_read(vpin);
}
#ifdef DIAG_IO
DIAG(F("IODevice::read(): Vpin %d not found!"), (int)vpin);
#endif
return false;
}
// Read analogue value from virtual pin.
int IODevice::readAnalogue(VPIN vpin) {
for (IODevice *dev = _firstDevice; dev != 0; dev = dev->_nextDevice) {
if (dev->owns(vpin))
return dev->_readAnalogue(vpin);
}
#ifdef DIAG_IO
DIAG(F("IODevice::readAnalogue(): Vpin %d not found!"), (int)vpin);
#endif
return false;
}
#else // !defined(IO_NO_HAL) #else // !defined(IO_NO_HAL)

View File

@ -10,8 +10,6 @@
// //
#include "IODevice.h" #include "IODevice.h"
#include "Turnouts.h"
#include "Sensors.h"
#include "IO_HCSR04.h" #include "IO_HCSR04.h"
#include "IO_VL53L0X.h" #include "IO_VL53L0X.h"
@ -139,46 +137,6 @@ void mySetup() {
//MCP23017::create(196, 16, 0x22); //MCP23017::create(196, 16, 0x22);
//=======================================================================
// Creating a Turnout
//=======================================================================
// Parameters: same as <T> command for Servo turnouts
// ID and VPIN are 100, sonar moves between positions 102 and 490 with slow profile.
// Profile may be Instant, Fast, Medium, Slow or Bounce.
//ServoTurnout::create(100, 100, 490, 102, PCA9685::Slow);
//=======================================================================
// DCC Accessory turnout
//=======================================================================
// Parameters: same as <T> command for DCC Accessory turnouts
// ID=3000
// Decoder address=23
// Decoder subaddress = 1
//DCCTurnout::create(3000, 23, 1);
//=======================================================================
// Creating a Sensor
//=======================================================================
// Parameters: As for the <S> command,
// id = 164,
// Vpin = 164 (configured above as pin 0 of an MCP23017)
// Pullup enable = 1 (enabled)
//Sensor::create(164, 164, 1);
//=======================================================================
// Way of creating lots of identical sensors in a range
//=======================================================================
//for (int i=165; i<180; i++)
// Sensor::create(i, i, 1);
//======================================================================= //=======================================================================
// Play mp3 files from a Micro-SD card, using a DFPlayer MP3 Module. // Play mp3 files from a Micro-SD card, using a DFPlayer MP3 Module.
//======================================================================= //=======================================================================