--- /dev/null
+/* $Id: ledframing.c,v 1.1 2010/07/10 09:28:52 simimeie Exp $
+ * Functions for led "animations"
+ */
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <string.h>
+#include "ledframing.h"
+#include "ledpwm.h"
+#include "console.h"
+
+static uint8_t framesused;
+static uint8_t currentframe;
+static struct frame framebuffer[MAX_FRAMES];
+
+void ledframing_init() {
+ framesused = currentframe = 0;
+}
+
+uint8_t addframe_frame(struct frame fr) {
+ if ((framesused + 1) >= MAX_FRAMES) { /* Out of memory */
+ return 0;
+ }
+ if (fr.action > MAX_ACTION) { /* Invalid / unknown action */
+ return 0;
+ }
+
+ framebuffer[framesused] = fr;
+ framesused++;
+
+ return 1;
+}
+
+uint8_t addframe_fade(uint16_t duration, uint8_t red, uint8_t green, uint8_t blue) {
+ if ((framesused + 1) >= MAX_FRAMES) { /* Out of memory */
+ return 0;
+ }
+
+ framebuffer[framesused].action = ACTION_FADE;
+ framebuffer[framesused].duration = duration;
+ framebuffer[framesused].rgb.re = red;
+ framebuffer[framesused].rgb.gr = green;
+ framebuffer[framesused].rgb.bl = blue;
+ framesused++;
+
+ return 1;
+}
+
+uint8_t addframe_strobe(uint16_t duration, uint16_t onticks, uint16_t offticks) {
+ if ((framesused + 1) >= MAX_FRAMES) { /* Out of memory */
+ return 0;
+ }
+
+ framebuffer[framesused].action = ACTION_STROBE;
+ framebuffer[framesused].duration = duration;
+ framebuffer[framesused].strobe.onticks = onticks;
+ framebuffer[framesused].strobe.offticks = offticks;
+ framesused++;
+
+ return 1;
+}
+
+struct frame * getnextframe(void) {
+ if (currentframe < framesused) {
+ currentframe++;
+ return &framebuffer[currentframe - 1];
+ }
+ /* No frames left */
+ return NULL;
+}
+
+void resetframes() {
+ framesused = currentframe = 0;
+}