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 logging
import time import time
import errno
from sqlalchemy import Column, Integer, String from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship, reconstructor from sqlalchemy.orm import relationship, reconstructor
@@ -87,7 +88,13 @@ class Controller(Base):
return corrected return corrected
def get_channel(self, channel): def get_channel(self, channel):
try:
return self.bus.read_word_data(self._address, LED0_OFF_L + 4 * channel) / 4095 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): def reset(self):
self.mode = int("0b00100001", 2) # MODE1 -> 0b00000001 self.mode = int("0b00100001", 2) # MODE1 -> 0b00000001

View File

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