Files
UvosSmartHomeInterface/src/broadcast.cpp
Carl Klemm b0b4a985e9 ocupancy sensor now uses libnl to collect connected devices
fixed regulator saving values as int instead of double
2020-02-13 19:22:14 +01:00

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();
}