34 inline void add(
const uint8_t
byte) { mBytes.emplace_back(
byte); }
36 template <
class ITERATOR>
40 auto remaining = mMinimumSize - mBytes.size();
41 return add(it,
end, remaining);
43 template <
class ITERATOR>
44 bool add(ITERATOR& it,
const ITERATOR&
end)
47 auto remaining = mTotalSize - mBytes.size();
48 if (
add(it,
end, remaining)) {
49 if (mTotalSize == mMinimumSize) {
51 remaining = mTotalSize - mBytes.size();
53 return add(it,
end, remaining);
62 inline bool addCore(
size_t& idx, gsl::span<const uint8_t> payload,
size_t step) {
return add(idx, payload, mMinimumSize - mBytes.size(), step); }
64 bool add(
size_t& idx, gsl::span<const uint8_t> payload,
size_t step);
67 inline bool isZero(uint8_t
byte)
const {
return (mBytes.empty() && (
byte & raw::sSTARTBIT) == 0); }
70 inline bool isComplete()
const {
return mBytes.size() == mTotalSize; };
76 inline uint16_t
getCounter()
const {
return joinBytes(2); }
78 inline uint8_t
getId()
const {
return (mBytes[4] >> 4) & 0xF; }
80 inline uint8_t
getInputs()
const {
return (mBytes[4] & 0xF); }
82 inline uint8_t
getCrateId()
const {
return (mBytes[5] >> 4) & 0xF; }
83 uint16_t
getPattern(
int cathode,
int chamber)
const;
85 inline size_t getNBytes()
const {
return mBytes.size(); }
90 inline uint16_t joinBytes(
int idx)
const {
return (mBytes[idx] << 8 | mBytes[idx + 1]); };
91 template <
class ITERATOR>
92 bool add(ITERATOR& it,
const ITERATOR&
end,
size_t nBytes)
95 auto nToEnd = std::distance(it,
end);
96 auto nAdded = nBytes < nToEnd ? nBytes : nToEnd;
97 mBytes.insert(mBytes.end(), it, it + nAdded);
99 return (nAdded == nBytes);
102 bool add(
size_t& idx, gsl::span<const uint8_t> payload,
size_t nBytes,
size_t step);
106 size_t mMinimumSize{5};
107 size_t mMaximumSize{21};
108 std::vector<uint8_t> mBytes{};
109 size_t mTotalSize{mMinimumSize};