Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Ein minimales Internetradio für alte und neue Raspberrys
#61
In #51 steht aber:  

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

und bei Dir im Screenshot lese ich das:

FILE *text = popen("echo \"next\" | nc 127.0.0.1 9294 -N | grep title:", "r");

?mage

Next ist das Kommando zum Umschalten auf den nächsten Sender (das geht so: system("echo \"next\" | nc 127.0.0.1 9294 -N"); ) und nicht Abfragen der Metadaten des Radiosenders! Alles klar? ;-) Gute Nacht & schlafe gut Martin.

Gruß
Bernhard
(der noch ein bisschen aufbleibt)
Bei Fragen zum Umbau oder zur Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung oder einfach nur Kontakt- bitte Email unter: mbernhard1945(at)gmail(dot)com

mein PGP-Key unter: https://pgp.mit.edu  Keyword: mbernhard1945
Zitieren
#62
Hallo Bernhard,

danke, da hab' gestern Abend vor lauter Bäumen den Wald nicht mehr gesehen. Smiley26

Ich habe das nun abgeändert, aber mit mäßigem Erfolg!

Informationen zur angewählten Station bekomme ich praktisch nie, die Informationen zum laufenden Titel kommen nur manchmal.

Ich muss mir mal eine Minimalversion basteln, um zu schauen, ob die Informationen tatsächlich nicht kommen oder ob diese nur durch das einfärben der Bildschirmfenster 'übertüncht' werden.


Grüße

Martin
Zitieren
#63
Und wieder ein Update des minimalen iRadio Internetradios.

 
.zip   iRadio.zip (Größe: 439,69 KB / Downloads: 6)  Update: 19.18.2018 - Einspielen einer neuen Senderliste und der WiFi-Zugangsdaten per USB-Stick (FAT32 formatiert)


Mit den kleinen Änderungen ist es nun nicht mehr nötig die Senderlisten und WiFi-Daten direkt auf /boot oder per SSH zu aktualisieren. 
Ein mit FAT32 formatierter USB-Stick, auf dem die Senderliste (playlist.m3u) und die WiFi-Zugangsdaten (wpa_supplicant.conf) im Rootverzeichis liegen, reicht zum Update aus. Bei jedem Systemstart wird geschaut ob ein solcher USB-Stick angeschlossen ist, wenn ja und eine neue Senderliste bzw. WiFi-Daten vorhanden sind, werden diese ins System verschoben und ein Neustart ausgelöst. 

Auch ist es möglich aufgezeichnete Sendungen auf den USB-Stick auf- und diese per Eintrag in der Playlist ab-zuspielen. Somit wäre ein kompletter Offline-Betrieb eines alten Radios möglich. Man könnte also mit mehreren Dateien verschiedene Sender und somit eine ganze Senderlandschaft anno 19xx simulieren.

Obwohl ich alle Pakete und Skripte mit meinen vielen Internetradios auf Pi-Basis, allen gänigen Raspbian-Images und mehreren USB-Sticks problemlos getestet habe, übernehme ich keine Garantie das wirklich alle möglichen USB-Sticks auf dieser Welt funktionieren. Das Radio wird defaultmäßig mit dem gpiod gestartet der auf Tasteraktionen an den GPIOs lauscht und eine Programmumschaltung realisiert, der Soucecode liegt in gpiod.c und kann beliebig angepasst und erweitert werden. In gui.cxx ist der Democode einer kleinen FLTK-GUI für Touchscreens. Auch hier sind beliebige Änderungen und Anpassung an eigene Geräte ausdrücklich gewünscht. Die passenden Treiber für euer Touchscreen sowie die jeweilige Bibliothek für eine grafische Oberflächen (ncurses, FLTK, QT...) die Ihr nehmen wollt, müsst Ihr natürlich über das Paketsystem selbst einspielen. Das habe ich nicht ins Installationsskript mit aufgenommen, es soll ja jeder selbst entscheiden können wie er sein Minimalsystem erweitert und welche Zusatzmodule , Displays und Bibliotheken er installieren will.

Viel Spaß beim Basteln und Grüße
Bernhard
Bei Fragen zum Umbau oder zur Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung oder einfach nur Kontakt- bitte Email unter: mbernhard1945(at)gmail(dot)com

mein PGP-Key unter: https://pgp.mit.edu  Keyword: mbernhard1945
Zitieren
#64
Hallo Bernhard,
danke für das Update und die vielen Tips und Hilfen im Verlauf dieses Threads.

Ein Hinweis von mir, weil ich Probleme mit dem Scalieren der Fonts im FLTK hatte.
Damit das funktioniert, muss das Paket "libghc-x11-xft-dev" installiert sein  

Code:
sudo apt-get install libghc-x11-xft-dev

und das Kommando "configure" mit dem Parameter "--enable-xft" getartet werden.

