diff --git a/CommandDistributor.cpp b/CommandDistributor.cpp index 4e5ecb9..9bde259 100644 --- a/CommandDistributor.cpp +++ b/CommandDistributor.cpp @@ -135,3 +135,8 @@ void CommandDistributor::broadcastPower() { LCD(2,F("Power %S%S"),state=='1'?F("On"):F("Off"),reason); broadcast(true); } + +void CommandDistributor::broadcastText(const FSH * msg) { + StringFormatter::send(broadcastBufferWriter,F("%S"),msg); + broadcast(false); +} diff --git a/CommandDistributor.h b/CommandDistributor.h index 51458fa..a9af3bb 100644 --- a/CommandDistributor.h +++ b/CommandDistributor.h @@ -32,6 +32,7 @@ public : static void broadcastSensor(int16_t id, bool value); static void broadcastTurnout(int16_t id, bool isClosed); static void broadcastPower(); + static void broadcastText(const FSH * msg); static void forget(byte clientId); private: static void broadcast(bool includeWithrottleClients); diff --git a/DCCEX.h b/DCCEX.h index 00d89de..d60edfa 100644 --- a/DCCEX.h +++ b/DCCEX.h @@ -43,7 +43,7 @@ #include "Turnouts.h" #include "Sensors.h" #include "Outputs.h" -#include "EXRAIL.h" #include "CommandDistributor.h" +#include "EXRAIL.h" #endif diff --git a/EXRAIL2.cpp b/EXRAIL2.cpp index 737cef6..127a1ab 100644 --- a/EXRAIL2.cpp +++ b/EXRAIL2.cpp @@ -794,6 +794,12 @@ void RMFT2::loop2() { DCC::setProgTrackSyncMain(true); CommandDistributor::broadcastPower(); break; + + case OPCODE_POWERON: + DCCWaveform::mainTrack.setPowerMode(POWERMODE::ON); + DCC::setProgTrackSyncMain(false); + CommandDistributor::broadcastPower(); + break; case OPCODE_UNJOIN: DCC::setProgTrackSyncMain(false); diff --git a/EXRAIL2.h b/EXRAIL2.h index b44ada6..3114511 100644 --- a/EXRAIL2.h +++ b/EXRAIL2.h @@ -44,7 +44,7 @@ enum OPCODE : byte {OPCODE_THROW,OPCODE_CLOSE, OPCODE_PAD,OPCODE_FOLLOW,OPCODE_CALL,OPCODE_RETURN, OPCODE_JOIN,OPCODE_UNJOIN,OPCODE_READ_LOCO1,OPCODE_READ_LOCO2,OPCODE_POM, OPCODE_START,OPCODE_SETLOCO,OPCODE_SENDLOCO, - OPCODE_PAUSE, OPCODE_RESUME,OPCODE_POWEROFF, + OPCODE_PAUSE, OPCODE_RESUME,OPCODE_POWEROFF,OPCODE_POWERON, OPCODE_ONCLOSE, OPCODE_ONTHROW, OPCODE_SERVOTURNOUT, OPCODE_PINTURNOUT, OPCODE_PRINT,OPCODE_DCCACTIVATE, OPCODE_ONACTIVATE,OPCODE_ONDEACTIVATE,OPCODE_IFGTE,OPCODE_IFLT, diff --git a/EXRAIL2MacroReset.h b/EXRAIL2MacroReset.h index 852eb70..6a28b7f 100644 --- a/EXRAIL2MacroReset.h +++ b/EXRAIL2MacroReset.h @@ -32,6 +32,7 @@ #undef ATTIMEOUT #undef AUTOMATION #undef AUTOSTART +#undef BROADCAST #undef CALL #undef CLOSE #undef DEACTIVATE @@ -79,6 +80,7 @@ #undef PRINT #undef POM #undef POWEROFF +#undef POWERON #undef READ_LOCO #undef RED #undef RESERVE @@ -121,6 +123,7 @@ #define ATTIMEOUT(sensor_id,timeout_ms) #define AUTOMATION(id, description) #define AUTOSTART +#define BROADCAST(msg) #define CALL(route) #define CLOSE(id) #define DEACTIVATE(addr,subaddr) @@ -168,6 +171,7 @@ #define PRINT(msg) #define POM(cv,value) #define POWEROFF +#define POWERON #define READ_LOCO #define RED(signal_id) #define RESERVE(blockid) diff --git a/EXRAILMacros.h b/EXRAILMacros.h index 7efb445..aa8c971 100644 --- a/EXRAILMacros.h +++ b/EXRAILMacros.h @@ -69,6 +69,8 @@ void RMFT2::emitWithrottleDescriptions(Print * stream) { // Pass 3... Create Text sending functions #include "EXRAIL2MacroReset.h" const int StringMacroTracker1=__COUNTER__; +#undef BROADCAST +#define BROADCAST(msg) case (__COUNTER__ - StringMacroTracker1) : CommandDistributor::broadcastText(F(msg));break; #undef PRINT #define PRINT(msg) case (__COUNTER__ - StringMacroTracker1) : printMessage2(F(msg));break; #undef LCN @@ -170,6 +172,7 @@ const FLASH int16_t RMFT2::SignalDefinitions[] = { #define ATTIMEOUT(sensor_id,timeout) OPCODE_ATTIMEOUT1,0,0,OPCODE_ATTIMEOUT2,V(sensor_id),OPCODE_PAD,V(timeout/100L), #define AUTOMATION(id, description) OPCODE_AUTOMATION, V(id), #define AUTOSTART OPCODE_AUTOSTART,0,0, +#define BROADCAST(msg) PRINT(msg) #define CALL(route) OPCODE_CALL,V(route), #define CLOSE(id) OPCODE_CLOSE,V(id), #define DEACTIVATE(addr,subaddr) OPCODE_DCCACTIVATE,V(addr<<3 | subaddr<<1), @@ -216,6 +219,7 @@ const FLASH int16_t RMFT2::SignalDefinitions[] = { #define PIN_TURNOUT(id,pin,description...) OPCODE_PINTURNOUT,V(id),OPCODE_PAD,V(pin), #define POM(cv,value) OPCODE_POM,V(cv),OPCODE_PAD,V(value), #define POWEROFF OPCODE_POWEROFF,0,0, +#define POWERON OPCODE_POWERON,0,0, #define PRINT(msg) OPCODE_PRINT,V(__COUNTER__ - StringMacroTracker2), #define READ_LOCO OPCODE_READ_LOCO1,0,0,OPCODE_READ_LOCO2,0,0, #define RED(signal_id) OPCODE_RED,V(signal_id), diff --git a/WiThrottle.cpp b/WiThrottle.cpp index 312cf93..d91745c 100644 --- a/WiThrottle.cpp +++ b/WiThrottle.cpp @@ -514,25 +514,32 @@ char WiThrottle::stashThrottleChar; void WiThrottle::getLocoCallback(int16_t locoid) { stashStream->mark(stashClient); - if (locoid<=0) + if (locoid<=0) { StringFormatter::send(stashStream,F("HMNo loco found on prog track\n")); - else { - // short or long - char addrchar; - if (locoid & LONG_ADDR_MARKER) { // long addr - locoid = locoid ^ LONG_ADDR_MARKER; - addrchar = 'L'; - } else - addrchar = 'S'; - if (addrchar == 'L' && locoid <= HIGHEST_SHORT_ADDR ) - StringFormatter::send(stashStream,F("HMLong addr %d <= %d not supported\n"), locoid,HIGHEST_SHORT_ADDR); - else { - char addcmd[20]={'M',stashThrottleChar,'+', addrchar}; - itoa(locoid,addcmd+4,10); - stashInstance->multithrottle(stashStream, (byte *)addcmd); - DCCWaveform::progTrack.setPowerMode(POWERMODE::ON); - DCC::setProgTrackSyncMain(true); // <1 JOIN> so we can drive loco away - } + stashStream->commit(); // done here, commit and return + return; } + + // short or long + char addrchar; + if (locoid & LONG_ADDR_MARKER) { // maker bit indicates long addr + locoid = locoid ^ LONG_ADDR_MARKER; // remove marker bit to get real long addr + if (locoid <= HIGHEST_SHORT_ADDR ) { // out of range for long addr + StringFormatter::send(stashStream,F("HMLong addr %d <= %d unsupported\n"), locoid, HIGHEST_SHORT_ADDR); + stashStream->commit(); // done here, commit and return + return; + } + addrchar = 'L'; + } else { + addrchar = 'S'; + } + + char addcmd[20]={'M',stashThrottleChar,'+', addrchar}; + itoa(locoid,addcmd+4,10); + stashInstance->multithrottle(stashStream, (byte *)addcmd); + DCCWaveform::progTrack.setPowerMode(POWERMODE::ON); + DCC::setProgTrackSyncMain(true); // <1 JOIN> so we can drive loco away stashStream->commit(); + CommandDistributor::broadcastPower(); + } diff --git a/version.h b/version.h index 6a4c485..2889212 100644 --- a/version.h +++ b/version.h @@ -3,7 +3,9 @@ #include "StringFormatter.h" -#define VERSION "4.0.0" +#define VERSION "4.0.1" +// 4.0.1 EXRAIL BROADCAST("msg") +// EXRAIL POWERON // 4.0.0 Major functional and non-functional changes. // Engine Driver "DriveAway" feature enhancement //.......JMRI feature enhancement. Provides for multiple additional DCC++EX wifi