mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-04-02 19:50:13 +02:00
zzpase Track Manager
This commit is contained in:
parent
2b82e65978
commit
16f13d9aee
@ -452,5 +452,25 @@ ZZ(J,P,id) auto tto=Turntable::get(id);
|
|||||||
REPLY("<jP %d %d %d \"%S\">\n", id, p, tto->getPositionAngle(p), tpdesc)
|
REPLY("<jP %d %d %d \"%S\">\n", id, p, tto->getPositionAngle(p), tpdesc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Track manager
|
||||||
|
ZZ(=) TrackManager::list(stream);
|
||||||
|
ZZ(=,track,MAIN) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN))
|
||||||
|
ZZ(=,track,MAIN_INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN_INV))
|
||||||
|
ZZ(=,track,MAIN_AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_MAIN_AUTO))
|
||||||
|
ZZ(=,track,PROG) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_PROG))
|
||||||
|
ZZ(=,track,OFF) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_NONE))
|
||||||
|
ZZ(=,track,NONE) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_NONE))
|
||||||
|
ZZ(=,track,EXT) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_EXT))
|
||||||
|
|
||||||
|
#ifdef BOOSTER_INPUT
|
||||||
|
ZZ(=,track,BOOST) CHECK(TRACK_MODE_BOOST) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST))
|
||||||
|
ZZ(=,track,BOOST_INV) CHECK(TRACK_MODE_BOOST_INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST_INV))
|
||||||
|
ZZ(=,track,BOOST_AUTO) CHECK(TRACK_MODE_BOOST_AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track,TRACK_MODE_BOOST_AUTO))
|
||||||
|
#endif
|
||||||
|
ZZ(=,track,AUTO) CHECK(track>='A' && track<='H') CHECK(TrackManager::orTrackMode(track, TRACK_MODIFIER_AUTO))
|
||||||
|
ZZ(=,track,INV) CHECK(track>='A' && track<='H') CHECK(TrackManager::orTrackMode(track, TRACK_MODIFIER_INV))
|
||||||
|
ZZ(=,track,DC,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC, locoid))
|
||||||
|
ZZ(=,track,DC_INV,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC_INV, locoid))
|
||||||
|
ZZ(=,track,DCX,locoid) CHECK(track>='A' && track<='H') CHECK(TrackManager::setTrackMode(track, TRACK_MODE_DC_INV, locoid))
|
||||||
|
|
||||||
ZZEND
|
ZZEND
|
||||||
|
@ -323,10 +323,6 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
filterCamParserCallback(stream, opcode, params, p);
|
filterCamParserCallback(stream, opcode, params, p);
|
||||||
if (opcode=='\0') return; // filterCallback asked us to ignore
|
if (opcode=='\0') return; // filterCallback asked us to ignore
|
||||||
|
|
||||||
// todo, revamp as filter
|
|
||||||
if (opcode=='=') // TRACK MANAGER CONTROL <= [params]>
|
|
||||||
if (TrackManager::parseEqualSign(stream, params, p))
|
|
||||||
return;
|
|
||||||
|
|
||||||
matchedCommandFormat = F("none");
|
matchedCommandFormat = F("none");
|
||||||
checkFailedFormat = matchedCommandFormat;
|
checkFailedFormat = matchedCommandFormat;
|
||||||
@ -334,7 +330,7 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
|
|
||||||
// TODO magnificent diagnostics
|
// TODO magnificent diagnostics
|
||||||
StringFormatter::send(stream, F("<X>\n"));
|
StringFormatter::send(stream, F("<X>\n"));
|
||||||
DIAG(F("Command format <%<> failed CHECK(%S)\n"), matchedCommandFormat, checkFailedFormat);
|
DIAG(F("Command format <%<> failed CHECK(%S)"), matchedCommandFormat, checkFailedFormat);
|
||||||
if (opcode >= ' ' && opcode <= '~') {
|
if (opcode >= ' ' && opcode <= '~') {
|
||||||
DIAG(F("Opcode=%c params=%d"), opcode, params);
|
DIAG(F("Opcode=%c params=%d"), opcode, params);
|
||||||
for (int i = 0; i < params; i++)
|
for (int i = 0; i < params; i++)
|
||||||
|
@ -198,7 +198,12 @@ void TrackManager::setDCSignal(int16_t cab, byte speedbyte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool TrackManager::orTrackMode(byte trackToSet, TRACK_MODE mode) {
|
||||||
|
setTrackMode(trackToSet, track[trackToSet]->getMode() | mode);
|
||||||
|
}
|
||||||
|
|
||||||
bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr) {
|
bool TrackManager::setTrackMode(byte trackToSet, TRACK_MODE mode, int16_t dcAddr) {
|
||||||
|
if (trackToSet>='A' && trackToSet<='H') trackToSet-='A';
|
||||||
if (trackToSet>lastTrack || track[trackToSet]==NULL) return false;
|
if (trackToSet>lastTrack || track[trackToSet]==NULL) return false;
|
||||||
|
|
||||||
// Remember track mode we came from for later
|
// Remember track mode we came from for later
|
||||||
@ -386,63 +391,12 @@ void TrackManager::applyDCSpeed(byte t) {
|
|||||||
DCC::getThrottleFrequency(trackDCAddr[t]));
|
DCC::getThrottleFrequency(trackDCAddr[t]));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TrackManager::parseEqualSign(Print *stream, int16_t params, int16_t p[])
|
bool TrackManager::list(Print *stream)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (params==0) { // <=> List track assignments
|
|
||||||
FOR_EACH_TRACK(t)
|
FOR_EACH_TRACK(t)
|
||||||
streamTrackState(stream,t);
|
streamTrackState(stream,t);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
p[0]-="A"_hk; // convert A... to 0....
|
|
||||||
|
|
||||||
if (params>1 && (p[0]<0 || p[0]>=MAX_TRACKS))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (params==2 && p[1]=="MAIN"_hk) // <= id MAIN>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_MAIN);
|
|
||||||
if (params==2 && p[1]=="MAIN_INV"_hk) // <= id MAIN_INV>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_MAIN_INV);
|
|
||||||
if (params==2 && p[1]=="MAIN_AUTO"_hk) // <= id MAIN_AUTO>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_MAIN_AUTO);
|
|
||||||
|
|
||||||
#ifndef DISABLE_PROG
|
|
||||||
if (params==2 && p[1]=="PROG"_hk) // <= id PROG>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_PROG);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (params==2 && (p[1]=="OFF"_hk || p[1]=="NONE"_hk)) // <= id OFF> <= id NONE>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_NONE);
|
|
||||||
|
|
||||||
if (params==2 && p[1]=="EXT"_hk) // <= id EXT>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_EXT);
|
|
||||||
#ifdef BOOSTER_INPUT
|
|
||||||
if (TRACK_MODE_BOOST != 0 && // compile time optimization
|
|
||||||
params==2 && p[1]=="BOOST"_hk) // <= id BOOST>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_BOOST);
|
|
||||||
if (TRACK_MODE_BOOST_INV != 0 && // compile time optimization
|
|
||||||
params==2 && p[1]=="BOOST_INV"_hk) // <= id BOOST_INV>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_BOOST_INV);
|
|
||||||
if (TRACK_MODE_BOOST_AUTO != 0 && // compile time optimization
|
|
||||||
params==2 && p[1]=="BOOST_AUTO"_hk) // <= id BOOST_AUTO>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_BOOST_AUTO);
|
|
||||||
#endif
|
|
||||||
if (params==2 && p[1]=="AUTO"_hk) // <= id AUTO>
|
|
||||||
return setTrackMode(p[0], track[p[0]]->getMode() | TRACK_MODIFIER_AUTO);
|
|
||||||
|
|
||||||
if (params==2 && p[1]=="INV"_hk) // <= id INV>
|
|
||||||
return setTrackMode(p[0], track[p[0]]->getMode() | TRACK_MODIFIER_INV);
|
|
||||||
|
|
||||||
if (params==3 && p[1]=="DC"_hk && p[2]>0) // <= id DC cab>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_DC,p[2]);
|
|
||||||
|
|
||||||
if (params==3 && (p[1]=="DC_INV"_hk || // <= id DC_INV cab>
|
|
||||||
p[1]=="DCX"_hk) && p[2]>0) // <= id DCX cab>
|
|
||||||
return setTrackMode(p[0],TRACK_MODE_DC_INV,p[2]);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const FSH* TrackManager::getModeName(TRACK_MODE tm) {
|
const FSH* TrackManager::getModeName(TRACK_MODE tm) {
|
||||||
|
@ -74,7 +74,8 @@ class TrackManager {
|
|||||||
|
|
||||||
static const int16_t MAX_TRACKS=8;
|
static const int16_t MAX_TRACKS=8;
|
||||||
static bool setTrackMode(byte track, TRACK_MODE mode, int16_t DCaddr=0);
|
static bool setTrackMode(byte track, TRACK_MODE mode, int16_t DCaddr=0);
|
||||||
static bool parseEqualSign(Print * stream, int16_t params, int16_t p[]);
|
static bool orTrackMode(byte track, TRACK_MODE mode);
|
||||||
|
static bool list(Print * stream);
|
||||||
static void loop();
|
static void loop();
|
||||||
static POWERMODE getMainPower();
|
static POWERMODE getMainPower();
|
||||||
static POWERMODE getProgPower();
|
static POWERMODE getProgPower();
|
||||||
|
Loading…
Reference in New Issue
Block a user