use bitmask for direction

This commit is contained in:
Olaf Rempel 2012-03-11 16:01:40 +01:00
parent 8d8a50a4f7
commit fa8bc109cd
3 changed files with 29 additions and 26 deletions

View File

@ -24,7 +24,6 @@
struct dm001data { struct dm001data {
uint8_t pos; uint8_t pos;
uint8_t dir;
uint16_t ramp; uint16_t ramp;
uint8_t decay[16][3]; uint8_t decay[16][3];
}; };
@ -36,7 +35,6 @@ struct dm002data {
struct dm003data { struct dm003data {
uint8_t step; uint8_t step;
uint8_t pos[3]; uint8_t pos[3];
uint8_t dir[3];
}; };
union demodata { union demodata {
@ -56,13 +54,14 @@ static uint16_t demomode001(void)
{ {
struct dm001data *dm = &demo.dm001; struct dm001data *dm = &demo.dm001;
dm->pos = sequence_chase(dm->pos, &dm->dir, nvram_data.channels); dm->pos = sequence_chase(dm->pos, nvram_data.channels);
dm->ramp = color_ramp(dm->ramp +8, chan_value[dm->pos]); uint8_t pos = dm->pos & POS_MASK;
color_div(chan_value[dm->pos], 4, dm->decay[dm->pos]); dm->ramp = color_ramp(dm->ramp +8, chan_value[pos]);
color_div(chan_value[pos], 4, dm->decay[pos]);
uint8_t chan; uint8_t chan;
for (chan = 0; chan < 16; chan++) { for (chan = 0; chan < 16; chan++) {
if (chan != dm->pos) { if (chan != pos) {
color_sub(chan_value[chan], dm->decay[chan], chan_value[chan]); color_sub(chan_value[chan], dm->decay[chan], chan_value[chan]);
} }
} }
@ -100,12 +99,12 @@ static uint16_t demomode003(void)
for (color = 0; color < 3; color++) { for (color = 0; color < 3; color++) {
if (dm->step == 0) { if (dm->step == 0) {
dm->pos[color] = sequence_chase(dm->pos[color], &dm->dir[color], nvram_data.channels); dm->pos[color] = sequence_chase(dm->pos[color], nvram_data.channels);
} }
uint8_t chan; uint8_t chan;
for (chan = 0; chan < 16; chan++) { for (chan = 0; chan < 16; chan++) {
if (chan == dm->pos[color]) { if (chan == (dm->pos[color] & POS_MASK)) {
chan_value[chan][color] = 0xFF; chan_value[chan][color] = 0xFF;
} else if (chan_value[chan][color] > 16) { } else if (chan_value[chan][color] > 16) {
chan_value[chan][color] -= 16; chan_value[chan][color] -= 16;
@ -134,7 +133,7 @@ void demomode_init(uint8_t mode)
case 0x01: case 0x01:
/* rgb chase */ /* rgb chase */
demo.dm001.dir = 1; demo.dm001.pos = DIR_UP | 0;
demomode_run = demomode001; demomode_run = demomode001;
break; break;
@ -145,12 +144,9 @@ void demomode_init(uint8_t mode)
case 0x03: case 0x03:
/* three color chaser */ /* three color chaser */
demo.dm003.pos[COLOR_RED] = 0; demo.dm003.pos[COLOR_RED] = DIR_UP | 0;
demo.dm003.pos[COLOR_GREEN] = 9; demo.dm003.pos[COLOR_GREEN] = DIR_UP | 9;
demo.dm003.pos[COLOR_BLUE] = 9; demo.dm003.pos[COLOR_BLUE] = DIR_DOWN | 9;
demo.dm003.dir[COLOR_RED] = 1;
demo.dm003.dir[COLOR_GREEN] = 1;
demo.dm003.dir[COLOR_BLUE] = 0;
demomode_run = demomode003; demomode_run = demomode003;
break; break;

View File

@ -22,21 +22,22 @@
#include <string.h> #include <string.h>
#include "rgb16mpm.h" #include "rgb16mpm.h"
uint8_t sequence_chase(uint8_t old_value, uint8_t *dir, uint16_t mask) uint8_t sequence_chase(uint8_t old_pos, uint16_t mask)
{ {
uint8_t value = old_value; uint8_t pos = (old_pos & POS_MASK);
uint8_t dir = (old_pos & DIR_MASK);
do { do {
value = (*dir) ? value +1 : value -1; pos = (dir == DIR_DOWN) ? pos -1 : pos +1;
value &= 0x0F; pos &= 0x0F;
if (value == 0x00 || value == 0x0F) { if (pos == 0x00 || pos == 0x0F) {
*dir = (value == 0x00); dir = (pos == 0x00) ? DIR_UP : DIR_DOWN;
} }
} while (!((1<<value) & mask) || value == old_value); } while (!((1<<pos) & mask) || pos == (old_pos & ~(DIR_MASK)));
return value; return dir | pos;
} }
uint16_t color_ramp(uint16_t value, uint8_t *color) uint16_t color_ramp(uint16_t value, uint8_t *color)

View File

@ -58,8 +58,14 @@ void demomode_init(uint8_t mode);
extern uint16_t (*demomode_run)(void); extern uint16_t (*demomode_run)(void);
/* demohelper.c funcs */ /* demohelper.c funcs */
uint8_t sequence_chase(uint8_t old_value, uint8_t *dir, uint16_t mask); uint8_t sequence_chase(uint8_t old_value, uint16_t mask);
uint16_t color_ramp(uint16_t value, uint8_t *color);
#define POS_MASK 0x7F
#define DIR_MASK 0x80
#define DIR_UP 0x80
#define DIR_DOWN 0x00
uint16_t color_ramp(uint16_t pos, uint8_t *color);
void color_add(uint8_t *color1, uint8_t *color2, uint8_t *output); void color_add(uint8_t *color1, uint8_t *color2, uint8_t *output);
void color_sub(uint8_t *color1, uint8_t *color2, uint8_t *output); void color_sub(uint8_t *color1, uint8_t *color2, uint8_t *output);
void color_div(uint8_t *color, uint8_t div, uint8_t *output); void color_div(uint8_t *color, uint8_t div, uint8_t *output);
@ -73,10 +79,10 @@ extern uint8_t chan_value[16][3];
/* rgbctrl.c funcs */ /* rgbctrl.c funcs */
void rgb_init(void); void rgb_init(void);
uint8_t rgb_update(uint8_t dirty_mask, uint8_t update_mode);
#define UPDATE_NONE 0x00 #define UPDATE_NONE 0x00
#define UPDATE_PARTIAL 0x01 #define UPDATE_PARTIAL 0x01
#define UPDATE_BLOCKING 0x02 #define UPDATE_BLOCKING 0x02
uint8_t rgb_update(uint8_t dirty_mask, uint8_t update_mode);
#endif /* _RGB16MPM_H_ */ #endif /* _RGB16MPM_H_ */