1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-23 08:06:13 +01:00

<R> command consist support

R command will return address suitable for throttle if consist has been setup.
This commit is contained in:
Asbelos 2021-01-17 13:22:16 +00:00
parent 82a4b48808
commit b537d7a318
2 changed files with 41 additions and 3 deletions

42
DCC.cpp
View File

@ -331,10 +331,31 @@ const ackOp PROGMEM READ_CV_PROG[] = {
const ackOp PROGMEM LOCO_ID_PROG[] = { const ackOp PROGMEM LOCO_ID_PROG[] = {
BASELINE, BASELINE,
SETCV, (ackOp)1,
SETBIT, (ackOp)7,
V0,WACK,NAKFAIL, // test CV 1 bit 7 is a zero... NAK means no loco found
SETCV, (ackOp)19, // CV 19 is consist setting
SETBYTE, (ackOp)0,
VB, WACK, ITSKIP, // ignore consist if cv19 is zero (no consist)
SETBYTE, (ackOp)128,
VB, WACK, ITSKIP, // ignore consist if cv19 is 128 (no consist, direction bit set)
STARTMERGE, // Setup to read cv 19
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
V0, WACK, MERGE,
VB, WACK, ITCB7, // return 7 bits only, No_ACK means CV19 not supported so ignore it
SKIPTARGET, // continue here if CV 19 is zero or fails all validation
SETCV,(ackOp)29, SETCV,(ackOp)29,
SETBIT,(ackOp)5, SETBIT,(ackOp)5,
V0, WACK, ITSKIP, // Skip to SKIPTARGET if bit 5 of CV29 is zero V0, WACK, ITSKIP, // Skip to SKIPTARGET if bit 5 of CV29 is zero
V1, WACK, NAKFAIL, // fast fail if no loco on track
// Long locoid // Long locoid
SETCV, (ackOp)17, // CV 17 is part of locoid SETCV, (ackOp)17, // CV 17 is part of locoid
STARTMERGE, STARTMERGE,
@ -366,7 +387,7 @@ const ackOp PROGMEM LOCO_ID_PROG[] = {
SKIPTARGET, SKIPTARGET,
SETCV, (ackOp)1, SETCV, (ackOp)1,
STARTMERGE, STARTMERGE,
V0, WACK, MERGE, // read and merge bit 1 etc SETBIT, (ackOp)6, // skip over first bit as we know its a zero
V0, WACK, MERGE, V0, WACK, MERGE,
V0, WACK, MERGE, V0, WACK, MERGE,
V0, WACK, MERGE, V0, WACK, MERGE,
@ -668,7 +689,15 @@ 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
callback(ackManagerByte); callback(ackManagerByte);
return;
}
break;
case ITCB7: // If True callback(byte & 0xF)
if (ackReceived) {
ackManagerProg = NULL; // all done now
callback(ackManagerByte & 0x7F);
return; return;
} }
break; break;
@ -708,6 +737,11 @@ void DCC::ackManagerLoop(bool blocking) {
ackManagerCv=pgm_read_byte_near(ackManagerProg); ackManagerCv=pgm_read_byte_near(ackManagerProg);
break; break;
case SETBYTE:
ackManagerProg++;
ackManagerByte=pgm_read_byte_near(ackManagerProg);
break;
case STASHLOCOID: case STASHLOCOID:
ackManagerStash=ackManagerByte; // stash value from CV17 ackManagerStash=ackManagerByte; // stash value from CV17
break; break;
@ -724,6 +758,8 @@ void DCC::ackManagerLoop(bool blocking) {
while (opcode!=SKIPTARGET) { while (opcode!=SKIPTARGET) {
ackManagerProg++; ackManagerProg++;
opcode=pgm_read_byte_near(ackManagerProg); opcode=pgm_read_byte_near(ackManagerProg);
// Jump over second byte of any 2-byte opcodes.
if (opcode==SETBIT || opcode==SETBYTE || opcode==SETCV) ackManagerProg++;
} }
break; break;
case SKIPTARGET: case SKIPTARGET:

2
DCC.h
View File

@ -37,12 +37,14 @@ enum ackOp
ITC1, // If True Callback(1) (if prevous WACK got an ACK) ITC1, // If True Callback(1) (if prevous WACK got an ACK)
ITC0, // If True callback(0); ITC0, // If True callback(0);
ITCB, // If True callback(byte) ITCB, // If True callback(byte)
ITCB7, // If True callback(byte &0x7F)
NAKFAIL, // if false callback(-1) NAKFAIL, // if false callback(-1)
FAIL, // callback(-1) FAIL, // callback(-1)
STARTMERGE, // Clear bit and byte settings ready for merge pass STARTMERGE, // Clear bit and byte settings ready for merge pass
MERGE, // Merge previous wack response with byte value and decrement bit number (use for readimng CV bytes) MERGE, // Merge previous wack response with byte value and decrement bit number (use for readimng CV bytes)
SETBIT, // sets bit number to next prog byte SETBIT, // sets bit number to next prog byte
SETCV, // sets cv number to next prog byte SETCV, // sets cv number to next prog byte
SETBYTE, // sets current byte to next prog byte
STASHLOCOID, // keeps current byte value for later STASHLOCOID, // keeps current byte value for later
COMBINELOCOID, // combines current value with stashed value and returns it COMBINELOCOID, // combines current value with stashed value and returns it
ITSKIP, // skip to SKIPTARGET if ack true ITSKIP, // skip to SKIPTARGET if ack true