Code:
sudo ./configure --enable-xft

Gruß aus KIel
Holger
Zitieren
#65
das ist eine große Erleichterung. Danke Bernhard!
Gruß,
Jupp
-----------------------------

Ziel der vollkommenen Sammlung ist es, unseren unruhigen und abschweifenden Geist zu kontrollieren.
(Buddhistische Weisheit)
Zitieren
#66
Hallo zusammen,

so, nun habe ich mir eine Minimalversion gebastelt.
Siehe da, die Informationen kommen!
Offensichtlich spuckt mir hier 'curses.h' in die Suppe.
   

Auch ist schön zu sehen, dass BBC4 und BBC2 keine Titelinformationen übertragen.

Das ist der aktuelle Code dazu:
   

Nun werde ich eben die Oberfläche ohne 'curses.h' mit den Escape-Sequenzen basteln müssen.

Da dieses Frontend eigentlich nur dazu dienen soll, die Funktion der Softwareinstallation zu testen, kann ich mit den Einschränkungen, welche mir 'stdio.h' auferlegt, leben.
Außerdem als erster Ausflug nach C gedacht.


Grüße

Martin
Zitieren
#67
(19.11.2018, 23:03)Radiobastler schrieb: Nun werde ich eben die Oberfläche ohne 'curses.h' mit den Escape-Sequenzen basteln müssen.

Hallo Martin,

warum wirst Du das müssen? Was veranlasst Dich zu glauben das ncurses keine Strings auf der Oberfläche darstellen kann? Ich habe jetzt hier keine Probleme damit und den Fehler in deinem Programm weiter oben habe ich dir ja genannt. Das Einlesen von fopen hat auch rein gar nichts mit ncurses zu tun. Wo also steckt jetzt das Problem in der Umsetzung, poste mal den Problemcode (bitte aber nicht als Screenshot, das kann man schlecht in einen Editor kopieren).

Übrigens auch die BBC Programme senden die Infos. Du musst aber den Stream erst anlaufen lassen und die MetaDaten immer und immer zyklisch von VLC holen und anzeigen lassen. Das macht dein Programm nicht! Es wird nur einmal das Kommando zum Umschalten gesendet und dann fragst du einmalig nach den MetaDaten. Je nach Stream stehen die aber erst wenige Sekunden nach der Umschaltung bereit, deshalb gut und gerne jede Sekunde in einer Schleife die Infos holen und deine GUI aktualisieren. Deine switch/case Sache ist so nicht ganz in Ordnung! Auch könnte und sollte man die Tastaturabfrage mit der Ansteuerung von VLC und das holen der Infos und die GUI Aktualisierung in unterschiedliche Threads packen sodass die Anwendung reaktionsfreudig bleibt und kurze Antwortzeiten liefert. Du siehst dein Konsolenprogramm bietet noch viel interessantes und lehrreiches Potential. Ich würde da jetzt dranbleiben und das unbedingt so umsetzen wie es ursprünglich geplant war. Mache keine Kompromisse in der GUI und nimm weiter ncurses, glaub mir die Erfahrungen die du noch machen wirst sind Gold wert!

Gruß Bernhard.
Bei Fragen zum Umbau oder zur Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung oder einfach nur Kontakt- bitte Email unter: mbernhard1945(at)gmail(dot)com

mein PGP-Key unter: https://pgp.mit.edu  Keyword: mbernhard1945
Zitieren
#68
Hallo Bernhard,

anbei die beiden Codes.

Zunächst der augenscheinlich funktionierende Code, dieser ist allerdings noch ohne 'schmückendes Beiwerk' (Menü).
Allerdings ist mir aufgefallen, dass selbst nach drei Sekunden Wartezeit noch nicht alle gewünschten Informationen da sind.
Oftmals fehlen dann noch die Informationen zum aktuell gespielten Titel, diese kann ich aber dann mit der 'I'-Taste abrufen.


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

