Einer geht noch:
hier ein Patch (naja, eigentlich ein re-write) von plugin.c zur Unterstützung von bis zu vier unterschiedlichen Display. Unterschiedlich soll heißen, dass ein Displayname aus der graphlcd.conf jeweils nur einmal vorkommen darf. Dazu hab ich die Syntax der Aufrufparameter etwas erweitert:
-d, --display=DISP[,DISP]... use display DISP for output or if DISP=none use no display on startup
-s, --skin=SKIN[,SKIN]... use skin SKIN (default is "default")
Beispiel: "serdisp" Display mit Skin "testskin", "image" Display mit Skin "default" und "ax206dpf" Display mit Skin "touchcol" wäre:
-d serdisp,image,ax206dpf -s testskin,,touchcol
oder
--display=serdisp,image,ax206dpf --skin=testskin,,touchcol
Außerdem kann man auch "none" als Display angeben, dann kann der Anschluss später über CONNECT gemacht werden.
Über "CONNECT displayname [skin]" kann man weitere Display nachträglich anhängen (Achtung: wenn skin nicht angegeben ist wird "default" verwendet!), über "DISCONN displayname" ein Display entfernen oder über "DISCONN ALL" alle Displays auf einmal.
Bis alle Displays was anzeigen kann etwas dauern, da beim Start ein Display nach dem anderen connected wird. Geht leider nicht anders, da der Skin-Parser nicht multi-thread fähig ist (ne Menge static Vars).
EDIT: Was noch nicht konsequent umgesetzt ist, ist die Geschichte mit den externen Variablen (svdrp Befehle GET / SETEXP / UNSET / GET). Da die Vars im Display-Objekt gespeichert werden, sind die weg wenn das Display disconnected wird und neue Connects erhalten früher gesetzte Vars nicht. Die sauberste Lösung wäre meiner Meinung nach, die Verwaltung vom cExtData aus cGraphLCDDisplay in ein eigenes Singleton-Objekt zu verlagern. This is left as an exercise to the reader .
(Heißt das überhaupt "Singleton" in C++? Muss immer mental unter lautem Fluchen und unter absingen obszöner Lieder von Java auf C++ umschalten...)
Gruß
superelchi