polybassa/Wifly_Light — pull request #7 by tawarisch (2012-07-09 22:13:52+00:00)
Title: set_fade endlich fertig

WARNUNG zu erst: Ich habe deinen set_fade code gelöscht. Das wäre sonst zu unübersichtlich geworden. Probier meine Änderungen also erstmal auf einem anderen Branch aus.

So jetzt mal zur Erklärung:
Ich habe eine feste Schrittgröße von 1 Schritt. Und einen Timerzyklus von 1ms. Das bedeutet um von 0 auf 255 zu wechseln benötige ich mindestens 255ms. Das ist die erste Einschränkung.
Ich kann außerdem jeden Schritt um maximal 65536ms verzögern, daraus folgt das längste Fade kann maximal ca. 4,5h dauern.
Die Randbedingung hierfür ist aber auch, dass unser Prozessor innerhalb von 1ms alle Berechnungen durchführen kann ;-) Und ich bin mir nicht sicher ob er das schafft. Immerhin sind das momentan 96 Werte (32LEDs x 3 Farben) die er in jedem Zyklus prüfen muss, ob sie erhöht werden müssen oder nicht. Dazu kommt dann noch der Rest (Kommandosempfangen, auswerten und z.B. neues Fade berechnen).
Hier musst du einfachmal auf der echten Hardware schauen wies da läuft.
An der Performance kann man noch schrauben. 1. ist der Code noch nicht optimal, 2. könnte die Zykuszeit erhöht werden. Wobei sich dann die minimale und maximale Fadedauer verschiebt.
Angenommen wir tolerieren eine Mindestfadedauer von 1 Sekunde, dann könnten wir auf 4ms gehen. Je mehr Spielraum wir haben umso besser.
Extrem viel Zeit kostet uns die Variablilität, da wir quasi 96 Werte haben die sich völlig gegensätzlich bewegen können, müssen wir auch jeden dieser 96 Werte einzeln berechnen. Vielleicht fügen wir noch ein set_fade_fast oder set_fade_cluster hinzu. Wo wir vorraussetzen, dass alle LEDs im Fade den gleichen Farbwert haben und dementsprechen auch den gleichen step und Zyklus. Um RGB zu faden schickt man dann einfach 3 fades parallel. Momentan hantieren wir ja quasi mit 96 parallelen fades, 3 sollten wir dann locker im Griff haben ;-)

Damit der Code überhaupt auf dem PIC läuft, musst du meinen timer_interrupt aus x86_wrapper.c nachbauen. Du musst einfach deinen Timer auf 1ms stellen und wenn er aufwacht g_timer_signaled inkrementieren. Das ist so noch nicht fertig implementiert. Komischerweise funktioniert es trotzdem. Auch das usleep(1000) ist noch falsch das ist nämlich eine microsekunde und nicht milli ;-). Ich wollte aber erstmal einchecken bevor ich das noch ausbesser. Wie gesagt ich bin froh dass das erstmal läuft. Und hoffe die Performance ist nicht zu schlecht.

So ich mach mal jetzt noch mit dem timer weiter vielleicht folgt das nachher noch.