Browse Source

Eerste werkende versie

Stan Jansen 5 years ago
commit
4f71eb3853
5 changed files with 252 additions and 0 deletions
  1. 1 0
      laatste_zender.txt
  2. 78 0
      vol
  3. 151 0
      webradio.py
  4. 17 0
      webradio.service
  5. 5 0
      zenders.csv

+ 1 - 0
laatste_zender.txt

@@ -0,0 +1 @@
+3

+ 78 - 0
vol

@@ -0,0 +1,78 @@
+#!/bin/bash
+
+MIX=amixer
+declare -i LO=0     # Minimum volume; try 10 to avoid complete silence
+declare -i HI=100   # Maximum volume; try 95 to avoid distortion
+declare -i ADJ=3    # Volume adjustment step size
+
+usage ()
+{
+	echo "Usage: `basename $0` [ - | + | N ]" >&2
+	echo "  where N is a whole number between $LO and $HI, inclusive." >&2
+	exit 1
+}
+
+# Zero or one argument
+[ $# -le 1 ] || usage
+
+# Argument must be one of: empty, -, +, number
+[[ $1 == ?(-|+|+([0-9])) ]] || usage
+
+ARG="$1"
+
+# Number argument
+if [[ $ARG == +([0-9]) ]]; then
+	# Strip leading zeros
+	while [[ $ARG == 0+([0-9]) ]]; do
+		ARG=${ARG#0}
+	done
+	# Must be between LO and HI
+	(( ARG >= LO && ARG <= HI )) || usage
+fi
+
+EXE=$(which $MIX)
+if [ -z "$EXE" ]; then
+	echo "Error: $MIX not found. Try \"sudo apt-get install alsa-utils\" first." >&2
+	exit 2
+fi
+
+GET=$($EXE cget numid=1)
+declare -i MIN=$(echo $GET | /bin/grep -E -o -e ',min=[^,]+' | /bin/grep -E -o -e '[0-9-]+')
+declare -i MAX=$(echo $GET | /bin/grep -E -o -e ',max=[^,]+' | /bin/grep -E -o -e '[0-9-]+')
+declare -i VAL=$(echo $GET | /bin/grep -E -o -e ': values=[0-9+-]+' | /bin/grep -E -o -e '[0-9-]+')
+
+if (( MIN >= MAX || VAL < MIN || VAL > MAX )); then
+	echo "Error: could not get the right values from $MIX output." >&2
+	exit 3
+fi
+
+declare -i LEN=0
+(( LEN = MAX - MIN ))
+
+declare -i ABS=0
+(( ABS = VAL - MIN ))
+
+declare -i PCT=0
+(( PCT = 100 * ABS / LEN ))
+
+if [ ! -z "$ARG" ]; then
+
+	declare -i OLD=$PCT
+
+	if [[ "$ARG" == "+" ]]; then
+		(( PCT += ADJ ))
+	elif [[ "$ARG" == "-" ]]; then
+		(( PCT -= ADJ ))
+	else
+		PCT=$ARG
+	fi
+
+	if [[ "$PCT" != "$OLD" ]]; then
+		(( ABS = PCT * LEN / 100 ))
+		(( VAL = MIN + ABS ))
+		$EXE -q cset numid=1 -- $VAL
+	fi
+fi
+
+echo $PCT
+exit 0

+ 151 - 0
webradio.py

@@ -0,0 +1,151 @@
+#!/usr/bin/python3
+
+from gpiozero import Button, LED
+from signal import pause
+from threading import Thread
+import serial
+import time
+from sys import argv
+import subprocess
+from math import ceil
+
+if len(argv) > 1:
+	serial_port = argv[1]
+else:
+	serial_port = "/dev/ttyUSB0"
+
+
+with open("zenders.csv") as file:
+	ZENDERLIJST = [("Uitschakelen", None)] + [tuple(line.strip().split("\t")) for line in file.readlines()]
+	
+
+class NoritakeDisplay:
+    def __init__(self, port, baudrate=19200, parity=serial.PARITY_EVEN, **kwargs):
+        self._serial = serial.Serial(port, baudrate=baudrate, parity=parity, **kwargs)
+
+    def reset(self):
+        self._serial.write(bytes([0x1B]))
+        time.sleep(0.01)
+        self._serial.write(bytes([0x49]))
+        time.sleep(0.01)
+        
+    def clear(self):
+        self._serial.write(bytes([0x0E]))
+        time.sleep(0.01)
+
+    def goto_begin(self):
+        self._serial.write(bytes([0x0C]))
+        time.sleep(0.01)
+
+    def block_cursor(self):
+        self._serial.write(bytes([0x15]))
+        time.sleep(0.01)
+
+    def line_cursor(self):
+        self._serial.write(bytes([0x14]))
+        time.sleep(0.01)
+
+    def cursor_off(self):
+        self._serial.write(bytes([0x16]))
+        time.sleep(0.01)
+
+    def print_text(self, text):
+#        self.clear()
+        self.goto_begin()
+        self._serial.write(text.encode('ascii'))
+    
+    def center_text(self, text):
+#        self.clear()
+        self.goto_begin()
+        start = ceil((20 - len(text))/2)
+        self._serial.write((" "*start).encode('ascii'))
+        self._serial.write(text.encode('ascii'))
+        self._serial.write((" "*(20 - start - len(text))).encode('ascii'))
+        
+    def type_text(self, text):
+        self.clear()
+        self.goto_begin()
+        for letter in text:
+            self._serial.write(letter.encode('ascii'))
+            time.sleep(.02)
+
+
+class WebRadio:
+	knop = Button(14)
+	links = Button(15)
+	rechts = Button(18)
+	zenderfile = "laatste_zender.txt"
+	laatst_gedraaid = None
+
+	def __init__(self, display):			
+		# Voeg display toe aan onze radio
+		self.display = display
+	
+		# Stel interrupts in voor de knoppen
+		self.knop.when_pressed = self.button_pressed
+		self.links.when_pressed = self.dial_turned
+		
+		# Start een thread om de staat van het display te controleren
+		self.thread = Thread(target=self.check_display)
+		self.thread.start()
+		with open(WebRadio.zenderfile, "r") as file:
+			self.zender = int(file.read().strip())
+			self.gekozen_zender = self.zender
+			
+		print(ZENDERLIJST[self.zender][0])
+	
+		self.display.center_text(ZENDERLIJST[self.zender][0])
+		self.mplayer = subprocess.Popen(["mplayer", ZENDERLIJST[self.zender][1]], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
+
+	def button_pressed(self):
+		self.gekozen_zender = self.zender
+
+		if self.zender == 0:
+			self.afsluiten()
+		else:
+			self.switch_zender()
+			with open(self.zenderfile, "w") as file:
+				file.write(str(self.gekozen_zender))
+		
+	
+	def afsluiten(self):
+		self.mplayer.terminate()
+		self.display.center_text("Doei!!")
+		self.thread.join()
+		time.sleep(2)
+		self.display.clear()
+		subprocess.call(["sudo", "shutdown", "-h", "now"])
+		
+	
+	def switch_zender(self):
+		self.mplayer.terminate()
+		self.mplayer = subprocess.Popen(["mplayer", ZENDERLIJST[self.zender][1]], stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
+	
+	def dial_turned(self):
+		if self.rechts.is_pressed:
+			self.zender = self.zender + 1 if self.zender < len(ZENDERLIJST) - 1 else 0
+		else:
+			self.zender = self.zender - 1 if self.zender > 0 else len(ZENDERLIJST) - 1
+
+		print(ZENDERLIJST[self.zender][0])
+		self.display.center_text(ZENDERLIJST[self.zender][0])
+		self.laatst_gedraaid = time.time()
+	
+	def check_display(self):
+		while True:
+			time.sleep(0.5)
+			if self.gekozen_zender == 0:
+				break
+			if self.laatst_gedraaid and time.time() - self.laatst_gedraaid > 5 and self.zender != self.gekozen_zender:
+				self.zender = self.gekozen_zender
+				print(ZENDERLIJST[self.zender][0])
+				self.display.center_text(ZENDERLIJST[self.zender][0])
+				self.laatst_gedraaid = None
+
+
+
+display = NoritakeDisplay(serial_port)
+webradio = WebRadio(display=display)
+
+pause()
+

+ 17 - 0
webradio.service

@@ -0,0 +1,17 @@
+[Unit]
+Description=webradio
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=pi
+Group=pi
+WorkingDirectory=/home/pi/
+ExecStart=/usr/bin/python3 /home/pi/webradio.py
+Restart=always
+StandardOutput=syslog
+StandardError=syslog
+
+[Install]
+WantedBy=multi-user.target

+ 5 - 0
zenders.csv

@@ -0,0 +1,5 @@
+NPO Radio 1	https://icecast.omroep.nl/radio1-bb-mp3
+NPO Radio 2	https://icecast.omroep.nl/radio2-bb-mp3
+NPO Radio 4	https://icecast.omroep.nl/radio4-bb-mp3
+Q Music	http://icecast-qmusic.cdp.triple-it.nl:80/Qmusic_nl_live_96.mp3
+Omroep GLD	http://stream.omroepgelderland.nl/radiogelderland