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:
parent
82a4b48808
commit
b537d7a318
40
DCC.cpp
40
DCC.cpp
|
@ -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,
|
||||||
|
@ -673,6 +694,14 @@ void DCC::ackManagerLoop(bool blocking) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ITCB7: // If True callback(byte & 0xF)
|
||||||
|
if (ackReceived) {
|
||||||
|
ackManagerProg = NULL; // all done now
|
||||||
|
callback(ackManagerByte & 0x7F);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
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
|
||||||
|
@ -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
2
DCC.h
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user