int main()
{
  char station[70];
  char titel[70];
  char laut[70];
  char Zeichen;

  while (Zeichen != 'q')
  {
    Zeichen=getchar();
    switch(Zeichen)
    {
    case 'V':
    case 'v':
            system("echo \"prev\" | nc 127.0.0.1 9294 -N");
            sleep(3);
            FILE *text = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep title:", "r");
           fgets(station,70,text);
          pclose(text);
            FILE *text1 = popen ("echo \"info\" | nc 127.0.0.1 9294 -N | grep now_playing:", "r");
            fgets(titel,70,text1);
            pclose(text1);
            printf("Sation: %s",station);
            printf("\nTitel: %s",titel);
            break;
    case 'N':
    case 'n':
            system("echo \"next\" | nc 127.0.0.1 9294 -N");
            sleep(3);
            FILE *text2 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep title", "r");
            fgets(station,70,text2);
            pclose(text2);
            FILE *text3 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep now_playing:", "r");
            fgets(titel,70,text3);
            pclose(text3);
            printf("Station: %s",station);
            printf("\nTitel: %s",titel);
            break;
    case '-':
            printf("");
            FILE *text4 = popen("echo \"voldown 2\" | nc 127.0.0.1 9294 -N | grep audio", "r");
            fgets(laut,70,text4);
            pclose(text4);
            printf("\nLautstärke: %s",laut);
            break;
    case '+':
            printf("");
            FILE *text5 = popen("echo \"volup 2\" | nc 127.0.0.1 9294 -N | grep audio", "r");
            fgets(laut,70,text5);
            pclose(text5);
            printf("\nLautstärke: %s",laut);
            break;
    case 'P':
    case 'p':
            system("echo \"stop\" | nc 127.0.0.1 9294 -N");
            break;
    case 'W':
    case 'w':
            system("echo \"play\" | nc 127.0.0.1 9294 -N");
            break;
    case 'I':
    case 'i':
            ;
            FILE *text6 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep title:", "r");
            fgets(station,70,text6);
            pclose(text6);
            FILE *text7 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep now_playing:", "r");
            fgets(titel,70,text7);
            pclose(text7);
            printf("Station: %s",station);
            printf("\nTitel: %s",titel);
            break;
    } //Ende der Case-Verzweigung
  } //Ende der while-Schleife
 return 0;
}

und hier der Code, welcher nicht das gewünschte Ergebnis liefert:

