// DetPlane_Page.cpp : implementation file // #include "stdafx.h" #include "daq.h" #include "DetPlane_Page.h" #include "DaqSetup.h" #include "Ok.h" #include "ScanDlg.h" #include "TextDlg.h" #include "RunHandler.h" #include "AutoPilot.h" #include "LogFile.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDetPlane_Page property page IMPLEMENT_DYNCREATE(CDetPlane_Page, CPropertyPage) CDetPlane_Page::CDetPlane_Page() : CPropertyPage(CDetPlane_Page::IDD) { //{{AFX_DATA_INIT(CDetPlane_Page) m_name = _T("none"); m_runMode = _T("Readout"); m_linkSel = 0; m_setMode = 0; m_value = 0.0; m_c0 = FALSE; m_c1 = FALSE; m_c2 = FALSE; m_c3 = FALSE; m_call = FALSE; m_autop_file = _T(""); m_ch_start = -1; m_ch_stop = -1; m_chan_use = TRUE; m_run_stat = _T("done"); m_stat_ap = _T("done"); //}}AFX_DATA_INIT _detPlane = 0; } CDetPlane_Page::~CDetPlane_Page() { } void CDetPlane_Page::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDetPlane_Page) DDX_Text(pDX, IDC_DP_NAME, m_name); DDX_CBString(pDX, IDC_DP_RUN_MODE, m_runMode); DDX_CBIndex(pDX, IDC_DP_SEL, m_linkSel); DDX_CBIndex(pDX, IDC_DP_SET_MODE, m_setMode); DDX_Text(pDX, IDC_DP_VAL, m_value); DDX_Check(pDX, IDC_DP_C0, m_c0); DDX_Check(pDX, IDC_DP_C1, m_c1); DDX_Check(pDX, IDC_DP_C2, m_c2); DDX_Check(pDX, IDC_DP_C3, m_c3); DDX_Check(pDX, IDC_DP_C4, m_call); DDX_Text(pDX, IDC_DP_AUTO_FILE, m_autop_file); DDX_Text(pDX, IDC_DP_CH_START, m_ch_start); DDX_Text(pDX, IDC_DP_CH_STOP, m_ch_stop); DDX_Check(pDX, IDC_DP_CHAN_USE, m_chan_use); DDX_Text(pDX, IDC_DP_RUNST, m_run_stat); DDX_Text(pDX, IDC_DP_STAT_AP, m_stat_ap); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDetPlane_Page, CPropertyPage) //{{AFX_MSG_MAP(CDetPlane_Page) ON_BN_CLICKED(IDC_DP_SET, OnDpSet) ON_CBN_SELCHANGE(IDC_DP_SEL, OnSelchangeDpSel) ON_BN_CLICKED(IDC_DP_RUN, OnDpRun) ON_CBN_SELCHANGE(IDC_DP_SET_MODE, OnSelchangeDpSetMode) ON_BN_CLICKED(IDC_DP_CH_SET, OnDpChSet) ON_BN_CLICKED(IDC_DP_AUTOP, OnDpAutop) ON_BN_CLICKED(IDC_DP_CH_SETAll, OnDPCHSETAll) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDetPlane_Page message handlers // ============================================================== // set parameters // ============================================================== void CDetPlane_Page::OnDpSet() { if ( !loadDetPlaneMess () ) { return; } UpdateData (TRUE); switch ( m_setMode ) { case 0 : _detPlane->setV_thres (m_value); m_value = _detPlane->getV_thres (); break; case 1 : _detPlane->setV_ref (m_value); m_value = _detPlane->getV_ref (); break; case 2 : _detPlane->setV_att (m_value); m_value = _detPlane->getV_att (); break; case 3 : _detPlane->setV_cal (m_value); m_value = _detPlane->getV_cal (); break; case 4 : _detPlane->set_strobeDelay ( (int) m_value); m_value = (double) _detPlane->strobeDelay (); break; case 5: _detPlane->set_counterValue ( (int) m_value); m_value = (double) _detPlane->counterValue (); break; case 6: _detPlane->set_nLoops ((int) m_value); m_value = (double) _detPlane->nLoops (); break; } UpdateData (FALSE); } // ========================================================= // select a detector plane // ========================================================= void CDetPlane_Page::OnSelchangeDpSel() { UpdateData (TRUE); DaqSetup* _daq = _daq->Instance (); ReadoutConfig* _config = _daq->readoutConfig (); if ( !(_detPlane = _config->get_detPlane (m_linkSel,0)) ) { m_name = _T("error"); } else { _detPlane->name (m_name); m_setMode = 0; m_value = _detPlane->getV_thres (); } UpdateData (FALSE); } // ========================================================= // execute a run // ========================================================= void CDetPlane_Page::OnDpRun() { if ( !loadDetPlaneMess () ) { return; } RunHandler run (_detPlane); UpdateData (TRUE); m_run_stat = _T("running"); UpdateData (FALSE); UpdateData (TRUE); // ---------------------------------------- // Qinj Scan // ---------------------------------------- if ( m_runMode == "Qinj Scan" ) { ScanDlg scanDlg; scanDlg.m_constText = _T("Threshold [mV]"); scanDlg.m_varText = _T("Calib. Ampl. [V]:"); scanDlg.m_fname = _T("qin.dat"); if ( scanDlg.DoModal () == IDOK ) { run.setMode (qinj); run.setEvents_fName (scanDlg.m_event, (char *) (LPCTSTR) scanDlg.m_fname); run.do_a_Run (scanDlg.m_start, scanDlg.m_stop, scanDlg.m_stepSize, scanDlg.m_const_val); } } if ( m_runMode == "Calibration" ) { ScanDlg scanDlg; scanDlg.m_constText = _T("Threshold [mV]"); scanDlg.m_varText = _T("Calib. Ampl. [V]:"); scanDlg.m_fname = _T("calib.dat"); if ( scanDlg.DoModal () == IDOK ) { run.setMode (calib); run.setEvents_fName (scanDlg.m_event, (char *) (LPCTSTR) scanDlg.m_fname); run.do_a_Run (scanDlg.m_start, scanDlg.m_stop, scanDlg.m_stepSize, scanDlg.m_const_val); } } if ( m_runMode == "Noise Scan" ) { ScanDlg scanDlg; scanDlg.m_constText = _T("Max number of events:"); scanDlg.m_varText = _T("Threshold [mV]:"); scanDlg.m_fname = _T("noise.dat"); scanDlg.m_const_val = 0; if ( scanDlg.DoModal () == IDOK ) { run.setMode (noise); run.setEvents_fName (scanDlg.m_event, (char *) (LPCTSTR) scanDlg.m_fname); run.do_a_Run (scanDlg.m_start, scanDlg.m_stop, scanDlg.m_stepSize, scanDlg.m_const_val); } } // ---------------------------------------- // Vref Scan // ---------------------------------------- else if ( m_runMode == "Vref Scan" ) { ScanDlg scanDlg; scanDlg.m_constText = _T("none"); scanDlg.m_varText = _T("V ref [V]:"); scanDlg.m_fname = _T("vref.dat"); if ( scanDlg.DoModal () == IDOK ) { run.setMode (vref); run.setEvents_fName (scanDlg.m_event, (char *) (LPCTSTR) scanDlg.m_fname); run.do_a_Run (scanDlg.m_start, scanDlg.m_stop, scanDlg.m_stepSize, scanDlg.m_const_val); } } // ---------------------------------------- // Strobe Delay Scan // ---------------------------------------- else if ( m_runMode == "Strobe Delay Scan" ) { ScanDlg scanDlg; scanDlg.m_constText = _T("Calib. Ampl. [V]:"); scanDlg.m_varText = _T("Strobe Delay [0-255]:"); scanDlg.m_fname = _T("strobe.dat"); if ( scanDlg.DoModal () == IDOK ) { run.setMode (strobe); run.setEvents_fName (scanDlg.m_event, (char *) (LPCTSTR) scanDlg.m_fname); run.do_a_Run (scanDlg.m_start, scanDlg.m_stop, scanDlg.m_stepSize, scanDlg.m_const_val); } } // ---------------------------------------- // Readout Sequence // ---------------------------------------- if ( m_runMode == "Readout" ) { CTextDlg textDlg; textDlg.m_text = _T("Number of events"); textDlg.m_fname = _T("read.dat"); textDlg.m_value = 300.0; if ( textDlg.DoModal () == IDOK ) { run.setMode (readout); run.setEvents_fName ((int) textDlg.m_value, (char *) (LPCTSTR) textDlg.m_fname); run.do_a_Run (0.0, 0.0, 1.0, 0.0); } } m_run_stat = _T("done"); UpdateData (FALSE); } // ==================================================== // read parameter value // ==================================================== void CDetPlane_Page::OnSelchangeDpSetMode() { if ( !loadDetPlaneMess () ) { return; } UpdateData (TRUE); switch ( m_setMode ) { case 0 : m_value = _detPlane->getV_thres (); break; case 1 : m_value = _detPlane->getV_ref (); break; case 2 : m_value = _detPlane->getV_att (); break; case 3 : m_value = _detPlane->getV_cal (); break; case 4 : m_value = (double) _detPlane->strobeDelay (); break; case 5: m_value = (double) _detPlane->counterValue (); break; case 6: m_value = (double) _detPlane->nLoops (); break; } UpdateData (FALSE); } // ================================================================= // set channel numbers // ================================================================= void CDetPlane_Page::OnDpChSet() { if ( !loadDetPlaneMess () ) { return; } UpdateData (TRUE); int chanMax = _detPlane->nChan () - 1; _detPlane->chanList.resetChanList (); if ( m_call ) { _detPlane->chanList.addChan (0, chanMax, 1); } else { if ( m_c0 ) _detPlane->chanList.addChan (0, chanMax, 4); if ( m_c1 ) _detPlane->chanList.addChan (1, chanMax, 4); if ( m_c2 ) _detPlane->chanList.addChan (2, chanMax, 4); if ( m_c3 ) _detPlane->chanList.addChan (3, chanMax, 4); } if ( m_ch_start >= 0 && m_ch_start <= m_ch_stop ) { if ( m_chan_use ) { _detPlane->chanList.addChan (m_ch_start, m_ch_stop, 1); } else { _detPlane->chanList.removeChan (m_ch_start, m_ch_stop, 1); } } _detPlane->chanList.makeChanList (); UpdateData (FALSE); /* for ( int i = 0; i < chanMax; i++ ) { if ( _detPlane->chanList.chanStatus (i) == CHAN_USED ) logFile << i << " " << endl; } */ } void CDetPlane_Page::OnDPCHSETAll() { if ( !loadDetPlaneMess () ) { return; } UpdateData (TRUE); int chanMax = _detPlane->nChan () - 1; _detPlane->chanList.resetChanList (); _detPlane->chanList.addChan (0, chanMax, 1); _detPlane->chanList.makeChanList (); m_ch_start = -1; m_ch_stop = -1; m_chan_use = TRUE; UpdateData (TRUE); } // ===================================================== // run autopilot // ===================================================== void CDetPlane_Page::OnDpAutop() { if ( !loadDetPlaneMess () ) { return; } UpdateData (TRUE); m_stat_ap = _T("running"); UpdateData (FALSE); UpdateData (TRUE); AutoPilot autoPilot (_detPlane); autoPilot.execute ((char *) (LPCTSTR) m_autop_file); m_stat_ap = _T("done"); UpdateData (FALSE); } // ================================================================= // // ================================================================= int CDetPlane_Page::loadDetPlaneMess () { if ( _detPlane == 0 ) { COk ok_dlg; ok_dlg.m_text = _T("Please first select a detector plane (link)"); if ( ok_dlg.DoModal () == IDOK ) { } return 0; } return 1; }