Motivation
Der im Jahr 2001 gebaute Home Cinema PC nach der C'T Vision und Sound Plattform war mittlerweile doch arg in die Jahre gekommen. Etwas Neues mußte her. Schon länger hatte ich den XC-Cube von AOpen im Auge, weil das Design - wie ich finde - einfach unschlagbar ist.
Weil nun aber das Teil mit der Software die mitgeliefert wird nicht so recht will, machte ich mich gleich daran, das Ganze nochmal zu über arbeiten. Die Folgenden Abschnitte und Seiten liefern einen Überblick über alles mehr oder weniger wissenswerte.
Komponenten
- CPU
- Celeron 2.4 GHz
- Graphik
- Um in der Genuss eines TV-Outs zu kommen, setze ich eine ATI Radeon 9200 ein. Damit steht ein guten TV-Out zur Verfügung (ich betreibe den Cube nur am TV). Das Bild kommt auch schon beim Booten und nicht erst wenn ein spezieller Treiber geladen ist. Es müßte daher eigentlich auch mit der InstantOn Software funktionieren, das habe ich aber noch nicht getestet.
Dokumentation
Besonderes Interesse weckt natürlich das Front-Panel, welches mit dem PDF von AOpen (zu finden hier oder hier) auch einigermassen dokumentiert ist. Ich hab mit Girder inbesondere den Musik-Betrieb mit WinAmp komplett neu gebaut und dabei einiges aus dem Display rausgeholt.
MP3s mit Girder & WinAmp auf dem Cube
Da Musik oder genauer MP3 oder CD eigentlich das einzige ist, was prinzipiell auch ohne Display (TV oder Monitor) geht, hab ich mich daran gemacht das Ganze mit Girder zu bauen. Was heraus gekommen ist kann sich - denke ich - sehen lassen.
Funktionen
- Coole Display Effekte: Status wird mit Symbolen angezeigt.
- Temporäre Anzeige des Titels nach dem Wechsel.
- Track und Zeit Anzeige wärend des Abspielens.
- Scrollende Anzeige bei überlangen Titeln
- Menü mit Playlisten-Katalog.
- Kurzwahl mit Zifferntasten im Menü.
- Blättern im Menü
- Support der Remote-Control und natürlich auch der Tasten am Frontpanel.
- Neu: Favoriten-Verwaltung, die meist gewählten Playlists schnell auswählbar.
- Neu: Alle Tracks sind direkt mit den Ziffern-Tasten anwählbar
Display
Beschreibung
Die Bedienung mit der Fernbedienung ist intuitiv. Nach dem Start wird der Musik-Betrieb mit einem Drücken der
CD/MP3 Taste oder dem Einlegen einer Musik-CD gestartet. Ein erneutes Drücken der Taste geht wieder in den PC-Modus zurück.
Alle Tasten zum Abspielen / Stoppen usw. funktionieren wie erwartet. Das Menü wird durch die Menütaste der Fernbedienung
aufgerufen. Das Display zeigt nun eine Liste von Playlists mit einem dreistelligen Code zu Beginn an.
Diese Liste wird einfach aus einem Textfile geladen, was folgenden Aufbau hat:
001|Face Value|C:\playlist\InTheAitTonight.m3u 002|Genesis|C:\playlist\Genesis.m3u
Das Textfile muss im Girder-Verzeichnis abgelegt sein.
Jetzt kann man mit den Pfeiltasten nach oben und unten blättern und mit Return / Auswahl bestätigen und schon wird die Playliste abgespielt. Alternativ kann man den dreistelligen Code einfach über die Zifferntasten eingeben und mit Auswahl bestätigen. Nochmal auf Menü Drücken geht wieder in den Abspielmodus zurück.
Neu: Die Favoriten-Funktion wird mit der MEM Taste der Fernbedienung aufgerufen. Danach kann ebenfalls mit den Pfeiltasten geblättert werden und mit Return wird die Playlist gewählt. Die Favoriten werden bei jeder Auswahl einer Playliste aktualisiert, so dass immer die meistgewählten zuerst erscheinen.
Ebenfalls neu: Repeat und Shuffle (Scan-Taste) werden am Display auch angezeigt mir den passenden Symbolen, weiterhin kann jeder Track in der Playlist direkt mit den Ziffertasten angesprungen werden.
Damit kann man die wichtigsten Funktionen bereits nutzen, ohne einen Monitor oder das TV einschalten zu müssen.
Girder Stuff
Ein paar Funktionen in Girder mit LUA und dem Generic Serial Plugin machen das Ansteuern des Displays zum Kinderspiel. Weiterhin benutze ich das DVDSpy Plugin, um an die Status-Informationen zu kommen und die AlarmTimer muss ebenfalls aktiv sein. Ah ja ich verwende Girder 3.2.9 (die letzte freie Version). Ein paar Funktionen zum Display und auch das komplette GML-File findet ihr weiter unten.
Zunächst ein paar allgemeine LUA Funktionen ..
function displayRaw( data )
SERIAL_SendData( "XCCubeEA65", data )
local t = GetTickCount()
repeat
until GetTickCount() > t + 20
end
function displayAsc( data )
if( strlen( data ) > 9 ) then
data = strsub( data, 1,9 )
end
displayRaw( "/a0/00/80/8" .. strchar( 48 + strlen( data ) ) .. data )
end
function setSymbol( sym )
displayRaw( "/a0/04/04/81" .. strchar( sym ) )
end
function resetSymbol( sym )
displayRaw( "/a0/04/04/81" .. strchar( sym + 128 ) )
end
function clearAllSymbols( )
displayRaw("/a0/04/04/80" )
resetSymbol( 27 )
end
symOne = 18
symRepeat = 19
symSleep = 21
symTimer = 20
symTuned = 22
symProg = 23
symChap = 24
symTrack = 25
symTitle = 26
symDigital = 27
symAll = 98
symColon1 = 100 -- doppelpunkt ganz rechts
symColon2 = 102 -- doppelpunkt mitte
symExtraPoint1 = 103 -- extra Punkt in der Mitte pos 4
symExtraPoint1 = 105 -- extra Punkt in der Mitte pos 2
--
-- 122 - 115 sind die Dezimalpunkte von links nach rechts
function setNative( section, data, sec2, dat2 )
displayRaw( "/a0/04/00/82" .. strchar( section + 128 ) .. strchar( data ) )
if( sec2 ~= nil ) then
displayRaw( "/a0/04/00/82" .. strchar( sec2 + 128 ) .. strchar( dat2 ) )
end
end
function resetNative( section, data, sec2, dat2 )
displayRaw( "/a0/04/05/82" .. strchar( section + 128 ) .. strchar( data ) )
if( sec2 ~= nil ) then
displayRaw( "/a0/04/05/82" .. strchar( sec2 + 128 ) .. strchar( dat2 ) )
end
end
--
-- mit setNative / resetNative lassen sich alle Segmente einzeln ansteuern
-- Codes für die Zeichen ausserhalb der ASCII Matrix
-- setNative( 11, 1 ) -> dolby digtal
-- setNative( 11, 2 ) -> dts
-- 11,3 -> pro logic
-- 11,4 -> II ( pro logic II)
-- 11,5 -> red microphone
-- 11,6 -> red DVD sign
-- 11,7 -> red V
-- 11,8 -> red CD (together with 11,7 -> VCD)
-- 11,9 -> red MP3
-- 11,10 -> Play mark
-- 11,11 -> Pause mark
-- 11,12 -> Intro symbol
-- 11,13 -> red lock
--
function collectDigits( digit )
if( digitCount == nil ) then
digitCount = 1
digits = digit
else
if( digitCount < 3 ) then
digits = digits .. digit
digitCount = digitCount + 1
end
end
end
function displayStop ()
resetNative( 11,10,11,11 )
end
function displayPause()
resetNative( 11,10 )
setNative( 11, 11 )
end
function displayPlay()
resetNative( 11, 11 )
setNative( 11, 10 )
end
function displayClearNative()
displayRaw( "/a0/04/05/80" )
end
function setNativeSym( sym )
if( sym == symMp3 ) then
setNative( 11, 9 )
end
end
function resetNativeSym( sym )
if( sym == symMp3 ) then
resetNative( 11, 9 )
end
end
So wird das Display angesteuert:
local scroll = 0
if( Mode == 0 ) then -- normal mode show time
Input = WimampTrack .. " " .. gsub(WinampElapsed, ":", "" ) .. " "
setSymbol( symTrack )
setSymbol( 102 )
resetSymbol( symTitle )
end
if( Mode == 1 ) then -- temp mode temporary display
Input = Temp
scroll = 1
resetSymbol( symTrack )
resetSymbol( 102 )
setSymbol( symTitle )
end
if( Mode == 2 ) then -- menu mode
if( digitCount ~= nil and digitCount > 0 ) then
Input = "SEL " .. digits .. strrep(" ", 5 - digitCount )
else
Input = menuItem[menuIndex] .. " " .. title[ menuItem[menuIndex] ]
scroll = 1
end
end
if( Input ~= InputOld ) then -- input has changed
ScrollPos = 0
InputOld = Input
end
if( strlen( Input ) > 9 and scroll == 1 ) then
ScrollPos = ScrollPos + 1
else
ScrollPos = 0
end
if ( ScrollPos == strlen( Input ) ) then
ScrollPos = 1
end
Display = strsub( Input, ScrollPos, ScrollPos + 9 )
if ( strlen( Display ) < 9 ) then
Display = Display .. " " .. strsub(Input, 1, 9 - strlen( Display ))
end
displayAsc( Display )
Damit all diese Funktionen arbeiten muss das Generic Serial Plugin installiert sein. Ich hab folgende ini-Datei von BeatBox verwendet. Das Escaping mit "/" muss aktiviert sein und die Übersetzung von HEX->BIN deaktiviert. Bitte achtet darauf, dass beim Importierten der COM2 Port eingestellt wird.
[Device] UserName=XCCubeEA65 Description=Aopen XC Cube AV (EA65) by Beatb0x - Jul, 9th 2004 [Properties] BaudRate=6 Handshaking=0 ParityBits=0 WordSize=4 StopBits=0 EnableScript=0 EnableScriptVal= DisableScript=0 DisableScriptVal= [InputMessage] Timeout=10 TimeoutValid=0 Timeout2=1 Timeout2Valid=0 ShowEvents=0 TermVal=129 TermSize=1 TerminatorProcessing=0 PrefixProcessing=0 Length=5 Translate=1 Type=1 BufferLength=201 UseName=0 NoCharEvents=0 CharEventScript=0 CharEventScriptString= ModemEventScript=0 ModemEventScriptString= RawChar=1 SilentErrors=0 [OutputMessage] Timeout=10 TimeoutValid=0 Timeout2=1 Timeout2Valid=0 ShowEvents=0 TermVal=13 TermSize=1 TerminatorProcessing=0 PrefixProcessing=1 Length=1 Translate=0 Type=1 BufferLength=201 UseName=0 NoCharEvents=0 CharEventScript=0 CharEventScriptString= ModemEventScript=0 ModemEventScriptString= RawChar=0 SilentErrors=0
Weiterhin benutze ich noch das SendMessage-PlugIn sowie den AlarmTimer beide müssen aktiviert sein.
Girder GML-Datei
Hier findet ihr die komplette GML-Datei komplett fertig mit allen Codes für RC und Panel-Tasten.