1 #include "pnlLimeSDR.h"
2 #include "lms7suiteEvents.h"
3 #include "Logger.h"
4 #include "pnlGPIO.h"
5
6 #include <wx/sizer.h>
7
8 using namespace lime;
9 using namespace std;
10
BEGIN_EVENT_TABLE(pnlLimeSDR,wxPanel)11 BEGIN_EVENT_TABLE(pnlLimeSDR, wxPanel)
12 END_EVENT_TABLE()
13
14 pnlLimeSDR::pnlLimeSDR(wxWindow* parent,wxWindowID id, const wxPoint& pos,const wxSize& size, int style, wxString name)
15 {
16 lmsControl = nullptr;
17 Create(parent, id, pos, size, style, name);
18 #ifdef WIN32
19 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
20 #endif
21 mainSizer = new wxFlexGridSizer(0, 2, 5, 5);
22 controlsSizer = new wxFlexGridSizer(0, 2, 5, 5);
23
24 SetSizer(mainSizer);
25 chkRFLB_A_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.A"));
26 chkRFLB_A_EN->SetToolTip(_("[RFLB_A_EN] External RF loopback TxBAND2->RxLNAH channel A"));
27 Connect(chkRFLB_A_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
28 controlsSizer->Add(chkRFLB_A_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
29 chkRFLB_B_EN = new wxCheckBox(this, wxNewId(), _("RF loopback ch.B"));
30 chkRFLB_B_EN->SetToolTip(_("[RFLB_B_EN] External RF loopback TxBAND2->RxLNAH channel B"));
31 Connect(chkRFLB_B_EN->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
32 controlsSizer->Add(chkRFLB_B_EN, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
33
34 chkTX1_2_LB_SH = new wxCheckBox(this, wxNewId(), _("Ch.A shunt"));
35 chkTX1_2_LB_SH->SetToolTip(_("[TX1_2_LB_SH]"));
36 Connect(chkTX1_2_LB_SH->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
37 controlsSizer->Add(chkTX1_2_LB_SH, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
38 chkTX2_2_LB_SH = new wxCheckBox(this, wxNewId(), _("Ch.B shunt"));
39 chkTX2_2_LB_SH->SetToolTip(_("[TX2_2_LB_SH]"));
40 Connect(chkTX2_2_LB_SH->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
41 controlsSizer->Add(chkTX2_2_LB_SH, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
42 chkTX1_2_LB_AT = new wxCheckBox(this, wxNewId(), _("Ch.A attenuator"));
43 chkTX1_2_LB_AT->SetToolTip(_("[TX1_2_LB_AT]"));
44 Connect(chkTX1_2_LB_AT->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
45 controlsSizer->Add(chkTX1_2_LB_AT, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
46 chkTX2_2_LB_AT = new wxCheckBox(this, wxNewId(), _("Ch.B attenuator"));
47 chkTX2_2_LB_AT->SetToolTip(_("[TX2_2_LB_AT]"));
48 Connect(chkTX2_2_LB_AT->GetId(), wxEVT_CHECKBOX, wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), NULL, this);
49 controlsSizer->Add(chkTX2_2_LB_AT, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
50
51 auto groupSizer = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxT("External loopback controls") ), wxVERTICAL );
52 groupSizer->Add(controlsSizer, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
53 mainSizer->Add(groupSizer, 1, wxEXPAND | wxALIGN_LEFT | wxALIGN_TOP, 5);
54 pnl_gpio = new pnlGPIO(this, wxNewId());
55 mainSizer->Add(pnl_gpio, 1, wxEXPAND | wxALL, 5);
56 Bind(READ_ALL_VALUES, &pnlLimeSDR::OnReadAll, this, this->GetId());
57 Bind(WRITE_ALL_VALUES, &pnlLimeSDR::OnWriteAll, this, this->GetId());
58 }
59
Initialize(lms_device_t * pControl)60 void pnlLimeSDR::Initialize(lms_device_t* pControl)
61 {
62 lmsControl = pControl;
63 if(lmsControl)
64 {
65 auto controls = controlsSizer->GetChildren();
66 for(auto i : controls)
67 i->GetWindow()->Enable();
68 }
69
70 pnl_gpio->Initialize(lmsControl);
71 mainSizer->Fit(this);
72 mainSizer->SetSizeHints(this);
73 Layout();
74 }
75
OnGPIOChange(wxCommandEvent & event)76 void pnlLimeSDR::OnGPIOChange(wxCommandEvent& event)
77 {
78 uint16_t addr = 0x0017;
79 uint16_t value = 0;
80 value |= chkRFLB_A_EN->GetValue() << 0;
81 value |= chkTX1_2_LB_AT->GetValue() << 1;
82 value |= chkTX1_2_LB_SH->GetValue() << 2;
83
84 value |= chkRFLB_B_EN->GetValue() << 4;
85 value |= chkTX2_2_LB_AT->GetValue() << 5;
86 value |= chkTX2_2_LB_SH->GetValue() << 6;
87
88 if(lmsControl && LMS_WriteFPGAReg(lmsControl, addr, value))
89 lime::error("Board loopback cahnge failed");
90 }
91
~pnlLimeSDR()92 pnlLimeSDR::~pnlLimeSDR()
93 {
94 chkRFLB_A_EN->Disconnect(wxEVT_CHECKBOX, chkRFLB_A_EN->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);
95 chkRFLB_B_EN->Disconnect(wxEVT_CHECKBOX, chkRFLB_B_EN->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);
96 chkTX1_2_LB_SH->Disconnect(wxEVT_CHECKBOX, chkTX1_2_LB_SH->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);;
97 chkTX1_2_LB_AT->Disconnect(wxEVT_CHECKBOX, chkTX1_2_LB_AT->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);;
98 chkTX2_2_LB_SH->Disconnect(wxEVT_CHECKBOX, chkTX2_2_LB_SH->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);;
99 chkTX2_2_LB_AT->Disconnect(wxEVT_CHECKBOX, chkTX2_2_LB_AT->GetId(), wxCommandEventHandler(pnlLimeSDR::OnGPIOChange), 0, this);;
100 }
101
UpdatePanel()102 void pnlLimeSDR::UpdatePanel()
103 {
104 uint16_t addr = 0x0017;
105 uint16_t value = 0;
106 if(lmsControl && LMS_ReadFPGAReg(lmsControl, addr, &value)==0)
107 {
108 chkRFLB_A_EN->SetValue((value >> 0) & 0x1);
109 chkTX1_2_LB_AT->SetValue((value >> 1) & 0x1);
110 chkTX1_2_LB_SH->SetValue((value >> 2) & 0x1);
111
112 chkRFLB_B_EN->SetValue((value >> 4) & 0x1);
113 chkTX2_2_LB_AT->SetValue((value >> 5) & 0x1);
114 chkTX2_2_LB_SH->SetValue((value >> 6) & 0x1);
115 }
116 else
117 lime::error("Board loopback read failed");
118 pnl_gpio->UpdatePanel();
119 }
120
OnReadAll(wxCommandEvent & event)121 void pnlLimeSDR::OnReadAll(wxCommandEvent &event)
122 {
123 UpdatePanel();
124 }
125
OnWriteAll(wxCommandEvent & event)126 void pnlLimeSDR::OnWriteAll(wxCommandEvent &event)
127 {
128 OnGPIOChange(event);
129 pnl_gpio->OnUsrGPIODirChange(event);
130 pnl_gpio->OnUsrGPIOChange(event);
131 }
132
133