From 42027c8cd0f90da3ded4d5258562673c443a0058 Mon Sep 17 00:00:00 2001 From: Simon Stuerz Date: Sun, 18 Aug 2013 13:47:18 +0200 Subject: [PATCH] rc 433 receiver working lib added logWriter --- hive/client/client.pro | 1 + .../hive_client/qml/hive_client/main.qml | 23 ++- hive/libhive/libhive.pro | 6 +- hive/libhive/logwriter.cpp | 16 ++ hive/libhive/logwriter.h | 26 +++ hive/server/hive_pi/hive_pi.pro | 9 +- hive/server/hive_pi/hivecore.cpp | 33 +-- hive/server/hive_pi/hivecore.h | 5 +- hive/server/hive_pi/radio/radioreciver.cpp | 192 +++++++++++++++++- hive/server/hive_pi/radio/radioreciver.h | 12 ++ hive/server/hive_pi/radio/radiosender.cpp | 39 ++++ hive/server/hive_pi/radio/radiosender.h | 27 +++ 12 files changed, 347 insertions(+), 42 deletions(-) create mode 100644 hive/libhive/logwriter.cpp create mode 100644 hive/libhive/logwriter.h create mode 100644 hive/server/hive_pi/radio/radiosender.cpp create mode 100644 hive/server/hive_pi/radio/radiosender.h diff --git a/hive/client/client.pro b/hive/client/client.pro index 79d986b8..82f7e9e3 100644 --- a/hive/client/client.pro +++ b/hive/client/client.pro @@ -1,3 +1,4 @@ TEMPLATE = subdirs +CONFIG = ordered SUBDIRS += hive_client diff --git a/hive/client/hive_client/qml/hive_client/main.qml b/hive/client/hive_client/qml/hive_client/main.qml index 897812a6..fd7b366f 100644 --- a/hive/client/hive_client/qml/hive_client/main.qml +++ b/hive/client/hive_client/qml/hive_client/main.qml @@ -1,16 +1,23 @@ import QtQuick 2.0 +import QtQuick.Controls 1.0 +import QtQuick.Layouts 1.0 Rectangle { - width: 360 + id: mainWindow + //title: "Hive Client" + width: 500 height: 360 - Text { - text: qsTr("Hello World") + color: "#776262" + + RowLayout{ anchors.centerIn: parent - } - MouseArea { - anchors.fill: parent - onClicked: { - Qt.quit(); + Button{ + text: "Button 1" + } + Button{ + text: "Button 1" } } + + } diff --git a/hive/libhive/libhive.pro b/hive/libhive/libhive.pro index d281c021..6480c960 100644 --- a/hive/libhive/libhive.pro +++ b/hive/libhive/libhive.pro @@ -14,12 +14,14 @@ DEFINES += LIBHIVE_LIBRARY SOURCES += libhive.cpp \ server.cpp \ - devicemanager.cpp + devicemanager.cpp \ + logwriter.cpp HEADERS += libhive.h\ libhive_global.h \ server.h \ - devicemanager.h + devicemanager.h \ + logwriter.h #unix:!symbian { # maemo5 { diff --git a/hive/libhive/logwriter.cpp b/hive/libhive/logwriter.cpp new file mode 100644 index 00000000..c71c1e5f --- /dev/null +++ b/hive/libhive/logwriter.cpp @@ -0,0 +1,16 @@ +#include "logwriter.h" +#include +#include + +LogWriter::LogWriter(QObject *parent) : + QObject(parent) +{ +} + +void LogWriter::write(LogWriter::MessageType messageType, QString logMessage) +{ + QString timeStamp = QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm");; + qDebug() << timeStamp; + + +} diff --git a/hive/libhive/logwriter.h b/hive/libhive/logwriter.h new file mode 100644 index 00000000..bbcd4d0d --- /dev/null +++ b/hive/libhive/logwriter.h @@ -0,0 +1,26 @@ +#ifndef LOGWRITER_H +#define LOGWRITER_H + +#include +#include + +class LogWriter : public QObject +{ + Q_OBJECT +public: + explicit LogWriter(QObject *parent = 0); + enum MessageType{ + INFO = 0x1, + ERROR = 0x2 + }; + + + +signals: + +public slots: + void write(MessageType messageType, QString logMessage); + +}; + +#endif // LOGWRITER_H diff --git a/hive/server/hive_pi/hive_pi.pro b/hive/server/hive_pi/hive_pi.pro index 6acb8163..e28f4b70 100644 --- a/hive/server/hive_pi/hive_pi.pro +++ b/hive/server/hive_pi/hive_pi.pro @@ -19,7 +19,8 @@ TEMPLATE = app LIBS += -L$$OUT_PWD/../../libhive/ -llibhive -LIBS += -L/home/timon/opt/rasp-pi-rootfs/usr/local/lib -lwiringPi +LIBS += -L$$RPI_SYSROOT/usr/local/lib -lwiringPi + INCLUDEPATH += /home/timon/opt/rasp-pi-rootfs/usr/local/include INCLUDEPATH += $$PWD/../../libhive @@ -27,9 +28,11 @@ DEPENDPATH += $$PWD/../../libhive SOURCES += main.cpp \ hivecore.cpp \ - radio/radioreciver.cpp + radio/radioreciver.cpp \ + radio/radiosender.cpp HEADERS += \ hivecore.h \ - radio/radioreciver.h + radio/radioreciver.h \ + radio/radiosender.h diff --git a/hive/server/hive_pi/hivecore.cpp b/hive/server/hive_pi/hivecore.cpp index 187c94a2..4382e211 100644 --- a/hive/server/hive_pi/hivecore.cpp +++ b/hive/server/hive_pi/hivecore.cpp @@ -1,36 +1,19 @@ #include "hivecore.h" +#include HiveCore::HiveCore(QObject *parent) : QObject(parent) { + // start the server m_server = new Server(this); m_server->startServer(); + m_sender = new RadioSender(this); + + m_reciver = new RadioReciver(this); + m_reciver->setFrequence(RadioReciver::RC433MHz); + m_reciver->enableReceiver(); + DeviceManager deviceManager; - deviceManager.saveDeviceValue("sensor","light","A-ON",1361); - deviceManager.saveDeviceValue("sensor","light","A-OFF",1364); - deviceManager.saveDeviceValue("sensor","light","B-ON",4433); - deviceManager.saveDeviceValue("sensor","light","B-OFF",4436); - deviceManager.saveDeviceValue("sensor","light","C-ON",5393); - deviceManager.saveDeviceValue("sensor","light","C-OFF",5204); - deviceManager.saveDeviceValue("sensor","light","D-ON",5393); - deviceManager.saveDeviceValue("sensor","light","D-OFF",5396); - deviceManager.saveDeviceValue("sensor","weatherStation","temperature",20); - deviceManager.saveDeviceValue("sensor","weatherStation","humidity",20); - - - deviceManager.saveDeviceValue("actor","window","open",true); - deviceManager.saveDeviceValue("actor","door","open",false); - - qDebug() << "get sensors" << deviceManager.getDevices("sensor"); - qDebug() << "get actors" << deviceManager.getDevices("actor"); - qDebug() << "get light keys" << deviceManager.getDeviceKeys("sensor","light"); - qDebug() << "get weatherStation keys" << deviceManager.getDeviceKeys("sensor","weatherStation"); - - deviceManager.deleteDeviceValue("sensor","light","C-OFF"); - qDebug() << "get light keys" << deviceManager.getDeviceKeys("sensor","light"); - deviceManager.deleteDevice("sensor","weatherStation"); - qDebug() << "get sensors" << deviceManager.getDevices("sensor"); - } diff --git a/hive/server/hive_pi/hivecore.h b/hive/server/hive_pi/hivecore.h index c723516d..4d5cc132 100644 --- a/hive/server/hive_pi/hivecore.h +++ b/hive/server/hive_pi/hivecore.h @@ -4,6 +4,8 @@ #include #include "server.h" #include "devicemanager.h" +#include "radio/radioreciver.h" +#include "radio/radiosender.h" class HiveCore : public QObject { @@ -13,7 +15,8 @@ public: private: Server *m_server; - + RadioReciver *m_reciver; + RadioSender *m_sender; signals: public slots: diff --git a/hive/server/hive_pi/radio/radioreciver.cpp b/hive/server/hive_pi/radio/radioreciver.cpp index 7c9238ab..aae99856 100644 --- a/hive/server/hive_pi/radio/radioreciver.cpp +++ b/hive/server/hive_pi/radio/radioreciver.cpp @@ -1,15 +1,201 @@ #include "radioreciver.h" #include "wiringPi.h" +#include #include +#include + +static bool m_enable = false; +static unsigned int timings[RC_MAX_CHANGES]; +static unsigned long m_receivedValue; +static unsigned int m_receivedBitlength; +static unsigned int m_receivedDelay; +static unsigned int m_receiveToleranceThermometer; +static unsigned int m_receiveToleranceRemote; RadioReciver::RadioReciver(QObject *parent) : QObject(parent) { - pinMode(2,INPUT); - wiringPiISR(2, INT_EDGE_BOTH, &handleInterrupt); + m_receivedBitlength = 0; + m_receivedDelay = 0; + m_receivedValue = 0; + m_receiveToleranceThermometer = 10; + m_receiveToleranceRemote = 60; } void RadioReciver::handleInterrupt() { - qDebug() << "interrupt"; + if(!m_enable){ + return; + } + + static unsigned int duration; + static unsigned int changeCount; + static unsigned long lastTime; + static unsigned int repeatCount; + + long time = micros(); + duration = time - lastTime; + + // filter nois + if (duration > 5000 && duration > timings[0] - 200 && duration < timings[0] + 200) { + repeatCount++; + changeCount--; + //qDebug() << "change count" << changeCount; + + if(repeatCount == 2) { + //qDebug() << "got a pulse with pulselength:" << duration; + detectProtocol(changeCount); + + for(int i = 0; i < RC_MAX_CHANGES; i++ ){ + timings[i] = 0; + } + + repeatCount = 0; + } + changeCount = 0; + + }else if(duration > 5000){ + changeCount = 0; + } + if (changeCount >= RC_MAX_CHANGES) { + changeCount = 0; + repeatCount = 0; + } + timings[changeCount++] = duration; + lastTime = time; +} + +void RadioReciver::detectProtocol(int signalCount) +{ + qDebug() << "-----------------------------------------------------------"; + //qDebug() << "detect protocoll"; + unsigned long delay = timings[0] / 31; + //qDebug() << "delay:" << delay; + + // ######################################################################### + // if(delay > 250 && delay < 260){ + + // QFile file("/root/data.ods"); + // file.open(QIODevice::WriteOnly | QIODevice::Text); + + // for(int i = 0; i <= 48; i++){ + // //file.write << timings[i] << ";\n"; + // } + + // file.close(); + // qDebug() << "-------> got TERMOMETER signal"; + + // QString code = 0; + + // unsigned long delayTolerance = delay * m_receiveToleranceThermometer * 0.01; + // qDebug() << "delay:" << delay << "=" << timings[0] << "/31" << " delayTolerance = " << delayTolerance << " , signals = " << changeCount; + + // return; + // } + + // ######################################################################### + if(delay > 310 && delay < 320){ + + qDebug() << "-------> got REMOTE Signal"; + qDebug() << "delay:" << delay << " bits = " << signalCount-1; + + QString binCode; + QList 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 + // _ + // if we have ___| | = 1 -> in 4 delays + + if(div == 1 && divNext == 3){ + binCode.append("0"); + }else if(div == 3 && divNext == 1){ + binCode.append("1"); + }else{ + //qDebug() << "could not read code...error in transmission"; + } + } + + + qDebug() << "raw data:" << rawData; + qDebug() << "bin CODE:" << binCode; + qDebug() << "dec CODE:" << binCode; + qDebug() << "hex CODE:" << binCode; + + }else{ + // ######################################################################### + qDebug() << "-------> got GENERIC Signal"; + + unsigned long delayTolerance = delay * m_receiveToleranceRemote * 0.01; + qDebug() << "delay:" << delay << " bits = " << signalCount-1; + + QString binCode; + QList 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] << ","; + } + out << ";\n"; + file.close(); + + // go trough all 48 timings + for(int i = 0; i <= 48; i+=1 ){ + rawData.append(timings[i]); + rawData.append(timings[i+1]); + } + + qDebug() << "raw data:" << rawData; + + } +} + +void RadioReciver::enableReceiver() +{ + m_enable = true; +} + +void RadioReciver::disableReceiver() +{ + m_enable = false; +} + +void RadioReciver::setFrequence(RadioReciver::Frequenze frequenze) +{ + if(frequenze == RadioReciver::RC433MHz){ + if(wiringPiSetup() == -1){ + qDebug() << "ERROR: GPIO setup failed."; + } + qDebug() << "GPIO setup ok."; + pinMode(2,INPUT); + wiringPiISR(2, INT_EDGE_BOTH, &handleInterrupt); + } + if(frequenze == RadioReciver::RC868MHz){ + qDebug() << "ERROR: 868 MHz Module not connected yet"; + } + + } diff --git a/hive/server/hive_pi/radio/radioreciver.h b/hive/server/hive_pi/radio/radioreciver.h index f9292d37..2628b24d 100644 --- a/hive/server/hive_pi/radio/radioreciver.h +++ b/hive/server/hive_pi/radio/radioreciver.h @@ -1,6 +1,8 @@ #ifndef RADIORECIVER_H #define RADIORECIVER_H +#define RC_MAX_CHANGES 50 + #include class RadioReciver : public QObject @@ -9,12 +11,22 @@ class RadioReciver : public QObject public: explicit RadioReciver(QObject *parent = 0); + enum Frequenze{ + RC433MHz = 0x0, + RC868MHz = 0x1 + }; + private: static void handleInterrupt(); + static void detectProtocol(int signalCount); signals: public slots: + void enableReceiver(); + void disableReceiver(); + void setFrequence(Frequenze frequenze); + }; diff --git a/hive/server/hive_pi/radio/radiosender.cpp b/hive/server/hive_pi/radio/radiosender.cpp new file mode 100644 index 00000000..d4f82dc1 --- /dev/null +++ b/hive/server/hive_pi/radio/radiosender.cpp @@ -0,0 +1,39 @@ +#include "radiosender.h" + +#include +#include "wiringPi.h" + +RadioSender::RadioSender(QObject *parent) : + QObject(parent) +{ + m_pulseLength = 350; + +} + +void RadioSender::sendSync() +{ + +} + +void RadioSender::transmit(int high, int low) +{ + +} + +void RadioSender::sendBin(QString codeBin) +{ + + if(wiringPiSetup() == -1){ + qDebug() << "ERROR: GPIO setup failed."; + } + qDebug() << "GPIO setup ok."; + pinMode(0,OUTPUT); + + + +} + +void RadioSender::setPulseLength(int pulseLength) +{ + m_pulseLength = pulseLength; +} diff --git a/hive/server/hive_pi/radio/radiosender.h b/hive/server/hive_pi/radio/radiosender.h new file mode 100644 index 00000000..d012536b --- /dev/null +++ b/hive/server/hive_pi/radio/radiosender.h @@ -0,0 +1,27 @@ +#ifndef RADIOSENDER_H +#define RADIOSENDER_H + +#include + +class RadioSender : public QObject +{ + Q_OBJECT +public: + explicit RadioSender(QObject *parent = 0); + +private: + // [us] + int m_pulseLength; + + void sendSync(); + void transmit(int high, int low); + +signals: + +public slots: + void sendBin(QString codeBin); + void setPulseLength(int pulseLength); + +}; + +#endif // RADIOSENDER_H