Add firmware defaults reset, start button LEDs, overall brightness (rev6+)

This commit is contained in:
Will Toohey
2018-10-29 22:30:06 +10:00
parent eb0c5dddba
commit 69ab6a7bb6
7 changed files with 90 additions and 18 deletions
+14 -1
View File
@@ -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:
+6 -1
View File
@@ -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;
+2 -2
View File
@@ -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
+3 -4
View File
@@ -1,10 +1,9 @@
#include <Config.h>
#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]);
+7
View File
@@ -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);
}
}
}
+28 -10
View File
@@ -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);
}
+30
View File
@@ -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;