|
|
@ -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++) { |
|
|
|