summaryrefslogtreecommitdiffstats
path: root/bluetooth
diff options
context:
space:
mode:
Diffstat (limited to 'bluetooth')
-rw-r--r--bluetooth/bluetooth.cpp182
-rw-r--r--bluetooth/bluetooth.h30
-rw-r--r--bluetooth/bluetoothmessage.cpp13
-rw-r--r--bluetooth/bluetoothmessage.h24
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