Difference between revisions of "U23 2005/Scripteditor"

From C4 Wiki
Jump to: navigation, search
(Funktionen)
(Quellcode)
Line 1: Line 1:
== Beschreibung ==
 
  
Ein Editor, mit dem man sich ganz einfach Scripts für das Fnordlicht zusammenklicken kann. Dabei kann man für jeden
 
Farbkanal getrennt so genannte ''Frames'' einfügen. In einem Frame wird gespeichert, wie lange eine bestimmte Helligkeit
 
gehalten werden soll, ob es einen Fade zu dieser Helligkeit geben soll und wie lange dieser Fade dauern soll.
 
Diese drei Farbkanäle kann man dann in einem XML-Dateiformat abspeichern, damit man sie auch später noch bearbeiten kann.
 
 
Aus dem Programm heraus können dann die Assembler-Makros generiert werden, die (mit der modifizierten Makefile) ganz einfach
 
in die Fnordlicht-Firmware einkompiliert werden können.
 
 
== Funktionen ==
 
 
* Die Scriptdateien per Parameter beim Kompilieren nachladen wie z.B. '''make install-fnordlicht meinTollesScript.inc'''
 
* Speichern der Script-Entwürfe in einem eigenen Dateiformat (z.B. '''.fs''' = fnordlicht Script)
 
* Scroll Leiste für den Simulator
 
* Durchsichtige (bzw. hintergrung farbende) Blöcke in der GUI wenn Brightness = 0 ..
 
* Zeitleise(in sec) in der GUI
 
* ...
 
 
== Arbeitsschritte ==
 
 
* Doku zu den [[U23 2005/Firmware Makros|Firmware Makros]] die für die Scripts benötigt werden: ''Diozaka, manuke.'' (fertig)
 
* GUI entwerfen. (fertig, siehe unten)
 
* GUI schreiben: ''Blase16''(fast fertig)
 
* Linker: ''Blase16'' (fertig)
 
* Macro-Parser: Script-Entwurf -> Assembler-Macros. ''Diozaka, manuke.'' (fertig)
 
* Dateiformat für Script-Entwürfe ('''.fs''') definieren. ''Diozaka, Blase16'' (fertig)
 
* XML-Parser: ''tux.ICBlood'' (fertig)
 
* Frame-Klasse. ''Blase16, Diozaka & manuke'' (fertig)
 
* DelphiGui: ''jabberwox'' <- unnötig geworden
 
* TextClient: ''mene''
 
* STMod (SimpleTextModus), ein Text Client: tux.ICBlood - wenn du willst können wir auch zusammen arbeiten, mene
 
* Makefile anpassen. Macht: ''Pylon''
 
* Fnordlicht-Simulator-Klasse. ''manuke'' (fertig)
 
 
''Interfaces sind unten...''
 
 
== Interfaces ==
 
* LinkerI
 
<pre>
 
interface LinkerI {
 
/*
 
* Globale Variable:
 
* ArrayList[] Framememory Als ArrayList 0=Red, 1=Green, 2=Blue
 
*
 
*/
 
 
        // Erstellt ein Frame und schreibt es in ein Array
 
public boolean createFrame(char c, int fade, int duration, int brightness);
 
 
// Ruft den XMLParser mit dem Frame-Array auf. (Frame[] Framememory => XML)
 
        public boolean parseToXML(String FileName);
 
 
// Ruft den XMLParser mit dem Frame-Array auf. (XML => Frame[] Framememory)
 
        public ArrayList[] parseFromXML(String FileName);
 
 
// Ruft den MacroParser mit dem Frame-Array auf. (Frame[] Framememory => Macro)
 
        public boolean parseToMacro(String FileName);
 
 
// Liest die globale Variable framememory aus.
 
        public ArrayList[] getFrameMemory();
 
 
        // Ruft parseFromXML und getFrameMemory auf.
 
public ArrayList[] loadFrames();
 
 
public boolean deleteLastFrame(int colour, int howOften);
 
 
}
 
</pre>
 
 
* MacroParserI
 
<pre>
 
// Simpel, aber gut ;)
 
interface MacroParserI{
 
        /*
 
        * public MacroParserI(ArrayList[] _channels, String _filename);
 
        *
 
        */
 
 
        public boolean parse();
 
}
 
</pre>
 
 
* XMLParserI
 
