1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2025-03-31 10:40:12 +02:00

Auto prog power diagnostics and cleanup

This commit is contained in:
Asbelos 2020-09-11 12:56:36 +01:00
parent 603c8e4fcd
commit a86b65ced0
2 changed files with 15 additions and 14 deletions

28
DCC.cpp
View File

@ -513,8 +513,9 @@ void DCC::ackManagerLoop(bool blocking) {
switch (opcode) { switch (opcode) {
case BASELINE: case BASELINE:
if (DCCWaveform::progTrack.getPowerMode() == POWERMODE::OFF) { if (DCCWaveform::progTrack.getPowerMode() == POWERMODE::OFF) {
DCCWaveform::progTrack.setPowerMode(POWERMODE::ON); if (Diag::ACK) DIAG(F("\nAuto Prog power on"));
DCCWaveform::progTrack.sentResetsSincePacket = 0; DCCWaveform::progTrack.setPowerMode(POWERMODE::ON);
DCCWaveform::progTrack.sentResetsSincePacket = 0;
DCCWaveform::progTrack.autoPowerOff=true; DCCWaveform::progTrack.autoPowerOff=true;
return; return;
} }
@ -582,8 +583,7 @@ void DCC::ackManagerLoop(bool blocking) {
case ITC1: // If True Callback(0 or 1) (if prevous WACK got an ACK) case ITC1: // If True Callback(0 or 1) (if prevous WACK got an ACK)
if (ackReceived) { if (ackReceived) {
ackManagerProg = NULL; // all done now ackManagerProg = NULL; // all done now
DCCWaveform::progTrack.doAutoPowerOff(); callback(opcode==ITC0?0:1);
callback(opcode==ITC0?0:1);
return; return;
} }
break; break;
@ -591,8 +591,7 @@ void DCC::ackManagerLoop(bool blocking) {
case ITCB: // If True callback(byte) case ITCB: // If True callback(byte)
if (ackReceived) { if (ackReceived) {
ackManagerProg = NULL; // all done now ackManagerProg = NULL; // all done now
DCCWaveform::progTrack.doAutoPowerOff(); callback(ackManagerByte);
callback(ackManagerByte);
return; return;
} }
break; break;
@ -600,16 +599,14 @@ void DCC::ackManagerLoop(bool blocking) {
case NAKFAIL: // If nack callback(-1) case NAKFAIL: // If nack callback(-1)
if (!ackReceived) { if (!ackReceived) {
ackManagerProg = NULL; // all done now ackManagerProg = NULL; // all done now
DCCWaveform::progTrack.doAutoPowerOff(); callback(-1);
callback(-1);
return; return;
} }
break; break;
case FAIL: // callback(-1) case FAIL: // callback(-1)
ackManagerProg = NULL; ackManagerProg = NULL;
DCCWaveform::progTrack.doAutoPowerOff(); callback(-1);
callback(-1);
return; return;
case STARTMERGE: case STARTMERGE:
@ -641,7 +638,6 @@ void DCC::ackManagerLoop(bool blocking) {
case COMBINELOCOID: case COMBINELOCOID:
// ackManagerStash is cv17, ackManagerByte is CV 18 // ackManagerStash is cv17, ackManagerByte is CV 18
ackManagerProg=NULL; ackManagerProg=NULL;
DCCWaveform::progTrack.doAutoPowerOff();
callback( ackManagerByte + ((ackManagerStash - 192) << 8)); callback( ackManagerByte + ((ackManagerStash - 192) << 8));
return; return;
@ -656,7 +652,7 @@ void DCC::ackManagerLoop(bool blocking) {
case SKIPTARGET: case SKIPTARGET:
break; break;
default: default:
DIAG(F("!! ackOp %d FAULT!!"),opcode); DIAG(F("\n!! ackOp %d FAULT!!"),opcode);
ackManagerProg=NULL; ackManagerProg=NULL;
callback( -1); callback( -1);
return; return;
@ -666,8 +662,12 @@ void DCC::ackManagerLoop(bool blocking) {
} }
} }
void DCC::callback(int value) { void DCC::callback(int value) {
if (Diag::ACK) DIAG(F("\nCallback(%d)\n"),value); if (DCCWaveform::progTrack.autoPowerOff) {
(ackManagerCallback)( value); if (Diag::ACK) DIAG(F("\nAuto Prog power off"));
DCCWaveform::progTrack.doAutoPowerOff();
}
if (Diag::ACK) DIAG(F("\nCallback(%d)\n"),value);
(ackManagerCallback)( value);
} }
void DCC::displayCabList(Print * stream) { void DCC::displayCabList(Print * stream) {

View File

@ -184,6 +184,7 @@ void DCCEXParser::parse(Print * stream, byte *com, bool blocking) {
DCC::setThrottle(cab,tspeed,direction); DCC::setThrottle(cab,tspeed,direction);
if (params==4) StringFormatter::send(stream,F("<T %d %d %d>"), p[0], p[2],p[3]); if (params==4) StringFormatter::send(stream,F("<T %d %d %d>"), p[0], p[2],p[3]);
else StringFormatter::send(stream,F("<O>"));
return; return;
} }
case 'f': // FUNCTION <f CAB BYTE1 [BYTE2]> case 'f': // FUNCTION <f CAB BYTE1 [BYTE2]>