basic GUI, data thread, can take data
This commit is contained in:
parent
f5595fcecc
commit
44499a8f21
17
ClassData.h
17
ClassData.h
|
@ -59,7 +59,8 @@ class Data{
|
||||||
|
|
||||||
void CopyBuffer( const char * buffer, const unsigned int size);
|
void CopyBuffer( const char * buffer, const unsigned int size);
|
||||||
|
|
||||||
void SaveBuffer(const char * fileName);
|
void SetOutputFileName(std::string fileName);
|
||||||
|
void SaveBuffer();
|
||||||
unsigned int GetPresentFileSize() {return presentFileSizeByte;}
|
unsigned int GetPresentFileSize() {return presentFileSizeByte;}
|
||||||
|
|
||||||
void PrintBuffer() const; //Incorrect
|
void PrintBuffer() const; //Incorrect
|
||||||
|
@ -75,6 +76,8 @@ class Data{
|
||||||
unsigned int nw;
|
unsigned int nw;
|
||||||
bool SaveWaveToMemory;
|
bool SaveWaveToMemory;
|
||||||
|
|
||||||
|
std::string outputFileName;
|
||||||
|
|
||||||
///for temperary
|
///for temperary
|
||||||
std::vector<unsigned short> tempWaveform1;
|
std::vector<unsigned short> tempWaveform1;
|
||||||
std::vector<unsigned short> tempWaveform2;
|
std::vector<unsigned short> tempWaveform2;
|
||||||
|
@ -105,6 +108,8 @@ inline Data::Data(){
|
||||||
SaveWaveToMemory = true;
|
SaveWaveToMemory = true;
|
||||||
nw = 0;
|
nw = 0;
|
||||||
saveFileIndex = 0;
|
saveFileIndex = 0;
|
||||||
|
|
||||||
|
outputFileName = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Data::~Data(){
|
inline Data::~Data(){
|
||||||
|
@ -163,10 +168,14 @@ inline void Data::CopyBuffer(const char * buffer, const unsigned int size){
|
||||||
std::memcpy(this->buffer, buffer, size);
|
std::memcpy(this->buffer, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Data::SaveBuffer(const char * fileName){
|
inline void Data::SetOutputFileName(std::string fileName){
|
||||||
|
this->outputFileName = fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Data::SaveBuffer(){
|
||||||
|
|
||||||
char saveFileName[100];
|
char saveFileName[100];
|
||||||
sprintf(saveFileName, "%s_%03d_%03d_%03u.fsu", fileName , boardSN, DPPType, saveFileIndex);
|
sprintf(saveFileName, "%s_%03d_%03d_%03u.fsu", outputFileName.c_str() , boardSN, DPPType, saveFileIndex);
|
||||||
|
|
||||||
FILE * haha = fopen(saveFileName, "a+");
|
FILE * haha = fopen(saveFileName, "a+");
|
||||||
fseek(haha, 0L, SEEK_END);
|
fseek(haha, 0L, SEEK_END);
|
||||||
|
@ -176,7 +185,7 @@ inline void Data::SaveBuffer(const char * fileName){
|
||||||
if( inFileSize > (unsigned int)MaxSaveFileSize ) { /// 2 GB
|
if( inFileSize > (unsigned int)MaxSaveFileSize ) { /// 2 GB
|
||||||
fclose(haha);
|
fclose(haha);
|
||||||
saveFileIndex ++;
|
saveFileIndex ++;
|
||||||
sprintf(saveFileName, "%s_%03u.fsu", fileName , saveFileIndex);
|
sprintf(saveFileName, "%s_%03u.fsu", outputFileName.c_str() , saveFileIndex);
|
||||||
fclose(haha);
|
fclose(haha);
|
||||||
haha = fopen(saveFileName, "a+");
|
haha = fopen(saveFileName, "a+");
|
||||||
}
|
}
|
||||||
|
|
|
@ -394,7 +394,8 @@ unsigned int Digitizer::CalByteForBuffer(){
|
||||||
/// printf("Paired Ch : %d, RecordLength (bit value): %u, Event per Agg. : %u \n", pCh, recordLength[pCh], eventAgg[pCh]);
|
/// printf("Paired Ch : %d, RecordLength (bit value): %u, Event per Agg. : %u \n", pCh, recordLength[pCh], eventAgg[pCh]);
|
||||||
///}
|
///}
|
||||||
|
|
||||||
unsigned int bufferSize = 0;
|
unsigned int bufferSize = aggOrgan; // just for get rip of the warning in complier
|
||||||
|
bufferSize = 0;
|
||||||
for( int pCh = 0; pCh < NChannel/2 ; pCh++){
|
for( int pCh = 0; pCh < NChannel/2 ; pCh++){
|
||||||
if( (chMask & ( 3 << (2 * pCh) )) == 0 ) continue;
|
if( (chMask & ( 3 << (2 * pCh) )) == 0 ) continue;
|
||||||
bufferSize += 2 + ( 2 + ((boardCfg >> 17) & 0x1) + ((boardCfg >> 16) & 0x1)*recordLength[pCh]*4 ) * eventAgg[pCh] ;
|
bufferSize += 2 + ( 2 + ((boardCfg >> 17) & 0x1) + ((boardCfg >> 16) & 0x1)*recordLength[pCh]*4 ) * eventAgg[pCh] ;
|
||||||
|
@ -406,12 +407,12 @@ unsigned int Digitizer::CalByteForBuffer(){
|
||||||
return bufferSize ;
|
return bufferSize ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Digitizer::ReadData(){
|
int Digitizer::ReadData(){
|
||||||
if( !isConnected ) return;
|
if( !isConnected ) return CAEN_DGTZ_DigitizerNotFound;
|
||||||
if( !AcqRun) return;
|
if( !AcqRun) return CAEN_DGTZ_WrongAcqMode;
|
||||||
if( data->buffer == NULL ) {
|
if( data->buffer == NULL ) {
|
||||||
printf("need allocate memory for readout buffer\n");
|
printf("need allocate memory for readout buffer\n");
|
||||||
return;
|
return CAEN_DGTZ_InvalidBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = CAEN_DGTZ_ReadData(handle, CAEN_DGTZ_SLAVE_TERMINATED_READOUT_MBLT, data->buffer, &(data->nByte));
|
ret = CAEN_DGTZ_ReadData(handle, CAEN_DGTZ_SLAVE_TERMINATED_READOUT_MBLT, data->buffer, &(data->nByte));
|
||||||
|
@ -420,8 +421,9 @@ void Digitizer::ReadData(){
|
||||||
|
|
||||||
if (ret || data->nByte == 0) {
|
if (ret || data->nByte == 0) {
|
||||||
ErrorMsg(__func__);
|
ErrorMsg(__func__);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Digitizer::PrintACQStatue(){
|
void Digitizer::PrintACQStatue(){
|
||||||
|
@ -666,6 +668,8 @@ int Digitizer::LoadSettingBinaryToMemory(std::string fileName){
|
||||||
size_t dummy = fread( setting, SETTINGSIZE * sizeof(unsigned int), 1, settingFile);
|
size_t dummy = fread( setting, SETTINGSIZE * sizeof(unsigned int), 1, settingFile);
|
||||||
fclose (settingFile);
|
fclose (settingFile);
|
||||||
|
|
||||||
|
if( dummy == 0 ) printf("reach the end of file\n");
|
||||||
|
|
||||||
uint32_t boardInfo = GetSettingFromMemory(Register::DPP::BoardInfo_R);
|
uint32_t boardInfo = GetSettingFromMemory(Register::DPP::BoardInfo_R);
|
||||||
if( (boardInfo & 0xFF) == 0x0E ) ch2ns = 4.0;
|
if( (boardInfo & 0xFF) == 0x0E ) ch2ns = 4.0;
|
||||||
if( (boardInfo & 0xFF) == 0x0B ) ch2ns = 2.0;
|
if( (boardInfo & 0xFF) == 0x0B ) ch2ns = 2.0;
|
||||||
|
@ -691,6 +695,9 @@ unsigned int Digitizer::ReadSettingFromFile(Reg registerAddress, unsigned short
|
||||||
size_t dummy = fread( lala, sizeof(unsigned int), 1, settingFile);
|
size_t dummy = fread( lala, sizeof(unsigned int), 1, settingFile);
|
||||||
///printf(" data at pos %lu(%lu) : %X = %d\n", ftell(settingFile) - sizeof(unsigned int), (ftell(settingFile) - sizeof(unsigned int))/4, lala[0], lala[0]);
|
///printf(" data at pos %lu(%lu) : %X = %d\n", ftell(settingFile) - sizeof(unsigned int), (ftell(settingFile) - sizeof(unsigned int))/4, lala[0], lala[0]);
|
||||||
fclose (settingFile);
|
fclose (settingFile);
|
||||||
|
|
||||||
|
if( dummy == 0 ) printf("reach the end of file\n");
|
||||||
|
|
||||||
return lala[0];
|
return lala[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ class Digitizer{
|
||||||
|
|
||||||
Data * data;
|
Data * data;
|
||||||
|
|
||||||
///---- fixed parameter
|
//^---- fixed parameter
|
||||||
int portID; /// port ID for optical link for using PCIe card, from 0, 1, 2, 3
|
int portID; /// port ID for optical link for using PCIe card, from 0, 1, 2, 3
|
||||||
int boardID; /// board identity
|
int boardID; /// board identity
|
||||||
int handle; /// i don't know why, but better separete the handle from boardID
|
int handle; /// i don't know why, but better separete the handle from boardID
|
||||||
|
@ -34,35 +34,34 @@ class Digitizer{
|
||||||
float ch2ns; /// channel to ns
|
float ch2ns; /// channel to ns
|
||||||
CAEN_DGTZ_BoardInfo_t BoardInfo;
|
CAEN_DGTZ_BoardInfo_t BoardInfo;
|
||||||
|
|
||||||
///----- adjustable parameters
|
//^----- adjustable parameters
|
||||||
uint32_t channelMask ; /// the channel mask from NChannel
|
uint32_t channelMask ; /// the channel mask from NChannel
|
||||||
uint32_t VMEBaseAddress; /// For direct USB or Optical-link connection, VMEBaseAddress must be 0
|
uint32_t VMEBaseAddress; /// For direct USB or Optical-link connection, VMEBaseAddress must be 0
|
||||||
CAEN_DGTZ_ConnectionType LinkType; /// USB or Optic
|
CAEN_DGTZ_ConnectionType LinkType; /// USB or Optic
|
||||||
CAEN_DGTZ_IOLevel_t IOlev; /// TTL signal (1 = 1.5 to 5V, 0 = 0 to 0.7V ) or NIM signal (1 = -1 to -0.8V, 0 = 0V)
|
CAEN_DGTZ_IOLevel_t IOlev; /// TTL signal (1 = 1.5 to 5V, 0 = 0 to 0.7V ) or NIM signal (1 = -1 to -0.8V, 0 = 0V)
|
||||||
|
|
||||||
///------- other parameters
|
//^------- other parameters
|
||||||
int ret; /// return value, refer to CAEN_DGTZ_ErrorCode
|
int ret; /// return value, refer to CAEN_DGTZ_ErrorCode
|
||||||
bool isConnected; /// true for digitizer communication estabished.
|
bool isConnected; /// true for digitizer communication estabished.
|
||||||
bool AcqRun; /// true when digitizer is taking data
|
bool AcqRun; /// true when digitizer is taking data
|
||||||
bool isDummy; /// true for a dummy digitizer.
|
bool isDummy; /// true for a dummy digitizer.
|
||||||
|
|
||||||
/// ------- setting
|
//^-------- setting
|
||||||
std::string settingFileName; ///
|
std::string settingFileName; ///
|
||||||
FILE * settingFile; ///
|
FILE * settingFile; ///
|
||||||
bool settingFileExist; ///
|
bool settingFileExist; ///
|
||||||
bool isSettingFilledinMemeory; /// false for disabled ReadAllSettingFromBoard()
|
bool isSettingFilledinMemeory; /// false for disabled ReadAllSettingFromBoard()
|
||||||
unsigned int setting[SETTINGSIZE]; /// Setting, 4bytes x 2048 = 8192 bytes
|
unsigned int setting[SETTINGSIZE]; /// Setting, 4bytes x 2048 = 8192 bytes
|
||||||
|
|
||||||
///---------- protected functions
|
//^-------- other protected functions
|
||||||
|
|
||||||
void ErrorMsg(std::string header = "");
|
void ErrorMsg(std::string header = "");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Digitizer(); /// no digitizer open
|
Digitizer(); /// no digitizer open
|
||||||
Digitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
|
Digitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
|
||||||
~Digitizer();
|
virtual ~Digitizer();
|
||||||
|
|
||||||
/// portID is for optical link for using PCIe card, from 0, 1, 2, 3
|
//^------ portID is for optical link for using PCIe card, from 0, 1, 2, 3
|
||||||
int OpenDigitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
|
int OpenDigitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
|
||||||
void SetDPPType (int type) { this->DPPType = type;} /// for manual override, or, digitizer does not open
|
void SetDPPType (int type) { this->DPPType = type;} /// for manual override, or, digitizer does not open
|
||||||
void SetChannelMask (uint32_t mask);
|
void SetChannelMask (uint32_t mask);
|
||||||
|
@ -77,17 +76,17 @@ class Digitizer{
|
||||||
virtual int ProgramBoard() ; /// program a generic board, no program channel
|
virtual int ProgramBoard() ; /// program a generic board, no program channel
|
||||||
int ProgramPHABoard() ; /// program a default PHA board
|
int ProgramPHABoard() ; /// program a default PHA board
|
||||||
|
|
||||||
///================ ACQ control
|
//^================ ACQ control
|
||||||
void StopACQ();
|
void StopACQ();
|
||||||
void StartACQ();
|
void StartACQ();
|
||||||
void ReadData();
|
int ReadData();
|
||||||
bool IsRunning() const {return AcqRun;}
|
bool IsRunning() const {return AcqRun;}
|
||||||
Data * GetData() const {return data;}
|
Data * GetData() const {return data;}
|
||||||
void PrintACQStatue();
|
void PrintACQStatue();
|
||||||
|
|
||||||
unsigned int CalByteForBuffer();
|
unsigned int CalByteForBuffer();
|
||||||
|
|
||||||
///=================Settings
|
//^================= Settings
|
||||||
/// write value to digitizer, memory, and settingFile (if exist)
|
/// write value to digitizer, memory, and settingFile (if exist)
|
||||||
/// ONLY WriteRegister can have ch = -1, for writting all channels
|
/// ONLY WriteRegister can have ch = -1, for writting all channels
|
||||||
/// for board setting, ignore ch
|
/// for board setting, ignore ch
|
||||||
|
@ -97,7 +96,7 @@ class Digitizer{
|
||||||
uint32_t ReadRegister (Reg registerAddress, unsigned short ch = 0, bool isSave2MemAndFile = true, std::string str = "" );
|
uint32_t ReadRegister (Reg registerAddress, unsigned short ch = 0, bool isSave2MemAndFile = true, std::string str = "" );
|
||||||
uint32_t PrintRegister(uint32_t address, std::string msg);
|
uint32_t PrintRegister(uint32_t address, std::string msg);
|
||||||
|
|
||||||
///================ Get Board info
|
//^================ Get Board info
|
||||||
std::string GetModelName() const {return BoardInfo.ModelName;}
|
std::string GetModelName() const {return BoardInfo.ModelName;}
|
||||||
int GetSerialNumber() const {return BoardInfo.SerialNumber;}
|
int GetSerialNumber() const {return BoardInfo.SerialNumber;}
|
||||||
int GetChannelMask() const {return channelMask;}
|
int GetChannelMask() const {return channelMask;}
|
||||||
|
@ -105,7 +104,6 @@ class Digitizer{
|
||||||
float GetCh2ns() const {return ch2ns;}
|
float GetCh2ns() const {return ch2ns;}
|
||||||
int GetNChannel() const {return NChannel;}
|
int GetNChannel() const {return NChannel;}
|
||||||
int GetHandle() const {return handle;}
|
int GetHandle() const {return handle;}
|
||||||
bool GetConnectionStatus() const {return isConnected;}
|
|
||||||
int GetDPPType() const {return DPPType;}
|
int GetDPPType() const {return DPPType;}
|
||||||
std::string GetDPPString(int DPPType = 0); /// if no input, use digitizer DPPType
|
std::string GetDPPString(int DPPType = 0); /// if no input, use digitizer DPPType
|
||||||
int GetADCBits() const {return BoardInfo.ADC_NBits;}
|
int GetADCBits() const {return BoardInfo.ADC_NBits;}
|
||||||
|
@ -113,7 +111,7 @@ class Digitizer{
|
||||||
std::string GetAMCVersion() const {return BoardInfo.AMC_FirmwareRel;}
|
std::string GetAMCVersion() const {return BoardInfo.AMC_FirmwareRel;}
|
||||||
CAEN_DGTZ_ConnectionType GetLinkType() const {return LinkType;}
|
CAEN_DGTZ_ConnectionType GetLinkType() const {return LinkType;}
|
||||||
|
|
||||||
///================ Setting
|
//^================ Setting
|
||||||
Reg FindRegister(uint32_t address);
|
Reg FindRegister(uint32_t address);
|
||||||
/// board <--> memory functions
|
/// board <--> memory functions
|
||||||
void ReadAllSettingsFromBoard (bool force = false);
|
void ReadAllSettingsFromBoard (bool force = false);
|
||||||
|
@ -138,42 +136,6 @@ class Digitizer{
|
||||||
void SaveSettingToFile (Reg registerAddress, unsigned int value, unsigned short ch = 0); /// also save to memory
|
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
|
unsigned int ReadSettingFromFile (Reg registerAddress, unsigned short ch = 0); /// read from setting binary
|
||||||
|
|
||||||
///=================== Relic methods
|
|
||||||
///void SetRecordLength (unsigned int ns, int ch = -1); /// when ch == -1, mean set all channels
|
|
||||||
///void SetInputDynamicRange (unsigned int TwoVol_0_or_halfVol_1, int ch = -1);
|
|
||||||
///void SetPreTriggerSample (unsigned int nSample, int ch = -1 );
|
|
||||||
///void SetPreTriggerDuration (unsigned int ns, int ch = -1 );
|
|
||||||
///void SetDCOffset (float offsetPrecentage, int ch = -1);
|
|
||||||
///void SetVetoWidth (uint32_t bit, int ch = -1); /// See manual
|
|
||||||
///void SetTriggerPolarity (bool RiseingIsZero, int ch = -1); ///not used for DPP firmware
|
|
||||||
///
|
|
||||||
///void SetEventAggregation (unsigned int numEvent, int ch = -1);
|
|
||||||
///void SetAggregateOrganization (unsigned int bit);
|
|
||||||
///void SetMaxAggregatePerBlockTransfer (unsigned int numEvent);
|
|
||||||
///
|
|
||||||
///void SetBits(Reg address, unsigned int bitValue, unsigned int bitLength, unsigned int bitSmallestPos, int ch = -1);
|
|
||||||
///void SetDPPAlgorithmControl(uint32_t bit, int ch = -1);
|
|
||||||
///
|
|
||||||
///void SetACQControl(uint32_t bit);
|
|
||||||
///void SetGlobalTriggerMask(uint32_t bit);
|
|
||||||
///void SetFrontPanelTRGOUTMask(uint32_t bit);
|
|
||||||
///void SetFrontPanelIOControl(uint32_t bit);
|
|
||||||
///void SetTriggerValidationMask(uint32_t bit);
|
|
||||||
///void SetBoardID(unsigned int ID) {WriteRegister(Register::DPP::BoardID, ID));
|
|
||||||
|
|
||||||
///unsigned int GetRecordLengthSample(int ch) {return ReadRegister(Register::DPP::RecordLength_G, ch) * 8;}
|
|
||||||
///unsigned int GetInputDynamicRange(int ch) {return ReadRegister(Register::DPP::InputDynamicRange, ch);}
|
|
||||||
///unsigned int GetPreTriggerSample(int ch) {return ReadRegister(Register::DPP::PreTrigger, ch) * 4;}
|
|
||||||
///float GetDCOffset(int ch) {return 100.0 - ReadRegister(Register::DPP::ChannelDCOffset, ch) * 100. / 0xFFFFF; }
|
|
||||||
///unsigned int GetVetoWidth(int ch) {return ReadRegister(Register::DPP::VetoWidth, ch);}
|
|
||||||
///unsigned int GetEventAggregation(int ch = -1) {return ReadRegister(Register::DPP::NumberEventsPerAggregate_G, ch);}
|
|
||||||
///unsigned int GetAggregateOrganization() {return ReadRegister(Register::DPP::AggregateOrganization);}
|
|
||||||
///unsigned int GetMaxNumberOfAggregatePerBlockTransfer() {return ReadRegister(Register::DPP::MaxAggregatePerBlockTransfer);}
|
|
||||||
///
|
|
||||||
///unsigned int ReadBits(Reg address, unsigned int bitLength, unsigned int bitSmallestPos, int ch = -1 );
|
|
||||||
///unsigned int GetDPPAlgorithmControl(int ch = -1) {return ReadRegister(Register::DPP::DPPAlgorithmControl, ch);}
|
|
||||||
///
|
|
||||||
///int GetChTemperature(int ch) ;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
135
CustomThreads.h
Normal file
135
CustomThreads.h
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
#ifndef CUSTOMTHREADS_H
|
||||||
|
#define CUSTOMTHREADS_H
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
#include <QMutex>
|
||||||
|
|
||||||
|
#include "macro.h"
|
||||||
|
#include "ClassDigitizer.h"
|
||||||
|
|
||||||
|
static QMutex digiMTX[MaxNBoards * MaxNPorts];
|
||||||
|
|
||||||
|
//^#===================================================== ReadData Thread
|
||||||
|
class ReadDataThread : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
ReadDataThread(Digitizer * dig, int digiID, QObject * parent = 0) : QThread(parent){
|
||||||
|
this->digi = dig;
|
||||||
|
this->ID = digiID;
|
||||||
|
isSaveData = false;
|
||||||
|
}
|
||||||
|
void SetSaveData(bool onOff) {this->isSaveData = onOff;}
|
||||||
|
void run(){
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ta);
|
||||||
|
while(true){
|
||||||
|
digiMTX[ID].lock();
|
||||||
|
int ret = digi->ReadData();
|
||||||
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
|
if( ret == CAEN_DGTZ_Success ){
|
||||||
|
digiMTX[ID].lock();
|
||||||
|
if( isSaveData ) {
|
||||||
|
digi->GetData()->SaveBuffer();
|
||||||
|
}else{
|
||||||
|
digi->GetData()->DecodeBuffer(false);
|
||||||
|
}
|
||||||
|
digiMTX[ID].unlock();
|
||||||
|
|
||||||
|
}else{
|
||||||
|
printf("%s------------ ret : %d \n", __func__, ret);
|
||||||
|
if( ret == CAEN_DGTZ_WrongAcqMode) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// // if( ret == CAEN_FELib_Success){
|
||||||
|
// // if( isSaveData) digi->SaveDataToFile();
|
||||||
|
// // }else if(ret == CAEN_FELib_Stop){
|
||||||
|
// // digi->ErrorMsg("No more data");
|
||||||
|
// // //emit endOfLastData();
|
||||||
|
// // break;
|
||||||
|
// // }else{
|
||||||
|
// // //digi->ErrorMsg("ReadDataLoop()");
|
||||||
|
// // digi->evt->ClearTrace();
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // if( isSaveData ){
|
||||||
|
// // clock_gettime(CLOCK_REALTIME, &tb);
|
||||||
|
// // if( tb.tv_sec - ta.tv_sec > 2 ) {
|
||||||
|
// // emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetTotalFilesSize()/1024./1024.) + " MB");
|
||||||
|
// // //emit checkFileSize();
|
||||||
|
// // //double duration = tb.tv_nsec-ta.tv_nsec + tb.tv_sec*1e+9 - ta.tv_sec*1e+9;
|
||||||
|
// // //printf("%4d, duration : %10.0f, %6.1f\n", readCount, duration, 1e9/duration);
|
||||||
|
// // ta = tb;
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
signals:
|
||||||
|
void sendMsg(const QString &msg);
|
||||||
|
//void endOfLastData();
|
||||||
|
//void checkFileSize();
|
||||||
|
private:
|
||||||
|
Digitizer * digi;
|
||||||
|
int ID;
|
||||||
|
timespec ta, tb;
|
||||||
|
bool isSaveData;
|
||||||
|
};
|
||||||
|
|
||||||
|
//^#===================================================== UpdateTrace Thread
|
||||||
|
class UpdateTraceThread : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
UpdateTraceThread(QObject * parent = 0) : QThread(parent){
|
||||||
|
waitTime = 2;
|
||||||
|
stop = false;
|
||||||
|
}
|
||||||
|
unsigned int GetWaitTimeSec() const {return waitTime;}
|
||||||
|
void SetWaitTimeSec(unsigned sec) {waitTime = sec;}
|
||||||
|
void Stop() {this->stop = true;}
|
||||||
|
void run(){
|
||||||
|
unsigned int count = 0;
|
||||||
|
stop = false;
|
||||||
|
do{
|
||||||
|
usleep(100000);
|
||||||
|
count ++;
|
||||||
|
if( count % waitTime == 0){
|
||||||
|
emit updateTrace();
|
||||||
|
}
|
||||||
|
}while(!stop);
|
||||||
|
}
|
||||||
|
signals:
|
||||||
|
void updateTrace();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool stop;
|
||||||
|
unsigned int waitTime; //100 of milisec
|
||||||
|
};
|
||||||
|
|
||||||
|
//^#======================================================= Scalar Thread
|
||||||
|
class ScalarThread : public QThread {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
ScalarThread(QObject * parent = 0 ) : QThread(parent){
|
||||||
|
waitTime = 20; // 10 x 100 milisec
|
||||||
|
stop = false;
|
||||||
|
}
|
||||||
|
void Stop() { this->stop = true;}
|
||||||
|
unsigned int GetWaitTimeinSec() const {return waitTime/10;}
|
||||||
|
void run(){
|
||||||
|
unsigned int count = 0;
|
||||||
|
stop = false;
|
||||||
|
do{
|
||||||
|
usleep(100000);
|
||||||
|
count ++;
|
||||||
|
if( count % waitTime == 0){
|
||||||
|
emit updataScalar();
|
||||||
|
}
|
||||||
|
}while(!stop);
|
||||||
|
}
|
||||||
|
signals:
|
||||||
|
void updataScalar();
|
||||||
|
private:
|
||||||
|
bool stop;
|
||||||
|
unsigned int waitTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
53
CustomWidgets.h
Normal file
53
CustomWidgets.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#ifndef CustomWidgets_H
|
||||||
|
#define CustomWidgets_H
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QDoubleSpinBox>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QWheelEvent>
|
||||||
|
|
||||||
|
//^=======================================
|
||||||
|
class RSpinBox : public QDoubleSpinBox{
|
||||||
|
Q_OBJECT
|
||||||
|
public :
|
||||||
|
RSpinBox(QWidget * parent = nullptr, int decimal = 0): QDoubleSpinBox(parent){
|
||||||
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
|
setDecimals(decimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetToolTip(double min = -1){
|
||||||
|
if( min == -1 ){
|
||||||
|
setToolTip("(" + QString::number(minimum()) + " - " + QString::number(maximum()) + ", " + QString::number(singleStep()) + ")");
|
||||||
|
}else{
|
||||||
|
setToolTip("(" + QString::number(min) + " - " + QString::number(maximum()) + ", " + QString::number(singleStep()) + ")");
|
||||||
|
}
|
||||||
|
setToolTipDuration(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void returnPressed();
|
||||||
|
protected:
|
||||||
|
void wheelEvent(QWheelEvent * event) override{ event->ignore(); }
|
||||||
|
|
||||||
|
void keyPressEvent(QKeyEvent * event) override{
|
||||||
|
if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {
|
||||||
|
emit returnPressed();
|
||||||
|
} else {
|
||||||
|
QDoubleSpinBox::keyPressEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//^=======================================
|
||||||
|
class RComboBox : public QComboBox{
|
||||||
|
public :
|
||||||
|
RComboBox(QWidget * parent = nullptr): QComboBox(parent){
|
||||||
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
void wheelEvent(QWheelEvent * event) override{ event->ignore(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -21,7 +21,7 @@ LIBS += -lCAENDigitizer `root-config --cflags --glibs`
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
# Input
|
# Input
|
||||||
HEADERS += ClassData.h ClassDigitizer.h macro.h mainWindow.h RegisterAddress.h
|
HEADERS += ClassData.h ClassDigitizer.h macro.h mainWindow.h RegisterAddress.h CustomWidgets.h CustomThreads.h
|
||||||
SOURCES += ClassDigitizer.cpp main.cpp mainWindow.C
|
SOURCES += ClassDigitizer.cpp main.cpp mainWindow.C
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -425,184 +425,4 @@ const std::vector<Reg> RegisterDPPList = {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/***************************
|
|
||||||
namespace Register {
|
|
||||||
const uint32_t EventReadOutBuffer = 0x0000; /// R
|
|
||||||
|
|
||||||
///========== Channel or Group
|
|
||||||
const uint32_t ChannelDummy32 = 0x1024; /// R/W
|
|
||||||
const uint32_t InputDynamicRange = 0x1028; /// R/W
|
|
||||||
const uint32_t ChannelPulseWidth = 0x1070; /// R/W
|
|
||||||
const uint32_t ChannelTriggerThreshold = 0x1080; /// R/W
|
|
||||||
const uint32_t CoupleSelfTriggerLogic_G = 0x1084; /// R/W
|
|
||||||
const uint32_t ChannelStatus_R = 0x1088; /// R
|
|
||||||
const uint32_t AMCFirmwareRevision_ = 0x108C; /// R
|
|
||||||
const uint32_t ChannelDCOffset = 0x1098; /// R/W
|
|
||||||
const uint32_t ChannelADCTemperature_R = 0x10A8; /// R
|
|
||||||
const uint32_t ChannelSelfTriggerRateMeter_R = 0x10EC; /// R
|
|
||||||
|
|
||||||
///========== Board
|
|
||||||
const uint32_t BoardConfiguration = 0x8000; /// R/W
|
|
||||||
const uint32_t BufferOrganization = 0x800C; /// R/W
|
|
||||||
const uint32_t CustomSize = 0x8020; /// R/W
|
|
||||||
const uint32_t ADCCalibration_W = 0x809C; /// W
|
|
||||||
const uint32_t AcquisitionControl = 0x8100; /// R/W
|
|
||||||
const uint32_t AcquisitionStatus_R = 0x8104; /// R
|
|
||||||
const uint32_t SoftwareTrigger_W = 0x8108; /// W
|
|
||||||
const uint32_t GlobalTriggerMask = 0x810C; /// R/W
|
|
||||||
const uint32_t FrontPanelTRGOUTEnableMask = 0x8110; /// R/W
|
|
||||||
const uint32_t PostTrigger = 0x8114; /// R/W
|
|
||||||
const uint32_t LVDSIOData = 0x8118; /// R/W
|
|
||||||
const uint32_t FrontPanelIOControl = 0x811C; /// R/W
|
|
||||||
const uint32_t ChannelEnableMask = 0x8120; /// R/W
|
|
||||||
const uint32_t ROCFPGAFirmwareRevision_R = 0x8124; /// R
|
|
||||||
const uint32_t EventStored_R = 0x812C; /// R
|
|
||||||
const uint32_t VoltageLevelModeConfig = 0x8138; /// R/W
|
|
||||||
const uint32_t SoftwareClockSync_W = 0x813C; /// W
|
|
||||||
const uint32_t BoardInfo_R = 0x8140; /// R
|
|
||||||
const uint32_t AnalogMonitorMode = 0x8144; /// R/W
|
|
||||||
const uint32_t EventSize_R = 0x814C; /// R
|
|
||||||
const uint32_t FanSpeedControl = 0x8168; /// R/W
|
|
||||||
const uint32_t MemoryBufferAlmostFullLevel = 0x816C; /// R/W
|
|
||||||
const uint32_t RunStartStopDelay = 0x8170; /// R/W
|
|
||||||
const uint32_t BoardFailureStatus_R = 0x8178; /// R
|
|
||||||
const uint32_t FrontPanelLVDSIONewFeatures = 0x81A0; /// R/W
|
|
||||||
const uint32_t BufferOccupancyGain = 0x81B4; /// R/W
|
|
||||||
const uint32_t ChannelsShutdown_W = 0x81C0; /// W
|
|
||||||
const uint32_t ExtendedVetoDelay = 0x81C4; /// R/W
|
|
||||||
const uint32_t ReadoutControl = 0xEF00; /// R/W
|
|
||||||
const uint32_t ReadoutStatus_R = 0xEF04; /// R
|
|
||||||
const uint32_t BoardID = 0xEF08; /// R/W
|
|
||||||
const uint32_t MCSTBaseAddressAndControl = 0xEF0C; /// R/W
|
|
||||||
const uint32_t RelocationAddress = 0xEF10; /// R/W
|
|
||||||
const uint32_t InterruptStatusID = 0xEF14; /// R/W
|
|
||||||
const uint32_t InterruptEventNumber = 0xEF18; /// R/W
|
|
||||||
const uint32_t MaxAggregatePerBlockTransfer = 0xEF1C; /// R/W
|
|
||||||
const uint32_t Scratch = 0xEF20; /// R/W
|
|
||||||
const uint32_t SoftwareReset_W = 0xEF24; /// W
|
|
||||||
const uint32_t SoftwareClear_W = 0xEF28; /// W
|
|
||||||
|
|
||||||
///====== Common for PHA and PSD
|
|
||||||
namespace DPP {
|
|
||||||
const uint32_t RecordLength_G = 0x1020; /// R/W
|
|
||||||
const uint32_t InputDynamicRange = 0x1028; /// R/W
|
|
||||||
const uint32_t NumberEventsPerAggregate_G = 0x1034; /// R/W
|
|
||||||
const uint32_t PreTrigger = 0x1038; /// R/W
|
|
||||||
const uint32_t TriggerThreshold = 0x106C; /// R/W
|
|
||||||
const uint32_t TriggerHoldOffWidth = 0x1074; /// R/W
|
|
||||||
const uint32_t DPPAlgorithmControl = 0x1080; /// R/W
|
|
||||||
const uint32_t ChannelStatus_R = 0x1088; /// R
|
|
||||||
const uint32_t AMCFirmwareRevision_R = 0x108C; /// R
|
|
||||||
const uint32_t ChannelDCOffset = 0x1098; /// R/W
|
|
||||||
const uint32_t ChannelADCTemperature_R = 0x10A8; /// R
|
|
||||||
const uint32_t IndividualSoftwareTrigger_W = 0x10C0; /// W
|
|
||||||
const uint32_t VetoWidth = 0x10D4; /// R/W
|
|
||||||
|
|
||||||
/// I know there are many duplication, it is the design.
|
|
||||||
const uint32_t BoardConfiguration = 0x8000; /// R/W
|
|
||||||
const uint32_t AggregateOrganization = 0x800C; /// R/W
|
|
||||||
const uint32_t ADCCalibration_W = 0x809C; /// W
|
|
||||||
const uint32_t ChannelShutdown_W = 0x80BC; /// W
|
|
||||||
const uint32_t AcquisitionControl = 0x8100; /// R/W
|
|
||||||
const uint32_t AcquisitionStatus_R = 0x8104; /// R
|
|
||||||
const uint32_t SoftwareTrigger_W = 0x8108; /// W
|
|
||||||
const uint32_t GlobalTriggerMask = 0x810C; /// R/W
|
|
||||||
const uint32_t FrontPanelTRGOUTEnableMask = 0x8110; /// R/W
|
|
||||||
const uint32_t LVDSIOData = 0x8118; /// R/W
|
|
||||||
const uint32_t FrontPanelIOControl = 0x811C; /// R/W
|
|
||||||
const uint32_t ChannelEnableMask = 0x8120; /// R/W
|
|
||||||
const uint32_t ROCFPGAFirmwareRevision_R = 0x8124; /// R
|
|
||||||
const uint32_t EventStored_R = 0x812C; /// R
|
|
||||||
const uint32_t VoltageLevelModeConfig = 0x8138; /// R/W
|
|
||||||
const uint32_t SoftwareClockSync_W = 0x813C; /// W
|
|
||||||
const uint32_t BoardInfo_R = 0x8140; /// R /// [0:7] 0x0E = 725, 0x0B = 730, [8:15] 0x01 = 640 kSample, 0x08 = 5.12 MSample, [16:23] channel number
|
|
||||||
const uint32_t AnalogMonitorMode = 0x8144; /// R/W
|
|
||||||
const uint32_t EventSize_R = 0x814C; /// R
|
|
||||||
const uint32_t TimeBombDowncounter_R = 0x8158; /// R
|
|
||||||
const uint32_t FanSpeedControl = 0x8168; /// R/W
|
|
||||||
const uint32_t RunStartStopDelay = 0x8170; /// R/W
|
|
||||||
const uint32_t BoardFailureStatus_R = 0x8178; /// R
|
|
||||||
const uint32_t DisableExternalTrigger = 0x817C; /// R/W
|
|
||||||
const uint32_t TriggerValidationMask_G = 0x8180; /// R/W, 0x8180 + 4n
|
|
||||||
const uint32_t FrontPanelLVDSIONewFeatures = 0x81A0; /// R/W
|
|
||||||
const uint32_t BufferOccupancyGain = 0x81B4; /// R/W
|
|
||||||
const uint32_t ExtendedVetoDelay = 0x81C4; /// R/W
|
|
||||||
const uint32_t ReadoutControl = 0xEF00; /// R/W
|
|
||||||
const uint32_t ReadoutStatus_R = 0xEF04; /// R
|
|
||||||
const uint32_t BoardID = 0xEF08; /// R/W /// Geo address on VME crate
|
|
||||||
const uint32_t MCSTBaseAddressAndControl = 0xEF0C; /// R/W
|
|
||||||
const uint32_t RelocationAddress = 0xEF10; /// R/W
|
|
||||||
const uint32_t InterruptStatusID = 0xEF14; /// R/W
|
|
||||||
const uint32_t InterruptEventNumber = 0xEF18; /// R/W
|
|
||||||
const uint32_t MaxAggregatePerBlockTransfer= 0xEF1C; /// R/W
|
|
||||||
const uint32_t Scratch = 0xEF20; /// R/W
|
|
||||||
const uint32_t SoftwareReset_W = 0xEF24; /// W
|
|
||||||
const uint32_t SoftwareClear_W = 0xEF28; /// W
|
|
||||||
const uint32_t ConfigurationReload_W = 0xEF34; /// W
|
|
||||||
const uint32_t ROMChecksum_R = 0xF000; /// R
|
|
||||||
const uint32_t ROMChecksumByte2_R = 0xF004; /// R
|
|
||||||
const uint32_t ROMChecksumByte1_R = 0xF008; /// R
|
|
||||||
const uint32_t ROMChecksumByte0_R = 0xF00C; /// R
|
|
||||||
const uint32_t ROMConstantByte2_R = 0xF010; /// R
|
|
||||||
const uint32_t ROMConstantByte1_R = 0xF014; /// R
|
|
||||||
const uint32_t ROMConstantByte0_R = 0xF018; /// R
|
|
||||||
const uint32_t ROM_C_Code_R = 0xF01C; /// R
|
|
||||||
const uint32_t ROM_R_Code_R = 0xF020; /// R
|
|
||||||
const uint32_t ROM_IEEE_OUI_Byte2_R = 0xF024; /// R
|
|
||||||
const uint32_t ROM_IEEE_OUI_Byte1_R = 0xF028; /// R
|
|
||||||
const uint32_t ROM_IEEE_OUI_Byte0_R = 0xF02C; /// R
|
|
||||||
const uint32_t ROM_BoardVersion_R = 0xF030; /// R
|
|
||||||
const uint32_t ROM_BoardFromFactor_R = 0xF034; /// R
|
|
||||||
const uint32_t ROM_BoardIDByte1_R = 0xF038; /// R
|
|
||||||
const uint32_t ROM_BoardIDByte0_R = 0xF03C; /// R
|
|
||||||
const uint32_t ROM_PCB_rev_Byte3_R = 0xF040; /// R
|
|
||||||
const uint32_t ROM_PCB_rev_Byte2_R = 0xF044; /// R
|
|
||||||
const uint32_t ROM_PCB_rev_Byte1_R = 0xF048; /// R
|
|
||||||
const uint32_t ROM_PCB_rev_Byte0_R = 0xF04C; /// R
|
|
||||||
const uint32_t ROM_FlashType_R = 0xF050; /// R
|
|
||||||
const uint32_t ROM_BoardSerialNumByte1_R = 0xF080; /// R
|
|
||||||
const uint32_t ROM_BoardSerialNumByte0_R = 0xF084; /// R
|
|
||||||
const uint32_t ROM_VCXO_Type_R = 0xF088; /// R
|
|
||||||
|
|
||||||
namespace PHA {
|
|
||||||
const uint32_t DataFlush_W = 0x103C; /// W not sure
|
|
||||||
const uint32_t ChannelStopAcquisition = 0x1040; /// R/W not sure
|
|
||||||
const uint32_t RCCR2SmoothingFactor = 0x1054; /// R/W Trigger Filter smoothing, triggerSmoothingFactor
|
|
||||||
const uint32_t InputRiseTime = 0x1058; /// R/W OK
|
|
||||||
const uint32_t TrapezoidRiseTime = 0x105C; /// R/W OK
|
|
||||||
const uint32_t TrapezoidFlatTop = 0x1060; /// R/W OK
|
|
||||||
const uint32_t PeakingTime = 0x1064; /// R/W OK
|
|
||||||
const uint32_t DecayTime = 0x1068; /// R/W OK
|
|
||||||
const uint32_t TriggerThreshold = 0x106C; /// R/W OK
|
|
||||||
const uint32_t RiseTimeValidationWindow = 0x1070; /// R/W OK
|
|
||||||
const uint32_t TriggerHoldOffWidth = 0x1074; /// R/W OK
|
|
||||||
const uint32_t PeakHoldOff = 0x1078; /// R/W OK
|
|
||||||
const uint32_t ShapedTriggerWidth = 0x1084; /// R/W not sure
|
|
||||||
const uint32_t DPPAlgorithmControl2_G = 0x10A0; /// R/W OK
|
|
||||||
const uint32_t FineGain = 0x10C4; /// R/W OK
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace PSD {
|
|
||||||
const uint32_t CFDSetting = 0x103C; /// R/W
|
|
||||||
const uint32_t ForcedDataFlush_W = 0x1040; /// W
|
|
||||||
const uint32_t ChargeZeroSuppressionThreshold = 0x1044; /// R/W
|
|
||||||
const uint32_t ShortGateWidth = 0x1054; /// R/W
|
|
||||||
const uint32_t LongGateWidth = 0x1058; /// R/W
|
|
||||||
const uint32_t GateOffset = 0x105C; /// R/W
|
|
||||||
const uint32_t TriggerThreshold = 0x1060; /// R/W
|
|
||||||
const uint32_t FixedBaseline = 0x1064; /// R/W
|
|
||||||
const uint32_t TriggerLatency = 0x106C; /// R/W
|
|
||||||
const uint32_t ShapedTriggerWidth = 0x1070; /// R/W
|
|
||||||
const uint32_t TriggerHoldOffWidth = 0x1074; /// R/W
|
|
||||||
const uint32_t ThresholdForPSDCut = 0x1078; /// R/W
|
|
||||||
const uint32_t PurGapThreshold = 0x107C; /// R/W
|
|
||||||
const uint32_t DPPAlgorithmControl2_G = 0x1084; /// R/W
|
|
||||||
const uint32_t EarlyBaselineFreeze = 0x10D8; /// R/W
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*********************************/
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
2
macro.h
2
macro.h
|
@ -2,7 +2,7 @@
|
||||||
#define MACRO_H
|
#define MACRO_H
|
||||||
|
|
||||||
#define MaxNPorts 4
|
#define MaxNPorts 4
|
||||||
#define MaxNBoards 22
|
#define MaxNBoards 6
|
||||||
#define MaxNChannels 16
|
#define MaxNChannels 16
|
||||||
#define MaxRecordLength 0x3fff * 8
|
#define MaxRecordLength 0x3fff * 8
|
||||||
#define MaxSaveFileSize 1024 * 1024 * 1024 * 2
|
#define MaxSaveFileSize 1024 * 1024 * 1024 * 2
|
||||||
|
|
240
mainWindow.C
240
mainWindow.C
|
@ -1,19 +1,259 @@
|
||||||
#include "mainWindow.h"
|
#include "mainWindow.h"
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QGroupBox>
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
#include <TH1.h>
|
#include <TH1.h>
|
||||||
|
|
||||||
|
#include "CustomWidgets.h"
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
|
||||||
|
|
||||||
setWindowTitle("FSU DAQ");
|
setWindowTitle("FSU DAQ");
|
||||||
setGeometry(500, 100, 1000, 500);
|
setGeometry(500, 100, 1000, 500);
|
||||||
|
|
||||||
|
digi = nullptr;
|
||||||
|
nDigi = 0;
|
||||||
|
|
||||||
|
QWidget * mainLayoutWidget = new QWidget(this);
|
||||||
|
setCentralWidget(mainLayoutWidget);
|
||||||
|
QVBoxLayout * layoutMain = new QVBoxLayout(mainLayoutWidget);
|
||||||
|
mainLayoutWidget->setLayout(layoutMain);
|
||||||
|
|
||||||
|
{//^=======================
|
||||||
|
QGroupBox * box = new QGroupBox("Digitizer(s)", mainLayoutWidget);
|
||||||
|
layoutMain->addWidget(box);
|
||||||
|
QGridLayout * layout = new QGridLayout(box);
|
||||||
|
|
||||||
|
QPushButton * bnOpenDigitizers = new QPushButton("Open Digitizers", this);
|
||||||
|
layout->addWidget(bnOpenDigitizers, 0, 0);
|
||||||
|
connect(bnOpenDigitizers, &QPushButton::clicked, this, &MainWindow::OpenDigitizers);
|
||||||
|
|
||||||
|
QPushButton * bnCloseDigitizers = new QPushButton("Close Digitizers", this);
|
||||||
|
layout->addWidget(bnCloseDigitizers, 0, 1);
|
||||||
|
connect(bnCloseDigitizers, &QPushButton::clicked, this, &MainWindow::OpenDigitizers);
|
||||||
|
|
||||||
|
QPushButton * bnOpenScope = new QPushButton("Open Scope", this);
|
||||||
|
layout->addWidget(bnOpenScope, 1, 0);
|
||||||
|
//connect(bnDigiSettings, &QPushButton::clicked, this, &MainWindow::OpenDigiSettings);
|
||||||
|
|
||||||
|
QPushButton * bnDigiSettings = new QPushButton("Digitizers Settings", this);
|
||||||
|
layout->addWidget(bnDigiSettings, 1, 1);
|
||||||
|
//connect(bnDigiSettings, &QPushButton::clicked, this, &MainWindow::OpenDigiSettings);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{//^====================== ACQ control
|
||||||
|
QGroupBox * box = new QGroupBox("ACQ Control", mainLayoutWidget);
|
||||||
|
layoutMain->addWidget(box);
|
||||||
|
QGridLayout * layout = new QGridLayout(box);
|
||||||
|
|
||||||
|
int rowID = 0;
|
||||||
|
QLabel * lbDataPath = new QLabel("Data Path : ", this);
|
||||||
|
lbDataPath->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||||
|
leDataPath = new QLineEdit(this);
|
||||||
|
leDataPath->setEnabled(false);
|
||||||
|
QPushButton * bnSetDataPath = new QPushButton("Set Path", this);
|
||||||
|
connect(bnSetDataPath, &QPushButton::clicked, this, &MainWindow::OpenDataPath);
|
||||||
|
|
||||||
|
layout->addWidget(lbDataPath, rowID, 0);
|
||||||
|
layout->addWidget(leDataPath, rowID, 1, 1, 3);
|
||||||
|
layout->addWidget(bnSetDataPath, rowID, 4);
|
||||||
|
|
||||||
|
rowID ++;
|
||||||
|
QLabel * lbPrefix = new QLabel("Prefix : ", this);
|
||||||
|
lbPrefix->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||||
|
lePrefix = new QLineEdit(this);
|
||||||
|
|
||||||
|
QLabel * lbRunID = new QLabel("Run No. :", this);
|
||||||
|
lbRunID->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||||
|
QLineEdit * leRunID = new QLineEdit(this);
|
||||||
|
leRunID->setEnabled(false);
|
||||||
|
|
||||||
|
QPushButton * bnOpenScaler = new QPushButton("Scalar", this);
|
||||||
|
|
||||||
|
layout->addWidget(lbPrefix, rowID, 0);
|
||||||
|
layout->addWidget(lePrefix, rowID, 1);
|
||||||
|
layout->addWidget(lbRunID, rowID, 2);
|
||||||
|
layout->addWidget(leRunID, rowID, 3);
|
||||||
|
layout->addWidget(bnOpenScaler, rowID, 4);
|
||||||
|
|
||||||
|
rowID ++;
|
||||||
|
QLabel * lbComment = new QLabel("Run Comment : ", this);
|
||||||
|
lbComment->setAlignment(Qt::AlignRight | Qt::AlignCenter);
|
||||||
|
|
||||||
|
leComment = new QLineEdit(this);
|
||||||
|
leComment->setEnabled(false);
|
||||||
|
|
||||||
|
QPushButton * bnStartACQ = new QPushButton("Start ACQ", this);
|
||||||
|
connect( bnStartACQ, &QPushButton::clicked, this, &MainWindow::StartACQ);
|
||||||
|
QPushButton * bnStopACQ = new QPushButton("Stop ACQ", this);
|
||||||
|
connect( bnStopACQ, &QPushButton::clicked, this, &MainWindow::StopACQ);
|
||||||
|
|
||||||
|
layout->addWidget(lbComment, rowID, 0);
|
||||||
|
layout->addWidget(leComment, rowID, 1, 1, 2);
|
||||||
|
layout->addWidget(bnStartACQ, rowID, 3);
|
||||||
|
layout->addWidget(bnStopACQ, rowID, 4);
|
||||||
|
|
||||||
|
|
||||||
|
layout->setColumnStretch(0, 1);
|
||||||
|
layout->setColumnStretch(1, 2);
|
||||||
|
layout->setColumnStretch(2, 1);
|
||||||
|
layout->setColumnStretch(3, 3);
|
||||||
|
layout->setColumnStretch(4, 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{//^===================== Log Msg
|
||||||
|
|
||||||
|
logMsgHTMLMode = true;
|
||||||
|
QGroupBox * box3 = new QGroupBox("Log Message", mainLayoutWidget);
|
||||||
|
layoutMain->addWidget(box3);
|
||||||
|
layoutMain->setStretchFactor(box3, 1);
|
||||||
|
QVBoxLayout * layout3 = new QVBoxLayout(box3);
|
||||||
|
logInfo = new QPlainTextEdit(this);
|
||||||
|
logInfo->isReadOnly();
|
||||||
|
QFont font;
|
||||||
|
font.setFamily("Courier New");
|
||||||
|
logInfo->setFont(font);
|
||||||
|
layout3->addWidget(logInfo);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
LogMsg("<font style=\"color: blue;\"><b>Welcome to FSU DAQ.</b></font>");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow(){
|
MainWindow::~MainWindow(){
|
||||||
|
|
||||||
|
if( digi ) CloseDigitizers();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//***************************************************************
|
||||||
|
//***************************************************************
|
||||||
|
void MainWindow::OpenDigitizers(){
|
||||||
|
|
||||||
|
//sereach for digitizers
|
||||||
|
LogMsg("Searching digitizers via optical link.....Please wait");
|
||||||
|
logMsgHTMLMode = false;
|
||||||
|
nDigi = 0;
|
||||||
|
std::vector<std::pair<int, int>> portList; //boardID, portID
|
||||||
|
Digitizer dig;
|
||||||
|
for(int port = 0; port < MaxNPorts; port++){
|
||||||
|
for( int board = 0; board < MaxNBoards; board ++){ /// max number of iasy chain
|
||||||
|
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));
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogMsg(QString("Done seraching. Found %1 digitizer(s). Opening digitizer(s)....").arg(nDigi));
|
||||||
|
logMsgHTMLMode = true;
|
||||||
|
|
||||||
|
digi = new Digitizer * [nDigi];
|
||||||
|
readDataThread = new ReadDataThread * [nDigi];
|
||||||
|
for( unsigned int i = 0; i < nDigi; i++){
|
||||||
|
digi[i] = new Digitizer(portList[i].first, portList[i].second);
|
||||||
|
readDataThread[i] = new ReadDataThread(digi[i], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogMsg(QString("Done. Opened %1 digitizer(s).").arg(nDigi));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::CloseDigitizers(){
|
||||||
|
|
||||||
|
LogMsg("Closing Digitizer(s)....");
|
||||||
|
|
||||||
|
for(unsigned int i = 0; i < nDigi; i ++){
|
||||||
|
digi[i]->CloseDigitizer();
|
||||||
|
delete digi[i];
|
||||||
|
digi[i] = nullptr;
|
||||||
|
|
||||||
|
delete readDataThread[i];
|
||||||
|
}
|
||||||
|
delete [] digi;
|
||||||
|
digi = nullptr;
|
||||||
|
|
||||||
|
delete [] readDataThread;
|
||||||
|
readDataThread = nullptr;
|
||||||
|
|
||||||
|
LogMsg("Done. Closed " + QString::number(nDigi) + " Digitizer(s).");
|
||||||
|
nDigi = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//***************************************************************
|
||||||
|
//***************************************************************
|
||||||
|
void MainWindow::OpenDataPath(){
|
||||||
|
|
||||||
|
QFileDialog fileDialog(this);
|
||||||
|
fileDialog.setFileMode(QFileDialog::Directory);
|
||||||
|
int result = fileDialog.exec();
|
||||||
|
|
||||||
|
//qDebug() << fileDialog.selectedFiles();
|
||||||
|
if( result > 0 ) {
|
||||||
|
leDataPath->setText(fileDialog.selectedFiles().at(0));
|
||||||
|
}else{
|
||||||
|
leDataPath->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::StartACQ(){
|
||||||
|
if( digi == nullptr ) return;
|
||||||
|
|
||||||
|
for( unsigned int i = 0; i < nDigi ; i++){
|
||||||
|
digi[i]->GetData()->SetOutputFileName("haha");
|
||||||
|
digi[i]->StartACQ();
|
||||||
|
readDataThread[i]->SetSaveData(true);
|
||||||
|
readDataThread[i]->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::StopACQ(){
|
||||||
|
if( digi == nullptr ) return;
|
||||||
|
|
||||||
|
for( unsigned int i = 0; i < nDigi; i++){
|
||||||
|
digi[i]->StopACQ();
|
||||||
|
|
||||||
|
if( readDataThread[i]->isRunning() ) {
|
||||||
|
readDataThread[i]->quit();
|
||||||
|
readDataThread[i]->wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//***************************************************************
|
||||||
|
//***************************************************************
|
||||||
|
void MainWindow::LogMsg(QString msg){
|
||||||
|
QString outputStr = QStringLiteral("[%1] %2").arg(QDateTime::currentDateTime().toString("MM.dd hh:mm:ss"), msg);
|
||||||
|
if( logMsgHTMLMode ){
|
||||||
|
logInfo->appendHtml(outputStr);
|
||||||
|
}else{
|
||||||
|
logInfo->appendPlainText(outputStr);
|
||||||
|
}
|
||||||
|
QScrollBar *v = logInfo->verticalScrollBar();
|
||||||
|
v->setValue(v->maximum());
|
||||||
|
//qDebug() << msg;
|
||||||
|
logInfo->repaint();
|
||||||
|
}
|
||||||
|
|
41
mainWindow.h
41
mainWindow.h
|
@ -2,6 +2,13 @@
|
||||||
#define MAINWINDOW_H
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QPlainTextEdit>
|
||||||
|
#include <QLineEdit>
|
||||||
|
|
||||||
|
#include "ClassDigitizer.h"
|
||||||
|
#include "CustomThreads.h"
|
||||||
|
|
||||||
//^#===================================================== MainWindow
|
//^#===================================================== MainWindow
|
||||||
class MainWindow : public QMainWindow{
|
class MainWindow : public QMainWindow{
|
||||||
|
@ -10,6 +17,40 @@ public:
|
||||||
MainWindow(QWidget *parent = nullptr);
|
MainWindow(QWidget *parent = nullptr);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void OpenDigitizers();
|
||||||
|
void CloseDigitizers();
|
||||||
|
|
||||||
|
void OpenDataPath();
|
||||||
|
|
||||||
|
void StartACQ();
|
||||||
|
void StopACQ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Digitizer ** digi;
|
||||||
|
unsigned int nDigi;
|
||||||
|
|
||||||
|
//@----- log msg
|
||||||
|
QPlainTextEdit * logInfo;
|
||||||
|
void LogMsg(QString msg);
|
||||||
|
bool logMsgHTMLMode = true;
|
||||||
|
|
||||||
|
//@-----
|
||||||
|
QLineEdit * leDataPath;
|
||||||
|
QLineEdit * lePrefix;
|
||||||
|
QLineEdit * leComment;
|
||||||
|
|
||||||
|
//@----- Scalar
|
||||||
|
QMainWindow * scalar;
|
||||||
|
QLineEdit *** leTrigger; // need to delete manually
|
||||||
|
QLineEdit *** leAccept; // need to delete manually
|
||||||
|
|
||||||
|
//@----- ACQ
|
||||||
|
ReadDataThread ** readDataThread;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user