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

Add flag to invert DCC Accessory command <a> behaviour

<a addr subaddr 1> command puts a D=1 into the DCC packet for a DCC Accessory Decoder.  This was previously though to correspond to a 'throw' request and a D=0 to a 'close' request.  RCN-213 standard identifies that D=1 is 'close' and D=0 is 'throw', so this change allows CS to be configured to invert the states to conform to the RCN-213 definition.
This commit is contained in:
Neil McKechnie 2021-08-27 21:43:24 +01:00
parent 23ed4e61af
commit fb6ab85c4a
3 changed files with 17 additions and 3 deletions

View File

@ -239,6 +239,9 @@ void DCC::updateGroupflags(byte & flags, int16_t functionNumber) {
} }
void DCC::setAccessory(int address, byte number, bool activate) { void DCC::setAccessory(int address, byte number, bool activate) {
#ifdef DIAG_IO
DIAG(F("DCC::setAccessory(%d,%d,%d)"), address, number, activate);
#endif
// use masks to detect wrong values and do nothing // use masks to detect wrong values and do nothing
if(address != (address & 511)) if(address != (address & 511))
return; return;

View File

@ -27,6 +27,7 @@
#include "freeMemory.h" #include "freeMemory.h"
#include "GITHUB_SHA.h" #include "GITHUB_SHA.h"
#include "version.h" #include "version.h"
#include "defines.h"
#include "EEStore.h" #include "EEStore.h"
#include "DIAG.h" #include "DIAG.h"
@ -364,8 +365,12 @@ void DCCEXParser::parse(Print *stream, byte *com, RingStream * ringStream)
|| ((subaddress & 0x03) != subaddress) // invalid subaddress (limit 2 bits ) || ((subaddress & 0x03) != subaddress) // invalid subaddress (limit 2 bits )
|| ((p[activep] & 0x01) != p[activep]) // invalid activate 0|1 || ((p[activep] & 0x01) != p[activep]) // invalid activate 0|1
) break; ) break;
// TODO: Trigger configurable range of addresses on local VPins. // Honour the configuration option (config.h) which allows the <a> command to be reversed
#ifdef DCC_ACCESSORY_RCN_213
DCC::setAccessory(address, subaddress,p[activep]==0);
#else
DCC::setAccessory(address, subaddress,p[activep]==1); DCC::setAccessory(address, subaddress,p[activep]==1);
#endif
} }
return; return;

View File

@ -134,11 +134,17 @@ The configuration file for DCC-EX Command Station
// //
// According to norm RCN-213 a DCC packet with a 1 is closed/straight // According to norm RCN-213 a DCC packet with a 1 is closed/straight
// and one with a 0 is thrown/diverging. In DCC++ Classic, and in previous // and one with a 0 is thrown/diverging. In DCC++ Classic, and in previous
// versions of DCC++EX, a throw command was implemented in the packet as // versions of DCC++EX, a turnout throw command was implemented in the packet as
// '1' and a close command as '0'. The #define below makes the states // '1' and a close command as '0'. The #define below makes the states
// match with the norm. But we don't want to cause havoc on existent layouts, // match with the norm. But we don't want to cause havoc on existent layouts,
// so we define this only for new installations. If you don't want this, // so we define this only for new installations. If you don't want this,
// don't add it to your config.h. // don't add it to your config.h.
#define DCC_TURNOUTS_RCN_213 //#define DCC_TURNOUTS_RCN_213
// The following #define likewise inverts the behaviour of the <a> command
// for triggering DCC Accessory Decoders, so that <a addr subaddr 0> generates a
// DCC packet with D=1 (close turnout) and <a addr subaddr 1> generates D=0
// (throw turnout).
//#define DCC_ACCESSORY_RCN_213
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////