1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-27 01:56:14 +01:00

<A addr value>

This commit is contained in:
Asbelos 2024-02-15 19:51:52 +00:00
parent 784088b0df
commit 59b0e8383d
3 changed files with 26 additions and 0 deletions

16
DCC.cpp
View File

@ -278,6 +278,22 @@ void DCC::setAccessory(int address, byte port, bool gate, byte onoff /*= 2*/) {
} }
} }
void DCC::setExtendedAccessory(int16_t address, int16_t value, byte repeats) {
// format is 10AAAAAA, 0AAA0AA1, 000XXXXX
if (address != (address & 0x7F)) return;
if (value != (value & 0x1F)) return;
byte b[3];
b[0]= 0x80 | ((address & 0x7FF)>>5);
b[1]= 0x01 | ((address & 0x1c)<<2) | (address & 0x03)<<1;
b[2]=value & 0x1F;
DCCWaveform::mainTrack.schedulePacket(b, sizeof(b), repeats); // Repeat on packet three times
#if defined(EXRAIL_ACTIVE)
// TODO RMFT2::activateExtendedEvent(address,value);
#endif
}
// //
// writeCVByteMain: Write a byte with PoM on main. This writes // writeCVByteMain: Write a byte with PoM on main. This writes
// the 5 byte sized packet to implement this DCC function // the 5 byte sized packet to implement this DCC function

1
DCC.h
View File

@ -71,6 +71,7 @@ public:
static uint32_t getFunctionMap(int cab); static uint32_t getFunctionMap(int cab);
static void updateGroupflags(byte &flags, int16_t functionNumber); static void updateGroupflags(byte &flags, int16_t functionNumber);
static void setAccessory(int address, byte port, bool gate, byte onoff = 2); static void setAccessory(int address, byte port, bool gate, byte onoff = 2);
static void setExtendedAccessory(int16_t address, int16_t value, byte repeats=3);
static bool writeTextPacket(byte *b, int nBytes); static bool writeTextPacket(byte *b, int nBytes);
// ACKable progtrack calls bitresults callback 0,0 or -1, cv returns value or -1 // ACKable progtrack calls bitresults callback 0,0 or -1, cv returns value or -1

View File

@ -385,6 +385,15 @@ void DCCEXParser::parseOne(Print *stream, byte *com, RingStream * ringStream)
} }
return; return;
case 'A': // EXTENDED ACCESSORY <A address value>
{
if (params!=2) break;
if (p[0] != (p[0] & 0x7F)) break;
if (p[1] != (p[1] & 0x1F)) break;
DCC::setExtendedAccessory(p[0],p[1],3);
}
return;
case 'T': // TURNOUT <T ...> case 'T': // TURNOUT <T ...>
if (parseT(stream, params, p)) if (parseT(stream, params, p))
return; return;