From 4ad11700c677ad4ae4b3d7ff941100233b8ca36f Mon Sep 17 00:00:00 2001 From: Eric Tang Date: Fri, 21 Jul 2017 11:54:39 -0700 Subject: [PATCH] Add the macro parser --- right/src/config/parse_config.c | 9 +-- right/src/config/parse_config.h | 1 + right/src/config/parse_macro.c | 106 ++++++++++++++++++++++++++++++++ right/src/config/parse_macro.h | 25 ++++++++ 4 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 right/src/config/parse_macro.c create mode 100644 right/src/config/parse_macro.h diff --git a/right/src/config/parse_config.c b/right/src/config/parse_config.c index ddaa458..1867818 100644 --- a/right/src/config/parse_config.c +++ b/right/src/config/parse_config.c @@ -1,5 +1,6 @@ #include "parse_config.h" #include "parse_keymap.h" +#include "parse_macro.h" static parser_error_t parseModuleConfiguration(config_buffer_t *buffer) { uint8_t id = readUInt8(buffer); @@ -30,10 +31,10 @@ parser_error_t ParseConfig(config_buffer_t *buffer) { } macroCount = readCompactLength(buffer); for (uint16_t macroIdx = 0; macroIdx < macroCount; macroIdx++) { - // errorCode = ParseMacro(buffer); - // if (errorCode != ParserError_Success) { - // return errorCode; - // } + errorCode = ParseMacro(buffer); + if (errorCode != ParserError_Success) { + return errorCode; + } } keymapCount = readCompactLength(buffer); for (uint16_t keymapIdx = 0; keymapIdx < keymapCount; keymapIdx++) { diff --git a/right/src/config/parse_config.h b/right/src/config/parse_config.h index acd61f2..b770e55 100644 --- a/right/src/config/parse_config.h +++ b/right/src/config/parse_config.h @@ -15,6 +15,7 @@ ParserError_InvalidLayerCount, ParserError_InvalidModuleCount, ParserError_InvalidActionCount, + ParserError_InvalidSerializedMacroActionType, } parser_error_t; // Functions: diff --git a/right/src/config/parse_macro.c b/right/src/config/parse_macro.c new file mode 100644 index 0000000..5a74a3d --- /dev/null +++ b/right/src/config/parse_macro.c @@ -0,0 +1,106 @@ +#include "parse_macro.h" + +parser_error_t parseKeyMacroAction(config_buffer_t *buffer, serialized_macro_action_type_t macroActionType) { + uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction; + uint8_t action = keyMacroType & 0b11; + uint8_t type; + uint8_t scancode; + uint8_t modifierMask; + + keyMacroType >>= 2; + type = keyMacroType & 0b11; + keyMacroType >>= 2; + if (keyMacroType & 0b10) { + scancode = readUInt8(buffer); + } + if (keyMacroType & 0b01) { + modifierMask = readUInt8(buffer); + } + (void)action; + (void)type; + (void)scancode; + (void)modifierMask; + return ParserError_Success; +} + +parser_error_t parseMouseButtonMacroAction(config_buffer_t *buffer, serialized_macro_action_type_t macroActionType) { + uint8_t action = macroActionType - SerializedMacroActionType_MouseButtonMacroAction; + uint8_t mouseButtonsMask = readUInt8(buffer); + + (void)action; + (void)mouseButtonsMask; + return ParserError_Success; +} + +parser_error_t parseMoveMouseMacroAction(config_buffer_t *buffer) { + int16_t x = readInt16(buffer); + int16_t y = readInt16(buffer); + + (void)x; + (void)y; + return ParserError_Success; +} + +parser_error_t parseScrollMouseMacroAction(config_buffer_t *buffer) { + int16_t x = readInt16(buffer); + int16_t y = readInt16(buffer); + + (void)x; + (void)y; + return ParserError_Success; +} + +parser_error_t parseDelayMacroAction(config_buffer_t *buffer) { + int16_t delay = readInt16(buffer); + + (void)delay; + return ParserError_Success; +} + +parser_error_t parseTextMacroAction(config_buffer_t *buffer) { + uint16_t textLen; + const char *text = readString(buffer, &textLen); + + (void)text; + return ParserError_Success; +} + +parser_error_t parseMacroAction(config_buffer_t *buffer) { + uint8_t macroActionType = readUInt8(buffer); + + switch (macroActionType) { + case SerializedMacroActionType_KeyMacroAction ... SerializedMacroActionType_LastKeyMacroAction: + return parseKeyMacroAction(buffer, macroActionType); + case SerializedMacroActionType_MouseButtonMacroAction ... SerializedMacroActionType_LastMouseButtonMacroAction: + return parseMouseButtonMacroAction(buffer, macroActionType); + case SerializedMacroActionType_MoveMouseMacroAction: + return parseMoveMouseMacroAction(buffer); + case SerializedMacroActionType_ScrollMouseMacroAction: + return parseScrollMouseMacroAction(buffer); + case SerializedMacroActionType_DelayMacroAction: + return parseDelayMacroAction(buffer); + case SerializedMacroActionType_TextMacroAction: + return parseTextMacroAction(buffer); + } + return ParserError_InvalidSerializedMacroActionType; +} + +parser_error_t ParseMacro(config_buffer_t *buffer) { + parser_error_t errorCode; + uint16_t nameLen; + bool isLooped = readBool(buffer); + bool isPrivate = readBool(buffer); + const char *name = readString(buffer, &nameLen); + uint16_t macroActionsCount = readCompactLength(buffer); + + (void)isLooped; + (void)isPrivate; + (void)name; + for (uint16_t i = 0; i < macroActionsCount; i++) { + errorCode = parseMacroAction(buffer); + if (errorCode != ParserError_Success) { + return errorCode; + } + } + return ParserError_Success; +} diff --git a/right/src/config/parse_macro.h b/right/src/config/parse_macro.h new file mode 100644 index 0000000..6791571 --- /dev/null +++ b/right/src/config/parse_macro.h @@ -0,0 +1,25 @@ +#ifndef __PARSE_MACRO_H__ +#define __PARSE_MACRO_H__ + +// Includes: + + #include "parse_config.h" + +// Typedefs: + + typedef enum { + SerializedMacroActionType_KeyMacroAction = 0, + SerializedMacroActionType_LastKeyMacroAction = 63, + SerializedMacroActionType_MouseButtonMacroAction, + SerializedMacroActionType_LastMouseButtonMacroAction = 66, + SerializedMacroActionType_MoveMouseMacroAction, + SerializedMacroActionType_ScrollMouseMacroAction, + SerializedMacroActionType_DelayMacroAction, + SerializedMacroActionType_TextMacroAction + } serialized_macro_action_type_t; + +// Functions: + + parser_error_t ParseMacro(config_buffer_t *buffer); + +#endif