Software

Raspberry Pi (Python)

Die Webradio-Software, die auf dem Raspberry Pi läuft, besteht aus zwei in Python geschriebenen Teilprogrammen und der Skriptdatei monitor.sh. Das Skript wird beim Systemstart automatisch gestartet. Das geschieht über den folgeenden Eintrag in der Datei /etc/rc.local direkt vor der letzten Zeile "exit 0" :
/bin/sleep 5 && cd /home/pi/NAS1TB/Python/w2/ && ./monitor.sh &
Diese Zeile sorgt dafür, dass das Skript monitor.sh 5 Sekunden nach dem kompletten Hochfahren gestartet wird. Das Skript startet einerseits das Webradio (w2.py) und andererseits das Monitorprogramm (monitor.py), welches ständig überprüft, ob das Webradio noch "am Leben" ist (Watchdog-Funktion). Wenn nicht, werden alle Python-Anwendungen abgeschossen und neu gestartet.

Das Update der Radiodatenbank wird zyklisch (nach spätestens 7 Tagen) ausgeführt. Während der Durchführung des Updates kann kein Senderwechsel erfolgen, aber der zuletzt eingestellte Sender läuft in der Zeit weiter. Das Update holt aktuelle Senderdaten aus dem Internet und liest diese in eine Datenbank ein. Als Datenbankserver wird mysql benutzt.

Die Webradio-Software initialisiert erst einmal die Hardware (Display), startet den zuletzt gehörten Radiosender oder den Mediaplayer (je nachdem, was vor dem letzten Shutdown geöffnet war) und gelangt dann in die Hauptschleife des Webradios. Es werden neben dem Hauptthread zugleich eine ganze Reihe weiterer Threads gestartet:

- Abfrage der Display-Events
- Abfrage der Arduino-Events (z.B. Fernbedienung, Lautstärke usw.)
- Abfrage der Website-Events (Fernsteuerung)
- Update der Radiodatenbank

Im MainThread werden die verschiedenen Events abgefragt und verarbeitet. Außerdem wird

- der aktuelle Titel auf dem Display ausgegeben und (im Radiomodus) mit der Blacklist verglichen
- die Uhrzeit auf dem Display ausgegeben und mit der Timer-Liste abgeglichen

Die Webradio-Software liegt jetzt in ihrer 2. Version vor. Die wichtigste Änderung gegenüber der Version 1 ist die Verwendung mehrerer Threads. Dadurch hat sich die Reaktionsgeschwindigkeit stark verbessert. Außerdem ist die Software wegen der durchgängige Benutzung von Klassen und OOP besser modularisiert und übersichtlicher geworden. Natürlich wurde die Funktionalität des Webradios seit der 1. Version stark erweitert. Es ist der Mediaplayer, der Sleep-Timer, die Steuerung über das WebInterface u.v.m. dazugekommen.

Die einzelnen Python-Module und Dateien:

Python-Modul / Datei Zweck
Autostart und Überwachungssoftware
monitor.sh Bash Skript für den Autostart des Webradios und dessen Überwachung und ggf. Neustart
monitor.py Überwachung der Lebensfunktion der Webradio-Software (Watchdog)
monitor.ini Konfigurationsdatei für die Überwachung
Allgemeine Klassen (nicht speziell für das Webradio-Projekt)
Comm3Wire.py Klasse Comm3Wire für die Kommunikation zwischen zwei Mikrocontrollern. Die Klasse gibt es für den Raspberry Pi in Python und für den Arduino.
NextionDisplay.py Grundlegende Klasse zum Betreiben des NextionDisplays.
zusätzlich von der Software benötigte Dateien zur Datenbankverwaltung
latest.sql Wird von mysql benutzt, um die Sender-Datenbank neu aufzubauen.
latest.sql.gz Wird bei jedem Datenbank-Update aktuell aus dem Internet herunter geladen und enthält die Datei latest.sql.
updateDB.PrepareDB.sql Wird von mysql benutzt, die Datenbank vorzubereiten.
updateDB.PrepareTestDB.sql Damit wird eine Testdatenbank initiiert mit der die heruntergeladene Datei latest.sql getestet wird.
webradio.ini Speichert die Konfiguration des Webradios einschließlich der Favoriten.
Webradio-Software
w2.py Hauptprogramm:
Initialisierung der Hard- und Software und Hauptschleife
w2blacklist.py Klasse zum Verwalten der BlackList:
Anzeigen des Dialogs zum Hinzufügen, Editieren und Löschen von Blacklist-Einträgen
w2comm.py Kommunikation zwischen Raspberry Pi und Arduino über 3 GPIO-Leitungen (siehe Klasse Comm3Wire)
w2config.py Lesen und Schreiben der Datei webradio.ini
w2database.py Alle Routinen zur Verwaltung der benutzten Datenbanken
benutzt werden die folgenden Datenbanken:
- webradioStations (Tables Station, Countries und Tags)
- webradioExtraLists (Tables BlackList, RecentList und TimerList)
w2display.py Von NextionDisplay abgeleitete Klasse Display zum Ansteuern und Abfragen des Nextion-Displays.
w2favoriten.py Klasse zum Verwalten der Favoriten.
Die Favoriten werden in der Datei webradio.ini gespeichert. Da hier von einer konstanten Zahl Datensätze auszugehen ist, ist das Speichern in einer Datenbank unnötig.
w2filterlist.py Klasse für die beiden Filter-Dialogboxen
w2global.py Enthält alle globalen Variablen und ein paar damit verbundenen Funktionen.
w2listbox.py Klasse NextionListbox zur Darstellung von Listboxen im Nextion-Display.
w2logfile.py Klasse zum Anzeigen des Logfiles im Webinterface.
w2mediaplayer.py Klasse aller Funktionsaufrufe des Mediaplayers
w2radio.py Klasse aller Funktionsaufrufe des Webradios
w2recentlist.py Von NextionListbox abgeleitete Klasse zur Dialog gesteuerten Verwaltung der Recent List.
w2stationlist.py Von NextionListbox abgeleitete Klasse zur Dialog gesteuerten Auswahl einer Radiostation aus der Stationsliste.
w2thread.py Gemeinsame Klasse aller Threads.
w2timer.py Klasse zur Verwaltung der Timer-Funktionen
w2update.py Klasse zur Steuerung des Datenbank-Updates
w2utilities.py Allgemeine Funktionen
w2webremote.py Klasse zum Abfragen der Events (Fernsteuerung) des Webinterfaces
w2website.py Stellt die dynamischen Daten des Webinterfaces bereit

Arduino

Der Coprozessor vom Typ Arduino Nano Pro hat folgende Aufgaben:
- Abfrage der Fernbedienung
- Abfrage des Lautstärkereglers und Power-Switch
- Ansteuerung des RGB-LED-Streifen
- Ansteuerung des elektronischen Lautstärkereglers FM62429
- Hardwareseitiges Ein- und Ausschalten des Raspberry Pi über den Schalteingang des Step-Down-Schaltreglers
- Kommunikation mit dem Raspberry Pi über 3 GPIO-Leitungen (siehe Comm3Wire-Klasse)