Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
XBMC Skript mit zwei gfx Displays
#1
Hallo zusammen,

ich bin gerade dabei mir einen HTPC basierend auf XBMC zurecht zu basteln.
Dabei bin ich auf mehrere Probleme gestossen die ich auch nach mehreren Tagen Recherche nicht lösen konnte und hoffe jemand kann mich diebzüglich in die richtige Richtung stoßen.

Ich habe zwei Displays, DigitalDevices Sideshow Touch Display und Futaba MDM166A

Auf dem TouchDisplay soll das AlbumCover sowie eine rudimentäre Touchsteuerung rellisiert werden, das Futaba soll klassisch Album,Artist und Title anzeigen.
Das funktioniert auch bereits soweit. Das AlbumCover wird mithilfe von IrfanView auf der CommandLine in BMP umgewandelt und eingelesene.
Um nun nicht alle 2-3 Sekunden IrfanView anzustossen und so die Festplatte zu entlasten, lese ich mittels System.ReadFile den Wert Changed(TRUE|FALSE) von XBMC aus (über HTTP).
Dieser Wert ist beim ersten Auslesen True und solange sich nichts ändert bei jedem weiteren Auslesen false. Dadurch wird die BMP nur erstellt wenn sich auch wirklich etwas ändert.

Da ich nun zwei Instanzen von LCDHype starten muß und beide per SystemReadFile auf das XBMC zugreifen klappt dieser Mechanismus nicht mehr.
Wenn z.B. das Futaba vor dem TouchDisplay SystemReadFile aufruft ändert sich der Wert auf False und folglich wird das AlbumCover nicht aktualisiert. Die Anzeigen sind dann folglich auch nicht mehr synchron.

Fragen:
1: Ist es möglich mit dem MultiController Treiber auch zwei gfxDisplays anzusteuern, im Moment scheint es ja nur für ein Text- und ein graphisches Display zu gehen.

2:Ist es möglich mit LCDHype auf BroadcastEvents zu reagieren? Das XBMC sendet Brodacast events falls sich etwas ändert, bzw. im XBMC navigiert wird, inkl. alleer Infos. Das wäre sichrtlich die elegenteste und ressourcenschonenste Lösung, da man sich hier die ständigen polls zum XBMC sparen könnte und das Problem mit dem Parameter changed hätte sich auch erledigt! biggrin.gif

3: Gibt es eine Möglichkeit zwischen zwei LCDHype instanzen Nachrichten auszutauschen?
Edit:Habs rausgefunden. Über die TCP-Message-Funktion ist das möglich *freufreu*


Ich bin für jeden Denkanstoss dankbar!
Beste Grüße und Danke,
Chaos42
#2
FYI
Hab mich nun dazu entschlossen eine Client/Server App zwischen LCDHype und XBMC zu setzen. Sobald ich damit fertig bin werde ich die JavaApp gerne allen Interessierten hier zur Verfügung stellen.
Die Frage mit dem Multicontroller Treiber ist nach wie vor akut.


So long,
Chaos42
#3
QUOTE

Da ich nun zwei Instanzen von LCDHype starten muß und beide per SystemReadFile auf das XBMC zugreifen klappt dieser Mechanismus nicht mehr.
Wenn z.B. das Futaba vor dem TouchDisplay SystemReadFile aufruft ändert sich der Wert auf False und folglich wird das AlbumCover nicht aktualisiert. Die Anzeigen sind dann folglich auch nicht mehr synchron.


also ich versteh nich ganz warum das nicht geht. ich habe gerade testweise 2x lcdhype gestartet und habe bei beiden C:\test.txt einlesen lassen. in beiden fällen werden änderungen am file auch angezeigt.

oder versteh ich deine frage / problem nich?

QUOTE

Ist es möglich mit dem MultiController Treiber auch zwei gfxDisplays anzusteuern, im Moment scheint es ja nur für ein Text- und ein graphisches Display zu gehen.


nein. das würde ja auch keinen sinn machen denn dann würden beide das selbe anzeigen.

QUOTE

Ist es möglich mit LCDHype auf BroadcastEvents zu reagieren?


wenns tcp broadcasts sind vieleicht. nie ausprobiert.


