diff --git a/DCC.cpp b/DCC.cpp index e6b3c64..d103653 100644 --- a/DCC.cpp +++ b/DCC.cpp @@ -80,9 +80,30 @@ void DCC::setThrottle2( uint16_t cab, byte speedCode) { if (cab > 127) b[nB++] = highByte(cab) | 0xC0; // convert train number into a two-byte address b[nB++] = lowByte(cab); + +#ifdef USE_28_STEP + + uint8_t speed128 = speedCode & 0x7F; + uint8_t speed28; + uint8_t code28; + + if (speed128 == 0 || speed128 == 1) { // stop or emergency stop + code28 = speed128; + } else { + speed28= (speed128*10+36)/46; // convert 2-127 to 1-28 + code28 = (speed28+3)/2 + 16*(!(speed28 & 1)); // convert 1-28 to DCC 28 step speed code + } + // Construct command byte from: + // command speed direction + b[nB++] = 0b01000000 | code28 | (0b00100000 * (speedCode & 0x80)); + +#else + b[nB++] = SET_SPEED; // 128-step speed control byte b[nB++] = speedCode; // for encoding see setThrottle +#endif + DCCWaveform::mainTrack.schedulePacket(b, nB, 0); }