#include "simpledeframer.h" #include // Returns the asked bit! template inline bool getBit(T &data, int &bit) { return (data >> bit) & 1; } template SimpleDeframer::SimpleDeframer() { // Default values writeFrame = false; wroteBits = 0; outputBits = 0; } // Write a single bit into the frame template void SimpleDeframer::pushBit(uint8_t bit) { byteBuffer = (byteBuffer << 1) | bit; wroteBits++; if (wroteBits == 8) { frameBuffer.push_back(byteBuffer); wroteBits = 0; } } // Compare 2 32-bits values bit per bit template int checkSyncMarker(T marker, T &totest, int size, int max) { int errors = 0; for (int i = size; i >= 0; i--) { bool markerBit, testBit; markerBit = getBit(marker, i); testBit = getBit(totest, i); if (markerBit != testBit) errors++; if (errors >= max) return errors; } return errors; } template std::vector> SimpleDeframer::work(std::vector &data) { // Output buffer std::vector> framesOut; // Loop in all bytes for (uint8_t &byte : data) { // Loop in all bits! for (int i = 7; i >= 0; i--) { // Get a bit, push it uint8_t bit = getBit(byte, i); if (sizeof(SYNC_T) * 8 != SYNC_SIZE) shifter = ((shifter << 1) % (long)pow(2, SYNC_SIZE)) | bit; else shifter = (shifter << 1) | bit; // Writing a frame! if (writeFrame) { // First run : push header if (outputBits == 0) { SYNC_T syncAsm = ASM_SYNC; for (int y = SYNC_SIZE - 1; y >= 0; y--) { pushBit(getBit(syncAsm, y)); outputBits++; } } // New ASM, ABORT! and process the new one if (chk_size == 0 ? shifter == ASM_SYNC : checkSyncMarker(ASM_SYNC, shifter, SYNC_SIZE - 1, chk_size) < chk_size) { // Fill up what we're missing for (int b = 0; b < FRAME_SIZE - outputBits; b++) pushBit(0); writeFrame = false; wroteBits = 0; outputBits = 0; framesOut.push_back(frameBuffer); frameBuffer.clear(); writeFrame = true; continue; } // Push current bit pushBit(bit); outputBits++; // Once we wrote a frame, exit! if (outputBits == FRAME_SIZE) { writeFrame = false; wroteBits = 0; outputBits = 0; framesOut.push_back(frameBuffer); frameBuffer.clear(); } continue; } // Otherwise search for markers if (chk_size == 0 ? shifter == ASM_SYNC : checkSyncMarker(ASM_SYNC, shifter, SYNC_SIZE - 1, chk_size) < chk_size) { writeFrame = true; } } } // Output what we found if anything return framesOut; } // Build this template for MSU-MR data template class SimpleDeframer; // Build this template for TLM data template class SimpleDeframer; // Build this template for BIS-M data template class SimpleDeframer; // Build this template for MTVZA data template class SimpleDeframer; // Build this template for SSPD data template class SimpleDeframer;