added error handling of oserror 70 mostly caused by a busy i2c line

need to add a proper rate limiting and requeue of requests for a future release
This commit is contained in:
Giovanni Harting
2015-10-31 22:40:52 +01:00
parent 6f2a8faa6a
commit aadcfafd00
2 changed files with 17 additions and 5 deletions

View File

@@ -16,6 +16,7 @@
import logging
import time
import errno
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship, reconstructor
@@ -87,7 +88,13 @@ class Controller(Base):
return corrected
def get_channel(self, channel):
return self.bus.read_word_data(self._address, LED0_OFF_L + 4 * channel) / 4095
try:
return self.bus.read_word_data(self._address, LED0_OFF_L + 4 * channel) / 4095
except OSError as e:
if int(e) == errno.ECOMM:
return 0
else:
raise
def reset(self):
self.mode = int("0b00100001", 2) # MODE1 -> 0b00000001

View File

@@ -20,6 +20,7 @@ import os
import sys
import asyncio
import signal
import errno
from sqlalchemy import create_engine
from jsonrpc import JSONRPCResponseManager, dispatcher
@@ -64,7 +65,6 @@ def run():
if not check_db():
init_db()
log.debug(Controller.query.all())
logging.getLogger("asyncio").setLevel(log.getEffectiveLevel())
# Load to cache
@@ -198,7 +198,14 @@ def set_color(**kwargs):
stripe = get_stripe(kwargs['sid'])
if stripe:
stripe.set_color(spectra.hsv(kwargs['hsv']['h'], kwargs['hsv']['s'], kwargs['hsv']['v']))
try:
stripe.set_color(spectra.hsv(kwargs['hsv']['h'], kwargs['hsv']['s'], kwargs['hsv']['v']))
except OSError as e:
logging.debug("got into except, errno %s", int(e))
if int(e) == errno.ECOMM:
return e
else:
raise
else:
log.warning("Stripe not found: id=%s", kwargs['sid'])
return JSONRPCError(-1003, "Stripeid not found")
@@ -373,13 +380,11 @@ class LedDProtocol(asyncio.Protocol):
except UnicodeDecodeError:
log.warning("Recieved undecodable data, ignoring")
else:
log.debug("Received: %s from: %s", d_decoded, self.transport.get_extra_info("peername"))
self.select_task(d_decoded)
def select_task(self, data):
if data:
data_split = data.splitlines()
log.debug(data_split)
for line in data_split:
if line:
self.transport.write(JSONRPCResponseManager.handle(line, dispatcher).json.encode())