brennenstuhl autodetection added
This commit is contained in:
parent
b45702ca37
commit
a4cb391374
@ -59,7 +59,7 @@ bool Gpio::exportGpio()
|
|||||||
|
|
||||||
int fd = open("/sys/class/gpio/export", O_WRONLY);
|
int fd = open("/sys/class/gpio/export", O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
qDebug() << "ERROR: could not open /sys/class/gpio/export";
|
//qDebug() << "ERROR: could not open /sys/class/gpio/export";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ bool Gpio::unexportGpio()
|
|||||||
|
|
||||||
int fd = open("/sys/class/gpio/unexport", O_WRONLY);
|
int fd = open("/sys/class/gpio/unexport", O_WRONLY);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
qDebug() << "ERROR: could not open /sys/class/gpio/unexport";
|
//qDebug() << "ERROR: could not open /sys/class/gpio/unexport";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -49,16 +49,16 @@ bool Radio433::enable()
|
|||||||
m_brennenstuhlTransmitter->enable();
|
m_brennenstuhlTransmitter->enable();
|
||||||
|
|
||||||
bool receiverAvailable = m_receiver->startReceiver();
|
bool receiverAvailable = m_receiver->startReceiver();
|
||||||
if(!receiverAvailable){
|
if (!receiverAvailable) {
|
||||||
//qWarning() << "ERROR: radio 433 MHz receiver not available on GPIO's";
|
//qWarning() << "ERROR: radio 433 MHz receiver not available on GPIO's";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool transmitterAvailable = m_transmitter->startTransmitter();
|
bool transmitterAvailable = m_transmitter->startTransmitter();
|
||||||
if(!transmitterAvailable){
|
if (!transmitterAvailable) {
|
||||||
//qWarning() << "ERROR: radio 433 MHz transmitter not available on GPIO's";
|
//qWarning() << "ERROR: radio 433 MHz transmitter not available on GPIO's";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!receiverAvailable && !transmitterAvailable){
|
if (!receiverAvailable && !transmitterAvailable) {
|
||||||
qWarning() << "--> Radio 433 MHz GPIO's not available.";
|
qWarning() << "--> Radio 433 MHz GPIO's not available.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -69,7 +69,7 @@ bool Radio433::enable()
|
|||||||
bool Radio433::disabel()
|
bool Radio433::disabel()
|
||||||
{
|
{
|
||||||
m_brennenstuhlTransmitter->disable();
|
m_brennenstuhlTransmitter->disable();
|
||||||
if(m_receiver->stopReceiver()){
|
if (m_receiver->stopReceiver()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@ -77,18 +77,18 @@ bool Radio433::disabel()
|
|||||||
|
|
||||||
void Radio433::readingChanged(bool reading)
|
void Radio433::readingChanged(bool reading)
|
||||||
{
|
{
|
||||||
if(reading){
|
if (reading) {
|
||||||
m_transmitter->allowSending(false);
|
m_transmitter->allowSending(false);
|
||||||
}else{
|
} else {
|
||||||
m_transmitter->allowSending(true);
|
m_transmitter->allowSending(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Radio433::brennenstuhlAvailableChanged()
|
void Radio433::brennenstuhlAvailableChanged(const bool &available)
|
||||||
{
|
{
|
||||||
if(m_brennenstuhlTransmitter->available()){
|
if (available) {
|
||||||
qDebug() << "--> Radio 433 MHz Brennenstuhl LAN Gateway available.";
|
qDebug() << "--> Radio 433 MHz Brennenstuhl LAN Gateway available.";
|
||||||
}else{
|
} else {
|
||||||
qDebug() << "--> Radio 433 MHz Brennenstuhl LAN Gateway NOT available.";
|
qDebug() << "--> Radio 433 MHz Brennenstuhl LAN Gateway NOT available.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,11 +98,11 @@ bool Radio433::sendData(int delay, QList<int> rawData)
|
|||||||
bool sendGpio = false;
|
bool sendGpio = false;
|
||||||
bool sendBrennenstuhl = false;
|
bool sendBrennenstuhl = false;
|
||||||
|
|
||||||
if(m_brennenstuhlTransmitter->available()){
|
if (m_brennenstuhlTransmitter->available()) {
|
||||||
sendBrennenstuhl = m_brennenstuhlTransmitter->sendData(delay, rawData);
|
sendBrennenstuhl = m_brennenstuhlTransmitter->sendData(delay, rawData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_transmitter->available()){
|
if (m_transmitter->available()) {
|
||||||
m_transmitter->sendData(delay, rawData);
|
m_transmitter->sendData(delay, rawData);
|
||||||
sendGpio = true;
|
sendGpio = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,7 +46,7 @@ signals:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void readingChanged(bool reading);
|
void readingChanged(bool reading);
|
||||||
void brennenstuhlAvailableChanged();
|
void brennenstuhlAvailableChanged(const bool &available);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
bool sendData(int delay, QList<int> rawData);
|
bool sendData(int delay, QList<int> rawData);
|
||||||
|
|||||||
@ -21,76 +21,87 @@
|
|||||||
Radio433BrennenstuhlGateway::Radio433BrennenstuhlGateway(QObject *parent) :
|
Radio433BrennenstuhlGateway::Radio433BrennenstuhlGateway(QObject *parent) :
|
||||||
QObject(parent)
|
QObject(parent)
|
||||||
{
|
{
|
||||||
m_gatewayDiscovery = new QUdpSocket(this);
|
// UDP socket for discovering...
|
||||||
m_gateway = new QUdpSocket(this);
|
|
||||||
|
|
||||||
// connect(m_gateway, &QAbstractSocket::error, this, &Radio433BrennenstuhlGateway::gatewayError) -> does not work...runtime connection error.
|
// UDP socket to sending data to gateway
|
||||||
|
m_gateway = new QUdpSocket(this);
|
||||||
|
connect(m_gateway, &QUdpSocket::readyRead, this, &Radio433BrennenstuhlGateway::readDataDiscovery);
|
||||||
connect(m_gateway, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(gatewayError(QAbstractSocket::SocketError)));
|
connect(m_gateway, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(gatewayError(QAbstractSocket::SocketError)));
|
||||||
|
|
||||||
m_available = false;
|
// Timer for discovery of the Gateway
|
||||||
|
m_discoverTimer = new QTimer(this);
|
||||||
|
m_discoverTimer->setInterval(2000);
|
||||||
|
connect(m_discoverTimer, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::discover);
|
||||||
|
|
||||||
// TODO: maby enable or disable hardware search if the usern knows that he has not this gateway...
|
// Timer to detect discovery timeout
|
||||||
// TODO: auto rediscover if lost connection
|
m_timeout = new QTimer(this);
|
||||||
|
m_timeout->setSingleShot(true);
|
||||||
|
m_timeout->setInterval(1000);
|
||||||
|
connect(m_timeout, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Radio433BrennenstuhlGateway::sendData(int delay, QList<int> rawData)
|
bool Radio433BrennenstuhlGateway::sendData(int delay, QList<int> rawData)
|
||||||
{
|
{
|
||||||
if(m_gateway){
|
QByteArray data;
|
||||||
QByteArray data;
|
QByteArray message;
|
||||||
QByteArray message;
|
|
||||||
|
|
||||||
// bring rawData list to a single ByteArray, values separated by ','
|
// bring rawData list to a single ByteArray, values separated by ','
|
||||||
foreach (int value, rawData) {
|
foreach (int value, rawData) {
|
||||||
data.append(QString::number(value) + ",");
|
data.append(QString::number(value) + ",");
|
||||||
}
|
|
||||||
|
|
||||||
/* Protocol:
|
|
||||||
* Elro Example
|
|
||||||
* "TXP:0,0,10,0,350,25, 1,31,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,1,3,1,3,3,1,1,3,3,1,1,3,3,1,1,3,1,3,1,3,3,1, ;"
|
|
||||||
*
|
|
||||||
* TXP: | send command
|
|
||||||
* 0,0 | unknown
|
|
||||||
* 10, | repeatings of command
|
|
||||||
* 0 | pause between 2 commands [us]
|
|
||||||
* 350 | delayLength [us]
|
|
||||||
* 25 | number of bits to send (2 sync timings + 48 data timings = 50 timongis ..... 1 bit = 2 timings -> 25 bit)
|
|
||||||
* 1,3,3,...| pulse data starting with HIGH (1* delayLength HIGH, 3 * delayLength LOW ....)
|
|
||||||
* ; | end of command
|
|
||||||
*/
|
|
||||||
|
|
||||||
message.append("TXP:0,0,10,0," + QString::number(delay) + "," + QString::number(rawData.count()/2) + "," + data + ";");
|
|
||||||
|
|
||||||
if(m_gateway->writeDatagram(message,m_gatewayAddress,m_gatewayPort) > 0){
|
|
||||||
m_available = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
/* Protocol:
|
||||||
|
* Elro Example
|
||||||
|
* "TXP:0,0,10,0,350,25, 1,31,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,1,3,1,3,3,1,1,3,3,1,1,3,3,1,1,3,1,3,1,3,3,1, ;"
|
||||||
|
*
|
||||||
|
* TXP: | send command
|
||||||
|
* 0,0 | unknown
|
||||||
|
* 10, | repeatings of command
|
||||||
|
* 0 | pause between 2 commands [us]
|
||||||
|
* 350 | delayLength [us]
|
||||||
|
* 25 | number of bits to send (2 sync timings + 48 data timings = 50 timongis ..... 1 bit = 2 timings -> 25 bit)
|
||||||
|
* 1,3,3,...| pulse data starting with HIGH (1* delayLength HIGH, 3 * delayLength LOW ....)
|
||||||
|
* ; | end of command
|
||||||
|
*/
|
||||||
|
|
||||||
|
message.append("TXP:0,0,10,0," + QString::number(delay) + "," + QString::number(rawData.count()/2) + "," + data + ";");
|
||||||
|
|
||||||
|
if (m_gateway->writeDatagram(message, m_gatewayAddress, m_gatewayPort) > 0) {
|
||||||
|
m_available = true;
|
||||||
|
} else {
|
||||||
|
m_available = false;
|
||||||
|
emit availableChanged(false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Radio433BrennenstuhlGateway::enable()
|
bool Radio433BrennenstuhlGateway::enable()
|
||||||
{
|
{
|
||||||
if(!m_gatewayDiscovery->bind(49880, QUdpSocket::ShareAddress)){
|
m_available = false;
|
||||||
|
|
||||||
|
if (!m_gateway->bind(49880, QUdpSocket::ShareAddress)) {
|
||||||
qWarning() << "ERROR: Radio 433 MHz Brennenstuhl LAN Gateway discovery could not bind to port 49880";
|
qWarning() << "ERROR: Radio 433 MHz Brennenstuhl LAN Gateway discovery could not bind to port 49880";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
connect(m_gatewayDiscovery, &QUdpSocket::readyRead, this, &Radio433BrennenstuhlGateway::readDataDiscovery);
|
|
||||||
|
|
||||||
discover();
|
discover();
|
||||||
|
m_discoverTimer->start();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Radio433BrennenstuhlGateway::disable()
|
bool Radio433BrennenstuhlGateway::disable()
|
||||||
{
|
{
|
||||||
|
m_discoverTimer->stop();
|
||||||
m_gateway->close();
|
m_gateway->close();
|
||||||
m_gatewayDiscovery->close();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Radio433BrennenstuhlGateway::discover()
|
void Radio433BrennenstuhlGateway::discover()
|
||||||
{
|
{
|
||||||
// send search string to broadcast over port 49880
|
// send search string to broadcast over port 49880
|
||||||
m_gatewayDiscovery->writeDatagram("SEARCH HCGW", QHostAddress::Broadcast, 49880);
|
m_gateway->writeDatagram("SEARCH HCGW", QHostAddress::Broadcast, 49880);
|
||||||
|
m_timeout->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Radio433BrennenstuhlGateway::available()
|
bool Radio433BrennenstuhlGateway::available()
|
||||||
@ -98,24 +109,6 @@ bool Radio433BrennenstuhlGateway::available()
|
|||||||
return m_available;
|
return m_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Radio433BrennenstuhlGateway::gatewayDiscovered(QHostAddress address, int port)
|
|
||||||
{
|
|
||||||
m_gatewayAddress = address;
|
|
||||||
m_gatewayPort = port;
|
|
||||||
|
|
||||||
if(!m_gateway->bind(m_gatewayPort,QUdpSocket::ShareAddress)){
|
|
||||||
qWarning() << "ERROR: Radio 433 MHz Brennenstuhl LAN Gateway could not bind to port " << m_gatewayPort;
|
|
||||||
m_available = false;
|
|
||||||
emit availableChanged();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_available = true;
|
|
||||||
emit availableChanged();
|
|
||||||
|
|
||||||
connect(m_gateway, &QUdpSocket::readyRead, this, &Radio433BrennenstuhlGateway::readDataGateway);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Radio433BrennenstuhlGateway::readDataDiscovery()
|
void Radio433BrennenstuhlGateway::readDataDiscovery()
|
||||||
{
|
{
|
||||||
QByteArray data;
|
QByteArray data;
|
||||||
@ -123,27 +116,17 @@ void Radio433BrennenstuhlGateway::readDataDiscovery()
|
|||||||
quint16 port;
|
quint16 port;
|
||||||
|
|
||||||
// read the answere from the
|
// read the answere from the
|
||||||
while (m_gatewayDiscovery->hasPendingDatagrams()) {
|
|
||||||
data.resize(m_gatewayDiscovery->pendingDatagramSize());
|
|
||||||
m_gatewayDiscovery->readDatagram(data.data(), data.size(), &address, &port);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(data.startsWith("HCGW:")){
|
|
||||||
// qDebug() << "found Brennenstuhl LAN gateway: " << address.toString() << port;
|
|
||||||
gatewayDiscovered(address,port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Radio433BrennenstuhlGateway::readDataGateway()
|
|
||||||
{
|
|
||||||
QByteArray data;
|
|
||||||
QHostAddress sender;
|
|
||||||
quint16 udpPort;
|
|
||||||
|
|
||||||
// read the answere from the gateway
|
|
||||||
while (m_gateway->hasPendingDatagrams()) {
|
while (m_gateway->hasPendingDatagrams()) {
|
||||||
data.resize(m_gateway->pendingDatagramSize());
|
data.resize(m_gateway->pendingDatagramSize());
|
||||||
m_gateway->readDatagram(data.data(), data.size(), &sender, &udpPort);
|
m_gateway->readDatagram(data.data(), data.size(), &address, &port);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.startsWith("HCGW:")) {
|
||||||
|
m_timeout->stop();
|
||||||
|
if (!m_available) {
|
||||||
|
m_available = true;
|
||||||
|
emit availableChanged(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,6 +134,17 @@ void Radio433BrennenstuhlGateway::gatewayError(QAbstractSocket::SocketError erro
|
|||||||
{
|
{
|
||||||
Q_UNUSED(error)
|
Q_UNUSED(error)
|
||||||
QUdpSocket *gateway = static_cast<QUdpSocket*>(sender());
|
QUdpSocket *gateway = static_cast<QUdpSocket*>(sender());
|
||||||
qDebug() << "--> ERROR: Radio 433 MHz Brennenstuhl LAN Gateway disabled: " << gateway->errorString();
|
qWarning() << "--> ERROR: Radio 433 MHz Brennenstuhl LAN Gateway socket error: " << gateway->errorString();
|
||||||
m_available = false;
|
if (m_available) {
|
||||||
|
m_available = false;
|
||||||
|
emit availableChanged(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Radio433BrennenstuhlGateway::timeout()
|
||||||
|
{
|
||||||
|
if (m_available) {
|
||||||
|
m_available = false;
|
||||||
|
emit availableChanged(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QUdpSocket>
|
#include <QUdpSocket>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
class Radio433BrennenstuhlGateway : public QObject
|
class Radio433BrennenstuhlGateway : public QObject
|
||||||
{
|
{
|
||||||
@ -36,23 +37,23 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_available;
|
bool m_available;
|
||||||
QUdpSocket *m_gatewayDiscovery;
|
|
||||||
QUdpSocket *m_gateway;
|
QUdpSocket *m_gateway;
|
||||||
|
|
||||||
int m_gatewayPort;
|
int m_gatewayPort;
|
||||||
QHostAddress m_gatewayAddress;
|
QHostAddress m_gatewayAddress;
|
||||||
|
|
||||||
|
QTimer *m_discoverTimer;
|
||||||
|
QTimer *m_timeout;
|
||||||
|
|
||||||
void discover();
|
void discover();
|
||||||
void gatewayDiscovered(QHostAddress address, int port);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void availableChanged();
|
void availableChanged(const bool &available);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void readDataDiscovery();
|
void readDataDiscovery();
|
||||||
void readDataGateway();
|
|
||||||
void gatewayError(QAbstractSocket::SocketError error);
|
void gatewayError(QAbstractSocket::SocketError error);
|
||||||
|
void timeout();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RADIO433BRENNENSTUHLGATEWAY_H
|
#endif // RADIO433BRENNENSTUHLGATEWAY_H
|
||||||
|
|||||||
Reference in New Issue
Block a user