SimpleEventBuilder/backup/fragment_dataformat.h

86 lines
2.9 KiB
C++

#pragma once
#include <cstddef>
#include <cstdint>
#include <cstring>
#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';
}*/
} Header;
typedef struct Fragment {
Header header;
uint32_t *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));
}
Fragment 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;
fragment.header.statusElementsArray = new uint32_t[nStatusElements];
for (int i = 1; i <= nStatusElements; i++) {
fragment.header.statusElementsArray[6+i] = 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[6+nStatusElements+i] = buffer[6+nStatusElements+i];
}
return fragment;
}