diff --git a/.vscode/settings.json b/.vscode/settings.json index c0cc0ff..8e87245 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -84,6 +84,71 @@ "files.associations": { "mainWindow.C": "cpp", "Scope.C": "cpp", - "new": "cpp" + "new": "cpp", + "allocator": "cpp", + "array": "cpp", + "istream": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "limits": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "mutex": "cpp", + "numbers": "cpp", + "semaphore": "cpp", + "span": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "variant": "cpp" } } \ No newline at end of file diff --git a/ClassData.h b/ClassData.h index 614dee8..46bdc2a 100644 --- a/ClassData.h +++ b/ClassData.h @@ -19,13 +19,13 @@ class Data{ public: + char *buffer; /// readout buffer int DPPType; std::string DPPTypeStr; unsigned short boardSN; float ch2ns; unsigned int nByte; /// number of byte from read buffer - char *buffer; /// readout buffer uint32_t AllocatedSize; double TriggerRate[MaxNChannels]; /// Hz @@ -81,18 +81,19 @@ class Data{ unsigned int nw; bool SaveWaveToMemory; - unsigned int outFileIndex; - std::string outFilePrefix; - std::string outFileName; - FILE * outFile; - unsigned int outFileSize; // should be max at 2 GB - uint64_t FinishedOutFilesSize; // sum of files size. - ///for temperary std::vector tempWaveform1; std::vector tempWaveform2; std::vector tempDigiWaveform1; std::vector tempDigiWaveform2; + + FILE * outFile; + uint64_t FinishedOutFilesSize; // sum of files size. + unsigned int outFileIndex; + std::string outFilePrefix; + std::string outFileName; + unsigned int outFileSize; // should be max at 2 GB + unsigned int ReadBuffer(unsigned int nWord, int verbose = 0); diff --git a/ClassDigitizer.cpp b/ClassDigitizer.cpp index 4894ef1..10564e2 100644 --- a/ClassDigitizer.cpp +++ b/ClassDigitizer.cpp @@ -462,7 +462,7 @@ void Digitizer::PrintACQStatue(){ //=========================================================== //=========================================================== //=========================================================== -void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool isSave2MemAndFile){ +void Digitizer::WriteRegister (Register::Reg registerAddress, uint32_t value, int ch, bool isSave2MemAndFile){ printf("%30s[0x%04X](ch-%02d) [0x%04X]: 0x%08X \n", registerAddress.GetNameChar(), registerAddress.GetAddress(),ch, registerAddress.ActualAddress(ch), value); @@ -472,10 +472,10 @@ void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool return; } - if( registerAddress.GetType() == RW::ReadONLY ) return; + if( registerAddress.GetType() == Register::RW::ReadONLY ) return; ret = CAEN_DGTZ_WriteRegister(handle, registerAddress.ActualAddress(ch), value); - if( ret == 0 && isSave2MemAndFile && registerAddress.GetType() == RW::ReadWrite) { + if( ret == 0 && isSave2MemAndFile && registerAddress.GetType() == Register::RW::ReadWrite) { SetSettingToMemory(registerAddress, value, ch); SaveSettingToFile(registerAddress, value, ch); } @@ -483,21 +483,20 @@ void Digitizer::WriteRegister (Reg registerAddress, uint32_t value, int ch, bool ErrorMsg("WriteRegister:" + std::to_string(registerAddress)); } -uint32_t Digitizer::ReadRegister(Reg registerAddress, unsigned short ch, bool isSave2MemAndFile, std::string str ){ +uint32_t Digitizer::ReadRegister(Register::Reg registerAddress, unsigned short ch, bool isSave2MemAndFile, std::string str ){ if( !isConnected ) return 0; - if( registerAddress.GetType() == RW::WriteONLY ) return 0; + if( registerAddress.GetType() == Register::RW::WriteONLY ) return 0; - uint32_t data[1]; - ret = CAEN_DGTZ_ReadRegister(handle, registerAddress.ActualAddress(ch), data); + ret = CAEN_DGTZ_ReadRegister(handle, registerAddress.ActualAddress(ch), &returnData); if( ret == 0 && isSave2MemAndFile) { - SetSettingToMemory(registerAddress, data[0], ch); - SaveSettingToFile(registerAddress, data[0], ch); + SetSettingToMemory(registerAddress, returnData, ch); + SaveSettingToFile(registerAddress, returnData, ch); } ErrorMsg("ReadRegister:" + std::to_string(registerAddress)); if( str != "" ) printf("%s : 0x%04X(0x%04X) is 0x%08X \n", str.c_str(), - registerAddress.ActualAddress(ch), registerAddress.GetAddress(), data[0]); - return data[0]; + registerAddress.ActualAddress(ch), registerAddress.GetAddress(), returnData); + return returnData; } uint32_t Digitizer::PrintRegister(uint32_t address, std::string msg){ @@ -518,9 +517,9 @@ uint32_t Digitizer::PrintRegister(uint32_t address, std::string msg){ } //========================================== setting file IO -Reg Digitizer::FindRegister(uint32_t address){ +Register::Reg Digitizer::FindRegister(uint32_t address){ - Reg tempReg; + Register::Reg tempReg; ///========= Find Match Register for( int p = 0; p < (int) RegisterDPPList[p]; p++){ if( address == RegisterDPPList[p].GetAddress() ) { @@ -558,8 +557,8 @@ void Digitizer::ReadAllSettingsFromBoard(bool force){ printf("===== %s \n", __func__); /// board setting - for( int p = 0; p < (int) RegisterDPPList[p]; p++){ - if( RegisterDPPList[p].GetType() == RW::WriteONLY) continue; + for( int p = 0; p < (int) RegisterDPPList.size(); p++){ + if( RegisterDPPList[p].GetType() == Register::RW::WriteONLY) continue; ReadRegister(RegisterDPPList[p]); } @@ -568,14 +567,14 @@ void Digitizer::ReadAllSettingsFromBoard(bool force){ /// Channels Setting for( int ch = 0; ch < NChannel; ch ++){ if( DPPType == V1730_DPP_PHA_CODE ){ - for( int p = 0; p < (int) RegisterPHAList[p]; p++){ - if( RegisterPHAList[p].GetType() == RW::WriteONLY) continue; + for( int p = 0; p < (int) RegisterPHAList.size(); p++){ + if( RegisterPHAList[p].GetType() == Register::RW::WriteONLY) continue; ReadRegister(RegisterPHAList[p], ch); } } if( DPPType == V1730_DPP_PSD_CODE ){ - for( int p = 0; p < (int) RegisterPSDList[p]; p++){ - if( RegisterPSDList[p].GetType() == RW::WriteONLY) continue; + for( int p = 0; p < (int) RegisterPSDList.size(); p++){ + if( RegisterPSDList[p].GetType() == Register::RW::WriteONLY) continue; ReadRegister(RegisterPSDList[p], ch); } } @@ -587,11 +586,11 @@ void Digitizer::ProgramSettingsToBoard(){ if( !isConnected ) return; if( isDummy ) return; - Reg haha; + Register::Reg haha; /// board setting for( int p = 0; p < (int) RegisterDPPList[p]; p++){ - if( RegisterDPPList[p].GetType() == RW::ReadONLY) continue; + if( RegisterDPPList[p].GetType() == Register::RW::ReadONLY) continue; haha = RegisterDPPList[p]; WriteRegister(haha, GetSettingFromMemory(haha), -1, false); usleep(100 * 1000); @@ -600,7 +599,7 @@ void Digitizer::ProgramSettingsToBoard(){ for( int ch = 0; ch < NChannel; ch ++){ if( DPPType == V1730_DPP_PHA_CODE ){ for( int p = 0; p < (int) RegisterPHAList[p]; p++){ - if( RegisterPHAList[p].GetType() == RW::ReadONLY) continue; + if( RegisterPHAList[p].GetType() == Register::RW::ReadONLY) continue; haha = RegisterPHAList[p]; WriteRegister(haha, GetSettingFromMemory(haha, ch), ch, false); usleep(100 * 1000); @@ -608,7 +607,7 @@ void Digitizer::ProgramSettingsToBoard(){ } if( DPPType == V1730_DPP_PSD_CODE ){ for( int p = 0; p < (int) RegisterPSDList[p]; p++){ - if( RegisterPSDList[p].GetType() == RW::ReadONLY) continue; + if( RegisterPSDList[p].GetType() == Register::RW::ReadONLY) continue; haha = RegisterPHAList[p]; WriteRegister(haha, GetSettingFromMemory(haha, ch), ch, false); usleep(100 * 1000); @@ -617,13 +616,13 @@ void Digitizer::ProgramSettingsToBoard(){ } } -void Digitizer::SetSettingToMemory(Reg registerAddress, unsigned int value, unsigned short ch ){ +void Digitizer::SetSettingToMemory(Register::Reg registerAddress, unsigned int value, unsigned short ch ){ unsigned short index = registerAddress.Index(ch); if( index > SETTINGSIZE ) return; setting[index] = value; } -unsigned int Digitizer::GetSettingFromMemory(Reg registerAddress, unsigned short ch ){ +unsigned int Digitizer::GetSettingFromMemory(Register::Reg registerAddress, unsigned short ch ){ unsigned short index = registerAddress.Index(ch); if( index > SETTINGSIZE ) return 0xFFFF; return setting[index] ; @@ -697,7 +696,7 @@ int Digitizer::LoadSettingBinaryToMemory(std::string fileName){ } } -unsigned int Digitizer::ReadSettingFromFile(Reg registerAddress, unsigned short ch){ +unsigned int Digitizer::ReadSettingFromFile(Register::Reg registerAddress, unsigned short ch){ if ( !settingFileExist ) return -1; unsigned short index = registerAddress.Index(ch); @@ -717,7 +716,7 @@ unsigned int Digitizer::ReadSettingFromFile(Reg registerAddress, unsigned short } -void Digitizer::SaveSettingToFile(Reg registerAddress, unsigned int value, unsigned short ch){ +void Digitizer::SaveSettingToFile(Register::Reg registerAddress, unsigned int value, unsigned short ch){ if ( !settingFileExist ) return ; unsigned short index = registerAddress.Index(ch); @@ -757,7 +756,7 @@ void Digitizer::SaveAllSettingsAsText(std::string fileName){ return; } - Reg haha; + Register::Reg haha; for( unsigned int i = 0; i < SETTINGSIZE ; i++){ haha.SetName(""); @@ -779,9 +778,9 @@ void Digitizer::SaveAllSettingsAsText(std::string fileName){ } if( haha.GetName() != "" ) { std::string typeStr ; - if( haha.GetType() == RW::ReadWrite ) typeStr = "R/W"; - if( haha.GetType() == RW::ReadONLY ) typeStr = "R "; - if( haha.GetType() == RW::WriteONLY ) typeStr = " W"; + if( haha.GetType() == Register::RW::ReadWrite ) typeStr = "R/W"; + if( haha.GetType() == Register::RW::ReadONLY ) typeStr = "R "; + if( haha.GetType() == Register::RW::WriteONLY ) typeStr = " W"; fprintf( txtFile, "0x%04X %30s 0x%08X %s %u\n", actualAddress, haha.GetNameChar(), setting[i], diff --git a/ClassDigitizer.h b/ClassDigitizer.h index 0c8ccc7..ecfbb73 100644 --- a/ClassDigitizer.h +++ b/ClassDigitizer.h @@ -56,6 +56,8 @@ class Digitizer{ //^-------- other protected functions void ErrorMsg(std::string header = ""); + uint32_t returnData; + public: Digitizer(); /// no digitizer open Digitizer(int boardID, int portID = 0, bool program = false, bool verbose = false); @@ -90,10 +92,10 @@ class Digitizer{ /// write value to digitizer, memory, and settingFile (if exist) /// ONLY WriteRegister can have ch = -1, for writting all channels /// for board setting, ignore ch - void WriteRegister (Reg registerAddress, uint32_t value, int ch = -1, bool isSave2MemAndFile = true); + void WriteRegister (Register::Reg registerAddress, uint32_t value, int ch = -1, bool isSave2MemAndFile = true); /// read value from digitizer and memory, and save to memory, and settingFile(if exist), /// for board setting, ignore ch - uint32_t ReadRegister (Reg registerAddress, unsigned short ch = 0, bool isSave2MemAndFile = true, std::string str = "" ); + uint32_t ReadRegister (Register::Reg registerAddress, unsigned short ch = 0, bool isSave2MemAndFile = true, std::string str = "" ); uint32_t PrintRegister(uint32_t address, std::string msg); //^================ Get Board info @@ -112,14 +114,14 @@ class Digitizer{ CAEN_DGTZ_ConnectionType GetLinkType() const {return LinkType;} //^================ Setting - Reg FindRegister(uint32_t address); + Register::Reg FindRegister(uint32_t address); /// board <--> memory functions void ReadAllSettingsFromBoard (bool force = false); void ProgramSettingsToBoard (); /// simply read settings from memory - void SetSettingToMemory (Reg registerAddress, unsigned int value, unsigned short ch = 0); - unsigned int GetSettingFromMemory (Reg registerAddress, unsigned short ch = 0); + void SetSettingToMemory (Register::Reg registerAddress, unsigned int value, unsigned short ch = 0); + unsigned int GetSettingFromMemory (Register::Reg registerAddress, unsigned short ch = 0); void PrintSettingFromMemory (); unsigned int * GetSettings() {return setting;}; @@ -133,8 +135,8 @@ class Digitizer{ /// load setting file to memory /// if problem, return -1; load without problem, return 0; int LoadSettingBinaryToMemory (std::string fileName); - void SaveSettingToFile (Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory - unsigned int ReadSettingFromFile (Reg registerAddress, unsigned short ch = 0); /// read from setting binary + void SaveSettingToFile (Register::Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory + unsigned int ReadSettingFromFile (Register::Reg registerAddress, unsigned short ch = 0); /// read from setting binary }; diff --git a/FSUDAQ.cpp b/FSUDAQ.cpp index 35b0906..cbcf68c 100644 --- a/FSUDAQ.cpp +++ b/FSUDAQ.cpp @@ -46,7 +46,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ bnOpenScope = new QPushButton("Open Scope", this); layout->addWidget(bnOpenScope, 1, 0); - //connect(bnDigiSettings, &QPushButton::clicked, this, &MainWindow::OpenDigiSettings); + connect(bnOpenScope, &QPushButton::clicked, this, &MainWindow::OpenScope); bnDigiSettings = new QPushButton("Digitizers Settings", this); layout->addWidget(bnDigiSettings, 1, 1); @@ -186,6 +186,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ //connect(scalarThread, &ScalarThread::updataScalar, this, &MainWindow::UpdateScalar); } + + //=========== disable widget + WaitForDigitizersOpen(true); + } MainWindow::~MainWindow(){ @@ -194,6 +198,7 @@ MainWindow::~MainWindow(){ SaveProgramSettings(); if( scope ) delete scope; + } @@ -335,19 +340,19 @@ void MainWindow::OpenDigitizers(){ logMsgHTMLMode = false; nDigi = 0; std::vector> portList; //boardID, portID - Digitizer dig; for(int port = 0; port < MaxNPorts; port++){ for( int board = 0; board < MaxNBoards; board ++){ /// max number of iasy chain + Digitizer dig; dig.OpenDigitizer(board, port); if( dig.IsConnected() ){ nDigi++; portList.push_back(std::pair(board, port)); LogMsg(QString("... Found at port: %1, board: %2. SN: %3 %4").arg(port).arg(board).arg(dig.GetSerialNumber(), 3, 10, QChar(' ')).arg(dig.GetDPPString().c_str())); - dig.CloseDigitizer(); - QCoreApplication::processEvents(); //to prevent Qt said application not responding. }//else{ //LogMsg(QString("... Nothing at port: %1, board: %2.").arg(port).arg(board)); //} + dig.CloseDigitizer(); + QCoreApplication::processEvents(); //to prevent Qt said application not responding. } } LogMsg(QString("Done seraching. Found %1 digitizer(s). Opening digitizer(s)....").arg(nDigi)); @@ -363,6 +368,8 @@ void MainWindow::OpenDigitizers(){ LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi)); + WaitForDigitizersOpen(false); + SetupScalar(); } @@ -391,6 +398,21 @@ void MainWindow::CloseDigitizers(){ LogMsg("Done. Closed " + QString::number(nDigi) + " Digitizer(s)."); nDigi = 0; + WaitForDigitizersOpen(true); + +} + +void MainWindow::WaitForDigitizersOpen(bool onOff){ + + bnOpenDigitizers->setEnabled(onOff); + bnCloseDigitizers->setEnabled(!onOff); + bnOpenScope->setEnabled(!onOff); + bnDigiSettings->setEnabled(!onOff); + bnOpenScaler->setEnabled(!onOff); + bnStartACQ->setEnabled(!onOff); + bnStopACQ->setEnabled(!onOff); + chkSaveData->setEnabled(!onOff); + } diff --git a/FSUDAQ.h b/FSUDAQ.h index a035dc7..d513aa0 100644 --- a/FSUDAQ.h +++ b/FSUDAQ.h @@ -22,6 +22,10 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); + void closeEvent(QCloseEvent * event){ + if( scope ) scope->close(); + event->accept(); + } private slots: @@ -33,6 +37,7 @@ private slots: void OpenDigitizers(); void CloseDigitizers(); + void WaitForDigitizersOpen(bool onOff); void SetupScalar(); void CleanUpScalar(); diff --git a/RegisterAddress.h b/RegisterAddress.h index da5299c..ffff3a5 100644 --- a/RegisterAddress.h +++ b/RegisterAddress.h @@ -2,6 +2,7 @@ #define REGISTERADDRESS_H #include +#include ///======= /// All 0x1XXX registers are either indiviual or Group @@ -17,32 +18,41 @@ /// Reg haha("haha", 0x1234); /// uint32_t papa = haha; /// papa = 0x1234 -enum RW { ReadWrite = 0, ReadONLY = 1, WriteONLY = 2}; +namespace Register { + +enum RW { ReadWrite, ReadONLY, WriteONLY}; class Reg{ public: + Reg(){ - this->name = ""; - this->address = 0; - this->type = 0; - this->group = 0; + name = ""; + address = 0; + type = RW::ReadWrite; + group = 0; + maxValue = 0; + partialStep = 0; } - Reg(std::string name, uint32_t address, char type = 0, bool group = 0){ + Reg(std::string name, uint32_t address, RW type = RW::ReadWrite, bool group = false, unsigned int max = 0, int pStep = 0){ this->name = name; this->address = address; this->type = type; this->group = group; + this->maxValue = max; + this->partialStep = pStep; }; ~Reg(){}; operator uint32_t () const {return this->address;} /// this allows Reg kaka("kaka", 0x1234) uint32_t haha = kaka; - std::string GetName() const {return this->name;} - const char * GetNameChar() const {return this->name.c_str();} - uint32_t GetAddress() const {return this->address; } - char GetType() const {return this->type;} - bool GetGroup() const {return this->group;} + std::string GetName() const {return name;} + const char * GetNameChar() const {return name.c_str();} + uint32_t GetAddress() const {return address; } + RW GetType() const {return type;} + bool GetGroup() const {return group;} + unsigned int GetMax() const {return maxValue;} + int GetPartialStep() const {return partialStep;} /// step = partialStep * ch2ns, -1 : step = 1 void Print() const ; uint32_t ActualAddress(int ch = -1){ @@ -58,17 +68,22 @@ class Reg{ void SetName(std::string str) {this->name = str;} private: - uint32_t address; /// This is the table of register, the actual address should call ActualAddress(); + std::string name; - char type; /// read/write = 0; read = 1; write = 2 + uint32_t address; /// This is the table of register, the actual address should call ActualAddress(); + RW type; /// read/write = 0; read = 1; write = 2 bool group; + unsigned int maxValue ; + int partialStep; + }; inline void Reg::Print() const{ - printf(" Name: %s\n", name.c_str()); - printf("Address: 0x%04X\n", address); - printf(" Type: %s\n", type == RW::ReadWrite ? "Read/Write" : (type == RW::ReadONLY ? "Read-Only" : "Write-Only") ); - printf(" Group: %s\n", group ? "True" : "False"); + printf(" Name: %s\n", name.c_str()); + printf(" Re.Address: 0x%04X\n", address); + printf(" Type: %s\n", type == RW::ReadWrite ? "Read/Write" : (type == RW::ReadONLY ? "Read-Only" : "Write-Only") ); + printf(" Group: %s\n", group ? "True" : "False"); + printf(" Max Value : 0x%X = %d \n", maxValue, maxValue); } inline unsigned short Reg::Index (unsigned short ch){ @@ -109,168 +124,169 @@ inline uint32_t Reg::CalAddress(unsigned int index){ return actualAddress; } -namespace Register { + - const Reg EventReadOutBuffer("EventReadOutBuffer", 0x0000, 1); /// R + const Reg EventReadOutBuffer("EventReadOutBuffer", 0x0000, RW::ReadONLY); /// R ///========== Channel or Group const Reg ChannelDummy32 ("ChannelDummy32" , 0x1024); /// R/W const Reg InputDynamicRange ("InputDynamicRange" , 0x1028); /// R/W const Reg ChannelPulseWidth ("ChannelPulseWidth" , 0x1070); /// R/W const Reg ChannelTriggerThreshold ("ChannelTriggerThreshold" , 0x1080); /// R/W - const Reg CoupleSelfTriggerLogic_G ("CoupleSelfTriggerLogic_G" , 0x1084, 0 , 1); /// R/W - const Reg ChannelStatus_R ("ChannelStatus_R" , 0x1088, 1); /// R - const Reg AMCFirmwareRevision_R ("AMCFirmwareRevision_R" , 0x108C, 1); /// R + const Reg CoupleSelfTriggerLogic_G ("CoupleSelfTriggerLogic_G" , 0x1084, RW::ReadWrite , 1); /// R/W + const Reg ChannelStatus_R ("ChannelStatus_R" , 0x1088, RW::ReadONLY); /// R + const Reg AMCFirmwareRevision_R ("AMCFirmwareRevision_R" , 0x108C, RW::ReadONLY); /// R const Reg ChannelDCOffset ("ChannelDCOffset" , 0x1098); /// R/W - const Reg ChannelADCTemperature_R ("ChannelADCTemperature_R" , 0x10A8, 1); /// R - const Reg ChannelSelfTriggerRateMeter_R ("ChannelSelfTriggerRateMeter_R", 0x10EC, 1); /// R + const Reg ChannelADCTemperature_R ("ChannelADCTemperature_R" , 0x10A8, RW::ReadONLY); /// R + const Reg ChannelSelfTriggerRateMeter_R ("ChannelSelfTriggerRateMeter_R", 0x10EC, RW::ReadONLY); /// R ///========== Board - const Reg BoardConfiguration ("BoardConfiguration" , 0x8000, 0); /// R/W - const Reg BufferOrganization ("BufferOrganization" , 0x800C, 0); /// R/W - const Reg CustomSize ("CustomSize" , 0x8020, 0); /// R/W - const Reg ADCCalibration_W ("ADCCalibration_W" , 0x809C, 2); /// W - const Reg AcquisitionControl ("AcquisitionControl" , 0x8100, 0); /// R/W - const Reg AcquisitionStatus_R ("AcquisitionStatus_R" , 0x8104, 1); /// R - const Reg SoftwareTrigger_W ("SoftwareTrigger_W" , 0x8108, 2); /// W - const Reg GlobalTriggerMask ("GlobalTriggerMask" , 0x810C, 0); /// R/W - const Reg FrontPanelTRGOUTEnableMask ("FrontPanelTRGOUTEnableMask" , 0x8110, 0); /// R/W - const Reg PostTrigger ("PostTrigger" , 0x8114, 0); /// R/W - const Reg LVDSIOData ("LVDSIOData" , 0x8118, 0); /// R/W - const Reg FrontPanelIOControl ("FrontPanelIOControl" , 0x811C, 0); /// R/W - const Reg ChannelEnableMask ("ChannelEnableMask" , 0x8120, 0); /// R/W - const Reg ROCFPGAFirmwareRevision_R ("ROCFPGAFirmwareRevision_R" , 0x8124, 1); /// R - const Reg EventStored_R ("EventStored_R" , 0x812C, 1); /// R - const Reg VoltageLevelModeConfig ("VoltageLevelModeConfig" , 0x8138, 0); /// R/W - const Reg SoftwareClockSync_W ("SoftwareClockSync_W" , 0x813C, 2); /// W - const Reg BoardInfo_R ("BoardInfo_R" , 0x8140, 1); /// R - const Reg AnalogMonitorMode ("AnalogMonitorMode" , 0x8144, 0); /// R/W - const Reg EventSize_R ("EventSize_R" , 0x814C, 1); /// R - const Reg FanSpeedControl ("FanSpeedControl" , 0x8168, 0); /// R/W - const Reg MemoryBufferAlmostFullLevel ("MemoryBufferAlmostFullLevel" , 0x816C, 0); /// R/W - const Reg RunStartStopDelay ("RunStartStopDelay" , 0x8170, 0); /// R/W - const Reg BoardFailureStatus_R ("BoardFailureStatus_R" , 0x8178, 1); /// R - const Reg FrontPanelLVDSIONewFeatures ("FrontPanelLVDSIONewFeatures" , 0x81A0, 0); /// R/W - const Reg BufferOccupancyGain ("BufferOccupancyGain" , 0x81B4, 0); /// R/W - const Reg ChannelsShutdown_W ("ChannelsShutdown_W" , 0x81C0, 2); /// W - const Reg ExtendedVetoDelay ("ExtendedVetoDelay" , 0x81C4, 0); /// R/W - const Reg ReadoutControl ("ReadoutControl" , 0xEF00, 0); /// R/W - const Reg ReadoutStatus_R ("ReadoutStatus_R" , 0xEF04, 1); /// R - const Reg BoardID ("BoardID" , 0xEF08, 0); /// R/W - const Reg MCSTBaseAddressAndControl ("MCSTBaseAddressAndControl" , 0xEF0C, 0); /// R/W - const Reg RelocationAddress ("RelocationAddress" , 0xEF10, 0); /// R/W - const Reg InterruptStatusID ("InterruptStatusID" , 0xEF14, 0); /// R/W - const Reg InterruptEventNumber ("InterruptEventNumber" , 0xEF18, 0); /// R/W - const Reg MaxAggregatePerBlockTransfer ("MaxAggregatePerBlockTransfer" , 0xEF1C, 0); /// R/W - const Reg Scratch ("Scratch" , 0xEF20, 0); /// R/W - const Reg SoftwareReset_W ("SoftwareReset_W" , 0xEF24, 2); /// W - const Reg SoftwareClear_W ("SoftwareClear_W" , 0xEF28, 2); /// W + const Reg BoardConfiguration ("BoardConfiguration" , 0x8000, RW::ReadWrite); /// R/W + const Reg BufferOrganization ("BufferOrganization" , 0x800C, RW::ReadWrite); /// R/W + const Reg CustomSize ("CustomSize" , 0x8020, RW::ReadWrite); /// R/W + const Reg ADCCalibration_W ("ADCCalibration_W" , 0x809C, RW::WriteONLY); /// W + const Reg AcquisitionControl ("AcquisitionControl" , 0x8100, RW::ReadWrite); /// R/W + const Reg AcquisitionStatus_R ("AcquisitionStatus_R" , 0x8104, RW::ReadONLY); /// R + const Reg SoftwareTrigger_W ("SoftwareTrigger_W" , 0x8108, RW::WriteONLY); /// W + const Reg GlobalTriggerMask ("GlobalTriggerMask" , 0x810C, RW::ReadWrite); /// R/W + const Reg FrontPanelTRGOUTEnableMask ("FrontPanelTRGOUTEnableMask" , 0x8110, RW::ReadWrite); /// R/W + const Reg PostTrigger ("PostTrigger" , 0x8114, RW::ReadWrite); /// R/W + const Reg LVDSIOData ("LVDSIOData" , 0x8118, RW::ReadWrite); /// R/W + const Reg FrontPanelIOControl ("FrontPanelIOControl" , 0x811C, RW::ReadWrite); /// R/W + const Reg ChannelEnableMask ("ChannelEnableMask" , 0x8120, RW::ReadWrite); /// R/W + const Reg ROCFPGAFirmwareRevision_R ("ROCFPGAFirmwareRevision_R" , 0x8124, RW::ReadONLY); /// R + const Reg EventStored_R ("EventStored_R" , 0x812C, RW::ReadONLY); /// R + const Reg VoltageLevelModeConfig ("VoltageLevelModeConfig" , 0x8138, RW::ReadWrite); /// R/W + const Reg SoftwareClockSync_W ("SoftwareClockSync_W" , 0x813C, RW::WriteONLY); /// W + const Reg BoardInfo_R ("BoardInfo_R" , 0x8140, RW::ReadONLY); /// R + const Reg AnalogMonitorMode ("AnalogMonitorMode" , 0x8144, RW::ReadWrite); /// R/W + const Reg EventSize_R ("EventSize_R" , 0x814C, RW::ReadONLY); /// R + const Reg FanSpeedControl ("FanSpeedControl" , 0x8168, RW::ReadWrite); /// R/W + const Reg MemoryBufferAlmostFullLevel ("MemoryBufferAlmostFullLevel" , 0x816C, RW::ReadWrite); /// R/W + const Reg RunStartStopDelay ("RunStartStopDelay" , 0x8170, RW::ReadWrite); /// R/W + const Reg BoardFailureStatus_R ("BoardFailureStatus_R" , 0x8178, RW::ReadONLY); /// R + const Reg FrontPanelLVDSIONewFeatures ("FrontPanelLVDSIONewFeatures" , 0x81A0, RW::ReadWrite); /// R/W + const Reg BufferOccupancyGain ("BufferOccupancyGain" , 0x81B4, RW::ReadWrite); /// R/W + const Reg ChannelsShutdown_W ("ChannelsShutdown_W" , 0x81C0, RW::WriteONLY); /// W + const Reg ExtendedVetoDelay ("ExtendedVetoDelay" , 0x81C4, RW::ReadWrite); /// R/W + const Reg ReadoutControl ("ReadoutControl" , 0xEF00, RW::ReadWrite); /// R/W + const Reg ReadoutStatus_R ("ReadoutStatus_R" , 0xEF04, RW::ReadONLY); /// R + const Reg BoardID ("BoardID" , 0xEF08, RW::ReadWrite); /// R/W + const Reg MCSTBaseAddressAndControl ("MCSTBaseAddressAndControl" , 0xEF0C, RW::ReadWrite); /// R/W + const Reg RelocationAddress ("RelocationAddress" , 0xEF10, RW::ReadWrite); /// R/W + const Reg InterruptStatusID ("InterruptStatusID" , 0xEF14, RW::ReadWrite); /// R/W + const Reg InterruptEventNumber ("InterruptEventNumber" , 0xEF18, RW::ReadWrite); /// R/W + const Reg MaxAggregatePerBlockTransfer ("MaxAggregatePerBlockTransfer" , 0xEF1C, RW::ReadWrite); /// R/W + const Reg Scratch ("Scratch" , 0xEF20, RW::ReadWrite); /// R/W + const Reg SoftwareReset_W ("SoftwareReset_W" , 0xEF24, RW::WriteONLY); /// W + const Reg SoftwareClear_W ("SoftwareClear_W" , 0xEF28, RW::WriteONLY); /// W ///====== Common for PHA and PSD namespace DPP { - const Reg RecordLength_G ("RecordLength_G" , 0x1020, 0, 1); /// R/W - const Reg InputDynamicRange ("InputDynamicRange" , 0x1028, 0); /// R/W - const Reg NumberEventsPerAggregate_G ("NumberEventsPerAggregate_G" , 0x1034, 0, 1); /// R/W - const Reg PreTrigger ("PreTrigger" , 0x1038, 0); /// R/W - const Reg TriggerThreshold ("TriggerThreshold" , 0x106C, 0); /// R/W - const Reg TriggerHoldOffWidth ("TriggerHoldOffWidth" , 0x1074, 0); /// R/W - const Reg DPPAlgorithmControl ("DPPAlgorithmControl" , 0x1080, 0); /// R/W - const Reg ChannelStatus_R ("ChannelStatus_R" , 0x1088, 1); /// R - const Reg AMCFirmwareRevision_R ("AMCFirmwareRevision_R" , 0x108C, 1); /// R - const Reg ChannelDCOffset ("ChannelDCOffset" , 0x1098, 0); /// R/W - const Reg ChannelADCTemperature_R ("ChannelADCTemperature_R" , 0x10A8, 1); /// R - const Reg IndividualSoftwareTrigger_W ("IndividualSoftwareTrigger_W" , 0x10C0, 2); /// W - const Reg VetoWidth ("VetoWidth" , 0x10D4, 0); /// R/W + const Reg RecordLength_G ("RecordLength_G" , 0x1020, RW::ReadWrite, 1, 0x3FFF, 8); /// R/W + const Reg InputDynamicRange ("InputDynamicRange" , 0x1028, RW::ReadWrite, 0, 1, -1); /// R/W + const Reg NumberEventsPerAggregate_G ("NumberEventsPerAggregate_G" , 0x1034, RW::ReadWrite, 1, 0x3FF, -1); /// R/W + const Reg PreTrigger ("PreTrigger" , 0x1038, RW::ReadWrite, 0, 0xFF, 4); /// R/W + const Reg TriggerThreshold ("TriggerThreshold" , 0x106C, RW::ReadWrite, 0, 0x3FFF, -1); /// R/W + const Reg TriggerHoldOffWidth ("TriggerHoldOffWidth" , 0x1074, RW::ReadWrite, 0, 0x3FF, 4); /// R/W + const Reg DPPAlgorithmControl ("DPPAlgorithmControl" , 0x1080, RW::ReadWrite); /// R/W + const Reg ChannelStatus_R ("ChannelStatus_R" , 0x1088, RW::ReadONLY); /// R + const Reg AMCFirmwareRevision_R ("AMCFirmwareRevision_R" , 0x108C, RW::ReadONLY); /// R + const Reg ChannelDCOffset ("ChannelDCOffset" , 0x1098, RW::ReadWrite, 0, 0xFFFF, -1); /// R/W + const Reg ChannelADCTemperature_R ("ChannelADCTemperature_R" , 0x10A8, RW::ReadONLY); /// R + const Reg IndividualSoftwareTrigger_W ("IndividualSoftwareTrigger_W" , 0x10C0, RW::WriteONLY); /// W + const Reg VetoWidth ("VetoWidth" , 0x10D4, RW::ReadWrite); /// R/W /// I know there are many duplication, it is the design. - const Reg BoardConfiguration ("BoardConfiguration" , 0x8000, 0 ); /// R/W - const Reg AggregateOrganization ("AggregateOrganization" , 0x800C, 0 ); /// R/W - const Reg ADCCalibration_W ("ADCCalibration_W" , 0x809C, 2 ); /// W - const Reg ChannelShutdown_W ("ChannelShutdown_W" , 0x80BC, 2 ); /// W - const Reg AcquisitionControl ("AcquisitionControl" , 0x8100, 0 ); /// R/W - const Reg AcquisitionStatus_R ("AcquisitionStatus_R" , 0x8104, 1 ); /// R - const Reg SoftwareTrigger_W ("SoftwareTrigger_W" , 0x8108, 2 ); /// W - const Reg GlobalTriggerMask ("GlobalTriggerMask" , 0x810C, 0 ); /// R/W - const Reg FrontPanelTRGOUTEnableMask ("FrontPanelTRGOUTEnableMask" , 0x8110, 0 ); /// R/W - const Reg LVDSIOData ("LVDSIOData" , 0x8118, 0 ); /// R/W - const Reg FrontPanelIOControl ("FrontPanelIOControl" , 0x811C, 0 ); /// R/W - const Reg ChannelEnableMask ("ChannelEnableMask" , 0x8120, 0 ); /// R/W - const Reg ROCFPGAFirmwareRevision_R ("ROCFPGAFirmwareRevision_R" , 0x8124, 1 ); /// R - const Reg EventStored_R ("EventStored_R" , 0x812C, 1 ); /// R - const Reg VoltageLevelModeConfig ("VoltageLevelModeConfig" , 0x8138, 0 ); /// R/W - const Reg SoftwareClockSync_W ("SoftwareClockSync_W" , 0x813C, 2 ); /// W - const Reg BoardInfo_R ("BoardInfo_R" , 0x8140, 1 ); /// R - const Reg AnalogMonitorMode ("AnalogMonitorMode" , 0x8144, 0 ); /// R/W - const Reg EventSize_R ("EventSize_R" , 0x814C, 1 ); /// R - const Reg TimeBombDowncounter_R ("TimeBombDowncounter_R" , 0x8158, 1 ); /// R - const Reg FanSpeedControl ("FanSpeedControl" , 0x8168, 0 ); /// R/W - const Reg RunStartStopDelay ("RunStartStopDelay" , 0x8170, 0 ); /// R/W - const Reg BoardFailureStatus_R ("BoardFailureStatus_R" , 0x8178, 1 ); /// R - const Reg DisableExternalTrigger ("DisableExternalTrigger" , 0x817C, 0 ); /// R/W - const Reg TriggerValidationMask_G ("TriggerValidationMask_G" , 0x8180, 0 , 1); /// R/W, - const Reg FrontPanelLVDSIONewFeatures ("FrontPanelLVDSIONewFeatures" , 0x81A0, 0 ); /// R/W - const Reg BufferOccupancyGain ("BufferOccupancyGain" , 0x81B4, 0 ); /// R/W - const Reg ExtendedVetoDelay ("ExtendedVetoDelay" , 0x81C4, 0 ); /// R/W - const Reg ReadoutControl ("ReadoutControl" , 0xEF00, 0 ); /// R/W - const Reg ReadoutStatus_R ("ReadoutStatus_R" , 0xEF04, 1 ); /// R - const Reg BoardID ("BoardID" , 0xEF08, 0 ); /// R/W - const Reg MCSTBaseAddressAndControl ("MCSTBaseAddressAndControl" , 0xEF0C, 0 ); /// R/W - const Reg RelocationAddress ("RelocationAddress" , 0xEF10, 0 ); /// R/W - const Reg InterruptStatusID ("InterruptStatusID" , 0xEF14, 0 ); /// R/W - const Reg InterruptEventNumber ("InterruptEventNumber" , 0xEF18, 0 ); /// R/W - const Reg MaxAggregatePerBlockTransfer("MaxAggregatePerBlockTransfer", 0xEF1C, 0 ); /// R/W - const Reg Scratch ("Scratch" , 0xEF20, 0 ); /// R/W - const Reg SoftwareReset_W ("SoftwareReset_W" , 0xEF24, 2 ); /// W - const Reg SoftwareClear_W ("SoftwareClear_W" , 0xEF28, 2 ); /// W - const Reg ConfigurationReload_W ("ConfigurationReload_W" , 0xEF34, 2 ); /// W - const Reg ROMChecksum_R ("ROMChecksum_R" , 0xF000, 1 ); /// R - const Reg ROMChecksumByte2_R ("ROMChecksumByte2_R" , 0xF004, 1 ); /// R - const Reg ROMChecksumByte1_R ("ROMChecksumByte1_R" , 0xF008, 1 ); /// R - const Reg ROMChecksumByte0_R ("ROMChecksumByte0_R" , 0xF00C, 1 ); /// R - const Reg ROMConstantByte2_R ("ROMConstantByte2_R" , 0xF010, 1 ); /// R - const Reg ROMConstantByte1_R ("ROMConstantByte1_R" , 0xF014, 1 ); /// R - const Reg ROMConstantByte0_R ("ROMConstantByte0_R" , 0xF018, 1 ); /// R - const Reg ROM_C_Code_R ("ROM_C_Code_R" , 0xF01C, 1 ); /// R - const Reg ROM_R_Code_R ("ROM_R_Code_R" , 0xF020, 1 ); /// R - const Reg ROM_IEEE_OUI_Byte2_R ("ROM_IEEE_OUI_Byte2_R" , 0xF024, 1 ); /// R - const Reg ROM_IEEE_OUI_Byte1_R ("ROM_IEEE_OUI_Byte1_R" , 0xF028, 1 ); /// R - const Reg ROM_IEEE_OUI_Byte0_R ("ROM_IEEE_OUI_Byte0_R" , 0xF02C, 1 ); /// R - const Reg ROM_BoardVersion_R ("ROM_BoardVersion_R" , 0xF030, 1 ); /// R - const Reg ROM_BoardFromFactor_R ("ROM_BoardFromFactor_R" , 0xF034, 1 ); /// R - const Reg ROM_BoardIDByte1_R ("ROM_BoardIDByte1_R" , 0xF038, 1 ); /// R - const Reg ROM_BoardIDByte0_R ("ROM_BoardIDByte0_R" , 0xF03C, 1 ); /// R - const Reg ROM_PCB_rev_Byte3_R ("ROM_PCB_rev_Byte3_R" , 0xF040, 1 ); /// R - const Reg ROM_PCB_rev_Byte2_R ("ROM_PCB_rev_Byte2_R" , 0xF044, 1 ); /// R - const Reg ROM_PCB_rev_Byte1_R ("ROM_PCB_rev_Byte1_R" , 0xF048, 1 ); /// R - const Reg ROM_PCB_rev_Byte0_R ("ROM_PCB_rev_Byte0_R" , 0xF04C, 1 ); /// R - const Reg ROM_FlashType_R ("ROM_FlashType_R" , 0xF050, 1 ); /// R - const Reg ROM_BoardSerialNumByte1_R ("ROM_BoardSerialNumByte1_R" , 0xF080, 1 ); /// R - const Reg ROM_BoardSerialNumByte0_R ("ROM_BoardSerialNumByte0_R" , 0xF084, 1 ); /// R - const Reg ROM_VCXO_Type_R ("ROM_VCXO_Type_R" , 0xF088, 1 ); /// R + const Reg BoardConfiguration ("BoardConfiguration" , 0x8000, RW::ReadWrite ); /// R/W + const Reg AggregateOrganization ("AggregateOrganization" , 0x800C, RW::ReadWrite ); /// R/W + const Reg ADCCalibration_W ("ADCCalibration_W" , 0x809C, RW::WriteONLY ); /// W + const Reg ChannelShutdown_W ("ChannelShutdown_W" , 0x80BC, RW::WriteONLY ); /// W + const Reg AcquisitionControl ("AcquisitionControl" , 0x8100, RW::ReadWrite ); /// R/W + const Reg AcquisitionStatus_R ("AcquisitionStatus_R" , 0x8104, RW::ReadONLY ); /// R + const Reg SoftwareTrigger_W ("SoftwareTrigger_W" , 0x8108, RW::WriteONLY ); /// W + const Reg GlobalTriggerMask ("GlobalTriggerMask" , 0x810C, RW::ReadWrite ); /// R/W + const Reg FrontPanelTRGOUTEnableMask ("FrontPanelTRGOUTEnableMask" , 0x8110, RW::ReadWrite ); /// R/W + const Reg LVDSIOData ("LVDSIOData" , 0x8118, RW::ReadWrite ); /// R/W + const Reg FrontPanelIOControl ("FrontPanelIOControl" , 0x811C, RW::ReadWrite ); /// R/W + const Reg ChannelEnableMask ("ChannelEnableMask" , 0x8120, RW::ReadWrite ); /// R/W + const Reg ROCFPGAFirmwareRevision_R ("ROCFPGAFirmwareRevision_R" , 0x8124, RW::ReadONLY ); /// R + const Reg EventStored_R ("EventStored_R" , 0x812C, RW::ReadONLY ); /// R + const Reg VoltageLevelModeConfig ("VoltageLevelModeConfig" , 0x8138, RW::ReadWrite ); /// R/W + const Reg SoftwareClockSync_W ("SoftwareClockSync_W" , 0x813C, RW::WriteONLY ); /// W + const Reg BoardInfo_R ("BoardInfo_R" , 0x8140, RW::ReadONLY ); /// R + const Reg AnalogMonitorMode ("AnalogMonitorMode" , 0x8144, RW::ReadWrite ); /// R/W + const Reg EventSize_R ("EventSize_R" , 0x814C, RW::ReadONLY ); /// R + const Reg TimeBombDowncounter_R ("TimeBombDowncounter_R" , 0x8158, RW::ReadONLY ); /// R + const Reg FanSpeedControl ("FanSpeedControl" , 0x8168, RW::ReadWrite ); /// R/W + const Reg RunStartStopDelay ("RunStartStopDelay" , 0x8170, RW::ReadWrite ); /// R/W + const Reg BoardFailureStatus_R ("BoardFailureStatus_R" , 0x8178, RW::ReadONLY ); /// R + const Reg DisableExternalTrigger ("DisableExternalTrigger" , 0x817C, RW::ReadWrite ); /// R/W + const Reg FrontPanelLVDSIONewFeatures ("FrontPanelLVDSIONewFeatures" , 0x81A0, RW::ReadWrite ); /// R/W + const Reg BufferOccupancyGain ("BufferOccupancyGain" , 0x81B4, RW::ReadWrite ); /// R/W + const Reg ExtendedVetoDelay ("ExtendedVetoDelay" , 0x81C4, RW::ReadWrite ); /// R/W + const Reg ReadoutControl ("ReadoutControl" , 0xEF00, RW::ReadWrite ); /// R/W + const Reg ReadoutStatus_R ("ReadoutStatus_R" , 0xEF04, RW::ReadONLY ); /// R + const Reg BoardID ("BoardID" , 0xEF08, RW::ReadWrite ); /// R/W + const Reg MCSTBaseAddressAndControl ("MCSTBaseAddressAndControl" , 0xEF0C, RW::ReadWrite ); /// R/W + const Reg RelocationAddress ("RelocationAddress" , 0xEF10, RW::ReadWrite ); /// R/W + const Reg InterruptStatusID ("InterruptStatusID" , 0xEF14, RW::ReadWrite ); /// R/W + const Reg InterruptEventNumber ("InterruptEventNumber" , 0xEF18, RW::ReadWrite ); /// R/W + const Reg MaxAggregatePerBlockTransfer("MaxAggregatePerBlockTransfer", 0xEF1C, RW::ReadWrite, 0, 0x3FF, -1); /// R/W + const Reg Scratch ("Scratch" , 0xEF20, RW::ReadWrite ); /// R/W + const Reg SoftwareReset_W ("SoftwareReset_W" , 0xEF24, RW::WriteONLY ); /// W + const Reg SoftwareClear_W ("SoftwareClear_W" , 0xEF28, RW::WriteONLY ); /// W + const Reg ConfigurationReload_W ("ConfigurationReload_W" , 0xEF34, RW::WriteONLY ); /// W + const Reg ROMChecksum_R ("ROMChecksum_R" , 0xF000, RW::ReadONLY ); /// R + const Reg ROMChecksumByte2_R ("ROMChecksumByte2_R" , 0xF004, RW::ReadONLY ); /// R + const Reg ROMChecksumByte1_R ("ROMChecksumByte1_R" , 0xF008, RW::ReadONLY ); /// R + const Reg ROMChecksumByte0_R ("ROMChecksumByte0_R" , 0xF00C, RW::ReadONLY ); /// R + const Reg ROMConstantByte2_R ("ROMConstantByte2_R" , 0xF010, RW::ReadONLY ); /// R + const Reg ROMConstantByte1_R ("ROMConstantByte1_R" , 0xF014, RW::ReadONLY ); /// R + const Reg ROMConstantByte0_R ("ROMConstantByte0_R" , 0xF018, RW::ReadONLY ); /// R + const Reg ROM_C_Code_R ("ROM_C_Code_R" , 0xF01C, RW::ReadONLY ); /// R + const Reg ROM_R_Code_R ("ROM_R_Code_R" , 0xF020, RW::ReadONLY ); /// R + const Reg ROM_IEEE_OUI_Byte2_R ("ROM_IEEE_OUI_Byte2_R" , 0xF024, RW::ReadONLY ); /// R + const Reg ROM_IEEE_OUI_Byte1_R ("ROM_IEEE_OUI_Byte1_R" , 0xF028, RW::ReadONLY ); /// R + const Reg ROM_IEEE_OUI_Byte0_R ("ROM_IEEE_OUI_Byte0_R" , 0xF02C, RW::ReadONLY ); /// R + const Reg ROM_BoardVersion_R ("ROM_BoardVersion_R" , 0xF030, RW::ReadONLY ); /// R + const Reg ROM_BoardFromFactor_R ("ROM_BoardFromFactor_R" , 0xF034, RW::ReadONLY ); /// R + const Reg ROM_BoardIDByte1_R ("ROM_BoardIDByte1_R" , 0xF038, RW::ReadONLY ); /// R + const Reg ROM_BoardIDByte0_R ("ROM_BoardIDByte0_R" , 0xF03C, RW::ReadONLY ); /// R + const Reg ROM_PCB_rev_Byte3_R ("ROM_PCB_rev_Byte3_R" , 0xF040, RW::ReadONLY ); /// R + const Reg ROM_PCB_rev_Byte2_R ("ROM_PCB_rev_Byte2_R" , 0xF044, RW::ReadONLY ); /// R + const Reg ROM_PCB_rev_Byte1_R ("ROM_PCB_rev_Byte1_R" , 0xF048, RW::ReadONLY ); /// R + const Reg ROM_PCB_rev_Byte0_R ("ROM_PCB_rev_Byte0_R" , 0xF04C, RW::ReadONLY ); /// R + const Reg ROM_FlashType_R ("ROM_FlashType_R" , 0xF050, RW::ReadONLY ); /// R + const Reg ROM_BoardSerialNumByte1_R ("ROM_BoardSerialNumByte1_R" , 0xF080, RW::ReadONLY ); /// R + const Reg ROM_BoardSerialNumByte0_R ("ROM_BoardSerialNumByte0_R" , 0xF084, RW::ReadONLY ); /// R + const Reg ROM_VCXO_Type_R ("ROM_VCXO_Type_R" , 0xF088, RW::ReadONLY ); /// R + + const Reg TriggerValidationMask_G ("TriggerValidationMask_G" , 0x8180, RW::ReadWrite , 1); /// R/W, namespace PHA { - const Reg DataFlush_W ("DataFlush_W" , 0x103C, 2); /// W not sure - const Reg ChannelStopAcquisition ("ChannelStopAcquisition" , 0x1040); /// R/W not sure - const Reg RCCR2SmoothingFactor ("RCCR2SmoothingFactor" , 0x1054); /// R/W Trigger Filter smoothing, triggerSmoothingFactor - const Reg InputRiseTime ("InputRiseTime" , 0x1058); /// R/W OK - const Reg TrapezoidRiseTime ("TrapezoidRiseTime" , 0x105C); /// R/W OK - const Reg TrapezoidFlatTop ("TrapezoidFlatTop" , 0x1060); /// R/W OK - const Reg PeakingTime ("PeakingTime" , 0x1064); /// R/W OK - const Reg DecayTime ("DecayTime" , 0x1068); /// R/W OK - const Reg TriggerThreshold ("TriggerThreshold" , 0x106C); /// R/W OK - const Reg RiseTimeValidationWindow ("RiseTimeValidationWindow" , 0x1070); /// R/W OK - const Reg TriggerHoldOffWidth ("TriggerHoldOffWidth" , 0x1074); /// R/W OK - const Reg PeakHoldOff ("PeakHoldOff" , 0x1078); /// R/W OK - const Reg ShapedTriggerWidth ("ShapedTriggerWidth" , 0x1084); /// R/W not sure - const Reg DPPAlgorithmControl2_G ("DPPAlgorithmControl2_G" , 0x10A0, 0, 1); /// R/W OK + const Reg DataFlush_W ("DataFlush_W" , 0x103C, RW::WriteONLY); /// W not sure + const Reg ChannelStopAcquisition ("ChannelStopAcquisition" , 0x1040, RW::ReadWrite); /// R/W not sure + const Reg RCCR2SmoothingFactor ("RCCR2SmoothingFactor" , 0x1054, RW::ReadWrite); /// R/W Trigger Filter smoothing, triggerSmoothingFactor + const Reg InputRiseTime ("InputRiseTime" , 0x1058, RW::ReadWrite, 0, 0xFF, 4); /// R/W OK + const Reg TrapezoidRiseTime ("TrapezoidRiseTime" , 0x105C, RW::ReadWrite, 0, 0xFFF, 4); /// R/W OK + const Reg TrapezoidFlatTop ("TrapezoidFlatTop" , 0x1060, RW::ReadWrite, 0, 0xFFF, 4); /// R/W OK + const Reg PeakingTime ("PeakingTime" , 0x1064, RW::ReadWrite, 0, 0xFFF, 4); /// R/W OK + const Reg DecayTime ("DecayTime" , 0x1068, RW::ReadWrite, 0, 0xFFFF, 4); /// R/W OK + const Reg TriggerThreshold ("TriggerThreshold" , 0x106C, RW::ReadWrite, 0, 0x3FFF, -1); /// R/W OK + const Reg RiseTimeValidationWindow ("RiseTimeValidationWindow" , 0x1070, RW::ReadWrite, 0, 0x3FF, 1); /// R/W OK + const Reg TriggerHoldOffWidth ("TriggerHoldOffWidth" , 0x1074, RW::ReadWrite, 0, 0x3FF, 4); /// R/W OK + const Reg PeakHoldOff ("PeakHoldOff" , 0x1078, RW::ReadWrite, 0, 0x3FF, 4); /// R/W OK + const Reg ShapedTriggerWidth ("ShapedTriggerWidth" , 0x1084, RW::ReadWrite, 0, 0x3FF, 4); /// R/W not sure + const Reg DPPAlgorithmControl2_G ("DPPAlgorithmControl2_G" , 0x10A0, RW::ReadWrite, 1); /// R/W OK const Reg FineGain ("FineGain" , 0x10C4); /// R/W OK } namespace PSD { const Reg CFDSetting ("CFDSetting" , 0x103C); /// R/W - const Reg ForcedDataFlush_W ("ForcedDataFlush_W" , 0x1040, 2); /// W + const Reg ForcedDataFlush_W ("ForcedDataFlush_W" , 0x1040, RW::WriteONLY); /// W const Reg ChargeZeroSuppressionThreshold ("ChargeZeroSuppressionThreshold" , 0x1044); /// R/W const Reg ShortGateWidth ("ShortGateWidth" , 0x1054); /// R/W const Reg LongGateWidth ("LongGateWidth" , 0x1058); /// R/W @@ -282,13 +298,13 @@ namespace Register { const Reg TriggerHoldOffWidth ("TriggerHoldOffWidth" , 0x1074); /// R/W const Reg ThresholdForPSDCut ("ThresholdForPSDCut" , 0x1078); /// R/W const Reg PurGapThreshold ("PurGapThreshold" , 0x107C); /// R/W - const Reg DPPAlgorithmControl2_G ("DPPAlgorithmControl2_G" , 0x1084, 0, 1); /// R/W + const Reg DPPAlgorithmControl2_G ("DPPAlgorithmControl2_G" , 0x1084, RW::ReadWrite, 1); /// R/W const Reg EarlyBaselineFreeze ("EarlyBaselineFreeze" , 0x10D8); /// R/W } } -}; +}; // end of namepace Register -const std::vector RegisterPHAList = { +const std::vector RegisterPHAList = { Register::DPP::PHA::DataFlush_W , Register::DPP::PHA::ChannelStopAcquisition , Register::DPP::PHA::RCCR2SmoothingFactor , @@ -322,7 +338,7 @@ const std::vector RegisterPHAList = { Register::DPP::TriggerValidationMask_G }; -const std::vector RegisterPSDList = { +const std::vector RegisterPSDList = { Register::DPP::PSD::CFDSetting , Register::DPP::PSD::ForcedDataFlush_W , Register::DPP::PSD::ChargeZeroSuppressionThreshold , @@ -357,7 +373,7 @@ const std::vector RegisterPSDList = { }; /// Only Board Setting -const std::vector RegisterDPPList = { +const std::vector RegisterDPPList = { Register::DPP::BoardConfiguration , Register::DPP::AggregateOrganization , diff --git a/Scope.cpp b/Scope.cpp index e64f9fa..a065f29 100644 --- a/Scope.cpp +++ b/Scope.cpp @@ -59,21 +59,65 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh QGridLayout * layout = new QGridLayout(layoutWidget); layoutWidget->setLayout(layout); - //-------------------- + //================ Board & Ch selection rowID ++; cbScopeDigi = new RComboBox(this); cbScopeCh = new RComboBox(this); layout->addWidget(cbScopeDigi, rowID, 0); layout->addWidget(cbScopeCh, rowID, 1); + for(unsigned int i = 0; i < nDigi; i++){ + cbScopeDigi->addItem("Digi-" + QString::number(digi[i]->GetSerialNumber()), i); + } - //-------------------- Plot view + ID = 0; + cbScopeDigi->setCurrentIndex(0); + for( int i = 0; i < digi[0]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i)); + ch2ns = digi[ID]->GetCh2ns(); + + connect(cbScopeCh, &RComboBox::currentIndexChanged, this, [=](int index){ + if( !enableSignalSlot ) return; + ID = index; + ch2ns = digi[ID]->GetCh2ns(); + //---setup cbScopeCh + cbScopeCh->clear(); + for( int i = 0; i < digi[ID]->GetNChannels(); i++) cbScopeCh->addItem("Ch-" + QString::number(i)); + }); + + //================ Trace settings + rowID ++; + { + QGroupBox * settingGroup = new QGroupBox("Trace Settings",this); + layout->addWidget(settingGroup, rowID, 0, 1, 6); + + QGridLayout * bLayout = new QGridLayout(settingGroup); + bLayout->setSpacing(0); + + SetUpSpinBox(sbReordLength, "Record Length", bLayout, 0, 0, Register::DPP::RecordLength_G); + + + } + //================ Plot view rowID ++; TraceView * plotView = new TraceView(plot); plotView->setRenderHints(QPainter::Antialiasing); layout->addWidget(plotView, rowID, 0, 1, 6); - //------------ close button + //================ Key binding + rowID ++; + QLabel * lbhints = new QLabel("Type 'r' to restore view, '+/-' Zoom in/out, arrow key to pan.", this); + layout->addWidget(lbhints, rowID, 0, 1, 4); + + QLabel * lbinfo = new QLabel("Trace update every " + QString::number(updateTraceThread->GetWaitTimeSec()) + " sec.", this); + lbinfo->setAlignment(Qt::AlignRight); + layout->addWidget(lbinfo, rowID, 5); + + rowID ++; + //TODO =========== Trace step + QLabel * lbinfo2 = new QLabel("Maximum time range is " + QString::number(MaxDisplayTraceDataLength * 8) + " ns due to processing speed.", this); + layout->addWidget(lbinfo2, rowID, 0, 1, 5); + + //================ close button rowID ++; bnScopeStart = new QPushButton("Start", this); layout->addWidget(bnScopeStart, rowID, 0); @@ -97,8 +141,20 @@ Scope::Scope(Digitizer ** digi, unsigned int nDigi, ReadDataThread ** readDataTh layout->addWidget(bnClose, rowID, 5); connect(bnClose, &QPushButton::clicked, this, &Scope::close); + + + layout->setColumnStretch(0, 1); + layout->setColumnStretch(1, 1); + layout->setColumnStretch(2, 1); + layout->setColumnStretch(3, 1); + layout->setColumnStretch(4, 1); + layout->setColumnStretch(5, 1); + + enableSignalSlot = true; + } + Scope::~Scope(){ updateTraceThread->Stop(); @@ -109,6 +165,8 @@ Scope::~Scope(){ delete plot; } +//*======================================================= +//*======================================================= void Scope::StartScope(){ @@ -118,3 +176,58 @@ void Scope::StopScope(){ } +//*======================================================= +//*======================================================= +void Scope::SetUpComboBox(RComboBox * &cb, QString str, QGridLayout * layout, int row, int col, const Register::Reg para){ + QLabel * lb = new QLabel(str, this); + lb->setAlignment(Qt::AlignRight | Qt::AlignCenter); + layout->addWidget(lb, row, col); + + cb = new RComboBox(this); + layout->addWidget(cb, row, col + 1); +} + +void Scope::SetUpSpinBox(RSpinBox * &sb, QString str, QGridLayout * layout, int row, int col, const Register::Reg para){ + QLabel * lb = new QLabel(str, this); + lb->setAlignment(Qt::AlignRight | Qt::AlignCenter); + layout->addWidget(lb, row, col); + + sb = new RSpinBox(this); + if( para.GetPartialStep() != 0 ){ + sb->setMinimum(0); + sb->setMaximum(para.GetMax() * para.GetPartialStep() * ch2ns); + if( para.GetPartialStep() > 0 ) sb->setSingleStep(para.GetPartialStep() * ch2ns); + if( para.GetPartialStep() == -1 ) sb->setSingleStep(1); + } + layout->addWidget(sb, row, col + 1); + connect(sb, &RSpinBox::valueChanged, this, [=](){ + if( !enableSignalSlot ) return; + sb->setStyleSheet("color:blue"); + }); + + connect(sb, &RSpinBox::returnPressed, this, [=](){ + if( !enableSignalSlot ) return; + //int iDigi = cbScopeDigi->currentIndex(); + if( sb->decimals() == 0 && sb->singleStep() != 1) { + double step = sb->singleStep(); + double value = sb->value(); + sb->setValue( (std::round(value/step)*step)); + } + + //int ch = cbScopeCh->currentIndex(); + //if( chkSetAllChannel->isChecked() ) ch = -1; + // QString msg; + // msg = QString::fromStdString(digPara.GetPara()) + "|DIG:"+ QString::number(digi[iDigi]->GetSerialNumber()) + ",CH:" + (ch == -1 ? "All" : QString::number(ch)); + // msg += " = " + QString::number(sb->value()); + // if( digi[iDigi]->WriteValue(digPara, std::to_string(sb->value()), ch)){ + // SendLogMsg(msg + "|OK."); + // sb->setStyleSheet(""); + // UpdateSettingsFromMemeory(); + // UpdateOtherPanels(); + // }else{ + // SendLogMsg(msg + "|Fail."); + // sb->setStyleSheet("color:red;"); + // } + }); + +} diff --git a/Scope.h b/Scope.h index fb5acea..d07204d 100644 --- a/Scope.h +++ b/Scope.h @@ -36,12 +36,17 @@ private slots: void StartScope(); void StopScope(); + void SetUpComboBox(RComboBox * &cb, QString str, QGridLayout * layout, int row, int col, const Register::Reg para); + void SetUpSpinBox(RSpinBox * &sb, QString str, QGridLayout * layout, int row, int col, const Register::Reg para); + signals: private: Digitizer ** digi; unsigned short nDigi; + unsigned short ID; // the id of digi, index of cbScopeDigi + int ch2ns; ReadDataThread ** readDataThread; UpdateTraceThread * updateTraceThread; @@ -54,12 +59,16 @@ private: RComboBox * cbScopeDigi; RComboBox * cbScopeCh; - QPushButton * bnScopeStart; QPushButton * bnScopeStop; QLineEdit * leTriggerRate; + RSpinBox * sbReordLength; + //RSpinBox * sbPreTrigger; + + //RComboBox * cbDynamicRange; + }; diff --git a/test.cpp b/test.cpp index 3ccce08..f915e41 100644 --- a/test.cpp +++ b/test.cpp @@ -24,12 +24,9 @@ int keyboardhit(); int getch(void); //^====================================== - int main(int argc, char* argv[]){ - /**///##################### Demo with 2 digitizers - - const int nBoard = 2; + const int nBoard = 1; Digitizer **dig = new Digitizer *[nBoard]; for( int i = 0 ; i < nBoard; i++){ @@ -37,8 +34,25 @@ int main(int argc, char* argv[]){ int port = i/3; dig[i] = new Digitizer(board, port, false, true); } + + const float ch2ns = dig[0]->GetCh2ns(); + + Data * data = dig[0]->GetData(); + data->Allocate80MBMemory(); + + dig[0]->StartACQ(); + + sleep(3); + + dig[0]->ReadData(); + + data->SaveBuffer("test"); + + - /****** + + + /* TApplication * app = new TApplication("app", &argc, argv); TCanvas * canvas = new TCanvas("c", "haha", 1200, 400); canvas->Divide(3, 1); @@ -53,7 +67,7 @@ int main(int argc, char* argv[]){ canvas->cd(3); g1->Draw("AP"); Data * data = dig[0]->GetData(); - data->AllocateMemory(); + data->Allocate80MBMemory(); remove("test.bin"); @@ -65,13 +79,15 @@ int main(int argc, char* argv[]){ uint32_t CurrentTime = 0; uint32_t ElapsedTime = 0; + int waveFormLength = dig[0]->ReadRegister(Register::DPP::RecordLength_G); + while(true){ if(keyboardhit()) { break; } - usleep(50000); + usleep(1000); dig[0]->ReadData(); if( data->nByte > 0 ){ @@ -119,9 +135,7 @@ int main(int argc, char* argv[]){ } app->Run(); - - ***********/ - + */ printf("Closing digitizers..............\n"); for( int i = 0; i < nBoard; i++){