Current stable version of LCDHype: 0.7.6
New plugin: Notepad++ Bookmark Manager
New music: Nordwise - Empire transition
#4
QUOTE
also ich versteh nich ganz warum das nicht geht. ich habe gerade testweise 2x lcdhype gestartet und habe bei beiden C:\test.txt einlesen lassen. in beiden fällen werden änderungen am file auch angezeigt.

oder versteh ich deine frage / problem nich?


Sorry falls ich mich missverständlcih ausgedrückt habe. Das hat nichts mit LCDHype zu tun, sondern ist ein feature von XBMC. Wenn ich die Daten wie Artist,Album,etc. beim XBMC abfrage hat dieser Parameter(changed) den Wert true, wodurch ich erkennen kann, dass sich was geändert hat. Stelle ich nun noch eine Anfrage, z.B. durch das zweite Display welches über eine weiter Instanz von LCDHype läuft, bekomme ich solange kein neues Lied gespielt wird den Wert false zurück. Dadurch ist es für mich nicht möglich zu erkennen ob ein neues Lied gespielt wird und ob z.B. das Albumcover neue generiert werden muss. Der Parameter gibt nur an ob sich seit der letzten Anfrage etwas geändert hat, unterscheidet dabei allerdings nicht zwischen den anfragenden clients.
Um genau diesem Problem vorzubeugen schreibe ich gerade an nem Server der auf die UDP BRoadcasts vom XBMC hört und anschliessend LCDHype per TCP über die Statusänderung (z.B. neuer Song) informiert und die Infos wie Album,Artist, etc. bereitstellt.

QUOTE
nein. das würde ja auch keinen sinn machen denn dann würden beide das selbe anzeigen.


Ich dachte da an eine Lösung wie das man den #TxtMode durch einen #GfxMode2 ersetzt. Bei mir zeigt das eine Display das album cover an und kümmert sich um die touchsteuerung und das andere display Futaba MDM166A zeigt eigentlich nur scrollenden text (Album/Artist,Lautstärke, PLay/Stop,etc..) und die eine oder andere Animation an.
Und wenn ich das richtig verstanden habe dann kann ich das Futaba nicht innerhalb des #TxtMode ansprechen.
Da wäre dann die Möglichkeit zwei Graphikdisplays anzusteuern sehr praktisch, falls das möglich ist. rolleyes.gif

QUOTE
wenns tcp broadcasts sind vieleicht. nie ausprobiert.

Sind UDP Broadcasts, aber die Tunnel ich jetzt mit meinem Sever über TCP rolleyes.gif

Grüße,
chaos42
#5
QUOTE

Um genau diesem Problem vorzubeugen schreibe ich gerade an nem Server der auf die UDP BRoadcasts vom XBMC hört und anschliessend LCDHype per TCP über die Statusänderung (z.B. neuer Song) informiert und die Infos wie Album,Artist, etc. bereitstellt.


warum schreibst du nicht gleich ein plugin für lcdhype? das wird doch denke ich mal etwas frickelig mit dem tcp. du müsstest ja dann die tcp nachrichten auch erstmal im script irgendwie parsen. vieleicht ist ein plugin doch einfacher. da kannst du dann auch sonstwas reinbauen und bist nicht auf die scriptsprache beschränkt.

QUOTE

Ich dachte da an eine Lösung wie das man den #TxtMode durch einen #GfxMode2 ersetzt....Da wäre dann die Möglichkeit zwei Graphikdisplays anzusteuern sehr praktisch, falls das möglich ist.


Als ich am Wochenende über deinen Post nachgedacht habe ist mir auch sowas ähnliches in den Sinn gekommen. Nicht ersetzen sonder erweitern. Zum Beispiel das man einen bestimmten Scriptblock an ein bestimmtes LCD binden kann. So könne man die Scriptauswertung auch auf verschiedene CPU Kerne legen.

Ich hatte dann auch gleich Lust das zu erweitern nur kam mir dann in den Sinn, was da alles dranhängt. Der LCD Einstellungen Dialog müsste aufgebohrt werden, das Script Handling intern sowieso und noch viele andere Sachen. Das ist ganz schön viel Arbeit.

Dann bin ich zu dem Schluss gekommen das es vieleicht doch reicht LCDHype 2x zu starten... ph34r.gif

QUOTE

Sind UDP Broadcasts, aber die Tunnel ich jetzt mit meinem Sever über TCP


