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