testing with digitizers

This commit is contained in:
carina@hades 2022-09-26 16:47:20 -04:00
parent 995b19a262
commit f8ddccdac8
9 changed files with 193 additions and 211 deletions

View File

@ -1,13 +1,28 @@
#include "ClassDigitizer.h"
Digitizer::Digitizer(){
Initalization();
}
Digitizer::Digitizer(int boardID, int portID, bool program, bool verbose){
Initalization();
OpenDigitizer(boardID, portID, program, verbose);
}
Digitizer::~Digitizer(){
delete data;
CloseDigitizer();
}
void Digitizer::Initalization(){
portID = -1;
boardID = -1;
handle = -1;
NChannel = 0;
ADCbits = 1;
DPPType = 0;
DPPTypeStr = "";
ADCFullSize = 0;
ch2ns = 0;
BoardInfo = {};
@ -28,18 +43,7 @@ Digitizer::Digitizer(){
ret = -1;
isConnected = false;
AcqRun = false;
}
Digitizer::Digitizer(int boardID, int portID, bool verbose){
Digitizer();
OpenDigitizer(boardID, portID, true, verbose);
}
Digitizer::~Digitizer(){
CloseDigitizer();
delete data;
}
void Digitizer::Reset(){
@ -106,23 +110,22 @@ int Digitizer::OpenDigitizer(int boardID, int portID, bool program, bool verbose
///====================== Check DPP firmware revision
sscanf(BoardInfo.AMC_FirmwareRel, "%d", &DPPType);
switch (DPPType){
case V1724_DPP_PHA_CODE: DPPTypeStr = "DPP-PHA x724"; break;
case V1720_DPP_CI_CODE : DPPTypeStr = "DPP-CI x720"; break;
case V1720_DPP_PSD_CODE: DPPTypeStr = "DPP-PSD x720"; break;
case V1751_DPP_PSD_CODE: DPPTypeStr = "DPP-PSD x751"; break;
case V1751_DPP_ZLE_CODE: DPPTypeStr = "DPP-ZLE x751"; break;
case V1743_DPP_CI_CODE: DPPTypeStr = "DPP-PSD x743"; break;
case V1740_DPP_QDC_CODE: DPPTypeStr = "DPP-QDC x740"; break;
case V1730_DPP_PSD_CODE: DPPTypeStr = "DPP-PSD x730"; break;
case V1730_DPP_PHA_CODE: DPPTypeStr = "DPP-PHA x730"; break;
case V1730_DPP_ZLE_CODE: DPPTypeStr = "DPP-ZLE x730"; break;
case V1730_DPP_DAW_CODE: DPPTypeStr = "DPP-DAW x730"; break;
}
if (DPPType >= 0x80 && verbose) {
printf("\t==== This digitizer has a DPP firmware!\n");
printf("\e[32m");
switch (DPPType){
case V1724_DPP_PHA_CODE: printf("\tDPP-PHA for x724 boards \n"); break;
case V1720_DPP_CI_CODE : printf("\tDPP-CI for x720 boards \n"); break;
case V1720_DPP_PSD_CODE: printf("\tDPP-PSD for x720 boards \n"); break;
case V1751_DPP_PSD_CODE: printf("\tDPP-PSD for x751 boards \n"); break;
case V1751_DPP_ZLE_CODE: printf("\tDPP-ZLE for x751 boards \n"); break;
case V1743_DPP_CI_CODE: printf("\tDPP-PSD for x743 boards \n"); break;
case V1740_DPP_QDC_CODE: printf("\tDPP-QDC for x740 boards \n"); break;
case V1730_DPP_PSD_CODE: printf("\tDPP-PSD for x730 boards \n"); break;
case V1730_DPP_PHA_CODE: printf("\tDPP-PHA for x730 boards \n"); break;
case V1730_DPP_ZLE_CODE: printf("\tDPP-ZLE for x730 boards \n"); break;
case V1730_DPP_DAW_CODE: printf("\tDPP-DAW for x730 boards \n"); break;
}
printf("\e[0m");
printf("\t==== This digitizer has a DPP firmware!\n");
printf("\e[32m\t %s \e[0m", DPPTypeStr.c_str());
}
///======================= Check virtual probe
@ -187,8 +190,6 @@ int Digitizer::CloseDigitizer(){
ret = CAEN_DGTZ_SWStopAcquisition(handle);
ret |= CAEN_DGTZ_CloseDigitizer(handle);
//data->FreeMemory();
return ret;
}
@ -356,19 +357,19 @@ void Digitizer::WriteRegister(uint32_t address, uint32_t value, int ch ){
uint32_t Digitizer::ReadRegister(uint32_t address, int ch, string str ){
if( !isConnected ) return 0;
uint32_t * Data = new uint32_t[NChannel];
uint32_t * data = new uint32_t[NChannel];
if( address < 0x8000) {
if( ch < 0 ) {
ret = CAEN_DGTZ_ReadRegister(handle, address + 0x7000, Data);
ret = CAEN_DGTZ_ReadRegister(handle, address + 0x7000, data);
}else{
ret = CAEN_DGTZ_ReadRegister(handle, address + (ch << 8), Data);
ret = CAEN_DGTZ_ReadRegister(handle, address + (ch << 8), data);
}
}else{
ret = CAEN_DGTZ_ReadRegister(handle, address, Data);
ret = CAEN_DGTZ_ReadRegister(handle, address, data);
}
ErrorMsg("ReadRegister:" + std::to_string(address));
if( str != "" ) printf("%s : 0x%x \n", str.c_str(), Data[0]);
return Data[0];
if( str != "" ) printf("%s : 0x%08x \n", str.c_str(), data[0]);
return data[0];
}
void Digitizer::SetChannelMask(uint32_t mask){
@ -534,7 +535,7 @@ uint32_t Digitizer::PrintRegister(uint32_t address, std::string msg){
printf("----------------------------------------------------\e[0m\n");
uint32_t * value = new uint32_t[1];
CAEN_DGTZ_ReadRegister(handle, (uint32_t) Register::BoardConfiguration, value);
CAEN_DGTZ_ReadRegister(handle, address, value);
printf(" %*s 32 28 24 20 16 12 8 4 0\n", (int) msg.length(), "");
printf(" %*s | | | | | | | | |\n", (int) msg.length(), "");
printf(" %*s", (int) msg.length(), "");
@ -640,7 +641,7 @@ void Digitizer::CreateAndSaveSettingBinary(string fileName){
SaveSettingEditByteByRegister(Register::DPP::AMCFirmwareRevision, ch);
SaveSettingEditByteByRegister(Register::DPP::VetoWidth, ch);
if( DPPType == 0x8B ) { /// DPP-PHA
if( DPPType == V1730_DPP_PHA_CODE ) { /// DPP-PHA
SaveSettingEditByteByRegister(Register::DPP::PHA::TriggerThreshold, ch);
SaveSettingEditByteByRegister(Register::DPP::PHA::RCCR2SmoothingFactor, ch);
SaveSettingEditByteByRegister(Register::DPP::PHA::RiseTimeValidationWindow, ch);
@ -657,6 +658,24 @@ void Digitizer::CreateAndSaveSettingBinary(string fileName){
SaveSettingEditByteByRegister(Register::DPP::PHA::DPPAlgorithmControl2_G, ch);
SaveSettingEditByteByRegister(Register::DPP::PHA::FineGain, ch);
}
if( DPPType == V1730_DPP_PSD_CODE ) { /// DPP-PSD
SaveSettingEditByteByRegister(Register::DPP::PSD::CFDSetting, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::ForcedDataFlush, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::ChargeZeroSuppressionThreshold, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::ShortGateWidth, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::LongGateWidth, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::GateOffset, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::TriggerThreshold, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::FixedBaseline, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::TriggerLatency, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::ShapedTriggerWidth, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::TriggerHoldOffWidth, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::ThresholdForPSDCut, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::PurGapThreshold, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::DPPAlgorithmControl2_G, ch);
SaveSettingEditByteByRegister(Register::DPP::PSD::EarlyBaselineFreeze, ch);
}
}
}

View File

@ -23,10 +23,10 @@ class Digitizer{
public:
Digitizer();
Digitizer(int boardID, int portID = 0, bool verbose = false);
Digitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);
~Digitizer();
void Initalization();
void Reset();
int OpenDigitizer(int boardID, int portID = 0, bool program = false, bool verbose = false);/// portID is for optical link for using PCIe card, from 0, 1, 2, 3
int CloseDigitizer();
@ -70,6 +70,7 @@ class Digitizer{
int GetHandle() {return handle;}
bool GetConnectionStatus() {return isConnected;}
int GetDPPType() {return DPPType;}
std::string GetDPPTypeString() {return DPPTypeStr;}
CAEN_DGTZ_ConnectionType GetLinkType() {return LinkType;}
int GetADCBits() {return BoardInfo.ADC_NBits;}
std::string GetROCVersion() {return BoardInfo.ROC_FirmwareRel;}
@ -126,6 +127,7 @@ class Digitizer{
int NChannel; /// number of channel
int ADCbits; /// ADC bit
int DPPType; /// DPP verion
std::string DPPTypeStr; /// DPP type in string
unsigned int ADCFullSize; /// pow(2, ADCbits) - 1
float ch2ns; /// channel to ns
CAEN_DGTZ_BoardInfo_t BoardInfo;

View File

@ -5,6 +5,8 @@ DigitizerPHA::DigitizerPHA(){
}
DigitizerPHA::DigitizerPHA(int boardID, int portID, bool verbose){
Initalization();
DPPType = V1730_DPP_PHA_CODE;
OpenDigitizer(boardID, portID, true, verbose);
}

View File

@ -6,7 +6,9 @@ DigitizerPSD::DigitizerPSD(){
}
DigitizerPSD::DigitizerPSD(int boardID, int portID){
OpenDigitizer(boardID, portID);
Initalization();
DPPType = V1730_DPP_PSD_CODE;
OpenDigitizer(boardID, portID, true, false);
}
DigitizerPSD::~DigitizerPSD(){

View File

@ -88,7 +88,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
fMain->AddFrame(hframe, new TGLayoutHints(kLHintsCenterX,2,2,2,2));
///================= Open digitizers
TGTextButton *bOpenDigitizers = new TGTextButton(hframe,"Open Digitizers");
bOpenDigitizers = new TGTextButton(hframe,"Open Digitizers");
bOpenDigitizers->Connect("Clicked()","MainWindow",this,"OpenDigitizers()");
hframe->AddFrame(bOpenDigitizers, uniLayoutHints);
@ -140,7 +140,7 @@ MainWindow::MainWindow(const TGWindow *p,UInt_t w,UInt_t h) {
//
//HandleMenu(M_BOARD_SETTINGS);
//HandleMenu(M_CH_SETTING_PHA);
HandleMenu(M_CH_SETTING_PSD);
//HandleMenu(M_CH_SETTING_PSD);
}
MainWindow::~MainWindow() {
@ -214,16 +214,9 @@ void MainWindow::HandleMenu(Int_t id){
///========================= Board setting
case M_BOARD_SETTINGS:{
if( boardSetting == NULL ) {
boardSetting = new BoardSetting(gClient->GetRoot(), 600, 600, digi, nDigi);
boardSetting->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)");
boardSetting->Connect("Haha(Int_t)", "MainWindow", this, "OpenChannelSetting(Int_t)");
}else{
if ( boardSetting->IsOpen() == false ){
boardSetting = new BoardSetting(gClient->GetRoot(), 600, 600, digi, nDigi);
//boardSetting->Connect("BdLogMsg(TString)", "MainWindow", this, "LogMsg(TString)");
}
}
boardSetting = new BoardSetting(gClient->GetRoot(), 600, 600, digi, nDigi);
boardSetting->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)");
boardSetting->Connect("Haha(Int_t)", "MainWindow", this, "OpenChannelSetting(Int_t)");
}break;
///========================= Program setting
@ -287,27 +280,19 @@ void MainWindow::OpenDigitizers(){
digi = new Digitizer * [nDigi];
//pha = new DigitizerPHA * [nPHA];
//psd = new DigitizerPHA * [nPSD];
//
//iPHA = 0;
//iPSD = 0;
for( int i = 0; i < nDigi; i++){
printf("------------ %d \n", i);
if( DPPType[i] == V1730_DPP_PSD_CODE ) {
digi[i] = new DigitizerPSD(boardID[i], portID[i]);
printf("Open as PSD\n");
}else if( DPPType[i] == V1730_DPP_PHA_CODE ){
digi[i] = new DigitizerPHA(boardID[i], portID[i]);
printf("Open as PHA\n");
}else{
digi[i] = new Digitizer(boardID[i], portID[i]);
printf("Open as Ordinary Digitizer\n");
}
digi[i] = new Digitizer(boardID[i], portID[i], false, false); // TODO basic board program
LogMsg(Form("%2d, Serial number : %3d opened (%s, %s)", i, digi[i]->GetSerialNumber(),
digi[i]->GetDPPTypeString().c_str(),
digi[i]->GetModelName().c_str()));
digi[i]->CreateAndSaveSettingBinary("setting_" + to_string(digi[i]->GetSerialNumber()) + ".bin");
}
fMenuDigitizers->DisableEntry( M_DIGITIZER_OPEN);
bOpenDigitizers->SetEnabled(false);
}
}
@ -341,15 +326,15 @@ void MainWindow::OpenChannelSetting(Int_t boardID){
printf("#### %s \n", __func__);
//if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE ){
// channelSettingPHA = new ChannelSettingPHA(gClient->GetRoot(), 600, 600, digi, nDigi, boardID);
// channelSettingPHA->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)");
//}
if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE ){
channelSettingPHA = new ChannelSettingPHA(gClient->GetRoot(), 600, 600, digi, nDigi, boardID);
channelSettingPHA->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)");
}
//if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE ){
if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE ){
channelSettingPSD = new ChannelSettingPSD(gClient->GetRoot(), 600, 600, digi, nDigi, boardID);
channelSettingPSD->Connect("LogMsg(char*)", "MainWindow", this, "LogMsg(char*)");
//}
}
}
void MainWindow::LogMsg(char * msg){

View File

@ -44,6 +44,8 @@ private:
//TGTextButton *bStartRun;
//TGTextButton *bStopRun;
//TGTextButton *bFitTrace;
TGTextButton *bOpenDigitizers;
unsigned short nDigi;
vector<int> DPPType;

View File

@ -20,31 +20,6 @@ TString boardSettingName[NUM_BOARD_INFO] = { "Model",
"AMC version"
};
Pixel_t BoardSetting::red = 0;
Pixel_t BoardSetting::blue = 0;
TGNumberEntry * BoardSetting::boardIDEntry = NULL;
Digitizer ** BoardSetting::digi = NULL;
TGTextEntry * BoardSetting::txtACQStatus = NULL;
TGTextEntry * BoardSetting::txtACQEventReady = NULL;
TGTextEntry * BoardSetting::txtACQEventFull = NULL;
TGTextEntry * BoardSetting::txtACQClockSource = NULL;
TGTextEntry * BoardSetting::txtACQPLLLock = NULL;
TGTextEntry * BoardSetting::txtACQChDown = NULL;
TGTextEntry * BoardSetting::txtACQSIN = NULL;
TGTextEntry * BoardSetting::txtACQTRIGIN = NULL;
TGTextEntry * BoardSetting::txtACQBoardReady = NULL;
TGTextEntry * BoardSetting::txtACQTemp0 = NULL;
TGTextEntry * BoardSetting::txtACQTemp1 = NULL;
TGTextEntry * BoardSetting::txtACQTemp2 = NULL;
TGTextEntry * BoardSetting::txtACQTemp3 = NULL;
TGTextEntry * BoardSetting::txtEventReady = NULL;
TGTextEntry * BoardSetting::txtBusError = NULL;
TGTextEntry * BoardSetting::txtVMEFIFO = NULL;
bool BoardSetting::isOpened = false;
BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** digi, int nBoard){
this->nDigi = nBoard;
@ -235,6 +210,11 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** d
bOpenChannelSetting->SetHeight(40);
bOpenChannelSetting->Connect("Clicked()", "BoardSetting", this, "OpenChannelSetting()");
TGTextButton * bUpdateStatus = new TGTextButton(hRow0, "Update Status"); hRow0->AddFrame(bUpdateStatus, new TGLayoutHints( kLHintsExpandX | kLHintsExpandY, 5, 0, 5, 0));
bUpdateStatus->SetHeight(40);
bUpdateStatus->Connect("Clicked()", "BoardSetting", this, "ReadStatus()");
TGHorizontalFrame * hRow1 = new TGHorizontalFrame(vframe); vframe->AddFrame(hRow1, new TGLayoutHints( kLHintsExpandX));
{///========= Board Configure
@ -419,9 +399,7 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** d
bSWClockSync = new TGTextButton(hAcqCtrl_c, "Send Software Clock Sync Signal"); hAcqCtrl_c->AddFrame(bSWClockSync, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
bSWClockSync->Connect("Clicked()", "BoardSetting", this, "SendSoftwareClockSyncSignal()");
bSWClockSync->Resize(250, 20);
}
{///========= Trigger Configure
@ -694,10 +672,8 @@ BoardSetting::BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** d
isOpened = true;
///Setup thread
readStatusThread = new TThread("readStatus", ReadStatus, (void *) 1);
if( digi != NULL ) readStatusThread->Run();
isOpened = true;
///readStatusThread = new TThread("readStatus", ReadStatus, (void *) 1);
///if( digi != NULL ) readStatusThread->Run();
}
BoardSetting::~BoardSetting(){
@ -706,10 +682,10 @@ BoardSetting::~BoardSetting(){
printf("close BoardSetting window\n");
for( int i = 0; i < nDigi; i++) digi[i] = 0;
//for( int i = 0; i < nDigi; i++) digi[i] = 0;
//pha = 0;
//psd = 0;
//delete readStatusThread;
fMain->Cleanup();
delete fMain;
@ -720,64 +696,74 @@ void BoardSetting::LogMsg(TString msg){
Emit("LogMsg(char*)", msg.Data());
}
void * BoardSetting::ReadStatus(void * ptr){
if( digi == NULL ) return 0;
void BoardSetting::ReadStatus(){
if( digi == NULL ) return;
int pauseTime = 1000; /// msec
int boardID = boardIDEntry->GetNumber();
if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE ) {
/// ACQ Status
digi[boardID]->PrintRegister(Register::DPP::AcquisitionStatus, "ACQ Status");
uint32_t temp = digi[boardID]->ReadRegister(Register::DPP::AcquisitionStatus);
//pha = dynamic_cast<DigitizerPHA*> (digi[boardID]);
//while( digi[boardID]->isACQRunning() == false ){
while( isOpened ){
printf("=========== %s for PHA\n", __func__);
/// ACQ Status
uint32_t temp = digi[boardID]->ReadRegister(Register::DPP::AcquisitionStatus);
txtACQStatus ->SetText( ((temp >> 2) & 0x1) == 0 ? "ACQ is stopped" : "ACQ is Running", false); txtACQStatus->SetTextColor( ((temp >> 2) & 0x1) == 0 ? 1 : blue);
txtACQEventReady ->SetText( ((temp >> 3) & 0x1) == 0 ? "no Event" : "Has Events", false); txtACQEventReady->SetTextColor( ((temp >> 3) & 0x1) == 0 ? 1 : blue);
txtACQEventFull ->SetText( ((temp >> 4) & 0x1) == 0 ? "no channel FULL" : "a channel FULL", false); txtACQEventFull->SetTextColor( ((temp >> 4) & 0x1) == 0 ? 1 : red);
txtACQClockSource->SetText( ((temp >> 5) & 0x1) == 0 ? "Internal Clock" : "External Clock", false); txtACQClockSource->SetTextColor( ((temp >> 5) & 0x1) == 0 ? 1 : blue);
txtACQPLLLock ->SetText( ((temp >> 7) & 0x1) == 0 ? "PLL no lock" : "PLL locked", false); txtACQPLLLock->SetTextColor( ((temp >> 7) & 0x1) == 0 ? 1 : blue);
txtACQBoardReady ->SetText( ((temp >> 8) & 0x1) == 0 ? "Board NOT Ready (PLL & ADCs are NOT sync)" : "Board Ready (PLL & ADCs are sync)", false);
txtACQBoardReady->SetTextColor( ((temp >> 8) & 0x1) == 0 ? red : 1);
txtACQChDown ->SetText( ((temp >> 19) & 0x1) == 0 ? "Channels are ON" : "Channels ShutDown", false);
txtACQChDown->SetTextColor( ((temp >> 19) & 0x1) == 0 ? 1 : red);
txtACQSIN ->SetText( ((temp >> 15) & 0x1) == 0 ? "S-IN = 0" : "S-IN = 1", false); txtACQSIN->SetTextColor( ((temp >> 15) & 0x1) == 0 ? 1 : blue);
txtACQTRIGIN ->SetText( ((temp >> 16) & 0x1) == 0 ? "TRG-IN = 0" : "TRG-IN = 1", false); txtACQTRIGIN->SetTextColor( ((temp >> 16) & 0x1) == 0 ? 1 : blue);
txtACQTemp0->SetText( ((temp >> 20) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp0->SetTextColor( ((temp >> 20) & 0x1) == 0 ? 1 : red);
txtACQTemp1->SetText( ((temp >> 21) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp1->SetTextColor( ((temp >> 21) & 0x1) == 0 ? 1 : red);
txtACQTemp2->SetText( ((temp >> 22) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp2->SetTextColor( ((temp >> 22) & 0x1) == 0 ? 1 : red);
txtACQTemp3->SetText( ((temp >> 23) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp3->SetTextColor( ((temp >> 23) & 0x1) == 0 ? 1 : red);
/// Redaout Status
temp = digi[boardID]->ReadRegister(Register::DPP::ReadoutStatus);
if( (temp & 0x1) == 1 ){
txtEventReady->SetText( "Event Ready" , false); txtEventReady->SetTextColor(blue);
}else{
txtEventReady->SetText( "No Data Ready" , false); txtEventReady->SetTextColor(red);
}
if( (( temp >> 2 ) & 0x1 ) == 0 ){
txtBusError->SetText( "no Bus Error", false ); txtBusError->SetTextColor(blue);
}else{
txtBusError->SetText( "Bus Error", false ); txtBusError->SetTextColor(red);
}
if( (( temp >> 3 ) & 0x1 ) == 0 ){
txtVMEFIFO->SetText( "VME FIFO NOT EMPTY", false ); txtVMEFIFO->SetTextColor(red);
}else{
txtVMEFIFO->SetText( "VME FIFO EMPTY", false ); txtVMEFIFO->SetTextColor(red);
}
usleep(pauseTime*1000);
}
txtACQStatus ->SetText( ((temp >> 2) & 0x1) == 0 ? "ACQ is stopped" : "ACQ is Running", false); txtACQStatus->SetTextColor( ((temp >> 2) & 0x1) == 0 ? 1 : blue);
txtACQEventReady ->SetText( ((temp >> 3) & 0x1) == 0 ? "no Event" : "Has Events", false); txtACQEventReady->SetTextColor( ((temp >> 3) & 0x1) == 0 ? 1 : blue);
txtACQEventFull ->SetText( ((temp >> 4) & 0x1) == 0 ? "no channel FULL" : "a channel FULL", false); txtACQEventFull->SetTextColor( ((temp >> 4) & 0x1) == 0 ? 1 : red);
txtACQClockSource->SetText( ((temp >> 5) & 0x1) == 0 ? "Internal Clock" : "External Clock", false); txtACQClockSource->SetTextColor( ((temp >> 5) & 0x1) == 0 ? 1 : blue);
txtACQPLLLock ->SetText( ((temp >> 7) & 0x1) == 0 ? "PLL no lock" : "PLL locked", false); txtACQPLLLock->SetTextColor( ((temp >> 7) & 0x1) == 0 ? 1 : blue);
txtACQBoardReady ->SetText( ((temp >> 8) & 0x1) == 0 ? "Board NOT Ready (PLL & ADCs are NOT sync)" : "Board Ready (PLL & ADCs are sync)", false);
txtACQBoardReady->SetTextColor( ((temp >> 8) & 0x1) == 0 ? red : 1);
txtACQChDown ->SetText( ((temp >> 19) & 0x1) == 0 ? "Channels are ON" : "Channels ShutDown", false);
txtACQChDown->SetTextColor( ((temp >> 19) & 0x1) == 0 ? 1 : red);
txtACQSIN ->SetText( ((temp >> 15) & 0x1) == 0 ? "S-IN = 0" : "S-IN = 1", false); txtACQSIN->SetTextColor( ((temp >> 15) & 0x1) == 0 ? 1 : blue);
txtACQTRIGIN ->SetText( ((temp >> 16) & 0x1) == 0 ? "TRG-IN = 0" : "TRG-IN = 1", false); txtACQTRIGIN->SetTextColor( ((temp >> 16) & 0x1) == 0 ? 1 : blue);
txtACQTemp0->SetText( ((temp >> 20) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp0->SetTextColor( ((temp >> 20) & 0x1) == 0 ? 1 : red);
txtACQTemp1->SetText( ((temp >> 21) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp1->SetTextColor( ((temp >> 21) & 0x1) == 0 ? 1 : red);
txtACQTemp2->SetText( ((temp >> 22) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp2->SetTextColor( ((temp >> 22) & 0x1) == 0 ? 1 : red);
txtACQTemp3->SetText( ((temp >> 23) & 0x1) == 0 ? "< 70" : "> 70", false); txtACQTemp3->SetTextColor( ((temp >> 23) & 0x1) == 0 ? 1 : red);
/// Redaout Status
digi[boardID]->PrintRegister(Register::DPP::ReadoutStatus, "Readout Status");
temp = digi[boardID]->ReadRegister(Register::DPP::ReadoutStatus);
if( (temp & 0x1) == 1 ){
txtEventReady->SetText( "Event Ready" , false); txtEventReady->SetTextColor(blue);
}else{
txtEventReady->SetText( "No Data Ready" , false); txtEventReady->SetTextColor(red);
}
if( (( temp >> 2 ) & 0x1 ) == 0 ){
txtBusError->SetText( "no Bus Error", false ); txtBusError->SetTextColor(blue);
}else{
txtBusError->SetText( "Bus Error", false ); txtBusError->SetTextColor(red);
}
if( (( temp >> 3 ) & 0x1 ) == 0 ){
txtVMEFIFO->SetText( "VME FIFO NOT EMPTY", false ); txtVMEFIFO->SetTextColor(red);
}else{
txtVMEFIFO->SetText( "VME FIFO EMPTY", false ); txtVMEFIFO->SetTextColor(red);
}
///================ Board Failure Status
digi[boardID]->PrintRegister(Register::DPP::BoardFailureStatus, "Board Fail");
temp = digi[boardID]->ReadRegister(Register::DPP::BoardFailureStatus, -1, "Board Fail");
if( ((temp >> 4) & 0x1) == 0 ) {
enPLLStatus->SetText( "OK" , false); enPLLStatus->SetTextColor(1);
}else{
enPLLStatus->SetText( "Lost Lock" , false); enPLLStatus->SetTextColor(red);
}
if( ((temp >> 5) & 0x1) == 0 ) {
enTempStatus->SetText( "OK" , false); enTempStatus->SetTextColor(1);
}else{
enTempStatus->SetText( "Failure" , false); enTempStatus->SetTextColor(red);
}
if( ((temp >> 6) & 0x1) == 0 ) {
enADCPwrStatus->SetText( "OK", false); enADCPwrStatus->SetTextColor(1);
}else{
enADCPwrStatus->SetText( "Failure", false); enADCPwrStatus->SetTextColor(red);
}
}
void BoardSetting::ChangeBoard(){
@ -789,7 +775,6 @@ void BoardSetting::ChangeBoard(){
}
int boardID = boardIDEntry->GetNumber();
digi[boardID]->PrintBoard();
for( int i = 0; i < NUM_BOARD_INFO; i++){
switch (i) {
@ -821,28 +806,6 @@ void BoardSetting::ChangeBoard(){
}
}
///================ Board Failure Status
unsigned int tempBits;
tempBits = digi[boardID]->ReadRegister(Register::BoardFailureStatus);
if( (tempBits & 0x10) == 0 ) {
enPLLStatus->SetText( "OK" , false); enPLLStatus->SetTextColor(1);
}else{
enPLLStatus->SetText( "Lost Lock" , false); enPLLStatus->SetTextColor(red);
}
if( (tempBits & 0x20) == 0 ) {
enTempStatus->SetText( "OK (<70)" , false); enTempStatus->SetTextColor(1);
}else{
enTempStatus->SetText( "Failure" , false); enTempStatus->SetTextColor(red);
}
if( (tempBits & 0x40) == 0 ) {
enADCPwrStatus->SetText( "OK", false); enADCPwrStatus->SetTextColor(1);
}else{
enADCPwrStatus->SetText( "Failure", false); enADCPwrStatus->SetTextColor(red);
}
cbAggOrg->Select( digi[boardID]->ReadRegister(Register::DPP::AggregateOrganization) , false);
numAggBLT->SetNumber( digi[boardID]->ReadRegister(Register::DPP::MaxAggregatePerBlockTransfer) , false);
cbFanCtrl->Select( digi[boardID]->ReadRegister(Register::DPP::FanSpeedControl) , false);
@ -852,10 +815,12 @@ void BoardSetting::ChangeBoard(){
cbAnaMonitor->Select( digi[boardID]->ReadRegister(Register::DPP::AnalogMonitorMode) & 0x7 , false);
numBufferOccpGain->SetNumber( digi[boardID]->ReadRegister(Register::DPP::BufferOccupancyGain) & 0xf, false);
ReadStatus();
/// ACQ Control
//digi[boardID]->PrintRegister(Register::DPP::AcquisitionControl, "AcquisitionControl");
tempBits = digi[boardID]->ReadRegister(Register::DPP::AcquisitionControl);
uint32_t tempBits = digi[boardID]->ReadRegister(Register::DPP::AcquisitionControl);
cbAcqMode->Select( tempBits & 0x3 , false);
bAcqArm->SetState( ((tempBits >> 2) & 0x1) ? kButtonDown : kButtonUp, false);
cbPLLref->Select( ((tempBits >> 6) & 0x1), false);

View File

@ -22,14 +22,14 @@ class BoardSetting{
private:
TGMainFrame * fMain;
static Pixel_t red, blue;
Pixel_t red, blue;
static TGNumberEntry * boardIDEntry;
TGNumberEntry * boardIDEntry;
TGTextEntry * entry[NUM_BOARD_INFO];
int nDigi;
static Digitizer ** digi;
Digitizer ** digi;
/// board failure status
TGTextEntry * enPLLStatus;
@ -61,19 +61,19 @@ class BoardSetting{
TGNumberEntry * numRunStartStopDelay;
/// ACQ Status
static TGTextEntry * txtACQStatus;
static TGTextEntry * txtACQEventReady;
static TGTextEntry * txtACQEventFull;
static TGTextEntry * txtACQClockSource;
static TGTextEntry * txtACQPLLLock;
static TGTextEntry * txtACQChDown;
static TGTextEntry * txtACQSIN;
static TGTextEntry * txtACQTRIGIN;
static TGTextEntry * txtACQBoardReady;
static TGTextEntry * txtACQTemp0;
static TGTextEntry * txtACQTemp1;
static TGTextEntry * txtACQTemp2;
static TGTextEntry * txtACQTemp3;
TGTextEntry * txtACQStatus;
TGTextEntry * txtACQEventReady;
TGTextEntry * txtACQEventFull;
TGTextEntry * txtACQClockSource;
TGTextEntry * txtACQPLLLock;
TGTextEntry * txtACQChDown;
TGTextEntry * txtACQSIN;
TGTextEntry * txtACQTRIGIN;
TGTextEntry * txtACQBoardReady;
TGTextEntry * txtACQTemp0;
TGTextEntry * txtACQTemp1;
TGTextEntry * txtACQTemp2;
TGTextEntry * txtACQTemp3;
/// Trigger control
TGCheckButton * cbGbTRGMskCh[8];
@ -118,13 +118,12 @@ class BoardSetting{
TGCheckButton * bEnableExtendedBlockTransfer;
/// Redaout Status
static TGTextEntry * txtEventReady;
static TGTextEntry * txtBusError;
static TGTextEntry * txtVMEFIFO;
TGTextEntry * txtEventReady;
TGTextEntry * txtBusError;
TGTextEntry * txtVMEFIFO;
bool isOpened;
TThread * readStatusThread;
static bool isOpened;
static void * ReadStatus(void * ptr); /// thread.
public:
BoardSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** digi, int nBoard);
@ -134,12 +133,14 @@ class BoardSetting{
void CloseWindow() { delete this;}
void ChangeBoard();
void ReadStatus();
///=== Button
void ResetSettingToDefault();
void ClearBuffer();
void OpenChannelSetting();
///=== Board Configure
void SetBoardConfiguration();

View File

@ -5,18 +5,22 @@
int main(int argc, char* argv[]){
/**************/
const int nBoard = 1;
const int nBoard = 3;
Digitizer **dig = new Digitizer *[nBoard];
for( int i = 0 ; i < nBoard; i++){
int board = i % 3;
int port = i/3;
dig[i] = new DigitizerPHA(board, port, true);
dig[i] = new Digitizer(board, port, false, true);
dig[i]->CreateAndSaveSettingBinary("setting_" + to_string(dig[i]->GetSerialNumber()) + ".bin");
//dig[i].OpenSettingBinary("setting_" + to_string(dig[i].GetSerialNumber()) + ".bin");
}
/*
DigitizerPHA * pha = dynamic_cast<DigitizerPHA*> (dig[0]);
pha->ProgramBoard();
pha->PrintBoardConfiguration();