...und genau diesen Server würde ich einfach in ein LCDHype Plugin packen.
Current stable version of LCDHype: 0.7.6
New plugin: Notepad++ Bookmark Manager
New music: Nordwise - Empire transition
#6
Hab mich ne Weile nicht gemeldet, da ich im Urlaub war cool.gif
Im Zug zum Flughafen hab ich weiter an meinem Server gecodet, der läuft auch soweit.
Das mit dem Plugin wäre sicher die beste Lösung, nur leider beschränken sich meine Programmierkentnisse nur auf Java sad.gif
daher setzte ich im Moment weiter auf den JavaServer. Natürlich wäre ich mehr als begeistert wenn sich jemand einem solchen Plugin annehmen würde. Gerne supporte ich ein solches Vorhaben so gut es mir möglich ist. blink.gif

Jetzt haben sich mehrere Probleme ergeben.

Wie startet man am besten zwei Instanzen von LCDHype beim Windowsstart?
Muß dazu LCDHype zweimal installiert werden?
Die zweite Instanz hat bei mir immer die Einstellungen der ersten.
Gibt es vielleicht Kommandozeilenparameter um festzulegen welches Skript gestartetw erden soll udn mit welchen Einstellungen?
Zudem empfängt die zweite Instanz keine TCP Nachrichten sobald beide auf einem Rechner (verschiedene Ports) laufen, auf zwei getrennten Rechner werden beide Instanzen problemlos bedient.


Beste Grüße,
Chaos42

@ViRuSTriNiTy: Gerne würde ich für mein aktuelles Projekt einen Thread anlegen sozusagen als Dokumentation und vielleicht findet sich ja jemand der mitmachen will.
Dort würde ich dann auch alle projektbezogene Fragen loswerden. Ist so etwas heir erwünscht und was wäre der beste Bereich hierfür?
Und falls es dich irgendwann doch überkommt eine Unterstützung für zwei graphische Displays zu implementieren wäre das fantastisch, kann aber auch verstehen das es sehr viel Arbeit ist und andere Dinge da sicher Priorität haben.
#7
QUOTE

Hab mich ne Weile nicht gemeldet, da ich im Urlaub war


Ich hoffe du hast dich gut erholt C:

QUOTE

Das mit dem Plugin wäre sicher die beste Lösung, nur leider beschränken sich meine Programmierkentnisse nur auf Java


Es sollte möglich sein auch ein SDK für Java zu machen. In diesem sollte die Weiterleitung von der DLL zu Java Code irgendwie gehen. Sowas ähnliches hab ich schon bei der Umsetzung von LCDHype für Linux gemacht. Muss ich mal schauen.

QUOTE

Wie startet man am besten zwei Instanzen von LCDHype beim Windowsstart?


also ich hätte jetzt gesagt 2x in den autostart legen, oder batchscript oder als dienst starten etc.

QUOTE

Die zweite Instanz hat bei mir immer die Einstellungen der ersten.


Nutze den Kommandozeilenparameter "configpath", siehe data\help\documents\parameters.htm.

QUOTE

Zudem empfängt die zweite Instanz keine TCP Nachrichten sobald beide auf einem Rechner (verschiedene Ports) laufen, auf zwei getrennten Rechner werden beide Instanzen problemlos bedient.


Hast du mal geschaut welche Ports offen sind. Vieleicht haut der Einstellungsdialog nicht hin? Wenn 2 verschiedene Ports angegeben sind sollte das doch funktionieren.

QUOTE
Gerne würde ich für mein aktuelles Projekt einen Thread anlegen sozusagen als Dokumentation und vielleicht findet sich ja jemand der mitmachen will. Dort würde ich dann auch alle projektbezogene Fragen loswerden. Ist so etwas heir erwünscht und was wäre der beste Bereich hierfür?


Ich denke mal Unterforum Projekte ist die richtige Kategorie?

http://lcdhype.condense.de/index.php?showforum=21
Current stable version of LCDHype: 0.7.6
New plugin: Notepad++ Bookmark Manager
New music: Nordwise - Empire transition
#8
QUOTE
Es sollte möglich sein auch ein SDK für Java zu machen. In diesem sollte die Weiterleitung von der DLL zu Java Code irgendwie gehen. Sowas ähnliches hab ich schon bei der Umsetzung von LCDHype für Linux gemacht. Muss ich mal schauen.


