Themabewertung:
  • 3 Bewertung(en) - 3.67 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ein minimales Internetradio für alte und neue Raspberrys
#21
(28.10.2018, 15:28)Radiobastler schrieb: Hallo zusammen,

Bernhard macht hier echt Lust auf mehr!

Hallo Martin, vielen Dank für die Blumen!

(28.10.2018, 15:28)Radiobastler schrieb: Nun werde ich mich endlich mal mit C/C++ beschäftigen müssen.
Mein einziger diesbezüglicher Berührungspunkt war bisher der Arduino, allerdings weiß ich nicht, wie nahe die Arduino-IDE an dem ist, was der Linux-eigene Compiler GCC 'versteht'.

Hinter der Arduino-IDE versteckt sich der avr-gcc, also ein gcc speziell für den Mikrokontroller. Es lohnt sich aber jetzt nicht die Befehle der ganzen Bibliotheken
für den Arduino auswendig zu lernen, die werden beim Raspberry nämlich nicht genutzt! Wenn man eine Programmiersprache wie C lernen will, dann reicht es sich die wesentlichen Sprachmerkmale und den Syntax der Sprache einzuprägen. Wie werden also Programme aufgeteilt, wie sehen Kontrollstrukturen aus usw. Das alles passt dann auf ein oder zwei Din A-4 Seiten. Steht man nun vor dem Problem die Eingänge oder Ausgänge des Raspberrys programmiertechnisch zu erfassen , schaut man sich um welche Bibliotheken es dafür gibt, also ab zu Google. Jede Bibliothek hat eine Übersicht der Befehle (Funktionsnamen) und damit arbeitet man einfach.  

Ich schreibe aber noch ein paar Buchtipps zum Thema Programmieren in C und C++.

(28.10.2018, 15:28)Radiobastler schrieb: Als erstes werde ich versuchen, ein textbasiertes Frontend für die Konsole zu basteln, um das Radio testen zu können.

Ein sehr guter Einstieg!

(28.10.2018, 15:28)Radiobastler schrieb: Mein 'Bedienkonzept' sieht ja vor, dass ich bei den Nachrüstlösungen die Senderwahl mittels Poti an den Skalenantrieb ankoppeln will.
Die Potiposition wird dann über einen I²C-ADC an den Raspi übertragen.
Ein Poti hat den Vorteil, dass ich nach dem wiedereinschalten eines Gerätes hinreichend genau weiß, wo der Skalenzeiger momentan steht.
Dazu muss ich nur noch beim VLC nachsehen, ob es dort ein Kommando gibt, welches mir z.B. den 5. Sender aus der Playliste spielt.

Das kenne ich doch irgendwo her? ;-)
Ja VLC hat dafür einen goto-Befehl der als Option den Programmplatz hat bzw. den Index der Station in der Playlist.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#22
(28.10.2018, 17:41)Radiobastler schrieb: Hallo zusammen,


Zitat:Preisfrage an die angehenden Linuxprogrammierer! Das Pimoroni-Radio hat noch zwei Taster für Lauter und Leiser! Wie muss der Programmcode von gpiod.c erweitert werden damit diese Funktion auch hier gegeben wäre?

Es müssen noch die vlc-Kommandos 'volup[x]' und 'voldown[x]' eingefügt werden.
Dabei steht 'x' in eckiger Klammer für den Wert, um welchen die Lautstärke erhöht bzw. erniedrigt werden soll.
Natürlich dazu noch die Abfrage der betreffenden Tasten.

Also z.B.:
if (val_prg_leiser == 0)

                system("echo \"voldown [10]\" | nc 127.0.0.1 9294 -N");

Tastendefinition für leiser bzw. lauter wie weiter oben im Quellcode beschrieben.


Grüße

Martin

Fast, die Eckigen-Klammern geben in solchen Beispielen immer die optionalen Parameter an und müssen selbst nicht geschrieben werden. Der System-Aufruf, wenn man es denn einfach mit dem nc (Netcat-Programm) macht ,lautet so:

system("echo \"voldown 2\" | nc 127.0.0.1 9294 -N");

Mit jedem Aufruf wird dem Remote-Control-Interface von vlc, welches an Port 9294 lauscht, der Befehl voldown 2 gesendet und somit die Lautstärke um zwei Prozentpunkte abgesenkt.

Wenn hinter der Variablen val_prg_leiser der Wert des Eingangspins für den Leise-Taster steht, dann ist die if-Bedinung richtig.

Frage 1: Findet jemand die Stelle im iRadio-Paket an der man die Portnummer vom RC-Interface von vlc festlegen kann?
Frage 2: Was macht der Aufrufparameter -N ?
Frage 3: Wie erhalte ich mit Netcat eine komplette Übersicht aller von vlc verstandenen Kommandos?

Viele Grüße
Bernhard.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#23
Hier nun eine preiswerte Lösung für die Nachrüstung von Internetradioempfang an alten Radios. Ein alter nicht mehr gebrauchter Raspberry (Singlecore 700 MHz, 512 MB RAM), dazu ein Touchdisplay für 15-20 Euro von Amazon. Die Tonausgabe erfolgt onBoard, die Qualität ist auch für die alten Radios mehr als ausreichend.  Passende Gehäuse für Rechner und Display gibt es ab 5 Euro bei den bekannten Versandhäusern.
An den alten Radios muss nichts geändert werden!

       

