Hi Vic!
* Peter Franck vic@ccc.de wrote:
Ich habe folgendes statische Script geschrieben, womit ich den alternierenden Wechsel zwischen Türkis und Orange gemeint habe:
Ok, soweit klar, das Script ist auch das, was man intuitiv machen wuerd.
static_script_r: ; {{{ MACRO_FADE_CHANNEL ChannelB, 255, 255, 0 MACRO_FADE_CHANNEL ChannelG, 255, 255, 0 MACRO_WAIT (1<<ChannelB) MACRO_FADE_CHANNEL ChannelB, 0, 255, 0 MACRO_FADE_CHANNEL ChannelG, 0, 255, 0 MACRO_WAIT (1<<ChannelB)
; execution stops here:
MACRO_FADE_CHANNEL ChannelR, 255, 255, 0 MACRO_FADE_CHANNEL ChannelG, 200, 200, 0 MACRO_WAIT (1<<ChannelG) MACRO_FADE_CHANNEL ChannelR, 0, 255, 0 MACRO_FADE_CHANNEL ChannelG, 0, 200, 0 MACRO_WAIT (1<<ChannelG) MACRO_JUMP -13
; }}}
Nach der 6. Instruktion passiert nichts mehr. Warum?
Das hat mich jetzt auch grad ~30 Mins debugging gekostet, ist also nichttrivial :)
Also: Zunaechst mal wird pro Thread ein Flag gesetzt, wenn ein Farbkanal seine Zielhelligkeit erreicht hat. Wenn dieser Kanal das naechste mal die Instruktion WAIT ausfuehrt, wird gestestet, ob der bei WAIT uebergebene Farbkanal sein Ziel irgendwann mal erreicht hat. Das tut diese Instruktion, indem sie in den Flags fuer diesen Thread nachschaut, ob das Flag fuer diesen Farbkanal gesetzt ist, wenn ja, wird dieses Flag geloescht und es geht mit der Ausfuehrung weiter.
Soweit, so gut. Das Problem an deinem Script ist, dass du im ersten Teil lediglich testest, ob der Blaukanal sein Ziel erreicht hat. Damit wird das Flag fuer den Blaukanal geloescht, aber das fuer den Gruenkanal (der ja auch gefadet wird, und gleichzeitig sein Ziel erreicht hat), bleibt bestehen.
Das erste Stueckchen tut also. Anschliessend passiert folgendes: Rot und Gruen sollen hochfaden, anschliessend soll gewartet werden, bis der Gruenkanal fertig ist. Ist er nicht, aber das Flag von oben ist noch gesetzt. Also wird (im gleichen Atemzug noch) die Zielhelligkeit von Rot und vor allem Gruen wieder auf 0 gesetzt und wieder gewartet (was jetzt ja funktioniert, da die dritte WAIT-Instruktion natuerlich das Flag fuer Gruen geloescht hat). Dieses Flag wird aber nie wieder auftauchen, denn dein Script hat den Helligkeitswert nicht umgesetzt (bzw. auf 255 und dann _DIREKT_ wieder auf 0 gesetzt), also blockiert das Script an dieser Stelle.
So, nun gibts 3 moegliche Auswege:
1) Du wartest nicht nur auf einen der beiden Farbkanaele, sondern auf beide, damit auch beide Flags geloescht werden: MACRO_WAIT (1<<ChannelG) | (1<<ChannelB) 2) Du benutzt nur den Gruenkanal (der ja immer mitfadet) zu synchronisation. 3) Du ziehst dir die aktuelle devel-Version der Firmware aus dem subversion und benutzt die neue Instruktion MACRO_CLEAR, die explizit die Flags komplett resettet.
HTH, - fd0