From 97336455b5fd24bf09eeea3da7bf4432887c80b1 Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Mon, 7 Aug 2017 11:19:41 -0700 Subject: [PATCH] Verify a new configuration before applying it --- right/src/config_parser/config_state.c | 7 +++++-- right/src/config_parser/config_state.h | 1 + right/src/config_parser/parse_keymap.c | 2 +- right/src/usb_protocol_handler.c | 19 ++++++++++++++----- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/right/src/config_parser/config_state.c b/right/src/config_parser/config_state.c index 79e6b12..564e76d 100644 --- a/right/src/config_parser/config_state.c +++ b/right/src/config_parser/config_state.c @@ -3,8 +3,11 @@ static uint8_t hardwareConfig[HARDWARE_CONFIG_SIZE]; config_buffer_t HardwareConfigBuffer = {hardwareConfig}; -static uint8_t userConfig[USER_CONFIG_SIZE]; -config_buffer_t UserConfigBuffer = {userConfig}; +static uint8_t userConfig1[USER_CONFIG_SIZE]; +static uint8_t userConfig2[USER_CONFIG_SIZE]; + +config_buffer_t UserConfigBuffer = { userConfig1 }; +config_buffer_t NewUserConfigBuffer = { userConfig2 }; uint8_t readUInt8(config_buffer_t *buffer) { return buffer->buffer[buffer->offset++]; diff --git a/right/src/config_parser/config_state.h b/right/src/config_parser/config_state.h index 1af70b8..f92630d 100644 --- a/right/src/config_parser/config_state.h +++ b/right/src/config_parser/config_state.h @@ -23,6 +23,7 @@ extern config_buffer_t HardwareConfigBuffer; extern config_buffer_t UserConfigBuffer; + extern config_buffer_t NewUserConfigBuffer; // Functions: diff --git a/right/src/config_parser/parse_keymap.c b/right/src/config_parser/parse_keymap.c index 15e51dc..1ae18ef 100644 --- a/right/src/config_parser/parse_keymap.c +++ b/right/src/config_parser/parse_keymap.c @@ -193,7 +193,7 @@ parser_error_t ParseKeymap(config_buffer_t *buffer) {; if (layerCount != LAYER_COUNT) { return ParserError_InvalidLayerCount; } - isDryRun = !isDefault; + isDryRun = buffer == &NewUserConfigBuffer || !isDefault; if (!isDryRun) { LedDisplay_SetText(abbreviationLen, abbreviation); } diff --git a/right/src/usb_protocol_handler.c b/right/src/usb_protocol_handler.c index 778ec7f..1d12f29 100644 --- a/right/src/usb_protocol_handler.c +++ b/right/src/usb_protocol_handler.c @@ -85,10 +85,19 @@ void readMergeSensor(void) void applyConfig(void) { - UserConfigBuffer.offset = 0; - GenericHidOutBuffer[0] = ParseConfig(&UserConfigBuffer); - GenericHidOutBuffer[1] = UserConfigBuffer.offset; - GenericHidOutBuffer[2] = UserConfigBuffer.offset >> 8; + uint8_t *temp; + + NewUserConfigBuffer.offset = 0; + GenericHidOutBuffer[0] = ParseConfig(&NewUserConfigBuffer); + GenericHidOutBuffer[1] = NewUserConfigBuffer.offset; + GenericHidOutBuffer[2] = NewUserConfigBuffer.offset >> 8; + if (GenericHidOutBuffer[0] == ParserError_Success) { + temp = UserConfigBuffer.buffer; + UserConfigBuffer.buffer = NewUserConfigBuffer.buffer; + NewUserConfigBuffer.buffer = temp; + UserConfigBuffer.offset = 0; + ParseConfig(&UserConfigBuffer); + } } void setLedPwm(void) @@ -144,7 +153,7 @@ void writeConfiguration(bool isHardware) return; } - uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : UserConfigBuffer.buffer; + uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : NewUserConfigBuffer.buffer; uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; if (offset + length > bufferLength) {