... ist zwar schon 'nen biss'l her, aber mit dem folgenden Patch klappt die Umwandlung von UTF-8 nach ISO-8859-1. Als Problem bleibt nur noch die direkte Darstellung der Umlaute. Jedoch können die Umlaute nun wieder gewandelt werden (z.B. von "ä" nach "ae"), wenn die Option Umlaut=off im Plugin-Menü ausgewählt wurde. Getestet habe ich es mit der VDR-Version 1.6.0-1 unter Debian-ct-VDR.
Der Patch fügt in der activylcd.h nur die vdr/config.h ein und beinhaltet einen kleinen Workaround, da sonst das afp-tool nicht übersetzt werden kann. Weiterhin wird die APIVERSION durch die VDRVERSNUM ausgetauscht.
Die offenen Punkten kann jemand mit C++ Erfahrung sicherlich einfach lösen:
1.) Fehlermeldung beim kompilieren des AFP-Tools:
Mein Workaround in der activylcd.h ist folgender:
...
#ifdef PLUGIN_NAME_I18N
#include <vdr/config.h> // for VDRVERSNUM define only
#endif
...
Mit der passenden Änderung im Makefile, wird die vdr/config.h nur herangezogen, wenn das Plugin übersetzt wird. Wird das afp-tool zusammen mit der activylcd.c kompiliert, wird die inculde-Datei nicht herangezogen. Der Nachteil ist natürlich, dass bei der Verwendung des afp-tools die UTF-8 Konvertierung nicht geht.
Lasse ich die obigen ifdef...endif Anweisungen weg, erhalte ich zwar ein ordentliches Plugin aber folgende Fehlermeldung am Ende:
g++ -g -Wall -Woverloaded-virtual -Wno-parentheses -O2 -fPIC -c -D_GNU_SOURCE -DDEBUG -I/usr/include/vdr -I/usr/include/vdr/include afp-tool.c
g++ -g -Wall -Woverloaded-virtual -Wno-parentheses -O2 -fPIC -c -D_GNU_SOURCE -I/usr/include/vdr -I/usr/include/vdr/include activylcd.c
g++ -g -Wall -Woverloaded-virtual -Wno-parentheses -O2 -fPIC afp-tool.o activylcd.o -o afp-tool
activylcd.o: In function `activyLCD::FormatString(char*, char const*, int, bool, bool)':
/usr/src/vdr-plugin-alcd-1.4.1/activylcd.c:582: undefined reference to `cCharSetConv::Convert(char const*, char*, unsigned int)'
activylcd.o: In function `~activyLCD':
/usr/src/vdr-plugin-alcd-1.4.1/activylcd.c:136: undefined reference to `cCharSetConv::~cCharSetConv()'
/usr/src/vdr-plugin-alcd-1.4.1/activylcd.c:136: undefined reference to `cCharSetConv::~cCharSetConv()'
activylcd.o: In function `cCharSetConv::SystemCharacterTable()':
/usr/include/vdr/tools.h:148: undefined reference to `cCharSetConv::systemCharacterTable'
activylcd.o: In function `activyLCD':
/usr/src/vdr-plugin-alcd-1.4.1/activylcd.c:70: undefined reference to `cCharSetConv::cCharSetConv(char const*, char const*)'
activylcd.o: In function `cCharSetConv::SystemCharacterTable()':
/usr/include/vdr/tools.h:148: undefined reference to `cCharSetConv::systemCharacterTable'
activylcd.o: In function `activyLCD':
/usr/src/vdr-plugin-alcd-1.4.1/activylcd.c:70: undefined reference to `cCharSetConv::cCharSetConv(char const*, char const*)'
collect2: ld returned 1 exit status
make[1]: *** [afp-tool] Fehler 1
make[1]: Leaving directory `/usr/src/vdr-plugin-alcd-1.4.1'
make: *** [common-build-arch] Fehler 2
Display More
2. Darstellung der Umlaute:
Ich verwende eine Activy300. Die Umlaute sollen mit der folgenden case-Anweisung, in die für das Display benötigten, umgewandelt werden:
case 'ä': // ae
if ( fwRev == ACTIVY_3XX )
*out = '\x84';
else
*out = '\xE1';
break;
Laut DEBUG Ausgabe im Log, erfolgt die Wandlung korrekt:
In OsdCurr < 2 Kanäle> // <-in UTF
FormatString < 2 Kanäle> // <- gewandelt nach ISO-8859-1
FormatString Conv<ä-e4><á-e1> // <- Umwandlung durch case-Schleife "ä" -> "\xE1"
FormatString End< 2 Kanále> // <-soll \xE1 entsprechen
Out OsdCurr
Auf dem LCD erscheint aber leider nichts. Eine Kontrollausgabe mit printf zeigt, dass ich aber ein \xE1 für ein "ä" benötige.
/bin/stty 38400 < /dev/ttyS0
printf "\x9A\x02ae=\xE1 \x00" > /dev/ttyS0
zeigt an "ae=ä"
Jemand eine Idee?
Grüße
mpenno