2016-12-30 23:38:51 +00:00
/*
* UDP notifier
*/
2018-01-27 22:28:20 +00:00
# define WLEDPACKETSIZE 24
2018-03-14 12:16:28 +00:00
void notify ( byte callMode , bool followUp = false )
2016-11-19 18:39:17 +00:00
{
2017-05-08 19:46:04 +00:00
if ( ! udpConnected ) return ;
2016-11-19 18:39:17 +00:00
switch ( callMode )
{
case 1 : if ( ! notifyDirect ) return ; break ;
case 2 : if ( ! notifyButton ) return ; break ;
2017-05-08 19:46:04 +00:00
case 4 : if ( ! notifyDirect ) return ; break ;
2016-12-14 22:40:47 +00:00
case 6 : if ( ! notifyDirect ) return ; break ; //fx change
2018-02-27 23:27:10 +00:00
case 7 : if ( ! notifyHue ) return ; break ;
2016-11-19 18:39:17 +00:00
default : return ;
}
2018-01-27 22:28:20 +00:00
byte udpOut [ WLEDPACKETSIZE ] ;
2017-02-04 22:37:28 +00:00
udpOut [ 0 ] = 0 ; //0: wled notifier protocol 1: WARLS protocol
2016-11-27 21:37:51 +00:00
udpOut [ 1 ] = callMode ;
udpOut [ 2 ] = bri ;
udpOut [ 3 ] = col [ 0 ] ;
udpOut [ 4 ] = col [ 1 ] ;
udpOut [ 5 ] = col [ 2 ] ;
udpOut [ 6 ] = nightlightActive ;
2016-12-14 20:40:09 +00:00
udpOut [ 7 ] = nightlightDelayMins ;
udpOut [ 8 ] = effectCurrent ;
udpOut [ 9 ] = effectSpeed ;
2017-10-12 15:09:59 +00:00
udpOut [ 10 ] = white ;
2018-03-15 11:04:14 +00:00
udpOut [ 11 ] = 4 ; //compatibilityVersionByte: 0: old 1: supports white 2: supports secondary color 3: supports FX intensity, 24 byte packet 4: supports transitionDelay
2018-03-14 12:16:28 +00:00
udpOut [ 12 ] = colSec [ 0 ] ;
udpOut [ 13 ] = colSec [ 1 ] ;
udpOut [ 14 ] = colSec [ 2 ] ;
udpOut [ 15 ] = whiteSec ;
2018-01-27 22:28:20 +00:00
udpOut [ 16 ] = effectIntensity ;
2018-03-15 11:04:14 +00:00
udpOut [ 17 ] = ( transitionDelay > > 0 ) & 0xFF ;
udpOut [ 18 ] = ( transitionDelay > > 8 ) & 0xFF ;
2016-11-19 18:39:17 +00:00
2016-11-27 21:37:51 +00:00
IPAddress broadcastIp ;
broadcastIp = ~ WiFi . subnetMask ( ) | WiFi . gatewayIP ( ) ;
2016-11-19 18:39:17 +00:00
2016-11-27 21:37:51 +00:00
notifierUdp . beginPacket ( broadcastIp , udpPort ) ;
2018-01-27 22:28:20 +00:00
notifierUdp . write ( udpOut , WLEDPACKETSIZE ) ;
2016-11-27 21:37:51 +00:00
notifierUdp . endPacket ( ) ;
2018-03-06 22:47:08 +00:00
notificationSentCallMode = callMode ;
notificationSentTime = millis ( ) ;
notificationTwoRequired = ( followUp ) ? false : notifyTwice ;
2016-11-27 21:37:51 +00:00
}
void handleNotifications ( )
{
2018-03-06 22:47:08 +00:00
if ( udpConnected & & notificationTwoRequired & & millis ( ) - notificationSentTime > 250 ) {
notify ( notificationSentCallMode , true ) ;
}
2016-11-27 21:37:51 +00:00
if ( udpConnected & & receiveNotifications ) {
2018-03-14 12:16:28 +00:00
uint16_t packetSize = notifierUdp . parsePacket ( ) ;
if ( packetSize > 1026 ) return ;
2018-02-23 00:33:32 +00:00
if ( packetSize & & notifierUdp . remoteIP ( ) ! = WiFi . localIP ( ) ) //don't process broadcasts we send ourselves
2016-11-19 23:07:04 +00:00
{
2018-03-14 12:16:28 +00:00
byte udpIn [ packetSize ] ;
2017-01-26 22:45:55 +00:00
notifierUdp . read ( udpIn , packetSize ) ;
2018-01-07 21:52:48 +00:00
if ( udpIn [ 0 ] = = 0 & & ! arlsTimeout ) //wled notifier, block if realtime packets active
2016-12-30 23:38:51 +00:00
{
2018-02-23 00:33:32 +00:00
if ( receiveNotificationColor )
{
2017-01-26 22:45:55 +00:00
col [ 0 ] = udpIn [ 3 ] ;
col [ 1 ] = udpIn [ 4 ] ;
col [ 2 ] = udpIn [ 5 ] ;
2017-11-28 15:04:11 +00:00
}
2018-02-23 00:33:32 +00:00
if ( udpIn [ 11 ] > 0 & & receiveNotificationColor ) //check if sending modules white val is inteded
2017-11-29 16:57:20 +00:00
{
white = udpIn [ 10 ] ;
2018-02-23 00:33:32 +00:00
if ( udpIn [ 11 ] > 1 )
{
2018-03-14 12:16:28 +00:00
colSec [ 0 ] = udpIn [ 12 ] ;
colSec [ 1 ] = udpIn [ 13 ] ;
colSec [ 2 ] = udpIn [ 14 ] ;
whiteSec = udpIn [ 15 ] ;
2018-02-23 00:33:32 +00:00
}
2017-11-29 16:57:20 +00:00
}
2018-02-23 00:33:32 +00:00
if ( udpIn [ 8 ] ! = effectCurrent & & receiveNotificationEffects )
2017-01-26 22:45:55 +00:00
{
effectCurrent = udpIn [ 8 ] ;
strip . setMode ( effectCurrent ) ;
}
2018-02-23 00:33:32 +00:00
if ( udpIn [ 9 ] ! = effectSpeed & & receiveNotificationEffects )
2017-01-26 22:45:55 +00:00
{
effectSpeed = udpIn [ 9 ] ;
strip . setSpeed ( effectSpeed ) ;
}
2018-02-23 11:22:58 +00:00
if ( udpIn [ 11 ] > 2 & & udpIn [ 16 ] ! = effectIntensity & & receiveNotificationEffects )
2018-01-27 22:28:20 +00:00
{
2018-02-23 11:22:58 +00:00
effectIntensity = udpIn [ 16 ] ;
2018-01-27 22:28:20 +00:00
strip . setIntensity ( effectIntensity ) ;
}
2017-01-26 22:45:55 +00:00
nightlightActive = udpIn [ 6 ] ;
2017-11-28 15:04:11 +00:00
if ( ! nightlightActive )
2017-01-26 22:45:55 +00:00
{
2018-02-23 00:33:32 +00:00
if ( receiveNotificationBrightness ) bri = udpIn [ 2 ] ;
2017-01-26 22:45:55 +00:00
colorUpdated ( 3 ) ;
}
2017-12-14 10:28:15 +00:00
} else if ( udpIn [ 0 ] = = 1 ) //warls
2016-12-14 20:40:09 +00:00
{
2017-02-04 22:37:28 +00:00
if ( packetSize > 1 ) {
if ( udpIn [ 1 ] = = 0 )
2017-01-26 22:45:55 +00:00
{
2017-02-04 22:37:28 +00:00
arlsTimeout = false ;
2017-01-26 22:45:55 +00:00
} else {
2017-02-04 22:37:28 +00:00
if ( ! arlsTimeout ) {
2018-03-14 12:16:28 +00:00
strip . setRange ( 0 , ledCount - 1 , 0 ) ;
2017-02-04 22:37:28 +00:00
strip . setMode ( 0 ) ;
}
arlsTimeout = true ;
arlsTimeoutTime = millis ( ) + 1000 * udpIn [ 1 ] ;
}
for ( int i = 2 ; i < packetSize - 3 ; i + = 4 )
{
2018-03-14 12:16:28 +00:00
if ( udpIn [ i ] + arlsOffset < ledCount & & udpIn [ i ] + arlsOffset > = 0 )
2017-02-04 22:37:28 +00:00
if ( useGammaCorrectionRGB )
{
2017-12-14 10:28:15 +00:00
strip . setPixelColor ( udpIn [ i ] + arlsOffset , gamma8 [ udpIn [ i + 1 ] ] , gamma8 [ udpIn [ i + 2 ] ] , gamma8 [ udpIn [ i + 3 ] ] ) ;
2017-02-04 22:37:28 +00:00
} else {
2017-12-14 10:28:15 +00:00
strip . setPixelColor ( udpIn [ i ] + arlsOffset , udpIn [ i + 1 ] , udpIn [ i + 2 ] , udpIn [ i + 3 ] ) ;
2017-02-04 22:37:28 +00:00
}
2017-01-26 22:45:55 +00:00
}
2017-12-14 10:28:15 +00:00
strip . show ( ) ;
2017-01-26 22:45:55 +00:00
}
2016-11-27 21:37:51 +00:00
}
2016-11-19 23:07:04 +00:00
}
2017-01-26 22:45:55 +00:00
if ( arlsTimeout & & millis ( ) > arlsTimeoutTime )
{
strip . unlockAll ( ) ;
arlsTimeout = false ;
2017-02-04 22:37:28 +00:00
strip . setMode ( effectCurrent ) ;
2017-01-26 22:45:55 +00:00
}
2016-11-19 18:39:17 +00:00
}
}
2016-11-27 21:37:51 +00:00