mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-24 00:26:13 +01:00
Compile propagation LCC and SIGNALs
drops code if features not used in myAutomation by using constant propagation.
This commit is contained in:
parent
dcb6b49823
commit
e9f534be6a
49
EXRAIL2.cpp
49
EXRAIL2.cpp
|
@ -174,9 +174,6 @@ LookList* RMFT2::LookListLoader(OPCODE op1, OPCODE op2, OPCODE op3) {
|
||||||
onCloseLookup=LookListLoader(OPCODE_ONCLOSE);
|
onCloseLookup=LookListLoader(OPCODE_ONCLOSE);
|
||||||
onActivateLookup=LookListLoader(OPCODE_ONACTIVATE);
|
onActivateLookup=LookListLoader(OPCODE_ONACTIVATE);
|
||||||
onDeactivateLookup=LookListLoader(OPCODE_ONDEACTIVATE);
|
onDeactivateLookup=LookListLoader(OPCODE_ONDEACTIVATE);
|
||||||
onRedLookup=LookListLoader(OPCODE_ONRED);
|
|
||||||
onAmberLookup=LookListLoader(OPCODE_ONAMBER);
|
|
||||||
onGreenLookup=LookListLoader(OPCODE_ONGREEN);
|
|
||||||
onChangeLookup=LookListLoader(OPCODE_ONCHANGE);
|
onChangeLookup=LookListLoader(OPCODE_ONCHANGE);
|
||||||
onClockLookup=LookListLoader(OPCODE_ONTIME);
|
onClockLookup=LookListLoader(OPCODE_ONTIME);
|
||||||
onOverloadLookup=LookListLoader(OPCODE_ONOVERLOAD);
|
onOverloadLookup=LookListLoader(OPCODE_ONOVERLOAD);
|
||||||
|
@ -184,12 +181,18 @@ LookList* RMFT2::LookListLoader(OPCODE op1, OPCODE op2, OPCODE op3) {
|
||||||
|
|
||||||
// Second pass startup, define any turnouts or servos, set signals red
|
// Second pass startup, define any turnouts or servos, set signals red
|
||||||
// add sequences onRoutines to the lookups
|
// add sequences onRoutines to the lookups
|
||||||
for (int sigslot=0;;sigslot++) {
|
if (compileFeatures & FEATURE_SIGNAL) {
|
||||||
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8);
|
onRedLookup=LookListLoader(OPCODE_ONRED);
|
||||||
if (sigid==0) break; // end of signal list
|
onAmberLookup=LookListLoader(OPCODE_ONAMBER);
|
||||||
doSignal(sigid & SIGNAL_ID_MASK, SIGNAL_RED);
|
onGreenLookup=LookListLoader(OPCODE_ONGREEN);
|
||||||
|
for (int sigslot=0;;sigslot++) {
|
||||||
|
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8);
|
||||||
|
if (sigid==0) break; // end of signal list
|
||||||
|
doSignal(sigid & SIGNAL_ID_MASK, SIGNAL_RED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int progCounter;
|
int progCounter;
|
||||||
for (progCounter=0;; SKIPOP){
|
for (progCounter=0;; SKIPOP){
|
||||||
byte opcode=GET_OPCODE;
|
byte opcode=GET_OPCODE;
|
||||||
|
@ -305,6 +308,8 @@ void RMFT2::ComandFilter(Print * stream, byte & opcode, byte & paramCount, int16
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'L':
|
case 'L':
|
||||||
|
if (compileFeatures & FEATURE_LCC) {
|
||||||
|
// This entire code block is compiled out if LLC macros not used
|
||||||
if (paramCount==0) { //<L> LCC adapter introducing self
|
if (paramCount==0) { //<L> LCC adapter introducing self
|
||||||
LCCSerial=stream; // now we know where to send events we raise
|
LCCSerial=stream; // now we know where to send events we raise
|
||||||
|
|
||||||
|
@ -352,6 +357,7 @@ void RMFT2::ComandFilter(Print * stream, byte & opcode, byte & paramCount, int16
|
||||||
if (!reject) startNonRecursiveTask(F("LCC"),eventid,onLCCLookup[eventid]);
|
if (!reject) startNonRecursiveTask(F("LCC"),eventid,onLCCLookup[eventid]);
|
||||||
opcode=0;
|
opcode=0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // other commands pass through
|
default: // other commands pass through
|
||||||
|
@ -387,17 +393,19 @@ bool RMFT2::parseSlash(Print * stream, byte & paramCount, int16_t p[]) {
|
||||||
if (flag & LATCH_FLAG) StringFormatter::send(stream,F(" LATCHED"));
|
if (flag & LATCH_FLAG) StringFormatter::send(stream,F(" LATCHED"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// do the signals
|
|
||||||
// flags[n] represents the state of the nth signal in the table
|
|
||||||
for (int sigslot=0;;sigslot++) {
|
|
||||||
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8);
|
|
||||||
if (sigid==0) break; // end of signal list
|
|
||||||
byte flag=flags[sigslot] & SIGNAL_MASK; // obtain signal flags for this id
|
|
||||||
StringFormatter::send(stream,F("\n%S[%d]"),
|
|
||||||
(flag == SIGNAL_RED)? F("RED") : (flag==SIGNAL_GREEN) ? F("GREEN") : F("AMBER"),
|
|
||||||
sigid & SIGNAL_ID_MASK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (compileFeatures & FEATURE_SIGNAL) {
|
||||||
|
// do the signals
|
||||||
|
// flags[n] represents the state of the nth signal in the table
|
||||||
|
for (int sigslot=0;;sigslot++) {
|
||||||
|
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8);
|
||||||
|
if (sigid==0) break; // end of signal list
|
||||||
|
byte flag=flags[sigslot] & SIGNAL_MASK; // obtain signal flags for this id
|
||||||
|
StringFormatter::send(stream,F("\n%S[%d]"),
|
||||||
|
(flag == SIGNAL_RED)? F("RED") : (flag==SIGNAL_GREEN) ? F("GREEN") : F("AMBER"),
|
||||||
|
sigid & SIGNAL_ID_MASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
StringFormatter::send(stream,F(" *>\n"));
|
StringFormatter::send(stream,F(" *>\n"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1018,11 +1026,12 @@ void RMFT2::loop2() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_LCC: // short form LCC
|
case OPCODE_LCC: // short form LCC
|
||||||
if (LCCSerial) StringFormatter::send(LCCSerial,F("<L x%h>"),(uint16_t)operand);
|
if ((compileFeatures & FEATURE_LCC) && LCCSerial)
|
||||||
|
StringFormatter::send(LCCSerial,F("<L x%h>"),(uint16_t)operand);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OPCODE_LCCX: // long form LCC
|
case OPCODE_LCCX: // long form LCC
|
||||||
if (LCCSerial)
|
if ((compileFeatures & FEATURE_LCC) && LCCSerial)
|
||||||
StringFormatter::send(LCCSerial,F("<L x%h%h%h%h>\n"),
|
StringFormatter::send(LCCSerial,F("<L x%h%h%h%h>\n"),
|
||||||
getOperand(progCounter,1),
|
getOperand(progCounter,1),
|
||||||
getOperand(progCounter,2),
|
getOperand(progCounter,2),
|
||||||
|
@ -1122,6 +1131,7 @@ int16_t RMFT2::getSignalSlot(int16_t id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ void RMFT2::doSignal(int16_t id,char rag) {
|
/* static */ void RMFT2::doSignal(int16_t id,char rag) {
|
||||||
|
if (!(compileFeatures & FEATURE_SIGNAL)) return; // dont compile code below
|
||||||
if (diag) DIAG(F(" doSignal %d %x"),id,rag);
|
if (diag) DIAG(F(" doSignal %d %x"),id,rag);
|
||||||
|
|
||||||
// Schedule any event handler for this signal change.
|
// Schedule any event handler for this signal change.
|
||||||
|
@ -1189,6 +1199,7 @@ int16_t RMFT2::getSignalSlot(int16_t id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ bool RMFT2::isSignal(int16_t id,char rag) {
|
/* static */ bool RMFT2::isSignal(int16_t id,char rag) {
|
||||||
|
if (!(compileFeatures & FEATURE_LCC)) return false;
|
||||||
int16_t sigslot=getSignalSlot(id);
|
int16_t sigslot=getSignalSlot(id);
|
||||||
if (sigslot<0) return false;
|
if (sigslot<0) return false;
|
||||||
return (flags[sigslot] & SIGNAL_MASK) == rag;
|
return (flags[sigslot] & SIGNAL_MASK) == rag;
|
||||||
|
|
|
@ -91,6 +91,9 @@ enum thrunger: byte {
|
||||||
thrunge_lcd, // Must be last!!
|
thrunge_lcd, // Must be last!!
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Flag bits for compile time feature
|
||||||
|
static const byte FEATURE_SIGNAL= 0x80;
|
||||||
|
static const byte FEATURE_LCC = 0x40;
|
||||||
|
|
||||||
|
|
||||||
// Flag bits for status of hardware and TPL
|
// Flag bits for status of hardware and TPL
|
||||||
|
@ -198,6 +201,7 @@ private:
|
||||||
|
|
||||||
static const int countLCCLookup;
|
static const int countLCCLookup;
|
||||||
static int onLCCLookup[];
|
static int onLCCLookup[];
|
||||||
|
static const byte compileFeatures;
|
||||||
|
|
||||||
// Local variables - exist for each instance/task
|
// Local variables - exist for each instance/task
|
||||||
RMFT2 *next; // loop chain
|
RMFT2 *next; // loop chain
|
||||||
|
|
|
@ -75,6 +75,30 @@ void exrailHalSetup() {
|
||||||
#include "myAutomation.h"
|
#include "myAutomation.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pass 1c detect compile time featurtes
|
||||||
|
#include "EXRAIL2MacroReset.h"
|
||||||
|
#undef SIGNAL
|
||||||
|
#define SIGNAL(redpin,amberpin,greenpin) | FEATURE_SIGNAL
|
||||||
|
#undef SIGNALH
|
||||||
|
#define SIGNALH(redpin,amberpin,greenpin) | FEATURE_SIGNAL
|
||||||
|
#undef SERVO_SIGNAL
|
||||||
|
#define SERVO_SIGNAL(vpin,redval,amberval,greenval) | FEATURE_SIGNAL
|
||||||
|
#undef DCC_SIGNAL
|
||||||
|
#define DCC_SIGNAL(id,addr,subaddr) | FEATURE_SIGNAL
|
||||||
|
#undef VIRTUAL_SIGNAL
|
||||||
|
#define VIRTUAL_SIGNAL(id) | FEATURE_SIGNAL
|
||||||
|
|
||||||
|
#undef LCC
|
||||||
|
#define LCC(eventid) | FEATURE_LCC
|
||||||
|
#undef LCCX
|
||||||
|
#define LCCX(senderid,eventid) | FEATURE_LCC
|
||||||
|
#undef ONLCC
|
||||||
|
#define ONLCC(senderid,eventid) | FEATURE_LCC
|
||||||
|
|
||||||
|
const byte RMFT2::compileFeatures = 0
|
||||||
|
#include "myAutomation.h"
|
||||||
|
;
|
||||||
|
|
||||||
// Pass 2 create throttle route list
|
// Pass 2 create throttle route list
|
||||||
#include "EXRAIL2MacroReset.h"
|
#include "EXRAIL2MacroReset.h"
|
||||||
#undef ROUTE
|
#undef ROUTE
|
||||||
|
|
Loading…
Reference in New Issue
Block a user