diff --git a/libguh/hardware/gpio.cpp b/libguh/hardware/gpio.cpp index 2fe74dbd..eabeb89a 100644 --- a/libguh/hardware/gpio.cpp +++ b/libguh/hardware/gpio.cpp @@ -59,7 +59,7 @@ bool Gpio::exportGpio() int fd = open("/sys/class/gpio/export", O_WRONLY); if (fd < 0) { - qDebug() << "ERROR: could not open /sys/class/gpio/export"; + //qDebug() << "ERROR: could not open /sys/class/gpio/export"; return false; } @@ -80,7 +80,7 @@ bool Gpio::unexportGpio() int fd = open("/sys/class/gpio/unexport", O_WRONLY); if (fd < 0) { - qDebug() << "ERROR: could not open /sys/class/gpio/unexport"; + //qDebug() << "ERROR: could not open /sys/class/gpio/unexport"; return false; } diff --git a/libguh/hardware/radio433/radio433.cpp b/libguh/hardware/radio433/radio433.cpp index 994f3241..9de0e1bb 100644 --- a/libguh/hardware/radio433/radio433.cpp +++ b/libguh/hardware/radio433/radio433.cpp @@ -49,16 +49,16 @@ bool Radio433::enable() m_brennenstuhlTransmitter->enable(); bool receiverAvailable = m_receiver->startReceiver(); - if(!receiverAvailable){ + if (!receiverAvailable) { //qWarning() << "ERROR: radio 433 MHz receiver not available on GPIO's"; } bool transmitterAvailable = m_transmitter->startTransmitter(); - if(!transmitterAvailable){ + if (!transmitterAvailable) { //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."; return false; } @@ -69,7 +69,7 @@ bool Radio433::enable() bool Radio433::disabel() { m_brennenstuhlTransmitter->disable(); - if(m_receiver->stopReceiver()){ + if (m_receiver->stopReceiver()) { return true; } return false; @@ -77,18 +77,18 @@ bool Radio433::disabel() void Radio433::readingChanged(bool reading) { - if(reading){ + if (reading) { m_transmitter->allowSending(false); - }else{ + } else { 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."; - }else{ + } else { qDebug() << "--> Radio 433 MHz Brennenstuhl LAN Gateway NOT available."; } } @@ -98,11 +98,11 @@ bool Radio433::sendData(int delay, QList rawData) bool sendGpio = false; bool sendBrennenstuhl = false; - if(m_brennenstuhlTransmitter->available()){ + if (m_brennenstuhlTransmitter->available()) { sendBrennenstuhl = m_brennenstuhlTransmitter->sendData(delay, rawData); } - if(m_transmitter->available()){ + if (m_transmitter->available()) { m_transmitter->sendData(delay, rawData); sendGpio = true; } diff --git a/libguh/hardware/radio433/radio433.h b/libguh/hardware/radio433/radio433.h index 233ddc25..fdd502a9 100644 --- a/libguh/hardware/radio433/radio433.h +++ b/libguh/hardware/radio433/radio433.h @@ -46,7 +46,7 @@ signals: private slots: void readingChanged(bool reading); - void brennenstuhlAvailableChanged(); + void brennenstuhlAvailableChanged(const bool &available); public slots: bool sendData(int delay, QList rawData); diff --git a/libguh/hardware/radio433/radio433brennenstuhlgateway.cpp b/libguh/hardware/radio433/radio433brennenstuhlgateway.cpp index db0ffa30..04550bd9 100644 --- a/libguh/hardware/radio433/radio433brennenstuhlgateway.cpp +++ b/libguh/hardware/radio433/radio433brennenstuhlgateway.cpp @@ -21,76 +21,87 @@ Radio433BrennenstuhlGateway::Radio433BrennenstuhlGateway(QObject *parent) : QObject(parent) { - m_gatewayDiscovery = new QUdpSocket(this); - m_gateway = new QUdpSocket(this); + // UDP socket for discovering... - // 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))); - 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... - // TODO: auto rediscover if lost connection + // Timer to detect discovery timeout + 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 rawData) { - if(m_gateway){ - QByteArray data; - QByteArray message; + QByteArray data; + QByteArray message; - // bring rawData list to a single ByteArray, values separated by ',' - foreach (int value, rawData) { - 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; - } + // bring rawData list to a single ByteArray, values separated by ',' + foreach (int value, rawData) { + data.append(QString::number(value) + ","); } - 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() { - 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"; return false; } - connect(m_gatewayDiscovery, &QUdpSocket::readyRead, this, &Radio433BrennenstuhlGateway::readDataDiscovery); discover(); + m_discoverTimer->start(); return true; } bool Radio433BrennenstuhlGateway::disable() { + m_discoverTimer->stop(); m_gateway->close(); - m_gatewayDiscovery->close(); return true; } void Radio433BrennenstuhlGateway::discover() { // 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() @@ -98,24 +109,6 @@ bool Radio433BrennenstuhlGateway::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() { QByteArray data; @@ -123,27 +116,17 @@ void Radio433BrennenstuhlGateway::readDataDiscovery() quint16 port; // 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()) { 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) QUdpSocket *gateway = static_cast(sender()); - qDebug() << "--> ERROR: Radio 433 MHz Brennenstuhl LAN Gateway disabled: " << gateway->errorString(); - m_available = false; + qWarning() << "--> ERROR: Radio 433 MHz Brennenstuhl LAN Gateway socket error: " << gateway->errorString(); + if (m_available) { + m_available = false; + emit availableChanged(false); + } +} + +void Radio433BrennenstuhlGateway::timeout() +{ + if (m_available) { + m_available = false; + emit availableChanged(false); + } } diff --git a/libguh/hardware/radio433/radio433brennenstuhlgateway.h b/libguh/hardware/radio433/radio433brennenstuhlgateway.h index 281d1a45..32b05398 100644 --- a/libguh/hardware/radio433/radio433brennenstuhlgateway.h +++ b/libguh/hardware/radio433/radio433brennenstuhlgateway.h @@ -22,6 +22,7 @@ #include #include #include +#include class Radio433BrennenstuhlGateway : public QObject { @@ -36,23 +37,23 @@ public: private: bool m_available; - QUdpSocket *m_gatewayDiscovery; QUdpSocket *m_gateway; int m_gatewayPort; QHostAddress m_gatewayAddress; + QTimer *m_discoverTimer; + QTimer *m_timeout; + void discover(); - void gatewayDiscovered(QHostAddress address, int port); signals: - void availableChanged(); + void availableChanged(const bool &available); private slots: void readDataDiscovery(); - void readDataGateway(); void gatewayError(QAbstractSocket::SocketError error); - + void timeout(); }; #endif // RADIO433BRENNENSTUHLGATEWAY_H