/* * ---------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * wrote this file. As long as you retain this notice you * can do whatever you want with this stuff. If we meet some day, and you think * this stuff is worth it, you can buy me a beer in return. * (c) 2014 Stefan Rupp * ---------------------------------------------------------------------------- */ /* * This module tries to control 15 RGB-LEDs * connected to three daisy-chained * LED1642GW-ICs from STM. */ #include "ledcontroller.h" #include "led1642gw.h" /* * Application specific mapping of LEDs and there respective color channels * to the respective channels of the three LED1642GW ICs. */ static int8_t map_lednum_to_channels(uint8_t lednum, uint8_t *channel_r, uint8_t *channel_g, uint8_t *channel_b) { uint8_t ret=0; if (lednum < 14) { ret = 1; switch (lednum) { case 0: *channel_r = 13; *channel_g = 14; *channel_b = 15; break; case 1: *channel_r = 33; *channel_g = 34; *channel_b = 35; break; case 2: *channel_r = 36; *channel_g = 37; *channel_b = 38; break; case 3: *channel_r = 45; *channel_g = 46; *channel_b = 47; break; case 4: *channel_r = 42; *channel_g = 43; *channel_b = 44; break; case 5: *channel_r = 39; *channel_g = 40; *channel_b = 41; break; case 6: *channel_r = 29; *channel_g = 30; *channel_b = 31; break; case 7: *channel_r = 26; *channel_g = 27; *channel_b = 28; break; case 8: *channel_r = 23; *channel_g = 24; *channel_b = 25; break; case 9: *channel_r = 20; *channel_g = 21; *channel_b = 22; break; case 10: *channel_r = 17; *channel_g = 18; *channel_b = 19; break; case 11: *channel_r = 10; *channel_g = 11; *channel_b = 12; break; case 12: *channel_r = 4; *channel_g = 5; *channel_b = 6; break; case 13: *channel_r = 7; *channel_g = 8; *channel_b = 9; break; default: ret = 0; break; } } return ret; } /* * set one RGB LED to a RGB value. * This only changes the Red, Green and Blue values in the * internal LED buffer, the physical LED will still remain in its previous * state, until you call led_flush(). */ void led_set(uint8_t lednum, uint16_t red, uint16_t green, uint16_t blue) { uint8_t c_r, c_g, c_b; if ( map_lednum_to_channels(lednum, &c_r, &c_g, &c_b) > 0 ) { led1642gw_set_channel(c_r, red); led1642gw_set_channel(c_g, green); led1642gw_set_channel(c_b, blue); } } void led_set_hsv(uint8_t lednum, uint16_t hue, uint8_t saturation, uint8_t value) { uint16_t red, green, blue; //Calculate hue if ( hue < 61 ) { red = 255; green = ( 425UL * hue ) / 100; blue = 0; } else if ( hue < 121 ) { red = 255 - ( ( 425UL * ( hue - 60 ) ) / 100 ); green = 255; blue = 0; } else if ( hue < 181 ) { red = 0; green = 255; blue = ( 425UL * ( hue - 120 ) ) / 100; } else if ( hue < 241 ) { red = 0; green = 255 - ( ( 425UL * ( hue - 180 ) ) / 100 ); blue = 255; } else if ( hue < 301 ) { red = ( 425UL * ( hue - 240 ) ) / 100; green = 0; blue = 255; } else if ( hue < 360) { red = 255; green = 0; blue = 255 - ( ( 425UL * ( hue - 300 ) ) / 100); } //Calculate saturation uint8_t diff; saturation = 100 - saturation; diff = ( ( 255 - red ) * saturation ) / 100; red += diff; diff = ( ( 255 - green ) * saturation ) / 100; green += diff; diff = ( ( 255 - blue ) * saturation ) / 100; blue += diff; //Calculate value red = ( red * value ) / 100; green = ( green * value ) / 100; blue = ( blue * value ) / 100; led_set(lednum, red<<8, green<<8, blue<<8); } /* * Write the data stored in the LED buffers via led_set(). */ void led_flush(void) { led1642gw_flush(); } /* * Clear the LED buffer. * This function only affects the LED buffer, but not the LEDs, until * you call led_flush(). */ void led_clear(void) { led1642gw_clear(); } /* * Initialize the leddriver. * Must be called before any other function in this module. */ void led_init(void) { led1642gw_init(); } /* * Turn all channels on on every LED1642GW IC. * If you don't turn the channels on, led_set * won't have any effect, and the LEDs will remain dark. */ void led_turn_all_on(void) { led1642gw_turn_all_on(); } void led_set_gain(uint8_t gain) { if (gain > 0x3f) { gain = 0x3f; } led1642gw_set_gain(gain); led1642gw_flush_config(); } void led_set_current_mode(uint8_t mode) { led1642gw_set_current_mode(mode); led1642gw_flush_config(); }