<pre>
 
interface XMLParserI{
 
        /*
 
        *
 
        * Ist das so in Ordnung? Ich habe noch nie mit Interfaces gearbeitet?
 
        * -> Eine kleine Sache gibts da.
 
        *
 
        */
 
 
        // Erwartet Frames und Dateiname
 
        public void writeXML(ArrayList[] channels, String filename);
 
 
        // Liefert Frames (Im Array verpackt - [0] = rot, [1] = grün, [2] = blau) und erwartet den Dateinamen
 
        // public ArrayList readXML(String filename);
 
 
        // CHANGED: Die Funktion muss ein Array (mit 3 Elementen: rot, grün, blau) aus ArrayLists zurückgeben,
 
        // dann enthält jedes Element eben eine ArrayList gefüllt mit Frames.
 
        public ArrayList[] readXML(String filename);
 
 
        // Liefert boolean ob writeXML bzw readXML erfolgreich war
 
        public boolean success();
 
}
 
</pre>
 
 
* FrameI
 
<pre>
 
interface FrameI{
 
        /*
 
        * public FrameI(char _color,
 
        *        int _fade,
 
        *        int _duration,
 
        *        int _brightness);
 
        *
 
        */
 
 
        public boolean setColor(char _color); // 'r', 'g' oder 'b'
 
        public boolean setFade(int _fade);
 
        public boolean setDuration(int _duration);
 
        public boolean setBrightness(int _brightness);
 
 
        public char getColor();
 
        public int getFade();
 
        public int getDuration();
 
        public int getBrightness();
 
 
        // Gibt true zurück, wenn das Frame erfolgreich erstellt werden konnte
 
        public boolean success();
 
}
 
</pre>
 
 
== Quellcode ==
 
Hier kommt der Quellcode von den einzelnen Modulen hin.
 
 
'''ACHTUNG:''' Jeder kann hier im Wiki die Links verändern, also guckt euch
 
