diff --git a/ledd.py b/ledd.py
index f13daa9..5542d68 100644
--- a/ledd.py
+++ b/ledd.py
@@ -32,41 +32,13 @@ Options:
"""
import logging
-import sys
import os
-from pkgutil import iter_modules
+import sys
-import coloredlogs
from docopt import docopt
-import ledd.daemon
import ledd
-
-if "smbus" not in (name for loader, name, ispkg in iter_modules()):
- print("smbus not found, installing replacement")
-
-
- class SMBus:
- def __init__(self, i2c_address):
- self.i2c_address = i2c_address
- self.channels = {}
-
- def write_word_data(self, addr, cmd, val):
- if (cmd - 6) % 4 == 0:
- self.channels[(cmd - 6) // 4] = val
-
- def read_word_data(self, addr, cmd):
- if (cmd - 8) // 4 not in self.channels:
- self.channels[(cmd - 8) // 4] = 0
- return self.channels[(cmd - 8) // 4]
-
-
- class SMBusModule:
- SMBus = SMBus
-
-
- sys.modules['smbus'] = SMBusModule
- sys.modules['smbus'].SMBus = SMBus
+import ledd.daemon
def pid_exists(processid):
@@ -93,7 +65,6 @@ if __name__ == "__main__":
lvl = logging.DEBUG
log = logging.getLogger(__name__)
- coloredlogs.install(level=lvl)
try:
with open('ledd.pid', 'r') as f:
diff --git a/ledd/__init__.py b/ledd/__init__.py
index fb087ff..98377c4 100644
--- a/ledd/__init__.py
+++ b/ledd/__init__.py
@@ -13,23 +13,5 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-from json import JSONEncoder
-from sqlalchemy.orm import sessionmaker, scoped_session
-from sqlalchemy.ext.declarative import declarative_base
-
-VERSION = "0.1"
-
-engine = None
-session = scoped_session(sessionmaker())
-""" :type : sqlalchemy.orm.scoping.scoped_session """
-Base = declarative_base()
-Base.query = session.query_property()
-
-
-def _default(self, obj):
- return getattr(obj.__class__, "to_json", _default.default)(obj)
-
-
-_default.default = JSONEncoder().default
-JSONEncoder.default = _default
+VERSION = "0.2"
diff --git a/ledd/client.py b/ledd/client.py
new file mode 100644
index 0000000..7dfa8d2
--- /dev/null
+++ b/ledd/client.py
@@ -0,0 +1,62 @@
+import asyncio
+import socket
+
+from ledd import VERSION
+from ledd.protobuf import client_pb2
+from ledd.protobuf.ledd_pb2 import WrapperMsg, LedD
+
+
+class LedDClientProtocol(asyncio.Protocol):
+ def connection_made(self, transport):
+ print("Connected to client!")
+
+ def data_received(self, data):
+ print('Data received: {!r}'.format(data.decode()))
+
+ def connection_lost(self, exc):
+ print('The client closed the connection')
+
+
+class Client:
+ def __init__(self):
+ super().__init__()
+
+ self.msg = client_pb2.Client()
+ self.proto = None
+ self.transport = None
+
+ def init_from_db(self, row):
+ self.msg.name = row['name']
+ self.msg.addr = row['addr']
+ self.msg.id = row['id']
+ self.msg.options = row['options']
+ self.msg.resolution = row['reso']
+ self.msg.port = row['port']
+
+ def init_from_msg(self, msg):
+ client = client_pb2.Client()
+ self.msg = client.ParseFromString(msg)
+
+ def connect(self):
+ ledd = LedD()
+ ledd.version = VERSION
+ ledd.hostname = socket.gethostname()
+
+ wrapper = WrapperMsg()
+ wrapper.type = WrapperMsg.Type.DISCOVER
+ wrapper.ledd = ledd
+
+ loop = asyncio.get_event_loop()
+ coro = loop.create_connection(LedDClientProtocol, self.msg.addr, self.msg.port)
+ loop.run_until_complete(coro)
+ self.transport = coro[0]
+ self.proto = coro[1]
+
+ self.send_to_client(wrapper.SerializeToString())
+
+ def is_connected(self):
+ return not self.transport.is_closing()
+
+ def send_to_client(self, data):
+ if self.is_connected() and data:
+ self.transport.write(data)
diff --git a/ledd/client/__init__.py b/ledd/client/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/ledd/client/socket.py b/ledd/client/socket.py
new file mode 100644
index 0000000..e69de29
diff --git a/ledd/controller.py b/ledd/controller.py
deleted file mode 100644
index 6d7f556..0000000
--- a/ledd/controller.py
+++ /dev/null
@@ -1,148 +0,0 @@
-# LEDD Project
-# Copyright (C) 2015 LEDD Team
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-import errno
-import logging
-import time
-
-import smbus
-from sqlalchemy import Column, Integer, String
-from sqlalchemy.orm import relationship, reconstructor
-
-from . import Base
-
-PCA9685_SUBADR1 = 0x2
-PCA9685_SUBADR2 = 0x3
-PCA9685_SUBADR3 = 0x4
-
-PCA9685_MODE1 = 0x00
-PCA9685_MODE2 = 0x01
-PCA9685_PRESCALE = 0xFE
-
-LED0_ON_L = 0x06
-LED0_ON_H = 0x07
-LED0_OFF_L = 0x08
-LED0_OFF_H = 0x09
-
-ALLLED_ON_L = 0xFA
-ALLLED_ON_H = 0xFB
-ALLLED_OFF_L = 0xFC
-ALLLED_OFF_H = 0xFD
-
-
-class Controller(Base):
- __tablename__ = "controller"
-
- id = Column(Integer, primary_key=True)
- channels = Column(Integer)
- i2c_device = Column(Integer)
- address = Column(String)
- stripes = relationship("Stripe", backref="controller")
- _pwm_freq = Column("pwm_freq", Integer, default=1526)
-
- """
- A controller controls a number of stripes.
- """
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self._mode = None
- self.bus = smbus.SMBus(self.i2c_device)
- self._address = int(self.address, 16)
- self.pwm_freq = self._pwm_freq
-
- @reconstructor
- def init_on_load(self):
- self._mode = None
- self.bus = smbus.SMBus(self.i2c_device)
- self._address = int(self.address, 16)
- self.pwm_freq = self._pwm_freq
-
- def __repr__(self):
- return "".format(len(self.stripes), self.id)
-
- def set_channel(self, channel, val, gamma):
- self.bus.write_word_data(self._address, LED0_OFF_L + 4 * channel, self.gamma_correct(gamma, int(val * 4095),
- 4095))
- self.bus.write_word_data(self._address, LED0_ON_L + 4 * channel, 0)
-
- def set_all_channel(self, val):
- self.bus.write_word_data(self._address, ALLLED_OFF_L, int(val * 4095))
- self.bus.write_word_data(self._address, ALLLED_ON_L, 0)
-
- @staticmethod
- def gamma_correct(gamma, val, maxval):
- corrected = int(pow(float(val) / float(maxval), float(gamma)) * float(maxval) + 0.5)
- logging.getLogger(__name__).debug("GammaCorrect: in=%s out=%s, gamma=%s", val, corrected, gamma)
- return corrected
-
- def get_channel(self, channel):
- 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
- time.sleep(0.015)
- self.mode = int("0b10100001", 2)
-
- @property
- def mode(self):
- self._mode = self.bus.read_byte_data(self._address, PCA9685_MODE1)
- logging.getLogger(__name__).debug("Controller mode: %s", bin(self._mode))
- return self._mode
-
- @mode.setter
- def mode(self, mode):
- self.bus.write_byte_data(self._address, PCA9685_MODE1, mode)
- self._mode = mode
- logging.getLogger(__name__).debug("Controller mode: %s", bin(self._mode))
-
- @property
- def pwm_freq(self):
- self._pwm_freq = round(390625 / ((self.bus.read_byte_data(self._address, PCA9685_PRESCALE) + 1) * 64))
- return self._pwm_freq
-
- @pwm_freq.setter
- def pwm_freq(self, value):
- if value < 24 or value > 1526:
- raise ValueError("PWM frequency must be 24Hz <= pwm_freq <= 1526Hz: {}".format(value))
- prescal = round((25000000.0 / (4096.0 * value))) - 1
- logging.getLogger(__name__).debug("Presacle value: %s", prescal)
-
- self.mode = int("0b00110001", 2)
- self.bus.write_byte_data(self._address, PCA9685_PRESCALE, prescal)
- self.reset()
- self._pwm_freq = value
-
- def to_json(self):
- return {
- 'id': self.id,
- 'pwm_freq': self.pwm_freq,
- 'channel': self.channels,
- 'address': self.address,
- 'stripes': self.stripes,
- 'cstripes': len(self.stripes),
- 'i2c_device': self.i2c_device,
- 'mode': self.mode
- }
-
- def close(self):
- self.bus.close()
diff --git a/ledd/daemon.py b/ledd/daemon.py
index 7fd15c3..c5c4922 100644
--- a/ledd/daemon.py
+++ b/ledd/daemon.py
@@ -20,21 +20,17 @@ import errno
import logging
import os
import signal
+import sqlite3
import sys
import spectra
-from jsonrpc import JSONRPCResponseManager, dispatcher
-from jsonrpc.exceptions import JSONRPCError, JSONRPCInvalidParams
-from sqlalchemy import create_engine
-from sqlalchemy.exc import OperationalError
from sqlalchemy.orm.exc import NoResultFound
from ledd import VERSION
-from ledd.controller import Controller
-from ledd.effectstack import EffectStack
-from ledd.models import Meta
-from ledd.stripe import Stripe
-from . import Base, session
+from ledd.db_helper import check_db
+from ledd.effect.effectstack import EffectStack
+from ledd.led.rgb_stripe import RGBStripe
+from ledd.protobuf.ledd_pb2 import WrapperMsg
log = logging.getLogger(__name__)
@@ -42,8 +38,11 @@ daemonSection = 'daemon'
databaseSection = 'db'
""" :type : asyncio.BaseEventLoop """
effects = []
-stripes = []
-controller = []
+leds = []
+clients = []
+conn = None
+loop = None
+server = None
def run():
@@ -57,23 +56,13 @@ def run():
log.info("No config file found!")
# SQL init
- global engine
- engine = create_engine("sqlite:///" + config.get(databaseSection, 'name', fallback='ledd.sqlite'),
- echo=log.getEffectiveLevel() == logging.DEBUG)
- session.configure(bind=engine)
- Base.metadata.bind = engine
- if not check_db():
- init_db()
+ global conn
+ conn = sqlite3.connect(config.get(databaseSection, 'name', fallback='ledd.sqlite'))
+ conn.row_factory = sqlite3.Row
+ check_db(conn)
logging.getLogger("asyncio").setLevel(log.getEffectiveLevel())
- # Load to cache
- global controller, stripes
- controller = Controller.query.all()
-
- for c in controller:
- stripes.extend(c.stripes)
-
# sigterm handler
def sigterm_handler():
raise SystemExit
@@ -83,6 +72,9 @@ def run():
# init plugins
# TODO: check all plugins for existing hooks
+ # init clients
+
+
# main loop
global loop, server
loop = asyncio.get_event_loop()
@@ -95,15 +87,15 @@ def run():
except (KeyboardInterrupt, SystemExit):
log.info("Exiting")
- for c in controller:
+ for c in clients:
c.close()
try:
os.remove("ledd.pid")
except FileNotFoundError:
pass
- session.commit()
- session.close()
+ conn.commit()
+ conn.close()
if server is not None:
server.close()
if loop is not None:
@@ -112,32 +104,6 @@ def run():
sys.exit(0)
-def check_db():
- """
- Checks database version
- :return: database validity
- :rtype: bool
- """
- try:
- db_version = Meta.get_version()
-
- if db_version is not None:
- log.info("DB connection established; db_version=%s", db_version)
- return True
- except OperationalError:
- return False
- return False
-
-
-def init_db():
- Base.metadata.drop_all()
- Base.metadata.create_all()
- session.add(Meta(option="db_version", value="2"))
- session.commit()
- check_db()
-
-
-@dispatcher.add_method
def start_effect(**kwargs):
"""
Part of the Color API. Used to start a specific effect.
@@ -145,10 +111,7 @@ def start_effect(**kwargs):
:param kwargs:
"""
- if "sids" not in kwargs or "eid" not in kwargs or "eopt" not in kwargs:
- return JSONRPCInvalidParams()
-
- for stripe in Stripe.query.filter(Stripe.id.in_(kwargs['sids'])):
+ for stripe in RGBStripe.query.filter(RGBStripe.id.in_(kwargs['sids'])):
# TODO: add anything required to start effect with req_json['eid']
# on stripes[] with options in req_json['eopt']
effect = EffectStack()
@@ -160,15 +123,14 @@ def start_effect(**kwargs):
rjson = {
'eident': None, # unique effect identifier that identifies excatly this effect started on this set of
- # stripes, used to stop them later and to give informations about running effects
+ # stripes, used to stop them later and to give informations about running effect
}
return rjson
- return JSONRPCError(-1003, "Stripeid not found")
+ # return JSONRPCError(-1003, "Stripeid not found")
-@dispatcher.add_method
def stop_effect(**kwargs):
"""
Part of the Color API. Used to stop a specific effect.
@@ -178,27 +140,25 @@ def stop_effect(**kwargs):
# TODO: add stop effect by eident logic
-@dispatcher.add_method
def get_effects(**kwargs):
"""
- Part of the Color API. Used to show all available and running effects.
+ Part of the Color API. Used to show all available and running effect.
Required parameters: -
"""
- # TODO: list all effects here and on which stripes they run atm
- # TODO: all effects get runtime only ids, "eid"'s. They are shown here for the client to start effects.
+ # TODO: list all effect here and on which stripes they run atm
+ # TODO: all effect get runtime only ids, "eid"'s. They are shown here for the client to start effect.
# TODO: All options that an effect may have need to be transmitted here too with "eopt".
-@dispatcher.add_method
def set_color(**kwargs):
"""
Part of the Color API. Used to set color of a stripe.
Required parameters: stripe ID: sid; HSV values hsv: h,s,v, controller id: cid
"""
- if "sid" not in kwargs or "hsv" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "sid" not in kwargs or "hsv" not in kwargs:
+ # return JSONRPCInvalidParams()
stripe = get_stripe(kwargs['sid'])
@@ -213,20 +173,17 @@ def set_color(**kwargs):
raise
else:
log.warning("Stripe not found: id=%s", kwargs['sid'])
- return JSONRPCError(-1003, "Stripeid not found")
-
- return ""
+ # return JSONRPCError(-1003, "Stripeid not found")
-@dispatcher.add_method
def set_color_all(**kwargs):
"""
Part of the Color API. Used to set brightness of all stripes a controller owns.
Required parameters: controller id: cid, value: v
"""
- if "cid" not in kwargs or "v" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "cid" not in kwargs or "v" not in kwargs:
+ # return JSONRPCInvalidParams()
try:
c = get_controller(kwargs['cid'])
@@ -235,113 +192,109 @@ def set_color_all(**kwargs):
c.set_all_channel(kwargs['v'])
except NoResultFound:
log.warning("Controller not found: id=%s", kwargs['cid'])
- return JSONRPCError(-1002, "Controller not found")
+ # return JSONRPCError(-1002, "Controller not found")
return ""
-@dispatcher.add_method
-def add_controller(**kwargs):
+def add_client(**kwargs):
"""
- Part of the Color API. Used to add a controller.
- Required parameters: channels; i2c_dev: number of i2c device (e.g. /dev/i2c-1 would be i2c_dev = 1);
- address: hexdecimal address of controller on i2c bus, e.g. 0x40
+ Part of the ledd protocol. Used to add a client.
"""
- if "i2c_dev" not in kwargs or "channels" not in kwargs or "address" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "i2c_dev" not in kwargs or "channels" not in kwargs or "address" not in kwargs:
+ # return JSONRPCInvalidParams()
try:
- ncontroller = Controller(channels=int(kwargs['channels']), i2c_device=int(kwargs['i2c_dev']),
- address=kwargs['address'], _pwm_freq=1526)
+ pass
+ # ncontroller = Controller(channels=int(kwargs['channels']), i2c_device=int(kwargs['i2c_dev']),
+ # address=kwargs['address'], _pwm_freq=1526)
except OSError as e:
log.error("Error opening i2c device: %s (%s)", kwargs['i2c_dev'], e)
- return JSONRPCError(-1004, "Error while opening i2c device", e)
+ # return JSONRPCError(-1004, "Error while opening i2c device", e)
- session.add(ncontroller)
- session.commit()
+ # session = Session()
+ # session.add(ncontroller)
+ # session.commit()
- controller.append(ncontroller)
+ # clients.append(ncontroller)
- return {'cid': ncontroller.id}
+ # return {'cid': ncontroller.id}
-@dispatcher.add_method
def get_color(**kwargs):
"""
Part of the Color API. Used to get the current color of an stripe.
Required parameters: sid
"""
- if "sid" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "sid" not in kwargs:
+ # return JSONRPCInvalidParams()
stripe = get_stripe(kwargs['sid'])
if not stripe:
log.warning("Stripe not found: id=%s", kwargs['sid'])
- return JSONRPCError(-1003, "Stripeid not found")
+ # return JSONRPCError(-1003, "Stripeid not found")
if stripe.color:
return {'color': stripe.color.values}
else:
log.warning("Stripe has no color: id=%s", kwargs['sid'])
- return JSONRPCError(-1009, "Internal Error")
+ # return JSONRPCError(-1009, "Internal Error")
-@dispatcher.add_method
-def add_stripe(**kwargs):
+def add_led(**kwargs):
"""
Part of the Color API. Used to add stripes.
Required parameters: name; rgb: bool; map: r: r-channel, g: g-channel, b: b-channel, cid
"""
- if "name" not in kwargs or "rgb" not in kwargs or "map" not in kwargs or "cid" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "name" not in kwargs or "rgb" not in kwargs or "map" not in kwargs or "cid" not in kwargs:
+ # return JSONRPCInvalidParams()
c = get_controller(kwargs['cid'])
""" :type c: ledd.controller.Controller """
if c is None:
log.warning("Controller not found: id=%s", kwargs['cid'])
- return JSONRPCError(-1002, "Controller not found")
+ # return JSONRPCError(-1002, "Controller not found")
- s = Stripe(name=kwargs['name'], rgb=bool(kwargs['rgb']),
- channel_r=kwargs['map']['r'], channel_g=kwargs['map']['g'], channel_b=kwargs['map']['b'])
+ s = RGBStripe(name=kwargs['name'], rgb=bool(kwargs['rgb']),
+ channel_r=kwargs['map']['r'], channel_g=kwargs['map']['g'], channel_b=kwargs['map']['b'])
s.controller = c
log.debug("Added stripe %s to controller %s; new len %s", s.id, c.id, len(c.stripes))
- session.add(s)
- session.commit()
- stripes.append(s)
+ # session = Session()
+ # session.add(s)
+ # session.commit()
+ leds.append(s)
return {'sid': s.id}
-@dispatcher.add_method
-def get_stripes(**kwargs):
+def get_leds(**kwargs):
"""
Part of the Color API. Used to get all registered stripes known to the daemon.
Required parameters: -
"""
rjson = {
- 'ccount': len(controller),
- 'controller': controller
+ # 'ccount': len(controller),
+ # 'controller': controller
}
return rjson
-@dispatcher.add_method
def test_channel(**kwargs):
"""
Part of the Color API. Used to test a channel on a specified controller.
Required parameters: controller id: cid, channel, value
"""
- if "cid" not in kwargs or "channel" not in kwargs or "value" not in kwargs:
- return JSONRPCInvalidParams()
+ # if "cid" not in kwargs or "channel" not in kwargs or "value" not in kwargs:
+ # return JSONRPCInvalidParams()
contr = get_controller(kwargs['cid'])
""" :type : ledd.controller.Controller """
@@ -350,14 +303,13 @@ def test_channel(**kwargs):
try:
contr.set_channel(kwargs['channel'], kwargs['value'], 2.8)
except OSError as e:
- return JSONRPCError(-1009, "Internal Error", e)
+ pass
+ # return JSONRPCError(-1009, "Internal Error", e)
else:
- return JSONRPCError(-1002, "Controller not found")
-
- return ""
+ pass
+ # return JSONRPCError(-1002, "Controller not found")
-@dispatcher.add_method
def discover(**kwargs):
"""
Part of the Color API. Used by mobile applications to find the controller.
@@ -368,15 +320,33 @@ def discover(**kwargs):
def get_stripe(sid):
- for s in stripes:
- if s.id == sid:
- return s
+ pass
+ # for s in stripes:
+ # if s.id == sid:
+ # return s
def get_controller(cid):
- for c in controller:
- if c.id == cid:
- return c
+ pass
+ # for c in controller:
+ # if c.id == cid:
+ # return c
+
+
+function_mapping = {WrapperMsg.Type.LED_GET_ALL: get_leds,
+ WrapperMsg.Type.LED_ADD: add_led,
+ WrapperMsg.Type.CLIENT_ADD: add_client,
+ # WrapperMsg.Type.LED_PERC_SET: ,
+ # WrapperMsg.Type.LED_PERC_GET: ,
+ # WrapperMsg.Type.CLIENT_LED_SET: ,
+ # WrapperMsg.Type.CLIENT_GET: ,
+ # WrapperMsg.Type.CLIENT_GET_LED_OPTIONS: ,
+ # WrapperMsg.Type.CLIENT_SET_LOCAL_DIRECT: ,
+ # WrapperMsg.Type.LEDGROUP_GET: ,
+ # WrapperMsg.Type.LEDGROUP_GET_ALL: ,
+ # WrapperMsg.Type.LEDGROUP_SET_COLOR: ,
+ # WrapperMsg.Type.LEDGROUP_ADD: ,
+ }
class LedDProtocol(asyncio.Protocol):
@@ -388,21 +358,23 @@ class LedDProtocol(asyncio.Protocol):
def data_received(self, data):
try:
- d_decoded = data.decode()
+ wrapper_msg = WrapperMsg()
+ wrapper_msg = wrapper_msg.ParseFromString(data)
except UnicodeDecodeError:
log.warning("Recieved undecodable data, ignoring")
else:
- self.select_task(d_decoded)
+ self.select_task(wrapper_msg)
def select_task(self, data):
if data:
- data_split = data.splitlines()
- for line in data_split:
- if line:
- try:
- self.transport.write(JSONRPCResponseManager.handle(line, dispatcher).json.encode())
- except TypeError as te:
- log.warning("Can't send response: %s", te)
+ response = function_mapping[data.type](data)
+
+ if response:
+ try:
+ # noinspection PyUnresolvedReferences
+ self.transport.write(response.SerializeToString())
+ except TypeError as te:
+ log.warning("Can't send response: %s", te)
def connection_lost(self, exc):
log.info("Lost connection to %s", self.transport.get_extra_info("peername"))
diff --git a/ledd/db_helper.py b/ledd/db_helper.py
new file mode 100644
index 0000000..6998fe0
--- /dev/null
+++ b/ledd/db_helper.py
@@ -0,0 +1,22 @@
+DB_VERSION = 1
+
+
+def check_db(conn):
+ cur = conn.cursor()
+
+ cur.execute("SELECT value FROM meta WHERE name='version'")
+
+ ver = cur.fetchone()
+ if ver:
+ ver = int(ver)
+
+ if ver < DB_VERSION:
+ upgrade_db(conn, ver, DB_VERSION)
+ else:
+ with open('sql/ledd.sql', 'r') as f:
+ cur.executescript(f.read())
+ conn.commit()
+
+
+def upgrade_db(conn, old, new):
+ pass
diff --git a/ledd/effects/__init__.py b/ledd/effect/__init__.py
similarity index 100%
rename from ledd/effects/__init__.py
rename to ledd/effect/__init__.py
diff --git a/ledd/effects/baseeffect.py b/ledd/effect/baseeffect.py
similarity index 93%
rename from ledd/effects/baseeffect.py
rename to ledd/effect/baseeffect.py
index 6e54087..229def7 100644
--- a/ledd/effects/baseeffect.py
+++ b/ledd/effect/baseeffect.py
@@ -17,7 +17,7 @@
class BaseEffect(object):
"""
- This class only defines default meta-data for effects.
+ This class only defines default meta-data for effect.
"""
name = "BaseEffect"
version = "0.1"
diff --git a/ledd/effectstack.py b/ledd/effect/effectstack.py
similarity index 96%
rename from ledd/effectstack.py
rename to ledd/effect/effectstack.py
index 0b8e029..89cfad5 100644
--- a/ledd/effectstack.py
+++ b/ledd/effect/effectstack.py
@@ -16,7 +16,7 @@
import asyncio
-from ledd.effects.fadeeffect import FadeEffect
+from ledd.effect.fadeeffect import FadeEffect
class EffectStack(object):
diff --git a/ledd/effects/fadeeffect.py b/ledd/effect/fadeeffect.py
similarity index 95%
rename from ledd/effects/fadeeffect.py
rename to ledd/effect/fadeeffect.py
index b13b5bd..a911592 100644
--- a/ledd/effects/fadeeffect.py
+++ b/ledd/effect/fadeeffect.py
@@ -16,7 +16,7 @@
import spectra
-from ledd.effects.generatoreffect import GeneratorEffect
+from ledd.effect.generatoreffect import GeneratorEffect
class FadeEffect(GeneratorEffect):
diff --git a/ledd/effects/generatoreffect.py b/ledd/effect/generatoreffect.py
similarity index 92%
rename from ledd/effects/generatoreffect.py
rename to ledd/effect/generatoreffect.py
index ac91f20..cd91108 100644
--- a/ledd/effects/generatoreffect.py
+++ b/ledd/effect/generatoreffect.py
@@ -16,12 +16,12 @@
from spectra import Color
-from ledd.effects.baseeffect import BaseEffect
+from ledd.effect.baseeffect import BaseEffect
class GeneratorEffect(BaseEffect):
"""
- This is a base class for simple effects.
+ This is a base class for simple effect.
It should yield a new color on each execution.
"""
diff --git a/ledd/led/__init__.py b/ledd/led/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/ledd/stripe.py b/ledd/led/rgb_stripe.py
similarity index 92%
rename from ledd/stripe.py
rename to ledd/led/rgb_stripe.py
index 8d1f98d..b02e2ba 100644
--- a/ledd/stripe.py
+++ b/ledd/led/rgb_stripe.py
@@ -15,16 +15,11 @@
# along with this program. If not, see .
from spectra import Color
-from sqlalchemy import Integer, ForeignKey, String, Float, Boolean
-from sqlalchemy import Column
-from sqlalchemy.orm import reconstructor
-
-from . import Base
-class Stripe(Base):
+class RGBStripe:
"""
- A stripe is the smallest controllable unit.
+ A group of leds representing an common RGB stripe.
"""
__tablename__ = "stripe"
id = Column(Integer, primary_key=True)
diff --git a/ledd/models.py b/ledd/models.py
deleted file mode 100644
index d28ed8d..0000000
--- a/ledd/models.py
+++ /dev/null
@@ -1,29 +0,0 @@
-# LEDD Project
-# Copyright (C) 2015 LEDD Team
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see .
-
-from sqlalchemy import String, Column
-
-from . import Base
-
-
-class Meta(Base):
- __tablename__ = "meta"
- option = Column(String, primary_key=True)
- value = Column(String)
-
- @classmethod
- def get_version(cls):
- return cls.query.filter(Meta.option == "db_version").first()
diff --git a/ledd/protobuf/__init__.py b/ledd/protobuf/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/ledd/protobuf/client_pb2.py b/ledd/protobuf/client_pb2.py
new file mode 100644
index 0000000..d0f9827
--- /dev/null
+++ b/ledd/protobuf/client_pb2.py
@@ -0,0 +1,379 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: client.proto
+
+import sys
+
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='client.proto',
+ package='ledd',
+ syntax='proto3',
+ serialized_pb=_b(
+ '\n\x0c\x63lient.proto\x12\x04ledd\"\xd3\x01\n\x06\x43lient\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x0f\n\x07max_led\x18\x03 \x01(\x05\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t\x12\x12\n\nresolution\x18\x06 \x01(\x05\x12\x0c\n\x04port\x18\x07 \x01(\x05\x12*\n\x07options\x18\n \x03(\x0b\x32\x19.ledd.Client.OptionsEntry\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"(\n\x07\x43lients\x12\x1d\n\x07\x63lients\x18\x01 \x03(\x0b\x32\x0c.ledd.Client\"?\n\x16\x43lientSetPercentageAll\x12\x12\n\npercentage\x18\x01 \x01(\x02\x12\x11\n\tclient_id\x18\x02 \x03(\x05\"<\n\x14\x43lientSetLocalDirect\x12\x10\n\x08local_id\x18\x01 \x01(\x05\x12\x12\n\npercentage\x18\x02 \x01(\x02\"x\n\x10\x43lientLEDOptions\x12\x34\n\x07options\x18\x01 \x03(\x0b\x32#.ledd.ClientLEDOptions.OptionsEntry\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x62\x06proto3')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_CLIENT_OPTIONSENTRY = _descriptor.Descriptor(
+ name='OptionsEntry',
+ full_name='ledd.Client.OptionsEntry',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='key', full_name='ledd.Client.OptionsEntry.key', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='value', full_name='ledd.Client.OptionsEntry.value', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=188,
+ serialized_end=234,
+)
+
+_CLIENT = _descriptor.Descriptor(
+ name='Client',
+ full_name='ledd.Client',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='id', full_name='ledd.Client.id', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='address', full_name='ledd.Client.address', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='max_led', full_name='ledd.Client.max_led', index=2,
+ number=3, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='name', full_name='ledd.Client.name', index=3,
+ number=4, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='version', full_name='ledd.Client.version', index=4,
+ number=5, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='resolution', full_name='ledd.Client.resolution', index=5,
+ number=6, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='port', full_name='ledd.Client.port', index=6,
+ number=7, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='options', full_name='ledd.Client.options', index=7,
+ number=10, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[_CLIENT_OPTIONSENTRY, ],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=23,
+ serialized_end=234,
+)
+
+_CLIENTS = _descriptor.Descriptor(
+ name='Clients',
+ full_name='ledd.Clients',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='clients', full_name='ledd.Clients.clients', index=0,
+ number=1, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=236,
+ serialized_end=276,
+)
+
+_CLIENTSETPERCENTAGEALL = _descriptor.Descriptor(
+ name='ClientSetPercentageAll',
+ full_name='ledd.ClientSetPercentageAll',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='percentage', full_name='ledd.ClientSetPercentageAll.percentage', index=0,
+ number=1, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client_id', full_name='ledd.ClientSetPercentageAll.client_id', index=1,
+ number=2, type=5, cpp_type=1, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=278,
+ serialized_end=341,
+)
+
+_CLIENTSETLOCALDIRECT = _descriptor.Descriptor(
+ name='ClientSetLocalDirect',
+ full_name='ledd.ClientSetLocalDirect',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='local_id', full_name='ledd.ClientSetLocalDirect.local_id', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='percentage', full_name='ledd.ClientSetLocalDirect.percentage', index=1,
+ number=2, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=343,
+ serialized_end=403,
+)
+
+_CLIENTLEDOPTIONS_OPTIONSENTRY = _descriptor.Descriptor(
+ name='OptionsEntry',
+ full_name='ledd.ClientLEDOptions.OptionsEntry',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='key', full_name='ledd.ClientLEDOptions.OptionsEntry.key', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='value', full_name='ledd.ClientLEDOptions.OptionsEntry.value', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=188,
+ serialized_end=234,
+)
+
+_CLIENTLEDOPTIONS = _descriptor.Descriptor(
+ name='ClientLEDOptions',
+ full_name='ledd.ClientLEDOptions',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='options', full_name='ledd.ClientLEDOptions.options', index=0,
+ number=1, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[_CLIENTLEDOPTIONS_OPTIONSENTRY, ],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=405,
+ serialized_end=525,
+)
+
+_CLIENT_OPTIONSENTRY.containing_type = _CLIENT
+_CLIENT.fields_by_name['options'].message_type = _CLIENT_OPTIONSENTRY
+_CLIENTS.fields_by_name['clients'].message_type = _CLIENT
+_CLIENTLEDOPTIONS_OPTIONSENTRY.containing_type = _CLIENTLEDOPTIONS
+_CLIENTLEDOPTIONS.fields_by_name['options'].message_type = _CLIENTLEDOPTIONS_OPTIONSENTRY
+DESCRIPTOR.message_types_by_name['Client'] = _CLIENT
+DESCRIPTOR.message_types_by_name['Clients'] = _CLIENTS
+DESCRIPTOR.message_types_by_name['ClientSetPercentageAll'] = _CLIENTSETPERCENTAGEALL
+DESCRIPTOR.message_types_by_name['ClientSetLocalDirect'] = _CLIENTSETLOCALDIRECT
+DESCRIPTOR.message_types_by_name['ClientLEDOptions'] = _CLIENTLEDOPTIONS
+
+Client = _reflection.GeneratedProtocolMessageType('Client', (_message.Message,), dict(
+
+ OptionsEntry=_reflection.GeneratedProtocolMessageType('OptionsEntry', (_message.Message,), dict(
+ DESCRIPTOR=_CLIENT_OPTIONSENTRY,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.Client.OptionsEntry)
+ ))
+ ,
+ DESCRIPTOR=_CLIENT,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.Client)
+))
+_sym_db.RegisterMessage(Client)
+_sym_db.RegisterMessage(Client.OptionsEntry)
+
+Clients = _reflection.GeneratedProtocolMessageType('Clients', (_message.Message,), dict(
+ DESCRIPTOR=_CLIENTS,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.Clients)
+))
+_sym_db.RegisterMessage(Clients)
+
+ClientSetPercentageAll = _reflection.GeneratedProtocolMessageType('ClientSetPercentageAll', (_message.Message,), dict(
+ DESCRIPTOR=_CLIENTSETPERCENTAGEALL,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.ClientSetPercentageAll)
+))
+_sym_db.RegisterMessage(ClientSetPercentageAll)
+
+ClientSetLocalDirect = _reflection.GeneratedProtocolMessageType('ClientSetLocalDirect', (_message.Message,), dict(
+ DESCRIPTOR=_CLIENTSETLOCALDIRECT,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.ClientSetLocalDirect)
+))
+_sym_db.RegisterMessage(ClientSetLocalDirect)
+
+ClientLEDOptions = _reflection.GeneratedProtocolMessageType('ClientLEDOptions', (_message.Message,), dict(
+
+ OptionsEntry=_reflection.GeneratedProtocolMessageType('OptionsEntry', (_message.Message,), dict(
+ DESCRIPTOR=_CLIENTLEDOPTIONS_OPTIONSENTRY,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.ClientLEDOptions.OptionsEntry)
+ ))
+ ,
+ DESCRIPTOR=_CLIENTLEDOPTIONS,
+ __module__='client_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.ClientLEDOptions)
+))
+_sym_db.RegisterMessage(ClientLEDOptions)
+_sym_db.RegisterMessage(ClientLEDOptions.OptionsEntry)
+
+_CLIENT_OPTIONSENTRY.has_options = True
+_CLIENT_OPTIONSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+_CLIENTLEDOPTIONS_OPTIONSENTRY.has_options = True
+_CLIENTLEDOPTIONS_OPTIONSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+# @@protoc_insertion_point(module_scope)
diff --git a/ledd/protobuf/hsv_pb2.py b/ledd/protobuf/hsv_pb2.py
new file mode 100644
index 0000000..e79e38a
--- /dev/null
+++ b/ledd/protobuf/hsv_pb2.py
@@ -0,0 +1,79 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: hsv.proto
+
+import sys
+
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='hsv.proto',
+ package='ledd',
+ syntax='proto3',
+ serialized_pb=_b(
+ '\n\thsv.proto\x12\x04ledd\",\n\x03HSV\x12\x0b\n\x03hue\x18\x01 \x01(\x02\x12\x0b\n\x03sat\x18\x02 \x01(\x02\x12\x0b\n\x03val\x18\x03 \x01(\x02\x62\x06proto3')
+)
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_HSV = _descriptor.Descriptor(
+ name='HSV',
+ full_name='ledd.HSV',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='hue', full_name='ledd.HSV.hue', index=0,
+ number=1, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='sat', full_name='ledd.HSV.sat', index=1,
+ number=2, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='val', full_name='ledd.HSV.val', index=2,
+ number=3, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=19,
+ serialized_end=63,
+)
+
+DESCRIPTOR.message_types_by_name['HSV'] = _HSV
+
+HSV = _reflection.GeneratedProtocolMessageType('HSV', (_message.Message,), dict(
+ DESCRIPTOR=_HSV,
+ __module__='hsv_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.HSV)
+))
+_sym_db.RegisterMessage(HSV)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/ledd/protobuf/led_pb2.py b/ledd/protobuf/led_pb2.py
new file mode 100644
index 0000000..ec030b3
--- /dev/null
+++ b/ledd/protobuf/led_pb2.py
@@ -0,0 +1,450 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: led.proto
+
+import sys
+
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+from . import hsv_pb2 as hsv__pb2
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='led.proto',
+ package='ledd',
+ syntax='proto3',
+ serialized_pb=_b(
+ '\n\tled.proto\x12\x04ledd\x1a\thsv.proto\"\x9d\x01\n\x03LED\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x10\n\x08local_id\x18\x03 \x01(\x05\x12\x11\n\tclient_id\x18\x04 \x01(\x05\x12\'\n\x07options\x18\n \x03(\x0b\x32\x16.ledd.LED.OptionsEntry\x1a.\n\x0cOptionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x8b\x01\n\x08LEDGroup\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12&\n\x04type\x18\x03 \x01(\x0e\x32\x18.ledd.LEDGroup.GroupType\x12\x0c\n\x04size\x18\x04 \x01(\x05\x12\x0f\n\x07led_ids\x18\n \x03(\x05\"\x1e\n\tGroupType\x12\x07\n\x03RGB\x10\x00\x12\x08\n\x04USER\x10\x01\"\x1f\n\x04LEDs\x12\x17\n\x04leds\x18\x01 \x03(\x0b\x32\t.ledd.LED\"/\n\tLEDGroups\x12\"\n\nled_groups\x18\x01 \x03(\x0b\x32\x0e.ledd.LEDGroup\"0\n\rLEDPercentage\x12\x0b\n\x03led\x18\x01 \x01(\x05\x12\x12\n\npercentage\x18\x02 \x01(\x02\"8\n\rLEDGroupColor\x12\r\n\x05group\x18\x01 \x01(\x05\x12\x18\n\x05\x63olor\x18\x02 \x01(\x0b\x32\t.ledd.HSV\"1\n\x12LEDGroupPercentage\x12\r\n\x05group\x18\x01 \x01(\x05\x12\x0c\n\x04perc\x18\x02 \x01(\x02\x62\x06proto3')
+ ,
+ dependencies=[hsv__pb2.DESCRIPTOR, ])
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_LEDGROUP_GROUPTYPE = _descriptor.EnumDescriptor(
+ name='GroupType',
+ full_name='ledd.LEDGroup.GroupType',
+ filename=None,
+ file=DESCRIPTOR,
+ values=[
+ _descriptor.EnumValueDescriptor(
+ name='RGB', index=0, number=0,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='USER', index=1, number=1,
+ options=None,
+ type=None),
+ ],
+ containing_type=None,
+ options=None,
+ serialized_start=300,
+ serialized_end=330,
+)
+_sym_db.RegisterEnumDescriptor(_LEDGROUP_GROUPTYPE)
+
+_LED_OPTIONSENTRY = _descriptor.Descriptor(
+ name='OptionsEntry',
+ full_name='ledd.LED.OptionsEntry',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='key', full_name='ledd.LED.OptionsEntry.key', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='value', full_name='ledd.LED.OptionsEntry.value', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')),
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=142,
+ serialized_end=188,
+)
+
+_LED = _descriptor.Descriptor(
+ name='LED',
+ full_name='ledd.LED',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='name', full_name='ledd.LED.name', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='id', full_name='ledd.LED.id', index=1,
+ number=2, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='local_id', full_name='ledd.LED.local_id', index=2,
+ number=3, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client_id', full_name='ledd.LED.client_id', index=3,
+ number=4, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='options', full_name='ledd.LED.options', index=4,
+ number=10, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[_LED_OPTIONSENTRY, ],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=31,
+ serialized_end=188,
+)
+
+_LEDGROUP = _descriptor.Descriptor(
+ name='LEDGroup',
+ full_name='ledd.LEDGroup',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='name', full_name='ledd.LEDGroup.name', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='id', full_name='ledd.LEDGroup.id', index=1,
+ number=2, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='type', full_name='ledd.LEDGroup.type', index=2,
+ number=3, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='size', full_name='ledd.LEDGroup.size', index=3,
+ number=4, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_ids', full_name='ledd.LEDGroup.led_ids', index=4,
+ number=10, type=5, cpp_type=1, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ _LEDGROUP_GROUPTYPE,
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=191,
+ serialized_end=330,
+)
+
+_LEDS = _descriptor.Descriptor(
+ name='LEDs',
+ full_name='ledd.LEDs',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='leds', full_name='ledd.LEDs.leds', index=0,
+ number=1, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=332,
+ serialized_end=363,
+)
+
+_LEDGROUPS = _descriptor.Descriptor(
+ name='LEDGroups',
+ full_name='ledd.LEDGroups',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='led_groups', full_name='ledd.LEDGroups.led_groups', index=0,
+ number=1, type=11, cpp_type=10, label=3,
+ has_default_value=False, default_value=[],
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=365,
+ serialized_end=412,
+)
+
+_LEDPERCENTAGE = _descriptor.Descriptor(
+ name='LEDPercentage',
+ full_name='ledd.LEDPercentage',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='led', full_name='ledd.LEDPercentage.led', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='percentage', full_name='ledd.LEDPercentage.percentage', index=1,
+ number=2, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=414,
+ serialized_end=462,
+)
+
+_LEDGROUPCOLOR = _descriptor.Descriptor(
+ name='LEDGroupColor',
+ full_name='ledd.LEDGroupColor',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='group', full_name='ledd.LEDGroupColor.group', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='color', full_name='ledd.LEDGroupColor.color', index=1,
+ number=2, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=464,
+ serialized_end=520,
+)
+
+_LEDGROUPPERCENTAGE = _descriptor.Descriptor(
+ name='LEDGroupPercentage',
+ full_name='ledd.LEDGroupPercentage',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='group', full_name='ledd.LEDGroupPercentage.group', index=0,
+ number=1, type=5, cpp_type=1, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='perc', full_name='ledd.LEDGroupPercentage.perc', index=1,
+ number=2, type=2, cpp_type=6, label=1,
+ has_default_value=False, default_value=float(0),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=522,
+ serialized_end=571,
+)
+
+_LED_OPTIONSENTRY.containing_type = _LED
+_LED.fields_by_name['options'].message_type = _LED_OPTIONSENTRY
+_LEDGROUP.fields_by_name['type'].enum_type = _LEDGROUP_GROUPTYPE
+_LEDGROUP_GROUPTYPE.containing_type = _LEDGROUP
+_LEDS.fields_by_name['leds'].message_type = _LED
+_LEDGROUPS.fields_by_name['led_groups'].message_type = _LEDGROUP
+_LEDGROUPCOLOR.fields_by_name['color'].message_type = hsv__pb2._HSV
+DESCRIPTOR.message_types_by_name['LED'] = _LED
+DESCRIPTOR.message_types_by_name['LEDGroup'] = _LEDGROUP
+DESCRIPTOR.message_types_by_name['LEDs'] = _LEDS
+DESCRIPTOR.message_types_by_name['LEDGroups'] = _LEDGROUPS
+DESCRIPTOR.message_types_by_name['LEDPercentage'] = _LEDPERCENTAGE
+DESCRIPTOR.message_types_by_name['LEDGroupColor'] = _LEDGROUPCOLOR
+DESCRIPTOR.message_types_by_name['LEDGroupPercentage'] = _LEDGROUPPERCENTAGE
+
+LED = _reflection.GeneratedProtocolMessageType('LED', (_message.Message,), dict(
+
+ OptionsEntry=_reflection.GeneratedProtocolMessageType('OptionsEntry', (_message.Message,), dict(
+ DESCRIPTOR=_LED_OPTIONSENTRY,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LED.OptionsEntry)
+ ))
+ ,
+ DESCRIPTOR=_LED,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LED)
+))
+_sym_db.RegisterMessage(LED)
+_sym_db.RegisterMessage(LED.OptionsEntry)
+
+LEDGroup = _reflection.GeneratedProtocolMessageType('LEDGroup', (_message.Message,), dict(
+ DESCRIPTOR=_LEDGROUP,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDGroup)
+))
+_sym_db.RegisterMessage(LEDGroup)
+
+LEDs = _reflection.GeneratedProtocolMessageType('LEDs', (_message.Message,), dict(
+ DESCRIPTOR=_LEDS,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDs)
+))
+_sym_db.RegisterMessage(LEDs)
+
+LEDGroups = _reflection.GeneratedProtocolMessageType('LEDGroups', (_message.Message,), dict(
+ DESCRIPTOR=_LEDGROUPS,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDGroups)
+))
+_sym_db.RegisterMessage(LEDGroups)
+
+LEDPercentage = _reflection.GeneratedProtocolMessageType('LEDPercentage', (_message.Message,), dict(
+ DESCRIPTOR=_LEDPERCENTAGE,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDPercentage)
+))
+_sym_db.RegisterMessage(LEDPercentage)
+
+LEDGroupColor = _reflection.GeneratedProtocolMessageType('LEDGroupColor', (_message.Message,), dict(
+ DESCRIPTOR=_LEDGROUPCOLOR,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDGroupColor)
+))
+_sym_db.RegisterMessage(LEDGroupColor)
+
+LEDGroupPercentage = _reflection.GeneratedProtocolMessageType('LEDGroupPercentage', (_message.Message,), dict(
+ DESCRIPTOR=_LEDGROUPPERCENTAGE,
+ __module__='led_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LEDGroupPercentage)
+))
+_sym_db.RegisterMessage(LEDGroupPercentage)
+
+_LED_OPTIONSENTRY.has_options = True
+_LED_OPTIONSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001'))
+# @@protoc_insertion_point(module_scope)
diff --git a/ledd/protobuf/ledd_pb2.py b/ledd/protobuf/ledd_pb2.py
new file mode 100644
index 0000000..19a6796
--- /dev/null
+++ b/ledd/protobuf/ledd_pb2.py
@@ -0,0 +1,295 @@
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: ledd.proto
+
+import sys
+
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+from . import led_pb2 as led__pb2
+from . import client_pb2 as client__pb2
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+ name='ledd.proto',
+ package='ledd',
+ syntax='proto3',
+ serialized_pb=_b(
+ '\n\nledd.proto\x12\x04ledd\x1a\tled.proto\x1a\x0c\x63lient.proto\")\n\x04LedD\x12\x10\n\x08hostname\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\"\xe1\x06\n\nWrapperMsg\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.ledd.WrapperMsg.Type\x12\x16\n\x03led\x18\x02 \x01(\x0b\x32\t.ledd.LED\x12\x18\n\x04leds\x18\x03 \x01(\x0b\x32\n.ledd.LEDs\x12!\n\tled_group\x18\x04 \x01(\x0b\x32\x0e.ledd.LEDGroup\x12#\n\nled_groups\x18\x05 \x01(\x0b\x32\x0f.ledd.LEDGroups\x12%\n\x08led_perc\x18\x06 \x01(\x0b\x32\x13.ledd.LEDPercentage\x12,\n\x0fled_group_color\x18\x07 \x01(\x0b\x32\x13.ledd.LEDGroupColor\x12\x18\n\x04ledd\x18\x08 \x01(\x0b\x32\n.ledd.LedD\x12\x1c\n\x06\x63lient\x18\t \x01(\x0b\x32\x0c.ledd.Client\x12\x1e\n\x07\x63lients\x18\n \x01(\x0b\x32\r.ledd.Clients\x12\x35\n\x11\x63lient_set_direct\x18\x0b \x01(\x0b\x32\x1a.ledd.ClientSetLocalDirect\x12\x32\n\x12\x63lient_led_options\x18\x0c \x01(\x0b\x32\x16.ledd.ClientLEDOptions\x12\x39\n\x13\x63lient_set_perc_all\x18\r \x01(\x0b\x32\x1c.ledd.ClientSetPercentageAll\x12\x30\n\x0eled_group_perc\x18\x0e \x01(\x0b\x32\x18.ledd.LEDGroupPercentage\"\xae\x02\n\x04Type\x12\x0f\n\x0bLED_GET_ALL\x10\x00\x12\x0b\n\x07LED_ADD\x10\x01\x12\x0e\n\nCLIENT_ADD\x10\x02\x12\x17\n\x13\x43LIENT_SET_PERC_ALL\x10\x03\x12\x10\n\x0cLED_PERC_SET\x10\x04\x12\x10\n\x0cLED_PERC_GET\x10\x05\x12\x12\n\x0e\x43LIENT_LED_SET\x10\x06\x12\x0c\n\x08\x44ISCOVER\x10\x07\x12\x0e\n\nCLIENT_GET\x10\x08\x12\x1a\n\x16\x43LIENT_GET_LED_OPTIONS\x10\t\x12\x1b\n\x17\x43LIENT_SET_LOCAL_DIRECT\x10\n\x12\x10\n\x0cLEDGROUP_GET\x10\x0b\x12\x14\n\x10LEDGROUP_GET_ALL\x10\x0c\x12\x16\n\x12LEDGROUP_SET_COLOR\x10\r\x12\x10\n\x0cLEDGROUP_ADD\x10\x0e\x62\x06proto3')
+ ,
+ dependencies=[led__pb2.DESCRIPTOR, client__pb2.DESCRIPTOR, ])
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_WRAPPERMSG_TYPE = _descriptor.EnumDescriptor(
+ name='Type',
+ full_name='ledd.WrapperMsg.Type',
+ filename=None,
+ file=DESCRIPTOR,
+ values=[
+ _descriptor.EnumValueDescriptor(
+ name='LED_GET_ALL', index=0, number=0,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LED_ADD', index=1, number=1,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_ADD', index=2, number=2,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_SET_PERC_ALL', index=3, number=3,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LED_PERC_SET', index=4, number=4,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LED_PERC_GET', index=5, number=5,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_LED_SET', index=6, number=6,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='DISCOVER', index=7, number=7,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_GET', index=8, number=8,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_GET_LED_OPTIONS', index=9, number=9,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='CLIENT_SET_LOCAL_DIRECT', index=10, number=10,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LEDGROUP_GET', index=11, number=11,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LEDGROUP_GET_ALL', index=12, number=12,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LEDGROUP_SET_COLOR', index=13, number=13,
+ options=None,
+ type=None),
+ _descriptor.EnumValueDescriptor(
+ name='LEDGROUP_ADD', index=14, number=14,
+ options=None,
+ type=None),
+ ],
+ containing_type=None,
+ options=None,
+ serialized_start=652,
+ serialized_end=954,
+)
+_sym_db.RegisterEnumDescriptor(_WRAPPERMSG_TYPE)
+
+_LEDD = _descriptor.Descriptor(
+ name='LedD',
+ full_name='ledd.LedD',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='hostname', full_name='ledd.LedD.hostname', index=0,
+ number=1, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='version', full_name='ledd.LedD.version', index=1,
+ number=2, type=9, cpp_type=9, label=1,
+ has_default_value=False, default_value=_b("").decode('utf-8'),
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=45,
+ serialized_end=86,
+)
+
+_WRAPPERMSG = _descriptor.Descriptor(
+ name='WrapperMsg',
+ full_name='ledd.WrapperMsg',
+ filename=None,
+ file=DESCRIPTOR,
+ containing_type=None,
+ fields=[
+ _descriptor.FieldDescriptor(
+ name='type', full_name='ledd.WrapperMsg.type', index=0,
+ number=1, type=14, cpp_type=8, label=1,
+ has_default_value=False, default_value=0,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led', full_name='ledd.WrapperMsg.led', index=1,
+ number=2, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='leds', full_name='ledd.WrapperMsg.leds', index=2,
+ number=3, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_group', full_name='ledd.WrapperMsg.led_group', index=3,
+ number=4, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_groups', full_name='ledd.WrapperMsg.led_groups', index=4,
+ number=5, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_perc', full_name='ledd.WrapperMsg.led_perc', index=5,
+ number=6, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_group_color', full_name='ledd.WrapperMsg.led_group_color', index=6,
+ number=7, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='ledd', full_name='ledd.WrapperMsg.ledd', index=7,
+ number=8, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client', full_name='ledd.WrapperMsg.client', index=8,
+ number=9, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='clients', full_name='ledd.WrapperMsg.clients', index=9,
+ number=10, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client_set_direct', full_name='ledd.WrapperMsg.client_set_direct', index=10,
+ number=11, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client_led_options', full_name='ledd.WrapperMsg.client_led_options', index=11,
+ number=12, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='client_set_perc_all', full_name='ledd.WrapperMsg.client_set_perc_all', index=12,
+ number=13, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ _descriptor.FieldDescriptor(
+ name='led_group_perc', full_name='ledd.WrapperMsg.led_group_perc', index=13,
+ number=14, type=11, cpp_type=10, label=1,
+ has_default_value=False, default_value=None,
+ message_type=None, enum_type=None, containing_type=None,
+ is_extension=False, extension_scope=None,
+ options=None),
+ ],
+ extensions=[
+ ],
+ nested_types=[],
+ enum_types=[
+ _WRAPPERMSG_TYPE,
+ ],
+ options=None,
+ is_extendable=False,
+ syntax='proto3',
+ extension_ranges=[],
+ oneofs=[
+ ],
+ serialized_start=89,
+ serialized_end=954,
+)
+
+_WRAPPERMSG.fields_by_name['type'].enum_type = _WRAPPERMSG_TYPE
+_WRAPPERMSG.fields_by_name['led'].message_type = led__pb2._LED
+_WRAPPERMSG.fields_by_name['leds'].message_type = led__pb2._LEDS
+_WRAPPERMSG.fields_by_name['led_group'].message_type = led__pb2._LEDGROUP
+_WRAPPERMSG.fields_by_name['led_groups'].message_type = led__pb2._LEDGROUPS
+_WRAPPERMSG.fields_by_name['led_perc'].message_type = led__pb2._LEDPERCENTAGE
+_WRAPPERMSG.fields_by_name['led_group_color'].message_type = led__pb2._LEDGROUPCOLOR
+_WRAPPERMSG.fields_by_name['ledd'].message_type = _LEDD
+_WRAPPERMSG.fields_by_name['client'].message_type = client__pb2._CLIENT
+_WRAPPERMSG.fields_by_name['clients'].message_type = client__pb2._CLIENTS
+_WRAPPERMSG.fields_by_name['client_set_direct'].message_type = client__pb2._CLIENTSETLOCALDIRECT
+_WRAPPERMSG.fields_by_name['client_led_options'].message_type = client__pb2._CLIENTLEDOPTIONS
+_WRAPPERMSG.fields_by_name['client_set_perc_all'].message_type = client__pb2._CLIENTSETPERCENTAGEALL
+_WRAPPERMSG.fields_by_name['led_group_perc'].message_type = led__pb2._LEDGROUPPERCENTAGE
+_WRAPPERMSG_TYPE.containing_type = _WRAPPERMSG
+DESCRIPTOR.message_types_by_name['LedD'] = _LEDD
+DESCRIPTOR.message_types_by_name['WrapperMsg'] = _WRAPPERMSG
+
+LedD = _reflection.GeneratedProtocolMessageType('LedD', (_message.Message,), dict(
+ DESCRIPTOR=_LEDD,
+ __module__='ledd_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.LedD)
+))
+_sym_db.RegisterMessage(LedD)
+
+WrapperMsg = _reflection.GeneratedProtocolMessageType('WrapperMsg', (_message.Message,), dict(
+ DESCRIPTOR=_WRAPPERMSG,
+ __module__='ledd_pb2'
+ # @@protoc_insertion_point(class_scope:ledd.WrapperMsg)
+))
+_sym_db.RegisterMessage(WrapperMsg)
+
+
+# @@protoc_insertion_point(module_scope)
diff --git a/ledd/sql/ledd.sql b/ledd/sql/ledd.sql
deleted file mode 100644
index 381ef02..0000000
--- a/ledd/sql/ledd.sql
+++ /dev/null
@@ -1,24 +0,0 @@
-CREATE TABLE `stripes` (
- `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
- `name` TEXT,
- `rgb` INTEGER,
- `controller_id` INTEGER,
- `channel_r` INTEGER,
- `channel_g` INTEGER,
- `channel_b` INTEGER,
- `channel_r_gamma` REAL DEFAULT 2.8,
- `channel_g_gamma` REAL DEFAULT 2.8,
- `channel_b_gamma` REAL DEFAULT 2.8
-);
-CREATE TABLE "meta" (
- `option` TEXT,
- `value` TEXT
-);
-INSERT INTO `meta` VALUES ('db_version', '2');
-CREATE TABLE "controller" (
- `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
- `address` TEXT,
- `i2c_device` INTEGER,
- `channels` INTEGER,
- `pwm_freq` INTEGER
-);
\ No newline at end of file
diff --git a/ledd/sql/upgrade_1_2.sql b/ledd/sql/upgrade_1_2.sql
deleted file mode 100644
index a8845db..0000000
--- a/ledd/sql/upgrade_1_2.sql
+++ /dev/null
@@ -1,5 +0,0 @@
-ALTER TABLE stripes ADD COLUMN channel_r_gamma REAL DEFAULT 2.8;
-ALTER TABLE stripes ADD COLUMN channel_g_gamma REAL DEFAULT 2.8;
-ALTER TABLE stripes ADD COLUMN channel_b_gamma REAL DEFAULT 2.8;
-
-REPLACE INTO meta (`option`, `value`) VALUES (`db_version`, `2`);
\ No newline at end of file
diff --git a/protobuf/client.proto b/protobuf/client.proto
new file mode 100644
index 0000000..3776283
--- /dev/null
+++ b/protobuf/client.proto
@@ -0,0 +1,34 @@
+syntax = "proto3";
+
+package ledd;
+
+message Client {
+ int32 id = 1;
+ string address = 2;
+ int32 max_led = 3;
+ string name = 4;
+ string version = 5;
+ int32 resolution = 6;
+ int32 port = 7;
+
+ map options = 10;
+}
+
+message Clients {
+ repeated Client clients = 1;
+}
+
+message ClientSetPercentageAll {
+ float percentage = 1;
+ repeated int32 client_id = 2;
+}
+
+message ClientSetLocalDirect {
+ int32 local_id = 1;
+ float percentage = 2;
+}
+
+message ClientLEDOptions {
+ map options = 1;
+}
+
diff --git a/protobuf/hsv.proto b/protobuf/hsv.proto
new file mode 100644
index 0000000..75201a7
--- /dev/null
+++ b/protobuf/hsv.proto
@@ -0,0 +1,9 @@
+syntax = "proto3";
+
+package ledd;
+
+message HSV {
+ float hue = 1;
+ float sat = 2;
+ float val = 3;
+}
\ No newline at end of file
diff --git a/protobuf/led.proto b/protobuf/led.proto
new file mode 100644
index 0000000..fb8a8f1
--- /dev/null
+++ b/protobuf/led.proto
@@ -0,0 +1,51 @@
+syntax = "proto3";
+
+package ledd;
+
+import "hsv.proto";
+
+message LED {
+ string name = 1;
+ int32 id = 2;
+ int32 local_id = 3;
+ int32 client_id = 4;
+
+ map options = 10;
+}
+
+message LEDGroup {
+ enum GroupType {
+ RGB = 0;
+ USER = 1;
+ }
+
+ string name = 1;
+ int32 id = 2;
+ GroupType type = 3;
+ int32 size = 4;
+
+ repeated int32 led_ids = 10;
+}
+
+message LEDs {
+ repeated LED leds = 1;
+}
+
+message LEDGroups {
+ repeated LEDGroup led_groups = 1;
+}
+
+message LEDPercentage {
+ int32 led = 1;
+ float percentage = 2;
+}
+
+message LEDGroupColor {
+ int32 group = 1;
+ HSV color = 2;
+}
+
+message LEDGroupPercentage {
+ int32 group = 1;
+ float perc = 2;
+}
\ No newline at end of file
diff --git a/protobuf/ledd.proto b/protobuf/ledd.proto
new file mode 100644
index 0000000..23a1e30
--- /dev/null
+++ b/protobuf/ledd.proto
@@ -0,0 +1,50 @@
+syntax = "proto3";
+
+package ledd;
+
+import "led.proto";
+import "client.proto";
+
+message LedD {
+ string hostname = 1;
+ string version = 2;
+}
+
+message WrapperMsg {
+ enum Type {
+ LED_GET_ALL = 0;
+ LED_ADD = 1;
+ CLIENT_ADD = 2;
+ CLIENT_SET_PERC_ALL = 3;
+ LED_PERC_SET = 4;
+ LED_PERC_GET = 5;
+ CLIENT_LED_SET = 6;
+ DISCOVER = 7;
+ CLIENT_GET = 8;
+ CLIENT_GET_LED_OPTIONS = 9;
+ CLIENT_SET_LOCAL_DIRECT = 10;
+ LEDGROUP_GET = 11;
+ LEDGROUP_GET_ALL = 12;
+ LEDGROUP_SET_COLOR = 13;
+ LEDGROUP_ADD = 14;
+ }
+
+ // Identifies which field is filled in.
+ Type type = 1;
+
+ // One of the following will be filled in.
+ LED led = 2;
+ LEDs leds = 3;
+ LEDGroup led_group = 4;
+ LEDGroups led_groups = 5;
+ LEDPercentage led_perc = 6;
+ LEDGroupColor led_group_color = 7;
+ LedD ledd = 8;
+ Client client = 9;
+ Clients clients = 10;
+ ClientSetLocalDirect client_set_direct = 11;
+ ClientLEDOptions client_led_options = 12;
+ ClientSetPercentageAll client_set_perc_all = 13;
+ LEDGroupPercentage led_group_perc = 14;
+}
+
diff --git a/setup.py b/setup.py
index 959bead..19d5b6c 100644
--- a/setup.py
+++ b/setup.py
@@ -25,6 +25,10 @@ setup(name='LedD',
license='GPLv3',
packages=['ledd'],
install_requires=[
- 'nose', 'spectra', 'docopt', 'jsonrpc', 'sqlalchemy', 'coloredlogs'
+ 'nose', 'spectra', 'docopt',
],
+ extras_require={
+ 'systemd_logging': ["python-systemd"],
+ 'colored_logging': ["coloreddlogs"]
+ },
zip_safe=False)
diff --git a/sql/ledd.sql b/sql/ledd.sql
new file mode 100644
index 0000000..da2a64d
--- /dev/null
+++ b/sql/ledd.sql
@@ -0,0 +1,62 @@
+CREATE TABLE `meta` (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT,
+ `name` TEXT NOT NULL,
+ `value` TEXT NOT NULL
+);
+
+CREATE TABLE `client` (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT,
+ `connect_type` INT NOT NULL,
+ `addr` TEXT NOT NULL,
+ `reso` INT NULL,
+ `name` TEXT NOT NULL,
+ `options` TEXT NULL,
+ `port` INT NOT NULL
+);
+
+CREATE TABLE `led` (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT,
+ `name` TEXT NULL,
+ `options` TEXT NULL,
+ `local_id` INT NULL,
+ `client_id` INT NOT NULL,
+ CONSTRAINT `fk_led_client`
+ FOREIGN KEY (`client_id`)
+ REFERENCES `client` (`id`)
+ ON DELETE NO ACTION
+ ON UPDATE NO ACTION
+);
+
+CREATE INDEX `fk_led_client_idx`
+ ON `led` (`client_id` ASC);
+
+CREATE TABLE IF NOT EXISTS `group` (
+ `id` INTEGER PRIMARY KEY AUTOINCREMENT,
+ `name` TEXT NOT NULL,
+ `type` INT NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS `led_has_group` (
+ `led_id` INT NOT NULL,
+ `group_id` INT NOT NULL,
+ PRIMARY KEY (`led_id`, `group_id`),
+ CONSTRAINT `fk_led_has_group_led1`
+ FOREIGN KEY (`led_id`)
+ REFERENCES `led` (`id`)
+ ON DELETE NO ACTION
+ ON UPDATE NO ACTION,
+ CONSTRAINT `fk_led_has_group_group1`
+ FOREIGN KEY (`group_id`)
+ REFERENCES `group` (`id`)
+ ON DELETE NO ACTION
+ ON UPDATE NO ACTION
+);
+
+CREATE INDEX `fk_led_has_group_group1_idx`
+ ON `led_has_group` (`group_id` ASC);
+
+CREATE INDEX `fk_led_has_group_led1_idx`
+ ON `led_has_group` (`led_id` ASC);
+
+
+INSERT INTO meta ("name", "value") VALUES ("version", "1");