DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
WIB.hh
Go to the documentation of this file.
1#ifndef __WIB_HH__
2#define __WIB_HH__
3
5#include <stdint.h>
6
7// Keeps artDAQ from complaining about __int128
8// not being in C++ standard
9#ifdef __GNUC__
10#pragma GCC diagnostic push
11#pragma GCC diagnostic ignored "-Wpedantic"
12#endif
13
14typedef unsigned __int128 uint128_t;
15
16#ifdef __GNUC__
17#pragma GCC diagnostic pop
18#endif
19
21 data_8b10b_t(uint8_t _k, uint8_t _d){k=_k;data=_d;}
22 bool k;
23 uint8_t data;
24};
25
26class WIB: public WIBBase {
27 public:
28 WIB(std::string const & address, std::string const & WIBAddressTable = "WIB.adt", std::string const & FEMBAddressTable = "FEMB.adt", bool fullStart=true);
29 ~WIB();
30
31 //To be used only within the DIM server, if the WIB is initially down
32 void FullStart();
33 bool started;
34
35 //initialize hardware
36 void InitializeWIB();
37 void ResetWIB(bool reset_udp=false);
38 void InitializeDTS(uint8_t PDTSsource = 0,uint8_t clockSource = 0, uint32_t PDTSAlignment_timeout = 0 /*default infinite*/);
39 void EnableDAQLink(uint8_t iDAQLink);
40 void EnableDAQLink_Lite(uint8_t iDAQLink,uint8_t enable);
41 void StartSyncDTS();
42 void ResetWIBAndCfgDTS(uint8_t localClock,uint8_t PDTS_TGRP, uint8_t PDTSsource = 0, uint32_t PDTSAlignment_timeout = 0);
43 void CheckedResetWIBAndCfgDTS(uint8_t localClock,uint8_t PDTS_TGRP, uint8_t PDTSsource = 0, uint32_t PDTSAlignment_timeout = 0);
44 void StartStreamToDAQ(bool l1=true, bool l2=true, bool l3=false, bool l4=false);
45 void PDTSInRunningState();
46
47 void EnableFEMBCNC();
48 void DisableFEMBCNC();
49 void FEMBPower(uint8_t iFEMB,bool turnOn);
50 void SourceFEMB(uint64_t iDAQLink,uint64_t real);
51
52 //Event builder control
53 void StartEventBuilder(uint8_t mask = 0xF);
54 void StopEventBuilder(uint8_t mask = 0xF);
55
56 //QSFP
57 void WriteQSFP(uint16_t address,uint32_t value,uint8_t byte_count);
58 uint32_t ReadQSFP(uint16_t address,uint8_t byte_count);
59
60 //DTS CDS
61 void WriteDTS_CDS(uint16_t address,uint32_t value,uint8_t byte_count = 4,bool ignore_error = false);
62 uint32_t ReadDTS_CDS(uint16_t address,uint8_t byte_count = 4);
63 float ConfigureDTSCDS(uint8_t source = 0);
64
65 //DTS SI5344
66 void WriteDTS_SI5344(uint16_t address,uint32_t value,uint8_t byte_count = 4);
67 uint32_t ReadDTS_SI5344(uint16_t address,uint8_t byte_count = 4);
68 void SetDTS_SI5344Page(uint8_t page);
69 uint8_t GetDTS_SI5344Page();
70 uint8_t GetDTS_SI5344AddressPage(uint16_t address);
71 void LoadConfigDTS_SI5344(std::string const & fileName);
72 void ResetSi5344();
73 void SelectSI5344(uint64_t input, bool enable);
74 void SelectSI5342(uint64_t input, bool enable);
75
76 //DAQ SI5342
77 void WriteDAQ_SI5342(uint16_t address,uint32_t value,uint8_t byte_count = 4);
78 uint32_t ReadDAQ_SI5342(uint16_t address,uint8_t byte_count = 4);
79 void SetDAQ_SI5342Page(uint8_t page);
80 uint8_t GetDAQ_SI5342Page();
81 uint8_t GetDAQ_SI5342AddressPage(uint16_t address);
82 void LoadConfigDAQ_SI5342(std::string const & fileName);
83 void ResetSi5342();
84
85 //History debug
86 std::vector<uint32_t> CaptureHistory(std::string const & address);
87 std::vector<uint128_t> CaptureHistory(std::string const & address,size_t wordCount);
88
89 //Local FLASH
90 uint32_t ReadLocalFlash(uint16_t address);
91 std::vector<uint32_t> ReadLocalFlash(uint16_t address,size_t n);
92 void WriteLocalFlash(uint16_t address,uint32_t data);
93 void WriteLocalFlash(uint16_t address,std::vector<uint32_t> const & data);
94
95
96 //Flash
97 void FlashCheckBusy();
98 void ReadFlash(std::string const & fileName,uint8_t update_percentage = 101);
99 void WriteFlash(std::vector<uint32_t> data,uint8_t update_percentage = 101);
100 void ProgramFlash(std::string const & fileName,uint8_t update_percentage = 101);
101 void EraseFlash(bool print_updates =false);
102 void CheckFlash(std::vector<uint32_t> data,uint8_t update_percentage = 101);
103
104 //CD link spy buffer
105 std::vector<data_8b10b_t> ReadOutCDLinkSpyBuffer();
106
107 //Event builder spy buffer
108 std::vector<data_8b10b_t> ReadDAQLinkSpyBuffer(uint8_t iDAQLink, uint8_t trigger_mode = 0);
109
110 //FEMB Configuration
111
116 void SetupFEMBExtClock(uint8_t iFEMB);
117
118 //config_phase from shanshan's scripts
119 void WriteFEMBPhase(uint8_t iFEMB, uint16_t clk_phase_data);
120 bool TryFEMBPhases(uint8_t iFEMB, std::vector<uint16_t> phases);
121 bool HuntFEMBPhase(uint8_t iFEMB, uint16_t clk_phase_data_start);
122
146 void ConfigFEMB(uint8_t iFEMB, std::vector<uint32_t> fe_config, std::vector<uint16_t> clk_phases,
147 uint8_t pls_mode=0, uint8_t pls_dac_val=0, uint8_t start_frame_mode_sel=1, uint8_t start_frame_swap=1);
157 void ConfigFEMBFakeData(uint8_t iFEMB, uint8_t fake_mode, uint32_t fake_word, uint8_t femb_number,
158 std::vector<uint32_t> fake_samples, uint8_t start_frame_mode_sel=1, uint8_t start_frame_swap=1);
159 void ConfigFEMBMode(uint8_t iFEMB, uint32_t pls_cs, uint32_t dac_sel, uint32_t fpga_dac, uint32_t asic_dac, uint32_t mon_cs);
177 uint16_t SetupFEMBASICs(uint8_t iFEMB, uint8_t gain, uint8_t shape, uint8_t highBaseline,
178 bool highLeakage, bool leakagex10, bool acCoupling, bool buffer, bool useExtClock,
179 uint8_t internalDACControl, uint8_t internalDACValue);
180
181 void SetupFPGAPulser(uint8_t iFEMB, uint8_t dac_val);
182 void SetupInternalPulser(uint8_t iFEMB);
183 uint16_t SetupASICPulserBits(uint8_t iFEMB);
184
193 uint16_t SetupFEMBASICs(uint8_t iFEMB, std::vector<uint32_t> registerList);
194
195 //Debug
196 void ConfigWIBFakeData(bool enableFakeFEMB1, bool enableFakeFEMB2,
197 bool enableFakeFEMB3, bool enableFakeFEMB4,
198 bool counter); // counter==true: counter instead of COLDATA frame, else samples in COLDATA frame
199 void SetFEMBFakeCOLDATAMode(uint8_t iFEMB,uint8_t iCD, bool mode = 0);
200 uint8_t GetFEMBFakeCOLDATAMode(uint8_t iFEMB,uint8_t iCD);
201 void SetFEMBStreamSource(uint8_t iFEMB,uint8_t iStream,bool real=true);
202 uint8_t GetFEMBStreamSource(uint8_t iFEMB,uint8_t iStream);
203// void SetFakeCOLDATA(uint8_t mask = 0xFF);
204// uint8_t GetFakeCOLDATA();
205 void SetEventBuilderDebugMode(uint8_t mask = 0xF);
207
209
210 //Helper
211 char GetFEMBChar(uint8_t iFEMB);
212 char GetDAQLinkChar(uint8_t iDAQLink);
213 char GetFEMBCDChar(uint8_t iCD);
214 bool CheckDAQLinkInRange(uint8_t iDAQLink);
215 bool CheckFEMBInRange(uint8_t iFEMB);
216 bool CheckFEMBStreamInRange(uint8_t iStream);
217 bool CheckFEMBCDInRange(uint8_t iCD);
218 uint8_t GetFEMBCount(){return FEMBCount;}
220
224 void SetContinueIfListOfFEMBClockPhasesDontSync(bool enable); // if true try to hunt for the phase else raise exception
225
226 private:
227 WIB(); //disallow the default constructor
228 // Prevent copying of WIB objects
229 WIB( const WIB& other) ; // prevents construction-copy
230 WIB& operator=( const WIB&) ; // prevents copying
232 uint8_t FEMBCount;
236
239 bool ContinueOnFEMBSyncError; // if phase hunt fails keep going else raise exception
240 bool ContinueIfListOfFEMBClockPhasesDontSync; // if true try to hunt for the phase else raise exception
241};
242#endif
unsigned __int128 uint128_t
Definition WIB.hh:14
Definition WIB.hh:26
bool TryFEMBPhases(uint8_t iFEMB, std::vector< uint16_t > phases)
void EnableFEMBCNC()
Definition WIB.cpp:498
uint32_t ReadDAQ_SI5342(uint16_t address, uint8_t byte_count=4)
void EraseFlash(bool print_updates=false)
bool CheckFEMBStreamInRange(uint8_t iStream)
Definition WIB.cpp:585
bool ContinueOnFEMBRegReadError
Definition WIB.hh:237
uint32_t ReadDTS_SI5344(uint16_t address, uint8_t byte_count=4)
void ResetWIB(bool reset_udp=false)
Definition WIB.cpp:138
WIB_DAQ_t
Definition WIB.hh:208
@ UNKNOWN
Definition WIB.hh:208
@ FELIX
Definition WIB.hh:208
@ RCE
Definition WIB.hh:208
void EnableDAQLink(uint8_t iDAQLink)
Definition WIB.cpp:51
void LoadConfigDTS_SI5344(std::string const &fileName)
void ConfigFEMB(uint8_t iFEMB, std::vector< uint32_t > fe_config, std::vector< uint16_t > clk_phases, uint8_t pls_mode=0, uint8_t pls_dac_val=0, uint8_t start_frame_mode_sel=1, uint8_t start_frame_swap=1)
Setup FEMB in real or pulser data mode.
Definition WIB_FEMB.cpp:37
std::vector< uint32_t > CaptureHistory(std::string const &address)
void DisableFEMBCNC()
Definition WIB.cpp:503
uint8_t FEMBCDACount
Definition WIB.hh:234
uint8_t GetDTS_SI5344AddressPage(uint16_t address)
void CheckedResetWIBAndCfgDTS(uint8_t localClock, uint8_t PDTS_TGRP, uint8_t PDTSsource=0, uint32_t PDTSAlignment_timeout=0)
Definition WIB.cpp:272
uint8_t GetFEMBFakeCOLDATAMode(uint8_t iFEMB, uint8_t iCD)
WIB_DAQ_t GetDAQMode()
Definition WIB.hh:219
void SetContinueOnFEMBSyncError(bool enable)
bool ContinueOnFEMBSyncError
Definition WIB.hh:239
char GetFEMBCDChar(uint8_t iCD)
Definition WIB.cpp:603
void ConfigFEMBMode(uint8_t iFEMB, uint32_t pls_cs, uint32_t dac_sel, uint32_t fpga_dac, uint32_t asic_dac, uint32_t mon_cs)
WIB(const WIB &other)
void InitializeDTS(uint8_t PDTSsource=0, uint8_t clockSource=0, uint32_t PDTSAlignment_timeout=0)
Definition WIB_DTS.cpp:12
void WriteQSFP(uint16_t address, uint32_t value, uint8_t byte_count)
Definition WIB_QSFP.cpp:7
uint8_t GetDTS_SI5344Page()
void StopEventBuilder(uint8_t mask=0xF)
std::vector< data_8b10b_t > ReadOutCDLinkSpyBuffer()
void WriteFlash(std::vector< uint32_t > data, uint8_t update_percentage=101)
void SetupFEMBExtClock(uint8_t iFEMB)
Setup FEMB External Clock.
Definition WIB_FEMB.cpp:375
void SetDTS_SI5344Page(uint8_t page)
void ConfigFEMBFakeData(uint8_t iFEMB, uint8_t fake_mode, uint32_t fake_word, uint8_t femb_number, std::vector< uint32_t > fake_samples, uint8_t start_frame_mode_sel=1, uint8_t start_frame_swap=1)
Setup FEMB in fake data mode.
Definition WIB_FEMB.cpp:275
bool ContinueOnFEMBSPIError
Definition WIB.hh:238
void StartSyncDTS()
Definition WIB_DTS.cpp:163
void StartEventBuilder(uint8_t mask=0xF)
void ResetWIBAndCfgDTS(uint8_t localClock, uint8_t PDTS_TGRP, uint8_t PDTSsource=0, uint32_t PDTSAlignment_timeout=0)
Definition WIB.cpp:197
char GetDAQLinkChar(uint8_t iDAQLink)
Definition WIB.cpp:518
uint8_t GetFEMBCount()
Definition WIB.hh:218
void WriteDTS_SI5344(uint16_t address, uint32_t value, uint8_t byte_count=4)
Definition WIB_SI5344.cpp:8
uint8_t FEMBStreamCount
Definition WIB.hh:233
void EnableDAQLink_Lite(uint8_t iDAQLink, uint8_t enable)
Definition WIB.cpp:77
uint8_t GetDAQ_SI5342Page()
void SetFEMBStreamSource(uint8_t iFEMB, uint8_t iStream, bool real=true)
void SelectSI5344(uint64_t input, bool enable)
uint8_t GetFEMBStreamSource(uint8_t iFEMB, uint8_t iStream)
uint32_t ReadLocalFlash(uint16_t address)
bool HuntFEMBPhase(uint8_t iFEMB, uint16_t clk_phase_data_start)
void SetContinueIfListOfFEMBClockPhasesDontSync(bool enable)
uint32_t ReadDTS_CDS(uint16_t address, uint8_t byte_count=4)
Definition WIB_CDS.cpp:20
void FlashCheckBusy()
void ReadFlash(std::string const &fileName, uint8_t update_percentage=101)
void SelectSI5342(uint64_t input, bool enable)
void SetupInternalPulser(uint8_t iFEMB)
Definition WIB_FEMB.cpp:928
void FEMBPower(uint8_t iFEMB, bool turnOn)
Definition WIB.cpp:456
uint8_t GetDAQ_SI5342AddressPage(uint16_t address)
WIB_DAQ_t DAQMode
Definition WIB.hh:231
WIB & operator=(const WIB &)
void WriteDAQ_SI5342(uint16_t address, uint32_t value, uint8_t byte_count=4)
Definition WIB_SI5342.cpp:8
float ConfigureDTSCDS(uint8_t source=0)
Definition WIB_CDS.cpp:24
void PDTSInRunningState()
Definition WIB_DTS.cpp:169
uint8_t GetEventBuilderDebugMode()
void ResetSi5342()
uint32_t ReadQSFP(uint16_t address, uint8_t byte_count)
Definition WIB_QSFP.cpp:10
void ResetSi5344()
uint16_t SetupASICPulserBits(uint8_t iFEMB)
Definition WIB_FEMB.cpp:809
void SourceFEMB(uint64_t iDAQLink, uint64_t real)
Definition WIB.cpp:626
bool ContinueIfListOfFEMBClockPhasesDontSync
Definition WIB.hh:240
bool started
Definition WIB.hh:33
void SetFEMBFakeCOLDATAMode(uint8_t iFEMB, uint8_t iCD, bool mode=0)
void SetContinueOnFEMBSPIError(bool enable)
void ProgramFlash(std::string const &fileName, uint8_t update_percentage=101)
bool CheckFEMBCDInRange(uint8_t iCD)
Definition WIB.cpp:594
bool CheckDAQLinkInRange(uint8_t iDAQLink)
Definition WIB.cpp:509
uint8_t FEMBCount
Definition WIB.hh:232
void ConfigWIBFakeData(bool enableFakeFEMB1, bool enableFakeFEMB2, bool enableFakeFEMB3, bool enableFakeFEMB4, bool counter)
uint8_t DAQLinkCount
Definition WIB.hh:235
void LoadConfigDAQ_SI5342(std::string const &fileName)
void SetContinueOnFEMBRegReadError(bool enable)
void InitializeWIB()
Definition WIB.cpp:130
void WriteLocalFlash(uint16_t address, uint32_t data)
char GetFEMBChar(uint8_t iFEMB)
Definition WIB.cpp:556
void SetupFPGAPulser(uint8_t iFEMB, uint8_t dac_val)
Definition WIB_FEMB.cpp:912
void SetDAQ_SI5342Page(uint8_t page)
void CheckFlash(std::vector< uint32_t > data, uint8_t update_percentage=101)
void FullStart()
Definition WIB.cpp:35
void SetEventBuilderDebugMode(uint8_t mask=0xF)
void StartStreamToDAQ(bool l1=true, bool l2=true, bool l3=false, bool l4=false)
Definition WIB.cpp:411
~WIB()
Definition WIB.cpp:32
std::vector< data_8b10b_t > ReadDAQLinkSpyBuffer(uint8_t iDAQLink, uint8_t trigger_mode=0)
uint16_t SetupFEMBASICs(uint8_t iFEMB, uint8_t gain, uint8_t shape, uint8_t highBaseline, bool highLeakage, bool leakagex10, bool acCoupling, bool buffer, bool useExtClock, uint8_t internalDACControl, uint8_t internalDACValue)
Setup FEMB ASICs.
Definition WIB_FEMB.cpp:621
void WriteDTS_CDS(uint16_t address, uint32_t value, uint8_t byte_count=4, bool ignore_error=false)
Definition WIB_CDS.cpp:17
void WriteFEMBPhase(uint8_t iFEMB, uint16_t clk_phase_data)
Definition WIB_FEMB.cpp:943
bool CheckFEMBInRange(uint8_t iFEMB)
Definition WIB.cpp:547
bool k
Definition WIB.hh:22
data_8b10b_t(uint8_t _k, uint8_t _d)
Definition WIB.hh:21
uint8_t data
Definition WIB.hh:23