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