X-Git-Url: http://git.rrze.uni-erlangen.de/gitweb/?p=moodlight.git;a=blobdiff_plain;f=ledframing.c;fp=ledframing.c;h=132c74e60aae7dcceac3a450d0eec4379d01b6af;hp=0000000000000000000000000000000000000000;hb=9d076ea0c15fc4f9c3c8f67415040545be1bf0c6;hpb=c7c49995443544bf5eaf10ec2890923bad939a6f diff --git a/ledframing.c b/ledframing.c new file mode 100644 index 0000000..132c74e --- /dev/null +++ b/ledframing.c @@ -0,0 +1,74 @@ +/* $Id: ledframing.c,v 1.1 2010/07/10 09:28:52 simimeie Exp $ + * Functions for led "animations" + */ + +#include +#include +#include +#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; +}