From 5a22b3d0a6310201882ffd2b6b00b7ce863a2107 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 20 Mar 2018 19:19:18 +0000 Subject: [PATCH] Rework the LICH parity. --- NXDNCRC.cpp | 30 ++++++++++++++++++++++++++++++ NXDNCRC.h | 4 ++++ NXDNLICH.cpp | 32 ++++++++++++-------------------- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/NXDNCRC.cpp b/NXDNCRC.cpp index 60278aeef..861ee7d1c 100644 --- a/NXDNCRC.cpp +++ b/NXDNCRC.cpp @@ -133,6 +133,25 @@ void CNXDNCRC::encodeCRC15(unsigned char* in, unsigned int length) } } +bool CNXDNCRC::checkLICHParity(unsigned char in) +{ + bool newParity = createLICHParity(in); + + bool oldParity = (in & 0x01U) == 0x01U; + + return newParity == oldParity; +} + +void CNXDNCRC::encodeLICHParity(unsigned char& in) +{ + bool parity = createLICHParity(in); + + if (parity) + in |= 0x01U; + else + in &= 0xFEU; +} + uint8_t CNXDNCRC::createCRC6(const unsigned char* in, unsigned int length) { uint8_t crc = 0x3FU; @@ -183,3 +202,14 @@ uint16_t CNXDNCRC::createCRC15(const unsigned char* in, unsigned int length) return crc & 0x7FFFU; } + +bool CNXDNCRC::createLICHParity(unsigned char in) +{ + switch (in & 0xF0U) { + case 0x80U: + case 0xB0U: + return true; + default: + return false; + } +} diff --git a/NXDNCRC.h b/NXDNCRC.h index 12e2e408c..97842a519 100644 --- a/NXDNCRC.h +++ b/NXDNCRC.h @@ -33,10 +33,14 @@ class CNXDNCRC static bool checkCRC15(const unsigned char* in, unsigned int length); static void encodeCRC15(unsigned char* in, unsigned int length); + static bool checkLICHParity(unsigned char in); + static void encodeLICHParity(unsigned char& in); + private: static uint8_t createCRC6(const unsigned char* in, unsigned int length); static uint16_t createCRC12(const unsigned char* in, unsigned int length); static uint16_t createCRC15(const unsigned char* in, unsigned int length); + static bool createLICHParity(unsigned char in); }; #endif diff --git a/NXDNLICH.cpp b/NXDNLICH.cpp index a61c72bb7..40a739217 100644 --- a/NXDNLICH.cpp +++ b/NXDNLICH.cpp @@ -18,6 +18,7 @@ #include "NXDNDefines.h" #include "NXDNLICH.h" +#include "NXDNCRC.h" #include #include @@ -50,37 +51,26 @@ bool CNXDNLICH::decode(const unsigned char* bytes) { assert(bytes != NULL); - bool b[8U]; - unsigned int offset1 = NXDN_FSW_LENGTH_BITS; - unsigned int offset2 = 7U; - for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset1 += 2U, offset2--) { - b[offset2] = READ_BIT1(bytes, offset1); - WRITE_BIT1(m_lich, i, b[offset2]); + unsigned int offset = NXDN_FSW_LENGTH_BITS; + for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset += 2U) { + bool b = READ_BIT1(bytes, offset); + WRITE_BIT1(m_lich, i, b); } - bool parity = b[7U] ^ b[6U] ^ b[5U] ^ b[4U]; - - if (parity != b[0U]) - return false; - - return true; + return CNXDNCRC::checkLICHParity(m_lich[0U]); } void CNXDNLICH::encode(unsigned char* bytes) { assert(bytes != NULL); - bool b[8U]; - unsigned int offset = 7U; - for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset--) - b[offset] = READ_BIT1(m_lich, i); - - b[0U] = b[7U] ^ b[6U] ^ b[5U] ^ b[4U]; + CNXDNCRC::encodeLICHParity(m_lich[0U]); unsigned int offset1 = NXDN_FSW_LENGTH_BITS; unsigned int offset2 = 7U; for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset2--) { - WRITE_BIT1(bytes, offset1, b[offset2]); + bool b = READ_BIT1(m_lich, offset2); + WRITE_BIT1(bytes, offset1, b); offset1++; WRITE_BIT1(bytes, offset1, true); offset1++; @@ -109,6 +99,8 @@ unsigned char CNXDNLICH::getDirection() const unsigned char CNXDNLICH::getRaw() const { + CNXDNCRC::encodeLICHParity(m_lich[0U]); + return m_lich[0U]; } @@ -127,7 +119,7 @@ void CNXDNLICH::setFCT(unsigned char usc) void CNXDNLICH::setOption(unsigned char option) { m_lich[0U] &= 0xF3U; - m_lich[0u] |= (option << 2) & 0x0CU; + m_lich[0U] |= (option << 2) & 0x0CU; } void CNXDNLICH::setDirection(unsigned char direction)