/************************************************************************* * Copyright (C) 2015 by Andrius Štikonas * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see .* *************************************************************************/ #ifndef SOCKET_H #define SOCKET_H #include #include #include #include #include #include class QUdpSocket; const QByteArray magicKey = QByteArray::fromHex("68 64"); // recognize datagrams from the socket class Socket : public QThread { Q_OBJECT Q_SIGNALS: void stateChanged(); void datagramQueued(); public: Socket(QHostAddress, QByteArray); // from discovery packet void toggle(); void powerOff(); void powerOn(); void discover(); void tableData(); void changeSocketName(QString newName); void changeSocketPassword(QString newPassword); void changeTimezone(int8_t newTimezone); void setOffTimer(uint16_t offTime); void toggleOffTimer(); bool parseReply(QByteArray); QHostAddress ip; QByteArray mac; bool powered; bool dst; QByteArray socketName, remotePassword; int8_t timezone; uint16_t offTime; bool offTimerEnabled; QDateTime socketDateTime; private: enum Datagram { QueryAll, Discover, Subscribe, PowerOff, PowerOn, ReadTable, SocketData, TimingData, TableModify, MaxCommands }; void sendDatagram(Datagram); void subscribe(); void processQueue() { start(); } void run(); void writeSocketData(QByteArray socketName, QByteArray remotePassword, int8_t timeZone, uint16_t offTime); QByteArray intToHex(unsigned int value, unsigned int length, bool littleEndian = true); int hexToInt(QByteArray value, bool littleEndian = true); QByteArray commandID[MaxCommands]; QByteArray datagram[MaxCommands]; QByteArray rmac; // Reveresed mac QByteArray versionID; QByteArray icon; // displayed icon QByteArray hardwareVersion; QByteArray firmwareVersion; QByteArray wifiFirmwareVersion; // CC3000 firmware version QByteArray staticServerIP; QByteArray port = QByteArray::fromHex("10:27"); // 10000 in hex (little endian) QByteArray domainServerName; QByteArray localIP; // same as QHostAddress ip but in QByteArray, maybe fix later... QByteArray localGatewayIP; QByteArray localNetMask; QByteArray DST_TimezoneOffset; QByteArray discoverable; QByteArray timeZoneSet; QByteArray socketTableNumber, socketTableVersion, timingTableNumber, timingTableVersion; // FIXME: not used yet const QByteArray twenties = QByteArray::fromHex("20 20 20 20 20 20"); // mac address padding, 6 spaces const QByteArray zeros = QByteArray::fromHex("00 00 00 00"); const QByteArray zero = QByteArray::fromHex("00"); const QByteArray one = QByteArray::fromHex("01"); QUdpSocket *udpSocket; QTimer *subscribeTimer; bool subscribed; QQueue commands; }; #endif /* SOCKET_H */