From 289bdb58eda939ac3fcc010419d1c8d29486359c Mon Sep 17 00:00:00 2001 From: murat Date: Tue, 15 Oct 2024 17:39:41 -0500 Subject: [PATCH] - control-roc-read over the fiber seems to work --- .../Ui/ControlRoc_Read_Par_t.hh | 51 ++++++++-------- otsdaq-mu2e-tracker/Ui/DtcInterface.hh | 8 +-- .../Ui/DtcInterface_ControlRoc.cc | 59 +++++++++++++------ scripts/daq_scripts.C | 29 +++++---- 4 files changed, 89 insertions(+), 58 deletions(-) diff --git a/otsdaq-mu2e-tracker/Ui/ControlRoc_Read_Par_t.hh b/otsdaq-mu2e-tracker/Ui/ControlRoc_Read_Par_t.hh index 6072acc..fef878c 100644 --- a/otsdaq-mu2e-tracker/Ui/ControlRoc_Read_Par_t.hh +++ b/otsdaq-mu2e-tracker/Ui/ControlRoc_Read_Par_t.hh @@ -9,31 +9,36 @@ // read -a 8 -t 8 -s 1 -l8 - T 10 -m 3 -p 1 -C FFFFFFFF -D FFFFFFFF -E FFFFFFFF //----------------------------------------------------------------------------- namespace trkdaq { - struct ControlRoc_Read_Par_t { - uint16_t adc_mode; // -a 8 (defailt: 0) - uint16_t tdc_mode; // -t 8 (default: 0) - uint16_t lookback; // -l 8 (default: 8) - uint16_t samples; // -s 1 (default: 16) - int triggers; // -T 10 (default: 0) - uint16_t chan_mask[6]; // FFFF FFFF FFFF FFFF FFFF FFFF - int pulser; // -p 1 (default: 0) - int delay; // -d ??? (default: 1) - int mode; // -m 3 ??? )default: 0) -//----------------------------------------------------------------------------- -// output parameters -//----------------------------------------------------------------------------- - uint16_t hvcal_mask1; - uint16_t hvcal_mask2; - uint16_t hvcal_mask3; - uint16_t hvcal_enable_pulser; - uint16_t output_mode; - uint16_t return_code; + struct ControlRoc_Read_Input_t { + uint16_t adc_mode; // -a 8 (defailt: 0) [0] + uint16_t tdc_mode; // -t 8 (default: 0) [1] + uint16_t num_lookback; // -l 8 (default: 8) [2] + uint16_t num_samples; // -s 1 (default: 16) [3] if>63, set to 63 + uint16_t num_triggers[2]; // -T 10 (default: 0) [4-5] + uint16_t ch_mask[6]; // FFFF FFFF FFFF FFFF FFFF FFFF [6:11] + uint16_t enable_pulser; // -p 1 (default: 0) [12] + uint16_t marker_clock; // -m 3 ??? )default: 0) [13] + uint16_t mode; // [14] need to set mode=0 + uint16_t clock; // [15] need to set clock=99 + }; //----------------------------------------------------------------------------- -// the ones below are not passed to python readData +// output parameters : same as input , plus four words //----------------------------------------------------------------------------- - int clock; // = 99 and not used by Monica (?) - int channel; // -c - std::string message; // -M + struct ControlRoc_Read_Output_t { + uint16_t adc_mode; // [0] + uint16_t tdc_mode; // [1] + uint16_t num_lookback; // [2] + uint16_t num_samples; // [3] + uint16_t num_triggers[2]; // [4-5] + uint16_t ch_mask[6]; // [6--11] + uint16_t enable_pulser; // [13] + uint16_t marker_clock; // [12] + uint16_t mode; // [14] returned 0 + uint16_t clock; // [15] returned 99, + uint16_t digi_read_0xb; // [16] + uint16_t digi_read_0xe; // [17] + uint16_t digi_read_0xd; // [18] + uint16_t digi_read_0xc; // [19] }; }; diff --git a/otsdaq-mu2e-tracker/Ui/DtcInterface.hh b/otsdaq-mu2e-tracker/Ui/DtcInterface.hh index fb1df07..fdc3776 100644 --- a/otsdaq-mu2e-tracker/Ui/DtcInterface.hh +++ b/otsdaq-mu2e-tracker/Ui/DtcInterface.hh @@ -61,10 +61,10 @@ namespace trkdaq { //----------------------------------------------------------------------------- int ControlRoc(const char* Command, void* Parameters); - int ControlRoc_Read(ControlRoc_Read_Par_t* Par, - int LinkMask = -1 , - bool UpdateMask = false, - int PrintLevel = 0 ); + int ControlRoc_Read(ControlRoc_Read_Input_t* Par, + int LinkMask = 0 , + bool UpdateMask = false, + int PrintLevel = 0 ); int EmulateCfo() { return fEmulateCfo; } diff --git a/otsdaq-mu2e-tracker/Ui/DtcInterface_ControlRoc.cc b/otsdaq-mu2e-tracker/Ui/DtcInterface_ControlRoc.cc index 6e69d5b..d14034d 100644 --- a/otsdaq-mu2e-tracker/Ui/DtcInterface_ControlRoc.cc +++ b/otsdaq-mu2e-tracker/Ui/DtcInterface_ControlRoc.cc @@ -20,7 +20,7 @@ namespace trkdaq { //----------------------------------------------------------------------------- // what should it return ? - for now, return 0 //----------------------------------------------------------------------------- - int DtcInterface::ControlRoc_Read(ControlRoc_Read_Par_t* Par, int LinkMask, bool UpdateMask, int PrintLevel) { + int DtcInterface::ControlRoc_Read(ControlRoc_Read_Input_t* Par, int LinkMask, bool UpdateMask, int PrintLevel) { //----------------------------------------------------------------------------- // write parameters into reg 266 (via block write), sleep for some time, // then wait till reg 128 returns 0x8000 @@ -29,27 +29,33 @@ namespace trkdaq { vec.push_back(Par->adc_mode); vec.push_back(Par->tdc_mode); - vec.push_back(Par->lookback); + vec.push_back(Par->num_lookback); + + if (Par->num_samples > 63) { + printf("WARNING: num_samples = %i > 63, truncate to 63\n",Par->num_samples); + Par->num_samples = 63; + } + vec.push_back(Par->num_samples); - uint16_t w1 = ((Par->triggers ) & 0xffff); - uint16_t w2 = ((Par->triggers >> 16) & 0xffff); + uint16_t w1 = Par->num_triggers[0]; + uint16_t w2 = Par->num_triggers[1]; vec.push_back(w1); vec.push_back(w2); - for (int i=0; i<6; i++) vec.push_back(Par->chan_mask[i]); + for (int i=0; i<6; i++) vec.push_back(Par->ch_mask[i]); - vec.push_back(Par->samples); - vec.push_back(Par->pulser ); - vec.push_back(Par->delay ); - vec.push_back(Par->mode ); + vec.push_back(Par->enable_pulser); + vec.push_back(Par->marker_clock ); + vec.push_back(0 ); + vec.push_back(99); bool increment_address(false); - if (UpdateMask) fLinkMask = LinkMask; + if (UpdateMask and (LinkMask != 0)) fLinkMask = LinkMask; for (int i=0; i<6; i++) { - int used = (LinkMask >> 4*i) & 0x1; + int used = (fLinkMask >> 4*i) & 0x1; if (not used) continue; auto roc = DTC_Link_ID(i); fDtc->WriteROCBlock (roc,265,vec,false,increment_address,100); @@ -68,15 +74,30 @@ namespace trkdaq { nw = nw-4; std::vector v2; fDtc->ReadROCBlock(v2,roc,265,nw,false,100); + + if (PrintLevel > 0) { + PrintBuffer(v2.data(),nw); + if (PrintLevel > 1) { + trkdaq::ControlRoc_Read_Output_t* o = (trkdaq::ControlRoc_Read_Output_t*) v2.data(); + + printf("adc_mode : %i\n",o->adc_mode); + printf("tdc_mode : %i\n",o->tdc_mode); + printf("num_lookback : %i\n",o->num_lookback); + printf("num_samples : %i\n",o->num_samples); + printf("num_triggers : %5i %5i\n",o->num_triggers[0],o->num_triggers[1]); + printf("ch_mask : 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", + o->ch_mask[0],o->ch_mask[1],o->ch_mask[2],o->ch_mask[3],o->ch_mask[4],o->ch_mask[5]); + printf("enable_pulser : %i\n",o->enable_pulser); + printf("marker_clock : %i\n",o->marker_clock); + printf("mode : %i\n",o->mode); + printf("clock : %i\n",o->clock); + printf("digi_read_0xb : 0x%04x\n",o->digi_read_0xb); + printf("digi_read_0xe : 0x%04x\n",o->digi_read_0xe); + printf("digi_read_0xd : 0x%04x\n",o->digi_read_0xd); + printf("digi_read_0xc : 0x%04x\n",o->digi_read_0xc); + } + } - PrintBuffer(v2.data(),nw); - - Par->hvcal_mask1 = v2[13]; - Par->hvcal_mask2 = v2[14]; - Par->hvcal_mask3 = v2[15]; - Par->hvcal_enable_pulser = v2[16]; - Par->output_mode = v2[17]; - Par->return_code = 0; // TBD } //----------------------------------------------------------------------------- // diff --git a/scripts/daq_scripts.C b/scripts/daq_scripts.C index 03a1689..071a71a 100644 --- a/scripts/daq_scripts.C +++ b/scripts/daq_scripts.C @@ -138,25 +138,30 @@ int dtc_configure_ja(int Clock, int Reset, int PcieAddress = -1) { } +//----------------------------------------------------------------------------- +// test of the 'READ' command implementation over the fiber //----------------------------------------------------------------------------- int dtc_control_roc_read(int PcieAddr = -1) { DtcInterface* dtc_i = DtcInterface::Instance(PcieAddr); - ControlRoc_Read_Par_t par; + ControlRoc_Read_Input_t par; - par.adc_mode = 8; - par.tdc_mode = 0; - par.lookback = 8; - par.samples = 1; - par.triggers = 10; + par.adc_mode = 8; + par.tdc_mode = 0; + par.num_lookback = 8; + par.num_samples = 1; + par.num_triggers[0] = 10; + par.num_triggers[1] = 0; - for (int i=0; i<6; i++) par.chan_mask[i] = 0xffff; + for (int i=0; i<6; i++) par.ch_mask[i] = 0xffff; - par.pulser = 1; - par.delay = 1; - par.mode = 3; // marker_clock in Monica's code - - dtc_i->ControlRoc_Read(&par); + par.enable_pulser = 1; + par.marker_clock = 3; + par.mode = 0; // + par.clock = 99; // + + printf("dtc_i->fLinkMask: 0x%04x\n",dtc_i->fLinkMask); + dtc_i->ControlRoc_Read(&par,0,false,2); return 0; }