diff options
Diffstat (limited to 'bluetooth')
-rw-r--r-- | bluetooth/bluetooth.cpp | 182 | ||||
-rw-r--r-- | bluetooth/bluetooth.h | 30 | ||||
-rw-r--r-- | bluetooth/bluetoothmessage.cpp | 13 | ||||
-rw-r--r-- | bluetooth/bluetoothmessage.h | 24 |
4 files changed, 113 insertions, 136 deletions
diff --git a/bluetooth/bluetooth.cpp b/bluetooth/bluetooth.cpp index d205e7d..f7ef970 100644 --- a/bluetooth/bluetooth.cpp +++ b/bluetooth/bluetooth.cpp @@ -31,6 +31,7 @@ Bluetooth::Bluetooth (QUrl &url, QObject * parent) : uuids.insert("a2dp", "0000110a-0000-1000-8000-00805f9b34fb"); uuids.insert("avrcp", "0000110e-0000-1000-8000-00805f9b34fb"); + uuids.insert("hfp", "0000111f-0000-1000-8000-00805f9b34fb"); } Bluetooth::~Bluetooth() @@ -38,14 +39,9 @@ Bluetooth::~Bluetooth() delete m_mloop; } -void Bluetooth::generic_command(QString verb, QString value) +void Bluetooth::send_command(QString verb, QJsonObject parameter) { BluetoothMessage *tmsg = new BluetoothMessage(); - QJsonObject parameter; - - if (!value.isEmpty()) - parameter.insert("value", value); - tmsg->createRequest(verb, parameter); m_mloop->sendMessage(tmsg); delete tmsg; @@ -53,175 +49,185 @@ void Bluetooth::generic_command(QString verb, QString value) void Bluetooth::setPower(bool state) { - generic_command("power", state ? "true": "false"); - - m_power = state; - - emit powerChanged(m_power); + QJsonObject parameter; + parameter.insert("powered", state ? "true" : "false"); + send_command("adapter_state", parameter); } void Bluetooth::setDiscoverable(bool state) { - const QStringList properties { "Pairable", "Discoverable" }; - QStringListIterator propertyIterator(properties); + QJsonObject parameter; + parameter.insert("discoverable", state ? "true" : "false"); + send_command("adapter_state", parameter); - while (propertyIterator.hasNext()) { - BluetoothMessage *tmsg = new BluetoothMessage(); - QJsonObject parameter; + m_discoverable = state; - parameter.insert("Property", propertyIterator.next()); - parameter.insert("value", state ? "true" : "false"); + emit discoverableChanged(); +} - tmsg->createRequest("set_property", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; - } +void Bluetooth::discovery_command(bool state) +{ + QJsonObject parameter; + parameter.insert("discovery", state ? "true" : "false"); - m_discoverable = state; + set_discovery_filter(); - emit discoverableChanged(); + send_command("adapter_state", parameter); } void Bluetooth::start_discovery() { - generic_command("start_discovery", ""); - generic_command("discovery_result", ""); + discovery_command(true); + + // temp workaround to list already discovered devices + send_command("managed_objects", QJsonObject()); } void Bluetooth::stop_discovery() { - generic_command("stop_discovery", ""); + discovery_command(false); } -void Bluetooth::remove_device(QString address) +void Bluetooth::remove_device(QString device) { - generic_command("remove_device", address); + QJsonObject parameter; + parameter.insert("device", device); + + send_command("remove_device", parameter); } -void Bluetooth::pair(QString address) +void Bluetooth::pair(QString device) { - generic_command("pair", address); + QJsonObject parameter; + parameter.insert("device", device); + + send_command("pair", parameter); } -void Bluetooth::cancel_pair(QString address) +void Bluetooth::cancel_pair(QString device) { - generic_command("cancel_pair", address); + send_command("cancel_pairing", QJsonObject()); } -void Bluetooth::connect(QString address, QString uuid) +void Bluetooth::connect(QString device, QString uuid) { - BluetoothMessage *tmsg = new BluetoothMessage(); QJsonObject parameter; - uuid = process_uuid(uuid); - - parameter.insert("value", address); + parameter.insert("device", device); parameter.insert("uuid", uuid); - tmsg->createRequest("connect", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; + send_command("connect", parameter); } -void Bluetooth::connect(QString address) +void Bluetooth::connect(QString device) { - generic_command("connect", address); + QJsonObject parameter; + parameter.insert("device", device); + send_command("connect", parameter); } -void Bluetooth::disconnect(QString address, QString uuid) +void Bluetooth::disconnect(QString device, QString uuid) { - BluetoothMessage *tmsg = new BluetoothMessage(); QJsonObject parameter; - uuid = process_uuid(uuid); - - parameter.insert("value", address); + parameter.insert("device", device); parameter.insert("uuid", uuid); - tmsg->createRequest("disconnect", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; + send_command("disconnect", parameter); } -void Bluetooth::disconnect(QString address) +void Bluetooth::disconnect(QString device) { - generic_command("disconnect", address); + QJsonObject parameter; + parameter.insert("device", device); + send_command("disconnect", parameter); } -void Bluetooth::send_confirmation() +void Bluetooth::send_confirmation(int pincode) { - generic_command("send_confirmation", "yes"); + QJsonObject parameter; + parameter.insert("pincode", pincode); + send_command("confirm_pairing", parameter); } -void Bluetooth::set_avrcp_controls(QString address, QString cmd) + +void Bluetooth::set_discovery_filter() { - BluetoothMessage *tmsg = new BluetoothMessage(); + QStringListIterator eventIterator(uuids.values()); QJsonObject parameter; + QJsonArray array; - parameter.insert("Address", address); - parameter.insert("value", cmd); - tmsg->createRequest("set_avrcp_controls", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; + while (eventIterator.hasNext()) + array.push_back(eventIterator.next()); + + // send inital adapter state + discovery filter + parameter.insert("filter", array); + send_command("adapter_state", parameter); } void Bluetooth::onConnected() { QStringListIterator eventIterator(events); - BluetoothMessage *tmsg; while (eventIterator.hasNext()) { - tmsg = new BluetoothMessage(); QJsonObject parameter; parameter.insert("value", eventIterator.next()); - tmsg->createRequest("subscribe", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; + send_command("subscribe", parameter); } - // get initial power state - generic_command("power", QString()); - // send initial list - generic_command("discovery_result", ""); + send_command("managed_objects", QJsonObject()); + + // get initial power state + send_command("adapter_state", QJsonObject()); } void Bluetooth::onDisconnected() { QStringListIterator eventIterator(events); - BluetoothMessage *tmsg; while (eventIterator.hasNext()) { - tmsg = new BluetoothMessage(); QJsonObject parameter; parameter.insert("value", eventIterator.next()); - tmsg->createRequest("unsubscribe", parameter); - m_mloop->sendMessage(tmsg); - delete tmsg; + send_command("unsubscribe", parameter); } } +void Bluetooth::processDeviceChangesEvent(QJsonObject data) +{ + QString action = data.value("action").toString(); + + if (action == "added") + emit deviceAddedEvent(data); + else if (action == "changed") { + auto powered = data.find("powered").value(); + + if (powered.isBool()) { + m_power = powered.toBool(); + emit powerChanged(m_power); + } else { + emit deviceUpdatedEvent(data); + } + } else if (action == "removed") + emit deviceRemovedEvent(data); +} + void Bluetooth::onMessageReceived(MessageType type, Message *msg) { if (msg->isEvent() && type == BluetoothEventMessage) { BluetoothMessage *tmsg = qobject_cast<BluetoothMessage*>(msg); - if (tmsg->isConnectionEvent()) { - emit connectionEvent(tmsg->eventData()); - } else if (tmsg->isRequestConfirmationEvent()) { + if (tmsg->isDeviceChangesEvent()) { + processDeviceChangesEvent(tmsg->eventData()); + } else if (tmsg->isAgentEvent()) { emit requestConfirmationEvent(tmsg->eventData()); - } else if (tmsg->isDeviceAddedEvent()) { - emit deviceAddedEvent(tmsg->eventData()); - } else if (tmsg->isDeviceRemovedEvent()) { - emit deviceRemovedEvent(tmsg->eventData()); - } else if (tmsg->isDeviceUpdatedEvent()) { - emit deviceUpdatedEvent(tmsg->eventData()); } + } else if (msg->isReply() && type == ResponseRequestMessage) { ResponseMessage *tmsg = qobject_cast<ResponseMessage*>(msg); - if (tmsg->requestVerb() == "discovery_result") { + if (tmsg->requestVerb() == "managed_objects") { emit deviceListEvent(tmsg->replyData()); - } else if (tmsg->requestVerb() == "power") { - m_power = tmsg->replyData().value("power").toString() == "on"; + } else if (tmsg->requestVerb() == "adapter_state") { + m_power = tmsg->replyData().value("powered").toBool(); emit powerChanged(m_power); } } diff --git a/bluetooth/bluetooth.h b/bluetooth/bluetooth.h index 24605cf..0f38381 100644 --- a/bluetooth/bluetooth.h +++ b/bluetooth/bluetooth.h @@ -19,6 +19,7 @@ #include <QDebug> #include <QObject> +#include <QJsonArray> #include "messageengine.h" @@ -38,18 +39,17 @@ class Bluetooth : public QObject Q_INVOKABLE void start_discovery(void); Q_INVOKABLE void stop_discovery(void); - Q_INVOKABLE void remove_device(QString address); - Q_INVOKABLE void pair(QString address); - Q_INVOKABLE void cancel_pair(QString address); + Q_INVOKABLE void remove_device(QString device); + Q_INVOKABLE void pair(QString device); + Q_INVOKABLE void cancel_pair(QString device); - Q_INVOKABLE void connect(QString address, QString uuid); - Q_INVOKABLE void connect(QString address); + Q_INVOKABLE void connect(QString device, QString uuid); + Q_INVOKABLE void connect(QString device); - Q_INVOKABLE void disconnect(QString address, QString uuid); - Q_INVOKABLE void disconnect(QString address); + Q_INVOKABLE void disconnect(QString device, QString uuid); + Q_INVOKABLE void disconnect(QString device); - Q_INVOKABLE void send_confirmation(void); - Q_INVOKABLE void set_avrcp_controls(QString address, QString cmd); + Q_INVOKABLE void send_confirmation(int pincode); bool power() const { return m_power; }; bool discoverable() const { return m_discoverable; }; @@ -67,7 +67,10 @@ class Bluetooth : public QObject private: MessageEngine *m_mloop; - void generic_command(QString, QString); + void send_command(QString, QJsonObject); + void set_discovery_filter(); + void discovery_command(bool); + void processDeviceChangesEvent(QJsonObject data); // slots void onConnected(); @@ -83,11 +86,8 @@ class Bluetooth : public QObject QMap<QString, QString> uuids; const QStringList events { - "connection", - "request_confirmation", - "device_added", - "device_removed", - "device_updated", + "device_changes", + "agent", }; }; diff --git a/bluetooth/bluetoothmessage.cpp b/bluetooth/bluetoothmessage.cpp index 9eef02f..52ecbed 100644 --- a/bluetooth/bluetoothmessage.cpp +++ b/bluetooth/bluetoothmessage.cpp @@ -23,15 +23,8 @@ bool BluetoothMessage::createRequest(QString verb, QJsonObject parameter) { - if (m_api_version == "1.0") { - if (!verbs_v1.contains(verb)) - return false; - } + if (!verbs.contains(verb)) + return false; - if (m_api_version == "2.0") { - if (!verbs_v2.contains(verb)) - return false; - } - - return Message::createRequest("Bluetooth-Manager", verb, parameter); + return Message::createRequest("Bluetooth-Manager", verb, parameter); } diff --git a/bluetooth/bluetoothmessage.h b/bluetooth/bluetoothmessage.h index 0a26322..4fc9124 100644 --- a/bluetooth/bluetoothmessage.h +++ b/bluetooth/bluetoothmessage.h @@ -23,39 +23,17 @@ class BluetoothMessage : public Message { Q_OBJECT public: - explicit BluetoothMessage(QString api_version = "1.0", QObject *parent = 0) { m_api_version = api_version; }; - - // Bluetooth API Schema 1.0 - bool isConnectionEvent() { return (this->eventName() == "connection"); }; - bool isRequestConfirmationEvent() { return (this->eventName() == "request_confirmation"); }; - bool isDeviceAddedEvent() { return (this->eventName() == "device_added"); }; - bool isDeviceRemovedEvent() { return (this->eventName() == "device_removed"); }; - bool isDeviceUpdatedEvent() { return (this->eventName() == "device_updated"); }; - - // Bluetooth API Schema 2.0 bool isDeviceChangesEvent() { return (this->eventName() == "device_changes"); }; bool isAgentEvent() { return (this->eventName() == "agent"); }; - bool createRequest(QString verb, QJsonObject parameter); private: - QStringList verbs_v1 { - "start_discovery" , "stop_discovery", "power", - "remove_device", "pair", "cancel_pair", - "connect", "disconnect", "device_priorities", - "set_device_property", "set_property", "discovery_result", - "set_avrcp_controls", "send_confirmation", "version", - "subscribe", "unsubscribe", - }; - - QStringList verbs_v2 { + QStringList verbs { "connect", "disconnect", "managed_objects", "adapter_state", "pair", "cancel_pairing", "confirm_pairing", "remove_device", "version", "subscribe", "unsubscribe", }; - - QString m_api_version; }; #endif // BLUETOOTH_MESSAGE_H |