summaryrefslogtreecommitdiff
path: root/lib/watchconnector.cpp
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-07-06 17:22:25 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-07-09 01:57:32 +0200
commit7283842cbed6a378d430552d327eab4a27775538 (patch)
tree708f4a2b4e702ddcc07bef8e6fdcd8f8a32a23ef /lib/watchconnector.cpp
parentd3d54722d8532bd649db6792126c0a990712e26c (diff)
Moved watchConnector to daemon and implemented daemon interface for QML
Diffstat (limited to 'lib/watchconnector.cpp')
-rw-r--r--lib/watchconnector.cpp300
1 files changed, 0 insertions, 300 deletions
diff --git a/lib/watchconnector.cpp b/lib/watchconnector.cpp
deleted file mode 100644
index 18d287e..0000000
--- a/lib/watchconnector.cpp
+++ /dev/null
@@ -1,300 +0,0 @@
-#include "watchconnector.h"
-#include <QTimer>
-#include <QDateTime>
-
-using namespace watch;
-
-static int __reconnect_timeout = 5000; //ms
-
-WatchConnector::WatchConnector(QObject *parent) :
- QObject(parent), socket(nullptr), is_connected(false)
-{}
-
-WatchConnector::~WatchConnector()
-{
-}
-
-void WatchConnector::deviceDiscovered(const QBluetoothDeviceInfo &device)
-{
- //FIXME TODO: Configurable
- if (device.name().startsWith("Pebble")) {
- qDebug() << "Found Pebble:" << device.name() << '(' << device.address().toString() << ')';
- handleWatch(device.name(), device.address().toString());
- } else {
- qDebug() << "Found other device:" << device.name() << '(' << device.address().toString() << ')';
- }
-}
-
-void WatchConnector::deviceConnect(const QString &name, const QString &address)
-{
- if (name.startsWith("Pebble")) handleWatch(name, address);
-}
-
-void WatchConnector::reconnect()
-{
- qDebug() << "reconnect" << _last_name;
- if (!_last_name.isEmpty() && !_last_address.isEmpty()) {
- deviceConnect(_last_name, _last_address);
- }
-}
-
-void WatchConnector::handleWatch(const QString &name, const QString &address)
-{
- qDebug() << "handleWatch" << name << address;
- if (socket != nullptr && socket->isOpen()) {
- socket->close();
- socket->deleteLater();
- }
-
- bool emit_name = (_last_name != name);
- _last_name = name;
- _last_address = address;
- if (emit_name) emit nameChanged();
-
- qDebug() << "Creating socket";
- socket = new QBluetoothSocket(QBluetoothSocket::RfcommSocket);
-
- connect(socket, SIGNAL(readyRead()), SLOT(onReadSocket()));
- connect(socket, SIGNAL(connected()), SLOT(onConnected()));
- connect(socket, SIGNAL(disconnected()), SLOT(onDisconnected()));
- connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(onError(QBluetoothSocket::SocketError)));
-
- // FIXME: Assuming port 1 (with Pebble)
- socket->connectToService(QBluetoothAddress(address), QBluetoothUuid(QBluetoothUuid::SerialPort));
-}
-
-QString WatchConnector::decodeEndpoint(unsigned int val)
-{
- //FIXME: Create a map of these values
- switch(val) {
- case watchTIME:
- return "TIME";
- case watchVERSION:
- return "VERSION";
- case watchPHONE_VERSION:
- return "PHONE_VERSION";
- case watchSYSTEM_MESSAGE:
- return "SYSTEM_MESSAGE";
- case watchMUSIC_CONTROL:
- return "MUSIC_CONTROL";
- case watchPHONE_CONTROL:
- return "PHONE_CONTROL";
- case watchAPPLICATION_MESSAGE:
- return "APP_MSG";
- case watchLAUNCHER:
- return "LAUNCHER";
- case watchLOGS:
- return "LOGS";
- case watchPING:
- return "PING";
- case watchLOG_DUMP:
- return "DUMP";
- case watchRESET:
- return "RESET";
- case watchAPP:
- return "APP";
- case watchAPP_LOGS:
- return "APP_LOGS";
- case watchNOTIFICATION:
- return "NOTIFICATION";
- case watchRESOURCE:
- return "RESOURCE";
- case watchAPP_MANAGER:
- return "APP_MANAG";
- case watchSCREENSHOT:
- return "SCREENSHOT";
- case watchPUTBYTES:
- return "PUTBYTES";
- default:
- return "Unknown: "+ QString::number(val);
- }
-}
-
-void WatchConnector::decodeMsg(QByteArray data)
-{
- unsigned int datalen = 0;
- int index = 0;
- datalen = (data.at(index) << 8) + data.at(index+1);
- index += 2;
-
- unsigned int endpoint = 0;
- endpoint = (data.at(index) << 8) + data.at(index+1);
- index += 2;
-
- qDebug() << "Length:" << datalen << " Endpoint:" << decodeEndpoint(endpoint);
- qDebug() << "Data:" << data.mid(index).toHex();
- if (endpoint == watchPHONE_CONTROL) {
- if (data.length() >= 5) {
- if (data.at(4) == callHANGUP) {
- emit hangup();
- }
- }
- }
-}
-
-void WatchConnector::onReadSocket()
-{
- qDebug() << "read";
-
- QBluetoothSocket *socket = qobject_cast<QBluetoothSocket *>(sender());
- if (!socket) return;
-
- while (socket->bytesAvailable()) {
- QByteArray line = socket->readAll();
- emit messageReceived(socket->peerName(), QString::fromUtf8(line.constData(), line.length()));
- decodeMsg(line);
- }
-}
-
-void WatchConnector::onConnected()
-{
- qDebug() << "Connected!";
- bool was_connected = is_connected;
- is_connected = true;
- if (not was_connected) emit connectedChanged();
-}
-
-void WatchConnector::onDisconnected()
-{
- qDebug() << "Disconnected!";
-
- bool was_connected = is_connected;
- is_connected = false;
-
- QBluetoothSocket *socket = qobject_cast<QBluetoothSocket *>(sender());
- if (!socket) return;
-
- if (was_connected) emit connectedChanged();
-
- socket->deleteLater();
-
- // Try to connect again after a timeout
- QTimer::singleShot(__reconnect_timeout, this, SLOT(reconnect()));
-}
-
-void WatchConnector::onError(QBluetoothSocket::SocketError error) {
- qWarning() << "Error connecting Pebble" << error << socket->errorString();
-}
-
-void WatchConnector::sendData(const QByteArray &data)
-{
- if (socket == nullptr) return;
-
- socket->write(data);
-}
-
-void WatchConnector::sendMessage(unsigned int endpoint, QByteArray data)
-{
- qDebug() << "Sending message";
- QByteArray msg;
-
- // First send the length
- msg.append((data.length() & 0xFF00) >> 8);
- msg.append(data.length() & 0xFF);
-
- // Then the endpoint
- msg.append((endpoint & 0xFF00) >> 8);
- msg.append(endpoint & 0xFF);
-
- // Finally the data
- msg.append(data);
-
- sendData(msg);
-}
-
-void WatchConnector::buildData(QByteArray &res, QStringList data)
-{
- for (QString d : data)
- {
- QByteArray tmp = d.left(0xF0).toUtf8();
- res.append(tmp.length() & 0xFF);
- res.append(tmp);
- }
-}
-
-QByteArray WatchConnector::buildMessageData(unsigned int lead, QStringList data)
-{
- QByteArray res;
- res.append(lead & 0xFF);
- buildData(res, data);
-
- return res;
-}
-
-void WatchConnector::ping(unsigned int val)
-{
- QByteArray res;
- res.append((char)0);
-
- res.append((char)((val >> 24) & 0xff));
- res.append((char)((val >> 16) & 0xff));
- res.append((char)((val >> 8) & 0xff));
- res.append((char)(val & 0xff));
-
- sendMessage(watchPING, res);
-}
-
-QString WatchConnector::timeStamp()
-{
- return QString::number(QDateTime::currentMSecsSinceEpoch());
-}
-
-void WatchConnector::sendNotification(unsigned int lead, QString sender, QString data, QString subject)
-{
- QStringList tmp;
- tmp.append(sender);
- tmp.append(data);
- tmp.append(timeStamp());
- if (lead == 0) tmp.append(subject);
-
- QByteArray res = buildMessageData(lead, tmp);
-
- sendMessage(watchNOTIFICATION, res);
-}
-
-void WatchConnector::sendSMSNotification(QString sender, QString data)
-{
- sendNotification(1, sender, data, "");
-}
-
-void WatchConnector::sendEmailNotification(QString sender, QString data, QString subject)
-{
- sendNotification(0, sender, data, subject);
-}
-
-void WatchConnector::phoneControl(char act, unsigned int cookie, QStringList datas)
-{
- QByteArray head;
- head.append((char)act);
- head.append((cookie >> 24)& 0xFF);
- head.append((cookie >> 16)& 0xFF);
- head.append((cookie >> 8)& 0xFF);
- head.append(cookie & 0xFF);
- if (datas.length()>0) buildData(head, datas);
-
- sendMessage(watchPHONE_CONTROL, head);
-}
-
-void WatchConnector::ring(QString number, QString name, bool incoming, unsigned int cookie)
-{
- QStringList tmp;
- tmp.append(number);
- tmp.append(name);
-
- char act = callINCOMING;
- if (!incoming) {
- act = callOUTGOING;
- }
-
- phoneControl(act, cookie, tmp);
-}
-
-void WatchConnector::startPhoneCall(unsigned int cookie)
-{
- phoneControl(callSTART, cookie, QStringList());
-}
-
-void WatchConnector::endPhoneCall(unsigned int cookie)
-{
- phoneControl(callEND, cookie, QStringList());
-}