mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-26 17:46:14 +01:00
J command parsing
JA JR JT commands parsed EXRAIL sets hidden turnout state HIDDEN description macro Turnouts hidden flag bit UNO seems OK, MEGA UNTESTED
This commit is contained in:
parent
4c8b7f8517
commit
5846e0fe23
|
@ -37,6 +37,7 @@
|
||||||
#include "CommandDistributor.h"
|
#include "CommandDistributor.h"
|
||||||
#include "EEStore.h"
|
#include "EEStore.h"
|
||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
|
#include "EXRAIL2.h"
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -74,8 +75,10 @@ const int16_t HASH_KEYWORD_SPEED28 = -17064;
|
||||||
const int16_t HASH_KEYWORD_SPEED128 = 25816;
|
const int16_t HASH_KEYWORD_SPEED128 = 25816;
|
||||||
const int16_t HASH_KEYWORD_SERVO=27709;
|
const int16_t HASH_KEYWORD_SERVO=27709;
|
||||||
const int16_t HASH_KEYWORD_VPIN=-415;
|
const int16_t HASH_KEYWORD_VPIN=-415;
|
||||||
const int16_t HASH_KEYWORD_C=67;
|
const int16_t HASH_KEYWORD_A='A';
|
||||||
const int16_t HASH_KEYWORD_T=84;
|
const int16_t HASH_KEYWORD_C='C';
|
||||||
|
const int16_t HASH_KEYWORD_R='R';
|
||||||
|
const int16_t HASH_KEYWORD_T='T';
|
||||||
const int16_t HASH_KEYWORD_LCN = 15137;
|
const int16_t HASH_KEYWORD_LCN = 15137;
|
||||||
const int16_t HASH_KEYWORD_HAL = 10853;
|
const int16_t HASH_KEYWORD_HAL = 10853;
|
||||||
const int16_t HASH_KEYWORD_SHOW = -21309;
|
const int16_t HASH_KEYWORD_SHOW = -21309;
|
||||||
|
@ -509,6 +512,57 @@ void DCCEXParser::parse(Print *stream, byte *com, RingStream * ringStream)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'J' : // throttle info access
|
||||||
|
{
|
||||||
|
if ((params<1) | (params>2)) break; // <J>
|
||||||
|
int16_t id=(params==2)?p[1]:0;
|
||||||
|
switch(p[0]) {
|
||||||
|
case HASH_KEYWORD_A: // <JA> returns automations/routes
|
||||||
|
StringFormatter::send(stream, F("<jA"));
|
||||||
|
#ifdef EXRAIL_ACTIVE
|
||||||
|
if (params==1) sendFlashList(stream,RMFT2::routeIdList);
|
||||||
|
else StringFormatter::send(stream,F(" %d \"%S\""),
|
||||||
|
id, RMFT2::getRouteDescription(id));
|
||||||
|
#endif
|
||||||
|
StringFormatter::send(stream, F(">\n"));
|
||||||
|
return;
|
||||||
|
case HASH_KEYWORD_R: // <JR> returns rosters
|
||||||
|
StringFormatter::send(stream, F("<jR"));
|
||||||
|
#ifdef EXRAIL_ACTIVE
|
||||||
|
if (params==1) sendFlashList(stream,RMFT2::rosterIdList);
|
||||||
|
else StringFormatter::send(stream,F(" %d \"%S\" \"%S\""),
|
||||||
|
id, RMFT2::getRosterName(id), RMFT2::getRosterFunctions(id));
|
||||||
|
#endif
|
||||||
|
StringFormatter::send(stream, F(">\n"));
|
||||||
|
return;
|
||||||
|
case HASH_KEYWORD_T: // <JT> returns turnout list
|
||||||
|
StringFormatter::send(stream, F("<jT"));
|
||||||
|
if (params==1) { // <JT>
|
||||||
|
for ( Turnout * t=Turnout::first(); t; t=t->next()) {
|
||||||
|
if (t->isHidden()) continue;
|
||||||
|
StringFormatter::send(stream, F(" %c%d"),
|
||||||
|
t->isThrown()?'-':' ',t->getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { // <JT id>
|
||||||
|
Turnout * t=Turnout::get(id);
|
||||||
|
if (t && !t->isHidden())
|
||||||
|
StringFormatter::send(stream, F(" %d \"%S\""),
|
||||||
|
id,
|
||||||
|
#ifdef EXRAIL_ACTIVE
|
||||||
|
RMFT2::getTurnoutDescription(id)
|
||||||
|
#else
|
||||||
|
F("")
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
}
|
||||||
|
StringFormatter::send(stream, F(">\n"));
|
||||||
|
return;
|
||||||
|
default: break;
|
||||||
|
} // switch(p[1])
|
||||||
|
break; // case J
|
||||||
|
}
|
||||||
|
|
||||||
default: //anything else will diagnose and drop out to <X>
|
default: //anything else will diagnose and drop out to <X>
|
||||||
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++)
|
||||||
|
@ -521,6 +575,14 @@ void DCCEXParser::parse(Print *stream, byte *com, RingStream * ringStream)
|
||||||
StringFormatter::send(stream, F("<X>\n"));
|
StringFormatter::send(stream, F("<X>\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DCCEXParser::sendFlashList(Print * stream,const int16_t flashList[]) {
|
||||||
|
for (int16_t i=0;;i+=2) {
|
||||||
|
int16_t value=GETFLASHW(flashList+i);
|
||||||
|
if (value==0) return;
|
||||||
|
StringFormatter::send(stream,F(" %d"),value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool DCCEXParser::parseZ(Print *stream, int16_t params, int16_t p[])
|
bool DCCEXParser::parseZ(Print *stream, int16_t params, int16_t p[])
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ struct DCCEXParser
|
||||||
static FILTER_CALLBACK filterRMFTCallback;
|
static FILTER_CALLBACK filterRMFTCallback;
|
||||||
static AT_COMMAND_CALLBACK atCommandCallback;
|
static AT_COMMAND_CALLBACK atCommandCallback;
|
||||||
static void funcmap(int16_t cab, byte value, byte fstart, byte fstop);
|
static void funcmap(int16_t cab, byte value, byte fstart, byte fstop);
|
||||||
|
static void sendFlashList(Print * stream,const int16_t flashList[]);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
10
EXRAIL2.cpp
10
EXRAIL2.cpp
|
@ -196,7 +196,7 @@ int16_t LookList::find(int16_t value) {
|
||||||
VPIN id=operand;
|
VPIN id=operand;
|
||||||
int addr=GET_OPERAND(1);
|
int addr=GET_OPERAND(1);
|
||||||
byte subAddr=GET_OPERAND(2);
|
byte subAddr=GET_OPERAND(2);
|
||||||
DCCTurnout::create(id,addr,subAddr);
|
setTurnoutHiddenState(DCCTurnout::create(id,addr,subAddr));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -206,14 +206,14 @@ int16_t LookList::find(int16_t value) {
|
||||||
int activeAngle=GET_OPERAND(2);
|
int activeAngle=GET_OPERAND(2);
|
||||||
int inactiveAngle=GET_OPERAND(3);
|
int inactiveAngle=GET_OPERAND(3);
|
||||||
int profile=GET_OPERAND(4);
|
int profile=GET_OPERAND(4);
|
||||||
ServoTurnout::create(id,pin,activeAngle,inactiveAngle,profile);
|
setTurnoutHiddenState(ServoTurnout::create(id,pin,activeAngle,inactiveAngle,profile));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case OPCODE_PINTURNOUT: {
|
case OPCODE_PINTURNOUT: {
|
||||||
VPIN id=operand;
|
VPIN id=operand;
|
||||||
VPIN pin=GET_OPERAND(1);
|
VPIN pin=GET_OPERAND(1);
|
||||||
VpinTurnout::create(id,pin);
|
setTurnoutHiddenState(VpinTurnout::create(id,pin));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,6 +257,10 @@ int16_t LookList::find(int16_t value) {
|
||||||
new RMFT2(0); // add the startup route
|
new RMFT2(0); // add the startup route
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RMFT2::setTurnoutHiddenState(Turnout * t) {
|
||||||
|
t->setHidden(GETFLASH(getTurnoutDescription(t->getId()))==0x01);
|
||||||
|
}
|
||||||
|
|
||||||
// This filter intercepts <> commands to do the following:
|
// This filter intercepts <> commands to do the following:
|
||||||
// - Implement RMFT specific commands/diagnostics
|
// - Implement RMFT specific commands/diagnostics
|
||||||
// - Reject/modify JMRI commands that would interfere with RMFT processing
|
// - Reject/modify JMRI commands that would interfere with RMFT processing
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define EXRAIL2_H
|
#define EXRAIL2_H
|
||||||
#include "FSH.h"
|
#include "FSH.h"
|
||||||
#include "IODevice.h"
|
#include "IODevice.h"
|
||||||
|
#include "Turnouts.h"
|
||||||
|
|
||||||
// The following are the operation codes (or instructions) for a kind of virtual machine.
|
// The following are the operation codes (or instructions) for a kind of virtual machine.
|
||||||
// Each instruction is normally 3 bytes long with an operation code followed by a parameter.
|
// Each instruction is normally 3 bytes long with an operation code followed by a parameter.
|
||||||
|
@ -110,7 +111,7 @@ private:
|
||||||
static bool getFlag(VPIN id,byte mask);
|
static bool getFlag(VPIN id,byte mask);
|
||||||
static int16_t progtrackLocoId;
|
static int16_t progtrackLocoId;
|
||||||
static void doSignal(VPIN id,bool red, bool amber, bool green);
|
static void doSignal(VPIN id,bool red, bool amber, bool green);
|
||||||
|
static void setTurnoutHiddenState(Turnout * t);
|
||||||
static RMFT2 * loopTask;
|
static RMFT2 * loopTask;
|
||||||
static RMFT2 * pausingTask;
|
static RMFT2 * pausingTask;
|
||||||
void delayMe(long millisecs);
|
void delayMe(long millisecs);
|
||||||
|
|
|
@ -49,7 +49,11 @@
|
||||||
|
|
||||||
// CAUTION: The macros below are multiple passed over myAutomation.h
|
// CAUTION: The macros below are multiple passed over myAutomation.h
|
||||||
|
|
||||||
|
|
||||||
|
// helper macro for turnout descriptions, creates NULL for missing description
|
||||||
#define O_DESC(id, desc) case id: return ("" desc)[0]?F("" desc):NULL;
|
#define O_DESC(id, desc) case id: return ("" desc)[0]?F("" desc):NULL;
|
||||||
|
// helper macro for turnout description as HIDDEN
|
||||||
|
#define HIDDEN "\0x01"
|
||||||
|
|
||||||
// Pass 1 Implements aliases
|
// Pass 1 Implements aliases
|
||||||
#include "EXRAIL2MacroReset.h"
|
#include "EXRAIL2MacroReset.h"
|
||||||
|
|
12
Turnouts.h
12
Turnouts.h
|
@ -3,7 +3,7 @@
|
||||||
* © 2021 M Steve Todd
|
* © 2021 M Steve Todd
|
||||||
* © 2021 Fred Decker
|
* © 2021 Fred Decker
|
||||||
* © 2020-2021 Harald Barth
|
* © 2020-2021 Harald Barth
|
||||||
* © 2020-2021 Chris Harlow
|
* © 2020-2022 Chris Harlow
|
||||||
* © 2013-2016 Gregg E. Berman
|
* © 2013-2016 Gregg E. Berman
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -61,7 +61,8 @@ protected:
|
||||||
struct {
|
struct {
|
||||||
bool closed : 1;
|
bool closed : 1;
|
||||||
bool _rfu: 2;
|
bool _rfu: 2;
|
||||||
uint8_t turnoutType : 5;
|
bool hidden: 1;
|
||||||
|
uint8_t turnoutType : 4;
|
||||||
};
|
};
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
};
|
};
|
||||||
|
@ -83,6 +84,7 @@ protected:
|
||||||
_turnoutData.id = id;
|
_turnoutData.id = id;
|
||||||
_turnoutData.turnoutType = turnoutType;
|
_turnoutData.turnoutType = turnoutType;
|
||||||
_turnoutData.closed = closed;
|
_turnoutData.closed = closed;
|
||||||
|
_turnoutData.hidden=false;
|
||||||
add(this);
|
add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,11 +106,11 @@ protected:
|
||||||
* Static functions
|
* Static functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Turnout *get(uint16_t id);
|
|
||||||
|
|
||||||
static void add(Turnout *tt);
|
static void add(Turnout *tt);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static Turnout *get(uint16_t id);
|
||||||
/*
|
/*
|
||||||
* Static data
|
* Static data
|
||||||
*/
|
*/
|
||||||
|
@ -120,6 +122,8 @@ public:
|
||||||
*/
|
*/
|
||||||
inline bool isClosed() { return _turnoutData.closed; };
|
inline bool isClosed() { return _turnoutData.closed; };
|
||||||
inline bool isThrown() { return !_turnoutData.closed; }
|
inline bool isThrown() { return !_turnoutData.closed; }
|
||||||
|
inline bool isHidden() { return _turnoutData.hidden; }
|
||||||
|
inline void setHidden(bool h) { _turnoutData.hidden=h; }
|
||||||
inline bool isType(uint8_t type) { return _turnoutData.turnoutType == type; }
|
inline bool isType(uint8_t type) { return _turnoutData.turnoutType == type; }
|
||||||
inline uint16_t getId() { return _turnoutData.id; }
|
inline uint16_t getId() { return _turnoutData.id; }
|
||||||
inline Turnout *next() { return _nextTurnout; }
|
inline Turnout *next() { return _nextTurnout; }
|
||||||
|
@ -169,7 +173,7 @@ public:
|
||||||
#endif
|
#endif
|
||||||
static void printAll(Print *stream) {
|
static void printAll(Print *stream) {
|
||||||
for (Turnout *tt = _firstTurnout; tt != 0; tt = tt->_nextTurnout)
|
for (Turnout *tt = _firstTurnout; tt != 0; tt = tt->_nextTurnout)
|
||||||
StringFormatter::send(stream, F("<H %d %d>\n"),tt->getId(), tt->isThrown());
|
if (!tt->isHidden()) StringFormatter::send(stream, F("<H %d %d>\n"),tt->getId(), tt->isThrown());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user