added missing files

This commit is contained in:
Jakub Husak
2016-12-01 00:16:11 +01:00
parent 68f9d7b21e
commit 62eee7a1ee
6 changed files with 1009 additions and 9 deletions
View File
+223
View File
@@ -0,0 +1,223 @@
from widgets import StringWidget, TitleWidget, HBarWidget, VBarWidget, IconWidget, ScrollerWidget, FrameWidget,NumberWidget
class Screen(object):
""" LCDproc Screen Object """
def __init__(self, server, ref):
""" Constructor """
self.server = server
self.ref = ref
self.name = ref
self.width = None
self.height = None
self.priority = None
self.heartbeat = None
self.backlight = None
self.duration = None
self.timeout = None
self.cursor = None
self.cursor_x = None
self.cursor_y = None
self.widgets = dict()
self.server.request("screen_add %s" % (ref))
self.set_cursor("off")
def set_name(self, name):
""" Set Screen Name """
self.name = name
self.server.request("screen_set %s name %s" % (self.ref, self.name))
def set_width(self, width):
""" Set Screen Width """
if width > 0 and width <= self.server.server_info.get("screen_width"):
self.width = width
self.server.request("screen_set %s wid %i" % (self.ref, self.width))
def set_height(self, height):
""" Set Screen Height """
if height > 0 and height <= self.server.server_info.get("screen_height"):
self.height = height
self.server.request("screen_set %s hgt %i" % (self.ref, self.height))
def set_cursor_x(self, x):
""" Set Screen Cursor X Position """
if x >= 0 and x <= self.server.server_info.get("screen_width"):
self.cursor_x = x
self.server.request("screen_set %s cursor_x %i" % (self.ref, self.cursor_x))
def set_cursor_y(self, y):
""" Set Screen Cursor Y Position """
if y >= 0 and y <= self.server.server_info.get("screen_height"):
self.cursor_y = y
self.server.request("screen_set %s cursor_y %i" % (self.ref, self.cursor_y))
def set_duration(self, duration):
""" Set Screen Change Interval Duration """
if duration > 0:
self.duration = duration
self.server.request("screen_set %s duration %i" % (self.ref, (self.duration * 8)))
def set_timeout(self, timeout):
""" Set Screen Timeout Duration """
if timeout > 0:
self.timeout = timeout
self.server.request("screen_set %s timeout %i" % (self.ref, (self.timeout * 8)))
def set_priority(self, priority):
""" Set Screen Priority Class """
if priority in ["hidden", "background", "info", "foreground", "alert", "input"]:
self.priority = priority
self.server.request("screen_set %s priority %s" % (self.ref, self.priority))
def set_backlight(self, state):
""" Set Screen Backlight Mode """
if state in ["on", "off", "toggle", "open", "blink", "flash"]:
self.backlight = state
self.server.request("screen_set %s backlight %s" % (self.ref, self.backlight))
def set_heartbeat(self, state):
""" Set Screen Heartbeat Display Mode """
if state in ["on", "off", "open"]:
self.heartbeat = state
self.server.request("screen_set %s heartbeat %s" % (self.ref, self.heartbeat))
def set_cursor(self, cursor):
""" Set Screen Cursor Mode """
if cursor in ["on", "off", "under", "block"]:
self.cursor = cursor
self.server.request("screen_set %s cursor %s" % (self.ref, self.cursor))
def clear(self):
""" Clear Screen """
w1 = StringWidget(self, ref="_w1_", text=" "*20, x=1, y=1)
w2 = StringWidget(self, ref="_w2_", text=" "*20, x=1, y=2)
w3 = StringWidget(self, ref="_w3_", text=" "*20, x=1, y=3)
w4 = StringWidget(self, ref="_w4_", text=" "*20, x=1, y=4)
def add_string_widget(self, ref, text="Text", x=1, y=1):
""" Add String Widget """
if ref not in self.widgets:
widget = StringWidget(screen=self, ref=ref, text=text, x=x, y=y)
self.widgets[ref] = widget
return self.widgets[ref]
def add_title_widget(self, ref, text="Title"):
""" Add Title Widget """
if ref not in self.widgets:
widget = TitleWidget(screen=self, ref=ref, text=text)
self.widgets[ref] = widget
return self.widgets[ref]
def add_hbar_widget(self, ref, x=1, y=1, length=10):
""" Add Horizontal Bar Widget """
if ref not in self.widgets:
widget = HBarWidget(screen=self, ref=ref, x=x, y=y, length=length)
self.widgets[ref] = widget
return self.widgets[ref]
def add_vbar_widget(self, ref, x=1, y=1, length=10):
""" Add Vertical Bar Widget """
if ref not in self.widgets:
widget = VBarWidget(screen=self, ref=ref, x=x, y=y, length=length)
self.widgets[ref] = widget
return self.widgets[ref]
def add_icon_widget(self, ref, x=1, y=1, name="heart"):
""" Add Icon Widget """
if ref not in self.widgets:
widget = IconWidget(screen=self, ref=ref, x=x, y=y, name=name)
self.widgets[ref] = widget
return self.widgets[ref]
def add_scroller_widget(self, ref, left=1, top=1, right=20, bottom=1, direction="h", speed=1, text="Message"):
""" Add Scroller Widget """
if ref not in self.widgets:
widget = ScrollerWidget(screen=self, ref=ref, left=left, top=top, right=right, bottom=bottom, direction=direction, speed=speed, text=text)
self.widgets[ref] = widget
return self.widgets[ref]
def add_frame_widget(self, ref, left=1, top=1, right=20, bottom=1, width=20, height=4, direction="h", speed=1):
""" Add Frame Widget """
if ref not in self.widgets:
widget = FrameWidget(screen=self, ref=ref, left=left, top=top, right=right, bottom=bottom, width=width, height=height, direction=direction, speed=speed)
self.widgets[ref] = widget
return self.widgets[ref]
def add_number_widget(self, ref, x=1, value=1):
""" Add Number Widget """
if ref not in self.widgets:
widget = NumberWidget(screen=self, ref=ref, x=x, value=value)
self.widgets[ref] = widget
return self.widgets[ref]
def del_widget(self, ref):
""" Delete/Remove A Widget """
self.server.request("widget_del %s %s" % (self.name, ref))
del(self.widgets[ref])
+153
View File
@@ -0,0 +1,153 @@
import telnetlib
import urllib
import select
from screen import Screen
class Server(object):
""" LCDproc Server Object """
def __init__(self, hostname="localhost", port=13666, debug=False):
""" Constructor """
self.debug = debug
self.hostname = hostname
self.port = port
self.tn = telnetlib.Telnet(self.hostname, self.port)
self.server_info = dict()
self.screens = dict()
self.keys = list()
def start_session(self):
""" Start Session """
response = self.request("hello")
print(response)
bits = response.split(" ")
self.server_info.update({
"server_version": bits[2],
"protocol_version": bits[4],
"screen_width": int(bits[7]),
"screen_height": int(bits[9]),
"cell_width": int(bits[11]),
"cell_height": int(bits[13])
})
return response
def request(self, command_string):
""" Request """
#self.tn.write((command_string + "\n").encode())
self.tn.write((command_string + "\n"))
if self.debug: print "Telnet Request: %s" % (command_string)
while True:
response = urllib.unquote(self.tn.read_until(b"\n").decode())
if "success" in response: # Normal successful reply
break
if "huh" in response: # Something went wrong
break
if "connect" in response: # Special reply to "hello"
break
# TODO Keep track of which screen is displayed
# Try again if response was key, menu or visibility notification.
if "huh" in response or self.debug: print "Telnet Response: %s" % (response[:-1])
return response
def poll(self):
"""
Poll
Check for a non-response string generated by LCDd and return any string read.
LCDd generates strings for key presses, menu events & screen visibility changes.
"""
if select.select([self.tn], [], [], 0) == ([self.tn], [], []):
response = urllib.unquote(self.tn.read_until(b"\n").decode())
if self.debug: print "Telnet Poll: %s" % (response[:-1])
# TODO Keep track of which screen is displayed
return response
else:
return None
def add_screen(self, ref):
""" Add Screen """
if ref not in self.screens:
screen = Screen(self, ref)
screen.clear() # TODO Check this is needed, new screens should be clear.
self.screens[ref] = screen
return self.screens[ref]
return self.screens[ref]
def del_screen(self, ref):
""" Delete/Remove Screen """
self.request("screen_del %s" % (ref))
del(self.screens[ref])
def add_key(self, ref, mode = "shared"):
"""
Add a key.
(ref)
Return key name or None on error
"""
if ref not in self.keys:
response = self.request("client_add_key %s -%s" % (ref, mode))
if "success" not in response: return None
self.keys.append(ref)
return ref
def del_key(self, ref):
"""
Delete a key.
(ref)
Return None or LCDd response on error
"""
if ref not in self.keys:
response = self.request("client_del_key %s" % (ref))
self.keys.remove(ref)
if "success" in response:
return None
else:
return response
def output(self, value):
"""
Sets the client's output (on, off, int)
Sets the general purpose output on some display modules to this value.
Use on to set all outputs to high state, and off to set all to low state.
The meaning of the integer value depends on your specific device, usually
it is a bit pattern describing the state of each output line.
Return None or LCDd response on error
"""
response = self.request(("output %s" % (value)).encode())
if "success" in response:
return None
else:
return response
def get_server_info(self):
"""
Returns information about the server and the connected
LCD as a dictionary with the following keys:
"server_version", "protocol_version",
"screen_width", "screen_height",
"cell_width", "cell_height"
"""
return self.server_info
+335
View File
@@ -0,0 +1,335 @@
import urllib
class StringWidget(object):
""" String Widget """
def __init__(self, screen, ref, x, y, text):
self.screen = screen
self.ref = ref
self.x = x
self.y = y
self.text = text
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref, self.ref, "string"))
self.update()
def update(self):
#print(self.text)
#print("n")
self.screen.server.request('widget_set %s %s %s %s "%s"' % (self.screen.ref, self.ref, self.x, self.y, self.text.replace('"', '\\"')))
def set_x(self, x):
self.x = x
self.update()
def set_y(self, y):
self.y = y
self.update()
def set_text(self, text):
self.text = text
self.update()
class TitleWidget(object):
""" Title Widget """
def __init__(self, screen, ref, text):
self.screen = screen
self.ref = ref
self.text = text
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref, self.ref, "title"))
self.update()
def update(self):
self.screen.server.request('widget_set %s %s "%s"' % (self.screen.ref, self.ref, self.text.replace('"', '\\"')))
def set_text(self, text):
self.text = text
self.update()
class HBarWidget(object):
def __init__(self, screen, ref, x, y, length):
self.screen = screen
self.ref = ref
self.x = x
self.y = y
self.length = length
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref, self.ref, "hbar"))
self.update()
def update(self):
self.screen.server.request("widget_set %s %s %s %s %s" % (self.screen.ref, self.ref, self.x, self.y, self.length))
def set_x(self, x):
self.x = x
self.update()
def set_y(self, y):
self.y = y
self.update()
def set_length(self, length):
self.length = length
self.update()
class VBarWidget(object):
def __init__(self, screen, ref, x, y, length):
self.screen = screen
self.ref = ref
self.x = x
self.y = y
self.length = length
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref, self.ref, "vbar"))
self.update()
def update(self):
self.screen.server.request("widget_set %s %s %s %s %s" % (self.screen.ref, self.ref, self.x, self.y, self.length))
def set_x(self, x):
self.x = x
self.update()
def set_y(self, y):
self.y = y
self.update()
def set_length(self, length):
self.length = length
self.update()
class IconWidget(object):
def __init__(self, screen, ref, x, y, name):
self.screen = screen
self.ref = ref
self.x = x
self.y = y
self.name = name
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref, self.ref, "icon"))
self.update()
def update(self):
self.screen.server.request("widget_set %s %s %s %s %s" % (self.screen.ref, self.ref, self.x, self.y, self.name))
def set_x(self, x):
self.x = x
self.update()
def set_y(self, y):
self.y = y
self.update()
def set_name(self, name):
self.name = name
self.update()
class ScrollerWidget(object):
def __init__(self, screen, ref, left, top, right, bottom, direction, speed, text):
self.screen = screen
self.ref = ref
self.left = left
self.top = top
self.right = right
self.bottom = bottom
self.direction = direction
self.speed = speed
self.text = text
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref,
self.ref,
"scroller"))
self.update()
def update(self):
self.screen.server.request('widget_set %s %s %s %s %s %s %s %s "%s"' % (self.screen.ref,
self.ref,
self.left,
self.top,
self.right,
self.bottom,
self.direction,
self.speed,
self.text.replace('"', '\\"')))
def set_left(self, left):
self.left = left
self.update()
def set_top(self, top):
self.top = top
self.update()
def set_right(self, right):
self.right = right
self.update()
def set_bottom(self, bottom):
self.bottom = bottom
self.update()
def set_direction(self, direction):
self.direction = direction
self.update()
def set_speed(self, speed):
self.speed = speed
self.update()
def set_text(self, text):
self.text = text
self.update()
class FrameWidget(object):
def __init__(self, screen, ref, left, top, right, bottom, width, height, direction, speed):
self.screen = screen
self.ref = ref
self.left = left
self.top = top
self.right = right
self.bottom = bottom
self.width = width
self.height = height
self.direction = direction
self.speed = speed
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref,
self.ref,
"frame"))
self.update()
def update(self):
self.screen.server.request('widget_set %s %s %s %s %s %s %s %s %s %s' % (self.screen.ref,
self.ref,
self.left,
self.top,
self.right,
self.bottom,
self.width,
self.height,
self.direction,
self.speed))
def set_left(self, left):
self.left = left
self.update()
def set_top(self, top):
self.top = top
self.update()
def set_right(self, right):
self.right = right
self.update()
def set_bottom(self, bottom):
self.bottom = bottom
self.update()
def set_width(self, width):
self.width = width
self.update()
def set_height(self, height):
self.height = height
self.update()
def set_direction(self, direction):
self.direction = direction
self.update()
def set_speed(self, speed):
self.speed = speed
self.update()
class NumberWidget(object):
def __init__(self, screen, ref, x, value):
self.screen = screen
self.ref = ref
self.x = x
self.value = value
self.screen.server.request("widget_add %s %s %s" % (self.screen.ref,
self.ref,
"num"))
self.update()
def update(self):
self.screen.server.request('widget_set %s %s %s %s' % (self.screen.ref,
self.ref,
self.x,
self.value))
def set_x(self, x):
self.x = x
self.update()
def set_value(self, value):
self.value = value
self.update()