brennenstuhl autodetection added

This commit is contained in:
Simon Stürz 2014-12-10 18:07:49 +01:00 committed by Michael Zanetti
parent b45702ca37
commit a4cb391374
5 changed files with 92 additions and 97 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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