#include #include #include #include #include #include #include #include #include "registerSetting.h" RegisterSetting::RegisterSetting(const TGWindow *p, UInt_t w, UInt_t h, Digitizer ** digi, int nBoard, uint32_t address){ this->nDigi = nBoard; this->digi = digi; for( int i = 0; i < MaxNChannels; i++) value[i] = 0; fMain = new TGMainFrame(p,w,h); fMain->SetWindowName("Register Setting"); fMain->Connect("CloseWindow()", "RegisterSetting", this, "CloseWindow()"); TGLayoutHints * layoutHints = new TGLayoutHints(kLHintsCenterX | kLHintsCenterY, 5,5,3,3); /// left, right, top, bottom TGLayoutHints * haha = new TGLayoutHints(kLHintsRight, 5,5,3,3); /// left, right, top, bottom TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft, 0,0,0,0); /// left, right, top, bottom TGVerticalFrame * vframe = new TGVerticalFrame(fMain); fMain->AddFrame(vframe, layoutHints); int boardID; {///==================== Board ID & Register Name TGHorizontalFrame *hframe1 = new TGHorizontalFrame(vframe, w, 50 ); vframe->AddFrame(hframe1, layoutHints); TGVerticalFrame * vframeA0 = new TGVerticalFrame(hframe1); hframe1->AddFrame(vframeA0, layoutHints); TGVerticalFrame * vframeA1 = new TGVerticalFrame(hframe1); hframe1->AddFrame(vframeA1, layoutHints); TGLabel * lb0 = new TGLabel(vframeA0, "Board ID :"); vframeA0->AddFrame(lb0, haha); TGHorizontalFrame *hframe11 = new TGHorizontalFrame(vframeA1, w, 50 ); vframeA1->AddFrame(hframe11); boardIDEntry = new TGNumberEntry(hframe11, 0, 0, 0, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative); hframe11->AddFrame(boardIDEntry, kaka); boardIDEntry->SetWidth(50); boardIDEntry->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, nBoard-1); boardIDEntry->Connect("Modified()", "RegisterSetting", this, "ChangeBoard()"); if( nBoard <= 1 ) boardIDEntry->SetState(false); boardID = boardIDEntry->GetNumber(); TGLabel * lb1 = new TGLabel(hframe11, Form("Serial Number : %03d", digi == NULL ? -1 : digi[boardID]->GetSerialNumber())); hframe11->AddFrame(lb1, new TGLayoutHints(kLHintsCenterY, 5,5,3,3)); TGLabel * lbAdd = new TGLabel(vframeA0, "Address :"); vframeA0->AddFrame(lbAdd, haha); txtAddress = new TGTextEntry(vframeA1, Form("0x%04x", address)); vframeA1->AddFrame(txtAddress, kaka); txtAddress->Connect("ReturnPressed()", "RegisterSetting", this, "TypeRegisterAddress()"); txtAddress->Resize(250,20); TGLabel * lbName = new TGLabel(vframeA0, "Name :"); vframeA0->AddFrame(lbName, haha); cbName = new TGComboBox(vframeA1, ""); vframeA1->AddFrame(cbName, kaka); cbName->Connect("Changed()", "RegisterSetting", this, "UpdateRegister()"); cbName->Resize(250,20); cbName->EnableTextInput(false); } {///==================== Controls TGHorizontalFrame *hframeAll = new TGHorizontalFrame(vframe, w, 50 ); vframe->AddFrame(hframeAll, layoutHints); bSetALLChannel = new TGCheckButton(hframeAll, "Set ALL Channels", 1); hframeAll->AddFrame(bSetALLChannel, haha); bSetALLChannel->Connect("Clicked()", "RegisterSetting", this, "SetAllChannels()"); TGTextButton * bReadSetting = new TGTextButton(hframeAll, "Read Settings"); hframeAll->AddFrame(bReadSetting, kaka); bReadSetting->Connect("Clicked()", "RegisterSetting", this, "UpdateRegister()"); } {///==================== values TGHorizontalFrame *hframe = new TGHorizontalFrame(vframe, w, 50 ); vframe->AddFrame(hframe, layoutHints); TGVerticalFrame * vframe0 = new TGVerticalFrame(hframe); hframe->AddFrame(vframe0, layoutHints); TGVerticalFrame * vframe1 = new TGVerticalFrame(hframe); hframe->AddFrame(vframe1, layoutHints); TGVerticalFrame * vframe2 = new TGVerticalFrame(hframe); hframe->AddFrame(vframe2, layoutHints); TGVerticalFrame * vframe3 = new TGVerticalFrame(hframe); hframe->AddFrame(vframe3, layoutHints); TGLabel * lbCh0 = new TGLabel(vframe0, "ch"); vframe0->AddFrame(lbCh0, layoutHints); TGLabel * lbValueHex = new TGLabel(vframe1, "Bit Value [Hex]"); vframe1->AddFrame(lbValueHex, kaka); TGLabel * lbValueDec = new TGLabel(vframe2, "Bit Value [Dec]"); vframe2->AddFrame(lbValueDec, kaka); lbValueUnit = new TGLabel(vframe3, "Value [unit]"); vframe3->AddFrame(lbValueUnit, kaka); TGLabel * lbCh[MaxNChannels]; for( int i = 0; i < ( digi == NULL ? MaxNChannels : digi[boardID]->GetNChannel() ); i++){ lbCh[i] = new TGLabel(vframe0, Form("%02d", i)); vframe0->AddFrame(lbCh[i], new TGLayoutHints(kLHintsRight, 5,5,4,2)); txtValueHex[i] = new TGTextEntry(vframe1, ""); vframe1->AddFrame(txtValueHex[i], kaka); txtValueHex[i]->Resize(100,20); txtValueHex[i]->SetAlignment(kTextRight); txtValueHex[i]->SetName(Form("h%02d", i)); txtValueHex[i]->Connect("ReturnPressed()", "RegisterSetting", this, "ChangeValue()"); txtValueDec[i] = new TGTextEntry(vframe2, ""); vframe2->AddFrame(txtValueDec[i], kaka); txtValueDec[i]->Resize(80,20); txtValueDec[i]->SetAlignment(kTextRight); txtValueDec[i]->SetName(Form("d%02d", i)); txtValueDec[i]->Connect("ReturnPressed()", "RegisterSetting", this, "ChangeValue()"); txtValueUnit[i] = new TGTextEntry(vframe3, ""); vframe3->AddFrame(txtValueUnit[i], kaka); txtValueUnit[i]->Resize(80,20); txtValueUnit[i]->SetAlignment(kTextRight); txtValueUnit[i]->SetName(Form("u%02d", i)); txtValueUnit[i]->Connect("ReturnPressed()", "RegisterSetting", this, "ChangeValue()"); txtValueUnit[i]->SetEnabled(false); } } fMain->MapSubwindows(); fMain->Resize(fMain->GetDefaultSize()); fMain->MapWindow(); ChangeBoard(); } RegisterSetting::~RegisterSetting(){ printf("=== %s\n", __func__); delete boardIDEntry; delete txtAddress; delete cbName; delete lbValueUnit; for(int i = 0; i < MaxNChannels; i++) { delete txtValueHex[i]; delete txtValueDec[i]; delete txtValueUnit[i]; } fMain->Cleanup(); delete fMain; } void RegisterSetting::ChangeBoard(){ int DPPType = V1730_DPP_PHA_CODE; if( digi != NULL ){ int boardID = boardIDEntry->GetNumber(); DPPType = digi[boardID]->GetDPPType(); } cbName->RemoveAll(); cbName->AddEntry("Address NOT Exist", 0); if( DPPType == V1730_DPP_PHA_CODE){ /// PHA cbName->AddEntry("DPP::PHA::DataFlush_W" , Register::DPP::PHA::DataFlush_W ); cbName->AddEntry("DPP::PHA::ChannelStopAcquisition" , Register::DPP::PHA::ChannelStopAcquisition ); cbName->AddEntry("DPP::PHA::RCCR2SmoothingFactor" , Register::DPP::PHA::RCCR2SmoothingFactor ); cbName->AddEntry("DPP::PHA::InputRiseTime" , Register::DPP::PHA::InputRiseTime ); cbName->AddEntry("DPP::PHA::TrapezoidRiseTime" , Register::DPP::PHA::TrapezoidRiseTime ); cbName->AddEntry("DPP::PHA::TrapezoidFlatTop" , Register::DPP::PHA::TrapezoidFlatTop ); cbName->AddEntry("DPP::PHA::PeakingTime" , Register::DPP::PHA::PeakingTime ); cbName->AddEntry("DPP::PHA::DecayTime" , Register::DPP::PHA::DecayTime ); cbName->AddEntry("DPP::PHA::TriggerThreshold" , Register::DPP::PHA::TriggerThreshold ); cbName->AddEntry("DPP::PHA::RiseTimeValidationWindow", Register::DPP::PHA::RiseTimeValidationWindow); cbName->AddEntry("DPP::PHA::TriggerHoldOffWidth" , Register::DPP::PHA::TriggerHoldOffWidth ); cbName->AddEntry("DPP::PHA::PeakHoldOff" , Register::DPP::PHA::PeakHoldOff ); cbName->AddEntry("DPP::PHA::ShapedTriggerWidth" , Register::DPP::PHA::ShapedTriggerWidth ); cbName->AddEntry("DPP::PHA::DPPAlgorithmControl2_G" , Register::DPP::PHA::DPPAlgorithmControl2_G ); cbName->AddEntry("DPP::PHA::FineGain" , Register::DPP::PHA::FineGain ); } if( DPPType == V1730_DPP_PSD_CODE){ /// PSD cbName->AddEntry("DPP::PSD::CFDSetting" , Register::DPP::PSD::CFDSetting ); cbName->AddEntry("DPP::PSD::ForcedDataFlush_W" , Register::DPP::PSD::ForcedDataFlush_W ); cbName->AddEntry("DPP::PSD::ChargeZeroSuppressionThreshold", Register::DPP::PSD::ChargeZeroSuppressionThreshold ); cbName->AddEntry("DPP::PSD::ShortGateWidth" , Register::DPP::PSD::ShortGateWidth ); cbName->AddEntry("DPP::PSD::LongGateWidth" , Register::DPP::PSD::LongGateWidth ); cbName->AddEntry("DPP::PSD::GateOffset" , Register::DPP::PSD::GateOffset ); cbName->AddEntry("DPP::PSD::TriggerThreshold" , Register::DPP::PSD::TriggerThreshold ); cbName->AddEntry("DPP::PSD::FixedBaseline" , Register::DPP::PSD::FixedBaseline ); cbName->AddEntry("DPP::PSD::TriggerLatency" , Register::DPP::PSD::TriggerLatency ); cbName->AddEntry("DPP::PSD::ShapedTriggerWidth" , Register::DPP::PSD::ShapedTriggerWidth ); cbName->AddEntry("DPP::PSD::TriggerHoldOffWidth" , Register::DPP::PSD::TriggerHoldOffWidth ); cbName->AddEntry("DPP::PSD::ThresholdForPSDCut" , Register::DPP::PSD::ThresholdForPSDCut ); cbName->AddEntry("DPP::PSD::PurGapThreshold" , Register::DPP::PSD::PurGapThreshold ); cbName->AddEntry("DPP::PSD::DPPAlgorithmControl2_G" , Register::DPP::PSD::DPPAlgorithmControl2_G ); cbName->AddEntry("DPP::PSD::EarlyBaselineFreeze" , Register::DPP::PSD::EarlyBaselineFreeze ); } if( DPPType == V1730_DPP_PSD_CODE || DPPType == V1730_DPP_PHA_CODE){ cbName->AddEntry("DPP::RecordLength_G" , Register::DPP::RecordLength_G ); cbName->AddEntry("DPP::InputDynamicRange" , Register::DPP::InputDynamicRange ); cbName->AddEntry("DPP::NumberEventsPerAggregate_G" , Register::DPP::NumberEventsPerAggregate_G ); cbName->AddEntry("DPP::PreTrigger" , Register::DPP::PreTrigger ); cbName->AddEntry("DPP::TriggerThreshold" , Register::DPP::TriggerThreshold ); cbName->AddEntry("DPP::TriggerHoldOffWidth" , Register::DPP::TriggerHoldOffWidth ); cbName->AddEntry("DPP::DPPAlgorithmControl" , Register::DPP::DPPAlgorithmControl ); cbName->AddEntry("DPP::ChannelStatus_R" , Register::DPP::ChannelStatus_R ); cbName->AddEntry("DPP::AMCFirmwareRevision_R" , Register::DPP::AMCFirmwareRevision_R ); cbName->AddEntry("DPP::ChannelDCOffset" , Register::DPP::ChannelDCOffset ); cbName->AddEntry("DPP::ChannelADCTemperature_R" , Register::DPP::ChannelADCTemperature_R ); cbName->AddEntry("DPP::IndividualSoftwareTrigger_W" , Register::DPP::IndividualSoftwareTrigger_W ); cbName->AddEntry("DPP::VetoWidth" , Register::DPP::VetoWidth ); cbName->AddEntry("DPP::BoardConfiguration" , Register::DPP::BoardConfiguration ); cbName->AddEntry("DPP::AggregateOrganization" , Register::DPP::AggregateOrganization ); cbName->AddEntry("DPP::ADCCalibration_W" , Register::DPP::ADCCalibration_W ); cbName->AddEntry("DPP::ChannelShutdown_W" , Register::DPP::ChannelShutdown_W ); cbName->AddEntry("DPP::AcquisitionControl" , Register::DPP::AcquisitionControl ); cbName->AddEntry("DPP::AcquisitionStatus_R" , Register::DPP::AcquisitionStatus_R ); cbName->AddEntry("DPP::SoftwareTrigger_W" , Register::DPP::SoftwareTrigger_W ); cbName->AddEntry("DPP::GlobalTriggerMask" , Register::DPP::GlobalTriggerMask ); cbName->AddEntry("DPP::FrontPanelTRGOUTEnableMask" , Register::DPP::FrontPanelTRGOUTEnableMask ); cbName->AddEntry("DPP::LVDSIOData" , Register::DPP::LVDSIOData ); cbName->AddEntry("DPP::FrontPanelIOControl" , Register::DPP::FrontPanelIOControl ); cbName->AddEntry("DPP::ChannelEnableMask" , Register::DPP::ChannelEnableMask ); cbName->AddEntry("DPP::ROCFPGAFirmwareRevision_R" , Register::DPP::ROCFPGAFirmwareRevision_R ); cbName->AddEntry("DPP::EventStored_R" , Register::DPP::EventStored_R ); cbName->AddEntry("DPP::VoltageLevelModeConfig" , Register::DPP::VoltageLevelModeConfig ); cbName->AddEntry("DPP::SoftwareClockSync_W" , Register::DPP::SoftwareClockSync_W ); cbName->AddEntry("DPP::BoardInfo_R" , Register::DPP::BoardInfo_R ); cbName->AddEntry("DPP::AnalogMonitorMode" , Register::DPP::AnalogMonitorMode ); cbName->AddEntry("DPP::EventSize_R" , Register::DPP::EventSize_R ); cbName->AddEntry("DPP::TimeBombDowncounter_R" , Register::DPP::TimeBombDowncounter_R ); cbName->AddEntry("DPP::FanSpeedControl" , Register::DPP::FanSpeedControl ); cbName->AddEntry("DPP::RunStartStopDelay" , Register::DPP::RunStartStopDelay ); cbName->AddEntry("DPP::BoardFailureStatus_R" , Register::DPP::BoardFailureStatus_R ); cbName->AddEntry("DPP::DisableExternalTrigger" , Register::DPP::DisableExternalTrigger ); cbName->AddEntry("DPP::TriggerValidationMask_G" , Register::DPP::TriggerValidationMask_G ); cbName->AddEntry("DPP::FrontPanelLVDSIONewFeatures" , Register::DPP::FrontPanelLVDSIONewFeatures ); cbName->AddEntry("DPP::BufferOccupancyGain" , Register::DPP::BufferOccupancyGain ); cbName->AddEntry("DPP::ExtendedVetoDelay" , Register::DPP::ExtendedVetoDelay ); cbName->AddEntry("DPP::ReadoutControl" , Register::DPP::ReadoutControl ); cbName->AddEntry("DPP::ReadoutStatus_R" , Register::DPP::ReadoutStatus_R ); cbName->AddEntry("DPP::BoardID" , Register::DPP::BoardID ); cbName->AddEntry("DPP::MCSTBaseAddressAndControl" , Register::DPP::MCSTBaseAddressAndControl ); cbName->AddEntry("DPP::RelocationAddress" , Register::DPP::RelocationAddress ); cbName->AddEntry("DPP::InterruptStatusID" , Register::DPP::InterruptStatusID ); cbName->AddEntry("DPP::InterruptEventNumber" , Register::DPP::InterruptEventNumber ); cbName->AddEntry("DPP::MaxAggregatePerBlockTransfer", Register::DPP::MaxAggregatePerBlockTransfer ); cbName->AddEntry("DPP::Scratch" , Register::DPP::Scratch ); cbName->AddEntry("DPP::SoftwareReset_W" , Register::DPP::SoftwareReset_W ); cbName->AddEntry("DPP::SoftwareClear_W" , Register::DPP::SoftwareClear_W ); cbName->AddEntry("DPP::ConfigurationReload_W" , Register::DPP::ConfigurationReload_W ); cbName->AddEntry("DPP::ROMChecksum_R" , Register::DPP::ROMChecksum_R ); cbName->AddEntry("DPP::ROMChecksumByte2_R" , Register::DPP::ROMChecksumByte2_R ); cbName->AddEntry("DPP::ROMChecksumByte1_R" , Register::DPP::ROMChecksumByte1_R ); cbName->AddEntry("DPP::ROMChecksumByte0_R" , Register::DPP::ROMChecksumByte0_R ); cbName->AddEntry("DPP::ROMConstantByte2_R" , Register::DPP::ROMConstantByte2_R ); cbName->AddEntry("DPP::ROMConstantByte1_R" , Register::DPP::ROMConstantByte1_R ); cbName->AddEntry("DPP::ROMConstantByte0_R" , Register::DPP::ROMConstantByte0_R ); cbName->AddEntry("DPP::ROM_C_Code_R" , Register::DPP::ROM_C_Code_R ); cbName->AddEntry("DPP::ROM_R_Code_R" , Register::DPP::ROM_R_Code_R ); cbName->AddEntry("DPP::ROM_IEEE_OUI_Byte2_R" , Register::DPP::ROM_IEEE_OUI_Byte2_R ); cbName->AddEntry("DPP::ROM_IEEE_OUI_Byte1_R" , Register::DPP::ROM_IEEE_OUI_Byte1_R ); cbName->AddEntry("DPP::ROM_IEEE_OUI_Byte0_R" , Register::DPP::ROM_IEEE_OUI_Byte0_R ); cbName->AddEntry("DPP::ROM_BoardVersion_R" , Register::DPP::ROM_BoardVersion_R ); cbName->AddEntry("DPP::ROM_BoardFromFactor_R" , Register::DPP::ROM_BoardFromFactor_R ); cbName->AddEntry("DPP::ROM_BoardIDByte1_R" , Register::DPP::ROM_BoardIDByte1_R ); cbName->AddEntry("DPP::ROM_BoardIDByte0_R" , Register::DPP::ROM_BoardIDByte0_R ); cbName->AddEntry("DPP::ROM_PCB_rev_Byte3_R" , Register::DPP::ROM_PCB_rev_Byte3_R ); cbName->AddEntry("DPP::ROM_PCB_rev_Byte2_R" , Register::DPP::ROM_PCB_rev_Byte2_R ); cbName->AddEntry("DPP::ROM_PCB_rev_Byte1_R" , Register::DPP::ROM_PCB_rev_Byte1_R ); cbName->AddEntry("DPP::ROM_PCB_rev_Byte0_R" , Register::DPP::ROM_PCB_rev_Byte0_R ); cbName->AddEntry("DPP::ROM_FlashType_R" , Register::DPP::ROM_FlashType_R ); cbName->AddEntry("DPP::ROM_BoardSerialNumByte1_R" , Register::DPP::ROM_BoardSerialNumByte1_R ); cbName->AddEntry("DPP::ROM_BoardSerialNumByte0_R" , Register::DPP::ROM_BoardSerialNumByte0_R ); cbName->AddEntry("DPP::ROM_VCXO_Type_R" , Register::DPP::ROM_VCXO_Type_R ); } TypeRegisterAddress(); UpdateRegister(); } std::string RegisterSetting::GetRegisterName(uint32_t address){ uint32_t oldID = cbName->GetSelected(); cbName->Select(address, false); if( cbName->GetSelected() == -1 ) { cbName->Select(0, false); } std::string haha = cbName->GetSelectedEntry()->GetTitle(); cbName->Select(oldID, false); return haha; } void RegisterSetting::UpdateRegister(){ uint32_t address = cbName->GetSelected(); txtAddress->SetText(Form("0x%04X", address), false); if( address == 0 || digi == NULL ) { for( int ch = 0; ch < MaxNChannels; ch++){ txtValueHex[ch]->SetText("", false); txtValueDec[ch]->SetText("", false); txtValueUnit[ch]->SetText("", false); txtValueHex[ch]->SetEnabled(false); txtValueDec[ch]->SetEnabled(false); } return; } int boardID = boardIDEntry->GetNumber(); ///check is the register readable std::string haha = cbName->GetSelectedEntry()->GetTitle(); int type = haha.back(); if( address >= 0x8000 ) { bSetALLChannel->SetEnabled(false); for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ txtValueHex[ch]->SetText("", false); txtValueDec[ch]->SetText("", false); txtValueUnit[ch]->SetText("", false); txtValueHex[ch]->SetEnabled(false); txtValueDec[ch]->SetEnabled(false); } txtValueHex[0]->SetEnabled(true); txtValueDec[0]->SetEnabled(true); if( type == 87){ /// 'W' txtValueHex[0]->SetText("Register", false); txtValueDec[0]->SetText("WRITE", false); txtValueUnit[0]->SetText("ONLY", false); txtValueHex[0]->SetEnabled(true); txtValueDec[0]->SetEnabled(true); }else{ value[0] = digi[boardID]->ReadRegister(address); txtValueHex[0]->SetText(Form("0x%08X", value[0]), false); txtValueDec[0]->SetText(Form("%u", value[0]), false); if (type == 82 ){ /// Read only txtValueHex[0]->SetEnabled(false); txtValueDec[0]->SetEnabled(false); }else{ txtValueHex[0]->SetEnabled(true); txtValueDec[0]->SetEnabled(true); } } }else{ EButtonState bState = bSetALLChannel->GetState(); //printf("========= %d \n", bState); bSetALLChannel->SetEnabled(true); /// this will also set the buttonUP if( bState == kButtonDisabled) bState = kButtonUp; bSetALLChannel->SetState(bState); if( type == 87){ /// 'W' for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ txtValueHex[ch]->SetText("Register", false); txtValueDec[ch]->SetText("WRITE", false); txtValueUnit[ch]->SetText("ONLY", false); if( bState == kButtonUp ){ txtValueHex[ch]->SetEnabled(true); txtValueDec[ch]->SetEnabled(true); } } if( bState == kButtonDown ){ txtValueHex[0]->SetEnabled(true); txtValueDec[0]->SetEnabled(true); } }else{ for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ if (type == 82 ){ /// Read only value[ch] = digi[boardID]->ReadRegister(address, ch); txtValueHex[ch]->SetText(Form("0x%08X", value[ch]), false); txtValueDec[ch]->SetText(Form("%u", value[ch]), false); txtValueHex[ch]->SetEnabled(false); txtValueDec[ch]->SetEnabled(false); }else{ value[ch] = digi[boardID]->ReadRegister(address, ch); txtValueHex[ch]->SetText(Form("0x%08X", value[ch]), false); txtValueDec[ch]->SetText(Form("%u", value[ch]), false); if( bSetALLChannel->GetState() == kButtonUp){ txtValueHex[ch]->SetEnabled(true); txtValueDec[ch]->SetEnabled(true); } SetTxtValueUnit(address, ch); if( type == 71 & ch%2 == 1) { /// Paired txtValueHex[ch]->SetEnabled(false); txtValueDec[ch]->SetEnabled(false); } } } } } } void RegisterSetting::SetTxtValueUnit(uint32_t address, int ch){ if( digi == NULL ) return; int boardID = boardIDEntry->GetNumber(); int ch2ns = (int) digi[boardID]->GetCh2ns(); txtValueUnit[ch]->SetText(""); lbValueUnit->SetText("Value [unit]"); if( digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE){ /// PHA if (address == Register::DPP::PHA::RCCR2SmoothingFactor){ lbValueUnit->SetText("Samples"); if( value[ch] == 0 ){ txtValueUnit[ch]->SetText("Disabled"); }else if( value[ch] == 0x3F ){ txtValueUnit[ch]->SetText("128"); }else{ txtValueUnit[ch]->SetText(Form("%d", 2* value[ch])); } } if( address == Register::DPP::PHA::InputRiseTime || address == Register::DPP::PHA::TrapezoidRiseTime || address == Register::DPP::PHA::TrapezoidFlatTop || address == Register::DPP::PHA::PeakingTime || address == Register::DPP::PHA::DecayTime || address == Register::DPP::PHA::TriggerHoldOffWidth || address == Register::DPP::PHA::PeakHoldOff || address == Register::DPP::PHA::ShapedTriggerWidth ){ txtValueUnit[ch]->SetText(Form("%d", 4 * ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::PHA::TriggerThreshold){ lbValueUnit->SetText("Value [LSB]"); txtValueUnit[ch]->SetText(Form("%d", value[ch])); } if( address == Register::DPP::PHA::RiseTimeValidationWindow){ if( value[ch] == 0 ){ txtValueUnit[ch]->SetText("Disabled"); }else{ txtValueUnit[ch]->SetText(Form("%d", ch2ns * value[ch])); } lbValueUnit->SetText("Value [ns]"); } } if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE){ /// PSD if( address == Register::DPP::PSD::ChargeZeroSuppressionThreshold || address == Register::DPP::PSD::TriggerThreshold || address == Register::DPP::PSD::FixedBaseline ){ txtValueUnit[ch]->SetText(Form("%d", value[ch])); lbValueUnit->SetText("Value [LSB]"); } if( address == Register::DPP::PSD::ShortGateWidth || address == Register::DPP::PSD::LongGateWidth || address == Register::DPP::PSD::GateOffset ){ txtValueUnit[ch]->SetText(Form("%d", ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::PSD::TriggerLatency || address == Register::DPP::PSD::ShapedTriggerWidth || address == Register::DPP::PSD::TriggerHoldOffWidth || address == Register::DPP::PSD::EarlyBaselineFreeze ){ txtValueUnit[ch]->SetText(Form("%d", 4* ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::PSD::PurGapThreshold ){ //TODO } } if( digi[boardID]->GetDPPType() == V1730_DPP_PSD_CODE || digi[boardID]->GetDPPType() == V1730_DPP_PHA_CODE){ if( address == Register::DPP::RecordLength_G ){ txtValueUnit[ch]->SetText(Form("%d", 8 * ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::InputDynamicRange ){ if( (value[ch] & 0x1 )== 0 ){ txtValueUnit[ch]->SetText("2.0 Vpp"); }else if((value[ch] & 0x1 ) == 1){ txtValueUnit[ch]->SetText("0.5 Vpp"); } } if( address == Register::DPP::PreTrigger ){ txtValueUnit[ch]->SetText(Form("%d", 4 * ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::TriggerHoldOffWidth ){ txtValueUnit[ch]->SetText(Form("%d", 4 * ch2ns * value[ch])); lbValueUnit->SetText("Value [ns]"); } if( address == Register::DPP::ChannelDCOffset ){ txtValueUnit[ch]->SetText(Form("%.2f", 100. - value[ch]* 100./0xFFFF)); lbValueUnit->SetText("Value [%]"); } } } unsigned int RegisterSetting::ConvertHexToDec(const char * text){ /// Convert 0xXXXX to int unsigned int address = 0; std::stringstream ss ; ss << std::hex << text; ss >> address; return address; } void RegisterSetting::TypeRegisterAddress(){ unsigned int address = ConvertHexToDec(txtAddress->GetText()); txtAddress->SetText(Form("0x%04X", address)); cbName->Select(address, false); if( cbName->GetSelected() == -1 ) { cbName->Select(0, false); }else{ UpdateRegister(); } } void RegisterSetting::ChangeValue(){ printf("=============%s\n", __func__); if( digi == NULL ) return; int boardID = boardIDEntry->GetNumber(); uint32_t address = cbName->GetSelected(); if( bSetALLChannel->GetState() == kButtonDown){ unsigned int newValue1 = ConvertHexToDec(txtValueHex[0]->GetText()); unsigned int newValue2 = atoi(txtValueDec[0]->GetText()); if( value[0] != newValue1){ digi[boardID]->WriteRegister(address, newValue1, -1); for( int i = 1; i < MaxNChannels ; i++ ) value[i] = newValue1; UpdateRegister(); }else if(value[0] != newValue2){ digi[boardID]->WriteRegister(address, newValue2, -1); for( int i = 1; i < MaxNChannels ; i++ ) value[i] = newValue2; UpdateRegister(); } }else{ for( int ch = 0; ch < digi[boardID]->GetNChannel(); ch++){ unsigned int newValue1 = ConvertHexToDec(txtValueHex[ch]->GetText()); unsigned int newValue2 = atoi(txtValueDec[ch]->GetText()); if( value[ch] != newValue1){ digi[boardID]->WriteRegister(address, newValue1, ch); value[ch] = newValue1; UpdateRegister(); //SendChangeSignal(); }else if(value[ch] != newValue2){ digi[boardID]->WriteRegister(address, newValue2, ch); value[ch] = newValue2; UpdateRegister(); //SendChangeSignal(); } } } } void RegisterSetting::SetAllChannels(){ if( digi == NULL ) return; int boardID = boardIDEntry->GetNumber(); if( bSetALLChannel->GetState() == kButtonDown ){ for( int ch = 1; ch < digi[boardID]->GetNChannel(); ch++){ txtValueHex[ch]->SetEnabled(false); txtValueDec[ch]->SetEnabled(false); } }else{ UpdateRegister(); } } void RegisterSetting::SendChangeSignal(){ Emit("SendChangeSignal()"); } void RegisterSetting::LogMsg(TString msg){ Emit("LogMsg(char*)", msg.Data()); }