173 lines
5.8 KiB
C
173 lines
5.8 KiB
C
#include "parse_config.h"
|
|
#include "parse_keymap.h"
|
|
#include "parse_macro.h"
|
|
#include "keymap.h"
|
|
#include "config_globals.h"
|
|
#include "macros.h"
|
|
#include "usb_report_updater.h"
|
|
#include "led_display.h"
|
|
#include "slave_scheduler.h"
|
|
#include "slave_drivers/is31fl3731_driver.h"
|
|
#include "config.h"
|
|
|
|
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
|
|
{
|
|
uint8_t id = ReadUInt8(buffer);
|
|
uint8_t pointerMode = ReadUInt8(buffer); // move vs scroll
|
|
uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer);
|
|
uint8_t basePointerSpeedMultiplier = ReadUInt8(buffer);
|
|
uint8_t acceleratedPointerSpeed = ReadUInt8(buffer);
|
|
uint16_t angularShift = ReadUInt16(buffer);
|
|
uint8_t modLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
|
uint8_t fnLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
|
uint8_t mouseLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
|
|
|
|
(void)id;
|
|
(void)pointerMode;
|
|
(void)deceleratedPointerSpeedMultiplier;
|
|
(void)basePointerSpeedMultiplier;
|
|
(void)acceleratedPointerSpeed;
|
|
(void)angularShift;
|
|
(void)modLayerPointerFunction;
|
|
(void)fnLayerPointerFunction;
|
|
(void)mouseLayerPointerFunction;
|
|
|
|
return ParserError_Success;
|
|
}
|
|
|
|
parser_error_t ParseConfig(config_buffer_t *buffer)
|
|
{
|
|
// Miscellaneous properties
|
|
|
|
uint16_t len;
|
|
uint16_t macroCount;
|
|
uint16_t keymapCount;
|
|
parser_error_t errorCode;
|
|
|
|
uint16_t dataModelMajorVersion = ReadUInt16(buffer);
|
|
uint16_t dataModelMinorVersion = ReadUInt16(buffer);
|
|
uint16_t dataModelPatchVersion = ReadUInt16(buffer);
|
|
uint16_t userConfigLength = ReadUInt16(buffer);
|
|
const char *deviceName = ReadString(buffer, &len);
|
|
uint16_t doubleTapSwitchLayerTimeout = ReadUInt16(buffer);
|
|
|
|
(void)dataModelMajorVersion;
|
|
(void)dataModelMinorVersion;
|
|
(void)dataModelPatchVersion;
|
|
(void)deviceName;
|
|
(void)doubleTapSwitchLayerTimeout;
|
|
|
|
// LED brightness
|
|
|
|
uint8_t iconsAndLayerTextsBrightness = ReadUInt8(buffer);
|
|
uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer);
|
|
uint8_t keyBacklightBrightness = ReadUInt8(buffer);
|
|
|
|
// Mouse kinetic properties
|
|
|
|
uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseMoveAcceleration = ReadUInt8(buffer);
|
|
uint8_t mouseMoveDeceleratedSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseMoveBaseSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseMoveAcceleratedSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseScrollInitialSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseScrollAcceleration = ReadUInt8(buffer);
|
|
uint8_t mouseScrollDeceleratedSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseScrollBaseSpeed = ReadUInt8(buffer);
|
|
uint8_t mouseScrollAcceleratedSpeed = ReadUInt8(buffer);
|
|
|
|
if (mouseMoveInitialSpeed == 0 ||
|
|
mouseMoveAcceleration == 0 ||
|
|
mouseMoveDeceleratedSpeed == 0 ||
|
|
mouseMoveBaseSpeed == 0 ||
|
|
mouseMoveAcceleratedSpeed == 0 ||
|
|
mouseScrollInitialSpeed == 0 ||
|
|
mouseScrollAcceleration == 0 ||
|
|
mouseScrollDeceleratedSpeed == 0 ||
|
|
mouseScrollBaseSpeed == 0 ||
|
|
mouseScrollAcceleratedSpeed == 0)
|
|
{
|
|
return ParserError_InvalidMouseKineticProperty;
|
|
}
|
|
|
|
// Module configurations
|
|
|
|
uint16_t moduleConfigurationCount = ReadCompactLength(buffer);
|
|
|
|
if (moduleConfigurationCount > 255) {
|
|
return ParserError_InvalidModuleConfigurationCount;
|
|
}
|
|
|
|
for (uint8_t moduleConfigurationIdx = 0; moduleConfigurationIdx < moduleConfigurationCount; moduleConfigurationIdx++) {
|
|
errorCode = parseModuleConfiguration(buffer);
|
|
if (errorCode != ParserError_Success) {
|
|
return errorCode;
|
|
}
|
|
}
|
|
|
|
// Macros
|
|
|
|
macroCount = ReadCompactLength(buffer);
|
|
if (macroCount > MAX_MACRO_NUM) {
|
|
return ParserError_InvalidMacroCount;
|
|
}
|
|
|
|
for (uint8_t macroIdx = 0; macroIdx < macroCount; macroIdx++) {
|
|
errorCode = ParseMacro(buffer, macroIdx);
|
|
if (errorCode != ParserError_Success) {
|
|
return errorCode;
|
|
}
|
|
}
|
|
|
|
// Keymaps
|
|
|
|
keymapCount = ReadCompactLength(buffer);
|
|
if (keymapCount == 0 || keymapCount > MAX_KEYMAP_NUM) {
|
|
return ParserError_InvalidKeymapCount;
|
|
}
|
|
|
|
for (uint8_t keymapIdx = 0; keymapIdx < keymapCount; keymapIdx++) {
|
|
errorCode = ParseKeymap(buffer, keymapIdx, keymapCount, macroCount);
|
|
if (errorCode != ParserError_Success) {
|
|
return errorCode;
|
|
}
|
|
}
|
|
|
|
// If parsing succeeded then apply the parsed values.
|
|
|
|
if (!ParserRunDry) {
|
|
// DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
|
|
|
|
// Update LED brightnesses and reinitialize LED drivers
|
|
|
|
ValidatedUserConfigLength = userConfigLength;
|
|
|
|
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
|
|
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
|
KeyBacklightBrightness = keyBacklightBrightness;
|
|
|
|
LedSlaveDriver_UpdateLeds();
|
|
|
|
// Update mouse key speeds
|
|
|
|
MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
|
|
MouseMoveState.acceleration = mouseMoveAcceleration;
|
|
MouseMoveState.deceleratedSpeed = mouseMoveDeceleratedSpeed;
|
|
MouseMoveState.baseSpeed = mouseMoveBaseSpeed;
|
|
MouseMoveState.acceleratedSpeed = mouseMoveAcceleratedSpeed;
|
|
|
|
MouseScrollState.initialSpeed = mouseScrollInitialSpeed;
|
|
MouseScrollState.acceleration = mouseScrollAcceleration;
|
|
MouseScrollState.deceleratedSpeed = mouseScrollDeceleratedSpeed;
|
|
MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
|
|
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
|
|
|
|
// Update counts
|
|
|
|
AllKeymapsCount = keymapCount;
|
|
AllMacrosCount = macroCount;
|
|
}
|
|
|
|
return ParserError_Success;
|
|
}
|