From 62eee7a1eeb19936dceac9bf1abd5613a5391a0a Mon Sep 17 00:00:00 2001 From: Jakub Husak Date: Thu, 1 Dec 2016 00:16:11 +0100 Subject: [PATCH] added missing files --- lcd_lcdproc_class.py | 289 +++++++++++++++++++++++++++++++++++++ lcdproc/__init__.py | 0 lcdproc/screen.py | 223 ++++++++++++++++++++++++++++ lcdproc/server.py | 153 ++++++++++++++++++++ lcdproc/widgets.py | 335 +++++++++++++++++++++++++++++++++++++++++++ radio4.py | 18 +-- 6 files changed, 1009 insertions(+), 9 deletions(-) create mode 100755 lcd_lcdproc_class.py create mode 100644 lcdproc/__init__.py create mode 100644 lcdproc/screen.py create mode 100644 lcdproc/server.py create mode 100644 lcdproc/widgets.py diff --git a/lcd_lcdproc_class.py b/lcd_lcdproc_class.py new file mode 100755 index 0000000..f46b79d --- /dev/null +++ b/lcd_lcdproc_class.py @@ -0,0 +1,289 @@ +#!/usr/bin/env python +# -*- coding: latin-1 -*- +# +# $Id: lcd_class.py,v 1.27 2016/04/06 09:48:25 bob Exp $ +# Raspberry Pi Internet Radio +# using an HD44780 LCD display +# +# Author : Bob Rathbone +# Site : http://www.bobrathbone.com +# +# From original LCD routines : Matt Hawkins +# Site : http://www.raspberrypi-spy.co.uk +# Timing improvements fromobert Coward/Paul Carpenter +# Site : http://www.raspberrypi-spy.co.uk +# http://www.pcserviceslectronics.co.uk +# +# Expanded to use 4 x 20 display +# +# This program uses Music Player Daemon 'mpd'and it's client 'mpc' +# See http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki +# +# License: GNU V3, See https://www.gnu.org/copyleft/gpl.html +# +# Disclaimer: Software is provided as is and absolutly no warranties are implied or given. +# The authors shall not be liable for any loss or damage however caused. +# + +import os +import time +import RPi.GPIO as GPIO +from translate_class import Translate +from config_class import Configuration +from lcdproc.server import Server + +server=Server() + +# The wiring for the LCD is as follows: +# 1 : GND +# 2 : 5V +# 3 : Contrast (0-5V)* +# 4 : RS (Register Select) +# 5 : R/W (Read Write) - GROUND THIS PIN +# 6 : Enable or Strobe +# 7 : Data Bit 0 - NOT USED +# 8 : Data Bit 1 - NOT USED +# 9 : Data Bit 2 - NOT USED +# 10: Data Bit 3 - NOT USED +# 11: Data Bit 4 +# 12: Data Bit 5 +# 13: Data Bit 6 +# 14: Data Bit 7 +# 15: LCD Backlight +5V** +# 16: LCD Backlight GND + +# Define GPIO to LCD mapping +##LCD_RS = 7 +##LCD_E = 8 +##LCD_D4_21 = 21 # Rev 1 Board +##LCD_D4_27 = 27 # Rev 2 Board +##LCD_D5 = 22 +##LCD_D6 = 23 +##LCD_D7 = 24 +#lcd_bri = 10 # Brightness control (Pecus) + +# Define LCD device constants +LCD_WIDTH = 20 # Default characters per line +##LCD_CHR = True +##LCD_CMD = False + +LCD_LINE_1 = 1 +LCD_LINE_2 = 2 +LCD_LINE_3 = 3 +LCD_LINE_4 = 4 + +# Some LCDs use different addresses (16 x 4 line LCDs) +# Comment out the above two lines and uncomment the two lines below +# LCD_LINE_3 = 0x90 # LCD RAM address for the 3rd line +# LCD_LINE_4 = 0xD0 # LCD RAM address for the 4th line + +# If using a 4 x 16 display also amend the lcd.setWidth() statement in rradio4.py + +# Timing constants + +translate = Translate() + +# Temporary files for displayed text. /tmp is a tempfs in RAM (Pecus) +# Remember! If you don't want to kill your SD card, add line in /etc/fstab : (Pecus) +# 'tmpfs /tmp /tmpfs size=10M,noatime 0 0' (Pecus) +Line1File = "/tmp/radiod/line1.txt" # (Pecus) +Line2File = "/tmp/radiod/line2.txt" # (Pecus) +Line3File = "/tmp/radiod/line3.txt" # (Pecus) +Line4File = "/tmp/radiod/line4.txt" # (Pecus) + + +# Lcd Class +class Lcd_lcdproc: + width = LCD_WIDTH + # If display can support umlauts set to True else False + RawMode = False # Test only + ScrollSpeed = 0.25 # Default scroll speed + + def __init__(self): + # Create files for displayed texts (Pecus) + if not os.path.isdir("/tmp/radiod/"): # (Pecus) + os.mkdir ("/tmp/radiod/") # (Pecus) + self.writeToFile (Line1File,"1") # (Pecus) + self.writeToFile (Line2File,"2") # (Pecus) + self.writeToFile (Line3File,"3") # (Pecus) + self.writeToFile (Line4File,"4") # (Pecus) + return + + # Initialise for either revision 1 or 2 boards + def init(self,boardRevision): + + self.lcd_init() + return + + # Initialise the display + def lcd_init(self): + # INIT + server.start_session() + self.screen = server.add_screen("Screen") + self.screen.set_heartbeat("off") + self.screen.set_duration(5) + self.line1_widget = self.screen.add_scroller_widget("MyStringWidget1", text="01234567890123456789",speed=2) + self.line2_widget = self.screen.add_scroller_widget("MyStringWidget2", text="11234567890123456789",speed=2) + self.line3_widget = self.screen.add_scroller_widget("MyStringWidget3", text="21234567890123456789",speed=2) + self.line4_widget = self.screen.add_scroller_widget("MyStringWidget4", text="31234567890123456789",speed=2) + self.line1_widget.set_top(1); + self.line2_widget.set_top(2); + self.line3_widget.set_top(3); + self.line4_widget.set_top(4); + self.line1_widget.set_left(1); + self.line2_widget.set_left(1); + self.line3_widget.set_left(1); + self.line4_widget.set_left(1); + self.line1_widget.set_direction("m"); + self.line2_widget.set_direction("m"); + self.line3_widget.set_direction("m"); + self.line4_widget.set_direction("m"); + #time.sleep(0.3) # Allow to settle before using + return + + # Set the display width + def setWidth(self,width): + self.width = width + return + + # Send string to display + def _string(self,message,line,speed): + s = message.ljust(self.width," ") + if not self.RawMode: + s = translate.toLCD(s) + if len(s)<=20: + speed=0 + + if speed==0: + s=s[0:19] + else: + s=s[0:160]+" " + + + # SET TEXT + if line==1: + self.line1_widget.set_text(s) + self.line1_widget.set_speed(speed) + elif line==2: + self.line2_widget.set_text(s) + self.line2_widget.set_speed(speed) + elif line==3: + self.line3_widget.set_text(s) + self.line3_widget.set_speed(speed) + else: + self.line4_widget.set_text(s) + self.line4_widget.set_speed(speed) + return + + # Display Line 1 on LED + def line1(self,text): + self.writeToFile (Line1File,text) # (Pecus) + # WRITE LINE 1 + self._string(text,1,0) + return + + # Display Line 2 on LED + def line2(self,text): + self.writeToFile (Line2File,text) # (Pecus) + # WRITE LINE 2 + self._string(text,2,0) + return + + # Display Line 3 on LED + def line3(self,text): + self.writeToFile (Line3File,text) # (Pecus) + # WRITE LINE 3 + self._string(text,3,0) + return + + # Display Line 4 on LED + def line4(self,text): + self.writeToFile (Line4File,text) # (Pecus) + # WRITE LINE 4 + self._string(text,4,0) + return + + # Scroll message on line 1 + def scroll1(self,mytext,interrupt): + self.writeToFile (Line1File,mytext) # (Pecus) + self._scroll(mytext,LCD_LINE_1,interrupt) + return + + # Scroll message on line 2 + def scroll2(self,mytext,interrupt): + self.writeToFile (Line2File,mytext) # (Pecus) + self._scroll(mytext,LCD_LINE_2,interrupt) + return + + # Scroll message on line 3 + def scroll3(self,mytext,interrupt): + self.writeToFile (Line3File,mytext) # (Pecus) + self._scroll(mytext,LCD_LINE_3,interrupt) + return + + # Scroll message on line 4 + def scroll4(self,mytext,interrupt): + self.writeToFile (Line4File,mytext) # (Pecus) + self._scroll(mytext,LCD_LINE_4,interrupt) + return + + # Scroll line - interrupt() breaks out routine if True + def _scroll(self,mytext,line,interrupt): + + # WRITE PARTICULAR LINE line + self._string(mytext,line,2) + print "SCROLL: " + mytext + return + + # Set Scroll line speed - Best values are 0.2 and 0.3 + # Limit to between 0.05 and 1.0 + def setScrollSpeed(self,speed): + #print "SCROLL SPEED: "+str(speed) + if speed < 0.1: + speed = 0.2 + elif speed > 1.0: + speed = 0.3 + self.ScrollSpeed = speed + speed=int(speed*10) + #self.line1_widget.set_speed(speed) + #self.line2_widget.set_speed(speed) + #self.line3_widget.set_speed(speed) + #self.line4_widget.set_speed(speed) + return + + # Set raw mode on (No translation) + def setRawMode(self,value): + self.RawMode = value + return + + # Clear display + def clearDisplay(self): + self.writeToFile (Line1File,"") # (Pecus) + self.writeToFile (Line2File,"") # (Pecus) + self.writeToFile (Line3File,"") # (Pecus) + self.writeToFile (Line4File,"") # (Pecus) + # CLEAR DISPLAY + self._string(" ",1) + self._string(" ",2) + self._string(" ",3) + self._string(" ",4) + time.sleep(E_POSTCLEAR) + return + + # Set brightness (Pecus) + def setBright(self,value): + #GPIO.output(lcd_bri, value) + if value : + self.screen.set_backlight("on") + else: + self.screen.set_backlight("off") + return + + # Write text to file (Pecus) + def writeToFile(self,fname,text): # (Pecus) + file = open(fname, "w") # (Pecus) + file.write(text) # (Pecus) + file.close() # (Pecus) + return # (Pecus) + +# End of Lcd_lcdproc class diff --git a/lcdproc/__init__.py b/lcdproc/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lcdproc/screen.py b/lcdproc/screen.py new file mode 100644 index 0000000..84df77f --- /dev/null +++ b/lcdproc/screen.py @@ -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]) diff --git a/lcdproc/server.py b/lcdproc/server.py new file mode 100644 index 0000000..b50d803 --- /dev/null +++ b/lcdproc/server.py @@ -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 diff --git a/lcdproc/widgets.py b/lcdproc/widgets.py new file mode 100644 index 0000000..dc23d56 --- /dev/null +++ b/lcdproc/widgets.py @@ -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() diff --git a/radio4.py b/radio4.py index f6c919f..7961618 100755 --- a/radio4.py +++ b/radio4.py @@ -2,7 +2,7 @@ # # Raspberry Pi Internet Radio # using an HD44780 LCD display -# $Id: radio4.py,v 1.111 2016/08/07 13:33:49 bob Exp $ +# $Id: radio4.py,v 1.108 2016/01/31 13:34:22 bob Exp $ # # Author : Bob Rathbone # Site : http://www.bobrathbone.com @@ -35,7 +35,7 @@ import traceback # Class imports from radio_daemon import Daemon from radio_class import Radio -from lcd_class import Lcd +from lcd_lcdproc_class import Lcd_lcdproc from log_class import Log from rss_class import Rss from config_class import Configuration # for configuration read (Pecus) @@ -54,7 +54,7 @@ PlaylistsDirectory = "/var/lib/mpd/playlists/" log = Log() radio = Radio() -lcd = Lcd() +lcd = Lcd_lcdproc() rss = Rss() config = Configuration() # for configuration read (Pecus) @@ -414,7 +414,7 @@ def get_switch_states(lcd,radio,rss): unmuteRadio(lcd,radio) if display_mode == radio.MODE_SOURCE: - radio.toggleSource(UP) + radio.toggleSource() #radio.setReload(True) elif display_mode == radio.MODE_SEARCH: @@ -443,7 +443,7 @@ def get_switch_states(lcd,radio,rss): unmuteRadio(lcd,radio) if display_mode == radio.MODE_SOURCE: - radio.toggleSource(DOWN) + radio.toggleSource() #radio.setReload(True) elif display_mode == radio.MODE_SEARCH: @@ -880,12 +880,12 @@ def display_search(lcd,radio): index = radio.getSearchIndex() source = radio.getSource() current_id = radio.getCurrentID() + #lcd.line1("Search:" + str(index + 1)) if source == radio.PLAYER: - lcd.line1("Search:" + str(index + 1)) current_artist = radio.getArtistName(index) - lcd.scroll2(current_artist[0:160],interrupt) - lcd.scroll3(radio.getTrackNameByIndex(index),interrupt) + lcd.line2(current_artist[0:19]) + lcd.line3(radio.getTrackNameByIndex(index)) lcd.line4(radio.getProgress()) elif source == radio.PANDORA: lcd.line1("Search:" + str(radio.pandora_search_index + 1)) @@ -1049,7 +1049,7 @@ def displayInfo(lcd,ipaddr,mpd_version): lcd.line3(mpd_version) lcd.line4("GPIO version " + GPIO.VERSION) if ipaddr is "": - lcd.line3("No IP network") + lcd.line1("No IP network") else: lcd.scroll1("IP "+ ipaddr,interrupt) return