From 5fc9a90156d4de536a9a1397e11ed9169afcbce0 Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Thu, 13 Jan 2022 20:05:51 +0100 Subject: [PATCH] #9 fix interleved data length and add more tests --- SlowDataEncoder.cpp | 4 +- Tests/SlowDataEncoder/InterleavedData.cpp | 511 ++++++++++++++++++++++ 2 files changed, 513 insertions(+), 2 deletions(-) diff --git a/SlowDataEncoder.cpp b/SlowDataEncoder.cpp index a1aa75f..f519ee6 100644 --- a/SlowDataEncoder.cpp +++ b/SlowDataEncoder.cpp @@ -168,7 +168,7 @@ void CSlowDataEncoder::buildInterleavedData() if(m_headerData != nullptr) { //append header dat in one block at the end - ::memcpy(m_interleavedData + interleavedPtr, m_headerData, HEADER_SIZE); + ::memcpy(m_interleavedData + roundUpToMultipleOf(interleavedPtr, SLOW_DATA_FULL_BLOCK_SIZE), m_headerData, HEADER_SIZE); } } else if(m_textData != nullptr && m_gpsData == nullptr && m_headerData != nullptr){ @@ -189,7 +189,7 @@ unsigned int CSlowDataEncoder::getInterleavedDataLength() //calculate size (including filler bytes); m_interleavedDataFullSize = 0U; if(m_textData) m_interleavedDataFullSize += TEXT_SIZE; - if(m_headerData) m_interleavedDataFullSize += SLOW_DATA_BLOCK_SIZE; + if(m_headerData) m_interleavedDataFullSize += SLOW_DATA_FULL_BLOCK_SIZE; // the is because header data is transmitted as one contiguous block. Unused bytes fileld with 'f' if(m_gpsData) m_interleavedDataFullSize += m_gpsDataSize; m_interleavedDataFullSize = roundUpToMultipleOf(m_interleavedDataFullSize, SLOW_DATA_FULL_BLOCK_SIZE); //SLOW_DATA_FULL_BLOCK_SIZE * (1U + ((m_interleavedDataFullSize - 1U) / SLOW_DATA_FULL_BLOCK_SIZE)); return m_interleavedDataFullSize; diff --git a/Tests/SlowDataEncoder/InterleavedData.cpp b/Tests/SlowDataEncoder/InterleavedData.cpp index a9c79be..0651b15 100644 --- a/Tests/SlowDataEncoder/InterleavedData.cpp +++ b/Tests/SlowDataEncoder/InterleavedData.cpp @@ -17,6 +17,7 @@ */ #include +#include #include "../../SlowDataEncoder.h" #include "../../DStarDefines.h" @@ -27,6 +28,510 @@ namespace SlowDataEncoderTests }; + TEST_F(SlowDataEncoder_interleavedData, gpsAndHeaderData) + { + // Header is never interleaved, text and header are sent as two blocks + CHeaderData header; + unsigned char headerData[RADIO_HEADER_LENGTH_BYTES]; + ::memset(headerData, 'H', RADIO_HEADER_LENGTH_BYTES); + header.setData(headerData, RADIO_HEADER_LENGTH_BYTES, false); + + //here we only test for correct interleaving + CSlowDataEncoder encoder; + encoder.setGPSData("GGGGGGGG"); // 8 times G + encoder.setHeaderData(header); + + for(unsigned int i = 0U; i < 2U; i++) { + unsigned char buffer[6U]; + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'G'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x3U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + // all the remaining data shall be filled with 'f' until next block + for(unsigned int j = 12; j < 60U; j+= 6U) { + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + } + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_NE(buffer[5] ^ SCRAMBLER_BYTE3, 'f');// this is checksum byte, just make sure is is not 'f' + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x1U); + EXPECT_NE(buffer[1] ^ SCRAMBLER_BYTE2, 'f');// this is checksum byte, just make sure is is not 'f' + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + //remaining data is only 'f' + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + } + } + + TEST_F(SlowDataEncoder_interleavedData, textAndHeaderData) + { + // Header is never interleaved, text and header are sent as two blocks + CHeaderData header; + unsigned char headerData[RADIO_HEADER_LENGTH_BYTES]; + ::memset(headerData, 'H', RADIO_HEADER_LENGTH_BYTES); + header.setData(headerData, RADIO_HEADER_LENGTH_BYTES, false); + + //here we only test for correct interleaving + CSlowDataEncoder encoder; + encoder.setTextData("TTTTTT"); // 6 times T + encoder.setHeaderData(header); + + auto dataLen = encoder.getInterleavedDataLength(); + EXPECT_EQ(dataLen, 120); //2* 60 + + for(unsigned int testCount = 0U; testCount < 2U; testCount++) { + unsigned char buffer[6U]; + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x0U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'T'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'T'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'T'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x1U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x2U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x3U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + // all the remaining data shall be filled with 'f' until next block + for(unsigned int j = 24; j < 60U; j+= 6U) { + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + } + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_NE(buffer[5] ^ SCRAMBLER_BYTE3, 'f');// this is checksum byte, just make sure is is not 'f' + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x1U); + EXPECT_NE(buffer[1] ^ SCRAMBLER_BYTE2, 'f');// this is checksum byte, just make sure is is not 'f' + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + //remaining data is only 'f' + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + } + } + + TEST_F(SlowDataEncoder_interleavedData, gpsTextAndHeaderData) + { + CHeaderData header; + unsigned char headerData[RADIO_HEADER_LENGTH_BYTES]; + ::memset(headerData, 'H', RADIO_HEADER_LENGTH_BYTES); + header.setData(headerData, RADIO_HEADER_LENGTH_BYTES, false); + + //here we only test for correct interleaving + CSlowDataEncoder encoder; + encoder.setTextData("TTTTTT"); // 6 times T + encoder.setGPSData("GGGGGGGGGGGGGGGGGGGGGG"); // 22 times G + encoder.setHeaderData(header); + + auto dataLen = encoder.getInterleavedDataLength(); + + EXPECT_EQ(dataLen, 120);// including data type bytes we need 54 (20 + 5 + 22 + 6) bytes, this shall be rounded up to next block size multiple, in this case 60 + + for(unsigned int testCount = 0U; testCount < 2U; testCount++) { + unsigned char buffer[6U]; + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x0U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'T'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'T'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'T'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'G'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x1U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'T'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'G'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x2U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'G'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_TEXT | 0x3U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, ' '); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, ' '); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, ' '); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, ' '); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'G'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'G'); + + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_GPS | 0x2U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'G'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'G'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + // header is not interleaved, attached as one contiguous block, but it only starts at the nex block + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'H'); + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x5U); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'H'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'H'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'H'); + EXPECT_NE(buffer[5] ^ SCRAMBLER_BYTE3, 'f');// this is checksum byte, just make sure is is not 'f' + + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, SLOW_DATA_TYPE_HEADER | 0x1U); + EXPECT_NE(buffer[1] ^ SCRAMBLER_BYTE2, 'f');// this is checksum byte, just make sure is is not 'f' + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + + //remaining data is only 'f' + encoder.getInterleavedData(buffer); + encoder.getInterleavedData(buffer + 3); + EXPECT_EQ(buffer[0] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[1] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[2] ^ SCRAMBLER_BYTE3, 'f'); + EXPECT_EQ(buffer[3] ^ SCRAMBLER_BYTE1, 'f'); + EXPECT_EQ(buffer[4] ^ SCRAMBLER_BYTE2, 'f'); + EXPECT_EQ(buffer[5] ^ SCRAMBLER_BYTE3, 'f'); + } + } + TEST_F(SlowDataEncoder_interleavedData, gpsAndTextData) { //here we only test for correct interleaving @@ -139,6 +644,9 @@ namespace SlowDataEncoderTests { CSlowDataEncoder encoder; encoder.setGPSData("ABCDEFGHIJKLMN"); + + auto dataLen = encoder.getInterleavedDataLength(); + EXPECT_EQ(dataLen, 60); for(unsigned int testCount = 0U; testCount < 2U; testCount++) { unsigned char buffer[6U]; @@ -188,6 +696,9 @@ namespace SlowDataEncoderTests { CSlowDataEncoder encoder; encoder.setTextData("ABCDEFG"); + + auto dataLen = encoder.getInterleavedDataLength(); + EXPECT_EQ(dataLen, 60); for(unsigned int testCount = 0U; testCount < 2U; testCount++) { unsigned char buffer[6U];