127 lines
4.2 KiB
C++
127 lines
4.2 KiB
C++
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstdio>
|
|
#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';
|
|
}*/
|
|
|
|
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]);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|