From 4f3d1c7f831726579cfcb42c1d7da2bf8703c3a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Tue, 31 Dec 2013 02:11:18 +0100 Subject: [PATCH] rf remote mumbi added --- libhive/gpio.cpp | 7 +- libhive/radio433.cpp | 19 +-- libhive/radio433.h | 4 - plugins/deviceplugins/rfswitch/rfswitch.cpp | 126 ++++++++++++++++---- 4 files changed, 109 insertions(+), 47 deletions(-) diff --git a/libhive/gpio.cpp b/libhive/gpio.cpp index 135d492e..b0b731d0 100644 --- a/libhive/gpio.cpp +++ b/libhive/gpio.cpp @@ -22,9 +22,13 @@ void Gpio::run() int timeout = 3000; char buf[64]; - bool enabled = true; + m_mutex.lock(); + m_enabled = true; + m_mutex.unlock(); + + while(enabled){ memset((void*)fdset, 0, sizeof(fdset)); fdset[0].fd = STDIN_FILENO; @@ -46,7 +50,6 @@ void Gpio::run() read(fdset[1].fd, buf, 64); emit pinInterrupt(); } - m_mutex.lock(); enabled = m_enabled; m_mutex.unlock(); diff --git a/libhive/radio433.cpp b/libhive/radio433.cpp index f2d4ca57..2cf8a62b 100644 --- a/libhive/radio433.cpp +++ b/libhive/radio433.cpp @@ -30,7 +30,7 @@ Radio433::~Radio433() void Radio433::sendData(QList rawData) { - //first we have to disable our receiver, to prevent reading the hive signal it self + //first we have to disable our receiver, to prevent reading this signal m_receiver->stop(); m_transmitter->setValue(LOW); @@ -43,7 +43,7 @@ void Radio433::sendData(QList rawData) delayMicroseconds(delay); } - // reenable it + // re-enable it m_receiver->start(); } @@ -92,6 +92,7 @@ void Radio433::handleInterrupt() // filter nois if (m_duration > 5000 && m_duration > m_timings[0] - 200 && m_duration < m_timings[0] + 200) { + m_repeatCount++; m_changeCount--; @@ -119,22 +120,10 @@ void Radio433::handleInterrupt() }else if(m_duration > 5000){ m_changeCount = 0; } - if (m_changeCount > RC_MAX_CHANGES) { + if (m_changeCount >= RC_MAX_CHANGES+1) { m_changeCount = 0; m_repeatCount = 0; } m_timings[m_changeCount++] = m_duration; m_lastTime = currentTime; } - -void Radio433::enableReceiver() -{ - qDebug() << "starting receiver"; - m_receiver->start(); -} - -void Radio433::disableReceiver() -{ - m_receiver->stop(); - qDebug() << "receiver disabeld."; -} diff --git a/libhive/radio433.h b/libhive/radio433.h index af5ee1e0..e607fb89 100644 --- a/libhive/radio433.h +++ b/libhive/radio433.h @@ -32,10 +32,6 @@ private: int micros(); void delayMicroseconds(int pulseLength); - void enableReceiver(); - void disableReceiver(); - - private slots: void handleInterrupt(); diff --git a/plugins/deviceplugins/rfswitch/rfswitch.cpp b/plugins/deviceplugins/rfswitch/rfswitch.cpp index 28da06de..bc097d96 100644 --- a/plugins/deviceplugins/rfswitch/rfswitch.cpp +++ b/plugins/deviceplugins/rfswitch/rfswitch.cpp @@ -19,10 +19,10 @@ QList RfSwitch::supportedDevices() const { // TODO: load list from config with static uuid QList ret; - + DeviceClass deviceClassRfRemote(QUuid::createUuid()); - deviceClassRfRemote.setName("RF Remote"); - + deviceClassRfRemote.setName("RF Remote Mumba"); + QVariantList deviceParams; QVariantMap channelParam; channelParam.insert("name", "channel"); @@ -36,51 +36,51 @@ QList RfSwitch::supportedDevices() const channelParam.insert("name", "channel5"); channelParam.insert("type", "bool"); deviceParams.append(channelParam); - + deviceClassRfRemote.setParams(deviceParams); - + QList buttonTriggers; - + QVariantList params; QVariantMap param; param.insert("name", "power"); param.insert("type", "bool"); params.append(param); - + TriggerType buttonATrigger(QUuid::createUuid()); buttonATrigger.setName("Button A"); buttonATrigger.setParameters(params); buttonTriggers.append(buttonATrigger); - + TriggerType buttonBTrigger(QUuid::createUuid()); buttonBTrigger.setName("Button B"); buttonBTrigger.setParameters(params); buttonTriggers.append(buttonBTrigger); - + TriggerType buttonCTrigger(QUuid::createUuid()); buttonCTrigger.setName("Button C"); buttonCTrigger.setParameters(params); buttonTriggers.append(buttonCTrigger); - + TriggerType buttonDTrigger(QUuid::createUuid()); buttonDTrigger.setName("Button D"); buttonDTrigger.setParameters(params); buttonTriggers.append(buttonDTrigger); - + TriggerType buttonETrigger(QUuid::createUuid()); buttonETrigger.setName("Button E"); buttonETrigger.setParameters(params); buttonTriggers.append(buttonETrigger); - + deviceClassRfRemote.setTriggers(buttonTriggers); - + ret.append(deviceClassRfRemote); - - + + DeviceClass deviceClassRfSwitch(QUuid::createUuid()); deviceClassRfSwitch.setName("RF Switch"); ret.append(deviceClassRfSwitch); - + return ret; } @@ -90,16 +90,90 @@ QString RfSwitch::pluginName() const } void RfSwitch::dataReceived(QList rawData) -{ - qDebug() << "data received from Radio433" << rawData; +{ + // filter right here a wrong signal length + if(rawData.length() != 49){ + return; + } + + int delay = rawData.first()/31; + QByteArray binCode; + + // new Remote -> average 314 + if(delay > 300 && delay < 400){ + // go trough all 48 timings (without sync signal) + for(int i = 1; i <= 48; i+=2 ){ + int div; + int divNext; + + // if short + if(rawData.at(i) < 700){ + div = 1; + }else{ + div = 3; + } + // if long + if(rawData.at(i+1) < 700){ + 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; + } + } + } + qDebug() << "bincode" << binCode; - // TODO: Lets assume we found a device of class "deviceClassRfRemote" - DeviceClass deviceClassRfRemote = supportedDevices().first(); - // TODO: Lets assume we received group "1000" + // get the channel of the remote signal (5 channels, true=1, false=0) QList group; - group << true << false << false << false << false; + for(int i = 1; i < 10; i+=2){ + if(binCode.at(i-1) == '0' && binCode.at(i) == '1'){ + group << false; + }else if(binCode.at(i-1) == '0' && binCode.at(i) == '0'){ + group << true; + }else { + return; + } + } + //qDebug() << "group" << group; + + // get the button letter + QString button; + QByteArray buttonCode = binCode.mid(10,10); + qDebug() << "Buttoncode -> " << buttonCode; + if(buttonCode == "0001010101"){ + button = "A"; + }else if(buttonCode == "0100010101"){ + button = "B"; + }else if(buttonCode == "0101000101"){ + button = "C"; + }else if(buttonCode == "0101010001"){ + button = "D"; + }else if(buttonCode == "0101010100"){ + button = "E"; + }else{ + return; + } + + DeviceClass deviceClassRfRemote = supportedDevices().first(); + + // // TODO: Lets assume we received group "1000" + // QList group; + // group << true << false << false << false << false; + Device *device = 0; QList deviceList = deviceManager()->findConfiguredDevices(deviceClassRfRemote); foreach (Device *dev, deviceList) { @@ -115,14 +189,14 @@ void RfSwitch::dataReceived(QList rawData) } } if (!device) { - qWarning() << "couldn't find any configured device for data:" << rawData; + //qWarning() << "couldn't find any configured device for data:" << rawData; return; } - + // TODO: Lets assume we received button "A" "on" - QString button = "A"; + // QString button = "A"; bool power = true; - + QVariantMap params; params.insert("button", button); params.insert("power", power);