#include #include #include /* IMPORTANT NOTE: Your PWM generation should be based off COLOR_SPACE_MAX as all RGB values will range from 0 to COLOR_SPACE_MAX */ #define COLOR_SPACE_MAX 255 // Is the range of values the calculations will produce 0 to COLOR_SPACE MAX #define COLOR_SPACE_CONSTANT (COLOR_SPACE_MAX/6 + 1) /* Add additional global variable declarations. Remember to use volatile as needed */ int main(void) { // store the calculated values from H & S unsigned char calc_red = COLOR_SPACE_MAX; unsigned char calc_green = COLOR_SPACE_MAX; unsigned char calc_blue = COLOR_SPACE_MAX; /* code initialization */ sei(); for(;;) { // calculate color if ( saturation_value_y == 0 ) { calc_red = COLOR_SPACE_MAX; calc_green = COLOR_SPACE_MAX; calc_blue = COLOR_SPACE_MAX; } else { // itermediate values used in calculation unsigned char tmp, tmp_r, tmp_1, tmp_2, tmp_3; unsigned long tmp_adj; tmp = hue_value_x / COLOR_SPACE_CONSTANT; tmp_r = hue_value_x - (tmp* COLOR_SPACE_CONSTANT); tmp_1 = ( COLOR_SPACE_MAX * (COLOR_SPACE_MAX - (long)saturation_value_y ) ) / COLOR_SPACE_MAX; tmp_adj = (saturation_value_y * tmp_r) / COLOR_SPACE_CONSTANT; tmp_2 = ( COLOR_SPACE_MAX * (COLOR_SPACE_MAX - tmp_adj) ) / COLOR_SPACE_MAX; tmp_adj = (saturation_value_y * ( COLOR_SPACE_CONSTANT - tmp_r)) / COLOR_SPACE_CONSTANT; tmp_3 = ( COLOR_SPACE_MAX * (COLOR_SPACE_MAX - tmp_adj) ) / COLOR_SPACE_MAX; if ( tmp == 0 ) { calc_red = COLOR_SPACE_MAX ; calc_green = tmp_3 ; calc_blue = tmp_1; } else if ( tmp == 1 ) { calc_red = tmp_2 ; calc_green = COLOR_SPACE_MAX ; calc_blue = tmp_1; } else if ( tmp == 2 ) { calc_red = tmp_1 ; calc_green = COLOR_SPACE_MAX ; calc_blue = tmp_3; } else if ( tmp == 3 ) { calc_red = tmp_1 ; calc_green = tmp_2 ; calc_blue = COLOR_SPACE_MAX; } else if ( tmp == 4 ) { calc_red = tmp_3 ; calc_green = tmp_1 ; calc_blue = COLOR_SPACE_MAX; } else { calc_red = COLOR_SPACE_MAX ; calc_green = tmp_1 ; calc_blue = tmp_2; } } red = ((int)brightness * calc_red) / COLOR_SPACE_MAX; green = ((int)brightness * calc_green) / COLOR_SPACE_MAX; blue = ((int)brightness * calc_blue) / COLOR_SPACE_MAX; } return 0; }