Code:
/* Frontend V5 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <curses.h>
//#include <iostream>

void zeichne_neu() {
initscr ();
start_color();
init_pair(1,COLOR_YELLOW,COLOR_BLUE);
init_pair(2,COLOR_GREEN,COLOR_BLUE);
init_pair(3,COLOR_RED,COLOR_BLUE);
init_pair(4,COLOR_CYAN,COLOR_BLUE);
init_pair(5,COLOR_BLUE,COLOR_BLUE);
attrset(A_BOLD|COLOR_PAIR(2));
keypad (stdscr, TRUE);
noecho();
//Bildschirm füllen
int Zeile, Spalte;
for( Zeile = 0; Zeile < 20; Zeile++ )
{
  for( Spalte = 0; Spalte < 81; Spalte++ )
  {
  mvprintw(Zeile,Spalte," ");
  }
}
mvprintw(2,15,"Textbasiertes Frontend für Internetradio");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(5,10,"q:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(5,13,"Beenden");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(7,10,"+:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(7,13,"Lauter");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(9,10,"-:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(9,13,"Leiser");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(11,10,"N:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(11,13,"Nächster Sender");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(13,10,"V:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(13,13,"Vorheriger Sender");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(15,10,"P:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(15,13,"Pause");
attrset(A_BOLD|COLOR_PAIR(3));
mvprintw(17,10,"W:");
attrset(A_BOLD|COLOR_PAIR(1));
mvprintw(17,13,"Weiter");
attrset(A_BOLD|COLOR_PAIR(4));
endwin();
}



int main (void) {
int c;
char now[72];
char station[70];
initscr ();
start_color();
int Zeile, Spalte;
attrset(A_BOLD|COLOR_PAIR(4));
for( Zeile = 20; Zeile < 26; Zeile++ )
{
  for( Spalte = 0; Spalte < 81; Spalte++ )
  {
  mvprintw(Zeile,Spalte," ");
  }
}
zeichne_neu();
while ((c = getch ()) != 'q') {
  switch (c) {
  case 'v':
  case 'V':
    mvprintw (20,10,"                                        ");
    mvprintw (20,10,"Gewählte Funktion: Vorheriger Sender");
    system("echo \"prev\" | nc 127.0.0.1 9294 -N");
    sleep(1);
    zeichne_neu;
    sleep(3);
    FILE *text2 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep title:", "r");
    fgets(station,70,text2);
    pclose(text2);
    mvprintw (22,1,"Station: %s ",station);
    refresh;
    //mvprintw (22,10,station);
    //zeichne_neu();
    break;
  case 'N':
  case 'n':
    mvprintw (20,10,"                                        ");
    mvprintw (20,10,"Gewählte Funktion: Nächster Sender");
    system("echo \"next\" | nc 127.0.0.1 9294 -N");
    sleep(1);
    zeichne_neu;
    sleep(3);
    mvprintw (22,1,"                                                ");
    FILE *text = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep title:", "r");
    fgets(station,70,text);
    //mvprintw (22,10,now);
    pclose(text);
    //rmSubstr(now,"now_playing");
    mvprintw (22,1,"Station: %s",station);
    refresh;
    //mvprintw (22,10,station);
    //zeichne_neu();
    break;
  case 'I':
  case 'i':
    mvprintw (23,10,"                                        ");
    FILE *text1 = popen("echo \"info\" | nc 127.0.0.1 9294 -N | grep now_playing:", "r");
    fgets(now,72,text1);
    pclose(text1);
    //mvprintw (22,10,"                                           ");
    zeichne_neu;
    mvprintw (23,1,"Titel: %s ",now);
    refresh;
    break;
  case '+':
    mvprintw (20,10,"                                         ");
    mvprintw (20,10,"Gewählte Funktion: Lauter");
    system("echo \"volup 2\" | nc 127.0.0.1 9294 -N ");
    zeichne_neu();
    break;
  case '-':
    mvprintw (20,10,"                                         ");
    mvprintw (20,10,"Gewählte Funktion: Leiser");
    system("echo \"voldown 2\" | nc 127.0.0.1 9294 -N");
    zeichne_neu();
    break;
  case 'P':
  case 'p':
    mvprintw (20,10,"                                         ");
    mvprintw (20,10,"Gewählte Funktion: Pause");
    //Hier folgt Funktionsaufruf 'Pause'
    system("echo \"stop\" | nc 127.0.0.1 9294 -N");
    zeichne_neu();
    break;
  case 'W':
  case 'w':
    mvprintw (20,10,"                                         ");
    mvprintw (20,10,"Gewählte Funktion: Weiter");
    //Hier folgt Funktionsaufruf 'Weiter'
    system("echo \"play\" | nc 127.0.0.1 9294 -N");
    zeichne_neu();
    break;
  }
}
endwin ();
return 0;
}

Ich muss mich wohl noch intensiv mit dem Buch von Dennis Ritchie (Programmieren in C) beschäftigen.


Viele Grüße

Martin
Zitieren
#69
Hallo Martin,

ich denke das von Dir bereits gekaufte Buch "Linux-Unix-Programmierung" von Jürgen Wolf dürfte hier erstmal ausreichen. Das Problem in deinem Programm besteht in der Ablauffolge und auch immer noch im Zeichnen und Aktualisieren der GUI. NCurses ist nicht das Problem, sondern rein die zeitliche Reihenfolge wie Du die Befehle einsetzt. Mir ist auch klar was Du mit den sleep-Anwendungen machen wolltest, aber so ist das verkehrt. Generell musst Du jetzt an deiner Programmstruktur arbeiten und die einzelnen Teilaufgaben besser bzw. überhaupt delegieren. Das wird bei jedem späteren Programm für ein Internetradio mit Benutzeroberfläche oder Display nötig.

Da Du das weiter oben im Post genannte Buch hast, lese bitte mal Kapitel 10 - Threads durch!

Schreibe dann bitte mal ein Überungsprogramm (ganz ohne ncuses, also direkt in Konsole) in dem
Du zwei ganz einfache Threads in der main() aufmachst.

Der eine Thread schreibt in die Konsole "Ich bin Thread 1.".
Mit dem zeiten Thread schreibst Du in die Konsole "Ich bin Thread 2.".

Die Aufgabe dürfte kein Problem werden, im Buch ist ja Beispielcode dabei.

Erstmal bis hier hin! Wenn Du das gepackt hast, nehmen wir dein ncurses Programm auseinander. Vielleicht sollten wir generell mal darüber nachdenken unsere "Programmierübungen" egal ob zu ncurses oder zu FLTK, QT oder was noch kommen mag, in zwei unterschiedliche Diskussionsrunden zu legen. Dann könnten hier in "Ein minimales Internetradio für .... Raspberrys" nur
die neuen Archive und Fehlerkorrekturen zum iRadio liegen und alles andere wird in einem Nachbarthread behandelt. @Moderation: ginge das? Sonst machen wir ab hier inhaltlich einen Fork.

Viele Grüße
Bernhard
Bei Fragen zum Umbau oder zur Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung oder einfach nur Kontakt- bitte Email unter: mbernhard1945(at)gmail(dot)com

mein PGP-Key unter: https://pgp.mit.edu  Keyword: mbernhard1945
Zitieren


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Ein minimales Internetradio für alte und neue (Android) Smartphones Bernhard45 2 167 10.11.2018, 19:44
Letzter Beitrag: navi
  Netzteil für Internetradio Radiobastler 5 230 04.11.2018, 00:24
Letzter Beitrag: olli0371
  Ein Internetradio Bausatz von PIMORONI Bernhard45 159 4.136 02.11.2018, 22:26
Letzter Beitrag: saarfranzose
  Mein Internetradio rotbarth 45 1.113 31.10.2018, 20:17
Letzter Beitrag: Bernhard45
  Xiron-Raspberry-Internetradio saarfranzose 1 178 25.10.2018, 18:03
Letzter Beitrag: rotbarth

Gehe zu: