2016-05-30 23:58:31 +02:00
// STL includes
# include <cstring>
# include <cstdio>
# include <iostream>
2016-08-08 00:17:00 +02:00
# include <exception>
2016-05-30 23:58:31 +02:00
// Linux includes
# include <fcntl.h>
# include <QStringList>
# include <QUdpSocket>
# include <QHostInfo>
// Local Hyperion includes
2016-08-28 07:12:48 +02:00
# include "ProviderUdp.h"
2016-05-30 23:58:31 +02:00
2020-06-28 23:05:32 +02:00
const ushort MAX_PORT = 65535 ;
2016-09-22 09:19:31 +02:00
ProviderUdp : : ProviderUdp ( )
2016-08-23 20:07:12 +02:00
: LedDevice ( )
2020-02-10 15:21:58 +01:00
, _udpSocket ( nullptr )
, _port ( 1 )
, _defaultHost ( " 127.0.0.1 " )
2016-05-30 23:58:31 +02:00
{
2020-02-10 15:21:58 +01:00
_deviceReady = false ;
2017-04-09 22:28:32 +02:00
_latchTime_ms = 1 ;
2016-05-30 23:58:31 +02:00
}
2016-08-28 07:12:48 +02:00
ProviderUdp : : ~ ProviderUdp ( )
2016-05-30 23:58:31 +02:00
{
2020-06-28 23:05:32 +02:00
if ( _udpSocket ! = nullptr )
{
_udpSocket - > deleteLater ( ) ;
}
2016-05-30 23:58:31 +02:00
}
2017-02-11 22:52:47 +01:00
bool ProviderUdp : : init ( const QJsonObject & deviceConfig )
2016-08-23 20:07:12 +02:00
{
2020-02-10 15:21:58 +01:00
bool isInitOK = LedDevice : : init ( deviceConfig ) ;
2016-12-02 12:07:24 +01:00
2017-02-11 22:52:47 +01:00
QString host = deviceConfig [ " host " ] . toString ( _defaultHost ) ;
2018-12-27 23:11:32 +01:00
2016-09-22 09:19:31 +02:00
if ( _address . setAddress ( host ) )
2016-08-23 20:07:12 +02:00
{
2016-10-13 21:59:58 +02:00
Debug ( _log , " Successfully parsed %s as an ip address. " , deviceConfig [ " host " ] . toString ( ) . toStdString ( ) . c_str ( ) ) ;
2016-08-27 14:05:09 +02:00
}
else
{
2020-02-10 15:21:58 +01:00
Debug ( _log , " Failed to parse [%s] as an ip address. " , deviceConfig [ " host " ] . toString ( ) . toStdString ( ) . c_str ( ) ) ;
2016-09-22 09:19:31 +02:00
QHostInfo info = QHostInfo : : fromName ( host ) ;
2016-08-27 14:05:09 +02:00
if ( info . addresses ( ) . isEmpty ( ) )
{
2020-02-10 15:21:58 +01:00
Debug ( _log , " Failed to parse [%s] as a hostname. " , deviceConfig [ " host " ] . toString ( ) . toStdString ( ) . c_str ( ) ) ;
QString errortext = QString ( " Invalid target address [%1]! " ) . arg ( host ) ;
this - > setInError ( errortext ) ;
return false ;
}
else
{
Debug ( _log , " Successfully parsed %s as a hostname. " , deviceConfig [ " host " ] . toString ( ) . toStdString ( ) . c_str ( ) ) ;
_address = info . addresses ( ) . first ( ) ;
2016-08-27 14:05:09 +02:00
}
2016-08-23 20:07:12 +02:00
}
2016-09-22 00:18:46 +02:00
2020-02-10 15:21:58 +01:00
int config_port = deviceConfig [ " port " ] . toInt ( _port ) ;
if ( config_port < = 0 | | config_port > MAX_PORT )
{
QString errortext = QString ( " Invalid target port [%1]! " ) . arg ( config_port ) ;
this - > setInError ( errortext ) ;
isInitOK = false ;
}
else
2016-09-22 09:19:31 +02:00
{
2020-02-10 15:21:58 +01:00
_port = static_cast < int > ( config_port ) ;
Debug ( _log , " UDP using %s:%d " , _address . toString ( ) . toStdString ( ) . c_str ( ) , _port ) ;
2016-09-22 09:19:31 +02:00
}
2018-12-27 23:11:32 +01:00
2020-02-10 15:21:58 +01:00
return isInitOK ;
}
bool ProviderUdp : : initNetwork ( )
{
2020-02-23 23:18:34 +01:00
bool isInitOK = false ;
add Hue EntertainmentAPI + Forwarder & other Fixes (#592)
* whitespaces + typo fixes
* JS / LGTM fixes
* SSDP Handler crash fix
* MessageForwarder handlePriorityChanges Slave fixes
* use aboutToQuit Signal
* complete rewriten Hue Entertainment API structure
combined Philips Hue and Entertainment API
with new MbedTLS based SSL UDP Provider
* add required cross-compile submodules
* logical rebuild fn: initLeds, setLights + new logs
-more detailed checks and error handling inside iniLeds and setLights
- logical script procedure before ProviderUdpSSL init
- first steps for multiple ProviderUdpSSL usage
- better fallback support to old RestAPI, if entertainment api is not supported
- just 4 u LordGrey: new log fn for cosmetic config outputs ;)
* add OSX CompileHowTo - undo from CrossCompileHowTo
* whitespace fixes
* lightID toString fix
* fix unsigned int E-API + debug output
* bugfixes, reworked black signal detection, wizard:
- change device config field light-ids from int to string -> real unsigned int fix
- add signal detection brightness minimum threshold value
0.0 for 0% brightness - 1.0 for 100% brightness to count for blacklight signal detection
reason: input may not 100% black, like mine - i have a deep dark gray input signal
-> my threshold value is set to 0.005 for 0.5% minimum brightness = 1 (from max 255) to count as black
- wizard optimations, with fallback without entertainment support (beta state)
- whitespace fixes
* cleanup + minor fixes
* change fixed Hue UPD SSL config to _devConfig paras
* Hotfix SSL Connection, new light models, wizard:
- Fix UPD SSL Connection failed Problems
- add new supported gamut C light models: LCG002, LCA001, LCA002, LCA003
- wizard: extend fallback support to classic mode + hints
* whitespace, typo fix
* uncheck useEntertainmentAPI, if noAPISupport detected + hint
* coredump fix -> add _blackLightsTimer nullptr init
* code cleanup / remove old debugs + whitespacefixes
* add gamut C LCP001, LCP002
* SSL UDP config made more flexible + remove qDebug
-> switch to hyerion.ng _log
-> replace logCommand with verbose
-> code cleanups etc...
* extended mbedtls debugging infos
* add adjustable ssl timeout settings
* error handling
* streamdebugger bugfixes
* UPDSSL psk / psk_identity bugfixes! + hue wizard fn typo fix +
- verbose option available without dependencies
- whitespace fixes
* Philips Hue Assistant now recognizes non-original bridges better...
+ Added note if no clientkey is set when using the entertainment API
+ User creation (+ clientkey) for non-original bridges can now also be used
+ Minor changes and bug fixes
* CMAKE mbedTLS detection
* minor bug fixes + code cleanups
* FindMbedTLS.cmake remove Path-Hints + wizard.js: ajax timeout handling
Test - content_grabber.js: run relevant code only, if V4L2_AVAIL is true:
conf_grabber don't displays other devices, if V4L2 is not available
* compile mbedtls via cmake as static lib
* remove libmbedtls-dev from compileHowto / scripts
* Fix Windows build
* Fix windows build (part 2)
* removed unnecessary osx x11 include directory path
* QTimer Shutdown bugfix
* cmake win32 fix + minor bugfixes
* cmake debug msg used mbedtls libs
* Bugfix: noSignalDetection wasn't switchedOn again
if no signal was previously detected
* Some code fixes based on alerts from lgtm.com
Co-authored-by: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com>
2020-05-22 19:40:50 +02:00
_udpSocket = new QUdpSocket ( this ) ;
2020-02-23 23:18:34 +01:00
2020-06-28 23:05:32 +02:00
// Try to bind the UDP-Socket
if ( _udpSocket ! = nullptr )
2020-02-23 23:18:34 +01:00
{
QHostAddress localAddress = QHostAddress : : Any ;
quint16 localPort = 0 ;
if ( ! _udpSocket - > bind ( localAddress , localPort ) )
{
2020-06-28 23:05:32 +02:00
QString warntext = QString ( " Could not bind local address: %1, (%2) %3 " ) . arg ( localAddress . toString ( ) ) . arg ( _udpSocket - > error ( ) ) . arg ( _udpSocket - > errorString ( ) ) ;
Warning ( _log , " %s " , QSTRING_CSTR ( warntext ) ) ;
2020-02-23 23:18:34 +01:00
}
isInitOK = true ;
}
2020-02-10 15:21:58 +01:00
return isInitOK ;
2016-08-23 20:07:12 +02:00
}
2016-08-28 07:12:48 +02:00
int ProviderUdp : : open ( )
2016-05-30 23:58:31 +02:00
{
2020-02-10 15:21:58 +01:00
int retval = - 1 ;
QString errortext ;
_deviceReady = false ;
2016-05-30 23:58:31 +02:00
2020-02-10 15:21:58 +01:00
if ( init ( _devConfig ) )
{
if ( ! initNetwork ( ) )
{
2020-02-23 23:18:34 +01:00
this - > setInError ( " UDP Network error! " ) ;
2020-02-10 15:21:58 +01:00
}
else
{
// Everything is OK -> enable device
_deviceReady = true ;
setEnable ( true ) ;
retval = 0 ;
}
}
return retval ;
}
void ProviderUdp : : close ( )
{
LedDevice : : close ( ) ;
2016-05-30 23:58:31 +02:00
2020-06-28 23:05:32 +02:00
if ( _udpSocket ! = nullptr )
2020-02-10 15:21:58 +01:00
{
2020-06-28 23:05:32 +02:00
// Test, if device requires closing
if ( _udpSocket - > isOpen ( ) )
{
Debug ( _log , " Close UDP-device: %s " , QSTRING_CSTR ( this - > getActiveDeviceType ( ) ) ) ;
_udpSocket - > close ( ) ;
// Everything is OK -> device is closed
}
2020-02-10 15:21:58 +01:00
}
2016-05-30 23:58:31 +02:00
}
2016-08-28 07:12:48 +02:00
int ProviderUdp : : writeBytes ( const unsigned size , const uint8_t * data )
2016-05-30 23:58:31 +02:00
{
2016-08-14 10:46:44 +02:00
qint64 retVal = _udpSocket - > writeDatagram ( ( const char * ) data , size , _address , _port ) ;
2020-06-28 23:05:32 +02:00
WarningIf ( ( retVal < 0 ) , _log , " &s " , QSTRING_CSTR ( QString
( " (%1:%2) Write Error: (%3) %4 " ) . arg ( _address . toString ( ) ) . arg ( _port ) . arg ( _udpSocket - > error ( ) ) . arg ( _udpSocket - > errorString ( ) ) ) ) ;
2016-05-30 23:58:31 +02:00
return retVal ;
}