RF plugins added and made more stable

played with the client gui
pull/1/head
Simon Stuerz 2013-09-06 09:54:14 +02:00
parent ea11aae5c9
commit 3bf97a7e0d
29 changed files with 742 additions and 307 deletions

View File

@ -16,11 +16,13 @@ QML_IMPORT_PATH =
# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp \
hiveclientcore.cpp \
settings.cpp
settings.cpp \
sensormodel.cpp
HEADERS += \
hiveclientcore.h \
settings.h
settings.h \
sensormodel.h
# Installation path

View File

@ -7,9 +7,9 @@ HiveClientCore::HiveClientCore(QObject *parent) :
QObject(parent)
{
m_id = 0;
m_client = new Client(this);
// QML Typs
qmlRegisterType<Settings>("hive",1,0,"Settings");
@ -26,33 +26,3 @@ HiveClientCore::HiveClientCore(QObject *parent) :
}
void HiveClientCore::onConnected()
{
//sendSomething("device", "getAll");
sendSomething("device", "add");
}
void HiveClientCore::sendSomething(QString deviceName, QString method)
{
QVariantMap responseMap;
responseMap.insert("device", deviceName);
responseMap.insert("method", method);
responseMap.insert("id", m_id++);
QVariantMap params;
params.insert("deviceType","actor");
params.insert("name","Schreibtisch On");
params.insert("protocol","RF433");
params.insert("linecode","remote");
params.insert("code","000000000000010101010001");
responseMap.insert("params", params);
QJsonDocument doc = QJsonDocument::fromVariant(responseMap);
qDebug() << "_______________________________________";
qDebug() << "send to hive:";
QByteArray json = doc.toJson();
qDebug() << json;
m_client->sendData(json);
}

View File

@ -20,11 +20,7 @@ private:
QQmlApplicationEngine *m_engine;
QObject *topLevel;
int m_id;
private slots:
void onConnected();
void sendSomething(QString deviceName, QString method);
signals:

View File

