From 69ab6a7bb67b92e0938d6c923686e468bfbbc8dd Mon Sep 17 00:00:00 2001 From: Will Toohey Date: Mon, 29 Oct 2018 22:30:06 +1000 Subject: [PATCH] Add firmware defaults reset, start button LEDs, overall brightness (rev6+) --- Firmware/PocketVoltex/Config.c | 15 ++++++++- Firmware/PocketVoltex/Config.h | 7 ++++- Firmware/PocketVoltex/LED.h | 4 +-- Firmware/PocketVoltex/LED_Driver_SK9822.c | 7 ++--- Firmware/PocketVoltex/PocketVoltex.c | 7 +++++ Software/WebConfig/js/config.js | 38 +++++++++++++++++------ Software/WebConfig/js/settings.js | 30 ++++++++++++++++++ 7 files changed, 90 insertions(+), 18 deletions(-) diff --git a/Firmware/PocketVoltex/Config.c b/Firmware/PocketVoltex/Config.c index 6b8b23f..ce631c8 100644 --- a/Firmware/PocketVoltex/Config.c +++ b/Firmware/PocketVoltex/Config.c @@ -45,11 +45,16 @@ static const PROGMEM sdvx_config_t defaults = { HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT, HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT, HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT}, + .ledBrightness = 31, + .startColour = {0, BRIGHTNESS_MAX, 0}, // green }; void InitConfig(void) { - // TODO: if config version changes, migrate settings + // if config version changes, migrate settings switch(eeprom_read_word(&eeConfig.configVersion)) { + // all of these fall through to upgrade each bit as we go + case 2: + eeprom_write_byte(&eeConfig.ledBrightness, defaults.ledBrightness); case CONFIG_VERSION: // nothing needs to change break; default: @@ -70,6 +75,11 @@ void UpdateConfig(void) { eeprom_update_block(&sdvxConfig, &eeConfig, CONFIG_SIZE); } +void LoadDefaults(void) { + memcpy_P(&sdvxConfig, &defaults, CONFIG_SIZE); + eeprom_update_block(&sdvxConfig, &eeConfig, CONFIG_SIZE); +} + command_response_t HandleConfig(uint8_t* buffer) { command_t *command = (command_t*)buffer; switch(command->command) { @@ -89,6 +99,9 @@ command_response_t HandleConfig(uint8_t* buffer) { case SETCONFIG: SetConfig(&command->data.config); return IGNORE; + case DEFAULTCONFIG: + LoadDefaults(); + return IGNORE; case RESET: return REBOOT; default: diff --git a/Firmware/PocketVoltex/Config.h b/Firmware/PocketVoltex/Config.h index e46f266..c0a9597 100644 --- a/Firmware/PocketVoltex/Config.h +++ b/Firmware/PocketVoltex/Config.h @@ -14,7 +14,7 @@ // divide by 10 for actual version #define FIRMWARE_VERSION 14 // increment whenever config structure has breaking changes -#define CONFIG_VERSION 2 +#define CONFIG_VERSION 3 // not configurable since they're all the same switches #define SWITCH_DEBOUNCE 30 @@ -46,6 +46,10 @@ typedef struct { // Reused for both tap or hold, at the end in case I decide to extend uint8_t macroLen; // placeholder not used yet uint8_t macroPin[4]; + + // added in firmware 1.5 + uint8_t ledBrightness; // rev6 and up + RGB_t startColour; } ATTR_PACKED sdvx_config_t; #define CONFIG_SIZE sizeof(sdvx_config_t) @@ -59,6 +63,7 @@ typedef enum { GETCONFIG = 1, SETCONFIG = 2, VERSION = 3, // synced with bootloader, DO NOT CHANGE + DEFAULTCONFIG = 4, RESET = MAGIC_RESET_NUMBER } command_action_t; diff --git a/Firmware/PocketVoltex/LED.h b/Firmware/PocketVoltex/LED.h index 5b6642e..483387c 100644 --- a/Firmware/PocketVoltex/LED.h +++ b/Firmware/PocketVoltex/LED.h @@ -9,8 +9,8 @@ #define LED_COUNT 8 #define LED_PHYSICAL_COUNT (LED_COUNT*3) -// BT + FX -#define LED_VIRTUAL_COUNT 6 +// BT + FX + START +#define LED_VIRTUAL_COUNT 7 #define LED_TOTAL_COUNT (LED_PHYSICAL_COUNT + LED_VIRTUAL_COUNT) // Internally how many brightness levels you can use - for higher res fades #define BRIGHTNESS_LEVELS 256 diff --git a/Firmware/PocketVoltex/LED_Driver_SK9822.c b/Firmware/PocketVoltex/LED_Driver_SK9822.c index 1ad7f1a..f0afbc9 100644 --- a/Firmware/PocketVoltex/LED_Driver_SK9822.c +++ b/Firmware/PocketVoltex/LED_Driver_SK9822.c @@ -1,10 +1,9 @@ +#include + #define R 0 #define G 1 #define B 2 -// range 0-31 -#define SK9822_BRIGHTNESS 31 - static const uint8_t SK9822_map[] = {0, 2, 4, 6, 7, 5, 3, 1}; void led_init(void) { @@ -38,7 +37,7 @@ void led_commit(void) { for (uint8_t i = 0; i < LED_COUNT; i++) { - SPI_write(0xe0|SK9822_BRIGHTNESS); // Maximum global brightness + SPI_write(0xe0 | (sdvxConfig.ledBrightness & 31)); // Maximum global brightness uint8_t offset = SK9822_map[i] * 3; SPI_write(leds[offset+B]); SPI_write(leds[offset+G]); diff --git a/Firmware/PocketVoltex/PocketVoltex.c b/Firmware/PocketVoltex/PocketVoltex.c index 9fb1780..7dc18ff 100644 --- a/Firmware/PocketVoltex/PocketVoltex.c +++ b/Firmware/PocketVoltex/PocketVoltex.c @@ -210,6 +210,10 @@ int main(void) led_set_rgb(ledMap[i-1], &sdvxConfig.fxColour); } } + // START + if(switches[0].state) { + led_set_all_rgb(&sdvxConfig.startColour); + } } } // knob lights go above all @@ -409,6 +413,9 @@ void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDI led_set_rgb(ledMap[i], &sdvxConfig.fxColour); } } + if(LEDReport->btFx[6]) { // start + led_set_all_rgb(&sdvxConfig.startColour); + } } } diff --git a/Software/WebConfig/js/config.js b/Software/WebConfig/js/config.js index 43f6ea1..4d1d549 100644 --- a/Software/WebConfig/js/config.js +++ b/Software/WebConfig/js/config.js @@ -14,9 +14,10 @@ var CONFIG_IN_EPADDR = 2; var packetSize = 64; var commands = { - GETCONFIG : 1, - SETCONFIG : 2, - VERSION : 3, + GETCONFIG : 1, + SETCONFIG : 2, + VERSION : 3, + DEFAULTCONFIG : 4, RESET : 42 }; @@ -30,10 +31,12 @@ var configDisplay = [ {id: 'macroHold', name: 'Macro longpress'}, {id: 'macroPin', name: 'Macro PIN'}, {id: 'lightsOn', name: 'Enable LEDs', children: [ + {id: 'ledBrightness', name: 'LED Brightness', min: 1, max: 31}, {id: 'hidLights', name: 'HID Lights'}, {id: 'keyLights', name: 'Key lights', children: [ {id: 'btColour', name: 'BT colour'}, {id: 'fxColour', name: 'FX colour'}, + {id: 'startColour', name: 'START colour'}, ]}, {id: 'knobLights', name: 'Knob lights', children: [ {id: 'knobL', name: 'VOL-L colour'}, @@ -67,15 +70,10 @@ var settingOrder = [ 'macroHold', 'macroLen', 'macroPin', + 'ledBrightness', + 'startColour', ]; -var defaultConfig = { - switches : [], - ledsOn : true, - //macroClick : KP_PLUS, - macroPin : [0,0,0,0], -} - var visibleLog = function(html) { console.log(html); var log = document.getElementById('logview'); @@ -126,10 +124,12 @@ class ConfigValues { this.controlMode = new SettingRadio(); this.btColour = new SettingRGB(BRIGHTNESS_MAX); this.fxColour = new SettingRGB(BRIGHTNESS_MAX); + this.startColour = new SettingRGB(BRIGHTNESS_MAX); this.breatheColour = new SettingRGB(BRIGHTNESS_MAX); this.knobL = new SettingRGB(BRIGHTNESS_MAX); this.knobR = new SettingRGB(BRIGHTNESS_MAX); this.lightsOn = new SettingBool(); + this.ledBrightness = new SettingSlider(); this.hidLights = new SettingBool(); this.keyLights = new SettingBool(); this.knobLights = new SettingBool(); @@ -333,6 +333,17 @@ class Config { return device.transferOut(CONFIG_OUT_EPADDR, data); } + loadDefaults() { + if(!device || !device.opened) + return Promise.reject("Device not opened"); + if(!confirm('Loading defaults cannot be undone. Are you sure?')) + return Promise.resolve('Cancelled'); + var data = new Uint8Array(packetSize); + data[0] = commands.DEFAULTCONFIG; + return device.transferOut(CONFIG_OUT_EPADDR, data) + .then(this.readConfig.bind(this)); + } + close() { if(!device || !device.opened) return Promise.reject("Device not opened"); @@ -368,6 +379,13 @@ class Config { enableUI() { //document.getElementById('configBox').classList.remove('hidden', 'disabled'); document.getElementById('connect').classList.add('hidden'); + + var defaults = document.createElement('input'); + defaults.type = 'button'; + defaults.value = 'Load defaults'; + defaults.onclick = this.loadDefaults.bind(this); + this.optionsDiv.appendChild(defaults); + this.populateSettings(this.optionsDiv, configDisplay); } diff --git a/Software/WebConfig/js/settings.js b/Software/WebConfig/js/settings.js index 6979ed3..df931c8 100644 --- a/Software/WebConfig/js/settings.js +++ b/Software/WebConfig/js/settings.js @@ -60,6 +60,35 @@ class SettingBool extends Setting { } } +class SettingSlider extends Setting { + read(buffer) { + this.slider.value = buffer.read(1); + } + + write(buffer) { + buffer.write(this.slider.value); + } + + createUI(setting) { + var container = document.createElement('div'); + var slider = document.createElement('input'); + slider.type = 'range'; + slider.id = 'slider-' + setting.id; + slider.min = setting.min; + slider.max = setting.max; + slider.oninput = this.fireCallback.bind(this); + this.slider = slider; + + var label = document.createElement('label'); + label.htmlFor = slider.id; + label.textContent = setting.name; + + container.appendChild(slider); + container.appendChild(label); + return container; + } +} + class SettingRGB extends Setting { constructor(maxBright) { super(); @@ -362,6 +391,7 @@ var scancodes = [ window.SettingPlaceholder = SettingPlaceholder; window.SettingBool = SettingBool; +window.SettingSlider = SettingSlider; window.SettingRGB = SettingRGB; window.SettingRadio = SettingRadio; window.SettingKeys = SettingKeys;