#9 fix interleved data length and add more tests

pull/32/head
Geoffrey Merck 4 years ago
parent eee1c223bc
commit 5fc9a90156

@ -168,7 +168,7 @@ void CSlowDataEncoder::buildInterleavedData()
if(m_headerData != nullptr) { if(m_headerData != nullptr) {
//append header dat in one block at the end //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){ else if(m_textData != nullptr && m_gpsData == nullptr && m_headerData != nullptr){
@ -189,7 +189,7 @@ unsigned int CSlowDataEncoder::getInterleavedDataLength()
//calculate size (including filler bytes); //calculate size (including filler bytes);
m_interleavedDataFullSize = 0U; m_interleavedDataFullSize = 0U;
if(m_textData) m_interleavedDataFullSize += TEXT_SIZE; 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; 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)); 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; return m_interleavedDataFullSize;

@ -17,6 +17,7 @@
*/ */
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <cstring>
#include "../../SlowDataEncoder.h" #include "../../SlowDataEncoder.h"
#include "../../DStarDefines.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) TEST_F(SlowDataEncoder_interleavedData, gpsAndTextData)
{ {
//here we only test for correct interleaving //here we only test for correct interleaving
@ -140,6 +645,9 @@ namespace SlowDataEncoderTests
CSlowDataEncoder encoder; CSlowDataEncoder encoder;
encoder.setGPSData("ABCDEFGHIJKLMN"); encoder.setGPSData("ABCDEFGHIJKLMN");
auto dataLen = encoder.getInterleavedDataLength();
EXPECT_EQ(dataLen, 60);
for(unsigned int testCount = 0U; testCount < 2U; testCount++) { for(unsigned int testCount = 0U; testCount < 2U; testCount++) {
unsigned char buffer[6U]; unsigned char buffer[6U];
@ -189,6 +697,9 @@ namespace SlowDataEncoderTests
CSlowDataEncoder encoder; CSlowDataEncoder encoder;
encoder.setTextData("ABCDEFG"); encoder.setTextData("ABCDEFG");
auto dataLen = encoder.getInterleavedDataLength();
EXPECT_EQ(dataLen, 60);
for(unsigned int testCount = 0U; testCount < 2U; testCount++) { for(unsigned int testCount = 0U; testCount < 2U; testCount++) {
unsigned char buffer[6U]; unsigned char buffer[6U];

Loading…
Cancel
Save

Powered by TurnKey Linux.