@ -1,5 +1,6 @@
#include <QtGui/QGuiApplication>
#include "hiveclientcore.h"
#include "usb.h"
int main(int argc, char *argv[])
{

View File

@ -5,26 +5,33 @@ import QtQuick.Layouts 1.0
Component {
Rectangle{
anchors.fill: parent
color: "black"
ColumnLayout{
id: addDeviceColumn
anchors.horizontalCenter: parent.horizontalCenter
anchors.left: parent.left
anchors.leftMargin: 30
anchors.right: parent.right
anchors.rightMargin: 30
GroupBox{
id: nameGroupBox
anchors.left: parent.left
anchors.right: parent.right
title: "Name"
Row{
id: row1
spacing: 5
Text{
Label{
id: nameLabel
anchors.verticalCenter: parent.verticalCenter
text: "Name:"
color: "white"
}
TextField{
id: nameText
id: nameTextField
implicitWidth: 300
anchors.verticalCenter: parent.verticalCenter
placeholderText: "Device Name"
}
@ -33,15 +40,23 @@ Component {
}
GroupBox{
id: deviceTypeGroupBox
anchors.left: parent.left
anchors.leftMargin: 0
anchors.right: parent.right
anchors.rightMargin: 0
title: "Device Type"
ComboBox {
id: deviceComboBox
model: ["actor","sensor"]
model: ["device","actor","sensor"]
}
}
GroupBox{
id: communicationTypeGroupBox
anchors.left: parent.left
anchors.leftMargin: 0
anchors.right: parent.right
anchors.rightMargin: 0
title: "Communication Type"
ComboBox {
@ -51,6 +66,10 @@ Component {
}
GroupBox{
id: linecodeGroupBox
anchors.left: parent.left
anchors.leftMargin: 0
anchors.right: parent.right
anchors.rightMargin: 0
title: "Linecode"
visible: communicationTypeComboBox.currentText == "RC868" || communicationTypeComboBox.currentText == "RC433" ? true : false
@ -61,29 +80,35 @@ Component {
}
GroupBox{
id: switchGroupBox
anchors.left: parent.left
anchors.leftMargin: 0
anchors.right: parent.right
anchors.rightMargin: 0
title: "Switchsettings"
visible: (linecodeComboBox.currentText == "Switch") && (communicationTypeComboBox.currentText == "RC868" || communicationTypeComboBox.currentText == "RC433") ? true : false
RowLayout{
GridLayout{
columns: 6
columns: 5
Label{
text: "1"
color: "white"
}
Label{
text: "2"
color: "white"
}
Label{
text: "3"
color: "white"
}
Label{
text: "4"
color: "white"
}
Label{
text: "5"
}
Label{
text: "6"
color: "white"
}
CheckBox{
id: channel1
@ -100,9 +125,6 @@ Component {
CheckBox{
id: channel5
}
CheckBox{
id: channel6
}
}
ComboBox {
id: switchComboBox
@ -111,5 +133,31 @@ Component {
}
}
}
Button{
id: cancelButton
anchors.left: parent.left
anchors.leftMargin: 30
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
text: "Cancel"
onClicked: stackView.pop(this)
}
Button{
id: saveButton
anchors.right: parent.right
anchors.rightMargin: 30
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
text: "Save"
onClicked: {
var deviceType = deviceComboBox.currentText
var method = "add"
// TODO: variant map...to send hive the correct add command with all parameters
stackView.pop(this)
}
}
}
}

View File

@ -4,7 +4,8 @@ import QtQuick.Layouts 1.0
Component {
Rectangle{
anchors.fill: parent
focus: connectButton.forceActiveFocus()
color: "black"
GroupBox {
id: connectionGroupBox
@ -26,6 +27,7 @@ Component {
Text {
id: ipLable
text: "IP:"
color: "white"
horizontalAlignment: Text.AlignHCenter
}
TextField {
@ -37,6 +39,7 @@ Component {
Text {
id: portLable
text: "Port:"
color: "white"
wrapMode: Text.NoWrap
verticalAlignment: Text.AlignTop
horizontalAlignment: Text.AlignHCenter
@ -49,5 +52,6 @@ Component {
}
}
}
}
}

View File

@ -0,0 +1,89 @@
import QtQuick 2.0
import QtGraphicalEffects 1.0
Rectangle {
id: buttonRectangle
width: 300
height: 200
property string text
signal clicked()
color: "black"
RectangularGlow {
id: effect
anchors.fill: rect
glowRadius: rectMouseArea.pressed ? 18 : 10
spread: 0.4
color: "steelblue"
cornerRadius: rect.radius + glowRadius
}
Rectangle {
id: rect
color: "#ed000000"
anchors.centerIn: parent
anchors.fill: parent
anchors.margins: 20
radius: 25
border.width: 5
border.color: "#000000"
opacity: 1
Text{
id: buttonText
anchors.centerIn: parent
color: "#ffffff"
styleColor: "#ffffff"
horizontalAlignment: Text.AlignHCenter
font.pointSize: 20
font.family: "Arial"
font.bold: true
text: buttonRectangle.text
}
MouseArea{
id: rectMouseArea
anchors.fill: parent
onClicked: {
buttonRectangle.clicked()
}
}
}
}
//import QtQuick 2.0
//Rectangle{
// id: buttonRectangle
// property string text
// signal clicked()
// color: buttonMousArea.pressed ? "lightsteelblue" : "steelblue"
// border.width: buttonMousArea.pressed ? 4 : 2
// border.color: "black"
// radius: 10
// Text{
// id: buttonText
// anchors.centerIn: parent
// text: buttonRectangle.text
// }
// MouseArea{
// id: buttonMousArea
// anchors.fill: parent
// onClicked: {
// buttonRectangle.clicked()
// }
// }
//}

View File

@ -5,39 +5,27 @@ import QtQuick.Layouts 1.0
Component {
Rectangle{
anchors.fill: parent
color: "black"
Column{
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 30
spacing: 20
Rectangle{
id: addDeviceButton
width: 150
height: 70
color: "#c8c8c8"
border.color: "black"
radius: 10
Text{
anchors.centerIn: parent
text: "Add Device"
}
MouseArea{
id: addDeviceButtonMousArea
anchors.fill: parent
onPressed: addDeviceButton.color = "steelblue"
onReleased: addDeviceButton.color = "#c8c8c8"
onClicked: stackView.push(addDevicePage)
}
MainMenuButton{
text: "Add device"
onClicked: stackView.push(addDevicePage)
}
MainMenuButton{
text: "Temperatur"
onClicked: stackView.push(temperaturPage)
}
}
}
}

View File

@ -0,0 +1,29 @@
import QtQuick 2.0
import QtGraphicalEffects 1.0
Rectangle {
RectangularGlow {
id: effect
anchors.fill: rect
glowRadius: rectMouseArea.pressed ? 18 : 10
spread: 0.4
color: "steelblue"
cornerRadius: rect.radius + glowRadius
}
Rectangle {
id: rect
color: "black"
anchors.centerIn: parent
anchors.fill: parent
anchors.margins: 20
radius: 25
MouseArea{
id: rectMouseArea
anchors.fill: parent
}
}
}

View File

@ -0,0 +1,63 @@
import QtQuick 2.0
import QtQuick.Controls 1.0
import QtGraphicalEffects 1.0
Component {
Rectangle{
color: "black"
RectangularGlow {
id: effect
anchors.fill: rect
glowRadius: 18
spread: 0.4
color: "steelblue"
cornerRadius: rect.radius + glowRadius
}
Rectangle{
id: rect
anchors.fill: parent
anchors.margins: 70
color: "black"
radius: 30
Canvas {
anchors.fill: parent
contextType: "2d"
Path{
id: myPath
startX: 0; startY: 100
PathCurve { x: 75; y: 75 }
PathCurve { x: 200; y: 150 }
PathCurve { x: 325; y: 25 }
PathCurve { x: 400; y: 100 }
PathCurve { x: 500; y: 100 }
PathCurve { x: 600; y: 100 }
PathCurve { x: 700; y: 300 }
}
onPaint: {
context.strokeStyle = Qt.rgba(.4,.6,.8);
context.path = myPath;
context.stroke();
}
}
}
Button{
id: cancelButton
anchors.left: parent.left
anchors.leftMargin: 30
anchors.bottom: parent.bottom
anchors.bottomMargin: 10
text: "Cancel"
onClicked: stackView.pop(this)
}
}
}

View File

@ -29,8 +29,9 @@ ApplicationWindow{
anchors.bottom: parent.bottom
}
title: "Hive Client"
width: 600
height: 500
minimumWidth: 800
minimumHeight: 600
StackView {
id: stackView
@ -66,6 +67,10 @@ ApplicationWindow{
AddDevicePage{
id: addDevicePage
}
TemperaturePage{
id: temperaturPage
}
}

View File

@ -0,0 +1,6 @@
#include "sensormodel.h"
SensorModel::SensorModel(QObject *parent) :
QAbstractListModel(parent)
{
}

View File

@ -0,0 +1,23 @@
#ifndef SENSORMODEL_H
#define SENSORMODEL_H
#include <QObject>
#include <QAbstractListModel>
class SensorModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit SensorModel(QObject *parent = 0);
private:
signals:
public slots:
};
#endif // SENSORMODEL_H

View File

@ -29,8 +29,7 @@ void Client::readData()
QByteArray dataLine = m_tcpSocket->readLine();
message.append(dataLine);
if(dataLine == "}\n"){
emit jsonDataAvailable(message);
message.clear();
emit dataAvailable(message);
}
}
}
@ -49,6 +48,61 @@ void Client::disconneted()
emit connectionChanged();
}
void Client::processData(const QByteArray &data)
{
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if(error.error != QJsonParseError::NoError) {
qDebug() << "failed to parse data" << data << ":" << error.errorString();
}
qDebug() << "-------------------------\n" << jsonDoc.toJson();
QVariantMap command = jsonDoc.toVariant().toMap();
QVariantMap params = jsonDoc.toVariant().toMap().value("params").toMap();
if(command.contains("signal")){
handleSignal(params);
}else{
handleResponse(params);
}
}
void Client::handleResponse(const QVariantMap &rsp)
{
qDebug() << "handling response" << rsp;
if(!rsp.contains("id")) {
qDebug() << "packet does not contain an id. discarding...";
return;
}
int id = rsp.value("id").toInt();
if(m_requestMap.contains(id)) {
switch(m_requestMap.value(id)){
case RequestAddDevice:
qDebug() << "add device response received";
break;
case RequestEditDevice:
qDebug() << "edit device response received";
break;
case RequestRemoveDevice:
qDebug() << "add device response received";
break;
}
m_requestMap.remove(id);
}
}
void Client::handleSignal(const QVariantMap &signal)
{
}
void Client::connectToHost(QString ipAddress, QString port)
{
qDebug() << "connecting to" << ipAddress << ":" << port;

View File

@ -13,18 +13,27 @@ class Client : public QObject
public:
explicit Client(QObject *parent = 0);
bool isConnected();
enum Request {
RequestAddDevice,
RequestEditDevice,
RequestRemoveDevice
};
bool isConnected();
private:
QTcpSocket *m_tcpSocket;
QString m_tcpBuffer;
bool m_connectionStatus;
int m_commandId;
QMap<int, Request> m_requestMap;
signals:
void jsonDataAvailable(const QByteArray &data);
void dataAvailable(const QByteArray &data);
void connectionChanged();
@ -34,6 +43,11 @@ private slots:
void connected();
void disconneted();
void processData(const QByteArray &data);
void handleResponse(const QVariantMap &rsp);
void handleSignal(const QVariantMap &signal);
public slots:
void connectToHost(QString ipAddress, QString port);
void disconnectFromHost();

View File

@ -12,7 +12,9 @@ class JsonHandler : public QObject
Q_OBJECT
public:
explicit JsonHandler(QObject *parent = 0);
QByteArray addRemote(QString deviceType, QString method, QString name, QString protocol, QString Linecode, QString m);
signals:
void notifyAll(const QByteArray &data);
@ -23,7 +25,6 @@ public slots:
private:
DeviceJsonPlugin *m_device;
QByteArray formatResponse(const QVariantMap &command, const QVariantMap &responseParams);
QByteArray formatErrorResponse(const QVariantMap &command, const QString &error);

View File

@ -51,7 +51,7 @@ void DeviceJsonPlugin::add(QVariantMap parameters)
void DeviceJsonPlugin::remove()
{
}
void DeviceJsonPlugin::editValue(QString value, QVariant key)

View File

@ -8,7 +8,7 @@ class JsonPlugin : public QObject
Q_OBJECT
public:
explicit JsonPlugin(QObject *parent = 0);
//virtual ~JsonPlugin();
virtual ~JsonPlugin(){}
virtual QString deviceName() = 0;
virtual QByteArray process(const QVariantMap & command, const QVariantMap & parameters) = 0;

View File

@ -29,10 +29,16 @@ DEPENDPATH += $$PWD/../../libhive
SOURCES += main.cpp \
hivecore.cpp \
radio/radioreciver.cpp \
radio/radiosender.cpp
radio/radiosender.cpp \
radio/plugins/radioplugin.cpp \
radio/plugins/rfthermometer.cpp \
radio/plugins/rfswitch.cpp
HEADERS += \
hivecore.h \
radio/radioreciver.h \
radio/radiosender.h
radio/radiosender.h \
radio/plugins/radioplugin.h \
radio/plugins/rfthermometer.h \
radio/plugins/rfswitch.h

View File

@ -18,16 +18,16 @@ HiveCore::HiveCore(QObject *parent) :
// // create 433.92 MHz sender
// m_sender = new RadioSender(this);
// m_sender->setFrequency(RadioSender::RF433MHz);
// m_sender->setLineCode(RadioSender::REMOTE);
// m_sender->setPulseLength(320);
m_sender = new RadioSender(this);
m_sender->setFrequency(RadioSender::RF433MHz);
m_sender->setLineCode(RadioSender::REMOTE);
m_sender->setPulseLength(320);
// //m_sender->sendBin("000000000000010101010001");
// // create 433.92 MHz receiver
// m_reciver = new RadioReciver(this);
// m_reciver->setFrequency(RadioReciver::RF433MHz);
// m_reciver->setPin(2);
// m_reciver->enableReceiver();
// create 433.92 MHz receiver
m_reciver = new RadioReciver(this);
m_reciver->setFrequency(RadioReciver::RF433MHz);
m_reciver->setPin(2);
m_reciver->enableReceiver();
}

View File

@ -16,8 +16,8 @@ public:
private:
Server *m_server;
//RadioReciver *m_reciver;
//RadioSender *m_sender;
RadioReciver *m_reciver;
RadioSender *m_sender;
DeviceManager *m_deviceManager;
JsonHandler *m_jsonHandler;

View File

@ -0,0 +1,6 @@
#include "radioplugin.h"
RadioPlugin::RadioPlugin(QObject *parent) :
QObject(parent)
{
}

View File

@ -0,0 +1,18 @@
#ifndef RADIOPLUGIN_H
#define RADIOPLUGIN_H
#include <QObject>
class RadioPlugin : public QObject
{
Q_OBJECT
public:
explicit RadioPlugin(QObject *parent = 0);
virtual ~RadioPlugin(){}
virtual bool isValid(QList<int> rawData) = 0;
virtual QByteArray getBinCode() = 0;
};
#endif // RADIOPLUGIN_H

View File

@ -0,0 +1,118 @@
#include <QDebug>
#include <QStringList>
#include "rfswitch.h"
RFSwitch::RFSwitch(QObject *parent)
:RadioPlugin(parent)
{
m_delay = 0;
m_binCode = 0;
}
QByteArray RFSwitch::getBinCode()
{
if(m_binCode.isEmpty()){
return NULL;
}else{
return m_binCode;
}
}
bool RFSwitch::isValid(QList<int> rawData)
{
m_delay = rawData.first()/31;
QByteArray binCode;
if(m_delay > 310 && m_delay < 340){
// go trough all 48 timings
for(int i = 1; i <= 48; i+=2 ){
int div;
int divNext;
// if short
if(rawData.at(i) < 500){
div = 1;
}else{
div = 3;
}
// if long
if(rawData.at(i+1) < 500){
divNext = 1;
}else{
divNext = 3;
}
// _
// if we have | |___ = 0 -> in 4 delays => 1000
// _
// if we have ___| | = 1 -> in 4 delays => 0001
if(div == 1 && divNext == 3){
binCode.append("0");
}else if(div == 3 && divNext == 1){
binCode.append("1");
}else{
return false;
}
}
m_binCode = binCode;
// get the channel of the remote signal (5 channels, 1=on, 0 = off)
QByteArray channelSettings;
for(int i = 1; i < 10; i+=2){
if(m_binCode.at(i-1) == '0' && m_binCode.at(i) == '1'){
channelSettings.append("0");
}else{
channelSettings.append("1");
}
}
// get the button letter
char button;
if(m_binCode.at(10) == '0' && m_binCode.at(11) == '0'){
button = 'A';
}
if(m_binCode.at(12) == '0' && m_binCode.at(13) == '0'){
button = 'B';
}
if(m_binCode.at(14) == '0' && m_binCode.at(15) == '0'){
button = 'C';
}
if(m_binCode.at(16) == '0' && m_binCode.at(17) == '0'){
button = 'D';
}
if(m_binCode.at(18) == '0' && m_binCode.at(19) == '0'){
button = 'E';
}
QStringList byteList;
for(int i = 4; i <= 24; i+=4){
byteList.append(binCode.left(4));
binCode = binCode.right(binCode.length() -4);
}
bool buttonStatus;
if(byteList.last().toInt(0,2) == 1){
buttonStatus = true;
}else
if(byteList.last().toInt(0,2) == 4){
buttonStatus = false;
}else{
return false;
}
qDebug() << "-----------------------------------------------------------";
qDebug() << "| REMOTE signal |";
qDebug() << "-----------------------------------------------------------";
qDebug() << "delay :" << m_delay;
qDebug() << "bin CODE :" << m_binCode;
qDebug() << byteList;
qDebug() << "Channels:" << channelSettings << "Button:" << button << "=" << buttonStatus;
//emit switchSignalReceived(channelSettings,button,buttonStatus);
return true;
}else{
return false;
}
}

View File

@ -0,0 +1,26 @@
#ifndef RFSWITCH_H
#define RFSWITCH_H
#include <QObject>
#include <radio/plugins/radioplugin.h>
#define RFSwitchDelay 320
class RFSwitch : public RadioPlugin
{
public:
explicit RFSwitch(QObject *parent = 0);
QByteArray getBinCode();
bool isValid(QList<int> rawData);
private:
int m_delay;
QByteArray m_binCode;
signals:
void switchSignalReceived(const QByteArray &channel, const char &button, const bool &buttonStatus);
};
#endif // RFSWITCH_H

View File

@ -0,0 +1,122 @@
#include <QDebug>
#include <QFile>
#include <QStringList>
#include <QDateTime>
#include "rfthermometer.h"
RFThermometer::RFThermometer(QObject *parent) :
RadioPlugin(parent)
{
m_lastTemperature = -1111;
m_delay = 0;
m_binCode = 0;
}
QByteArray RFThermometer::getBinCode()
{
if(m_binCode.isEmpty()){
return NULL;
}else{
return m_binCode;
}
}
bool RFThermometer::isValid(QList<int> rawData)
{
m_delay = rawData.first()/31;
QByteArray binCode;
if(m_delay > 250 && m_delay < 260){
// __
// | |________ = 0 1100000000
// __
// | |________________ = 1 110000000000000000
for(int i = 1; i <= 48; i+=2 ){
if(rawData.at(i) < 1000 && rawData.at(i+1) < 3000 && rawData.at(i+1) > 1000){
binCode.append('0');
}else if(rawData.at(i) < 1000 && rawData.at(i+1) > 3000){
binCode.append('1');
}else{
return false;
}
}
m_binCode = binCode;
return true;
}else{
m_binCode = 0;
return false;
}
}
float RFThermometer::getTemperature()
{
// { ID },{-+}{ temp, },{Batt},{,temp}
// "XXXX","XXXX","X XXX","XXXX","XXXX","XXXX",
QByteArray binCode = m_binCode;
QList<QByteArray> byteList;
for(int i = 4; i <= 24; i+=4){
byteList.append(binCode.left(4));
binCode = binCode.right(binCode.length() -4);
}
QByteArray temperatureBin(byteList.at(2) + byteList.at(3));
QByteArray batteryBin(byteList.at(4));
QByteArray temperatureTenthBin(byteList.at(5));
// check sign of temperature -> if first bit of temperature byte is 1 -> temp is negativ
int sign = 0;
if(temperatureBin.left(1).toInt() == 1){
sign = -1;
}else{
sign = 1;
}
//qDebug() << temperatureBin << "=" << temperatureBin.left(1) << temperatureBin.right(7) << temperatureBin.right(7).toInt(0,2) << "," << temperatureTenthBin.toInt(0,2) ;
// calc temperature
float temperature = sign*(temperatureBin.right(7).toInt(0,2) + (float)temperatureTenthBin.toInt(0,2)/10);
// check if the battery is low
bool batteryStatus;
if(batteryBin.toInt(0,2) == 0){
batteryStatus = true;
}else{
batteryStatus = false;
}
if(temperature == m_lastTemperature){
return temperature;
}else{
m_lastTemperature = temperature;
QString timeStamp = QDateTime::currentDateTime().toString("dd.MM.yyyy, hh:mm:ss");;
//qDebug() << timeStamp;
QFile file("/root/temperature_log.ods");
file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
QTextStream out(&file);
QByteArray id = byteList.at(0)+byteList.at(1);
out << timeStamp << "," << temperature << "," << batteryStatus << "\n";
file.close();
qDebug() << "-----------------------------------------------------------";
qDebug() << "| THERMOMETER signal |";
qDebug() << "-----------------------------------------------------------";
qDebug() << "delay :" << m_delay;
qDebug() << "bin CODE :" << m_binCode;
qDebug() << byteList;
qDebug() << timeStamp << " ID:" << id << " Temperature:" << temperature << " Battery OK: " << batteryStatus;
//emit temperatureSignalReceived(id,temperature,batteryStatus);
return temperature;
}
}

View File

@ -0,0 +1,31 @@
#ifndef RFTHERMOMETER_H
#define RFTHERMOMETER_H
#include <QObject>
#include <radio/plugins/radioplugin.h>
#define RFThermometerDelay 250
class RFThermometer : public RadioPlugin
{
public:
explicit RFThermometer(QObject *parent = 0);
QByteArray getBinCode();
bool isValid(QList<int> rawData);
float getTemperature();
private:
float m_lastTemperature;
int m_delay;
QByteArray m_binCode;
signals:
void temperatureSignalReceived(const QByteArray &id, const float &temperature, const bool &batteryStatus);
public slots:
};
#endif // RFTHERMOMETER_H

View File

@ -1,12 +1,10 @@
#include "radioreciver.h"
#include "wiringPi.h"
#include <stdio.h>
#include <QDebug>
#include <QFile>
#include <QStringList>
#include <QDateTime>
static float lastTemperature = 0;
#include "radioreciver.h"
#include "wiringPi.h"
// #####################################################################################################
@ -109,6 +107,9 @@ RadioReciver::RadioReciver(QObject *parent) :
m_lastTime = 0;
m_repeatCount = 0;
m_thermometer = new RFThermometer(this);
m_switch = new RFSwitch(this);
for(int i = 0; i < RC_MAX_CHANGES; i++ ){
m_timings[i] = 0;
}
@ -178,212 +179,20 @@ void RadioReciver::handleInterrupt()
void RadioReciver::detectProtocol(QList<int> rawData)
{
qDebug() << "===========================================================================";
qDebug() <<"VALID SIGNAL (48 bit)" << " --> pulse width =" << rawData.first()/31;
qDebug() << rawData;
// int pulseWidth = rawData.first()/31;
// QList<int> rawDataKGV;
// foreach (int timing, rawData){
// int kgv = ((float)timing/pulseWidth)+0.5;
// rawDataKGV.append(kgv);
// }
// qDebug() << "-------= " << rawDataKGV;
// check if we have a valid signal, 1 sync + 48 data
if(rawData.length() != 49){
return;
}
// check plugins
if(m_thermometer->isValid(rawData)){
m_thermometer->getTemperature();
}
if(m_switch->isValid(rawData)){
m_switch->getBinCode();
}
}
//void RadioReciver::detectProtocol(int signalCount)
//{
// if(signalCount < 49){
// //qDebug() << "ERROR: got a signal with just" << signalCount << "signals";
// return;
// }
// qDebug() << "===========================================================================";
// QList <int> rawData;
// // go trough all 49 timings
// for(int i = 0; i <= 48; i+=1 ){
// rawData.append(timings[i]);
// }
// qDebug() << "raw data:" << rawData;
// unsigned long delay = timings[0] / 31;
// // #########################################################################
// if(delay > 250 && delay < 260){
// qDebug() << "-----------------------------------------------------------";
// qDebug() << " seems to be a TERMOMETER signal";
// qDebug() << "-----------------------------------------------------------";
// qDebug() << "delay :" << delay;
// qDebug() << "bits :" << signalCount-1;
// QByteArray binCode;
// // __
// // | |________ = 0 1100000000
// // __
// // | |________________ = 1 110000000000000000
// for(int i = 1; i <= 48; i+=2 ){
// if(timings[i] < 1000 && timings[i+1] < 3000 && timings[i+1] > 1000){
// binCode.append('0');
// }else if(timings[i] < 1000 && timings[i+1] > 3000){
// binCode.append('1');
// }else{
// qDebug() << "ERROR: could not read code...error in transmission";
// return;
// }
// }
// qDebug() << "bin CODE :" << binCode;
// parseTemperature(binCode);
// return;
// }
// // #########################################################################
// if(delay > 310 && delay < 340){
// qDebug() << "-----------------------------------------------------------";
// qDebug() << " seems to be a REMOTE signal";
// qDebug() << "-----------------------------------------------------------";
// qDebug() << "delay :" << delay;
// qDebug() << "bits :" << signalCount-1;
// QByteArray binCode;
// QList <int> rawData;
// // go trough all 48 timings
// for(int i = 1; i <= 48; i+=2 ){
// rawData.append(timings[i]);
// rawData.append(timings[i+1]);
// int div;
// int divNext;
// // if short
// if(timings[i] / delay < 2){
// div = 1;
// }else{
// div = 3;
// }
// // if long
// if(timings[i+1] / delay < 2){
// divNext = 1;
// }else{
// divNext = 3;
// }
// // _
// // if we have | |___ = 0 -> in 4 delays => 1000
// // _
// // if we have ___| | = 1 -> in 4 delays => 0001
// if(div == 1 && divNext == 3){
// binCode.append("0");
// }else if(div == 3 && divNext == 1){
// binCode.append("1");
// }else{
// qDebug() << "ERROR: could not read code...error in transmission";
// return;
// }
// }
// //qDebug() << "raw data:" << rawData;
// qDebug() << "bin CODE :" << binCode;
// QStringList byteList;
// for(int i = 4; i <= 24; i+=4){
// byteList.append(binCode.left(4));
// binCode = binCode.right(binCode.length() -4);
// }
// qDebug() << byteList;
// }else{
// // #########################################################################
// qDebug() << "-----------------------------------------------------------";
// qDebug() << " seems to be a GENERIC signal";
// qDebug() << "-----------------------------------------------------------";
// qDebug() << "delay :" << delay;
// qDebug() << "bits : " << signalCount-1;
// QList <int> rawData;
// QFile file("/root/rc433_log_data.ods");
// file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
// QTextStream out(&file);
// for(int i = 0; i < signalCount; i+=1 ){
// out << timings[i] << ",";
// rawData.append(timings[i]);
// }
// out << ";\n";
// file.close();
// qDebug() << "raw data:" << rawData;
// }
//}
//float RadioReciver::parseTemperature(QByteArray codeBin)
//{
// // { ID },{-+}{ temp, },{Batt},{,temp}
// // "XXXX","XXXX","X XXX","XXXX","XXXX","XXXX",
// QList<QByteArray> byteList;
// for(int i = 4; i <= 24; i+=4){
// byteList.append(codeBin.left(4));
// codeBin = codeBin.right(codeBin.length() -4);
// }
// qDebug() << byteList;
// QByteArray temperatureBin(byteList.at(2) + byteList.at(3));
// QByteArray batteryBin(byteList.at(4));
// QByteArray temperatureTenthBin(byteList.at(5));
// // check sign of temperature -> if first bit of temperature byte is 1 -> temp is negativ
// int sign = 0;
// if(temperatureBin.left(1).toInt() == 1){
// sign = -1;
// }else{
// sign = 1;
// }
// //qDebug() << temperatureBin << "=" << temperatureBin.left(1) << temperatureBin.right(7) << temperatureBin.right(7).toInt(0,2) << "," << temperatureTenthBin.toInt(0,2) ;
// // calc temperature
// float temperature = sign*(temperatureBin.right(7).toInt(0,2) + (float)temperatureTenthBin.toInt(0,2)/10);
// // check if the battery is low
// QString batteryStatus;
// if(batteryBin.toInt(0,2) == 0){
// batteryStatus = "ok";
// }else{
// batteryStatus = "low";
// }
// qDebug() << "Temperature:" << temperature << "Battery: " << batteryStatus;
// if(temperature == lastTemperature){
// return temperature;
// }else{
// lastTemperature = temperature;
// QString timeStamp = QDateTime::currentDateTime().toString("dd.MM.yyyy, hh:mm");;
// qDebug() << timeStamp;
// QFile file("/root/temperature_log.ods");
// file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
// QTextStream out(&file);
// out << timeStamp << "," << temperature << "," << batteryStatus << "\n";
// file.close();
// }
// return temperature;
//}
void RadioReciver::enableReceiver()
{
// check if we have all needed info...pin, freq...

View File

@ -4,6 +4,8 @@
#define RC_MAX_CHANGES 49
#include <QObject>
#include "radio/plugins/rfthermometer.h"
#include "radio/plugins/rfswitch.h"
class ISRHandler;
@ -28,7 +30,6 @@ public:
private:
void handleInterrupt();
void detectProtocol(QList<int> rawData);
float parseTemperature(QByteArray codeBin);
bool m_enable;
int m_pin;
@ -39,8 +40,13 @@ private:
unsigned long m_lastTime;
unsigned int m_repeatCount;
RFThermometer *m_thermometer;
RFSwitch *m_switch;
signals:
void temperatureSignalReceived(const QByteArray &id, const float &temperature, const bool &batteryStatus);
void switchSignalReceived(const QByteArray &channel, const char &button, const bool &buttonStatus);
public slots:
void enableReceiver();
void disableReceiver();