Browse Source

color helper functions

master
Olaf Rempel 8 years ago
parent
commit
0d9b9ba985
1 changed files with 101 additions and 61 deletions
  1. +101
    -61
      main.c

+ 101
- 61
main.c View File

@@ -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<<value) & mask) || value == old_value);

return value;
}

uint16_t color_ramp(uint16_t value, uint8_t *color)
{
uint8_t col1 = (value & 0xFF);
uint8_t col2 = 0xFF - col1;

switch (value >> 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++) {


Loading…
Cancel
Save