BmnRoot
Loading...
Searching...
No Matches
StsXyterMessage.h
Go to the documentation of this file.
1/* Copyright (C) 2017-2020 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
5/************************************************************
6 *
7 ************************************************************/
8
9#ifndef STSXYTERMESSAGE_H
10#define STSXYTERMESSAGE_H
11
12// C/C++ headers
13#include <cstdint>
14#include <iostream>
15
16// #include <xpu/device.h>
17
18namespace stsxyter
19{
20
21// tools: Use to this allow bitwise operations on C++11 enums
22// This needs to be included in the same namespace to work...
23#include "bitmask_operators.h"
24
27struct MessField
28{
29 uint16_t fusPos;
30 uint16_t fusLen;
31
32 constexpr MessField(uint16_t usPos, uint16_t usLen)
33 : fusPos(usPos)
34 , fusLen(usLen) {};
35};
37enum class MessType : uint16_t
38{
39 Dummy,
40 Hit,
41 TsMsb,
42 Epoch,
43 Status,
44 Empty,
46};
47
49enum class MessSubType : uint16_t
50{
51 TsMsb = 0,
52 Epoch = 1,
53 Status = 2,
54 Empty = 3
55};
57enum class MessagePrintMask : uint16_t
58{
59 msg_print_Prefix = (0x1 << 0),
60 msg_print_Data = (0x1 << 1),
61 msg_print_Hex = (0x1 << 2),
62 msg_print_Human = (0x1 << 3)
63};
66enum class MsErrorFlags : uint16_t
67{
68 MsErrOutFifoAlmostFull = (0x1 << 0),
69 MsErrOutFifoOverflow = (0x1 << 1),
70 MsErrTimeoutBinReadout = (0x1 << 2),
71 MsErrBinOverflow = (0x1 << 3)
72};
73
75static constexpr uint16_t kusPosNotHitFlag = 31;
76static constexpr uint16_t kusPosLinkIndex = 22;
77// Hit message
78static constexpr uint16_t kusPosHitChannel = 15;
79static constexpr uint16_t kusPosHitAdc = 10;
80static constexpr uint16_t kusPosHitTsOver = 9;
81static constexpr uint16_t kusPosHitTs = 1;
82static constexpr uint16_t kusPosHitEmFlag = 0;
83// Non-hit messages
84static constexpr uint16_t kusPosSubtype = 29;
85// TS_MSB message
86static constexpr uint16_t kusPosTsMsbVal = 0;
87// Epoch
88static constexpr uint16_t kusPosEpochVal = 0;
89// Status
90static constexpr uint16_t kusPosStatLinkId = 20;
91static constexpr uint16_t kusPosStatSxTs = 14;
92static constexpr uint16_t kusPosStatStatus = 10;
93static constexpr uint16_t kusPosStatDpbTs = 1;
94static constexpr uint16_t kusPosStatCpFlag = 0;
95// Empty/End of MS
96static constexpr uint16_t kusPosEmptyFlag = 28;
97static constexpr uint16_t kusPosMsErrType = 1;
98static constexpr uint16_t kusPosMsErrFlag = 0;
99
101static constexpr uint16_t kusLenNotHitFlag = 1;
102static constexpr uint16_t kusLenLinkIndex = 9;
103// Hit message
104static constexpr uint16_t kusLenHitChannel = 7;
105static constexpr uint16_t kusLenHitAdc = 5;
106static constexpr uint16_t kusLenHitTsFull = 9; // Includes 1 bit overlap with TS message ?
107static constexpr uint16_t kusLenHitTsOver = 0; // 0 bit overlap with TS message
108static constexpr uint16_t kusLenHitTs = 9; // No overlap in this version of FW
109static constexpr uint16_t kusLenHitEmFlag = 1;
110// Other message
111static constexpr uint16_t kusLenSubtype = 2;
112// TS_MSB message
113static constexpr uint16_t kusLenTsMsbVal = 22;
114static constexpr uint16_t kusLenTsMsbValBinning = 29;
115// Epoch
116static constexpr uint16_t kusLenEpochVal = 29;
117// Status
118static constexpr uint16_t kusLenStatLinkId = 9;
119static constexpr uint16_t kusLenStatSxTs = 6;
120static constexpr uint16_t kusLenStatStatus = 4;
121static constexpr uint16_t kusLenStatDpbTs = 9;
122static constexpr uint16_t kusLenStatCpFlag = 1;
123// Empty/End of MS
124static constexpr uint16_t kusLenEmptyFlag = 1;
125static constexpr uint16_t kusLenMsErrType = 4;
126static constexpr uint16_t kusLenMsErrFlag = 1;
127
129static constexpr MessField kFieldLinkIndex(kusPosLinkIndex, kusLenLinkIndex);
130static constexpr MessField kFieldNotHitFlag(kusPosNotHitFlag, kusLenNotHitFlag);
131// Hit message
132static constexpr MessField kFieldHitChannel(kusPosHitChannel, kusLenHitChannel);
133static constexpr MessField kFieldHitAdc(kusPosHitAdc, kusLenHitAdc);
134static constexpr MessField kFieldHitTsFull(kusPosHitTs, kusLenHitTsFull);
135static constexpr MessField kFieldHitTsOver(kusPosHitTsOver, kusLenHitTsOver);
136static constexpr MessField kFieldHitTs(kusPosHitTs, kusLenHitTs);
137static constexpr MessField kFieldHitEmFlag(kusPosHitEmFlag, kusLenHitEmFlag);
138// Non-hit messages
139static constexpr MessField kFieldSubtype(kusPosSubtype, kusLenSubtype);
140// TS_MSB message
141static constexpr MessField kFieldTsMsbVal(kusPosTsMsbVal, kusLenTsMsbVal);
142static constexpr MessField kFieldTsMsbValBinning(kusPosTsMsbVal, kusLenTsMsbValBinning);
143// Epoch message
144static constexpr MessField kFieldEpochVal(kusPosEpochVal, kusLenEpochVal);
145// Status
146static constexpr MessField kFieldStatLinkId(kusPosStatLinkId, kusLenStatLinkId);
147static constexpr MessField kFieldStatSxTs(kusPosStatSxTs, kusLenStatSxTs);
148static constexpr MessField kFieldStatStatus(kusPosStatStatus, kusLenStatStatus);
149static constexpr MessField kFieldStatDpbTs(kusPosStatDpbTs, kusLenStatDpbTs);
150static constexpr MessField kFieldStatCpFlag(kusPosStatCpFlag, kusLenStatCpFlag);
151// Empty/End of MS
152static constexpr MessField kFieldEmptyFlag(kusPosEmptyFlag, kusLenEmptyFlag);
153static constexpr MessField kFieldMsErrFlag(kusPosMsErrFlag, kusLenMsErrFlag);
154static constexpr MessField kFieldMsErrType(kusPosMsErrType, kusLenMsErrType);
155
157static constexpr uint32_t kuHitNbAdcBins = (0 < kusLenHitAdc ? 1 << kusLenHitAdc : 0);
158static constexpr uint32_t kuHitNbTsBins = (0 < kusLenHitTs ? 1 << kusLenHitTs : 0);
159static constexpr uint32_t kuHitNbOverBins = (0 < kusLenHitTsOver ? 1 << kusLenHitTsOver : 0);
160static constexpr uint32_t kuTsMsbNbTsBins = (0 < kusLenTsMsbVal ? 1 << kusLenTsMsbVal : 0);
161static constexpr uint64_t kulTsCycleNbBins =
162 static_cast<uint64_t>(kuTsMsbNbTsBins) * static_cast<uint64_t>(kuHitNbTsBins);
163static constexpr uint16_t kusMaskTsMsbOver = (1 << kusLenHitTsOver) - 1;
164static constexpr uint32_t kulClockCycleNom = 25;
165static constexpr uint32_t kulClockCycleDen = 8;
166static constexpr double kdClockCycleNs = static_cast<double>(kulClockCycleNom) / kulClockCycleDen; // ns, not rounded
167
168// Binning FW adds 1 bit to TS in HIT message => Quick and dirty hack is a factor 2!!!
169static constexpr uint32_t kuHitNbTsBinsBinning = 1 << 10;
170static constexpr uint32_t kuTsMsbNbTsBinsBinning = 1 << kusLenTsMsbValBinning;
171static constexpr uint64_t kulTsCycleNbBinsBinning =
172 static_cast<uint64_t>(kuTsMsbNbTsBinsBinning) * static_cast<uint64_t>(kuHitNbTsBinsBinning);
173
174class Message
175{
176 private:
177 protected:
178 uint32_t fuData; // main and only storage field for the message
179
180 public:
182 : fuData(0)
183 {}
184
185 Message(const Message& src)
186 : fuData(src.fuData)
187 {}
188
189 Message(uint32_t uDataIn)
190 : fuData(uDataIn)
191 {}
192
194
195 void assign(const Message& src) { fuData = src.fuData; }
196
198 {
199 assign(src);
200 return *this;
201 }
202
203 inline void reset() { fuData = 0; }
204
205 // --------------------------- Accessors ---------------------------------
206 inline uint32_t GetData() const { return fuData; }
207 inline void SetData(uint32_t uValue) { fuData = uValue; }
208
209 inline uint32_t GetField(uint32_t uShift, uint32_t uLen) const
210 {
211 return (fuData >> uShift) & (((static_cast<uint32_t>(1)) << uLen) - 1);
212 }
213
214 inline uint8_t GetBit(uint32_t uShift) const { return (fuData >> uShift) & 1; }
215
216 inline uint32_t GetFieldBE(uint32_t uShift, uint32_t uLen) const
217 {
218 return (DataBE() >> uShift) & (((static_cast<uint32_t>(1)) << uLen) - 1);
219 }
220 inline uint8_t GetBitBE(uint32_t uShift) const { return (DataBE() >> uShift) & 1; }
221 inline uint32_t DataBE() const
222 {
223 return ((fuData & 0x000000FF) << 24) + ((fuData & 0x0000FF00) << 8) + ((fuData >> 8) & 0x0000FF00)
224 + ((fuData >> 24) & 0x000000FF);
225 }
226
227 // --------------------------- Setters ---------------------------------------
228 inline void SetField(uint32_t uShift, uint32_t uLen, uint32_t uValue)
229 {
230 fuData = (fuData & ~((((static_cast<uint32_t>(1)) << uLen) - 1) << uShift))
231 | ((static_cast<uint64_t>(uValue)) << uShift);
232 }
233
234 inline void SetBit(uint32_t uShift, uint8_t uValue)
235 {
236 fuData = uValue ? (fuData | ((static_cast<uint32_t>(1)) << uShift))
237 : (fuData & ~((static_cast<uint32_t>(1)) << uShift));
238 }
239
240 // --------------------------- Simplified Acc_or/Setters ---------------------
241 inline uint32_t GetField(MessField field) const { return GetField(field.fusPos, field.fusLen); }
242 inline uint8_t GetBit(MessField field) const { return GetBit(field.fusPos); }
243 inline bool GetFlag(MessField field) const { return (1 == GetBit(field.fusPos)); }
244 inline uint32_t GetFieldBE(MessField field) const { return GetFieldBE(field.fusPos, field.fusLen); }
245 inline uint8_t GetBitBE(MessField field) const { return GetBitBE(field.fusPos); }
246
247 inline void SetField(MessField field, uint32_t uValue) { SetField(field.fusPos, field.fusLen, uValue); }
248 inline void SetBit(MessField field, uint8_t ucValue) { SetBit(field.fusPos, ucValue); }
249
250 // --------------------------- common fields ---------------------------------
252 inline uint16_t GetLinkIndex() const { return GetField(kFieldLinkIndex); }
254 inline bool IsHit() const { return !GetFlag(kFieldNotHitFlag); }
256 inline bool IsDummy() const { return IsHit() && (0 == GetHitAdc()); }
258 inline bool IsTsMsb() const { return (!IsHit() && MessSubType::TsMsb == GetSubType()); }
260 inline MessType GetMessType() const
261 {
262 return !GetFlag(kFieldNotHitFlag)
271 }
272
273 // ------------------------ Hit message fields -------------------------------
275 inline uint16_t GetHitChannel() const { return GetField(kFieldHitChannel); }
276
278 inline uint16_t GetHitAdc() const { return GetField(kFieldHitAdc); }
279
281 inline uint16_t GetHitTimeFull() const { return GetField(kFieldHitTsFull); }
282
284 inline uint16_t GetHitTimeOver() const { return GetField(kFieldHitTsOver); }
285
287 inline uint16_t GetHitTime() const { return GetField(kFieldHitTs); }
288
291 inline uint16_t GetHitTimeBinning() const
292 {
293 return ((static_cast<uint16_t>(GetBit(30)) << 9) + GetField(kFieldHitTs));
294 }
295
298 inline uint16_t GetLinkIndexHitBinning() const { return GetField(kFieldLinkIndex) & 0x3F; }
299
301 inline bool IsHitMissedEvts() const { return GetFlag(kFieldHitEmFlag); }
302
304 inline void SetHitChannel(uint16_t usVal) { SetField(kFieldHitChannel, usVal); }
305
307 inline void SetHitAdc(uint16_t usVal) { SetField(kFieldHitAdc, usVal); }
308
310 inline void SetHitTimeFull(uint16_t usVal) { SetField(kFieldHitTsFull, usVal); }
311
313 inline void SetHitTimeOver(uint16_t usVal) { SetField(kFieldHitTsOver, usVal); }
314
316 inline void SetHitTime(uint16_t usVal) { SetField(kFieldHitTs, usVal); }
317
319 inline void SetHitMissEvtsFlag(bool bVal) { SetBit(kFieldHitEmFlag, bVal); }
320
321 // ----------------------- Non-Hit message fields ----------------------------
323 // inline MessSubType GetSubType() const { return static_cast< uint16_t >( GetField( kFieldSubtype ) ); }
325 {
326 switch (GetField(kFieldSubtype)) {
327 case static_cast<uint16_t>(MessSubType::TsMsb):
328 return MessSubType::TsMsb;
329 case static_cast<uint16_t>(MessSubType::Epoch):
330 return MessSubType::Epoch;
331 case static_cast<uint16_t>(MessSubType::Status):
332 return MessSubType::Status;
333 default:
334 return MessSubType::Empty;
335 } // switch( static_cast< uint16_t>( GetField( kFieldSubtype ) ) )
336 }
337
338 // ------------------------ TS_MSB message fields ----------------------------
340 inline uint32_t GetTsMsbVal() const { return GetField(kFieldTsMsbVal); }
341
343 inline uint32_t GetTsMsbValBinning() const { return GetField(kFieldTsMsbValBinning); }
344
346 inline void SetTsMsbVal(uint32_t uVal) { SetField(kFieldTsMsbVal, uVal); }
347
348 // ------------------------ Epoch message fields -----------------------------
350 inline uint32_t GetEpochVal() const { return GetField(kFieldEpochVal); }
351
353 inline void SetEpochVal(uint32_t uVal) { SetField(kFieldEpochVal, uVal); }
354
355 // ------------------------ Status message fields ----------------------------
357 inline uint16_t GetStatusLink() const { return GetField(kFieldStatLinkId); }
358
360 inline uint16_t GetStatusSxTs() const { return GetField(kFieldStatSxTs); }
361
363 inline uint16_t GetStatusStatus() const { return GetField(kFieldStatStatus); }
364
366 inline uint16_t GetStatusDpbTs() const { return GetField(kFieldStatDpbTs); }
367
369 inline bool IsCpFlagOn() const { return GetField(kFieldStatCpFlag); }
370
372 inline void SetStatusLink(uint16_t usVal) { SetField(kFieldStatLinkId, usVal); }
373
375 inline void SetStatusSxTs(uint16_t usVal) { SetField(kFieldStatSxTs, usVal); }
376
378 inline void SetStatusStatus(uint16_t usVal) { SetField(kFieldStatStatus, usVal); }
379
381 inline void SetStatusDpbTs(uint16_t usVal) { SetField(kFieldStatDpbTs, usVal); }
382
384 inline void SetCpFlag(bool bVal) { SetField(kFieldStatCpFlag, bVal); }
385
386 // -------------------- Empty/End of MS message fields -----------------------
388 inline bool IsEmptyMsg() const { return GetField(kFieldEmptyFlag); }
389
391 inline bool IsMsErrorFlagOn() const { return GetField(kFieldMsErrFlag); }
392
394 inline uint16_t GetMsErrorType() const { return GetField(kFieldMsErrType); }
395
397 inline void SetEmptyMsgFlag(bool bVal) { SetField(kFieldEmptyFlag, bVal); }
398
400 inline void SetMsErrorFlag(bool bVal) { SetField(kFieldMsErrFlag, bVal); }
401
403 inline void SetMsErrorType(uint16_t usVal) { SetField(kFieldMsErrType, usVal); }
404
405 // ------------------------ General OP ---------------------------------------
406 bool PrintMess(std::ostream& os,
408 bool bBinning = true) const;
409
410 static std::string PrintMessType(MessType type);
411};
412} // namespace stsxyter
413#endif // STSXYTERMESSAGE_H
uint16_t GetLinkIndex() const
For all data: Returns the (global) index of the eLink on which the message was received (n bit field)
bool IsCpFlagOn() const
For Status data: Returns the CP flag from ACK frame (1 bit field)
uint32_t GetTsMsbValBinning() const
For TS MSB data: Returns the TS MSB 29 bit field)
bool IsTsMsb() const
Check if the message if a Ts_Msb.
void SetHitTimeOver(uint16_t usVal)
For Hit data: Sets timestamp overlap bits (2 bits field, overlap with 2 LSBs of TS_MSB message)
bool IsDummy() const
Check if the message if a Dummy Hit Message.
uint8_t GetBitBE(MessField field) const
void SetField(MessField field, uint32_t uValue)
Message(uint32_t uDataIn)
bool IsMsErrorFlagOn() const
For End of MS data: Returns the MS error flag (1 bit field)
void SetTsMsbVal(uint32_t uVal)
For TS MSB data: Sets the TS MSB (22 bit field)
uint32_t DataBE() const
uint16_t GetHitTimeFull() const
For Hit data: Returns Full timestamp (10 bit field including 2 bits overlap)
uint16_t GetStatusLink() const
For Status data: Returns the Link Inedx (9 bit field)
uint32_t GetTsMsbVal() const
For TS MSB data: Returns the TS MSB 22 bit field)
uint16_t GetHitAdc() const
For Hit data: Returns ADC value (5 bit field)
void SetHitTimeFull(uint16_t usVal)
For Hit data: Sets Full timestamp (10 bit field including 2 bits overlap)
uint32_t GetField(MessField field) const
void assign(const Message &src)
uint16_t GetLinkIndexHitBinning() const
void SetHitAdc(uint16_t usVal)
For Hit data: Sets ADC value (5 bit field)
static std::string PrintMessType(MessType type)
bool GetFlag(MessField field) const
void SetHitChannel(uint16_t usVal)
For Hit data: Sets StsXYTER channel number (7 bit field)
uint16_t GetHitTimeBinning() const
uint16_t GetStatusStatus() const
For Status data: Returns the Status field from ACK frame (4 bit field)
void SetCpFlag(bool bVal)
For Status data: Sets the Status (1 bit field)
void SetEmptyMsgFlag(bool bVal)
For Empty/End of MS data data: Sets the Empty message flag (1 bit field)
uint8_t GetBit(uint32_t uShift) const
MessSubType GetSubType() const
For non-Hit data: Returns subtype (2 bit field)
void SetStatusLink(uint16_t usVal)
For Status data: Sets the Status (9 bit field)
Message(const Message &src)
void SetHitMissEvtsFlag(bool bVal)
For Hit data: Sets Missed event flag (1 bit field)
Message & operator=(const Message &src)
void SetBit(uint32_t uShift, uint8_t uValue)
void SetMsErrorType(uint16_t usVal)
For End of MS data: Sets the MS error type field (2 bit field)
uint8_t GetBit(MessField field) const
uint32_t GetFieldBE(uint32_t uShift, uint32_t uLen) const
void SetStatusDpbTs(uint16_t usVal)
For Status data: Sets the Status (9 bit field)
void SetEpochVal(uint32_t uVal)
For Epoch data: Sets the Epoch (29 bit field)
void SetData(uint32_t uValue)
uint32_t GetEpochVal() const
For Epoch data: Returns the Epoch (29 bit field)
uint16_t GetHitChannel() const
For Hit data: Returns StsXYTER channel number (7 bit field)
bool IsHit() const
Check if the message if a Hit Message.
uint32_t GetField(uint32_t uShift, uint32_t uLen) const
void SetStatusStatus(uint16_t usVal)
For Status data: Sets the Status (4 bit field)
void SetMsErrorFlag(bool bVal)
For End of MS data data: Sets the MS Error flag (1 bit field)
void SetHitTime(uint16_t usVal)
For Hit data: Sets Full timestamp (8 bit field, 2 MSB bits overlap removed)
MessType GetMessType() const
Returns the message type, see enum MessType.
bool IsEmptyMsg() const
For Empty/End of MS data: Check if this is an empty message (1 bit field)
bool PrintMess(std::ostream &os, MessagePrintMask ctrl=MessagePrintMask::msg_print_Human, bool bBinning=true) const
uint16_t GetMsErrorType() const
For End of MS data: Returns the MS error type field (2 bit field)
uint16_t GetStatusSxTs() const
For Status data: Returns the SMX TS from ACK frame (6 bit field)
uint32_t GetFieldBE(MessField field) const
uint16_t GetHitTime() const
For Hit data: Returns timestamp (8 bit field, 2 MSB bits overlap removed)
uint16_t GetHitTimeOver() const
For Hit data: Returns timestamp overlap bits (2 bits field, overlap with 2 LSBs of TS_MSB message)
uint16_t GetStatusDpbTs() const
For Status data: Returns the DPB TS when frame received (9 bit field)
void SetBit(MessField field, uint8_t ucValue)
uint8_t GetBitBE(uint32_t uShift) const
void SetStatusSxTs(uint16_t usVal)
For Status data: Sets the Status (6 bit field)
bool IsHitMissedEvts() const
For Hit data: Returns Missed event flag (1 bit field)
void SetField(uint32_t uShift, uint32_t uLen, uint32_t uValue)
uint32_t GetData() const
#define ENABLE_BITMASK_OPERATORS(x)
MsErrorFlags
MS error flags.
MessagePrintMask
Printout control.
MessSubType
Non-hit Message sub-types.
MessType
Message types.
uint16_t fusLen
Start bit index.
constexpr MessField(uint16_t usPos, uint16_t usLen)
Field length.