Ist sicher kein einfacher Tasks aber wäre natürlich fantastisch wenn das ginge. So ganz glücklich bin ich mit meiner Lösung nicht, ist halt nur en workAround. Erkläre mich auch gerne bereit das entsprechende XBMC Plugin zu liefern smile.gif

QUOTE
Nutze den Kommandozeilenparameter "configpath", siehe data\help\documents\parameters.htm.


Juche, genau was ich gesucht habe. Jetzt hat das mit den zwei Instanzen wunderbar geklappt. Und mit genug Vorlauf beim Hochfahren starten auch beide Instanzen problemlos. Das mit den nicht zugestellten TCP Nachrichten hat sich auch geklärt, hatte gestern Abend wohl doch noch auf nem Rechner ein Testserver laufen, der ab und zu die Ports dicht gemacht hat ph34r.gif

Aber es wäre kein richtiger Tag ohne ein neues Problemchen.
Leider ist die korrekte Darstellung des ALbumcovers eher Glücksache. MUss ne eigenheit bei der Darstellung von BMPs sein, da es mit Text auf dem Futaba funktioniert und das Konzept ist das gleiche.

Hier mal mein Code:



CODE

#Header
%Common.SetPriority(200)
%CleanUp.ClearVRAM()
%DefVar(CoverName,Local='DefaultAlbumCover.png')
%DefVar(Info,Local='-1')
#EndHeader


%#GfxMode

%If(%Message.Count() > 0) Then { %Assign(Info,%Message.Get()) }

%If(%Info() = 10)Then{
 %Assign(Info,'-1')
 /transform thumbnail to bmp/
 %System.Execute('C:\Program Files\IrfanView\i_view32.exe', 'C:\Program    Files\XBMC\web\thumb.jpg /resize=(240,240) /convert=C:\Program Files\XBMC\web\thumb.bmp', 1000)
 /load bitmap/
%Graph.LoadBitmap('C:\Program Files\XBMC\web\thumb.bmp',0,0,0,0,240,240,0,NONE)
%Assign(CoverName,%System.SendPacket(TCP,'192.168.178.54',4422,1,'13'))
%If(%String.Pos('DefaultAlbumCover.png',%CoverName()) > 0)Then {
%CleanUp.ClearVRAM()
%Graph.LoadBitmap('C:\Program Files\XBMC\web\noalbumart.bmp',0,0,0,0,240,240,0,NONE)}
}


 
%If(%Info() = 6)Then{
 %Common.ChangeScreen(100, 1)
}  

#EndGfxMode


Das ganze funktioniert so:
Sobald der nächste Song gespielt wird schickt mein Server eine TCP Nachricht an LCDHype mit dem Code 10. Dann weiß das Skript, dass es ein neues Thumbnail erst von JPG nach BMP umwandeln muß, via IrfanView und anschliessend soll dieses angezeigt werden. Für den Fall das kein Thumbnail verfügbar ist holt sich das Skript den Namen des aktuellen Thumbnails vom Server und zeigt ein Dummybild an.
Sobald das Event 6 (Stop) gesendet wurde wechselt das Skript in den nächsten Skriptabschnitt.

Die Nachrichten kommen auch alle an und werden vom Skript eingelesen, das Bild aber nicht immer angezeigt. Mal funktioniert es hervorragend, dann nach einem Neustart nur ein kleines bischen bis hin zur totalen Arbeitsverweigerung.
Bin über jeden Tip dankbar.

So long und vielen Dank nochmal für den bisherigen Support und LCDHype, ohne hätte ich das mit den Displays gar nicht soweit hinbekommen.

Chaos42

P.S.: Sobald ich mehr als nur zufällige Anzeigen auf beiden Displays vorweisen kann, pack ich das gerne zu den Projekten.
biggrin.gif
#9
Hab noch ein wenig rumexperimentiert und folgender code funktioniert soweit:

CODE
#Header
%Common.SetPriority(1000)
%DefVar(CoverName,Local='')
%Assign(CoverName,%System.SendPacket(TCP,'192.168.178.54',4422,100,'13'))
%System.Execute('C:\Program Files\IrfanView\i_view32.exe', 'C:\Program Files\XBMC\web\thumb.jpg /silent /resize=(240,240) /convert=C:\Program Files\XBMC\web\thumb.bmp', 1000)
%Graph.LoadBitmap('C:\Program Files\XBMC\web\thumb.bmp',0,0,0,0,240,240,0,NONE)
%DefVar(Info,Local='-1')

