mirror of
https://github.com/pkali/piradio-mini.git
synced 2026-05-20 22:34:22 +02:00
added missing files
This commit is contained in:
Executable
+289
@@ -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(<width>) 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
|
||||
@@ -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])
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user