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

define TURNOUT_RCN_218 to follow norm for DCC packet on rails

This commit is contained in:
Harald Barth 2021-08-22 10:41:09 +02:00
parent ddcd40860f
commit 20512b0c63
3 changed files with 43 additions and 15 deletions

20
DCC.cpp
View File

@ -17,6 +17,13 @@
* You should have received a copy of the GNU General Public License
* along with CommandStation. If not, see <https://www.gnu.org/licenses/>.
*/
#if __has_include ( "config.h")
#include "config.h"
#else
#include "config.example.h"
#endif
#include "DIAG.h"
#include "DCC.h"
#include "DCCWaveform.h"
@ -246,8 +253,17 @@ void DCC::setAccessory(int address, byte number, bool activate) {
return;
byte b[2];
b[0] = address % 64 + 128; // first byte is of the form 10AAAAAA, where AAAAAA represent 6 least signifcant bits of accessory address
b[1] = ((((address / 64) % 8) << 4) + (number % 4 << 1) + activate % 2) ^ 0xF8; // second byte is of the form 1AAACDDD, where C should be 1, and the least significant D represent activate/deactivate
// first byte is of the form 10AAAAAA, where AAAAAA represent 6 least signifcant bits of accessory address
b[0] = address % 64 + 128;
// second byte is of the form 1AAACDDD, where C should be 1, and the least significant D represent activate/deactivate
// if we follow RCN-213, activate has to be reversed because in DCC++/DCC-EX activate=1 is "thrown, diverging",
// but in RCN-213, 1 means "closed, straight" and 0 "thown, diverging"
#ifdef TURNOUTS_RCN_213
activate = !activate;
#else
#error fooo
#endif
b[1] = ((((address / 64) % 8) << 4) + (number % 4 << 1) + activate % 2) ^ 0xF8;
DCCWaveform::mainTrack.schedulePacket(b, 2, 4); // Repeat the packet four times
}

View File

@ -170,19 +170,18 @@ void WiThrottle::parse(RingStream * stream, byte * cmdx) {
StringFormatter::send(stream, F("HmTurnout %d created\n"),id);
}
switch (cmd[3]) {
// T and C according to RCN-213 where 0 is Stop, Red, Thrown, Diverging.
case 'T':
Turnout::setClosed(id,false);
break;
case 'C':
Turnout::setClosed(id,true);
break;
case '2':
Turnout::setClosed(id,!Turnout::isClosed(id));
break;
default :
Turnout::setClosed(id,true);
break;
case 'T':
Turnout::setClosed(id,false);
break;
case 'C':
Turnout::setClosed(id,true);
break;
case '2':
Turnout::setClosed(id,!Turnout::isClosed(id));
break;
default :
Turnout::setClosed(id,true);
break;
}
StringFormatter::send(stream, F("PTA%c%d\n"),Turnout::isClosed(id)?'2':'4',id );
}

View File

@ -129,4 +129,17 @@ The configuration file for DCC-EX Command Station
#define SCROLLMODE 1
/////////////////////////////////////////////////////////////////////////////////////
//
// DEFINE TURNOUTS/ACCESSORIES FOLLOW NORM RCN-213
//
// According to norm RCN-213 a DCC packet with an 1 is closed/straight
// and one with a 0 is thrown/diverging. This is reversed to the
// definition from DCC++ in the DCC++ protocol. To make the states
// match with the norm, we need to reverse the bit in the DCC packet
// on the rails, but we don't want to cause havoc on existent layouts,
// so we define this only for new installations. For any new install
// there is no reason to not define this.
#define TURNOUTS_RCN_213
/////////////////////////////////////////////////////////////////////////////////////