2015-01-14 00:50:55 +00:00
|
|
|
/*************************************************************************
|
|
|
|
* Copyright (C) 2015 by Andrius Štikonas <andrius@stikonas.eu> *
|
|
|
|
* *
|
|
|
|
* 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 <http://www.gnu.org/licenses/>.*
|
|
|
|
*************************************************************************/
|
|
|
|
|
2015-01-31 18:12:20 +00:00
|
|
|
#ifndef SOCKET_H
|
|
|
|
#define SOCKET_H
|
|
|
|
|
2015-01-14 00:50:55 +00:00
|
|
|
#include <QByteArray>
|
2015-04-02 01:31:37 +01:00
|
|
|
#include <QDateTime>
|
2015-01-14 00:50:55 +00:00
|
|
|
#include <QHostAddress>
|
2015-02-07 17:29:12 +00:00
|
|
|
#include <QQueue>
|
2015-02-01 01:42:45 +00:00
|
|
|
#include <QTimer>
|
2015-02-07 17:29:12 +00:00
|
|
|
#include <QThread>
|
2015-02-03 01:24:47 +00:00
|
|
|
|
|
|
|
class QUdpSocket;
|
2015-01-14 00:50:55 +00:00
|
|
|
|
2015-08-18 15:29:09 +01:00
|
|
|
const QByteArray magicKey = QByteArray::fromHex("68 64"); // recognize datagrams from the socket
|
2015-02-01 01:42:45 +00:00
|
|
|
|
2015-02-07 17:29:12 +00:00
|
|
|
class Socket : public QThread
|
2015-01-14 00:50:55 +00:00
|
|
|
{
|
2015-08-18 15:29:09 +01:00
|
|
|
Q_OBJECT
|
2015-02-01 01:42:45 +00:00
|
|
|
|
|
|
|
Q_SIGNALS:
|
|
|
|
void stateChanged();
|
2015-02-07 17:29:12 +00:00
|
|
|
void datagramQueued();
|
2015-02-01 01:42:45 +00:00
|
|
|
|
2015-01-14 00:50:55 +00:00
|
|
|
public:
|
2015-08-18 15:29:09 +01:00
|
|
|
Socket(QHostAddress, QByteArray); // from discovery packet
|
2016-09-02 20:56:06 +01:00
|
|
|
|
2015-01-26 00:55:20 +00:00
|
|
|
void toggle();
|
2015-05-26 00:02:19 +01:00
|
|
|
void powerOff();
|
|
|
|
void powerOn();
|
2015-04-02 22:10:06 +01:00
|
|
|
void discover();
|
2015-01-26 00:55:20 +00:00
|
|
|
void tableData();
|
2015-08-18 15:29:09 +01:00
|
|
|
void changeSocketName(QString newName);
|
|
|
|
void changeSocketPassword(QString newPassword);
|
|
|
|
void changeTimezone(int8_t newTimezone);
|
2015-11-16 01:10:27 +00:00
|
|
|
void setOffTimer(uint16_t offTime);
|
|
|
|
void toggleOffTimer();
|
2015-08-18 15:29:09 +01:00
|
|
|
bool parseReply(QByteArray);
|
2015-01-14 00:50:55 +00:00
|
|
|
|
2015-02-11 00:33:04 +00:00
|
|
|
QHostAddress ip;
|
2015-01-14 00:50:55 +00:00
|
|
|
QByteArray mac;
|
|
|
|
bool powered;
|
2016-04-17 23:03:36 +01:00
|
|
|
bool dst;
|
2015-02-15 12:31:21 +00:00
|
|
|
QByteArray socketName, remotePassword;
|
2015-11-01 22:25:23 +00:00
|
|
|
int8_t timezone;
|
2015-11-16 01:10:27 +00:00
|
|
|
uint16_t offTime;
|
|
|
|
bool offTimerEnabled;
|
2015-04-02 01:31:37 +01:00
|
|
|
QDateTime socketDateTime;
|
2015-01-14 13:55:28 +00:00
|
|
|
|
2015-01-14 00:50:55 +00:00
|
|
|
private:
|
2015-05-27 00:03:33 +01:00
|
|
|
enum Datagram {
|
|
|
|
QueryAll,
|
|
|
|
Discover,
|
|
|
|
Subscribe,
|
|
|
|
PowerOff,
|
|
|
|
PowerOn,
|
|
|
|
ReadTable,
|
|
|
|
SocketData,
|
|
|
|
TimingData,
|
|
|
|
TableModify,
|
|
|
|
MaxCommands
|
2015-08-18 15:29:09 +01:00
|
|
|
};
|
2015-01-14 13:55:28 +00:00
|
|
|
|
2015-08-18 15:29:09 +01:00
|
|
|
void sendDatagram(Datagram);
|
2015-02-01 01:42:45 +00:00
|
|
|
void subscribe();
|
2015-08-18 15:29:09 +01:00
|
|
|
void processQueue() {
|
|
|
|
start();
|
|
|
|
}
|
2015-02-07 17:29:12 +00:00
|
|
|
void run();
|
2015-11-16 01:10:27 +00:00
|
|
|
void writeSocketData(QByteArray socketName, QByteArray remotePassword, int8_t timeZone, uint16_t offTime);
|
2015-11-01 15:40:48 +00:00
|
|
|
QByteArray intToHex(unsigned int value, unsigned int length, bool littleEndian = true);
|
|
|
|
int hexToInt(QByteArray value, bool littleEndian = true);
|
2015-01-25 19:39:15 +00:00
|
|
|
|
|
|
|
QByteArray commandID[MaxCommands];
|
|
|
|
QByteArray datagram[MaxCommands];
|
2015-01-14 13:55:28 +00:00
|
|
|
QByteArray rmac; // Reveresed mac
|
2015-02-03 01:24:47 +00:00
|
|
|
QByteArray versionID;
|
2015-02-09 21:09:50 +00:00
|
|
|
QByteArray icon; // displayed icon
|
|
|
|
QByteArray hardwareVersion;
|
|
|
|
QByteArray firmwareVersion;
|
|
|
|
QByteArray wifiFirmwareVersion; // CC3000 firmware version
|
2015-02-11 00:33:04 +00:00
|
|
|
QByteArray staticServerIP;
|
2015-08-18 15:29:09 +01:00
|
|
|
QByteArray port = QByteArray::fromHex("10:27"); // 10000 in hex (little endian)
|
2015-02-15 15:26:37 +00:00
|
|
|
QByteArray domainServerName;
|
2015-02-11 00:33:04 +00:00
|
|
|
QByteArray localIP; // same as QHostAddress ip but in QByteArray, maybe fix later...
|
2015-02-09 21:09:50 +00:00
|
|
|
QByteArray localGatewayIP;
|
2015-02-11 14:31:20 +00:00
|
|
|
QByteArray localNetMask;
|
Rename dhcpMode to DST_TimezoneOffset.
Describtion by Fernando Silva:
While most TZs are integer, there are half time zones: Venezuela/Caracas, for
example, is GMT -4.5 and Kabul GMT +4.5. It is awkward, but we found that these
"half time zones" are identified by the second least significant bit of byte 161
(yes, the same used for DST). Therefore, we have the following possible combinations
for byte 161:
- 00: integer TZ, DST on
- 01: integer TZ, DST off
- 02: half TZ, DST on
- 03: half TZ, DST off
As a reference, one may consider the following examples:
- Azores (GMT-1), DST on: byte 161 = 00, byte 164 = FF
- Caracas (GMT-4.5), DST off: byte 161 = 03, byte 164 = FC
- Paris (GMT+1), DST off: byte 161 = 01, byte 164 = 01
- Kabul (GMT+4.5), DST on: bute 161 = 02, byte 164 = 04
2016-04-12 12:36:57 +01:00
|
|
|
QByteArray DST_TimezoneOffset;
|
2015-02-11 14:31:20 +00:00
|
|
|
QByteArray discoverable;
|
|
|
|
QByteArray timeZoneSet;
|
2015-02-11 00:33:04 +00:00
|
|
|
QByteArray socketTableNumber, socketTableVersion, timingTableNumber, timingTableVersion; // FIXME: not used yet
|
2015-01-25 19:39:15 +00:00
|
|
|
|
2015-08-18 15:29:09 +01:00
|
|
|
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");
|
2015-02-01 01:42:45 +00:00
|
|
|
|
|
|
|
QUdpSocket *udpSocket;
|
|
|
|
QTimer *subscribeTimer;
|
2015-04-02 22:56:57 +01:00
|
|
|
bool subscribed;
|
2015-02-07 17:29:12 +00:00
|
|
|
QQueue<Datagram> commands;
|
2015-01-25 19:39:15 +00:00
|
|
|
|
2015-01-14 00:50:55 +00:00
|
|
|
};
|
2015-01-31 18:12:20 +00:00
|
|
|
|
|
|
|
#endif /* SOCKET_H */
|