Skip to content
Snippets Groups Projects
Commit 39db9b44 authored by jkerdreu's avatar jkerdreu
Browse files

Added lock & custom wrapper in @spwan

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2519 b32b6428-25c9-4566-ad07-03861ab6144f
parent e0d7703d
No related branches found
No related tags found
No related merge requests found
......@@ -5,8 +5,8 @@ import asyncio
import time
import logging
import tenacity
import copy
import functools
logger = logging.getLogger(__name__)
......@@ -15,37 +15,24 @@ from gevent.util import wrap_errors
from decorator import decorator
def retry_(func,*args,**kwargs):
cnt = 0
while 1:
try:
logger.warning("Calling %s" % func)
func(*args,**kwargs)
break
except Exception as e:
if cnt == 0:
logger.warning(e)
cnt = cnt +1
if cnt == 2:
break
def retry(func,*args,**kwargs):
lock = args[0].lock
if not lock.ready():
logger.warning("LOCKED waiting.. %s" % func)
lock.wait()
lock.acquire()
try:
logger.warning("Calling %s" % func)
logger.debug("Calling %s " % func)
func(*args,**kwargs)
except Exception as e:
logger.warning(e)
lock.release()
@decorator
def spawn(func,*args,**kwargs):
logger.warning("Calling %s" % func)
#gevent.spawn(retry(func,*args,**kwargs))
gevent.spawn(wrap_errors(Exception,func),*args,**kwargs)
#gevent.spawn(func,*args,**kwargs)
# we try twice within one second, if nothing works, just drop
TENACITY_RETRY=tenacity.stop_after_attempt(2) | tenacity.stop_after_delay(10)
ptr = functools.partial(retry,func,*args,**kwargs)
gevent.spawn(ptr)
def properties_compare(orig,new):
......@@ -65,6 +52,9 @@ class YeelightDev(object):
self.dev = None
self.setup()
self.set_xaal()
# It's safer to use a lock to avoid the socket to be used w/ 2 greenlets at the same time.
# This can occurs on the device refresh
self.lock = gevent.lock.BoundedSemaphore(1)
def debug_properties(self,properties):
if not hasattr(self,'last_properties'):
......@@ -128,7 +118,7 @@ class RGBW(YeelightDev):
dev.schema = 'https://redmine.telecom-bretagne.eu/svn/xaal/schemas/branches/schemas-0.7/lamp.color'
dev.attributes['hsv'] = [0,0,0]
self.dev = dev
self.flowing_timer = None
self.flowing_timer = False
def debug(self):
import pdb;pdb.set_trace()
......@@ -154,7 +144,9 @@ class RGBW(YeelightDev):
self.bulb.turn_on()
self.bulb.duration = duration
self.bulb.set_hsv(h,s,v)
gevent.sleep(0.2)
self._update_properties()
#gevent.sleep(10)
@spawn
def set_white_temperature(self,_white_temperature):
......@@ -201,15 +193,17 @@ class RGBW(YeelightDev):
hsv[0] = int(hue)
attrs['hsv']=hsv
# flowing ?
flowing = props.get('flowing','0')
flowing = props.get('flowing',None)
if flowing:
# On color change, the bulb enter in flowing mode. hsv is in proprerties only at the end of the flow
# so we schedule a periodic get_propverties. We
if flowing == '1' and self.flowing_timer == None:
# call get_properties every 0.4 sec, and max 100 times
self.flowing_timer = self.dev.engine.add_timer(self.get_properties,0.4,100)
if flowing == '0' and self.flowing_timer != None:
self.dev.engine.remove_timer(self.flowing_timer)
self.flowing_timer = None
self.get_properties()
if flowing == '1' and self.flowing_timer == False:
eng = self.dev.engine
target = round((self.bulb.duration / 1000.0),1)
print(target)
eng.add_timer(self.get_properties,target,1)
eng.add_timer(self.get_properties,target+0.5,1)
eng.add_timer(self.get_properties,target+1,1)
self.flowing_timer = True
if flowing == '0' and self.flowing_timer == True:
self.flowing_timer = False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment