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