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);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -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<int> 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;
|
||||
}
|
||||
|
||||
@ -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<int> rawData);
|
||||
|
||||
@ -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<int> 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<QUdpSocket*>(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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
#include <QObject>
|
||||
#include <QUdpSocket>
|
||||
#include <QHostAddress>
|
||||
#include <QTimer>
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user