diff --git a/DCCEXParser.cpp b/DCCEXParser.cpp index 7c5f46f..619af00 100644 --- a/DCCEXParser.cpp +++ b/DCCEXParser.cpp @@ -143,6 +143,7 @@ int DCCEXParser::splitValues(int result[MAX_PARAMS], const byte *cmd) runningValue = 10 * runningValue + (hot - '0'); break; } + if (hot >= 'a' && hot <= 'z') hot=hot-'a'+'A'; // uppercase a..z if (hot >= 'A' && hot <= 'Z') { // Since JMRI got modified to send keywords in some rare cases, we need this @@ -314,12 +315,33 @@ void DCCEXParser::parse(Print *stream, byte *com, bool blocking) return; break; - case 'a': // ACCESSORY - if (p[2] != (p[2] & 1)) - return; - DCC::setAccessory(p[0], p[1], p[2] == 1); + case 'a': // ACCESSORY or + { + int address; + byte subaddress; + byte activep; + if (params==2) { // + address=(p[0] - 1) / 4 + 1; + subaddress=(p[0] - 1) % 4; + activep=1; + } + else if (params==3) { // + address=p[0]; + subaddress=p[1]; + activep=2; + } + else break; // invalid no of parameters + + if ( + ((address & 0x01FF) != address) // invalid address (limit 9 bits ) + || ((subaddress & 0x03) != subaddress) // invalid subaddress (limit 2 bits ) + || ((p[activep] & 0x01) != p[activep]) // invalid activate 0|1 + ) break; + + DCC::setAccessory(address, subaddress,p[activep]==1); + } return; - + case 'T': // TURNOUT if (parseT(stream, params, p)) return;