lqml/examples/meshtastic/cpp/connection/wifi/wifi_me.cpp

87 lines
2.1 KiB
C++

#include "wifi_me.h"
#include "../connection.h"
#include <QHostAddress>
#ifdef Q_OS_ANDROID
#include "../../android_service/qtandroidservice_ro.h"
#endif
#ifdef Q_OS_ANDROID
WiFi_ME::WiFi_ME(QtAndroidService* service, Connection* _con) : emitter(service), con(_con) {
#else
WiFi_ME::WiFi_ME(Connection* _con) : emitter(_con), con(_con) {
#endif
connect(this, &QTcpSocket::stateChanged, this, &WiFi_ME::stateChanged);
connect(this, &QTcpSocket::errorOccurred,
[](QAbstractSocket::SocketError error) {
qDebug() << "WiFi error:" << error;
});
connect(this, &QTcpSocket::readyRead, this, &WiFi_ME::read2);
timer.setSingleShot(true);
connect(&timer, &QTimer::timeout, this, &WiFi_ME::done);
}
void WiFi_ME::connectToRadio(const QString& ip) {
connectToHost(ip, 4403);
}
void WiFi_ME::stateChanged(SocketState state) {
if (state == ConnectedState) {
emitter->setReady(QVariant(QVariantList() << peerAddress().toString()));
}
qDebug() << "WiFi state:" << state;
}
void WiFi_ME::disconnect() {
disconnectFromHost();
}
void WiFi_ME::write2(const QByteArray& data) {
if (state() == ConnectedState) {
write(data);
} else {
qDebug() << "not ready to write";
}
}
void WiFi_ME::read2() {
packets << readAll();
timer.start(1000); // assume receiving done after pause of 1 sec
}
void WiFi_ME::received(const QByteArray& data) {
if (!data.isEmpty()) {
if (con->backgroundMode) {
con->saveBytes(data);
} else {
emitter->receivedFromRadio(QVariant(QVariantList() << data));
}
}
}
void WiFi_ME::done() {
if (!con->backgroundMode) {
static bool startup = true;
if (startup) {
con->sendSavedBytes(); // for eventual, saved but not sent packets
} else {
startup = false;
}
}
const QByteArray HEADER = QByteArray::fromHex("94c3");
const int LEN = 4;
QByteArray data(packets.join());
packets.clear();
int start = 0;
while ((start = data.indexOf(HEADER, start)) != -1) {
int i_len = start + 2;
int len = (data.at(i_len) << 8) + data.at(i_len + 1);
received(data.mid(start + LEN, len));
start += LEN + len;
}
emitter->receivingDone();
}