xref: /OK3568_Linux_fs/app/qsetting/qtbt.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun 
2*4882a593Smuzhiyun #include <QApplication>
3*4882a593Smuzhiyun #include <QDesktopWidget>
4*4882a593Smuzhiyun #include <QFile>
5*4882a593Smuzhiyun #include <QProcess>
6*4882a593Smuzhiyun #include "qtbt.h"
7*4882a593Smuzhiyun #include <unistd.h>
8*4882a593Smuzhiyun #include <sys/prctl.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun qtBT* qtBT::_instance = nullptr;
state_cb(RK_BT_STATE state)11*4882a593Smuzhiyun void qtBT::state_cb(RK_BT_STATE state)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun     switch(state) {
14*4882a593Smuzhiyun             case RK_BT_STATE_TURNING_ON:
15*4882a593Smuzhiyun                     qDebug() << "RK_BT_STATE_TURNING_ON";
16*4882a593Smuzhiyun                     break;
17*4882a593Smuzhiyun             case RK_BT_STATE_ON:
18*4882a593Smuzhiyun                     qDebug() << "RK_BT_STATE_ON";
19*4882a593Smuzhiyun                     qDebug() << "RK_START_SCAN 10s";
20*4882a593Smuzhiyun                     #ifdef RKWIFIBTAPP
21*4882a593Smuzhiyun                     rk_bt_start_discovery(10000, SCAN_TYPE_BREDR);
22*4882a593Smuzhiyun                     rk_bt_source_open();
23*4882a593Smuzhiyun                     #endif
24*4882a593Smuzhiyun                     break;
25*4882a593Smuzhiyun             case RK_BT_STATE_TURNING_OFF:
26*4882a593Smuzhiyun                     qDebug() << "RK_BT_STATE_TURNING_OFF";
27*4882a593Smuzhiyun                     break;
28*4882a593Smuzhiyun             case RK_BT_STATE_OFF:
29*4882a593Smuzhiyun                     qDebug() << "RK_BT_STATE_OFF";
30*4882a593Smuzhiyun                     break;
31*4882a593Smuzhiyun     }
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun 
bond_cb(const char * bd_addr,const char * name,RK_BT_BOND_STATE state)34*4882a593Smuzhiyun void qtBT::bond_cb(const char *bd_addr, const char *name, RK_BT_BOND_STATE state)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun     switch(state) {
37*4882a593Smuzhiyun             case RK_BT_BOND_STATE_NONE:
38*4882a593Smuzhiyun             case RK_BT_BOND_STATE_BONDING:
39*4882a593Smuzhiyun                 break;
40*4882a593Smuzhiyun             case RK_BT_BOND_STATE_BONDED:
41*4882a593Smuzhiyun                 break;
42*4882a593Smuzhiyun     }
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun 
scan_status_cb(RK_BT_DISCOVERY_STATE status)45*4882a593Smuzhiyun void qtBT::scan_status_cb(RK_BT_DISCOVERY_STATE status)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun     switch(status) {
48*4882a593Smuzhiyun             case RK_BT_DISC_STARTED:
49*4882a593Smuzhiyun             case RK_BT_DISC_START_FAILED:
50*4882a593Smuzhiyun             case RK_BT_DISC_STOPPED_BY_USER:
51*4882a593Smuzhiyun                     break;
52*4882a593Smuzhiyun             case RK_BT_DISC_STOPPED_AUTO:
53*4882a593Smuzhiyun                     #ifdef RKWIFIBTAPP
54*4882a593Smuzhiyun                     rk_bt_start_discovery(10000, SCAN_TYPE_BREDR);
55*4882a593Smuzhiyun                     #endif
56*4882a593Smuzhiyun                     break;
57*4882a593Smuzhiyun     }
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun 
source_connect_cb(void * userdata,const char * bd_addr,const char * name,const RK_BT_SOURCE_EVENT enEvent)60*4882a593Smuzhiyun void qtBT::source_connect_cb(void *userdata, const char *bd_addr, const char *name, const RK_BT_SOURCE_EVENT enEvent)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun     qtBT *btlist = getInstance();
63*4882a593Smuzhiyun     switch(enEvent)
64*4882a593Smuzhiyun     {
65*4882a593Smuzhiyun             case BT_SOURCE_EVENT_CONNECT_FAILED:
66*4882a593Smuzhiyun                     qDebug() << "BT_SOURCE_EVENT_CONNECT_FAILED" << name << bd_addr;
67*4882a593Smuzhiyun                     break;
68*4882a593Smuzhiyun             case BT_SOURCE_EVENT_CONNECTED:
69*4882a593Smuzhiyun                     qDebug() << "BT_SOURCE_EVENT_CONNECTED" << name << bd_addr;
70*4882a593Smuzhiyun                     for(int i=0; i<btlist->count(); i++){
71*4882a593Smuzhiyun                         QListWidgetItem *ii = btlist->item(i);
72*4882a593Smuzhiyun                         QString str = ii->text();
73*4882a593Smuzhiyun                         QStringList sl  = str.split(" ");
74*4882a593Smuzhiyun                         QString addr = sl.at(1);
75*4882a593Smuzhiyun                         QString name = sl.at(2);
76*4882a593Smuzhiyun                         if(!addr.isEmpty() && !addr.compare(QString(bd_addr))){
77*4882a593Smuzhiyun                             QString str = "Connected " + QString(bd_addr) + " " + QString(name);
78*4882a593Smuzhiyun                             QListWidgetItem *iitem = btlist->takeItem(i);
79*4882a593Smuzhiyun                             iitem->setText(str);
80*4882a593Smuzhiyun                             btlist->insertItem(0, iitem);
81*4882a593Smuzhiyun                             return;
82*4882a593Smuzhiyun                         }
83*4882a593Smuzhiyun                     }
84*4882a593Smuzhiyun                     break;
85*4882a593Smuzhiyun             case BT_SOURCE_EVENT_DISCONNECTED:
86*4882a593Smuzhiyun                     qDebug() << "BT_SOURCE_EVENT_DISCONNECTED" << name << bd_addr;
87*4882a593Smuzhiyun                     for(int i=0; i<btlist->count(); i++){
88*4882a593Smuzhiyun                         QListWidgetItem *ii = btlist->item(i);
89*4882a593Smuzhiyun                         QString str = ii->text();
90*4882a593Smuzhiyun                         QStringList sl  = str.split(" ");
91*4882a593Smuzhiyun                         QString addr = sl.at(1);
92*4882a593Smuzhiyun                         QString name = sl.at(2);
93*4882a593Smuzhiyun                         if(!addr.isEmpty() && !addr.compare(QString(bd_addr))){
94*4882a593Smuzhiyun                             QString str = "Paired " + QString(bd_addr) + " " + QString(name);
95*4882a593Smuzhiyun                             QListWidgetItem *iitem = btlist->takeItem(i);
96*4882a593Smuzhiyun                             iitem->setText(str);
97*4882a593Smuzhiyun                             btlist->insertItem(0, iitem);
98*4882a593Smuzhiyun                             return;
99*4882a593Smuzhiyun                         }
100*4882a593Smuzhiyun                     }
101*4882a593Smuzhiyun                     break;
102*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_PLAY:
103*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_STOP:
104*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_PAUSE:
105*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_FORWARD:
106*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_BACKWARD:
107*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_VOL_UP:
108*4882a593Smuzhiyun             case BT_SOURCE_EVENT_RC_VOL_DOWN:
109*4882a593Smuzhiyun                     qDebug() << "BT_SOURCE_EVENT_RC: " << BT_SOURCE_EVENT_RC_VOL_DOWN << name << bd_addr;
110*4882a593Smuzhiyun                     break;
111*4882a593Smuzhiyun     }
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 
scan_cb(const char * address,const char * name,unsigned int bt_class,int rssi,int change)115*4882a593Smuzhiyun void qtBT::scan_cb(const char *address,const char *name, unsigned int bt_class, int rssi, int change)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     struct bt_dev_info *dev = new bt_dev_info;
118*4882a593Smuzhiyun     qtBT *btlist = getInstance();
119*4882a593Smuzhiyun     dev->address = address;
120*4882a593Smuzhiyun     dev->name = name;
121*4882a593Smuzhiyun     dev->bt_class = bt_class;
122*4882a593Smuzhiyun     dev->rssi = rssi;
123*4882a593Smuzhiyun     btlist->dev_list.append(dev);
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun //    qDebug() << "address: " << address << "name: " << name << "get name: " << dev->name;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun     for(int i=0; i<btlist->count(); i++){
128*4882a593Smuzhiyun         QListWidgetItem *ii = btlist->item(i);
129*4882a593Smuzhiyun         QString str = ii->text();
130*4882a593Smuzhiyun         QStringList sl  = str.split(" ");
131*4882a593Smuzhiyun         QString addr = sl.at(1);
132*4882a593Smuzhiyun         QString name = sl.at(2);
133*4882a593Smuzhiyun         if(!addr.isEmpty() && !addr.compare(QString(dev->address))){
134*4882a593Smuzhiyun             return;
135*4882a593Smuzhiyun         }
136*4882a593Smuzhiyun     }
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun     if(dev->address){
139*4882a593Smuzhiyun         QString str = "Unpaired " + QString(dev->address) + " " + QString(dev->name);
140*4882a593Smuzhiyun         btlist->addItem(new QListWidgetItem(str, btlist));
141*4882a593Smuzhiyun     }
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun 
open()144*4882a593Smuzhiyun void qtBT::open()
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun     qDebug() << "bt open";
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #ifdef RKWIFIBTAPP
149*4882a593Smuzhiyun     int count;
150*4882a593Smuzhiyun     RkBtScanedDevice *dev = NULL;
151*4882a593Smuzhiyun     static RkBtScanedDevice *g_dev_list_test;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun     memset(&bt_content, 0, sizeof(RkBtContent));
154*4882a593Smuzhiyun     bt_content.bt_name = "Rockchip Linux BT";
155*4882a593Smuzhiyun     bt_content.bt_addr = "11:22:33:44:55:66";
156*4882a593Smuzhiyun     rk_bt_register_state_callback(qtBT::state_cb);
157*4882a593Smuzhiyun     rk_bt_register_bond_callback(qtBT::bond_cb);
158*4882a593Smuzhiyun     rk_bt_register_discovery_callback(qtBT::scan_status_cb);
159*4882a593Smuzhiyun     rk_bt_register_dev_found_callback(qtBT::scan_cb);
160*4882a593Smuzhiyun     rk_bt_source_register_status_cb(NULL, source_connect_cb);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun     if (rk_bt_init(&bt_content) < 0) {
163*4882a593Smuzhiyun         qDebug() << "rk_bt_init error";
164*4882a593Smuzhiyun         return;
165*4882a593Smuzhiyun     }
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     rk_bt_set_device_name("Rockchip Linux BT");
168*4882a593Smuzhiyun     rk_bt_enable_reconnect(0);
169*4882a593Smuzhiyun     //rk_bt_source_open();
170*4882a593Smuzhiyun     rk_bt_get_paired_devices(&g_dev_list_test, &count);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     qDebug() << "current paired devices count: " << count;
173*4882a593Smuzhiyun     dev = g_dev_list_test;
174*4882a593Smuzhiyun     for(int i = 0; i < count; i++) {
175*4882a593Smuzhiyun         qDebug() << i << ": " << dev->remote_address << " " << dev->remote_name << " is_connected: " << dev->is_connected;
176*4882a593Smuzhiyun         QString str;
177*4882a593Smuzhiyun         if(dev->is_connected)
178*4882a593Smuzhiyun             str += "Connected ";
179*4882a593Smuzhiyun         else
180*4882a593Smuzhiyun             str += "Paired ";
181*4882a593Smuzhiyun         str += QString(dev->remote_address) + " " + QString(dev->remote_name);
182*4882a593Smuzhiyun         addItem(new QListWidgetItem(str, this));
183*4882a593Smuzhiyun         dev = dev->next;
184*4882a593Smuzhiyun     }
185*4882a593Smuzhiyun     rk_bt_free_paired_devices(g_dev_list_test);
186*4882a593Smuzhiyun     g_dev_list_test = NULL;
187*4882a593Smuzhiyun     rk_bt_start_discovery(10000, SCAN_TYPE_BREDR);
188*4882a593Smuzhiyun #endif
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun 
close()191*4882a593Smuzhiyun void qtBT::close()
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun     qDebug() << "bt close";
194*4882a593Smuzhiyun #ifdef RKWIFIBTAPP
195*4882a593Smuzhiyun     //rk_bt_cancel_discovery();
196*4882a593Smuzhiyun     rk_bt_deinit();
197*4882a593Smuzhiyun #endif
198*4882a593Smuzhiyun }
199*4882a593Smuzhiyun 
qtBT(QWidget * parent,QLabel * label,QPushButton * btn,bool on)200*4882a593Smuzhiyun qtBT::qtBT(QWidget *parent, QLabel *label, QPushButton *btn, bool on)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun     const QRect availableGeometry = QApplication::desktop()->availableGeometry(parent);
203*4882a593Smuzhiyun     resize(availableGeometry.width(), availableGeometry.height());
204*4882a593Smuzhiyun     QFont font;
205*4882a593Smuzhiyun     font.setPixelSize(availableGeometry.height()/40);
206*4882a593Smuzhiyun     if(btn){
207*4882a593Smuzhiyun         switchBtn = btn;
208*4882a593Smuzhiyun         switchBtn->setCheckable(true);
209*4882a593Smuzhiyun         switchBtn->setVisible(true);
210*4882a593Smuzhiyun         switchBtn->setStyleSheet("QPushButton{background-color:green;}");
211*4882a593Smuzhiyun         switchBtn->setStyleSheet("QPushButton:checked{background-color:red;}");
212*4882a593Smuzhiyun         if (on){
213*4882a593Smuzhiyun             switchBtn->setChecked(true);
214*4882a593Smuzhiyun             switchBtn->setText("on");
215*4882a593Smuzhiyun         } else {
216*4882a593Smuzhiyun             switchBtn->setChecked(false);
217*4882a593Smuzhiyun             switchBtn->setText("off");
218*4882a593Smuzhiyun         }
219*4882a593Smuzhiyun         connect(switchBtn, SIGNAL(clicked(bool)), this, SLOT(on_btnClicked()));
220*4882a593Smuzhiyun     }
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun     setObjectName("BT");
223*4882a593Smuzhiyun     setFont(font);
224*4882a593Smuzhiyun     connect(this, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(on_itemClicked(QListWidgetItem *)));
225*4882a593Smuzhiyun     show();
226*4882a593Smuzhiyun     qDebug() << "bt init: " << on;
227*4882a593Smuzhiyun     if(on)
228*4882a593Smuzhiyun         turnOn();
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
~qtBT()231*4882a593Smuzhiyun qtBT::~qtBT()
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun     #ifdef RKWIFIBTAPP
234*4882a593Smuzhiyun     rk_bt_cancel_discovery();
235*4882a593Smuzhiyun     #endif
236*4882a593Smuzhiyun     if(switchBtn){
237*4882a593Smuzhiyun         switchBtn->setVisible(false);
238*4882a593Smuzhiyun     }
239*4882a593Smuzhiyun     _instance = nullptr;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun 
isOn()242*4882a593Smuzhiyun bool qtBT::isOn()
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun     if(switchBtn){
245*4882a593Smuzhiyun         if (! switchBtn->text().compare("on")){
246*4882a593Smuzhiyun             return true;
247*4882a593Smuzhiyun         } else {
248*4882a593Smuzhiyun             return false;
249*4882a593Smuzhiyun         }
250*4882a593Smuzhiyun     }
251*4882a593Smuzhiyun     return false;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
turnOn()254*4882a593Smuzhiyun void qtBT::turnOn()
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     if(QFile::exists("/userdata")){
257*4882a593Smuzhiyun         open();
258*4882a593Smuzhiyun     } else {
259*4882a593Smuzhiyun         QStringList list;
260*4882a593Smuzhiyun         list << "bt1" << "bt2" << "bt3" << "bt4" << "bt5" << "bt6" << "bt7";
261*4882a593Smuzhiyun         addItems(list);
262*4882a593Smuzhiyun     }
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
turnOff()265*4882a593Smuzhiyun void qtBT::turnOff()
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun     if(QFile::exists("/userdata")){
268*4882a593Smuzhiyun         close();
269*4882a593Smuzhiyun     }
270*4882a593Smuzhiyun     clear();
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun 
on_btnClicked()273*4882a593Smuzhiyun void qtBT::on_btnClicked()
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun     if(switchBtn){
276*4882a593Smuzhiyun         if (! switchBtn->text().compare("on")){
277*4882a593Smuzhiyun             qDebug() << "on_btnClicked turnOff";
278*4882a593Smuzhiyun             switchBtn->setText("off");
279*4882a593Smuzhiyun             turnOff();
280*4882a593Smuzhiyun         } else if (! switchBtn->text().compare("off")){
281*4882a593Smuzhiyun             qDebug() << "on_btnClicked turnOn";
282*4882a593Smuzhiyun             switchBtn->setText("on");
283*4882a593Smuzhiyun             turnOn();
284*4882a593Smuzhiyun         }
285*4882a593Smuzhiyun     }
286*4882a593Smuzhiyun }
287*4882a593Smuzhiyun 
on_itemClicked(QListWidgetItem * item)288*4882a593Smuzhiyun void qtBT::on_itemClicked(QListWidgetItem *item)
289*4882a593Smuzhiyun {
290*4882a593Smuzhiyun     QString str = item->text();
291*4882a593Smuzhiyun     QStringList sl  = str.split(" ");
292*4882a593Smuzhiyun     QString pair = sl.at(0);
293*4882a593Smuzhiyun     QString addr = sl.at(1);
294*4882a593Smuzhiyun     QString name = sl.at(2);
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun     if(!addr.isEmpty()){
297*4882a593Smuzhiyun         if(!pair.compare("Paired")){
298*4882a593Smuzhiyun             qDebug() << "connecting to " << addr.toLatin1().data();
299*4882a593Smuzhiyun             #ifdef RKWIFIBTAPP
300*4882a593Smuzhiyun             rk_bt_source_connect_by_addr(addr.toLatin1().data());
301*4882a593Smuzhiyun             #endif
302*4882a593Smuzhiyun         }else if(!pair.compare("Connected")){
303*4882a593Smuzhiyun             qDebug() << "disconnecting " << addr << name;
304*4882a593Smuzhiyun             #ifdef RKWIFIBTAPP
305*4882a593Smuzhiyun             rk_bt_source_disconnect_by_addr(addr.toLatin1().data());
306*4882a593Smuzhiyun             #endif
307*4882a593Smuzhiyun             takeItem(row(item));
308*4882a593Smuzhiyun         }else{
309*4882a593Smuzhiyun             qDebug() << "connecting to " << addr.toLatin1().data();
310*4882a593Smuzhiyun             #ifdef RKWIFIBTAPP
311*4882a593Smuzhiyun             rk_bt_source_connect_by_addr(addr.toLatin1().data());
312*4882a593Smuzhiyun             #endif
313*4882a593Smuzhiyun         }
314*4882a593Smuzhiyun     }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
317