#pragma once #include #include namespace dsp { namespace meteor { class HRPTDemux : public generic_block { public: HRPTDemux() {} HRPTDemux(stream* in) { init(in); } void init(stream* in) { _in = in; generic_block::registerInput(_in); generic_block::registerOutput(&telemOut); generic_block::registerOutput(&BISMout); generic_block::registerOutput(&SSPDOut); generic_block::registerOutput(&MTVZAOut); generic_block::registerOutput(&MSUMROut); generic_block::_block_init = true; } void setInput(stream* in) { assert(generic_block::_block_init); std::lock_guard lck(generic_block::ctrlMtx); generic_block::tempStop(); generic_block::unregisterInput(_in); _in = in; generic_block::registerInput(_in); generic_block::tempStart(); } int run() { int count = _in->read(); if (count < 0) { return -1; } for (int i = 0; i < 4; i++) { memcpy(telemOut.writeBuf + (i * 2), _in->readBuf + 4 + (i * 256), 2); memcpy(BISMout.writeBuf + (i * 4), _in->readBuf + 4 + (i * 256) + 2, 4); memcpy(SSPDOut.writeBuf + (i * 4), _in->readBuf + 4 + (i * 256) + 6, 4); memcpy(MTVZAOut.writeBuf + (i * 8), _in->readBuf + 4 + (i * 256) + 10, 8); memcpy(MSUMROut.writeBuf + (i * 238), _in->readBuf + 4 + (i * 256) + 18, (i == 3) ? 234 : 238); } if (!telemOut.swap(8)) { return -1; } if (!BISMout.swap(16)) { return -1; } if (!SSPDOut.swap(16)) { return -1; } if (!MTVZAOut.swap(32)) { return -1; } if (!MSUMROut.swap(948)) { return -1; } _in->flush(); return count; } stream telemOut; stream BISMout; stream SSPDOut; stream MTVZAOut; stream MSUMROut; private: stream* _in; }; } }