#pragma once #include #include #include #include #define FRAGMENT_HEADER_MARKER 0xee1234ee typedef struct Header { uint32_t startOfHeaderMarker = FRAGMENT_HEADER_MARKER; uint32_t headerSize; uint32_t fragmentSize; uint32_t sourceIdentifier; uint32_t runNumber; uint32_t detectorEventNumber; uint32_t numberOfStatusElements; uint32_t *statusElementsArray; /*friend std::ostream& operator <<(std::ostream& os, Header const& header) { return os << std::setw(8) << std::setfill('0') << header.startOfHeaderMarker << '\n' << std::setw(8) << std::setfill('0') << header.headerSize << '\n' << std::setw(8) << std::setfill('0') << header.fragmentSize << '\n' << std::setw(8) << std::setfill('0') << header.runNumber << '\n' << std::setw(8) << std::setfill('0') << header.detectorEventNumber << '\n' << std::setw(8) << std::setfill('0') << header.numberOfStatusElements << '\n'; }*/ public: Header() : statusElementsArray(NULL) {} ~Header() { if (statusElementsArray != NULL) { delete [] statusElementsArray; } } } Header; typedef struct Fragment { Header header; uint32_t *payloadElements; public: Fragment() : header(), payloadElements(NULL) {} ~Fragment() { if (payloadElements != NULL) { delete [] payloadElements; } } } Fragment; enum ERROR_CODES { INCORRECT_ERROR = (1 << 0), CORRUPTED_ERROR = (1 << 1), MISSING_DATA_ERROR = (1 << 2), TIMEOUT_ERROR = (1 << 3) }; void encode_header(uint32_t *buffer, const Header &header) { buffer[0] = header.startOfHeaderMarker; buffer[1] = header.headerSize; buffer[2] = header.fragmentSize; buffer[3] = header.sourceIdentifier; buffer[4] = header.runNumber; buffer[5] = header.detectorEventNumber; buffer[6] = header.numberOfStatusElements; std::memcpy(&buffer[7], header.statusElementsArray, header.numberOfStatusElements * sizeof(uint32_t)); } void encode_fragment(uint32_t *buffer, const Fragment &fragment){ encode_header(buffer, fragment.header); std::memcpy(&buffer[fragment.header.headerSize], fragment.payloadElements, (fragment.header.fragmentSize - fragment.header.headerSize) * sizeof(uint32_t)); } uint32_t getDetectorEventNumber(uint32_t *buffer) { return buffer[5]; } void decode_fragment(uint32_t *buffer, Fragment &fragment) { fragment.header.startOfHeaderMarker = buffer[0]; fragment.header.headerSize = buffer[1]; fragment.header.fragmentSize = buffer[2]; fragment.header.sourceIdentifier = buffer[3]; fragment.header.runNumber = buffer[4]; fragment.header.detectorEventNumber = buffer[5]; fragment.header.numberOfStatusElements = buffer[6]; uint32_t nStatusElements = fragment.header.numberOfStatusElements; //printf("Status elements bitch: %d\n", nStatusElements); fragment.header.statusElementsArray = new uint32_t[nStatusElements]; for (int i = 1; i <= nStatusElements; i++) { fragment.header.statusElementsArray[i-1] = buffer[6+i]; } uint32_t payload_size = fragment.header.fragmentSize - fragment.header.headerSize; fragment.payloadElements = new uint32_t[payload_size]; for (int i = 1; i <= payload_size; i++) { fragment.payloadElements[i-1] = buffer[6+nStatusElements+i]; } } void printFragment(Fragment &fragment) { printf("NewFrag\n"); printf("0x%08x\n", fragment.header.startOfHeaderMarker); printf("0x%08x\n", fragment.header.headerSize); printf("0x%08x\n", fragment.header.fragmentSize); printf("0x%08x\n", fragment.header.sourceIdentifier); printf("0x%08x\n", fragment.header.runNumber); printf("0x%08x\n", fragment.header.detectorEventNumber); printf("0x%08x\n", fragment.header.numberOfStatusElements); for (uint32_t i = 0; i < fragment.header.numberOfStatusElements; i++) { printf("0x%08x\n", fragment.header.statusElementsArray[i]); } uint32_t payloadSize = fragment.header.fragmentSize - fragment.header.headerSize; for (uint32_t i = 0; i < payloadSize; i++) { printf("0x%08x\n", fragment.payloadElements[i]); } }