mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-12-24 13:21:23 +01:00
<A> to EXRAIL DCCX_SIGNAL intercept
This commit is contained in:
parent
8705c8c33f
commit
5742b71ec6
@ -390,6 +390,12 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
|
|||||||
if (params!=2) break;
|
if (params!=2) break;
|
||||||
if (p[0] != (p[0] & 0x7F)) break;
|
if (p[0] != (p[0] & 0x7F)) break;
|
||||||
if (p[1] != (p[1] & 0x1F)) break;
|
if (p[1] != (p[1] & 0x1F)) break;
|
||||||
|
#ifdef EXRAIL_ACTIVE
|
||||||
|
// Ask exrail if this is just changing the aspect on a
|
||||||
|
// predefined DCCX_SIGNAL. Because this will handle all
|
||||||
|
// the IFRED and ONRED type issues at the same time.
|
||||||
|
if (RMFT2::signalAspectEvent(p[0],p[1])) return;
|
||||||
|
#endif
|
||||||
DCC::setExtendedAccessory(p[0],p[1],3);
|
DCC::setExtendedAccessory(p[0],p[1],3);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
32
EXRAIL2.cpp
32
EXRAIL2.cpp
@ -1146,6 +1146,38 @@ int16_t RMFT2::getSignalSlot(int16_t id) {
|
|||||||
return (flags[sigslot] & SIGNAL_MASK) == rag;
|
return (flags[sigslot] & SIGNAL_MASK) == rag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// signalAspectEvent returns true if the aspect is destined
|
||||||
|
// for a defined DCCX_SIGNAL which will handle all the RAG flags
|
||||||
|
// and ON* handlers.
|
||||||
|
// Otherwise false so the parser should send the command directly
|
||||||
|
bool RMFT2::signalAspectEvent(int16_t address, byte aspect ) {
|
||||||
|
if (!(compileFeatures & FEATURE_SIGNAL)) return false;
|
||||||
|
int16_t sigslot=getSignalSlot(address);
|
||||||
|
if (sigslot<0) return false; // this is not a defined signal
|
||||||
|
int16_t sigpos=sigslot*8;
|
||||||
|
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigpos);
|
||||||
|
VPIN sigtype=sigid & ~SIGNAL_ID_MASK;
|
||||||
|
if (sigtype!=DCCX_SIGNAL_FLAG) return false; // not a DCCX signal
|
||||||
|
// Turn an aspect change into a RED/AMBER/GREEN setting
|
||||||
|
if (aspect==GETHIGHFLASHW(RMFT2::SignalDefinitions,sigpos+2)) {
|
||||||
|
doSignal(sigid,SIGNAL_RED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aspect==GETHIGHFLASHW(RMFT2::SignalDefinitions,sigpos+4)) {
|
||||||
|
doSignal(sigid,SIGNAL_AMBER);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aspect==GETHIGHFLASHW(RMFT2::SignalDefinitions,sigpos+6)) {
|
||||||
|
doSignal(sigid,SIGNAL_GREEN);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false; // aspect is not a defined one
|
||||||
|
}
|
||||||
|
|
||||||
void RMFT2::turnoutEvent(int16_t turnoutId, bool closed) {
|
void RMFT2::turnoutEvent(int16_t turnoutId, bool closed) {
|
||||||
// Hunt for an ONTHROW/ONCLOSE for this turnout
|
// Hunt for an ONTHROW/ONCLOSE for this turnout
|
||||||
if (closed) onCloseLookup->handleEvent(F("CLOSE"),turnoutId);
|
if (closed) onCloseLookup->handleEvent(F("CLOSE"),turnoutId);
|
||||||
|
@ -155,6 +155,7 @@ class LookList {
|
|||||||
static void clockEvent(int16_t clocktime, bool change);
|
static void clockEvent(int16_t clocktime, bool change);
|
||||||
static void rotateEvent(int16_t id, bool change);
|
static void rotateEvent(int16_t id, bool change);
|
||||||
static void powerEvent(int16_t track, bool overload);
|
static void powerEvent(int16_t track, bool overload);
|
||||||
|
static bool signalAspectEvent(int16_t address, byte aspect );
|
||||||
static const int16_t SERVO_SIGNAL_FLAG=0x4000;
|
static const int16_t SERVO_SIGNAL_FLAG=0x4000;
|
||||||
static const int16_t ACTIVE_HIGH_SIGNAL_FLAG=0x2000;
|
static const int16_t ACTIVE_HIGH_SIGNAL_FLAG=0x2000;
|
||||||
static const int16_t DCC_SIGNAL_FLAG=0x1000;
|
static const int16_t DCC_SIGNAL_FLAG=0x1000;
|
||||||
@ -173,7 +174,7 @@ class LookList {
|
|||||||
static const FSH * getTurntableDescription(int16_t id);
|
static const FSH * getTurntableDescription(int16_t id);
|
||||||
static const FSH * getTurntablePositionDescription(int16_t turntableId, uint8_t positionId);
|
static const FSH * getTurntablePositionDescription(int16_t turntableId, uint8_t positionId);
|
||||||
static void startNonRecursiveTask(const FSH* reason, int16_t id,int pc);
|
static void startNonRecursiveTask(const FSH* reason, int16_t id,int pc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void ComandFilter(Print * stream, byte & opcode, byte & paramCount, int16_t p[]);
|
static void ComandFilter(Print * stream, byte & opcode, byte & paramCount, int16_t p[]);
|
||||||
static bool parseSlash(Print * stream, byte & paramCount, int16_t p[]) ;
|
static bool parseSlash(Print * stream, byte & paramCount, int16_t p[]) ;
|
||||||
|
Loading…
Reference in New Issue
Block a user