mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-02-16 22:19:14 +01:00
TM Broadcasts
TM changes will trigger TM state broadcasts
This commit is contained in:
parent
4f23dbc984
commit
bec8aea5a5
1
.gitignore
vendored
1
.gitignore
vendored
@ -19,3 +19,4 @@ my*.h
|
|||||||
!my*.example.h
|
!my*.example.h
|
||||||
.vscode/extensions.json
|
.vscode/extensions.json
|
||||||
.vscode/extensions.json
|
.vscode/extensions.json
|
||||||
|
compile_commands.json
|
||||||
|
@ -233,3 +233,7 @@ void CommandDistributor::broadcastText(const FSH * msg) {
|
|||||||
broadcastReply(WITHROTTLE_TYPE, F("Hm%S\n"), msg);
|
broadcastReply(WITHROTTLE_TYPE, F("Hm%S\n"), msg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CommandDistributor::broadcastTrackState(FSH* format,byte trackLetter,int16_t dcAddr) {
|
||||||
|
broadcastReply(COMMAND_TYPE, format,trackLetter,dcAddr);
|
||||||
|
}
|
||||||
|
@ -51,6 +51,7 @@ public :
|
|||||||
static int16_t retClockTime();
|
static int16_t retClockTime();
|
||||||
static void broadcastPower();
|
static void broadcastPower();
|
||||||
static void broadcastText(const FSH * msg);
|
static void broadcastText(const FSH * msg);
|
||||||
|
static void broadcastTrackState(FSH* format,byte trackLetter,int16_t dcAddr);
|
||||||
template<typename... Targs> static void broadcastReply(clientType type, Targs... msg);
|
template<typename... Targs> static void broadcastReply(clientType type, Targs... msg);
|
||||||
static void forget(byte clientId);
|
static void forget(byte clientId);
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "MotorDriver.h"
|
#include "MotorDriver.h"
|
||||||
#include "DCCTimer.h"
|
#include "DCCTimer.h"
|
||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
|
#include"CommandDistributor.h"
|
||||||
// Virtualised Motor shield multi-track hardware Interface
|
// Virtualised Motor shield multi-track hardware Interface
|
||||||
#define FOR_EACH_TRACK(t) for (byte t=0;t<=lastTrack;t++)
|
#define FOR_EACH_TRACK(t) for (byte t=0;t<=lastTrack;t++)
|
||||||
|
|
||||||
@ -203,6 +204,7 @@ bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr
|
|||||||
track[t]->setPower(POWERMODE::OFF);
|
track[t]->setPower(POWERMODE::OFF);
|
||||||
trackMode[t]=TRACK_MODE_OFF;
|
trackMode[t]=TRACK_MODE_OFF;
|
||||||
track[t]->makeProgTrack(false); // revoke prog track special handling
|
track[t]->makeProgTrack(false); // revoke prog track special handling
|
||||||
|
streamTrackState(NULL,t);
|
||||||
}
|
}
|
||||||
track[trackToSet]->makeProgTrack(true); // set for prog track special handling
|
track[trackToSet]->makeProgTrack(true); // set for prog track special handling
|
||||||
} else {
|
} else {
|
||||||
@ -210,7 +212,8 @@ bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr
|
|||||||
}
|
}
|
||||||
trackMode[trackToSet]=mode;
|
trackMode[trackToSet]=mode;
|
||||||
trackDCAddr[trackToSet]=dcAddr;
|
trackDCAddr[trackToSet]=dcAddr;
|
||||||
|
streamTrackState(NULL,trackToSet);
|
||||||
|
|
||||||
// When a track is switched, we must clear any side effects of its previous
|
// When a track is switched, we must clear any side effects of its previous
|
||||||
// state, otherwise trains run away or just dont move.
|
// state, otherwise trains run away or just dont move.
|
||||||
|
|
||||||
@ -290,36 +293,7 @@ bool TrackManager::parseJ(Print *stream, int16_t params, int16_t p[])
|
|||||||
|
|
||||||
if (params==0) { // <=> List track assignments
|
if (params==0) { // <=> List track assignments
|
||||||
FOR_EACH_TRACK(t)
|
FOR_EACH_TRACK(t)
|
||||||
if (track[t]!=NULL) {
|
streamTrackState(stream,t);
|
||||||
StringFormatter::send(stream,F("<= %c "),'A'+t);
|
|
||||||
switch(trackMode[t]) {
|
|
||||||
case TRACK_MODE_MAIN:
|
|
||||||
StringFormatter::send(stream,F("MAIN"));
|
|
||||||
if (track[t]->trackPWM)
|
|
||||||
StringFormatter::send(stream,F("+"));
|
|
||||||
break;
|
|
||||||
case TRACK_MODE_PROG:
|
|
||||||
StringFormatter::send(stream,F("PROG"));
|
|
||||||
if (track[t]->trackPWM)
|
|
||||||
StringFormatter::send(stream,F("+"));
|
|
||||||
break;
|
|
||||||
case TRACK_MODE_OFF:
|
|
||||||
StringFormatter::send(stream,F("OFF"));
|
|
||||||
break;
|
|
||||||
case TRACK_MODE_EXT:
|
|
||||||
StringFormatter::send(stream,F("EXT"));
|
|
||||||
break;
|
|
||||||
case TRACK_MODE_DC:
|
|
||||||
StringFormatter::send(stream,F("DC %d"),trackDCAddr[t]);
|
|
||||||
break;
|
|
||||||
case TRACK_MODE_DCX:
|
|
||||||
StringFormatter::send(stream,F("DCX %d"),trackDCAddr[t]);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break; // unknown, dont care
|
|
||||||
}
|
|
||||||
StringFormatter::send(stream,F(">\n"));
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,6 +323,36 @@ bool TrackManager::parseJ(Print *stream, int16_t params, int16_t p[])
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TrackManager::streamTrackState(Print* stream, byte t) {
|
||||||
|
// null stream means send to commandDistributor for broadcast
|
||||||
|
if (track[t]==NULL) return;
|
||||||
|
auto format=F("");
|
||||||
|
switch(trackMode[t]) {
|
||||||
|
case TRACK_MODE_MAIN:
|
||||||
|
format=F("<= %c MAIN>\n");
|
||||||
|
break;
|
||||||
|
case TRACK_MODE_PROG:
|
||||||
|
format=F("<= %c PROG>\n");
|
||||||
|
break;
|
||||||
|
case TRACK_MODE_OFF:
|
||||||
|
format=F("<= %c OFF>\n");
|
||||||
|
break;
|
||||||
|
case TRACK_MODE_EXT:
|
||||||
|
format=F("<= %c EXT>\n");
|
||||||
|
break;
|
||||||
|
case TRACK_MODE_DC:
|
||||||
|
format=F("<= %c DC %d>\n");
|
||||||
|
break;
|
||||||
|
case TRACK_MODE_DCX:
|
||||||
|
format=F("<= %c DCX %d>\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break; // unknown, dont care
|
||||||
|
}
|
||||||
|
if (stream) StringFormatter::send(stream,format,'A'+t,trackDCAddr[t]);
|
||||||
|
else CommandDistributor::broadcastTrackState(format,'A'+t,trackDCAddr[t]);
|
||||||
|
}
|
||||||
|
|
||||||
byte TrackManager::nextCycleTrack=MAX_TRACKS;
|
byte TrackManager::nextCycleTrack=MAX_TRACKS;
|
||||||
|
|
||||||
void TrackManager::loop() {
|
void TrackManager::loop() {
|
||||||
|
@ -80,6 +80,8 @@ class TrackManager {
|
|||||||
static void reportGauges(Print* stream);
|
static void reportGauges(Print* stream);
|
||||||
static void reportCurrent(Print* stream);
|
static void reportCurrent(Print* stream);
|
||||||
static void reportObsoleteCurrent(Print* stream);
|
static void reportObsoleteCurrent(Print* stream);
|
||||||
|
static void streamTrackState(Print* stream, byte t);
|
||||||
|
|
||||||
static int16_t joinRelay;
|
static int16_t joinRelay;
|
||||||
static bool progTrackSyncMain; // true when prog track is a siding switched to main
|
static bool progTrackSyncMain; // true when prog track is a siding switched to main
|
||||||
static bool progTrackBoosted; // true when prog track is not current limited
|
static bool progTrackBoosted; // true when prog track is not current limited
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
#include "StringFormatter.h"
|
#include "StringFormatter.h"
|
||||||
|
|
||||||
|
|
||||||
#define VERSION "4.2.21"
|
#define VERSION "4.2.22"
|
||||||
|
// 4.2.22 - Implement broadcast of Track Manager changes
|
||||||
// 4.2.21 - Implement non-blocking I2C for EX-IOExpander device driver
|
// 4.2.21 - Implement non-blocking I2C for EX-IOExpander device driver
|
||||||
// 4.2.20 - <JG> & <JI> commands for multi-track gauges
|
// 4.2.20 - <JG> & <JI> commands for multi-track gauges
|
||||||
// - Reinstate <c> but remember its a bit useless when TM involved.
|
// - Reinstate <c> but remember its a bit useless when TM involved.
|
||||||
|
Loading…
Reference in New Issue
Block a user