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:
parent
e6dde5a11c
commit
54e1bdb878
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user