#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; } } 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 (shifter == ASM_SYNC) { // 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 (shifter == ASM_SYNC) { 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;