[ANNOUNCE] vdr-osdserver 0.0.2

  • Hi,


    Version 0.0.2 des OSDServer-Plugins ist veröffentlicht.


    OSDServer ist ein Plugin, dass es externen Programmen ermöglicht, das OSD und die Menüsysteme des VDR zu benutzen. Der Zugang erfolgt über TCP/IP und eine einfache Skriptsprache, wobei die Sprache bewusst auf die Benutzung durch Perl-Programme und Shell-Skripte ausgelegt ist. Bisher waren interaktive VDR-Anwendungen weitgehend C++-Programmierern vorbehalten, mit diesem Plugin können auch reine Skriptprogrammierer das OSD nutzen.


    Version 0.0.2 bietet einen ersten, soliden Befehlssatz für Menüs und Konfigurationsdialoge, und sollte sich bereits für erste Anwendungen eignen. Feedback bei Problemen und für Verbesserungsvorschläge ist willkommen.


    Download und Beispiel: http://www.udo-richter.de/vdr/osdserver.html


    Gruß,


    Udo

  • Zitat

    Original von Urig
    .... Bisher waren interaktive VDR-Anwendungen weitgehend C++-Programmierern vorbehalten, mit diesem Plugin können auch reine Skriptprogrammierer das OSD nutzen.....


    Hey das bin ja ich!! ;)


    Hast du es tatsächlich vor dem Snut geschafft! Gratuliere!! Werde mir das mal ansehehen. Vielleicht kann ich damit meine Scripte interaktiv machen! ;)


    Bleibt es dabei das du Samstag kommst?


    Gruß


    Toxic

    Registrierter VDR-User #1275


    VDR-Server: Proxmox 7.1 - LXC Container - Debian 11.5 - eTobi-VDR 2.6.0

    DVB-Hardware: Digital Devices - Cine S2 V5.5 und V6

    VDR-Clients: FireTV Sticks 2 bis 4K Max und Kodi 19.4

  • Hallo Udo,


    vielen Dank erstmal für deine neue Osdserver Version ;).
    Ich konnte mit dieser Version nun das realisieren, woran ich mit meinen nicht vorhandenen C++ Kenntnissen gescheitert bin.
    Da meine Perl Kenntnisse auch nicht die besten sind, ist daraus dann ein etwas übler Code geworden (der nochmals überarbeitet werden muss) ;).


    Zitat

    Feedback bei Problemen und für Verbesserungsvorschläge ist willkommen.


    Bei unten stehenden Codeschnipsel zeige ich ein Array (jede Zeile ein OSDItem) an was ich aus einer Datei lese.
    Dabei kann es vorkommen das in der Datei eine Zeile einen Zeilenumbruch (OSD Breite 80 Zeichen) hat.
    Beispiel:

    Code
    [1][ANNOUNCE] Plugin 'sndctl-0.1.3' - Soundkartensteuerung in 
    Abhängigkeit von der VDR Lautstärke 
    [2] .....


    Eigentlich wollte ich die zweite Zeile als "OsdItem -unselectable" anzeigen, was auch funktioniert.
    Mein Problem ist nun leider das mit "SendCmd "smenu.GETCURRENT" " auch das -unselectable OSDItem mit gezählt wird.
    In meinem Fall wäre es besser wenn nur die aktiven OSDItem Nummern zurückgegeben würden, also die -unselectable von der Zählung ausgeschlossen würden (?).
    Muss die so sein bzw. ist das VDR spezifisch?



    Eine weitere Frage habe ich zu den Menüs bzw. Submenüs.
    Gehen immer nur zwei Ebenen, also Menü -> Submenü
    oder geht auch dieses Menü -> Submenü --> Submenü ?


    Ich bekomme zwar im letzteren Fall alle Menüs so geöffnet wie ich es möchte allerdings springe ich bei BACK vom letzten Submenü direkt immer auf das Menü zurück und nicht wie erhofft auf das vorherige Submenü.



    Da ich mit sopt$i die OSDItem bzw. die Events versuche dynamisch anzulegen (was auch funktioniert)

    Code
    SendCmd "sopt$i=smenu.AddNew OsdItem '$Thread'" or return $false;
                SendCmd "sopt$i.EnableEvent keyOk" or return $false;


    habe ich allerdings ein Problem bei der Abfrage der Events ?( .


    Folgender Code funktioniert leider nicht :( , und feste sopt1 - soptxx im Script einbauen kann ich leider nicht, da ich nicht weiß wie viele Einträge die Liste bzw. das Array hat.

    Code
    SendCmd "smenu.GETCURRENT" or return $false;
            if (!defined $reply3xx[0] || $reply3xx[0] != 302) { return $false; }
            $result = $reply3xx[1];
    
    
            if (IsEvent("sopt$result","keyOk")) {
                SendCmd "delete smenu" or return $false;
                return $true;
            }


    Das Script funktioniert zwar bei mir, ist vielleicht nicht alles im Sinne des Erfinders aber es funktioniert ;) .


    Gruß,
    Chuck

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

    Einmal editiert, zuletzt von vdrchuck ()

  • Zitat

    Originally posted by Toxic-Tonic
    Bleibt es dabei das du Samstag kommst?


    Klar, jetzt, wo ich osdserver fertig habe, kann ich ja kommen. :D



    Zitat

    Originally posted by vdrchuck
    Mein Problem ist nun leider das mit "SendCmd "smenu.GETCURRENT" " auch das -unselectable OSDItem mit gezählt wird.
    In meinem Fall wäre es besser wenn nur die aktiven OSDItem Nummern zurückgegeben würden, also die -unselectable von der Zählung ausgeschlossen würden (?).
    Muss die so sein bzw. ist das VDR spezifisch?


    Da halte ich mich an die VDR-interne Vorgehensweise, und nummeriere glatt durch, egal was in der Zeile ist. Du kannst aber auch eine eigene Identifikation über den Variablennamen des OSDItem machen - in deinem Fall das sopt$i durch ein sopt$j ersetzen, und $j nur bei selektierbaren Zeilen hochzählen. GETCURRENT liefert beides, SETCURRENT funktioniert in der Varainte sopt$j.SETCURRENT.


    Zitat

    Eine weitere Frage habe ich zu den Menüs bzw. Submenüs.
    Gehen immer nur zwei Ebenen, also Menü -> Submenü
    oder geht auch dieses Menü -> Submenü --> Submenü ?


    Menüs können beliebig tief geschachtelt werden. (Auch wenn ich es noch nicht selbst ausprobiert habe... ;) )


    Natürlich muss jedes neue Submenü einen neuen Namen haben, sonst kannst du nach dem Schließen eines Menüs nicht mehr auf das darunterliegende zugreifen.


    Zitat
    Code
    SendCmd "smenu.GETCURRENT" or return $false;
    [...]
    if (IsEvent("sopt$result","keyOk")) {
        SendCmd "delete smenu" or return $false;


    Die Hilfsfunktion IsEvent - wenn es denn das aus meinem Beispiel ist - erwartet die Ausgabe eines SLEEPEVENT in @reply3xx, also etwas in der Form "300 Objekt Event", dort ist aber nach dem GETCURRENT etwas in der Form "302 Nummer Objekt".


    Ausserdem ist die feine englische Art ein Menü zu schließen ein smenu.SENDSTATE osBack vor dem delete.


    Für viele gleiche Zeilen ist es u.U. auch sinnvoller, das keyOk event nicht auf jede einzelne Zeile, sondern auf das Menüobjekt zu legen, und dann mit GETCURRENT zu arbeiten.


    Gruß,


    Udo

  • Hallo Udo,


    Zitat

    Original von Urig


    Menüs können beliebig tief geschachtelt werden. (Auch wenn ich es noch nicht selbst ausprobiert habe... ;) )


    Natürlich muss jedes neue Submenü einen neuen Namen haben, sonst kannst du nach dem Schließen eines Menüs nicht mehr auf das darunterliegende zugreifen.


    kannst du mir dann mal einen Tipp geben warum dies nicht funktioniert (Menü->Submenü1->Submenü2 --- und mit Back wieder zurück --- Submenü2->Submenü1->Menü) ?( .



    Gruß,
    Chuck

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

  • Kommunikationslog aus der Konsolenausgabe:

    Code
    > ssopt1=submenu2.AddNew OsdItem 'Eintrag Submenü 2'
    < 200 Ready.
    > submenu2.show
    < 200 Ready.
    > submenu2.SleepEvent
    < 412 Error: Object is not active.
    < 200 Ready.
    > submenu1.show
    < 200 Ready.
    > submenu1.SleepEvent


    Da funktioniert was noch nicht. Eigentlich sollte submenu2.show das Menü anzeigen. Der darauf folgende Befehl submenu2.SleepEvent scheitert aber, weil es kein zu submenu2 zugehöriges VDR-Menüobjekt gibt - wobei ich noch nicht weiß, wieso nicht: Der show-Befehl hätte es generieren müssen.


    Es ist jedenfalls eindeutig ein Bug in osdserver. Ich kann aber noch nicht sagen, wann ich dazu komme, das Problem genauer zu untersuchen.


    Gruß,


    Udo

  • Ok, das Problem ist gefunden. Untergeordnete Menüs wurden nicht aktualisiert, falls das übergeordnete Menü unverändert war.


    Bei nur einem Untermenü funktionierte es, weil das Hinzufügen ins übergeordnete Menü als Veränderung zählt. Beim Hinzufügen des Subsubmenüs wird aber nur das Submenü, und nicht das Hauptmenü verändert, daher trat es erst beim Subsubmenü auf.


    Ein weiteres Problem ist mir dabei auch aufgefallen: Schließt man einen kompletten Menübaum mit der Menütaste, liefert bisher nur das Hauptmenü ein close-Event. Jetzt liefern alle Menüs korrekt ein close-Event ab. Die helloworld-Beispiele gehen allerdings noch nicht sauber genug mit diesem Fall um.


    Der angehängte Patch behebt beide Probleme.


    Gruß,


    Udo

  • Hallo Udo,


    ja das mit den mehreren (zwei) Submenüs hintereinander funktioniert jetzt -> danke.
    Ich erhalte aber bei obigen Beispiel wenn ich die Submenüs mit BACK verlasse immer noch folgende Antwort vom OSDServer.



    In den Submenüs habe ich im obigen Beispiel osEnd durch osBack erstetzt.
    Wenn ich das zweite Submenü mit keyBlue verlasse kommt die Meldung nicht.


    Gruß,
    Chuck

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

  • Du hast bei keinem deiner Menüs mit EnableEvent das close-Event aktiviert, deswegen sagt osdserver dir auch nicht, dass das Menü gerade zerstört wurde. Statt dessen endet SleepEvent mit dem 412-Fehler, da das Menü nicht mehr existiert.


    Nach einem close-Event brauchst du auch kein SendState mehr machen, da das Menü ja schon längst geschlossen ist.


    Ein weiteres Problem (das auch bei den helloworld-Beispielen noch nicht richtig gelöst ist) ist, dass der Show-Befehl nach SubMenu1() bzw. SubMenu2() das Menü wieder hervorholen würde, falls das Untermenü mit der Menütaste geschlossen wurde - und damit auch das übergeordnete Menü längst geschlossen ist.


    Besser wäre es, nach dem Ende des Untermenüs erst einmal mit SleepEvent -timeout 0 ein eventuell anstehendes close des Menüs abzuholen, und erst, wenn kein close kommt, Show aufzurufen. Da du aber eh nichts am Menü veränderst, ist der Show-Aufruf in deinem Fall aber sowieso entbehrlich.


    Gruß,


    Udo

  • Hallo,


    ich stelle mal hier das Script ein was ich mit Hilfe des OSDServers gebastelt habe bzw. jetzt realisieren konnte ;) .


    @Udo
    Wenn du was dagegen hast das ich das Script hier in deinem Annoucement poste (?), werde ich einen Mod bitten diesen Beitrag ggf. zu verschieben --> aber ich denke da das Script nun mal nur mit dem OSDserver läuft passt es hier ganz gut rein.


    Ich habe das Script vdr-portal.pl genannt, weil man mit diesem (mit der Hilfe von Lynx) das VDR-Portal per OSD absurfen kann.
    Der Vorteil zu meiner alten Lösung (Surfer Plugins + vdr-portal.pl) ist nun das man die Links direkt ansteuern kann und nicht immer durchblättern muß.


    Das Script und die url.conf müssen im gleichen Verzeichnis liegen. Im Script muss dann noch das $dir und die $width für Lynx (bei Bedarf) anpasst werden.


    Ich hoffe ich habe alle Probleme die im Bezug auf Spracheinstellungen (OS in Verbindung mit Lynx und die Seitenanforderung von Lynx) auftreten können, zumindestens für Deutsch und Englisch abgefangen.


    Gruß,
    Chuck


    P.S.
    Da ich nicht mit Perl aufgewachsen bin ist der Code evtl. was gewöhnungsbedürftig ;) .


    [EDIT]
    Neue Version hochgeladen:
    - zusätzliches Menü Settings --> Thread recursive (Ja/Nein) und Lynx Breite
    - Settings werden in der vdr-portal.conf gespeichert
    - ein paar kleine parsing Fehler behoben


    Das Script ist nun hier zu finden --> [ANNOUNCE] VDR-Portal per OSD - vdr-portal.pl - v.0.1

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

    2 Mal editiert, zuletzt von vdrchuck ()

  • Klasse Idee, ich werd es mir auf jeden Fall noch genauer anschauen.


    Zitat

    Wenn du was dagegen hast das ich das Script hier in deinem Annoucement poste (?), werde ich einen Mod bitten diesen Beitrag ggf. zu verschieben --> aber ich denke da das Script nun mal nur mit dem OSDserver läuft passt es hier ganz gut rein.


    Ehrlich gesagt, du solltest dich damit nicht nur hier verstecken - mach ruhig ein eigenes Announce-Posting, entweder bei VDR News, oder bei C/C++/Scripten. Das gibt deinem Projekt die Aufmerksamkeit, die es verdient.


    Tatsächlich ist das der Anfang dessen, was ich mir erhofft hatte: Dass andere Dinge mit meinem Plugin machen, die ich gar nicht erwartet hatte. Nur weiter so!


    Gruß,


    Udo

  • Hi ,


    Super das Teil zusammen mit dem script vdr-portal habe ich erst verstanden was damit möglich wird. Danke ...


    Gruss Patrice


    Diskless Client: SMT 7020S und S100 128SDRAM 32DOM zendeb 0.4.0 beta1 mit MMS 1.0.8.5
    Hardware: Pundit-R Celeron 2.4 256DDRAM Samsung SATA 400 Gbyte Festplatte Hauppage Nexus-S Rev 2.3 Nova-S Plus DVD-RAM LG
    Software: EasyVDR 0.6.0 (vdr-1.6.0-2-ext64), LinVDR 0.7 1.4.7 Mahlzeit, SUSE-Server 10.2 1.6.0-1
    Test System: Shuttel AMD Athlon 2.6 Ghz 256DDRAM Samsung 250Gbyte Hauppage Nexus-S Rev 2.3 DVD-RAM LG ......

    :fans :welle

  • Da kann ich mich mal nur anschließen, vorher hab ich das Plugin locker überlesen...


    Also auch mein Dank!


    Grüße Christian

    CKone: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G540, 2x 2GB Kingston DDR3, Zotac GT630 1GB, S2-1600, Ocz Agility 3 60GB, LG GH24NS DVD, 15.6" Selbstbau TFT, Harmony 665, CIR Selbstbau - das Ganze im Silverstone SST-SG03B
    CKtwo: yavdr-ansible/18.04 LTS/2.4.1/kodi18 auf Intel DH67BL, Intel Celeron G1610, 2x 2GB Corsair DDR3, Zotac GT630 1GB, TT S2-1600, Ocz Vertex 2 50 GB, 92 Kanal Seduatmo, Harmony 665, atric USB
    CKthree: yavdr-ansible/22.04 LTS/2.6.1/kodi19.3 auf Intel NUC, Celeron J4005, UHD Graphics 600, 4GB Crucial DDR4, Ocz Vertex2 50 GB, Harmony 350

    PowerEdge: Ubuntu Server 16.04 LTS / VDR 2.4.1 auf Dell PowerEdge T20, Xeon E3-1225 v3, 16GB ECC DDR3, 2x Cine S2 V6 mit Duoflex, Samsung 840 EVO 120GB, 3x WD White WD80EZAZ 8TB in SW Raid5



  • Habe osdserver + vdrportal.pl im Einsatz. Einfach Klasse! Nur ein Problem habe ich. Beim Beenden des vdr schmiert der immer mit einem core beim beenden des osdserves ab. Hier mal der Stack trace:


    Vieleicht kannst Du damit ja etwas anfangen.

    VDR: Silverstone SG05 Lite, ASRock MB H510M-HDV R2.0, I3 10100, 8GB RAM, Ubuntu 22.04, vdr 2.6.4, 120GB SSD, 8TB SSD, Digital Devices Max S8X, Nvidia GT730, IR-WAKEUP USB


  • An #3 verzweigt ~cPlugin(), um die i18n-Strings des Plugins freizugeben. I18NRegister durchsucht dann die Stringliste nach den Strings von osdserver. Dabei vergleicht #1 dann einen Stringlisten-Eintrag 0xfffffffd mit "osdserver".


    Hier ist also wohl die cI18nList von VDR durcheinander gekommen - eine interne, für osdserver nicht erreichbare VDR-Datenstruktur. Mal ganz davon ab, dass osdserver überhaupt keine i18n-Strings registriert.


    Tritt der Fehler auch auf, wenn du nur VDR und osdserver lädst, keine anderen Plugins?


    Der Wert 0xfffffffd sieht mir nach einem falsch gecasteten NULL-Zeiger aus. Ist VDR und osdserver sauber zusammen passend übersetzt, mit make clean clean-plugins vorher?


    Gruß,


    Udo

  • Hallo Udo,


    ist alles sauber übersetzt. Nur osdserver als Plugin probiere ich mal aus. Kann aber noch etwas dauern, die Zeit ist gerade etwas knapp...


    Danke & Gruss
    Torsten

    VDR: Silverstone SG05 Lite, ASRock MB H510M-HDV R2.0, I3 10100, 8GB RAM, Ubuntu 22.04, vdr 2.6.4, 120GB SSD, 8TB SSD, Digital Devices Max S8X, Nvidia GT730, IR-WAKEUP USB

  • Hallo Udo,


    das Problem war zu 99,9% ein anderes Plugin, an welchem ich zufälligerweise gerade rumprogrammiert habe :versteck
    Waren noch so ein paar Kleinigkeiten nicht sauber. Nachdem ich das sauber hatte, habe ich seit ein paar Tagen keine Abstürze mehr ...


    Gruss
    Torsten

    VDR: Silverstone SG05 Lite, ASRock MB H510M-HDV R2.0, I3 10100, 8GB RAM, Ubuntu 22.04, vdr 2.6.4, 120GB SSD, 8TB SSD, Digital Devices Max S8X, Nvidia GT730, IR-WAKEUP USB

  • Hallo Udo,


    ich habe mit untenstehenden Code das Problem wenn ich mit Yellow das Submenü aufrufe und mit Blue das Submenü wieder verlasse und dies ständig schnell wiederhole --> schmiert mir der VDR ab :( .


    Es liegt nach meiner Meinung am

    Code
    SendCmd "uname=setting.AddNew EditStrItem 'Name' '$uname'"


    Gruß,
    Chuck


    Backtrace:


    Hier der Beispielcode:

    1- yavdr 0.5 - DVB-C
    1- VDR-1.7.14 - Xine Pugin - XBMC - DVB-C
    2- Activy 300 mit Gen2VDR V2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!