Autor Thema: Fragen zur Programmierung FM DAB App  (Gelesen 25320 mal)

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Fragen zur Programmierung FM DAB App
« am: Mai 03, 2020, 07:48:49 Nachmittag »
Ich habe mittlerweile angefangen eine eigene App zu entwickeln auf Basis von Qt und eurer Schnittstelle.

Gibt es ein Kommando, um aus dem DAB Datenstrom die Infos und Bilder zu lesen?

Bislang kann ich Scannen, Tunen, Stationen speichern und bei FM manuell hinzufügen, eigene Favoritenlisten für DAB und FM anlegen und verwalten.

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #1 am: Mai 03, 2020, 08:47:46 Nachmittag »
Werde das am Dienstag überprüfen, es gibt denke ich nur einen C API Befehl der aber (soweit ich sehe) nicht dokumentiert wurde.
Failure is a good thing! I'll fix it

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #2 am: Mai 06, 2020, 08:27:08 Nachmittag »
Gibt es was neues? Wäre schön es mit einbauen zu können, btw Dateiupload geht nicht...

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #3 am: Mai 07, 2020, 10:34:12 Nachmittag »
Könntet Ihr der Einfachkeit halber bitte die Source files von der nicht fertigen, aber für Qt umgesetzten App zur Verfügung stellen?

Daraus könnte ich für meine Qt App einiges lernen. Meine App befindet sich bereits auf Github als open source, schöner wäre es jedoch die Sachen die Ihr bereits implementiert habt mit einzubauen.

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #4 am: Mai 08, 2020, 07:58:50 Vormittag »
Bis hin zu fertigen Bildern muss einiges geparsed werden, mal schauen ob wir das die nächsten Tage über irgendwie in den mediaclient integriert bekommen.

Du greifst die Daten ja über den mediaclient Befehl hab, das ist recht einfach gehalten (und auch gut so), die Meta-Daten aufzubereiten sind da n bißchen aufwändiger.

Das Interesse an den DAB Tunern ist zu gering um auf unserer Seite noch viel Arbeit in die Sache zu stecken, sollte die Stückzahl sich erhöhen kann sich das natürlich ändern.
Im Grunde sind auch alle Informationen freigegeben wie man an alle DAB/FM Informationen kommt (sprich die Treiberschnittstelle ist vollständig offen).
Failure is a good thing! I'll fix it

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #5 am: Mai 08, 2020, 10:02:35 Vormittag »
Danke für die Info, gerade für die Raspberry Gemeinde ist euer Stick interessant, wenn es darum geht, ihn in ein CarProject wie das von Bluewave einzubinden.

Leider will den Stick keiner kaufen, da es an der GUI Bedienbarkeit fehlt.

Deshalb versuche ich mich gerade durch die offene Treiberschnittstelle zu arbeiten. Das arbeiten mit dem mediaclient geht, ist aber sehr aufwändig.

Zum Testen versuche ich einfach mal die Mute on/off Funktion umzusetzen, jedoch renne ich hier bereits in Fehler.

Ich habe mir die aktuellese sundtek_netinst.sh geladen und mit -service installiert. Die mediaclient.h musste ich bereits anpassen, da der compiler Warnungen auswirft (char ist nicht mehr richtig unter C++ ISO 11, mit const char sind die Warnungen weg).

Das größere Problem bereitet mir aber gerade

int net_ioctl(int fd, unsigned int command, parameter);

Wenn ich parameter mit void initialisere, meldet Qt sofort, das dies nicht möglich ist. Mit was muss hier parameter initialisert werden?

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <sstream>
//#include <video.h>

#include "/opt/include/mediaclient.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    int mute(int fd, const char *arg);

private slots:

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

public:
    int fd = net_open("/dev/radio0", O_RDWR); // open device node
    int net_ioctl(int fd, unsigned int command, void parameter);
    //net_close(fd);
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
//#include <iostream>

//#include <iostream>
//#include <unistd.h>
//#include <fcntl.h>
//#include <sstream>

//#include "/opt/include/mediaclient.h"
//#include "/opt/include/mediacmds.h"

using namespace std;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
/*
    int fd = net_open("/dev/radio0", O_RDWR); // open device node
    //net_ioctl(fd, command, parameter);
    net_close(fd);
*/
}

MainWindow::~MainWindow()
{
    delete ui;
}


int MainWindow::mute(int fd, const char *arg)
{
    //int set_mute(int fd, char *arg) {
            int type = 0;
            struct v4l2_control control;
            if (strcmp(arg, "off") == 0) {
                    control.id = V4L2_CID_AUDIO_MUTE;
                    control.value = 0;
                    fprintf(stdout, "Enabling audiostream\n");
                    net_ioctl(fd, VIDIOC_S_CTRL, &control);
            } else if (strcmp(arg, "on") == 0) {
                    fprintf(stdout, "Disabling audiostream\n");
                    control.id = V4L2_CID_AUDIO_MUTE;
                    control.value = 1;
                    net_ioctl(fd, VIDIOC_S_CTRL, &control);
            } else
                    fprintf(stdout, "Wrong argument [%s] choose between on|off\n", arg);

            return 0;
    //}


}

void MainWindow::on_pushButton_clicked()
{
    //fd = net_open("/dev/radio0", O_RDWR); // open device node
    mute(0, "on");
}

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #6 am: Mai 08, 2020, 11:24:41 Vormittag »
fd ist der Filedeskriptor, wenn Du hier 0 nimmst ist das STDIN und das wird nicht funktionieren. fd ist eine Referenz zur jeweiligen Verbindung mit dem Treiber.

fd = net_open("/dev/radio0", O_RDWR);
oder
fd = net_open("/dev/dab0", O_RDWR);