%If(%String.Pos('DefaultAlbumCover.png',%CoverName()) > 0)Then {

%CleanUp.ClearVRAM()

%Graph.LoadBitmap('C:\Program Files\XBMC\web\noalbumart.bmp',0,0,0,0,240,240,0,NONE)

}

#EndHeader

#TextMode
#EndTextMode

%#GfxMode


%If(%Message.Count() > 0) Then { %Assign(Info,%Message.Get()) }

%If(%Info() = 10) Then {
%Assign(Info,'-1')
%Common.ChangeScreen(100, 0)
}
 
%If(%Info() = 6)Then{
 %Common.ChangeScreen(100, 1)
}  

#EndGfxMode


Hab festgestellt das es besser funktioniert wenn die BMP im header geladen wird.
Daher lade ich jetzt einfach bei dem entsprechenden Event das Skript(Skriptbereich?) neu. Leider hab ich keine Ahnung welche Methode die bessere und ressourcen schonendere ist. Someone? Auf jeden Fall läufts.
biggrin.gif

Gruß,
Chaos42

EDIT: Leider verursacht die IF Abfrage bzw. der Aufruf %System.SendPacket(TCP,'192.168.178.54',4422,100,'13') im Header eine Endlosschleife. Wenn ich den Code rausnehme funktionierts. Weiß jemand woran das liegen könnte?
#10
wenn er hängt, kommt er dann nach einer zeit zurück? dann ist es der tcp timeout. er kann dann wohl keine verbindung aufbauen.

ich hab auch grad gesehen das die timeout angabe beim tcp verbindungsaufbau nicht beachtet wird... du hast 100 angeben, er wartet aber intern um einiges länger. ich hab das gleich mal behoben, wird also in der nächsten version behoben sein.
Current stable version of LCDHype: 0.7.6
New plugin: Notepad++ Bookmark Manager
New music: Nordwise - Empire transition
#11
Klingt prima, werde die neue Version dann gleich mal ausprobieren.
Zur Zeit habe ich ab und zu eine Fehlermeldung, dass eine Thread nicht beendet werden kann und dann hängt LCDhype und komm nciht wieder zurück. Ich werde das nächstemal die genau Fehlermeldung hier posten, habs jetzt nicht genau im Kopf. Im Moment hängt sich nach einer gewissen Zeit auch meine JavaServer auf, was durchaus auch an dem TCP Timeout hängen könnte
, da hier wahrscheinlich sich nach einer gewissen Zeit zuviele Threads ansammeln. Wie gesagt werde das mit der neuen Version testen und gebe dann Rückmeldung.

Vielen Dank für deine Mühe! Donation ist unterwegs wink.gif
Ohne LCDHype wäre ich nie soweit gekommen!!!

Beste Grüße,
Chaos42
#12
hier haste die exe mit dem timeout fix.


Attached Files
.zip   lcdhype_timeout_fix.zip (Size: 824,14 KB / Downloads: 160)
Current stable version of LCDHype: 0.7.6
New plugin: Notepad++ Bookmark Manager
New music: Nordwise - Empire transition
#13
Danke! Ich werde es gleich mal probiern, kann aber etwas dauern bis ich feedback geben kann, da ich die nächsten paar Tage unterwegs bin und kein Zugriff auf meinen HTPC habe.
Dickes Lob an ViRuSTriNiTy!
Gruß,
Chaos42
#14
UPDATE:
Das ganze läuft soweit, Stabilität und Funktionsumfang entsprechen allerdings noch dem eines Prototypen. Das eine Display (DD Touch LCD) zeigt das Albumcover und hat auch eine rudimentäre Touchsteuerung (Play, Pause, Stop, Next, Prev, Mute)
Das Futaba zeigt Infos zum gerade abgespielten Song bzw. die Uhrzeit falls nichts läuft, sowie das aktuelle Songrating. Zudem zeigt es den aktuell ausgewählten Navigationseintrag, so dass auch eine Navigation ohne Monitor/Fernseher möglich ist.
Bin jetzt erstmal ne Woch weg, werde es aber dann im Projekte-Forum veröffentlichen.

Gruß,
Chaos42
#15
Wann publizierst du der Skript?


Forum Jump:


Users browsing this thread: 1 Guest(s)