am besten den Code nochmal an, bevor ihr ihn ausführt oder überprüft ob die Signatur stimmt.
 
 
* [http://dbz.gmxhome.de/fnordlicht/Frame.java Frame.java] ([http://dbz.gmxhome.de/fnordlicht/Frame.java.asc Signatur])
 
* [http://dbz.gmxhome.de/fnordlicht/MacroParser.java MacroParser.java] ([http://dbz.gmxhome.de/fnordlicht/MacroParser.java.asc Signatur])
 
* [http://manuke.gmxhome.de/scripteditor/Simulator.java Simulator.java] (Signatur folgt)
 
* [http://manuke.gmxhome.de/scripteditor/SimWindow.java SimWindow.java] (Signatur folgt)
 
 
 
* '''[http://files.blase16.de/src/ Paket mit allen Klassen]''' (inkl. GUI)
 
 
 
* [http://www.mene.biz/CMDEditor.java] (Text-Interface) -- mene
 
 
 
=== XMLParser ===
 
Der XMLParser ist soweit ferig. Ich bezeichne die Klasse einmal vorsichtig als 0.1beta, da es noch einige Einschränkungen gibt. Zur Zeit müssen die Frame Attribute noch in der Reihenfolge fade, duration, brightness sein. (Sonst werden die Werte vertauscht) Ausserdem habe ich noch keine Fehlerüberprüfung eingebaut. Das XML-Dokument sollte also fehlerfrei sein.
 
 
Die Klasse ist noch nicht mit der GUI bzw. dem Linker getestet worden. Stattdessen liegt in dem Verzeichniss eine kleine java-Datei, die einfach ein xml einliest und mit den ermittelten Werten ein neues erstellt.
 
 
Ich werde mich wahrscheinlich am Montag mit blase16 treffen, und Linker/GUI/Parser aufeinander abstimmen.
 
 
* [http://files.gultsch.de/scripteditor/XMLParser.java XMLParser.java]
 
* [http://files.gultsch.de/scripteditor/XMLHandler.java XMLHandler.java] Wird für die Komunikation mit SAX gebraucht.
 
* [http://files.gultsch.de/scripteditor/just4testing.java just4testing.java] Nur zum testen ;-)
 
 
''--- tux.ICBlood''
 
 
== GUI ==
 
Advanced Mode:
 
 
http://files.blase16.de/GUI.jpg
 
 
Der Simple Mode wird so wie er beschrieben wurde erstmal nicht umgesetzt.
 
Allerdings wird durch die Implementation des Simulators eine gute Mischung aus beidem erzeugt, so dass
 
man sich das Script als Vorschau ansehen kann.
 
 
== Koordination ==
 
 
Advanced Mode:
 
 
* Klasse GUI übergibt die Daten bei jedem Klick auf Add an die => Klasse Linker.
 
* Klasse Linker erstellt für die Daten ein einzelnes Objekt von der Klasse Frame und schiebt es in ein Array. Die Klasse Frame ist nur  Daten Container.(Siehe Interface oben)
 
 
Menue:
 
* GUI ruft über save die Methode parseToXML in der Klasse Linker auf diese wiederum den XML-Parser.
 
* GUI ruft oeffnen die Methode loadFrame in der Klasse Linker auf. Diese wiederum die Methode parseFromXML und getFrameMemory.
 
* GUI ruft ueber exportieren die Methode parseToMacro in der Klasse Linker auf diese wiederum den Macro-Parser.
 
 
TextClient der das selbe macht wie die Gui
 
 
== Dateiformat, in XML ==
 
 
Hier unser Dateiformat für die Scripts.
 
 
=== Elemente ===
 
 
* '''<fnordlicht>'''
 
: ''Attribute:'' (keine)
 
: ''Erläuterung:'' Ist das Wurzelement.
 
 
* '''<channel>'''
 
: ''Attribute:'' color
 
:: color: Gibt den Farbkanal an, kann entweder ''red'', ''green'' oder ''blue'' sein.
 
: ''Erläuterung:'' Muss (Kann nur?) insgesamt dreimal vorkommen, enthält die einzelnen Frames für einen Farbkanal.
 
 
*'''<frame />'''
 
: ''Attribute:'' fade, duration, brightness
 
:: fade: Die Länge des Fades (muss kleiner oder gleich ''duration'' sein, 0 bedeuted kein Fade, Angabe in Sekunden).
 
:: duration: Die Gesamtdauer des Frames (in Sekunden).
 
:: brightness: Die Helligkeit der Farbe (0-255).
 
: ''Erläuterung:'' Repräsentiert eine Farb-Aktion.
 
 
--Blase16 & Diozaka
 
 
=== DTD ===
 
 
Das hier müsste die passende DTD zur Beschreibung sein:
 
 
<pre>
 
<!ELEMENT fnordlicht    (channel+)>
 
<!ELEMENT channel      (frame+)>
 
<!ATTLIST channel      color  (red|green|blue)+      #REQUIRED>
 
<!ELEMENT frame        EMPTY>
 
<!ATTLIST frame        fade            CDATA  #REQUIRED
 
                        duration        CDATA  #REQUIRED
 
                        brightness      CDATA  #REQUIRED>
 
</pre>
 
 
=== Beispiel ===
 
 
<?xml version="1.0" ?>
 
<fnordlicht>
 
<channel color="red">
 
<frame fade="20" duration="20" brightness="255" />
 
<frame fade="20" duration="20" brightness="0" />
 
</channel>
 
<channel color="green">
 
<frame fade="5"  duration="10" brightness="255" />
 
<frame fade="10" duration="10" brightness="0" />
 
<frame fade="5"  duration="10" brightness="255" />
 
<frame fade="10" duration="10" brightness="0" />
 
</channel>
 
<channel color="blue">
 
<frame fade="0"  duration="40" brightness="128"/>
 
</channel>
 
  </fnordlicht>
 
 
== Makefile ==
 
 
Diese drei Zeilen zum Makefile hinzufügen:
 
 
script-%:
 
        sed -i '$$D' fnordlicht.asm   
 
        echo ".include \"$@\"" | sed -e 's/script-//' >> fnordlicht.asm                               
 
 
Hierdurch wird die letzte Zeile in fnordlicht.asm (das static script) gelöscht und das Script eingefügt, das hinter script- angegeben wird.
 
 
== Known bugs ==
 
 
<strike>Es gibt nicht weiter bekannte Probleme mit dem schreiben von Dateien auf das Mac filesystem.</strike>  <-- Lag nicht am Mac filesystem war ein Fehler das beseitigt ist.
 

Revision as of 20:59, 24 November 2005