int set_mute(int fd, char *arg) {
        int type = 0;
        struct v4l2_control control;
        if (strcmp(arg, "off") == 0) {
                control.id = V4L2_CID_AUDIO_MUTE;
                control.value = 0;
                fprintf(stdout, "Enabling audiostream\n");
                net_ioctl(fd, VIDIOC_S_CTRL, &control);
        } else if (strcmp(arg, "on") == 0) {
                fprintf(stdout, "Disabling audiostream\n");
                control.id = V4L2_CID_AUDIO_MUTE;
                control.value = 1;
                net_ioctl(fd, VIDIOC_S_CTRL, &control);
        } else
                fprintf(stdout, "Wrong argument [%s] choose between on|off\n", arg);

        return 0;
}

net_close(fd);

http://sundtek.de/wiki/index.php?title=DAB/DAB%2B
« Letzte Änderung: Mai 08, 2020, 11:29:08 Vormittag von Sundtek »
Failure is a good thing! I'll fix it

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #7 am: Mai 08, 2020, 12:13:47 Nachmittag »
diese funktion aus dem wiki habe ich in die cpp kopiert:

int set_mute(int fd, const char *arg) {
            //int type = 0;
            struct v4l2_control control;
            if (strcmp(arg, "off") == 0) {
                    control.id = V4L2_CID_AUDIO_MUTE;
                    control.value = 0;
                    fprintf(stdout, "Enabling audiostream\n");
                    net_ioctl(fd, VIDIOC_S_CTRL, &control);
            } else if (strcmp(arg, "on") == 0) {
                    fprintf(stdout, "Disabling audiostream\n");
                    control.id = V4L2_CID_AUDIO_MUTE;
                    control.value = 1;
                    net_ioctl(fd, VIDIOC_S_CTRL, &control);
            } else
                    fprintf(stdout, "Wrong argument [%s] choose between on|off\n", arg);

            return 0;
    }

die mediaclient.h ist eingebunden, aber trotzdem bekomme ich sofort kompilierungsfehler

/home/ubuntu/progs/qt/sundtek_api/sundtek_api/mainwindow.cpp:99: Fehler: undefined reference to `net_ioctl'

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #8 am: Mai 08, 2020, 12:59:05 Nachmittag »
So langsam verstehe ich es und bekomme auch keinen Kompilierungsfehler mehr, aber wie sieht das innerer der Funktionen net_ioctl, net_open und net_ close aus?

Dazu steht nichts im wiki.

Ohne den Inhalt dieser 3 Funktionen ist das doch alles nicht wert?

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #9 am: Mai 08, 2020, 01:01:57 Nachmittag »
verlinke gegen /opt/lib/libmcsimple.so

Das innere der Funktion befindet sich in der Bibliothek und verbindet sich mit dem mediasrv Prozess und der steuert den Tuner.
« Letzte Änderung: Mai 08, 2020, 01:14:25 Nachmittag von Sundtek »
Failure is a good thing! I'll fix it

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #10 am: Mai 08, 2020, 01:30:38 Nachmittag »
Alles klar, jetzt kann ich tatsächlich ohne Probleme kompilieren und zumindest schonmal muten/unmuten.

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #11 am: Mai 08, 2020, 08:36:50 Nachmittag »
Habe leider doch noch eine offene Frage, wenn ich die RDS Funktion nutze und so umbaue, das auf Knopfdruck ein label geändert werden soll, stürzt das Programm ab.

Ohne diesen Schritt sehe ich die Ausgabe im Terminal von qt, also wenn ich die Funktion nicht anfasse.

Ich bekam immer den Fehler das die conversion von uint_8 in QString nicht möglich ist, also habe ich die Ausgabe angepasst, jedoch stürzt damit das Programm sofort ab.

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #12 am: Mai 09, 2020, 05:12:41 Vormittag »
Im Wiki ist doch eh ein Beispiel gegeben wie Du RDS dekodieren kannst? Hinter den Blöcken steckt eigentlich eine Spezifikation.

print_program wäre char, uint8_t* kann mit static_cast<char*>(variable) gecastet werden, oder auf altem Wege mittels (char*)variable.

Außerdem muss der Array mit 0 initialisiert werden (z.B mit memset oder bzero).

Eigentlich müssten die ganzen Daten durch eine Character Mapping Tabelle laufen.
« Letzte Änderung: Mai 09, 2020, 06:31:11 Vormittag von Sundtek »
Failure is a good thing! I'll fix it

Vitalic

  • Newbie
  • *
  • Beiträge: 49
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #13 am: Mai 09, 2020, 10:03:52 Vormittag »
Nach etwas Recherche habe ich auch den richtigen Weg gefunden.

char irgendwas = static_cast<char>(radiotext[i]);

test.append(irgendwas);

qDebug() << test;

im Debuger sehe ich auch, das es funktioniert, jedoch hängt sich das Programm immer auf, also es arbeitet weiter, wie ich im Debuger auch den RDS output sehen kann, jedoch kann ich sonst nicht mehr mit der App machen (mute/unmute).

Selbst wenn ich die Ausgabe auskommentiere, hängt die App, da sie nur mit der Funktion beschäftigt ist.

Sundtek

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 8604
    • Profil anzeigen
Re: Fragen zur Programmierung FM DAB App
« Antwort #14 am: Mai 09, 2020, 10:11:24 Vormittag »
Na die Funktion ist eine Schleife, entweder sie wird in einem Thread oder ein einzelner Durchgang regelmäßig in einem Timer ausgeführt. Timer (in dem Fall QTimer) sind in dem Fall wohl einfacher.
Failure is a good thing! I'll fix it