#include "broadcast.h" #include #include #include #include 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()<= 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(); }