Als Basis kann ein Raspbian (Desktopversion) mit dem von mir zusammengestellten iRadio-Paket dienen. Das Bedienprogramm ist mit FLTK (http://www.fltk.org/index.php) aufgebaut und braucht sehr wenig Ressourcen (Siehe Problematik Pimoroni auf alten PIs).

Die Tonzuführung erfolgt hier (ausnahmsweise) per Kabel, da sich sicher einige Internetnutzer am Einsatz des Si4713 oder eines AM-Senders "aufreiben" würden. Natürlich kann der Pi auch solchen externen Sendern als Modulationsquelle dienen. Auch eine automatische zeitgesteuerte Umschaltung von Programmen ist eine Kleinigkeit, ebenso eine Fernsteuerung per Internet, falls der 10 kW Sender "Offshore" ist. Tongue

   

   

Bei Bedarf kann ich im Einzelfall programmiertechnische Unterstützung geben, fragen zu Einrichtung beantworte ich natürlich gern.
Hier noch eine Demo an ein paar alten "geerbten" Kofferradios.




Gruß
B45
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#24
Hallo zusammen,

heute habe ich meine ersten 'Gehversuche' mit C gemacht, ich komme eigentlich aus der Pascal-Ecke.
Ich habe vor vielen Jahren mal einen Programmierkurs bei Christiani gemacht, damals mit dem legendären Turbo-Pascal von Borland.
Heute arbeite ich mit Delphi.

Bei den ersten Gehversuchen ist das herausgekommen:


.png   Bildschirmfoto vom 2018-11-01 21-51-17.png (Größe: 20,08 KB / Downloads: 711)

Außer den Text anzeigen tut das Progrämmchen noch nichts.
Es sollte aber kein größeres Problem mehr sein, mittels einer 'case'-Verzweigung auf die Tasteneingaben zu reagieren und die entsprechenden Kommandos für VLC aufzurufen.


Grüße

Martin
Zitieren
#25
Sehr sehr gut Martin! Das wird wunderbar, bitte weiter so!

Über Email habe ich die Anfrage bekommen, ob ich nicht zeigen könnte, wie man eine grafische Benutzeroberfläche auf dem Raspberry für das iRadio-Paket erstellen kann. Da dies vielleicht für andere Nutzer auch interessant sein kann, beantworte ich die Frage im Forum.

Nun wie ich ja schon erwähnt habe, baue ich grafische Benutzeroberflächen auf solchen Kleinrechnern gern mit kompakten und schnellen Bibliotheken. Damit werden weder die CPU, noch der Arbeitsspeicher übermäßig in Anspruch genommen.

   

Eine dieser schmalen und schnellen Bibliotheken ist die FLTK (kurz für Fast and Light Toolkit) welche direkt auf der Xlib bzw. X11 aufsetzt.
Ich möchte hier zeigen wie man FLTK auf das System bringt und wie man ein kurzes Programm für unser iRadio programmiert.

Da die meisten Nutzer hier wahrscheinlich auf einer Windows-Workstation programmieren werden, müssen wir zunächst noch etwas unter dem Windows-System nachinstallieren. Und zwar müssen wir Windows das "Bildschirmsystem" von Unix/Linux beibringen. Dazu installieren wir einen XServer für Windows, ich habe mich seit langer Zeit für Xming entschieden. Den XServer erhält man unter https://sourceforge.net/projects/xming/

   

Man installiert das Programm wie jedes andere Windowsprogramm auch. Ich möchte nun zeigen wofür wir es brauchen. Bisher haben wir den Raspberry in allen Bastelthreads remote mit SSH angesprochen und bedient. Dabei war es uns nur möglich Consolenprogramme aufzurufen, das soll sich jetzt ändern.

Zunächst starten wir unsere Windows-Workstation mit unserer Arbeitsumgebung. Dann rufen wir (wenn nicht im Autostart verankert) das Programm Xming auf. Viel passiert da erstmal nicht, kommt noch.
Im nächsten Schritt starten wir unser altbekanntes PuTTY, im Bereich Host Name schreiben wir den Hostnamen des Internetradios oder dessen IP, wir klicken aber noch nicht(!) auf Open.


.jpg   putty1.JPG (Größe: 49,74 KB / Downloads: 681)

Bevor wir die Verbindung zum Internetradio öffnen, müssen wir für grafische Bildschirmausgaben noch eine zusätzliche Option setzen.
Links im Baum gehen wir zum Abzweig "Connection" und "SSH", dort nochmal auf "X11". Im rechten Teil wählen wir den Punkt "Enable X11 forwarding" aus. Danach können wir die Verbindung mit Klick auf "open" öffnen.


.jpg   putty2.JPG (Größe: 82,85 KB / Downloads: 684)

Was ist nun anders nachdem wir uns mit unseren Zugangsdaten über den Wartungsanschluß des Radios eingeloggt haben? Es sieht doch nicht anders aus? Richtig, aber wir können jetzt über die Console grafische Programme starten, diese werden auf der entfernten Unix/Linux-Maschine ausgeführt, die Bildschirmausgabe aber wird über das Netz zu uns umgeleitet.

Testen wir das ganze mal mit einem kleinen "Spaßprogramm". Der X11 Bibliothek werden kleine Programme mitgeliefert um die Funktion von X11 zu veranschaulichen. So zum Beispiel das Programm xeyes. Es zeichnet zwei Augen die dem Mauszeiger folgen.
Starten wir das Programm also mal über die Console und schauen was passiert.


.jpg   xeyes.JPG (Größe: 60,72 KB / Downloads: 676)

Mit Hilfe von Xming öffnet sich jetzt wie von Zauberhand ein weiteres Fenster! Das ist die Bildschirmausgabe des entfernten Rechners, das Programm läuft dort, die Bildschirmausgabe wird umgeleitet. Das Ganze funktioniert auch mit ernsthafteren Programmen wie zum Beispiel einem Webbrowser. Schließen wir das Fenster von xeyes und rufen über SSH in der Konsole den Befehl chromium-browser auf, dann startet der Webbrowser "Chromium" von Google. Das Ausgabefenster erscheint wieder bei uns auf der Workstation, das Programm aber wird auf der entfernten Maschine ausgeführt.

Gut nun gehen wir dazu über FLTK auf unserer Maschine zu installieren. Wir werden die Bibliothek aus Ihren Quellen heraus bauen.
Über die Download-Seite des Projektes (http://www.fltk.org/software.php) besorgen wir uns die aktuelle Version 1.3.4-2.
Es werden verschiedene gepackte Archive angeboten (tar.gz oder tar.bz2). Laden wir uns eines dieser Archive runter (entweder remote per X11 mittels eines Webbrowsers oder lokal auf die Arbeitsmaschine und schieben das Archiv per USB-Stick auf das Internetradio).
Nach dem Entpacken des Archivs, in meinem Fall in /home/pi/FLTK/fltk-1.3.4-2 , liegt uns nun der ganze Sourcecode der Bibliothek vor.


Wir wechseln zum Bauen der Bibliothek in das entpackte Stammverzeichnis der Quellen, bei mir also mittels

cd /home/pi/FLTK/fltk-1.3.4-2

Als nächstes rufen wir wieder das Tool configure auf:

./configure

configure kann mit verschiedenen Optionen aufgerufen werden, hier eine Übersicht zur Information:

   You can run configure yourself to get the exact setup you
    need. Type "./configure <options>".  Options include:

        --enable-cygwin         - Enable the Cygwin libraries (WIN32)
        --enable-debug          - Enable debugging code & symbols
        --disable-gl                 - Disable OpenGL support
        --enable-shared         - Enable generation of shared libraries
        --enable-threads        - Enable multithreading support
        --enable-xdbe           - Enable the X double-buffer extension
        --enable-xft               - Enable the Xft library (anti-aliased fonts)

        --bindir=/path          - Set the location for executables
                                  [default = /usr/local/bin]
        --libdir=/path          - Set the location for libraries
                                  [default = /usr/local/lib]
        --includedir=/path      - Set the location for include files.
                                  [default = /usr/local/include]
        --prefix=/dir           - Set the directory prefix for files
                                  [default = /usr/local]



Danach starten wir den Make-Prozess durch Eingabe von:

make

Jetzt wird die Bibliothek vom Compiler gebaut, ebenso sämtliche Test- und Demoprogramme die mitgeliefert werden. Der eigentliche Buildprozess kann einige Zeit in Anspruch nehmen, vielleicht kann man die Zeit mit einem Kaffee, Bier oder Toilettengang sinnvoll verbringen. Smile 

Ist der Buildprozess abgeschlossen, dann installieren wir die soeben gebaute FLTK-Bibliothek im System durch Eingabe von:

make install

Nach wenigen Augenblicken ist das Script abgearbeitet und die FLTK-Bibliothek im System installiert.

Jetzt wollen wir ein kleines Demoprogamm schreiben. Die Voraussetzung dafür ist, das das iRadio-Paket was ich zusammengestellt habe bereits installiert ist und uns schon ein Radioprogramm abspielt. Das sollte aber im Normalfall so sein.

Legen wir unser Testprogramm in der Datei test.cxx im Verzeichnis des Pakets iRadio an.

cd /home/pi/iRadio
touch test.cxx

Danach öffnen wir die Quelldatei unseres Testprogramms test.cxx durch Eingabe von:

nano test.cxx

Danach kopieren wir folgenden Quellcode über die Zwischenablage in das nano-Fenster von PuTTY.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/fl_draw.H>
#include <FL/Enumerations.H>
#include <FL/Fl_Widget.H>

void hndl_btnprevstation(Fl_Widget *, void *) {
 system("echo \"prev\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnnextstation(Fl_Widget *, void *) {
 system("echo \"next\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnvolup(Fl_Widget *, void *) {
 system("echo \"volup 2\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnvoldown(Fl_Widget *, void *) {
 system("echo \"voldown 2\" | nc 127.0.0.1 9294 -N");
}


int main(int argc, char **argv) {

 Fl_Window *window = new Fl_Window(480,290,"iRadio");

 Fl_Button *btnvolup = new Fl_Button(165, 75, 70, 65, "@+");
 Fl_Button *btnprevstation = new Fl_Button(165, 150, 70 , 65, "@<<");
 Fl_Button *btnnextstation = new Fl_Button(245, 150, 70, 65, "@>> ");
 Fl_Button *btnvoldown = new Fl_Button(245, 75, 70, 65, "@line");

 btnprevstation->callback(hndl_btnprevstation,0);
 btnnextstation->callback(hndl_btnnextstation,0);

 btnvolup->callback(hndl_btnvolup,0);
 btnvoldown->callback(hndl_btnvoldown,0);

 window->end();
 window->show(argc, argv);
 return Fl::run();
}


Das Ergebnis sollte ungefähr so aussehen:


.jpg   nano_testcxx.JPG (Größe: 92,01 KB / Downloads: 670)

Wir speichern die Quelldatei in nano und verlassen den Editor.

Ein paar Bemerkungen zur Quelldatei.
In der Hauptfunktion main wird durch Eingabe von 
Code:
Fl_Window *window = new Fl_Window(480,290,"iRadio");

ein neues Fenster (Klasse FL_Window) mit der Überschrift iRadio und der Größe von 480 x 290 Pixeln erstellt.
Durch die Zeilen

Code:
  Fl_Button *btnvolup = new Fl_Button(165, 75, 70, 65, "@+");
 Fl_Button *btnprevstation = new Fl_Button(165, 150, 70 , 65, "@<<");
 Fl_Button *btnnextstation = new Fl_Button(245, 150, 70, 65, "@>> ");
 Fl_Button *btnvoldown = new Fl_Button(245, 75, 70, 65, "@line");

werden vier Knöpfe (btnvolup, btnprevstation, btnnextstation, bntvoldown) der Klasse Fl_Button erstellt. Den Konstruktoren werden dann die Positionen der Knöpfe absolut (also x,y), die Größe der Knöpfe (Breite, Höhe) und ein String zur Beschriftung übergeben. FLTK hat für verschiedene Symbole verschiedene Bezeichner, @>> zum Beispiel steht für einen Doppelpfeil nach rechts, so wie man es vielleicht von den Symbolen von CD-Spielern oder Videorekordern her kennt.

In den Codezeilen

Code:
  btnprevstation->callback(hndl_btnprevstation,0);
 btnnextstation->callback(hndl_btnnextstation,0);

 btnvolup->callback(hndl_btnvolup,0);
 btnvoldown->callback(hndl_btnvoldown,0);

werden den Knöpfen verschiedene Handlerfunktionen bekannt gemacht, dem Knopf btnvolup zum Beispiel die Funktion hndl_btnvolup. Diese Funktion ist ganz oben im Quelltext definiert und wird jedesmal aufgerufen wenn der Knopf gedrückt wird. Schauen wir uns die Funktion mal an die aufgerufen wird.

Code:
void hndl_btnvolup(Fl_Widget *, void *) {
 system("echo \"volup 2\" | nc 127.0.0.1 9294 -N");
}

In der Handlerfunktion hndl_btnvolup wird die Funktion system aufgerufen. Diese wiederum setzt den Konsolenbefehl echo "volup 2" | nc 127.0.0.1 -9294 -N ab.
Damit wird das Programm Netcat, also nc aufgerufen, mit dem eine TCP/IP-Verbindung zum Remote Control Interface von vlc (127.0.0.1 = localhost, also Rechner auf dem das Programm läuft, Portnummer 9294) aufgebaut wird. Innerhalb von Netcat wird dann das Commando volup 2 über TCP/IP gesendet, was vlc dazu veranlasst die Lauststärke um 2% anzuheben.

Einfach oder?

Gehen wir im Quellcode weiter:

Code:
  window->end();
 window->show(argc, argv);
 return Fl::run();

Wir sagen das wir mit der Fenstergestaltung fertig sind und es soll angezeigt werden. Über Fl::run() gelangt das Progamm dann in die Endlosschleife in der FLTK permanent auf eingehende Aktionen von Knöpfen, Fensterverschiebungen, Mausreaktionen und und und achtet und reagiert. Damit sollte das kleine Testprogramm erklärt sein.
Jetzt müssen wir die Quelldatei in eine ausführbare Datei übersetzen.
Wie wir oben gesehen haben, gibt es beim C++ Compiler einige Sachen anzugeben. Das können wir händisch machen, was dann so aussieht:

g++ -I/usr/local/include -I/usr/local/include/FL/images -I/usr/include/freetype2 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT -o 'test' 'test.cxx' /usr/local/lib/libfltk.a -lpthread -ldl -lm -lX11

Oder wir nutzen ein super Werkzeug was uns FLTK mitbringt: fltk-config

Das Tool fltk-config nimmt uns die ganzen Angaben oben ab, wir brauchen nur zu schreiben:

fltk-config --compile test.cxx

Danach wird das Programm unter dem Namen test direkt im iRadio-Verzeichnis gebaut. Ein "ls"-Befehl zeigt es uns.
Rufen wir doch jetzt mal unser kleines Testprogramm auf:

./test

Das Ergebnis sieht so aus:

   

Das Steuerprogramm läuft nach wie vor "remote", also auf dem Internetradio, die Anzeige wird jedoch per SSH und X11 auf unsere Windows-Workstation umgeleitet.
Und das schönste ist, klicken wir jetzt auf die Knöpfe können wir unser entferntes Internetradio dann auch per SSH/X11 fernbedienen.
Aber natürlich wurde das Programm ja für unser Internetradio geschrieben, schauen wir uns es doch mal dort an.

Als erstes rufen wir einen Dateibrowser auf dem Touchscreen auf:

   

Danach wechseln wir in unser Verzeichnis in dem wir das Programm test gebaut haben.

   

Danach klicken wir die Datei test doppelt mit dem Eingabestift oder Finger an,...

   

... und bestätigen die Meldung das wir es ausgeführt haben wollen.

   

Und wir können das Internetradio jetzt bequem über den Touchscreen bedienen.

Natürlich wird ein komplett fertig programmiertes Steuerprogramm in den "Autostart" gelegt, so dass man direkt nach dem Bootvorgang die Benutzeroberfläche des Radios vor sich hat und nicht erst noch mit dem Finger im Dateíbrowser die "App" suchen muss.

Ich hoffe der Artikel gibt einen kleinen Einblick wie man solche Steuerprogramme grafisch und mit Touchbedienung erstellen kann.
Bei Fragen zur Programmierung oder zur Einrichtung des Internetradios - einfach raus damit oder PN oder Email.

Gruß
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#26
Danke Danke Danke! Solche detailierten Ratgeber bringen mich weiter!
Zitieren
#27
ich werde wieder dazustossen. Bin im Moment mit Technik und Gehäuse von Röhrenradios beschäftigt.
Gruß,
Jupp
-----------------------------

was du baust ist immer mit dir verbunden
(Lego)

Einsamkeit ist nur ein Mangel an Technologie
(@beetlebum)
Zitieren
#28
Hallo zusammen,

hier der Stand von heute abend:


.png   Bildschirmfoto vom 2018-11-02 21-17-02.png (Größe: 25,1 KB / Downloads: 613)

Was mir noch fehlt, ist ein Kommando, welches die Tastatureingabe ohne drücken der <ENTER>-Taste entgegen nimmt.
Nach allem, was ich bis dato gelesen habe, gibt es so etwas in der 'stdio.h' nicht.

So langsam wird es Zeit, das Progrämmchen auf den Raspi zu übertragen.

Die Text- und Hintergrundfarben sowie das positionieren des Ausgabetextes habe ich mit den Escape-Sequenzen realisiert.

Wenn das Programm fertig ist, werde ich hier den Quellcode einstellen.
Das meiste sind ohnehin die Farbdefinitionen.


Grüße

Martin
Zitieren
#29
Da bin ich gespannt Martin. Hast Du das VLC auch lokal auf dem Entwicklungsrechner um das Programm zwischendurch zu testen oder nur auf dem Raspberry? Dein Entwicklungsrechner scheint ja ein Unix/Linux zu sein, ich weiß gar nicht wie sich vlc auf einem Windowssystem verhält und was es da für Funktionen bietet.

Für dein Tastenproblem unter Unix/Linux:

Zitieren
#30
Hallo Bernhard,

danke für den Tipp!

Leider findet mein gcc ncurses nicht!

Ich muss morgen mal in den Tiefen des Internet recherchieren, wo ich ncurses.h herbekomme.


Grüße

Martin
Zitieren
#31
Die Bibliothek ncurses muss (wie FLTK oben auch) natürlich im System installiert sein damit der Compiler sie nutzen kann.
https://www.cyberciti.biz/faq/linux-inst...os-fedora/
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#32
Hallo Bernhard,

vielen Dank für die nächtliche Hilfe!

Ich habe mir das Paket installiert, aber da scheint noch mehr zu fehlen:


.png   Bildschirmfoto vom 2018-11-02 23-34-10.png (Größe: 114,36 KB / Downloads: 592)

Schluss für heute!

Gute Nacht Smiley63 


Grüße

Martin
Zitieren
#33
Probiere es doch mal mit: gcc Test.c -o Test -lncurses

Siehe auch man gcc
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#34
Hallo Bernhard,

danke für Deine Hilfe, so hat es funktioniert.

Aber jetzt habe ich ein anderes Problem, nämlich dass 'getch()' nicht das tut, was ich eigentlich erwarte, nämlich den ASCII-Code der betätigten Taste zurückzugeben.

Auf einer Internetseite zur Bibliothek 'ncurses.h' habe ich den lapidaren Vermerk gefunden, hier sinngemäß wiedergegeben: 'getch()' funktioniert prizipiell wie 'getschar()'.
Evtl. Unterschiede wurden nicht erwähnt.

Na ja, ich werde mich wohl noch ein wenig belesen müssen.

Hier mal die Version, welche, wenn auch mit zusätzlichem Drücken der <ENTER>-Taste funktioniert:

Code:
/* Testprogramm */

#include <stdio.h>
/* #include <ncurses.h> */

/* Definition der Textfarben */
#define ANSI_BLACK        "\x1b[30m"
#define ANSI_RED        "\x1b[31m"
#define ANSI_GREEN        "\x1b[32m"
#define ANSI_BROWN        "\x1b[33m"
#define ANSI_BLUE        "\x1b[34m"
#define ANSI_MAGENTA        "\x1b[35m"
#define ANSI_CYAN        "\x1b[36m"
#define ANSI_LIGHTGRAY        "\x1b[37m"
#define ANSI_DARKGRAY        "\x1b[1;30m"
#define ANSI_LIGHTRED        "\x1b[1;31m"
#define ANSI_LIGHTGREEN        "\x1b[1;32m"
#define ANSI_YELLOW        "\x1b[1;33m"
#define ANSI_LIGHTBLUE        "\x1b[1;34m"
#define ANSI_LIGHTMAGENTA    "\x1b[1;35m"
#define ANSI_LIGHTCYAN        "\x1b[1;36m"
#define ANSI_WHITE        "\x1b[1;37m"

/* Definition der Hintergrundfarben */
#define ANSI_GRND_BLACK        "\x1b[40m"
#define ANSI_GRND_RED        "\x1b[41m"
#define ANSI_GRND_GREEN        "\x1b[42m"
#define ANSI_GRND_BROWN        "\x1b[43m"
#define ANSI_GRND_BLUE        "\x1b[44m"
#define ANSI_GRND_MAGENTA    "\x1b[45m"
#define ANSI_GRND_CYAN        "\x1b[46m"
#define ANSI_GRND_GRAY        "\x1b[47m"

/* Setzt Farben wieder auf den Ursprungszustand */
#define ANSI_DEFAULTCOLORS    "\x1b[0m"


/* Weitere Funktionen */
#define ANSI_CLS()        printf("\x1b[2J\x1b[1;1H")
#define ANSI_LOCATE( x, y )    printf("\x1b[%i;%iH", y, x)
#define ANSI_CLREOL()           printf("\x1b[K")
#define ANSI_COLOR( c )        printf(c) /* Hierbei ist 'c' eine der obigen Farbkonstanten */


/* Hier das eigentliche Programm */

int main ( void )



{
    char Zeichen;
        printf(ANSI_GRND_BLUE);
    ANSI_CLS();
    ANSI_LOCATE(20,2);
    ANSI_COLOR(ANSI_LIGHTGREEN);
    printf("Textbasiertes Frontend für Internetradio");
    ANSI_LOCATE(30,8);
    ANSI_COLOR(ANSI_LIGHTMAGENTA);
    printf("+: ");
    ANSI_COLOR(ANSI_YELLOW);
    puts("Lauter");
    ANSI_LOCATE(30,10);
    ANSI_COLOR(ANSI_LIGHTMAGENTA);
    printf("-: ");
    ANSI_COLOR(ANSI_YELLOW);
    puts("Leiser");
    ANSI_LOCATE(30,12);
    ANSI_COLOR(ANSI_LIGHTMAGENTA);
    printf("N: ");
    ANSI_COLOR(ANSI_YELLOW);
    puts("Nächster Sender");
    ANSI_LOCATE(30,14);
    ANSI_COLOR(ANSI_LIGHTMAGENTA);
    printf("V: ");
    ANSI_COLOR(ANSI_YELLOW);
    puts("Vorheriger Sender");
    ANSI_LOCATE(30,16);
    ANSI_COLOR(ANSI_LIGHTMAGENTA);
    printf("P: ");
    ANSI_COLOR(ANSI_YELLOW);
    puts("Pause");

    while (1)
    {
        Zeichen=getchar();
        switch(Zeichen)
        {
        case '+':
            ANSI_LOCATE(30,18);
            ANSI_CLREOL();
            printf("Gewählte Funktion: Lauter");
            break;
        case '-':
            ANSI_LOCATE(30,18);
            ANSI_CLREOL();
            printf("Gewählte Funktion: Leiser");
            break;
        case 'N':
        case 'n':
            ANSI_LOCATE(30,18);
            ANSI_CLREOL();
            printf("Gewählte Funktion: Nächster Sender");
            break;
        case 'V':
        case 'v':
            ANSI_LOCATE(30,18);
            ANSI_CLREOL();
            printf("Gewählte Funktion: Vorheriger Sender");
            break;    
        case 'P':
        case 'p':
            ANSI_LOCATE(30,18);
            ANSI_CLREOL();
            printf("Gewählte Funktion: Pause");
            break;
        }    /*Ende der Switch-Verzweigung*/

    }    /*Ende der While-Schleife*/

    getchar();
    ANSI_DEFAULTCOLORS;
    puts(" ");

    return 0;
}

Wegen eines Familienfestes komme ich morgen nicht dazu, noch weitere Tests zu machen.
Ich bleibe aber dran!


Grüße

Martin
Zitieren
#35
Der Rückgabetyp der ncurses-Funktion wird doch oben im Video besprochen und gezeigt!
Matrin, wo erfolgt denn in deinem Programm die Fernsteuerung des vlc Prozesses?  Sad  Da wird doch gar nichts angesteuert.

Was man in der Bildschirmmaske noch unterbringen könnte wäre ein kleines Fenster in dem der aktuelle Sender und das aktuelle Programm dargestellt wird. Eine Möglichkeit wäre es das aus dem xml-Request zu parsen wie ich es hier in Post #30 (https://www.radio-bastler.de/forum/showt...#pid132303) gezeigt habe, einfacher wäre es aber die Daten einfach über NC abzugreifen. Das könnte man zyklisch (jede Sekunde oder so) über das "info" Komando des Remote Control Interfaces realisieren. Die Antwort von vlc sähe dann so aus:

> info
+----[ Meta data ]
|
| genre: Oldies Schlager Discofox
| now_playing: Atlantis Und Eichblatt - Sie Trinkt Und Raucht Zuviel
| filename: aacplus.schlagerparadies.de:30844
| title: Schlagerparadies aacPlus Stream
|
+----[ Stream 0 ]
|
| Codec: MPEG AAC Audio (mp4a)
| Sample rate: 44100 Hz
| AAC extension: SBR+PS
| Bits per sample: 32
| Type: Audio
| Channels: Stereo
|
+----[ end of stream info ]

Das was einen an diesem Infoblock interessiert könnte man mit grep aus der Struktur holen und dann im Programm weiterverarbeiten.
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#36
Hallo Bernhard,

ich will momentan nur testen, ob das ganze generell funktioniert.

Die Funktionsaufrufe an VLC sind dann nur noch 'copy and paste'.

Eben habe ich im Internet eine Doku zu 'curses' gefunden.
Die werde ich die nächsten Tage mal durcharbeiten.


Grüße

Martin
Zitieren
#37
Hallo Bernhard,
Dein Beitrag #25 ist einfach klasse!
Damit hast Du mich dazu gebracht das FLTK zu  testen und zu probieren.
Es ist ein richtig gutes Werkzeug um grafische Oberflächen zu erstellen,
aber ohne Deine ausführliche Anleitung wäre der Einstieg doch sehr schwer...

Da man nicht immer nur mitlesen, sondern auch (ab und zu) aktiv am Forum teilnehmen soll,
möchte ich eine kleine Erweiterung Deines Programms beisteuern.

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>

#include <FL/Fl_Group.H>
#include <FL/Fl_Dial.H>

#include <FL/fl_draw.H>
#include <FL/Enumerations.H>
#include <FL/Fl_Widget.H>

int volume_prev;

void hndl_btnprevstation(Fl_Widget *, void *) {
system("echo \"prev\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnnextstation(Fl_Widget *, void *) {
system("echo \"next\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnvolup(Fl_Widget *, void *) {
system("echo \"volup 2\" | nc 127.0.0.1 9294 -N");
}

void hndl_btnvoldown(Fl_Widget *, void *) {
system("echo \"voldown 2\" | nc 127.0.0.1 9294 -N");
}

void lauter_leiser(Fl_Dial* v, void *) {
 
if (((Fl_Dial*) v)->value() < volume_prev) {
     volume_prev = (((Fl_Dial*) v)->value() );
     system("echo \"voldown 1\" | nc 127.0.0.1 9294 -N");
}

if (((Fl_Dial*) v)->value() > volume_prev) {
     volume_prev = (((Fl_Dial*) v)->value() );
     system("echo \"volup 1\" | nc 127.0.0.1 9294 -N");
}
}


int main(int argc, char **argv) {

Fl_Window *window = new Fl_Window(480,290,"iRadio");

Fl_Button *btnvolup = new Fl_Button(165, 75, 70, 65, "@+");

Fl_Button *btnprevstation = new Fl_Button(165, 150, 70 , 65, "@<<");
btnprevstation->labeltype(FL_ENGRAVED_LABEL);
btnprevstation->labelcolor((Fl_Color)26);
btnprevstation->labeltype(FL_ENGRAVED_LABEL);

Fl_Button *btnnextstation = new Fl_Button(245, 150, 70, 65, "@>> ");
btnnextstation->labeltype(FL_ENGRAVED_LABEL);
btnnextstation->labelcolor((Fl_Color)26);
btnnextstation->labeltype(FL_ENGRAVED_LABEL);

Fl_Button *btnvoldown = new Fl_Button(245, 75, 70, 65, "@line");

Fl_Dial *vol_dial;
{ vol_dial = new Fl_Dial(350, 80, 110, 110, "- Volume +");
 vol_dial->box(FL_OSHADOW_BOX);
 vol_dial->color((Fl_Color)37);
 vol_dial->labeltype(FL_ENGRAVED_LABEL);
 vol_dial->labelfont(12);
 vol_dial->labelcolor((Fl_Color)26);
 vol_dial->maximum(100);
 vol_dial->step(1);
 vol_dial->value(20);
} // Fl_Dial* vol_dial

btnprevstation->callback(hndl_btnprevstation,0);
btnnextstation->callback(hndl_btnnextstation,0);

btnvolup->callback(hndl_btnvolup,0);
btnvoldown->callback(hndl_btnvoldown,0);

vol_dial->callback( (Fl_Callback*) lauter_leiser);

window->end();
window->show(argc, argv);
return Fl::run();
}
Grüße aus Wassenberg,
Norbert.
Zitieren
#38
Hallo Norbert, 

gut das Du das Beispiel gebracht hast, jetzt kommen also weitere Widgets ins Spiel, sehr gut.

   

Übrigens bringt FLTK auch einen GUI-Builder mit! Er hört auf das Komando fluid und damit kann man seine Benutzeroberfläche ganz einfach per Drag & Drop zeichnen und sich den Basiscode für die GUI erstellen lassen. Ein paar Bilder?

       

Wer sich mit FLTK näher beschäftigen will, der sollte sich unbedingt auch mal den Ordner /test und /example im Quellenordner ansehen. Dort werden alle GUI-Elemente vorgestellt, wie man Zeichnen kann, wie man eigenen GUI-Elemente erstellt, wie Timer und Threads erstellt werden und und und. Und das Wunderbare an der Sache: FLTK und der einmal erzeugte Code ist auf sehr vielen Platformen lauffähig, von einer alten HP-UX und SGI über ein modernes Linux oder Solaris, ja sogar auf einem Windows. Vom kleinen 16 oder 32 Bit Evalboard bis zur  großen Workstation. Praktisch überall da wo es einen C++ Compiler gibt.

Hier zum Beispiel die Demo zu allen Einstellreglern die FLTK dabei hat.


.jpg   5.jpg (Größe: 69,21 KB / Downloads: 489)
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren
#39
Hallo Bernhard,

mit fluid geht die Gestaltung einer Oberfläche wirklich zügig!
Ich habe es erst vorgestern entdeckt und auf einem RaspberryPi installiert.

Meine Probleme liegen in der Auswertung der Callbacks:
- im 'Casten' der Variablen
Code:
if (((Fl_Dial*) v)->value() > volume_prev) { }

- im Fernsteuern des Players (kenne die Befehle und deren Syntax nicht...), deshalb habe ich die vorgefundenen benutzt  

Code:
system("echo \"volup 1\" | nc 127.0.0.1 9294 -N");

Gerade suche ich wie z.B. Interpret, Titel etc. irgendwie zur Anzeige gebracht werden können.
Hast Du vielleicht einen Tipp?
Grüße aus Wassenberg,
Norbert.
Zitieren
#40
Hallo Norbert,

wie man an die Senderinfo kommt habe ich  ein paar Beiträge vorher schon gezeigt:


Zitat:...in dem der aktuelle Sender und das aktuelle Programm dargestellt wird. Eine Möglichkeit wäre es das aus dem xml-Request zu parsen wie ich es hier in Post #30 (https://www.radio-bastler.de/forum/showt...#pid132303) gezeigt habe, einfacher wäre es aber die Daten einfach über NC abzugreifen. Das könnte man zyklisch (jede Sekunde oder so) über das "info" Komando des Remote Control Interfaces realisieren. Die Antwort von vlc sähe dann so aus:

> info
+----[ Meta data ]
|
| genre: Oldies Schlager Discofox
| now_playing: Atlantis Und Eichblatt - Sie Trinkt Und Raucht Zuviel
| filename: aacplus.schlagerparadies.de:30844
| title: Schlagerparadies aacPlus Stream
|
+----[ Stream 0 ]
|
| Codec: MPEG AAC Audio (mp4a)
| Sample rate: 44100 Hz
| AAC extension: SBR+PS
| Bits per sample: 32
| Type: Audio
| Channels: Stereo
|
+----[ end of stream info ]


Das was einen an diesem Infoblock interessiert könnte man mit grep aus der Struktur holen und dann im Programm  weiterverarbeiten.

Schickt man dem vlc über nc also das Komando info, erhält man den oben gezeigten Infoblock. Lässt man der Anweisung  noch ein "| grep title:" oder "| grep now_playing:" folgen, erhält man dann die einzelnen Zeilen aus dem Infoblock zurück.

Um die Rückgabe auf der Konsole in ein Programm zu bekommen wäre dann ein popen ideal. Theoretisch (und auch praktisch) müsste die Anweisung:

FILE *text_now_playing = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep now_playing:", "r");

dafür sorgen, das das aktuell gespielte Lied in text_now_playing liegt.
Alles was die Displayaktualisierung angeht ,geht bei mir immer in einen eigenen Timer-gesteuerten Codepart. Soetwas bietet FLTK gleich mit an.
Angenommen ich will einen Timer haben der jede Sekunde eine Callback-Funktion aufruft, dann geht das in FLTK u.a. auch so:

int main(inc argc, char **argv) {
...
  Fl::add_timeout(1, timer_func,  *p, .....);
...
}

weiter oben ist dann die Callback-Funktion timer_func definiert. Das was übergeben werden soll kann man sich ja selbst ausdenken, hier halt einfach ein void* den man dann casten kann. Ideal wäre also ein Zeiger auf das GUI-Element was den Titel anzeigen soll.

static void timer_func(void *data, ....) {       
  
   1. Hole Infos per FILE* ptext=  popen(......);
   2. Caste ptext nach char* bzw. string
   3. Das über den void-Pointer übergebene GUI-Element bekommt dann den Text- oder Label-Wert des strings/char* von ptext.
  
   pclose(ptext);
   Fl::repeat_timeout(1, timer_func, *p, ...); // bereit für den nächsten Timerdurchlauf
}


Ich hoffe das war verständlich und die "Macht" des void* wird klar.

Gruß 
Bernahrd45
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Neue Erfahrungen mit FL2K und AM Stereo/Mono Semir 2 252 20.03.2024, 22:40
Letzter Beitrag: Semir
  Huth E72 Internetradio mit ESP32 saarfranzose 10 1.780 12.05.2023, 14:49
Letzter Beitrag: saarfranzose
  Ein Internetradio Bausatz von PIMORONI Bernhard45 200 81.532 06.06.2022, 19:17
Letzter Beitrag: Reparateur
  Stereo Decoder fuer alte Radios- Export radio-volker 4 1.395 08.03.2022, 19:30
Letzter Beitrag: radio-volker
  Dementia III ESP32 Internetradio mit Simulation saarfranzose 9 2.805 21.01.2022, 23:14
Letzter Beitrag: saarfranzose

Gehe zu: