basic GUI, data thread, can take data

This commit is contained in:
splitPoleDAQ 2023-04-14 16:12:52 -04:00
parent f5595fcecc
commit 44499a8f21
10 changed files with 510 additions and 243 deletions

View File

@ -59,7 +59,8 @@ class Data{
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;}
void PrintBuffer() const; //Incorrect
@ -74,6 +75,8 @@ class Data{
unsigned int nw;
bool SaveWaveToMemory;
std::string outputFileName;
///for temperary
std::vector<unsigned short> tempWaveform1;
@ -105,6 +108,8 @@ inline Data::Data(){
SaveWaveToMemory = true;
nw = 0;
saveFileIndex = 0;
outputFileName = "";
}
inline Data::~Data(){
@ -163,10 +168,14 @@ inline void Data::CopyBuffer(const char * buffer, const unsigned int 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];
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+");
fseek(haha, 0L, SEEK_END);
@ -176,7 +185,7 @@ inline void Data::SaveBuffer(const char * fileName){
if( inFileSize > (unsigned int)MaxSaveFileSize ) { /// 2 GB
fclose(haha);
saveFileIndex ++;
sprintf(saveFileName, "%s_%03u.fsu", fileName , saveFileIndex);
sprintf(saveFileName, "%s_%03u.fsu", outputFileName.c_str() , saveFileIndex);
fclose(haha);
haha = fopen(saveFileName, "a+");
}

View File

@ -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]);
///}
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++){
if( (chMask & ( 3 << (2 * pCh) )) == 0 ) continue;
bufferSize += 2 + ( 2 + ((boardCfg >> 17) & 0x1) + ((boardCfg >> 16) & 0x1)*recordLength[pCh]*4 ) * eventAgg[pCh] ;
@ -406,12 +407,12 @@ unsigned int Digitizer::CalByteForBuffer(){
return bufferSize ;
}
void Digitizer::ReadData(){
if( !isConnected ) return;
if( !AcqRun) return;
int Digitizer::ReadData(){
if( !isConnected ) return CAEN_DGTZ_DigitizerNotFound;
if( !AcqRun) return CAEN_DGTZ_WrongAcqMode;
if( data->buffer == NULL ) {
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));
@ -420,8 +421,9 @@ void Digitizer::ReadData(){
if (ret || data->nByte == 0) {
ErrorMsg(__func__);
return;
}
return ret;
}
void Digitizer::PrintACQStatue(){
@ -665,6 +667,8 @@ int Digitizer::LoadSettingBinaryToMemory(std::string fileName){
settingFile = fopen(fileName.c_str(), "r");
size_t dummy = fread( setting, SETTINGSIZE * sizeof(unsigned int), 1, settingFile);
fclose (settingFile);
if( dummy == 0 ) printf("reach the end of file\n");
uint32_t boardInfo = GetSettingFromMemory(Register::DPP::BoardInfo_R);
if( (boardInfo & 0xFF) == 0x0E ) ch2ns = 4.0;
@ -691,6 +695,9 @@ unsigned int Digitizer::ReadSettingFromFile(Reg registerAddress, unsigned short
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]);
fclose (settingFile);
if( dummy == 0 ) printf("reach the end of file\n");
return lala[0];
}

View File

@ -23,7 +23,7 @@ class Digitizer{
Data * data;
///---- fixed parameter
//^---- fixed parameter
int portID; /// port ID for optical link for using PCIe card, from 0, 1, 2, 3
int boardID; /// board identity
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
CAEN_DGTZ_BoardInfo_t BoardInfo;
///----- adjustable parameters
//^----- adjustable parameters
uint32_t channelMask ; /// the channel mask from NChannel
uint32_t VMEBaseAddress; /// For direct USB or Optical-link connection, VMEBaseAddress must be 0
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)
///------- other parameters
//^------- other parameters
int ret; /// return value, refer to CAEN_DGTZ_ErrorCode
bool isConnected; /// true for digitizer communication estabished.
bool AcqRun; /// true when digitizer is taking data
bool isDummy; /// true for a dummy digitizer.
/// ------- setting
//^-------- setting
std::string settingFileName; ///
FILE * settingFile; ///
bool settingFileExist; ///
bool isSettingFilledinMemeory; /// false for disabled ReadAllSettingFromBoard()
unsigned int setting[SETTINGSIZE]; /// Setting, 4bytes x 2048 = 8192 bytes
///---------- protected functions
//^-------- other protected functions
void ErrorMsg(std::string header = "");
public:
Digitizer(); /// no digitizer open
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);
void SetDPPType (int type) { this->DPPType = type;} /// for manual override, or, digitizer does not open
void SetChannelMask (uint32_t mask);
@ -74,20 +73,20 @@ class Digitizer{
bool IsConnected() {return isConnected;}
void PrintBoard() ;
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
///================ ACQ control
//^================ ACQ control
void StopACQ();
void StartACQ();
void ReadData();
int ReadData();
bool IsRunning() const {return AcqRun;}
Data * GetData() const {return data;}
void PrintACQStatue();
unsigned int CalByteForBuffer();
///=================Settings
//^================= Settings
/// write value to digitizer, memory, and settingFile (if exist)
/// ONLY WriteRegister can have ch = -1, for writting all channels
/// 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 PrintRegister(uint32_t address, std::string msg);
///================ Get Board info
//^================ Get Board info
std::string GetModelName() const {return BoardInfo.ModelName;}
int GetSerialNumber() const {return BoardInfo.SerialNumber;}
int GetChannelMask() const {return channelMask;}
@ -105,7 +104,6 @@ class Digitizer{
float GetCh2ns() const {return ch2ns;}
int GetNChannel() const {return NChannel;}
int GetHandle() const {return handle;}
bool GetConnectionStatus() const {return isConnected;}
int GetDPPType() const {return DPPType;}
std::string GetDPPString(int DPPType = 0); /// if no input, use digitizer DPPType
int GetADCBits() const {return BoardInfo.ADC_NBits;}
@ -113,7 +111,7 @@ class Digitizer{
std::string GetAMCVersion() const {return BoardInfo.AMC_FirmwareRel;}
CAEN_DGTZ_ConnectionType GetLinkType() const {return LinkType;}
///================ Setting
//^================ Setting
Reg FindRegister(uint32_t address);
/// board <--> memory functions
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
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
View 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
View 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

View File

@ -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
# 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

View File

@ -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

View File

@ -2,7 +2,7 @@
#define MACRO_H
#define MaxNPorts 4
#define MaxNBoards 22
#define MaxNBoards 6
#define MaxNChannels 16
#define MaxRecordLength 0x3fff * 8
#define MaxSaveFileSize 1024 * 1024 * 1024 * 2

View File

@ -1,19 +1,259 @@
#include "mainWindow.h"
#include <QWidget>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QDateTime>
#include <QLabel>
#include <QScrollBar>
#include <QCoreApplication>
#include <QDialog>
#include <QFileDialog>
#include <TH1.h>
#include "CustomWidgets.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){
setWindowTitle("FSU DAQ");
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(){
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();
}

View File

@ -2,6 +2,13 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QLineEdit>
#include "ClassDigitizer.h"
#include "CustomThreads.h"
//^#===================================================== MainWindow
class MainWindow : public QMainWindow{
@ -10,6 +17,40 @@ public:
MainWindow(QWidget *parent = nullptr);
~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;
};