121 lines
3.5 KiB
C++
121 lines
3.5 KiB
C++
#include "broadcast.h"
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
#include <QJsonArray>
|
|
#include <QDebug>
|
|
|
|
BroadCast::BroadCast(QIODevice* const iodevice, bool master ): master_(master), iodevice_(iodevice)
|
|
{
|
|
if(iodevice_ != nullptr) connect(iodevice_, &QIODevice::readyRead, this, &BroadCast::readyRead);
|
|
}
|
|
|
|
void BroadCast::write(const char * const buffer, const size_t length)
|
|
{
|
|
QByteArray mBuffer("bcst: ");
|
|
for (size_t i = 0; i < length; ++i)
|
|
{
|
|
if(buffer[i] != '\n' && buffer[i] != '\0') mBuffer.push_back(buffer[i]);
|
|
else
|
|
{
|
|
mBuffer.push_back('\\');
|
|
if(buffer[i] == '\n')mBuffer.push_back('n');
|
|
else mBuffer.push_back('0');
|
|
}
|
|
}
|
|
mBuffer.push_back('\n');
|
|
if(iodevice_)iodevice_->write(mBuffer);
|
|
}
|
|
|
|
void BroadCast::write(const QByteArray& buffer)
|
|
{
|
|
write(buffer.data(), buffer.size());
|
|
}
|
|
|
|
void BroadCast::sendJson(const QJsonObject& json)
|
|
{
|
|
QJsonDocument jsonDocument(json);
|
|
QByteArray buffer("JSON: ");
|
|
buffer.append(jsonDocument.toJson());
|
|
write(buffer);
|
|
}
|
|
|
|
void BroadCast::requestJson()
|
|
{
|
|
if(iodevice_)iodevice_->write("bcst: GETJSN\n");
|
|
}
|
|
|
|
void BroadCast::decodeMaster()
|
|
{
|
|
if(buffer_.size() >= 6 && buffer_[0] == 'G' && buffer_[1] == 'E' && buffer_[2] == 'T' && buffer_[3] == 'J' && buffer_[4] == 'S' && buffer_[5] == 'N')
|
|
{
|
|
qDebug()<<"json requested";
|
|
jsonRequested();
|
|
}
|
|
}
|
|
|
|
void BroadCast::decode()
|
|
{
|
|
if(buffer_.size() >= 6 && buffer_[0] == 'J' && buffer_[1] == 'S' && buffer_[2] == 'O' && buffer_[3] == 'N' && buffer_[4] == ':')
|
|
{
|
|
qDebug()<<"got json";
|
|
buffer_.remove(0,6);
|
|
for(int i = 0; i < buffer_.size()-1; ++i)
|
|
{
|
|
if( buffer_[i] == '\\' && buffer_[i+1] == 'n' )
|
|
{
|
|
buffer_[i] = '\n';
|
|
buffer_.remove(i+1,1);
|
|
}
|
|
else if( buffer_[i] == '\\' && buffer_[i+1] == '0' )
|
|
{
|
|
buffer_[i] = '\0';
|
|
buffer_.remove(i+1,1);
|
|
}
|
|
}
|
|
|
|
QJsonParseError error;
|
|
QJsonDocument document = QJsonDocument::fromJson(buffer_, &error);
|
|
|
|
qDebug()<<"orig json:";
|
|
qDebug()<<buffer_.data();
|
|
qDebug()<<"after parse:";
|
|
qDebug()<<document.toJson().data();
|
|
QJsonObject jsonObject = document.object();
|
|
if(error.error == QJsonParseError::NoError && !document.isEmpty() && !jsonObject.isEmpty()) gotJson(jsonObject);
|
|
else
|
|
{
|
|
qDebug()<<error.errorString();
|
|
}
|
|
}
|
|
else if(buffer_.size() >= 6 && buffer_[0] == 'S' && buffer_[1] == 'E' && buffer_[2] == 'N' && buffer_[3] == 'S' && buffer_[4] == 'O' && buffer_[5] == 'R')
|
|
{
|
|
Sensor sensor = Sensor::sensorFromString(buffer_);
|
|
if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor);
|
|
}
|
|
}
|
|
|
|
void BroadCast::sendMessage(const QString &title, const QString &body)
|
|
{
|
|
write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1());
|
|
}
|
|
|
|
void BroadCast::readyRead()
|
|
{
|
|
buffer_.append(iodevice_->readAll());
|
|
if(buffer_.size() >= 6)
|
|
{
|
|
if(buffer_[0] == 'b' && buffer_[1] == 'c' && buffer_[2] == 's' && buffer_[3] == 't' && buffer_[4] == ':')
|
|
{
|
|
if(buffer_.contains('\n'))
|
|
{
|
|
buffer_.remove(0,6);
|
|
decode();
|
|
if(master_)decodeMaster();
|
|
buffer_.clear();
|
|
}
|
|
}
|
|
else buffer_.clear();
|
|
}
|
|
else if(buffer_.contains('\n')) buffer_.clear();
|
|
}
|