1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 10:06: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:
Asbelos 2023-09-26 21:22:42 +01:00
parent dcb6b49823
commit e9f534be6a
3 changed files with 60 additions and 21 deletions

View File

@ -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 if (compileFeatures & FEATURE_SIGNAL) {
for (int sigslot=0;;sigslot++) { // do the signals
VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8); // flags[n] represents the state of the nth signal in the table
if (sigid==0) break; // end of signal list for (int sigslot=0;;sigslot++) {
byte flag=flags[sigslot] & SIGNAL_MASK; // obtain signal flags for this id VPIN sigid=GETHIGHFLASHW(RMFT2::SignalDefinitions,sigslot*8);
StringFormatter::send(stream,F("\n%S[%d]"), if (sigid==0) break; // end of signal list
(flag == SIGNAL_RED)? F("RED") : (flag==SIGNAL_GREEN) ? F("GREEN") : F("AMBER"), byte flag=flags[sigslot] & SIGNAL_MASK; // obtain signal flags for this id
sigid & SIGNAL_ID_MASK); 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;

View File

@ -91,7 +91,10 @@ 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
static const byte SECTION_FLAG = 0x80; static const byte SECTION_FLAG = 0x80;
@ -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

View File

@ -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