From 7e482594206c8db2dbce7d588bd87a5b46911efa Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 23 Apr 2017 19:12:44 +0200 Subject: [PATCH] Added finer brightness control --- firmware/keyboard.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/firmware/keyboard.c b/firmware/keyboard.c index f2fcc5a..6f71f1d 100644 --- a/firmware/keyboard.c +++ b/firmware/keyboard.c @@ -45,6 +45,12 @@ const uint8_t PROGMEM gamma8[] = { 177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213, 215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; +const uint8_t PROGMEM gammaBright[] = { + 0, 1, 2, 3, 6, 10, 14, + 18, 26, 31, 38, 46, 54, 66, + 76, 89, 104, 128, 150, 180, 240, + 250, 280, 340}; + struct cRGB led[LEDS_PER_SLOT]; USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) @@ -119,7 +125,8 @@ void keyboard(void) { enum enum_state state = IDLE; enum enum_state next_state = IDLE; uint8_t i; - uint8_t factor = 1; + uint16_t factor = 1; + uint8_t brightness = 1; uint8_t key = 0; uint16_t loadAddress; uint16_t loadCount; @@ -149,7 +156,7 @@ void keyboard(void) { LED_PORT &= ~(1 << LED_RED); LED_PORT |= (1 << LED_GREEN); - factor = eeprom_read_byte(IEE_ADDR_DEFAULT_BRIGHTNESS); + brightness = eeprom_read_byte(IEE_ADDR_DEFAULT_BRIGHTNESS); change_block = eeprom_read_byte(IEE_ADDR_DEFAULT_BLOCK); for (;;) { /* main event loop */ @@ -184,15 +191,15 @@ void keyboard(void) { if (key > 12) { /* Special key */ switch (key) { case KEY_BRIGHTNESS_UP: - factor = (factor <= 1 ? 1 : factor - 1); + brightness = (brightness <= 0 ? 0 : brightness - 1); break; case KEY_BRIGHTNESS_DOWN: - factor = (factor > 30 ? 30 : factor + 1); + brightness = (brightness >= 21 ? 21 : brightness + 1); break; case KEY_SF_1: break; case KEY_SF_2: /* Save current as default */ - eeprom_write_byte(IEE_ADDR_DEFAULT_BRIGHTNESS, factor); + eeprom_write_byte(IEE_ADDR_DEFAULT_BRIGHTNESS, brightness); eeprom_write_byte(IEE_ADDR_DEFAULT_BLOCK, current_block); break; default: @@ -214,15 +221,17 @@ void keyboard(void) { loadCount = LEDS_PER_SLOT; state = LOAD; case LOAD: + factor = pgm_read_byte(&gammaBright[brightness]); + factor = 256 + factor * 25; led[LEDS_PER_SLOT - loadCount].r = EEReadByte(loadAddress++); //led[LEDS_PER_SLOT - loadCount].r = (int)pgm_read_byte(&gamma8[led[LEDS_PER_SLOT - loadCount].r]); - led[LEDS_PER_SLOT - loadCount].r = led[LEDS_PER_SLOT - loadCount].r / factor; + led[LEDS_PER_SLOT - loadCount].r = (uint8_t) ((uint16_t) ((uint16_t) ((uint16_t) (led[LEDS_PER_SLOT - loadCount].r) << 8) / factor)); led[LEDS_PER_SLOT - loadCount].g = EEReadByte(loadAddress++); ////led[LEDS_PER_SLOT - loadCount].g = (int)pgm_read_byte(&gamma8[led[LEDS_PER_SLOT - loadCount].g]); - led[LEDS_PER_SLOT - loadCount].g = led[LEDS_PER_SLOT - loadCount].g / factor; + led[LEDS_PER_SLOT - loadCount].g = (uint8_t) ((uint16_t) ((uint16_t) ((uint16_t) (led[LEDS_PER_SLOT - loadCount].g) << 8) / factor)); led[LEDS_PER_SLOT - loadCount].b = EEReadByte(loadAddress++); //led[LEDS_PER_SLOT - loadCount].b = (int)pgm_read_byte(&gamma8[led[LEDS_PER_SLOT - loadCount].b]); - led[LEDS_PER_SLOT - loadCount].b = led[LEDS_PER_SLOT - loadCount].b / factor; + led[LEDS_PER_SLOT - loadCount].b = (uint8_t) ((uint16_t) ((uint16_t) ((uint16_t) (led[LEDS_PER_SLOT - loadCount].b) << 8) / factor)); if (!--loadCount) { state = RENDER; loadCount = LEDS_PER_SLOT;