1 #include "pnlBoardControls.h"
2 #include "wx/wxprec.h"
3 #include "lime/LimeSuite.h"
4 #ifdef __BORLANDC__
5 #pragma hdrstop
6 #endif //__BORLANDC__
7 #ifndef WX_PRECOMP
8 #include <wx/wx.h>
9 #endif //WX_PRECOMP
10 
11 #include "pnlUltimateEVB.h"
12 #include "pnluLimeSDR.h"
13 #include "pnlCoreSDR.h"
14 #include "pnlLimeSDR.h"
15 #include "pnlBuffers.h"
16 #include "RFSpark_wxgui.h"
17  #include "pnlQSpark.h"
18 #include <IConnection.h>
19 #include <ADCUnits.h>
20 #include <assert.h>
21 #include <wx/spinctrl.h>
22 #include <vector>
23 #include "lms7suiteEvents.h"
24 #include "pnlLimeNetMicro.h"
25 
26 using namespace std;
27 using namespace lime;
28 
power2unitsString(int powerx3)29 static wxString power2unitsString(int powerx3)
30 {
31     switch (powerx3)
32     {
33     case -8:
34         return "y";
35     case -7:
36         return "z";
37     case -6:
38         return "a";
39     case -5:
40         return "f";
41     case -4:
42         return "p";
43     case -3:
44         return "n";
45     case -2:
46         return "u";
47     case -1:
48         return "m";
49     case 0:
50         return "";
51     case 1:
52         return "k";
53     case 2:
54         return "M";
55     case 3:
56         return "G";
57     case 4:
58         return "T";
59     case 5:
60         return "P";
61     case 6:
62         return "E";
63     case 7:
64         return "Y";
65     default:
66         return "";
67     }
68 }
69 
70 std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::mParameters;
71 const std::vector<eLMS_DEV> pnlBoardControls::board_list = {LMS_DEV_UNKNOWN,
72                                                 LMS_DEV_EVB7,
73                                                 LMS_DEV_RFESPARK,
74                                                 LMS_DEV_LIMESDR,
75                                                 LMS_DEV_LIMESDR_PCIE,
76                                                 LMS_DEV_LIMESDR_QPCIE,
77                                                 LMS_DEV_LIMESDRMINI,
78                                                 LMS_DEV_LIMENET_MICRO,
79                                                 LMS_DEV_LMS7002M_ULTIMATE_EVB,
80                                                 LMS_DEV_LIMESDR_CORE_SDR};
81 
pnlBoardControls(wxWindow * parent,wxWindowID id,const wxString & title,const wxPoint & pos,const wxSize & size,long style)82 pnlBoardControls::pnlBoardControls(wxWindow* parent, wxWindowID id, const wxString &title, const wxPoint& pos, const wxSize& size, long style) :
83     wxFrame(parent, id, title, pos, size, style),
84     lmsControl(nullptr),
85     additionalControls(nullptr),
86     txtDACTitle(nullptr),
87     txtDACValue(nullptr),
88     btnDAC(nullptr),
89     sizerDAC(nullptr)
90 {
91     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
92     wxFlexGridSizer* fgSizer247;
93     fgSizer247 = new wxFlexGridSizer( 0, 1, 10, 10);
94     fgSizer247->AddGrowableCol( 0 );
95     fgSizer247->AddGrowableRow( 1 );
96     fgSizer247->SetFlexibleDirection( wxBOTH );
97     fgSizer247->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
98 
99     wxFlexGridSizer* fgSizer248;
100     fgSizer248 = new wxFlexGridSizer( 0, 4, 0, 0 );
101     fgSizer248->SetFlexibleDirection( wxBOTH );
102     fgSizer248->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
103 
104     btnReadAll = new wxButton( this, wxID_ANY, wxT("Read all"), wxDefaultPosition, wxDefaultSize, 0 );
105     fgSizer248->Add( btnReadAll, 0, wxALL, 5 );
106 
107     btnWriteAll = new wxButton( this, wxID_ANY, wxT("Write all"), wxDefaultPosition, wxDefaultSize, 0 );
108     fgSizer248->Add( btnWriteAll, 0, wxALL, 5 );
109 
110     m_staticText349 = new wxStaticText( this, wxID_ANY, wxT("Labels:"), wxDefaultPosition, wxDefaultSize, 0 );
111     m_staticText349->Wrap( -1 );
112     fgSizer248->Add( m_staticText349, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
113 
114     wxArrayString cmbBoardSelectionChoices;
115     cmbBoardSelection = new wxChoice( this, wxNewId(), wxDefaultPosition, wxDefaultSize, cmbBoardSelectionChoices, 0 );
116     cmbBoardSelection->SetSelection( 0 );
117     fgSizer248->Add( cmbBoardSelection, 0, wxALL, 5 );
118 
119     for (unsigned i = 0; i < board_list.size(); ++i)
120         cmbBoardSelection->AppendString(wxString::From8BitData(GetDeviceName(board_list[i])));
121 
122     fgSizer247->Add( fgSizer248, 1, wxEXPAND, 5 );
123 
124     pnlCustomControls = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, _("Custom controls"));
125     wxFlexGridSizer* sizerCustomControls = new wxFlexGridSizer(0, 5, 5, 5);
126 
127     sizerCustomControls->Add(new wxStaticText(pnlCustomControls, wxID_ANY, _("ID")));
128     sizerCustomControls->Add(new wxStaticText(pnlCustomControls, wxID_ANY, _("Value")));
129     sizerCustomControls->Add(new wxStaticText(pnlCustomControls, wxID_ANY, _("Power")));
130     sizerCustomControls->Add(new wxStaticText(pnlCustomControls, wxID_ANY, _("Units")));
131     sizerCustomControls->Add(new wxStaticText(pnlCustomControls, wxID_ANY, _("")));
132 
133     //reading
134     spinCustomChannelRd = new wxSpinCtrl(pnlCustomControls, wxNewId(), _("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 255, 0);
135     sizerCustomControls->Add(spinCustomChannelRd, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
136     txtCustomValueRd = new wxStaticText(pnlCustomControls, wxID_ANY, _("0"));
137     sizerCustomControls->Add(txtCustomValueRd, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
138     txtCustomPowerOf10Rd = new wxStaticText(pnlCustomControls, wxID_ANY, _(""));
139     sizerCustomControls->Add(txtCustomPowerOf10Rd, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
140     txtCustomUnitsRd = new wxStaticText(pnlCustomControls, wxID_ANY, _(""));
141     sizerCustomControls->Add(txtCustomUnitsRd, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
142     btnCustomRd = new wxButton(pnlCustomControls, wxNewId(), _("Read"));
143     btnCustomRd->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(pnlBoardControls::OnCustomRead), NULL, this);
144     sizerCustomControls->Add(btnCustomRd, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
145 
146     //writing
147     spinCustomChannelWr = new wxSpinCtrl(pnlCustomControls, wxNewId(), _("0"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS | wxTE_PROCESS_ENTER, 0, 255, 0);
148     sizerCustomControls->Add(spinCustomChannelWr, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
149     spinCustomValueWr = new wxSpinCtrl(pnlCustomControls, wxNewId(), _(""), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS | wxTE_PROCESS_ENTER, 0, 65535, 0);
150     sizerCustomControls->Add(spinCustomValueWr, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
151     spinCustomValueWr->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler(pnlBoardControls::OnSetDACvalues), NULL, this);
152 
153     wxArrayString powerChoices;
154     for (int i = -8; i <= 7; ++i)
155         powerChoices.push_back(power2unitsString(i));
156     cmbCustomPowerOf10Wr = new wxChoice(pnlCustomControls, wxNewId(), wxDefaultPosition, wxDefaultSize, powerChoices, 0);
157     cmbCustomPowerOf10Wr->SetSelection(0);
158     sizerCustomControls->Add(cmbCustomPowerOf10Wr, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
159 
160     wxArrayString unitChoices;
161     for (int i = 0; i < ADC_UNITS_COUNT; ++i) //add all defined units
162         unitChoices.push_back(wxString::From8BitData(adcUnits2string(i)));
163     for (int i = ADC_UNITS_COUNT; i < ADC_UNITS_COUNT + 4; ++i) //add some options to use undefined units
164         unitChoices.push_back(wxString::Format(_("%i"), i));
165     cmbCustomUnitsWr = new wxChoice(pnlCustomControls, wxNewId(), wxDefaultPosition, wxDefaultSize, unitChoices, 0);
166     cmbCustomUnitsWr->SetSelection(0);
167     sizerCustomControls->Add(cmbCustomUnitsWr, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
168 
169     btnCustomWr = new wxButton(pnlCustomControls, wxNewId(), _("Write"));
170     btnCustomWr->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(pnlBoardControls::OnCustomWrite), NULL, this);
171     sizerCustomControls->Add(btnCustomWr, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0);
172 
173     pnlCustomControls->SetSizer(sizerCustomControls);
174     pnlCustomControls->Fit();
175 
176     fgSizer247->Add(pnlCustomControls, 1, wxEXPAND, 5);
177 
178     wxFlexGridSizer* fgSizer249 = new wxFlexGridSizer( 0, 2, 5, 5 );
179     fgSizer249->AddGrowableCol( 0 );
180     fgSizer249->AddGrowableCol( 1 );
181     fgSizer249->SetFlexibleDirection( wxBOTH );
182     fgSizer249->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
183 
184     pnlReadControls = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, _("General"));
185     wxStaticBoxSizer* sbSizer133 = new wxStaticBoxSizer( new wxStaticBox( pnlReadControls, wxID_ANY, wxT("General") ), wxVERTICAL );
186     sizerAnalogRd = new wxFlexGridSizer( 0, 3, 2, 2 );
187     sizerAnalogRd->SetFlexibleDirection( wxBOTH );
188     sizerAnalogRd->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
189     sizerAnalogRd->Add(new wxStaticText(pnlReadControls, wxID_ANY, _("Name")), 1, wxALL, 5);
190     sizerAnalogRd->Add(new wxStaticText(pnlReadControls, wxID_ANY, _("Value")), 1, wxALL, 5);
191     sizerAnalogRd->Add(new wxStaticText(pnlReadControls, wxID_ANY, _("Units")), 1, wxALL, 5);
192     sbSizer133->Add( sizerAnalogRd, 1, wxEXPAND, 5 );
193     pnlReadControls->SetSizer(sbSizer133);
194     pnlReadControls->Fit();
195     pnlReadControls->Hide();
196     fgSizer249->Add( pnlReadControls, 1, wxEXPAND, 5 );
197 
198     fgSizer247->Add( fgSizer249, 1, wxEXPAND, 5 );
199 
200     sizerAdditionalControls = new wxFlexGridSizer(0, 1, 0, 0);
201     fgSizer247->Add(sizerAdditionalControls, 1, wxEXPAND, 5);
202     this->SetSizer( fgSizer247 );
203     this->Layout();
204     fgSizer247->Fit( this );
205 
206 	// Connect Events
207     cmbBoardSelection->Connect(wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler(pnlBoardControls::OnUserChangedBoardType), NULL, this);
208     btnReadAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
209     btnWriteAll->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
210 
211     SetupControls(GetDeviceName(LMS_DEV_UNKNOWN));
212 }
213 
~pnlBoardControls()214 pnlBoardControls::~pnlBoardControls()
215 {
216 	// Disconnect Events
217 	btnReadAll->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnReadAll ), NULL, this );
218 	btnWriteAll->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( pnlBoardControls::OnWriteAll ), NULL, this );
219 	cmbBoardSelection->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( pnlBoardControls::OnUserChangedBoardType), NULL, this );
220 }
221 
OnReadAll(wxCommandEvent & event)222 void pnlBoardControls::OnReadAll( wxCommandEvent& event )
223 {
224     vector<uint8_t> ids;
225     vector<double> values;
226     vector<string> units;
227 
228     for (const auto& param : mParameters)
229     {
230         ids.push_back(param.channel);
231         values.push_back(0);
232         units.push_back("");
233     }
234 
235 
236     for (size_t i = 0; i < mParameters.size(); ++i)
237     {
238         float_type value;
239         lms_name_t units;
240         int status = LMS_ReadCustomBoardParam(lmsControl,mParameters[i].channel,&value,units);
241         if (status != 0)
242         {
243             wxMessageBox(_("Error reading board parameters"), _("Warning"));
244             return;
245         }
246         mParameters[i].channel = ids[i];
247         mParameters[i].units = units;
248         mParameters[i].value = value;
249     }
250     if(additionalControls)
251     {
252         wxCommandEvent evt;
253         evt.SetEventType(READ_ALL_VALUES);
254         evt.SetId(additionalControls->GetId());
255         wxPostEvent(additionalControls, evt);
256     }
257     if (txtDACValue)
258     {
259         uint16_t val;
260         LMS_VCTCXORead(lmsControl, &val);
261         txtDACValue->SetValue(wxString::Format("%d", val));
262     }
263 
264     UpdatePanel();
265 }
266 
OnWriteAll(wxCommandEvent & event)267 void pnlBoardControls::OnWriteAll( wxCommandEvent& event )
268 {
269     vector<uint8_t> ids;
270     vector<double> values;
271 
272     for (size_t i = 0; i < mParameters.size(); ++i)
273     {
274         if (!mParameters[i].writable)
275             continue;
276         ids.push_back(mParameters[i].channel);
277         values.push_back(mParameters[i].value);
278         int status = LMS_WriteCustomBoardParam(lmsControl,mParameters[i].channel,mParameters[i].value,NULL);
279         if (status != 0)
280         {
281             wxMessageBox(_("Failed to write values"), _("Warning"));
282             return;
283         }
284     }
285 
286     if(additionalControls)
287     {
288         wxCommandEvent evt;
289         evt.SetEventType(WRITE_ALL_VALUES);
290         evt.SetId(additionalControls->GetId());
291         wxPostEvent(additionalControls, evt);
292     }
293 }
294 
Initialize(lms_device_t * controlPort)295 void pnlBoardControls::Initialize(lms_device_t* controlPort)
296 {
297     lmsControl = controlPort;
298     const lms_dev_info_t* info;
299     if ((info = LMS_GetDeviceInfo(lmsControl))!=nullptr)
300     {
301         SetupControls(info->deviceName);
302         wxCommandEvent evt;
303         if (strlen(info->deviceName))
304             OnReadAll(evt);
305     }
306 }
307 
UpdatePanel()308 void pnlBoardControls::UpdatePanel()
309 {
310     assert(mParameters.size() == mGUI_widgets.size());
311     for (size_t i = 0; i < mParameters.size(); ++i)
312     {
313         mGUI_widgets[i]->title->SetLabel(wxString(mParameters[i].name));
314         if (mGUI_widgets[i]->wValue)
315             mGUI_widgets[i]->wValue->SetValue(mParameters[i].value);
316         else
317             mGUI_widgets[i]->rValue->SetLabel(wxString::Format(_("%1.0f"), mParameters[i].value));
318         mGUI_widgets[i]->units->SetLabelText(wxString::Format("%s", mParameters[i].units));
319     }
320 
321     if(additionalControls)
322     {
323         wxCommandEvent evt;
324         evt.SetEventType(READ_ALL_VALUES);
325         evt.SetId(additionalControls->GetId());
326         wxPostEvent(additionalControls, evt);
327     }
328 }
329 
getBoardParams(const string & boardID)330 std::vector<pnlBoardControls::ADC_DAC> pnlBoardControls::getBoardParams(const string &boardID)
331 {
332     std::vector<ADC_DAC> paramList;
333     if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
334         || boardID == GetDeviceName(LMS_DEV_LIMESDRMINI)
335         || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE)
336         || boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
337         || boardID == GetDeviceName(LMS_DEV_LIMESDR_USB_SP)
338         || boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB)
339         || boardID == GetDeviceName(LMS_DEV_LIMESDR_CORE_SDR)
340         || boardID == GetDeviceName(LMS_DEV_LIMENET_MICRO))
341     {
342         if (boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE)
343          || boardID == GetDeviceName(LMS_DEV_LIMESDR_CORE_SDR)
344          || boardID == GetDeviceName(LMS_DEV_LIMENET_MICRO))
345             paramList.push_back(ADC_DAC{ "VCTCXO DAC (runtime)", true, 0, 0, adcUnits2string(RAW), 0, 0, 65535 });
346         else
347             paramList.push_back(ADC_DAC{ "VCTCXO DAC (runtime)", true, 0, 0, adcUnits2string(RAW), 0, 0, 255 });
348         if (boardID != GetDeviceName(LMS_DEV_LIMESDRMINI))
349             paramList.push_back(ADC_DAC{"Board Temperature", false, 0, 1, adcUnits2string(TEMPERATURE), 0, 0, 65535});
350     }
351     return paramList;
352 }
353 
OnDACWrite(wxCommandEvent & event)354 void pnlBoardControls::OnDACWrite(wxCommandEvent &event)
355 {
356     long val;
357     txtDACValue->GetValue().ToLong(&val);
358     LMS_VCTCXOWrite(lmsControl, val);
359     OnReadAll(event);
360 }
361 
SetupControls(const std::string & boardID)362 void pnlBoardControls::SetupControls(const std::string &boardID)
363 {
364 
365     if(additionalControls)
366     {
367         additionalControls->Destroy();
368         additionalControls = nullptr;
369     }
370 
371     if(txtDACTitle)
372     {
373         txtDACTitle->Destroy();
374         txtDACTitle = nullptr;
375     }
376 
377     if(txtDACValue)
378     {
379         txtDACValue->Destroy();
380         txtDACValue = nullptr;
381     }
382 
383     if(btnDAC)
384     {
385         btnDAC->Destroy();
386         btnDAC = nullptr;
387     }
388 
389     if (sizerDAC)
390     {
391         sizerAnalogRd->Remove(sizerDAC);
392         sizerDAC = nullptr;
393     }
394 
395     cmbBoardSelection->SetSelection(0);
396     for(unsigned i=0; i<board_list.size(); ++i)
397     {
398         if(boardID == GetDeviceName(board_list[i]))
399         {
400             cmbBoardSelection->SetSelection(i);
401             break;
402         }
403     }
404 
405     if (cmbBoardSelection->GetSelection() == 0)
406         pnlCustomControls->Show();
407     else
408         pnlCustomControls->Hide();
409 
410     for (auto &widget : mGUI_widgets)
411         delete widget;
412     mGUI_widgets.clear(); //delete previously existing controls
413 
414     if (cmbBoardSelection->GetSelection() != 0)
415     {
416         mParameters = getBoardParams(boardID); //update controls list by board type
417         if (mParameters.size()!=0)
418             pnlReadControls->Show();
419         else
420             pnlReadControls->Hide();
421 
422         for (size_t i = 0; i < mParameters.size(); ++i)
423         {
424             Param_GUI *gui = new Param_GUI();
425             gui->title = new wxStaticText(pnlReadControls, wxID_ANY, wxString(mParameters[i].name));
426             if (mParameters[i].writable)
427             {
428                 gui->wValue = new wxSpinCtrl(pnlReadControls, wxNewId(), _(""), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS | wxTE_PROCESS_ENTER, mParameters[i].minValue, mParameters[i].maxValue, mParameters[i].minValue);
429                 gui->wValue->Connect(wxEVT_COMMAND_SPINCTRL_UPDATED, wxSpinEventHandler(pnlBoardControls::OnSetDACvalues), NULL, this);
430                 gui->wValue->Connect(wxEVT_TEXT_ENTER, wxCommandEventHandler(pnlBoardControls::OnSetDACvaluesENTER), NULL, this);
431             }
432             else
433                 gui->rValue = new wxStaticText(pnlReadControls, wxID_ANY, _(""));
434             gui->units = new wxStaticText(pnlReadControls, wxID_ANY, wxString::Format("%s", mParameters[i].units));
435             mGUI_widgets.push_back(gui);
436 
437             sizerAnalogRd->Add(gui->title, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
438             if (mParameters[i].writable)
439                 sizerAnalogRd->Add(gui->wValue, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
440             else
441                 sizerAnalogRd->Add(gui->rValue, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
442             sizerAnalogRd->Add(gui->units, 1, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
443         }
444     }
445     if (cmbBoardSelection->GetSelection() > 2)
446     {
447         txtDACTitle = new wxStaticText(pnlReadControls, wxID_ANY, _("VCTCXO DAC (permament)"));
448         sizerAnalogRd->Add(txtDACTitle, 1,  wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
449         sizerDAC = new wxFlexGridSizer(0, 2, 0, 0);
450         txtDACValue = new wxTextCtrl(pnlReadControls, wxNewId(), _("128"), wxDefaultPosition, wxSize(64, -1));
451         sizerDAC->Add(txtDACValue, 1, wxALIGN_CENTER_VERTICAL, 0);
452         btnDAC = new wxButton(pnlReadControls, wxNewId(), _("Write"), wxDefaultPosition, wxSize(64, -1));
453         sizerDAC->Add(btnDAC, 1,  wxALIGN_CENTER_VERTICAL, 0);
454         Connect(btnDAC->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(pnlBoardControls::OnDACWrite), NULL, this);
455         sizerAnalogRd->Add(sizerDAC, 1,  wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 5);
456     }
457 
458     sizerAnalogRd->Layout();
459 
460     if(boardID == GetDeviceName(LMS_DEV_LIMESDRMINI))
461     {
462         pnluLimeSDR* pnl = new pnluLimeSDR(this, wxNewId());
463         pnl->Initialize(lmsControl);
464         additionalControls = pnl;
465         sizerAdditionalControls->Add(additionalControls);
466     }
467     else if(boardID == GetDeviceName(LMS_DEV_LIMESDR)
468          || boardID == GetDeviceName(LMS_DEV_LIMESDR_PCIE))
469     {
470         pnlLimeSDR* pnl = new pnlLimeSDR(this, wxNewId());
471         pnl->Initialize(lmsControl);
472         additionalControls = pnl;
473         sizerAdditionalControls->Add(additionalControls);
474     }
475     else if(boardID == GetDeviceName(LMS_DEV_LMS7002M_ULTIMATE_EVB))
476     {
477         pnlUltimateEVB* pnl = new pnlUltimateEVB(this, wxNewId());
478         pnl->Initialize(lmsControl);
479         additionalControls = pnl;
480         sizerAdditionalControls->Add(additionalControls);
481     }
482     else if(boardID == GetDeviceName(LMS_DEV_RFSPARK)
483          || boardID == GetDeviceName(LMS_DEV_EVB7)
484          || boardID == GetDeviceName(LMS_DEV_EVB7V2))
485     {
486         pnlBuffers* pnl = new pnlBuffers(this, wxNewId());
487         pnl->Initialize(lmsControl);
488         additionalControls = pnl;
489         sizerAdditionalControls->Add(additionalControls);
490     }
491     else if (boardID == GetDeviceName(LMS_DEV_RFESPARK))
492     {
493         RFSpark_wxgui* pnl = new RFSpark_wxgui(this, wxNewId());
494         pnl->Initialize(lmsControl);
495         additionalControls = pnl;
496         sizerAdditionalControls->Add(additionalControls);
497     }
498     else if (boardID == GetDeviceName(LMS_DEV_LIMESDR_QPCIE))
499     {
500         pnlQSpark* pnl = new pnlQSpark(this, wxNewId());
501         pnl->Initialize(lmsControl);
502         additionalControls = pnl;
503         sizerAdditionalControls->Add(additionalControls);
504     }
505     else if (boardID == GetDeviceName(LMS_DEV_LIMESDR_CORE_SDR))
506     {
507         pnlCoreSDR* pnl = new pnlCoreSDR(this, wxNewId());
508         pnl->Initialize(lmsControl);
509         additionalControls = pnl;
510         sizerAdditionalControls->Add(additionalControls);
511     }
512     else if (boardID == GetDeviceName(LMS_DEV_LIMENET_MICRO))
513     {
514         pnlLimeNetMicro* pnl = new pnlLimeNetMicro(this, wxNewId());
515         pnl->Initialize(lmsControl);
516         additionalControls = pnl;
517         sizerAdditionalControls->Add(additionalControls);
518     }
519     Layout();
520     Fit();
521 }
522 
OnSetDACvaluesENTER(wxCommandEvent & event)523 void pnlBoardControls::OnSetDACvaluesENTER(wxCommandEvent &event)
524 {
525     wxSpinEvent evt;
526     evt.SetEventObject(event.GetEventObject());
527     OnSetDACvalues(evt);
528 }
529 
OnSetDACvalues(wxSpinEvent & event)530 void pnlBoardControls::OnSetDACvalues(wxSpinEvent &event)
531 {
532     for (size_t i = 0; i < mGUI_widgets.size(); ++i)
533     {
534         if (event.GetEventObject() == mGUI_widgets[i]->wValue)
535         {
536             mParameters[i].value = mGUI_widgets[i]->wValue->GetValue();
537             //write to chip
538             lms_name_t units;
539             strncpy(units,mParameters[i].units.c_str(),sizeof(lms_name_t)-1);
540 
541             if (lmsControl == nullptr)
542                 return;
543 
544             int status = LMS_WriteCustomBoardParam(lmsControl,mParameters[i].channel,mParameters[i].value,units);
545             if (status != 0)
546                 wxMessageBox(_("Failed to set value"), _("Warning"));
547             return;
548         }
549     }
550 }
551 
OnUserChangedBoardType(wxCommandEvent & event)552 void pnlBoardControls::OnUserChangedBoardType(wxCommandEvent& event)
553 {
554     SetupControls(GetDeviceName(board_list[cmbBoardSelection->GetSelection()]));
555 }
556 
OnCustomRead(wxCommandEvent & event)557 void pnlBoardControls::OnCustomRead(wxCommandEvent& event)
558 {
559     uint8_t id = spinCustomChannelRd->GetValue();
560     double value = 0;
561     lms_name_t units;
562 
563     int status = LMS_ReadCustomBoardParam(lmsControl,id,&value,units);
564     if (status != 0)
565     {
566         wxMessageBox(_("Failed to read value"), _("Warning"));
567         return;
568     }
569 
570     txtCustomUnitsRd->SetLabel(units);
571     txtCustomValueRd->SetLabel(wxString::Format(_("%1.1f"), value));
572 
573 }
574 
OnCustomWrite(wxCommandEvent & event)575 void pnlBoardControls::OnCustomWrite(wxCommandEvent& event)
576 {
577     uint8_t id = spinCustomChannelWr->GetValue();
578     int powerOf10 = (cmbCustomPowerOf10Wr->GetSelection()-8)*3;
579     lms_name_t units;
580     strncpy(units,adcUnits2string(cmbCustomUnitsWr->GetSelection()),sizeof(units)-1);
581 
582     double value = spinCustomValueWr->GetValue()*pow(10, powerOf10);
583 
584 
585     int status = LMS_WriteCustomBoardParam(lmsControl,id,value,units);
586     if (status != 0)
587     {
588         wxMessageBox(_("Failed to write value"), _("Warning"));
589         return;
590     }
591 }
592