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

Fix index of DB[] to comply with Roco documentation

This commit is contained in:
Harald Barth 2024-03-24 12:18:28 +01:00
parent e6dde5a11c
commit 54e1bdb878

View File

@ -603,7 +603,13 @@ void diagPacket(byte *networkPacket, int len) {
bool Z21Throttle::parse(byte *networkPacket, int len) { bool Z21Throttle::parse(byte *networkPacket, int len) {
bool done = false; bool done = false;
// same names as in Z21 LAN Protocol Specification
byte *DB; byte *DB;
byte *Data;
byte Xheader;
int Header;
byte *p = networkPacket; byte *p = networkPacket;
int l = len; int l = len;
@ -632,36 +638,36 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
return false; return false;
} }
p += 2; p += 2;
int header = GETINT16(p); Header = GETINT16(p);
byte Xheader = 0;
p += 2; p += 2;
DB = p; // now p is at start of Data, networkPacket + 4
byte DB0 = 0; Data = p;
Xheader = Data[0];
DB = Data + 1;
int nbLocos = CountLocos(); int nbLocos = CountLocos();
// set p for next round // set p for next round
p += lengthData; p += lengthData;
if (Diag::Z21THROTTLEDATA && DB[1] != LAN_X_DB0_GET_STATUS) if (Diag::Z21THROTTLEDATA &&
DIAG(F("%d <- lengthData:%d header:0x%02x : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x"), !((DB[0] == LAN_X_DB0_GET_STATUS) && (Xheader == LAN_X_HEADER_GENERAL)))
this->clientid, lengthData, header, DIAG(F("%d <- lengthData:%d Header:0x%02x : 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x"),
(lengthData > 0)?DB[0]:0, this->clientid, lengthData, Header,
(lengthData > 1)?DB[1]:0, (lengthData > 0)?Data[0]:0,
(lengthData > 2)?DB[2]:0, (lengthData > 1)?Data[1]:0,
(lengthData > 3)?DB[3]:0, (lengthData > 2)?Data[2]:0,
(lengthData > 4)?DB[4]:0, (lengthData > 3)?Data[3]:0,
(lengthData > 5)?DB[5]:0, (lengthData > 4)?Data[4]:0,
(lengthData > 6)?DB[6]:0, (lengthData > 5)?Data[5]:0,
(lengthData > 7)?DB[7]:0, (lengthData > 6)?Data[6]:0,
(lengthData > 8)?DB[8]:0, (lengthData > 7)?Data[7]:0,
(lengthData > 9)?DB[9]:0); (lengthData > 8)?Data[8]:0,
(lengthData > 9)?Data[9]:0);
if (l > 0 && Diag::Z21THROTTLEDATA) DIAG(F("next packet follows")); if (l > 0 && Diag::Z21THROTTLEDATA) DIAG(F("next packet follows"));
switch (header) { switch (Header) {
case HEADER_LAN_XPRESS_NET: case HEADER_LAN_XPRESS_NET:
Xheader = DB[0];
switch (Xheader) { switch (Xheader) {
case LAN_X_HEADER_GENERAL: case LAN_X_HEADER_GENERAL:
DB0 = DB[1]; switch (DB[0]) {
switch (DB0) {
case LAN_X_DB0_GET_VERSION: case LAN_X_DB0_GET_VERSION:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d GET_VERSION"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d GET_VERSION"), this->clientid);
break; break;
@ -699,29 +705,28 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
done = true; done = true;
break; break;
case LAN_X_HEADER_SET_LOCO: case LAN_X_HEADER_SET_LOCO:
DB0 = DB[1]; switch (DB[0]) {
switch (DB0) {
case LAN_X_DB0_LOCO_DCC14: case LAN_X_DB0_LOCO_DCC14:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 14 SPEED"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 14 SPEED"), this->clientid);
setSpeed(14, DB[2], DB[3], DB[4]); setSpeed(14, DB[1], DB[2], DB[3]);
done = true; done = true;
break; break;
case LAN_X_DB0_LOCO_DCC28: case LAN_X_DB0_LOCO_DCC28:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 28 SPEED"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 28 SPEED"), this->clientid);
setSpeed(28, DB[2], DB[3], DB[4]); setSpeed(28, DB[1], DB[2], DB[3]);
done = true; done = true;
break; break;
case LAN_X_DB0_LOCO_DCC128: case LAN_X_DB0_LOCO_DCC128:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 128 SPEED"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC 128 SPEED"), this->clientid);
setSpeed(128, DB[2], DB[3], DB[4]); setSpeed(128, DB[1], DB[2], DB[3]);
done = true; done = true;
break; break;
case LAN_X_DB0_SET_LOCO_FUNCTION: case LAN_X_DB0_SET_LOCO_FUNCTION:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC FUNCTION"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO DCC FUNCTION"), this->clientid);
setFunction(DB[2], DB[3], DB[4]); setFunction(DB[1], DB[2], DB[3]);
if (Diag::Z21THROTTLE) { if (Diag::Z21THROTTLE) {
// Debug capacity to print data... // Debug capacity to print data...
byte function = DB[4]; byte function = DB[3];
bitClear(function, 6); bitClear(function, 6);
bitClear(function, 7); bitClear(function, 7);
if (function == 12) { // why not ? if (function == 12) { // why not ?
@ -734,14 +739,15 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
} }
break; break;
case LAN_X_HEADER_GET_LOCO_INFO: case LAN_X_HEADER_GET_LOCO_INFO:
// XXX Should we switch(DB[0]) here?
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO INFO: "), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d LOCO INFO: "), this->clientid);
notifyLocoInfo(DB[2], DB[3]); notifyLocoInfo(DB[1], DB[2]);
done = true; done = true;
break; break;
case LAN_X_HEADER_GET_TURNOUT_INFO: case LAN_X_HEADER_GET_TURNOUT_INFO:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d TURNOUT INFO "), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d TURNOUT INFO "), this->clientid);
notifyTurnoutInfo(DB[1], DB[2]); notifyTurnoutInfo(DB[0], DB[1]);
done = true; done = true;
break; break;
@ -754,7 +760,7 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
if (TrackManager::getProgDriver() != NULL) { if (TrackManager::getProgDriver() != NULL) {
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ PROG "), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ PROG "), this->clientid);
// DB0 should be 0x11 // DB0 should be 0x11
cvReadProg(DB[2], DB[3]); cvReadProg(DB[1], DB[2]);
} }
else { else {
// //
@ -764,14 +770,14 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
// If no prog track, read on the main track ! // If no prog track, read on the main track !
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ MAIN "), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ MAIN "), this->clientid);
// DB0 should be 0x11 // DB0 should be 0x11
cvReadMain(DB[2], DB[3]); cvReadMain(DB[1], DB[2]);
} }
done = true; done = true;
break; break;
case LAN_X_HEADER_CV_POM: case LAN_X_HEADER_CV_POM:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ POM"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d CV READ POM"), this->clientid);
// DB0 should be 0x11 // DB0 should be 0x11
cvReadPom(DB[2], DB[3], DB[4], DB[5]); cvReadPom(DB[1], DB[2], DB[3], DB[4]);
done = true; done = true;
break; break;
case LAN_X_HEADER_CV_WRITE: case LAN_X_HEADER_CV_WRITE:
@ -780,13 +786,15 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
done = true; done = true;
break; break;
case LAN_X_HEADER_SET_TURNOUT: case LAN_X_HEADER_SET_TURNOUT:
// XXX sent when operating a turnout
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d SET TURNOUT "), this->clientid);
case LAN_X_HEADER_READ_REGISTER: case LAN_X_HEADER_READ_REGISTER:
break; break;
} }
break; break;
case HEADER_LAN_SET_BROADCASTFLAGS: case HEADER_LAN_SET_BROADCASTFLAGS:
this->broadcastFlags = int32_t(DB[3] << 24 | DB[2] << 16 | DB[1] << 8 | DB[0]); this->broadcastFlags = int32_t(Data[3] << 24 | Data[2] << 16 | Data[1] << 8 | Data[0]);
if (Diag::Z21THROTTLEDATA) DIAG(F("BROADCAST FLAGS %d : %s %s %s %s %s %s %s %s %s %s %s"), this->clientid, if (Diag::Z21THROTTLEDATA) DIAG(F("BROADCAST FLAGS %d : %s %s %s %s %s %s %s %s %s %s %s"), this->clientid,
(this->broadcastFlags & BROADCAST_BASE) ? "BASE " : "" , (this->broadcastFlags & BROADCAST_BASE) ? "BASE " : "" ,
(this->broadcastFlags & BROADCAST_RBUS) ? "RBUS " : "" , (this->broadcastFlags & BROADCAST_RBUS) ? "RBUS " : "" ,
@ -803,7 +811,7 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
break; break;
case HEADER_LAN_GET_LOCOMODE: case HEADER_LAN_GET_LOCOMODE:
if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d GET LOCOMODE"), this->clientid); if (Diag::Z21THROTTLEVERBOSE) DIAG(F("%d GET LOCOMODE"), this->clientid);
notifyLocoMode(DB[0], DB[1]); // big endian here, but resend the same as received, so no problem. notifyLocoMode(Data[0], Data[1]); // big endian here, but resend the same as received, so no problem.
done = true; done = true;
break; break;
@ -827,6 +835,7 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
done = true; done = true;
break; break;
case HEADER_LAN_GET_SERIAL_NUMBER: case HEADER_LAN_GET_SERIAL_NUMBER:
// XXX this has been seen, return dummy number
case HEADER_LAN_GET_BROADCASTFLAGS: case HEADER_LAN_GET_BROADCASTFLAGS:
case HEADER_LAN_GET_TURNOUTMODE: case HEADER_LAN_GET_TURNOUTMODE:
case HEADER_LAN_SET_TURNOUTMODE: case HEADER_LAN_SET_TURNOUTMODE:
@ -841,7 +850,7 @@ bool Z21Throttle::parse(byte *networkPacket, int len) {
} }
if (!done) { if (!done) {
if (Diag::Z21THROTTLE) DIAG(F("Z21 Throttle %d : not treated : header:%x Xheader:%x DB0:%x"), this->clientid, header, Xheader, DB0); if (Diag::Z21THROTTLE) DIAG(F("Z21 Throttle %d : not treated : Header:%x Xheader:%x DB0:%x"), this->clientid, Header, Xheader, DB[0]);
} else { } else {
int newNbLocos = CountLocos(); int newNbLocos = CountLocos();
if (nbLocos != newNbLocos) if (nbLocos != newNbLocos)