diff --git a/main.c b/main.c index 4aae709..714c26e 100644 --- a/main.c +++ b/main.c @@ -41,6 +41,102 @@ * PD3 -> /LED */ +uint8_t sequence_chase(uint8_t old_value, uint8_t *dir, uint16_t mask) +{ + uint8_t value = old_value; + + do { + value = (*dir) ? value +1 : value -1; + value &= 0x0F; + + if (value == 0x00 || value == 0x0F) { + *dir = (value == 0x00); + } + + } while (!((1<> 8) { + default: + value = 0x0000; + /* no break */ + + case 0: /* red: on, green: ramp up, blue: off */ + color[0] = 0xFF; + color[1] = col1; + color[2] = 0x00; + break; + + case 1: /* red: ramp down, green: on, blue:off */ + color[0] = col2; + color[1] = 0xFF; + color[2] = 0x00; + break; + + case 2: /* red: off, green: on, blue: ramp up */ + color[0] = 0x00; + color[1] = 0xFF; + color[2] = col1; + break; + + case 3: /* red: off, green: ramp down: blue: on */ + color[0] = 0x00; + color[1] = col2; + color[2] = 0xFF; + break; + + case 4: /* red: ramp up, green: off, blue: on */ + color[0] = col1; + color[1] = 0x00; + color[2] = 0xFF; + break; + + case 5: /* red: on, green: off, blue: ramp down */ + color[0] = 0xFF; + color[1] = 0x00; + color[2] = col2; + break; + } + + return value; +} + +void color_add(uint8_t *color1, uint8_t *color2, uint8_t *output) +{ + uint8_t i; + for (i = 0; i < 3; i++) { + uint16_t tmp = color1[i] + color2[i]; + output[i] = (tmp & 0xFF00) ? 0xFF : tmp; + } +} + +void color_sub(uint8_t *color1, uint8_t *color2, uint8_t *output) +{ + uint8_t i; + for (i = 0; i < 3; i++) { + uint16_t tmp = color1[i] - color2[i]; + output[i] = (tmp & 0xFF00) ? 0x00 : tmp; + } +} + +void color_div(uint8_t *color, uint8_t div, uint8_t *output) +{ + uint8_t i; + for (i = 0; i < 3; i++) { + output[i] = color[i] / div; + if ((output[i] == 0) && (color[i] != 0)) { + output[i] = 0x01; + } + } +} + int main(void) __attribute__ ((noreturn)); int main(void) { @@ -64,76 +160,20 @@ int main(void) while (1) { mpm_check_transfer(); -#if 0 /* wait for complete update */ rgb_update(COLOR_MASK, 1); -// _delay_ms(100); + _delay_ms(1); step++; if (step == 16) { step = 0; - - if (xdir) { - x++; - if (x == 0x05) - x = 0x08; - else if (x == 0x0C) - xdir = 0; - - } else { - x--; - if (x == 0x00) - xdir = 1; - else if (x == 0x07) - x = 0x04; - } + x = sequence_chase(x, &xdir, 0x1F1F); } - uint8_t color[3]; - - ramp++; - switch (ramp >> 8) { - case 6: - ramp = 0x0000; - /* no break */ - - case 0: /* red: on, green: ramp up, blue: off */ - color[0] = 0xFF; - color[1] = ramp & 0xFF; - color[2] = 0x00; - break; - - case 1: /* red: ramp down, green: on, blue:off */ - color[0] = 0xFF - (ramp & 0xFF); - color[1] = 0xFF; - color[2] = 0x00; - break; - - case 2: /* red: off, green: on, blue: ramp up */ - color[0] = 0x00; - color[1] = 0xFF; - color[2] = (ramp & 0xFF); - break; - - case 3: /* red: off, green: ramp down: blue: on */ - color[0] = 0x00; - color[1] = 0xFF - (ramp & 0xFF); - color[2] = 0xFF; - break; - - case 4: /* red: ramp up, green: off, blue: on */ - color[0] = (ramp & 0xFF); - color[1] = 0x00; - color[2] = 0xFF; - break; - - case 5: /* red: on, green: off, blue: ramp down */ - color[0] = 0xFF; - color[1] = 0x00; - color[2] = 0xFF - (ramp & 0xFF); - break; - } +#if 1 + uint8_t color[3] = { 0, 0, 0 }; + ramp = color_ramp(ramp +1, color); uint8_t i, j; for (i = 0; i < 16; i++) {