mirror of
https://github.com/mon/PocketVoltex.git
synced 2026-09-28 09:47:57 +03:00
Add firmware defaults reset, start button LEDs, overall brightness (rev6+)
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user