mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-23 08:06:13 +01:00
Get loco Id API test
This commit is contained in:
parent
7a20896c8c
commit
f8f4268a48
|
@ -14,16 +14,16 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void myCallback(int result) {
|
void myCallback(int result) {
|
||||||
DIAG(F("\n Reading CV 1 callback result=%d"),result);
|
DIAG(F("\n getting Loco Id callback result=%d"),result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
DCC::begin();
|
DCC::begin();
|
||||||
|
|
||||||
DIAG(F("\n===== CVReader demonstrating DCC::readCV call ==========\n"));
|
DIAG(F("\n===== CVReader demonstrating DCC::getLocoId() call ==========\n"));
|
||||||
DCC::readCV(1,myCallback); // myCallback will be called with the result
|
DCC::getLocoId(myCallback); // myCallback will be called with the result
|
||||||
DIAG(F("\n===== DCC::readCV has returned, but wont be executed until we are in loop() ======\n"));
|
DIAG(F("\n===== DCC::getLocoId has returned, but wont be executed until we are in loop() ======\n"));
|
||||||
DIAG(F("\nReady for JMRI commands\n"));
|
DIAG(F("\nReady for JMRI commands\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
119
DCC.cpp
119
DCC.cpp
|
@ -160,6 +160,55 @@ const ackOp PROGMEM READ_CV_PROG[] = {
|
||||||
FAIL }; // verification failed
|
FAIL }; // verification failed
|
||||||
|
|
||||||
|
|
||||||
|
const ackOp PROGMEM LOCO_ID_PROG[] = {
|
||||||
|
BASELINE,
|
||||||
|
SETCV,(ackOp)29,
|
||||||
|
SETBIT,(ackOp)5,
|
||||||
|
V0, WACK, ITSKIP, // Skip to SKIPTARGET if bit 5 of CV29 is zero
|
||||||
|
// Long locoid
|
||||||
|
SETCV, (ackOp)17, // CV 17 is part of locoid
|
||||||
|
STARTMERGE,
|
||||||
|
V0, WACK, MERGE, // read and merge bit 1 etc
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
VB, WACK, NAKFAIL, // verify merged byte and return -1 it if not acked ok
|
||||||
|
STASHLOCOID, // keep stashed cv 17 for later
|
||||||
|
// Read 2nd part from CV 18
|
||||||
|
SETCV, (ackOp)18,
|
||||||
|
STARTMERGE,
|
||||||
|
V0, WACK, MERGE, // read and merge bit 1 etc
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
VB, WACK, NAKFAIL, // verify merged byte and return -1 it if not acked ok
|
||||||
|
COMBINELOCOID, // Combile byte with stash to make long locoid and callback
|
||||||
|
|
||||||
|
// ITSKIP Skips to here if CV 29 bit 5 was zero. so read CV 1 and return that
|
||||||
|
SKIPTARGET,
|
||||||
|
SETCV, (ackOp)1,
|
||||||
|
STARTMERGE,
|
||||||
|
V0, WACK, MERGE, // read and merge bit 1 etc
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
V0, WACK, MERGE,
|
||||||
|
VB, WACK, ITCB, // verify merged byte and callback
|
||||||
|
FAIL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void DCC::writeCVByte(int cv, byte byteValue, ACK_CALLBACK callback) {
|
void DCC::writeCVByte(int cv, byte byteValue, ACK_CALLBACK callback) {
|
||||||
ackManagerSetup(cv, byteValue, WRITE_BYTE_PROG, callback);
|
ackManagerSetup(cv, byteValue, WRITE_BYTE_PROG, callback);
|
||||||
|
@ -181,6 +230,9 @@ void DCC::readCV(int cv, ACK_CALLBACK callback) {
|
||||||
ackManagerSetup(cv, 0,READ_CV_PROG, callback);
|
ackManagerSetup(cv, 0,READ_CV_PROG, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DCC::getLocoId(ACK_CALLBACK callback) {
|
||||||
|
ackManagerSetup(0,0, LOCO_ID_PROG, callback);
|
||||||
|
}
|
||||||
|
|
||||||
void DCC::loop() {
|
void DCC::loop() {
|
||||||
DCCWaveform::loop(); // power overload checks
|
DCCWaveform::loop(); // power overload checks
|
||||||
|
@ -205,27 +257,6 @@ void DCC::loop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DCC::getLocoId(ACK_CALLBACK callback) {
|
|
||||||
callback(-1); // Not yet implemented
|
|
||||||
//
|
|
||||||
// switch (readCVBit(29, 5)) {
|
|
||||||
// case 1:
|
|
||||||
// // long address : get CV#17 and CV#18
|
|
||||||
// {
|
|
||||||
// int cv17 = readCV(17);
|
|
||||||
//
|
|
||||||
// if (cv17 < 0) break;
|
|
||||||
// int cv18 = readCV(18);
|
|
||||||
// if (cv18 < 0) break;
|
|
||||||
// return cv18 + ((cv17 - 192) << 8);
|
|
||||||
// }
|
|
||||||
// case 0: // short address in CV1
|
|
||||||
// return readCV(1);
|
|
||||||
// default: // No response or loco
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
///// Private helper functions below here /////////////////////
|
///// Private helper functions below here /////////////////////
|
||||||
|
|
||||||
|
@ -263,6 +294,7 @@ int DCC::nextLoco = 0;
|
||||||
//ACK MANAGER
|
//ACK MANAGER
|
||||||
ackOp const * DCC::ackManagerProg;
|
ackOp const * DCC::ackManagerProg;
|
||||||
byte DCC::ackManagerByte;
|
byte DCC::ackManagerByte;
|
||||||
|
byte DCC::ackManagerStash;
|
||||||
int DCC::ackManagerCv;
|
int DCC::ackManagerCv;
|
||||||
byte DCC::ackManagerBitNum;
|
byte DCC::ackManagerBitNum;
|
||||||
bool DCC::ackReceived;
|
bool DCC::ackReceived;
|
||||||
|
@ -372,6 +404,14 @@ void DCC::ackManagerLoop() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NAKFAIL: // If nack callback(-1)
|
||||||
|
if (!ackReceived) {
|
||||||
|
ackManagerProg = NULL; // all done now
|
||||||
|
(ackManagerCallback)(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case FAIL: // callback(-1)
|
case FAIL: // callback(-1)
|
||||||
ackManagerProg = NULL;
|
ackManagerProg = NULL;
|
||||||
(ackManagerCallback)(-1);
|
(ackManagerCallback)(-1);
|
||||||
|
@ -389,6 +429,43 @@ void DCC::ackManagerLoop() {
|
||||||
ackManagerBitNum--;
|
ackManagerBitNum--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SETBIT:
|
||||||
|
ackManagerProg++;
|
||||||
|
ackManagerBitNum=pgm_read_byte_near(ackManagerProg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SETCV:
|
||||||
|
ackManagerProg++;
|
||||||
|
ackManagerCv=pgm_read_byte_near(ackManagerProg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STASHLOCOID:
|
||||||
|
ackManagerStash=ackManagerByte; // stash value from CV17
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COMBINELOCOID:
|
||||||
|
// ackManagerStash is cv17, ackManagerByte is CV 18
|
||||||
|
ackManagerProg=NULL;
|
||||||
|
(ackManagerCallback)( ackManagerByte + ((ackManagerStash - 192) << 8));
|
||||||
|
return;
|
||||||
|
|
||||||
|
case ITSKIP:
|
||||||
|
if (!ackReceived) break;
|
||||||
|
// SKIP opcodes until SKIPTARGET found
|
||||||
|
while (opcode!=SKIPTARGET) {
|
||||||
|
ackManagerProg++;
|
||||||
|
opcode=pgm_read_byte_near(ackManagerProg);
|
||||||
|
}
|
||||||
|
// DIAG(F("\nSKIPTARGET located\n"));
|
||||||
|
break;
|
||||||
|
case SKIPTARGET:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// DIAG(F("!! ackOp %d FAULT!!"),opcode);
|
||||||
|
ackManagerProg=NULL;
|
||||||
|
(ackManagerCallback)( -1);
|
||||||
|
return;
|
||||||
|
|
||||||
} // end of switch
|
} // end of switch
|
||||||
ackManagerProg++;
|
ackManagerProg++;
|
||||||
}
|
}
|
||||||
|
|
10
DCC.h
10
DCC.h
|
@ -16,9 +16,16 @@ WACK, // wait for ack (or absence of ack)
|
||||||
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)
|
||||||
|
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
|
||||||
|
SETCV, // sets cv number to next prog byte
|
||||||
|
STASHLOCOID, // keeps current byte value for later
|
||||||
|
COMBINELOCOID, // combines current value with stashed value and returns it
|
||||||
|
ITSKIP, // skip to SKIPTARGET if ack true
|
||||||
|
SKIPTARGET=0xFF // jump to target
|
||||||
};
|
};
|
||||||
|
|
||||||
class DCC {
|
class DCC {
|
||||||
|
@ -62,6 +69,7 @@ private:
|
||||||
static byte ackManagerByte;
|
static byte ackManagerByte;
|
||||||
static byte ackManagerBitNum;
|
static byte ackManagerBitNum;
|
||||||
static int ackManagerCv;
|
static int ackManagerCv;
|
||||||
|
static byte ackManagerStash;
|
||||||
static bool ackReceived;
|
static bool ackReceived;
|
||||||
static int ackTriggerMilliamps;
|
static int ackTriggerMilliamps;
|
||||||
static ACK_CALLBACK ackManagerCallback;
|
static ACK_CALLBACK ackManagerCallback;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user