#include #include #include #include #include "qtbt.h" #include #include qtBT* qtBT::_instance = nullptr; void qtBT::state_cb(RK_BT_STATE state) { switch(state) { case RK_BT_STATE_TURNING_ON: qDebug() << "RK_BT_STATE_TURNING_ON"; break; case RK_BT_STATE_ON: qDebug() << "RK_BT_STATE_ON"; qDebug() << "RK_START_SCAN 10s"; #ifdef RKWIFIBTAPP rk_bt_start_discovery(10000, SCAN_TYPE_BREDR); rk_bt_source_open(); #endif break; case RK_BT_STATE_TURNING_OFF: qDebug() << "RK_BT_STATE_TURNING_OFF"; break; case RK_BT_STATE_OFF: qDebug() << "RK_BT_STATE_OFF"; break; } } void qtBT::bond_cb(const char *bd_addr, const char *name, RK_BT_BOND_STATE state) { switch(state) { case RK_BT_BOND_STATE_NONE: case RK_BT_BOND_STATE_BONDING: break; case RK_BT_BOND_STATE_BONDED: break; } } void qtBT::scan_status_cb(RK_BT_DISCOVERY_STATE status) { switch(status) { case RK_BT_DISC_STARTED: case RK_BT_DISC_START_FAILED: case RK_BT_DISC_STOPPED_BY_USER: break; case RK_BT_DISC_STOPPED_AUTO: #ifdef RKWIFIBTAPP rk_bt_start_discovery(10000, SCAN_TYPE_BREDR); #endif break; } } void qtBT::source_connect_cb(void *userdata, const char *bd_addr, const char *name, const RK_BT_SOURCE_EVENT enEvent) { qtBT *btlist = getInstance(); switch(enEvent) { case BT_SOURCE_EVENT_CONNECT_FAILED: qDebug() << "BT_SOURCE_EVENT_CONNECT_FAILED" << name << bd_addr; break; case BT_SOURCE_EVENT_CONNECTED: qDebug() << "BT_SOURCE_EVENT_CONNECTED" << name << bd_addr; for(int i=0; icount(); i++){ QListWidgetItem *ii = btlist->item(i); QString str = ii->text(); QStringList sl = str.split(" "); QString addr = sl.at(1); QString name = sl.at(2); if(!addr.isEmpty() && !addr.compare(QString(bd_addr))){ QString str = "Connected " + QString(bd_addr) + " " + QString(name); QListWidgetItem *iitem = btlist->takeItem(i); iitem->setText(str); btlist->insertItem(0, iitem); return; } } break; case BT_SOURCE_EVENT_DISCONNECTED: qDebug() << "BT_SOURCE_EVENT_DISCONNECTED" << name << bd_addr; for(int i=0; icount(); i++){ QListWidgetItem *ii = btlist->item(i); QString str = ii->text(); QStringList sl = str.split(" "); QString addr = sl.at(1); QString name = sl.at(2); if(!addr.isEmpty() && !addr.compare(QString(bd_addr))){ QString str = "Paired " + QString(bd_addr) + " " + QString(name); QListWidgetItem *iitem = btlist->takeItem(i); iitem->setText(str); btlist->insertItem(0, iitem); return; } } break; case BT_SOURCE_EVENT_RC_PLAY: case BT_SOURCE_EVENT_RC_STOP: case BT_SOURCE_EVENT_RC_PAUSE: case BT_SOURCE_EVENT_RC_FORWARD: case BT_SOURCE_EVENT_RC_BACKWARD: case BT_SOURCE_EVENT_RC_VOL_UP: case BT_SOURCE_EVENT_RC_VOL_DOWN: qDebug() << "BT_SOURCE_EVENT_RC: " << BT_SOURCE_EVENT_RC_VOL_DOWN << name << bd_addr; break; } } void qtBT::scan_cb(const char *address,const char *name, unsigned int bt_class, int rssi) { struct bt_dev_info *dev = new bt_dev_info; qtBT *btlist = getInstance(); dev->address = address; dev->name = name; dev->bt_class = bt_class; dev->rssi = rssi; btlist->dev_list.append(dev); // qDebug() << "address: " << address << "name: " << name << "get name: " << dev->name; for(int i=0; icount(); i++){ QListWidgetItem *ii = btlist->item(i); QString str = ii->text(); QStringList sl = str.split(" "); QString addr = sl.at(1); QString name = sl.at(2); if(!addr.isEmpty() && !addr.compare(QString(dev->address))){ return; } } if(dev->address){ QString str = "Unpaired " + QString(dev->address) + " " + QString(dev->name); btlist->addItem(new QListWidgetItem(str, btlist)); } } void qtBT::open() { qDebug() << "bt open"; #ifdef RKWIFIBTAPP int count; RkBtScanedDevice *dev = NULL; static RkBtScanedDevice *g_dev_list_test; memset(&bt_content, 0, sizeof(RkBtContent)); bt_content.bt_name = "Rockchip Linux BT"; bt_content.bt_addr = "11:22:33:44:55:66"; rk_bt_register_state_callback(qtBT::state_cb); rk_bt_register_bond_callback(qtBT::bond_cb); rk_bt_register_discovery_callback(qtBT::scan_status_cb); rk_bt_register_dev_found_callback(qtBT::scan_cb); rk_bt_source_register_status_cb(NULL, source_connect_cb); if (rk_bt_init(&bt_content) < 0) { qDebug() << "rk_bt_init error"; return; } rk_bt_set_device_name("Rockchip Linux BT"); rk_bt_enable_reconnect(0); //rk_bt_source_open(); rk_bt_get_paired_devices(&g_dev_list_test, &count); qDebug() << "current paired devices count: " << count; dev = g_dev_list_test; for(int i = 0; i < count; i++) { qDebug() << i << ": " << dev->remote_address << " " << dev->remote_name << " is_connected: " << dev->is_connected; QString str; if(dev->is_connected) str += "Connected "; else str += "Paired "; str += QString(dev->remote_address) + " " + QString(dev->remote_name); addItem(new QListWidgetItem(str, this)); dev = dev->next; } rk_bt_free_paired_devices(g_dev_list_test); g_dev_list_test = NULL; rk_bt_start_discovery(10000, SCAN_TYPE_BREDR); #endif } void qtBT::close() { qDebug() << "bt close"; #ifdef RKWIFIBTAPP //rk_bt_cancel_discovery(); rk_bt_deinit(); #endif } qtBT::qtBT(QWidget *parent, QLabel *label, QPushButton *btn, bool on) { const QRect availableGeometry = QApplication::desktop()->availableGeometry(parent); resize(availableGeometry.width(), availableGeometry.height()); QFont font; font.setPixelSize(availableGeometry.height()/40); if(btn){ switchBtn = btn; switchBtn->setCheckable(true); switchBtn->setVisible(true); switchBtn->setStyleSheet("QPushButton{background-color:green;}"); switchBtn->setStyleSheet("QPushButton:checked{background-color:red;}"); if (on){ switchBtn->setChecked(true); switchBtn->setText("on"); } else { switchBtn->setChecked(false); switchBtn->setText("off"); } connect(switchBtn, SIGNAL(clicked(bool)), this, SLOT(on_btnClicked())); } setObjectName("BT"); setFont(font); connect(this, SIGNAL(itemClicked(QListWidgetItem *)), this, SLOT(on_itemClicked(QListWidgetItem *))); show(); qDebug() << "bt init: " << on; if(on) turnOn(); } qtBT::~qtBT() { #ifdef RKWIFIBTAPP rk_bt_cancel_discovery(); #endif if(switchBtn){ switchBtn->setVisible(false); } _instance = nullptr; } bool qtBT::isOn() { if(switchBtn){ if (! switchBtn->text().compare("on")){ return true; } else { return false; } } return false; } void qtBT::turnOn() { if(QFile::exists("/userdata")){ open(); } else { QStringList list; list << "bt1" << "bt2" << "bt3" << "bt4" << "bt5" << "bt6" << "bt7"; addItems(list); } } void qtBT::turnOff() { if(QFile::exists("/userdata")){ close(); } clear(); } void qtBT::on_btnClicked() { if(switchBtn){ if (! switchBtn->text().compare("on")){ qDebug() << "on_btnClicked turnOff"; switchBtn->setText("off"); turnOff(); } else if (! switchBtn->text().compare("off")){ qDebug() << "on_btnClicked turnOn"; switchBtn->setText("on"); turnOn(); } } } void qtBT::on_itemClicked(QListWidgetItem *item) { QString str = item->text(); QStringList sl = str.split(" "); QString pair = sl.at(0); QString addr = sl.at(1); QString name = sl.at(2); if(!addr.isEmpty()){ if(!pair.compare("Paired")){ qDebug() << "connecting to " << addr.toLatin1().data(); #ifdef RKWIFIBTAPP rk_bt_source_connect_by_addr(addr.toLatin1().data()); #endif }else if(!pair.compare("Connected")){ qDebug() << "disconnecting " << addr << name; #ifdef RKWIFIBTAPP rk_bt_source_disconnect_by_addr(addr.toLatin1().data()); #endif takeItem(row(item)); }else{ qDebug() << "connecting to " << addr.toLatin1().data(); #ifdef RKWIFIBTAPP rk_bt_source_connect_by_addr(addr.toLatin1().data()); #endif } } }