diff --git a/software/drsosc/ConfigDialog.cpp b/software/drsosc/ConfigDialog.cpp index 5c24577..4192722 100644 --- a/software/drsosc/ConfigDialog.cpp +++ b/software/drsosc/ConfigDialog.cpp @@ -150,7 +150,7 @@ void ConfigDialog::UpdateControls() m_cbExtRefclk->SetValue(m_osci->GetBoard(m_board)->GetRefclk() == 1); if ((m_osci->GetBoard(m_board)->GetBoardType() == 8 || m_osci->GetBoard(m_board)->GetBoardType() == 9) - && (!m_osci->IsMultiBoard() || m_board == 0)) + && !(m_osci->IsMultiBoard() && !m_frame->IsTranspTrigger() && m_board > 0)) m_frame->EnableTriggerConfig(true); else m_frame->EnableTriggerConfig(false); @@ -178,7 +178,7 @@ void ConfigDialog::OnBoardSelect( wxCommandEvent& event ) wxT("DRS Oscilloscope"), wxOK | wxICON_STOP, this); } else { if (b->GetScaler(5) < 300000) { - str.Printf(wxT("No clock signal connected to CLK IN of board #%d"), i); + str.Printf(wxT("No clock signal connected to CLK IN of board #%d. Keeping internal clock."), m_frame->GetOsci()->GetBoard(i)->GetBoardSerialNumber()); wxMessageBox(str, wxT("DRS Oscilloscope"), wxOK | wxICON_STOP, this); m_frame->SetRefclk(i, false); } else { diff --git a/software/drsosc/DOFrame.cpp b/software/drsosc/DOFrame.cpp index 4f342b1..2ce34de 100644 --- a/software/drsosc/DOFrame.cpp +++ b/software/drsosc/DOFrame.cpp @@ -93,6 +93,7 @@ DOFrame_fb( parent ) m_chnSection = 0; m_multiBoard = false; m_splitMode = false; + m_transpTrigger = false; // initialize settings m_trgCorr = true; @@ -357,7 +358,7 @@ void DOFrame::ClearWaveforms() void DOFrame::UpdateControls() { - if (m_osci->IsMultiBoard() && m_board > 0) { + if (m_osci->IsMultiBoard() && !m_transpTrigger && m_board > 0) { m_slTrgLevel->Enable(false); m_rbAuto->Enable(false); m_rbNormal->Enable(false); @@ -434,7 +435,7 @@ void DOFrame::UpdateControls() if (m_osci->GetCurrentBoard()->GetBoardType() < 8) { EnableTriggerConfig(false); } else { - if (m_osci->IsMultiBoard() && m_board > 0) + if (m_osci->IsMultiBoard() && !m_transpTrigger && m_board > 0) EnableTriggerConfig(false); else EnableTriggerConfig(true); @@ -529,6 +530,9 @@ void DOFrame::SaveConfig() sprintf(str, "%d", (int)m_splitMode); mxml_write_element(xml, "SplitMode", str); + sprintf(str, "%d", (int)m_transpTrigger); + mxml_write_element(xml, "TranspTrig", str); + for (int b=0 ; bGetNumberOfBoards() ; b++) { sprintf(str, "Board-%d", m_osci->GetBoard(b)->GetBoardSerialNumber()); mxml_start_element(xml, str); @@ -649,6 +653,9 @@ void DOFrame::LoadConfig(char *error, int size) node = mxml_find_node(osc, "SplitMode"); if (node) m_splitMode = atoi(mxml_get_value(node)) > 0; + node = mxml_find_node(osc, "TranspTrig"); + if (node) m_transpTrigger = atoi(mxml_get_value(node)) > 0; + for (i=idx=0 ; ; i++) { PMXML_NODE b = mxml_subnode(osc, i); if (!b) @@ -1691,18 +1698,60 @@ void DOFrame::SetTriggerConfig(int id, bool flag) if (id == ID_TRANS) { if (flag) { - m_trgConfig[m_board] |= (1<<15); - m_trgConfig[m_board] &= ~((1<<4) | (1<<12)); // remove possible EXT trigger - } else - m_trgConfig[m_board] &= ~(1<<15); + // turn on transparent mode for all boards in multi-board mode + if (m_multiBoard) { + m_transpTrigger = true; + for (int i=0 ; iGetNumberOfBoards() ; i++) { + m_trgConfig[i] |= (1<<15); + m_trgConfig[i] &= ~((1<<4) | (1<<12)); // remove possible EXT trigger + } + } else { + m_transpTrigger = false; + m_trgConfig[m_board] |= (1<<15); + m_trgConfig[m_board] &= ~((1<<4) | (1<<12)); // remove possible EXT trigger + } + + // if no channel selected, select first one + if ((m_trgConfig[m_board] & 0x7FFF) == 0) { + m_trgConfig[m_board] |= 1; + DOFrame::SelectBoard(m_board); + } + + } else { + m_transpTrigger = false; + if (m_multiBoard) { + for (int i=0 ; iGetNumberOfBoards() ; i++) { + m_trgConfig[i] &= ~(1<<15); + } + } else + m_trgConfig[m_board] &= ~(1<<15); + } } if ((m_trgConfig[m_board] & 0x7FFF) > 0) { m_rbSource->Enable(false); - m_osci->SetTriggerConfig(m_trgConfig[m_board]); + if (m_multiBoard) { + int b = m_board; + for (int i=0 ; iGetNumberOfBoards() ; i++) { + m_board = i; + m_osci->SetTriggerConfig(m_trgConfig[i]); + } + m_board = b; + } else { + m_osci->SetTriggerConfig(m_trgConfig[m_board]); + } } else { m_rbSource->Enable(true); - m_osci->SetTriggerSource(m_trgSource[m_board]); + if (m_multiBoard) { + int b = m_board; + for (int i=0 ; iGetNumberOfBoards() ; i++) { + m_board = i; + m_osci->SetTriggerSource(m_trgSource[i]); + } + m_board = b; + } else { + m_osci->SetTriggerSource(m_trgSource[m_board]); + } } } diff --git a/software/drsosc/DOFrame.h b/software/drsosc/DOFrame.h index 93f07f4..bff92b7 100644 --- a/software/drsosc/DOFrame.h +++ b/software/drsosc/DOFrame.h @@ -94,6 +94,7 @@ public: void SetTriggerConfig(int id, bool flag); void SetTriggerSource(int b, int source); void SetTriggerPolarity(int b, bool negative); + bool IsTranspTrigger() { return m_transpTrigger; } void SetStat(bool flag); void SetHist(bool flag); void SetStatNStat(int n); @@ -224,6 +225,7 @@ private: int m_chnSection; bool m_multiBoard; bool m_splitMode; + bool m_transpTrigger; int m_progress; };