1 #include <assert.h>
2 #include "lms7002_mainPanel.h"
3 #include "lms7002_pnlAFE_view.h"
4 #include "lms7002_pnlBIAS_view.h"
5 #include "lms7002_pnlBIST_view.h"
6 #include "lms7002_pnlCDS_view.h"
7 #include "lms7002_pnlCLKGEN_view.h"
8 #include "lms7002_pnlLDO_view.h"
9 #include "lms7002_pnlLimeLightPAD_view.h"
10 #include "lms7002_pnlTxTSP_view.h"
11 #include "lms7002_pnlRxTSP_view.h"
12 #include "lms7002_pnlRBB_view.h"
13 #include "lms7002_pnlRFE_view.h"
14 #include "lms7002_pnlSX_view.h"
15 #include "lms7002_pnlTBB_view.h"
16 #include "lms7002_pnlTRF_view.h"
17 #include "lms7002_pnlXBUF_view.h"
18 #include "lms7002_pnlGains_view.h"
19 #include "lms7002_pnlCalibrations_view.h"
20 #include <wx/time.h>
21 #include <wx/msgdlg.h>
22 #include <iostream>
23 #include <wx/filedlg.h>
24 #include "lms7suiteEvents.h"
25 #include "lms7002_pnlMCU_BD_view.h"
26 #include "lms7002_pnlR3.h"
27 #include "lime/LimeSuite.h"
28 #include "lms7_device.h"
29 using namespace std;
30 using namespace lime;
31
lms7002_mainPanel(wxWindow * parent,wxWindowID id,const wxPoint & pos,const wxSize & size,long style)32 lms7002_mainPanel::lms7002_mainPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
33 :
34 mainPanel(parent, id, pos, size, style), lmsControl(nullptr)
35 {
36 mTabMCU = new lms7002_pnlMCU_BD_view(tabsNotebook);
37 tabsNotebook->AddPage(mTabMCU, _("MCU"));
38
39 mTabR3 = new lms7002_pnlR3_view(tabsNotebook, wxNewId());
40 tabsNotebook->AddPage(mTabR3, _("R3 Controls"));
41 }
42
~lms7002_mainPanel()43 lms7002_mainPanel::~lms7002_mainPanel()
44 {
45 }
46
UpdateVisiblePanel()47 void lms7002_mainPanel::UpdateVisiblePanel()
48 {
49 wxWindow* currentPage = tabsNotebook->GetCurrentPage();
50 uint16_t spisw_ctrl = 0;
51 if (((LMS7_Device*)lmsControl)->GetConnection())
52 {
53 if (currentPage == mTabSXR) //change active channel to A
54 LMS_WriteParam(lmsControl,LMS7param(MAC),1);
55 else if (currentPage == mTabSXT) //change active channel to B
56 LMS_WriteParam(lmsControl,LMS7param(MAC),2);
57 else
58 LMS_WriteParam(lmsControl,LMS7param(MAC),rbChannelA->GetValue() == 1 ? 1: 2);
59 LMS_ReadLMSReg(lmsControl, 0x0006, &spisw_ctrl);
60 }
61
62 if(spisw_ctrl & 1) // transceiver controlled by MCU
63 {
64 if(currentPage != mTabMCU && currentPage != mTabTrxGain)
65 currentPage->Disable();
66 return;
67 }
68 else
69 currentPage->Enable();
70
71 wxLongLong t1, t2;
72 t1 = wxGetUTCTimeMillis();
73 long visibleTabId = tabsNotebook->GetCurrentPage()->GetId();
74 switch (visibleTabId)
75 {
76 case ID_TAB_AFE:
77 mTabAFE->UpdateGUI();
78 break;
79 case ID_TAB_BIAS:
80 mTabBIAS->UpdateGUI();
81 break;
82 case ID_TAB_BIST:
83 mTabBIST->UpdateGUI();
84 break;
85 case ID_TAB_CDS:
86 mTabCDS->UpdateGUI();
87 break;
88 case ID_TAB_CGEN:
89 mTabCGEN->UpdateGUI();
90 break;
91 case ID_TAB_LDO:
92 mTabLDO->UpdateGUI();
93 break;
94 case ID_TAB_LIMELIGHT:
95 mTabLimeLight->UpdateGUI();
96 break;
97 case ID_TAB_TXTSP:
98 mTabTxTSP->UpdateGUI();
99 break;
100 case ID_TAB_RXTSP:
101 mTabRxTSP->UpdateGUI();
102 break;
103 case ID_TAB_RBB:
104 mTabRBB->UpdateGUI();
105 break;
106 case ID_TAB_RFE:
107 mTabRFE->UpdateGUI();
108 break;
109 case ID_TAB_SXR:
110 mTabSXR->UpdateGUI();
111 break;
112 case ID_TAB_SXT:
113 mTabSXT->UpdateGUI();
114 break;
115 case ID_TAB_TBB:
116 mTabTBB->UpdateGUI();
117 break;
118 case ID_TAB_TRF:
119 mTabTRF->UpdateGUI();
120 break;
121 case ID_TAB_XBUF:
122 mTabXBUF->UpdateGUI();
123 break;
124 case ID_TAB_CALIBRATIONS:
125 mTabCalibrations->UpdateGUI();
126 break;
127 case ID_TAB_GAINS:
128 mTabTrxGain->UpdateGUI();
129 break;
130 }
131 if(visibleTabId == mTabR3->GetId())
132 mTabR3->UpdateGUI();
133 t2 = wxGetUTCTimeMillis();
134 #ifndef NDEBUG
135 cout << "Visible GUI update time: " << (t2 - t1).ToString() << endl;
136 #endif
137 }
138
Initialize(lms_device_t * pControl)139 void lms7002_mainPanel::Initialize(lms_device_t* pControl)
140 {
141 assert(pControl != nullptr);
142 lmsControl = pControl;
143 mTabRFE->Initialize(lmsControl);
144 mTabRBB->Initialize(lmsControl);
145 mTabTRF->Initialize(lmsControl);
146 mTabTBB->Initialize(lmsControl);
147 mTabAFE->Initialize(lmsControl);
148 mTabBIAS->Initialize(lmsControl);
149 mTabLDO->Initialize(lmsControl);
150 mTabXBUF->Initialize(lmsControl);
151 mTabCGEN->Initialize(lmsControl);
152 mTabSXR->Initialize(lmsControl);
153 mTabSXT->Initialize(lmsControl);
154 mTabTrxGain->Initialize(lmsControl);
155 mTabLimeLight->Initialize(lmsControl);
156 mTabTxTSP->Initialize(lmsControl);
157 mTabRxTSP->Initialize(lmsControl);
158 mTabCDS->Initialize(lmsControl);
159 mTabBIST->Initialize(lmsControl);
160 mTabCalibrations->Initialize(lmsControl);
161 mTabMCU->Initialize(lmsControl);
162 mTabR3->Initialize(lmsControl);
163 ((LMS7_Device*)lmsControl)->SetActiveChip(0);
164 cmbLmsDevice->SetSelection(0);
165
166 if (((LMS7_Device*)lmsControl)->GetNumChannels() > 2)
167 cmbLmsDevice->Show();
168 else
169 cmbLmsDevice->Hide();
170 rbChannelA->SetValue(true);
171 rbChannelB->SetValue(false);
172 UpdateGUI();
173 Layout();
174 }
175
OnResetChip(wxCommandEvent & event)176 void lms7002_mainPanel::OnResetChip(wxCommandEvent &event)
177 {
178 int status = LMS_Reset(lmsControl);
179 if (status != 0)
180 wxMessageBox(_("Chip reset failed"), _("Warning"));
181 wxNotebookEvent evt;
182 chkEnableMIMO->SetValue(false);
183 Onnotebook_modulesPageChanged(evt); //after reset chip active channel might change, this refresh channel for active tab
184 }
185
OnLoadDefault(wxCommandEvent & event)186 void lms7002_mainPanel::OnLoadDefault(wxCommandEvent& event)
187 {
188 int status = LMS_Init(lmsControl);
189 if (status != 0)
190 wxMessageBox(_("Load Default failed"), _("Warning"));
191 LMS_EnableChannel(lmsControl, LMS_CH_TX, 0, true); //enable TX, LMS_Init() no longer does it
192 wxNotebookEvent evt;
193 chkEnableMIMO->SetValue(false);
194 ((LMS7_Device*)lmsControl)->SetActiveChip(cmbLmsDevice->GetSelection());
195 Onnotebook_modulesPageChanged(evt); //after reset chip active channel might change, this refresh channel for active tab
196 wxCommandEvent evt2;
197 evt.SetEventType(CGEN_FREQUENCY_CHANGED);
198 wxPostEvent(this, evt2);
199 }
200
UpdateGUI()201 void lms7002_mainPanel::UpdateGUI()
202 {
203 wxLongLong t1, t2;
204 t1 = wxGetUTCTimeMillis();
205 t2 = wxGetUTCTimeMillis();
206 UpdateVisiblePanel();
207 }
208
OnNewProject(wxCommandEvent & event)209 void lms7002_mainPanel::OnNewProject( wxCommandEvent& event )
210 {
211 LMS_Reset(lmsControl);
212 LMS_WriteParam(lmsControl,LMS7param(MAC),rbChannelA->GetValue() == 1 ? 1: 2);
213 LMS_WriteParam(lmsControl,LMS7param(MAC),1);
214 UpdateGUI();
215 }
216
OnOpenProject(wxCommandEvent & event)217 void lms7002_mainPanel::OnOpenProject( wxCommandEvent& event )
218 {
219 wxFileDialog dlg(this, _("Open config file"), "", "", "Project-File (*.ini)|*.ini", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
220 if (dlg.ShowModal() == wxID_CANCEL)
221 return;
222 int status = LMS_LoadConfig(lmsControl,dlg.GetPath().To8BitData());
223 if (status != 0)
224 {
225 wxMessageBox(_("Failed to load file"), _("Warning"));
226 }
227 wxCommandEvent tevt;
228 LMS_WriteParam(lmsControl,LMS7param(MAC),rbChannelA->GetValue() == 1 ? 1: 2);
229 UpdateGUI();
230 wxCommandEvent evt;
231 evt.SetEventType(CGEN_FREQUENCY_CHANGED);
232 wxPostEvent(this, evt);
233 }
234
OnSaveProject(wxCommandEvent & event)235 void lms7002_mainPanel::OnSaveProject( wxCommandEvent& event )
236 {
237 wxFileDialog dlg(this, _("Save config file"), "", "", "Project-File (*.ini)|*.ini", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
238 if (dlg.ShowModal() == wxID_CANCEL)
239 return;
240 int status = LMS_SaveConfig(lmsControl,dlg.GetPath().To8BitData());
241 if (status != 0)
242 wxMessageBox(_("Failed to save file"), _("Warning"));
243 }
244
OnSwitchToChannelA(wxCommandEvent & event)245 void lms7002_mainPanel::OnSwitchToChannelA(wxCommandEvent& event)
246 {
247 UpdateVisiblePanel();
248 }
249
OnSwitchToChannelB(wxCommandEvent & event)250 void lms7002_mainPanel::OnSwitchToChannelB(wxCommandEvent& event)
251 {
252 UpdateVisiblePanel();
253 }
254
Onnotebook_modulesPageChanged(wxNotebookEvent & event)255 void lms7002_mainPanel::Onnotebook_modulesPageChanged( wxNotebookEvent& event )
256 {
257 wxNotebookPage* page = tabsNotebook->GetCurrentPage();
258 if (page == mTabAFE || page == mTabBIAS || page == mTabLDO || page == mTabXBUF || page == mTabCGEN || page == mTabCDS || page == mTabBIST)
259 {
260 rbChannelA->Disable();
261 rbChannelB->Disable();
262 }
263 else if (page == mTabSXR) //change active channel to A
264 {
265 rbChannelA->Disable();
266 rbChannelB->Disable();
267 }
268 else if (page == mTabSXT) //change active channel to B
269 {
270 rbChannelA->Disable();
271 rbChannelB->Disable();
272 }
273 else
274 {
275 rbChannelA->Enable();
276 rbChannelB->Enable();
277 }
278
279 #ifdef __APPLE__
280 //force show the page selected by the event (needed on apple)
281 if (event.GetSelection() != -1)
282 {
283 dynamic_cast<wxNotebook*>(event.GetEventObject())->GetPage(event.GetSelection())->Show(true);
284 }
285 #endif
286
287 UpdateVisiblePanel();
288 }
289
OnDownloadAll(wxCommandEvent & event)290 void lms7002_mainPanel::OnDownloadAll(wxCommandEvent& event)
291 {
292 int status = LMS_Synchronize(lmsControl,false);
293 if (status != 0)
294 wxMessageBox(_("Download all registers failed"), _("Warning"));
295 UpdateVisiblePanel();
296 }
297
OnUploadAll(wxCommandEvent & event)298 void lms7002_mainPanel::OnUploadAll(wxCommandEvent& event)
299 {
300 int status = LMS_Synchronize(lmsControl,true);
301 if (status != 0)
302 wxMessageBox(_("Upload all registers failed"), _("Warning"));
303 wxCommandEvent evt;
304 evt.SetEventType(CGEN_FREQUENCY_CHANGED);
305 wxPostEvent(this, evt);
306 UpdateVisiblePanel();
307 }
308
OnReadTemperature(wxCommandEvent & event)309 void lms7002_mainPanel::OnReadTemperature(wxCommandEvent& event)
310 {
311 double t = 0.0;
312 int status = LMS_GetChipTemperature(lmsControl,0,&t);
313 if (status != 0)
314 wxMessageBox(_("Failed to read chip temperature"), _("Warning"));
315 txtTemperature->SetLabel(wxString::Format("Temperature: %.0f C", t));
316 }
317
OnSyncABchecked(wxCommandEvent & event)318 void lms7002_mainPanel::OnSyncABchecked(wxCommandEvent& event)
319 {
320 /*
321 rbChannelA->Enable(!chkSyncAB->IsChecked());
322 rbChannelB->Enable(!chkSyncAB->IsChecked());
323 if(chkSyncAB->IsChecked())
324 {
325 int status = lmsControl->CopyChannelRegisters(LMS7002M::ChA, LMS7002M::ChB, false);
326 if(status != 0)
327 wxMessageBox(wxString::Format(_("Failed to copy A to B: %s"), wxString::From8BitData(GetLastErrorMessage())), _("Error"));
328 wxNotebookPage* page = tabsNotebook->GetCurrentPage();
329 if(page != mTabSXR && page != mTabSXT)
330 lmsControl->SetActiveChannel(lime::LMS7002M::ChAB);
331 }
332 else
333 {
334 if(rbChannelA->GetValue() != 0)
335 lmsControl->SetActiveChannel(lime::LMS7002M::ChA);
336 else
337 lmsControl->SetActiveChannel(lime::LMS7002M::ChB);
338 }
339 UpdateVisiblePanel();
340 */
341 }
342
OnEnableMIMOchecked(wxCommandEvent & event)343 void lms7002_mainPanel::OnEnableMIMOchecked(wxCommandEvent& event)
344 {
345 uint16_t chBck;
346 LMS_ReadParam(lmsControl, LMS7param(MAC), &chBck);
347 bool enable = chkEnableMIMO->IsChecked();
348 for (int ch = enable ? 0 : 1 ; ch < LMS_GetNumChannels(lmsControl,false);ch++)
349 {
350 LMS_EnableChannel(lmsControl,LMS_CH_RX,ch,enable);
351 LMS_EnableChannel(lmsControl,LMS_CH_TX,ch,enable);
352 }
353 LMS_WriteParam(lmsControl, LMS7param(MAC), chBck);
354 UpdateVisiblePanel();
355 }
356
OnCalibrateInternalADC(wxCommandEvent & event)357 void lms7002_mainPanel::OnCalibrateInternalADC(wxCommandEvent& event)
358 {
359 LMS7002M* lms = ((LMS7_Device*)lmsControl)->GetLMS();
360 int status = lms->CalibrateInternalADC();
361 if (status != 0)
362 wxMessageBox(_("Internal ADC calibration failed"), _("Warning"));
363 }
364
GetLmsSelection()365 int lms7002_mainPanel::GetLmsSelection()
366 {
367 return cmbLmsDevice->GetSelection();
368 }
369
OnLmsDeviceSelect(wxCommandEvent & event)370 void lms7002_mainPanel::OnLmsDeviceSelect( wxCommandEvent& event )
371 {
372 int deviceSelection = cmbLmsDevice->GetSelection();
373 ((LMS7_Device*)lmsControl)->SetActiveChip(deviceSelection);
374
375 UpdateVisiblePanel();
376 wxCommandEvent evt;
377 evt.SetEventType(LMS_CHANGED);
378 evt.SetInt(deviceSelection);
379 wxPostEvent(this->GetParent(), evt);
380 }
381