From bebff94e62c6e6688a8129076526a9fa28ae82d7 Mon Sep 17 00:00:00 2001 From: "Ryan@WorkStation" Date: Tue, 19 Mar 2024 16:13:44 -0400 Subject: [PATCH] fix RecordLength bug for QDC. Can't 100% trust CAEN manual --- ClassDigitizer.cpp | 30 ++++++++++++++++++------------ ClassDigitizer.h | 5 ++++- CustomThreads.h | 8 ++++++++ DigiSettingsPanel.cpp | 1 + FSUDAQ.cpp | 1 + RegisterAddress.h | 8 +++++--- Scope.cpp | 10 +++++----- macro.h | 2 +- 8 files changed, 43 insertions(+), 22 deletions(-) diff --git a/ClassDigitizer.cpp b/ClassDigitizer.cpp index 2852ac8..00d3fdd 100644 --- a/ClassDigitizer.cpp +++ b/ClassDigitizer.cpp @@ -47,6 +47,7 @@ void Digitizer::Initalization(){ isConnected = false; AcqRun = false; isDummy = true; + } void Digitizer::Reset(){ @@ -64,7 +65,7 @@ void Digitizer::Reset(){ void Digitizer::PrintBoard (){ printf("Connected to Model %s with handle %d using %s\n", BoardInfo.ModelName, handle, LinkType == CAEN_DGTZ_USB ? "USB" : "Optical Link"); - printf(" Sampling rate : %.0f MHz = %.1f ns \n", 1000/tick2ns, tick2ns); + printf(" Sampling rate : %.1f MHz = %.1f ns \n", 1000./tick2ns, tick2ns); printf("No. of Input Channels : %d \n", NumInputCh); printf(" No. of Reg Channels : %d, mask : 0x%X\n", NumRegChannel, regChannelMask); printf(" SerialNumber :\e[1m\e[33m %d\e[0m\n", BoardInfo.SerialNumber); @@ -436,7 +437,8 @@ int Digitizer::ProgramBoard_QDC(){ int ret = 0; //WriteRegister(DPP::QDC::NumberEventsPerAggregate, 0x10, -1); - WriteRegister(DPP::QDC::RecordLength_W, 16, -1); // 128 sample = 2048 ns + WriteRegister(DPP::QDC::RecordLength, 16, -1); // 128 sample = 2048 ns + WriteRegister(DPP::QDC::PreTrigger, 60, -1); // at 60 sample = 960 ns WriteRegister(DPP::QDC::GateWidth, 100/16, -1); @@ -494,7 +496,9 @@ void Digitizer::StartACQ(){ // ret |= CAEN_DGTZ_SetDPPEventAggregation(handle, 0, 0); // Auto set unsigned int bufferSize = CalByteForBufferCAEN(); - if( bufferSize > 160 * 1024 * 1024 ) printf("============= buffer size bigger than 160 MB (%u)\n", bufferSize ); + // unsigned int bufferSize = 200 * 1024 * 1024; + // if( DPPType == DPPTypeCode::DPP_QDC_CODE ) bufferSize = 500 * 1024 * 1024; + // if( bufferSize > 160 * 1024 * 1024 ) printf("============= buffer size bigger than 160 MB (%u)\n", bufferSize ); data->AllocateMemory(bufferSize); @@ -650,7 +654,7 @@ int Digitizer::ReadData(){ } } - ReadACQStatus(); + // ReadACQStatus(); return ret; } @@ -678,7 +682,7 @@ void Digitizer::ReadAndPrintACQStatue(){ //=========================================================== void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool isSave2MemAndFile){ if( softwareDisable ) return; - printf("%30s[0x%04X](digi-%d,ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),GetSerialNumber(), ch, registerAddress.ActualAddress(ch), value); + printf("WRITE|%30s[0x%04X](digi-%d,ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),GetSerialNumber(), ch, registerAddress.ActualAddress(ch), value); if( !isConnected ) { //SetSettingToMemory(registerAddress, value, ch); //TODO should the binary setting be edited offline? @@ -720,6 +724,7 @@ uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool is if( softwareDisable ) return 0; if( !isConnected ) return 0; if( registerAddress.GetRWType() == RW::WriteONLY ) return 0; + // if( registerAddress == DPP::QDC::RecordLength_W ) return 0; ret = CAEN_DGTZ_ReadRegister(handle, registerAddress.ActualAddress(ch), &returnData); @@ -732,8 +737,8 @@ uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool is std::stringstream ss; ss << std::hex << registerAddress.ActualAddress(ch); - ErrorMsg("ReadRegister:0x" + ss.str() + "(" + registerAddress.GetName() + ")"); - if( str != "" ) printf("%s : 0x%04X(0x%04X) is 0x%08X \n", str.c_str(), + ErrorMsg("Register:0x" + ss.str() + "(" + registerAddress.GetName() + ")"); + if( !str.empty() ) printf("READ|%s : 0x%04X(0x%04X) is 0x%08X \n", str.c_str(), registerAddress.ActualAddress(ch), registerAddress.GetAddress(), returnData); return returnData; } @@ -744,15 +749,15 @@ uint32_t Digitizer::PrintRegister(uint32_t address, std::string msg){ printf("------------ %s = 0x%X \n", msg.c_str(), address); printf("----------------------------------------------------\e[0m\n"); - uint32_t * value = new uint32_t[1]; - CAEN_DGTZ_ReadRegister(handle, address, value); + uint32_t value; + CAEN_DGTZ_ReadRegister(handle, address, &value); printf(" %*s 32 28 24 20 16 12 8 4 0\n", (int) msg.length(), ""); printf(" %*s | | | | | | | | |\n", (int) msg.length(), ""); printf(" %*s", (int) msg.length(), ""); - std::cout << " : 0b" << std::bitset<32>(value[0]) << std::endl; - printf(" %*s : 0x%X\n", (int) msg.length(), msg.c_str(), value[0]); + std::cout << " : 0b" << std::bitset<32>(value) << std::endl; + printf(" %*s : 0x%08X = %u\n", (int) msg.length(), msg.c_str(), value, value); - return value[0]; + return value; } //========================================== setting file IO @@ -842,6 +847,7 @@ void Digitizer::ReadAllSettingsFromBoard(bool force){ if( RegisterBoardList_QDC[p].GetRWType() == RW::WriteONLY) continue; ReadRegister(RegisterBoardList_QDC[p]); } + regChannelMask = GetSettingFromMemory(DPP::QDC::GroupEnableMask); for( int ch = 0; ch < GetNumRegChannels(); ch ++){ diff --git a/ClassDigitizer.h b/ClassDigitizer.h index f8179ac..0c10c99 100644 --- a/ClassDigitizer.h +++ b/ClassDigitizer.h @@ -106,7 +106,10 @@ class Digitizer{ Data * GetData() const {return data;} uint32_t GetACQStatusFromMemory() const {return acqStatus;} void ReadAndPrintACQStatue(); - void ReadACQStatus() { acqStatus = ReadRegister(DPP::AcquisitionStatus_R); } + void ReadACQStatus() { + // printf("%s\n", __func__); + acqStatus = ReadRegister(DPP::AcquisitionStatus_R); + } unsigned int CalByteForBuffer(bool verbose = false); unsigned int CalByteForBufferCAEN(); diff --git a/CustomThreads.h b/CustomThreads.h index 9cad3b7..373eb24 100644 --- a/CustomThreads.h +++ b/CustomThreads.h @@ -70,6 +70,14 @@ public: break; } + clock_gettime(CLOCK_REALTIME, &t1); + if( t1.tv_sec - ta.tv_sec > 2 ){ + digiMTX[ID].lock(); + digi->ReadACQStatus(); + digiMTX[ID].unlock(); + ta = t1; + } + if( isSaveData && !stop ) { clock_gettime(CLOCK_REALTIME, &tb); if( tb.tv_sec - ta.tv_sec > 2 ) { diff --git a/DigiSettingsPanel.cpp b/DigiSettingsPanel.cpp index 02985e1..ff10176 100644 --- a/DigiSettingsPanel.cpp +++ b/DigiSettingsPanel.cpp @@ -3117,6 +3117,7 @@ void DigiSettingsPanel::UpdateReadOutStatus(uint32_t status){ void DigiSettingsPanel::UpdateBoardAndChannelsStatus(){ + printf("%s\n", __func__); //*======================================== uint32_t AcqStatus = digi[ID]->ReadRegister(DPP::AcquisitionStatus_R); UpdateACQStatus(AcqStatus); diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 30eb626..b0053ca 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -1148,6 +1148,7 @@ void MainWindow::StopACQ(){ if( chkSaveData->isChecked() ) digi[i]->GetData()->CloseSaveFile(); LogMsg("Digi-" + QString::number(digi[i]->GetSerialNumber()) + " ACQ is stopped." ); QCoreApplication::processEvents(); + digi[i]->ReadACQStatus(); } if( scalarThread->isRunning()){ diff --git a/RegisterAddress.h b/RegisterAddress.h index 986faa4..ec04bb4 100644 --- a/RegisterAddress.h +++ b/RegisterAddress.h @@ -787,7 +787,7 @@ namespace DPP { namespace QDC { // Register already grouped in channel. and there no control for indiviual channel except the Fine DC offset and threshold, so it is like no group const Reg NumberEventsPerAggregate ("Number of Events per Aggregate", 0x1020, RW::ReadWrite, false, 0x3FF, -1); /// R/W - const Reg RecordLength ("Record Length_R" , 0x1024, RW::ReadWrite, false, 0x1FFF, 8); /// R/W + const Reg RecordLength ("Record Length" , 0x1024, RW::ReadWrite, false, 0x1FFF, 8); /// R const Reg GateWidth ("GateWidth" , 0x1030, RW::ReadWrite, false, 0xFFF, 1); /// R/W const Reg GateOffset ("GateOfset" , 0x1034, RW::ReadWrite, false, 0xFF, 1); /// R/W const Reg FixedBaseline ("FixedBaseline" , 0x1038, RW::ReadWrite, false, 0xFFF, -1); /// R/W @@ -811,9 +811,11 @@ namespace DPP { const Reg TriggerThreshold_sub6 ("Trigger Threshold sub6" , 0x10E8, RW::ReadWrite, false, 0xFFF, -1); /// R/W const Reg TriggerThreshold_sub7 ("Trigger Threshold sub7" , 0x10EC, RW::ReadWrite, false, 0xFFF, -1); /// R/W - const Reg RecordLength_W ("Record Length_W" , 0x8024, RW::WriteONLY, false, 0x1FFF, 8); /// /W const Reg GroupEnableMask ("Group Enable Mask" , 0x8120, RW::ReadWrite, false, 0xFF, -1); /// R/W + + + namespace Bit_DPPAlgorithmControl { const std::pair ChargeSensitivity = {3, 0} ; /// length, smallest pos const std::pair InternalTestPulse = {1, 4}; @@ -1025,7 +1027,7 @@ const std::vector RegisterBoardList_QDC = { DPP::BoardConfiguration , DPP::AggregateOrganization, DPP::QDC::NumberEventsPerAggregate, - DPP::QDC::RecordLength_W, + // DPP::QDC::RecordLength_W, DPP::AcquisitionControl, DPP::AcquisitionStatus_R, DPP::SoftwareTrigger_W, diff --git a/Scope.cpp b/Scope.cpp index f5a246b..50a0e74 100644 --- a/Scope.cpp +++ b/Scope.cpp @@ -371,9 +371,9 @@ void Scope::StartScope(){ digi[iDigi]->WriteRegister(DPP::SoftwareClear_W, 1); digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, 1, -1); - AggPerRead[iDigi] = digi[iDigi]->GetSettingFromMemory(DPP::MaxAggregatePerBlockTransfer); - SendLogMsg("Set Events/Agg to 1 for scope, it was " + QString::number(AggPerRead[iDigi]) + "."); - digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 1); + //AggPerRead[iDigi] = digi[iDigi]->GetSettingFromMemory(DPP::MaxAggregatePerBlockTransfer); + //SendLogMsg("Set Agg/Read to 1 for scope, it was " + QString::number(AggPerRead[iDigi]) + "."); + //digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, 1); readDataThread[iDigi]->SetScopeMode(true); readDataThread[iDigi]->SetSaveData(false); @@ -431,7 +431,7 @@ void Scope::StopScope(){ digiMTX[iDigi].unlock(); digi[iDigi]->SetBits(DPP::BoardConfiguration, DPP::Bit_BoardConfig::RecordTrace, traceOn[iDigi], -1); - digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, AggPerRead[iDigi]); + //digi[iDigi]->WriteRegister(DPP::MaxAggregatePerBlockTransfer, AggPerRead[iDigi]); } @@ -883,7 +883,7 @@ void Scope::SetUpPanel_QDC() { int rowID = 0; - SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::QDC::RecordLength_W); + SetUpSpinBox(sbReordLength, "Record Length [ns] ", rowID, 0, DPP::QDC::RecordLength); SetUpSpinBox(sbPreTrigger, "Pre Trigger [ns] ", rowID, 2, DPP::QDC::PreTrigger); SetUpSpinBox(sbDCOffset, "DC offset [%] ", rowID, 4, DPP::QDC::DCOffset); sbDCOffset->setDecimals(2); diff --git a/macro.h b/macro.h index 5268ab2..57c1480 100644 --- a/macro.h +++ b/macro.h @@ -2,7 +2,7 @@ #define MACRO_H #define MaxNPorts 4 //for optical link -#define MaxNBoards 8 //for both optical link and usb +#define MaxNBoards 4 //for both optical link and usb #define MaxNDigitizer MaxNPorts * MaxNBoards