__UNTESTED CODE__ - Added some basic JSON handling to read in the JSON file and parse different values from it
parent
c4482b7449
commit
4889be7a8b
@ -0,0 +1,21 @@
|
||||
{
|
||||
"macros": [
|
||||
{
|
||||
"macro_no": 1,
|
||||
"actions": [
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": [
|
||||
"KEY_a_A",
|
||||
"KEY_b_B",
|
||||
"KEY_c_C",
|
||||
"KEY_d_D",
|
||||
"KEY_e_E",
|
||||
"KEY_f_F"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
{
|
||||
"macros": [
|
||||
{
|
||||
"macro_no": 1,
|
||||
"actions": [
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["a", "b", "c", "d", "e", "f"]
|
||||
},
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["1", "2", "3", "4", "5", "6"]
|
||||
},
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["!", "\"", "§", "$", "%", "&"]
|
||||
},
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["Z", "Y", "X", "W", "V", "U"]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"macro_no": 2,
|
||||
"actions": [
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["a"]
|
||||
},
|
||||
{
|
||||
"mod_keys": "",
|
||||
"delay": 0.0,
|
||||
"keys": ["1"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
#ifndef CONFIG_HANDLING_H_
|
||||
#define CONFIG_HANDLING_H_
|
||||
|
||||
/* config_handling.h */
|
||||
#include "../include/firmware_handling.h"
|
||||
|
||||
/* Read in a config file with the specified name. */
|
||||
prog_actionP *get_config(char *conf_name);
|
||||
|
||||
#endif /* CONFIG_HANDLING_H_ */
|
@ -0,0 +1,20 @@
|
||||
#include "../include/keycodes.h"
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef KEYCODE_CONV_H_
|
||||
#define KEYCODE_CONV_H_
|
||||
|
||||
typedef struct keyCode keyCode;
|
||||
struct keyCode {
|
||||
uint8_t key_code;
|
||||
const char *key_name;
|
||||
};
|
||||
|
||||
#define KEYCODE(KC) \
|
||||
{ KC, #KC }
|
||||
|
||||
uint8_t get_keycode_by_name(char *key_name);
|
||||
uint8_t get_modkeycode_by_name(char *modkey_name);
|
||||
|
||||
#endif /* KEYCODE_CONV_H_ */
|
@ -0,0 +1,90 @@
|
||||
#include <cjson/cJSON.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "../include/config_handling.h"
|
||||
#include "../include/keycodes_conv.h"
|
||||
|
||||
/* define declarations */
|
||||
#define JO_MACROS "macros"
|
||||
#define JO_MACRO_NO "macro_no"
|
||||
#define JO_ACTIONS "actions"
|
||||
#define JO_MOD_KEYS "mod_keys"
|
||||
#define JO_DELAY "delay"
|
||||
#define JO_KEYS "keys"
|
||||
|
||||
/* method declarations */
|
||||
char *read_in_config(char *conf_name);
|
||||
|
||||
prog_actionP *get_config(char *conf_name) {
|
||||
|
||||
const cJSON *macros = NULL;
|
||||
const cJSON *macro = NULL;
|
||||
|
||||
/* parse the read in config file */
|
||||
cJSON *config_json = cJSON_Parse(read_in_config(conf_name));
|
||||
if (config_json == NULL) {
|
||||
const char *error_ptr = cJSON_GetErrorPtr();
|
||||
if (error_ptr != NULL) {
|
||||
fprintf(stderr, "Error before: %s\n", error_ptr);
|
||||
}
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// READ IN VALUES //
|
||||
macros = cJSON_GetObjectItemCaseSensitive(config_json, JO_MACROS);
|
||||
cJSON_ArrayForEach(macro, macros) {
|
||||
//cJSON *macro_no = cJSON_GetObjectItemCaseSensitive(macro, JO_MACRO_NO);
|
||||
cJSON *action = NULL;
|
||||
|
||||
int i = 0;
|
||||
cJSON *actions = cJSON_GetObjectItemCaseSensitive(macro, JO_ACTIONS);
|
||||
cJSON_ArrayForEach(action, actions) {
|
||||
cJSON *mod_keys =
|
||||
cJSON_GetObjectItemCaseSensitive(action, JO_MOD_KEYS);
|
||||
//cJSON *delay = cJSON_GetObjectItemCaseSensitive(action, JO_DELAY);
|
||||
cJSON *keys = cJSON_GetObjectItemCaseSensitive(action, JO_KEYS);
|
||||
|
||||
prog_actionP pa = calloc(1, sizeof(*pa));
|
||||
pa->k_modifier = get_modkeycode_by_name(cJSON_GetStringValue(mod_keys));
|
||||
pa->k_delay = 0x00;
|
||||
pa->k_action1 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 0)));
|
||||
pa->k_action2 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 1)));
|
||||
pa->k_action3 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 2)));
|
||||
pa->k_action4 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 3)));
|
||||
pa->k_action5 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 4)));
|
||||
pa->k_action6 = get_keycode_by_name(
|
||||
cJSON_GetStringValue(cJSON_GetArrayItem(keys, 5)));
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *read_in_config(char *conf_name) {
|
||||
|
||||
FILE *fp = fopen(conf_name, "r");
|
||||
if (!fp) {
|
||||
perror("Error while reading conf file");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
struct stat sb;
|
||||
if (stat(conf_name, &sb) == -1) {
|
||||
perror("Error while reading config file metadata.\r\nExiting.");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
char *config = malloc(sb.st_size);
|
||||
fread(config, sb.st_size, 1, fp);
|
||||
|
||||
return config;
|
||||
}
|
@ -0,0 +1,268 @@
|
||||
#include "../include/keycodes_conv.h"
|
||||
|
||||
const keyCode keycodes[] = {
|
||||
|
||||
KEYCODE(KEY_ErrorRollOver),
|
||||
KEYCODE(KEY_POSTFail),
|
||||
KEYCODE(KEY_ErrorUndefined),
|
||||
KEYCODE(KEY_a_A),
|
||||
KEYCODE(KEY_b_B),
|
||||
KEYCODE(KEY_c_C),
|
||||
KEYCODE(KEY_d_D),
|
||||
KEYCODE(KEY_e_E),
|
||||
KEYCODE(KEY_f_F),
|
||||
KEYCODE(KEY_g_G),
|
||||
KEYCODE(KEY_h_H),
|
||||
KEYCODE(KEY_i_I),
|
||||
KEYCODE(KEY_j_J),
|
||||
KEYCODE(KEY_k_K),
|
||||
KEYCODE(KEY_l_L),
|
||||
KEYCODE(KEY_m_M),
|
||||
KEYCODE(KEY_n_N),
|
||||
KEYCODE(KEY_o_O),
|
||||
KEYCODE(KEY_p_P),
|
||||
KEYCODE(KEY_q_Q),
|
||||
KEYCODE(KEY_r_R),
|
||||
KEYCODE(KEY_s_S),
|
||||
KEYCODE(KEY_t_T),
|
||||
KEYCODE(KEY_u_U),
|
||||
KEYCODE(KEY_v_V),
|
||||
KEYCODE(KEY_w_W),
|
||||
KEYCODE(KEY_x_X),
|
||||
KEYCODE(KEY_y_Y),
|
||||
KEYCODE(KEY_z_Z),
|
||||
KEYCODE(KEY_1_Exclamation),
|
||||
KEYCODE(KEY_2_At),
|
||||
KEYCODE(KEY_3_Pound),
|
||||
KEYCODE(KEY_4_Dollar),
|
||||
KEYCODE(KEY_5_Percent),
|
||||
KEYCODE(KEY_6_Caret),
|
||||
KEYCODE(KEY_7_Ampersand),
|
||||
KEYCODE(KEY_8_Asterisk),
|
||||
KEYCODE(KEY_9_LeftParenthesis),
|
||||
KEYCODE(KEY_0_RightParenthesis),
|
||||
KEYCODE(KEY_ReturnEnter),
|
||||
KEYCODE(KEY_Escape),
|
||||
KEYCODE(KEY_DeleteBackspace),
|
||||
KEYCODE(KEY_Tab),
|
||||
KEYCODE(KEY_Spacebar),
|
||||
KEYCODE(KEY_Dash_Underscore),
|
||||
KEYCODE(KEY_Equal_Plus),
|
||||
KEYCODE(KEY_LeftBracket_LeftBrace),
|
||||
KEYCODE(KEY_RightBracket_RightBrace),
|
||||
KEYCODE(KEY_Backslash_Pipe),
|
||||
KEYCODE(KEY_NonUS_Pound_Tilde),
|
||||
KEYCODE(KEY_Semicolon_Colon),
|
||||
KEYCODE(KEY_SingleQuote_DoubleQuote),
|
||||
KEYCODE(KEY_GraveAccent_Tilde),
|
||||
KEYCODE(KEY_Comma_LessThan),
|
||||
KEYCODE(KEY_Period_GreaterThan),
|
||||
KEYCODE(KEY_Slash_Question),
|
||||
KEYCODE(KEY_CapsLock),
|
||||
KEYCODE(KEY_F1),
|
||||
KEYCODE(KEY_F2),
|
||||
KEYCODE(KEY_F3),
|
||||
KEYCODE(KEY_F4),
|
||||
KEYCODE(KEY_F5),
|
||||
KEYCODE(KEY_F6),
|
||||
KEYCODE(KEY_F7),
|
||||
KEYCODE(KEY_F8),
|
||||
KEYCODE(KEY_F9),
|
||||
KEYCODE(KEY_F10),
|
||||
KEYCODE(KEY_F11),
|
||||
KEYCODE(KEY_F12),
|
||||
KEYCODE(KEY_PrintScreen),
|
||||
KEYCODE(KEY_ScrollLock),
|
||||
KEYCODE(KEY_Pause),
|
||||
KEYCODE(KEY_Insert),
|
||||
KEYCODE(KEY_Home),
|
||||
KEYCODE(KEY_PageUp),
|
||||
KEYCODE(KEY_DeleteForward),
|
||||
KEYCODE(KEY_End),
|
||||
KEYCODE(KEY_PageDown),
|
||||
KEYCODE(KEY_RightArrow),
|
||||
KEYCODE(KEY_LeftArrow),
|
||||
KEYCODE(KEY_DownArrow),
|
||||
KEYCODE(KEY_UpArrow),
|
||||
KEYCODE(KEYPAD_NumLock_Clear),
|
||||
KEYCODE(KEYPAD_Slash),
|
||||
KEYCODE(KEYPAD_Asterisk),
|
||||
KEYCODE(KEYPAD_Minus),
|
||||
KEYCODE(KEYPAD_Plus),
|
||||
KEYCODE(KEYPAD_ENTER),
|
||||
KEYCODE(KEYPAD_1_End),
|
||||
KEYCODE(KEYPAD_2_DownArrow),
|
||||
KEYCODE(KEYPAD_3_PageDown),
|
||||
KEYCODE(KEYPAD_4_LeftArrow),
|
||||
KEYCODE(KEYPAD_5),
|
||||
KEYCODE(KEYPAD_6_RightArrow),
|
||||
KEYCODE(KEYPAD_7_Home),
|
||||
KEYCODE(KEYPAD_8_UpArrow),
|
||||
KEYCODE(KEYPAD_9_PageUp),
|
||||
KEYCODE(KEYPAD_0_Insert),
|
||||
KEYCODE(KEYPAD_Period_Delete),
|
||||
KEYCODE(KEY_NonUS_Backslash_Pipe),
|
||||
KEYCODE(KEY_Application),
|
||||
KEYCODE(KEY_Power),
|
||||
KEYCODE(KEYPAD_Equal),
|
||||
KEYCODE(KEY_F13),
|
||||
KEYCODE(KEY_F14),
|
||||
KEYCODE(KEY_F15),
|
||||
KEYCODE(KEY_F16),
|
||||
KEYCODE(KEY_F17),
|
||||
KEYCODE(KEY_F18),
|
||||
KEYCODE(KEY_F19),
|
||||
KEYCODE(KEY_F20),
|
||||
KEYCODE(KEY_F21),
|
||||
KEYCODE(KEY_F22),
|
||||
KEYCODE(KEY_F23),
|
||||
KEYCODE(KEY_F24),
|
||||
KEYCODE(KEY_Execute),
|
||||
KEYCODE(KEY_Help),
|
||||
KEYCODE(KEY_Menu),
|
||||
KEYCODE(KEY_Select),
|
||||
KEYCODE(KEY_Stop),
|
||||
KEYCODE(KEY_Again),
|
||||
KEYCODE(KEY_Undo),
|
||||
KEYCODE(KEY_Cut),
|
||||
KEYCODE(KEY_Copy),
|
||||
KEYCODE(KEY_Paste),
|
||||
KEYCODE(KEY_Find),
|
||||
KEYCODE(KEY_Mute),
|
||||
KEYCODE(KEY_VolumeUp),
|
||||
KEYCODE(KEY_VolumeDown),
|
||||
KEYCODE(KEY_LockingCapsLock),
|
||||
KEYCODE(KEY_LockingNumLock),
|
||||
KEYCODE(KEY_LockingScrollLock),
|
||||
KEYCODE(KEYPAD_Comma),
|
||||
KEYCODE(KEYPAD_EqualSign),
|
||||
KEYCODE(KEY_International1),
|
||||
KEYCODE(KEY_International2),
|
||||
KEYCODE(KEY_International3),
|
||||
KEYCODE(KEY_International4),
|
||||
KEYCODE(KEY_International5),
|
||||
KEYCODE(KEY_International6),
|
||||
KEYCODE(KEY_International7),
|
||||
KEYCODE(KEY_International8),
|
||||
KEYCODE(KEY_International9),
|
||||
KEYCODE(KEY_LANG1),
|
||||
KEYCODE(KEY_LANG2),
|
||||
KEYCODE(KEY_LANG3),
|
||||
KEYCODE(KEY_LANG4),
|
||||
KEYCODE(KEY_LANG5),
|
||||
KEYCODE(KEY_LANG6),
|
||||
KEYCODE(KEY_LANG7),
|
||||
KEYCODE(KEY_LANG8),
|
||||
KEYCODE(KEY_LANG9),
|
||||
KEYCODE(KEY_AlternateErase),
|
||||
KEYCODE(KEY_SysReq_Attention),
|
||||
KEYCODE(KEY_Cancel),
|
||||
KEYCODE(KEY_Clear),
|
||||
KEYCODE(KEY_Prior),
|
||||
KEYCODE(KEY_Return),
|
||||
KEYCODE(KEY_Separator),
|
||||
KEYCODE(KEY_Out),
|
||||
KEYCODE(KEY_Oper),
|
||||
KEYCODE(KEY_Clear_Again),
|
||||
KEYCODE(KEY_CrSel_Props),
|
||||
KEYCODE(KEY_ExSel),
|
||||
KEYCODE(KEYPAD_00),
|
||||
KEYCODE(KEYPAD_000),
|
||||
KEYCODE(KEY_ThousandsSeparator),
|
||||
KEYCODE(KEY_DecimalSeparator),
|
||||
KEYCODE(KEY_CurrencyUnit),
|
||||
KEYCODE(KEY_CurrencySubunit),
|
||||
KEYCODE(KEYPAD_LeftParenthesis),
|
||||
KEYCODE(KEYPAD_RightParenthesis),
|
||||
KEYCODE(KEYPAD_LeftBrace),
|
||||
KEYCODE(KEYPAD_RightBrace),
|
||||
KEYCODE(KEYPAD_Tab),
|
||||
KEYCODE(KEYPAD_Backspace),
|
||||
KEYCODE(KEYPAD_A),
|
||||
KEYCODE(KEYPAD_B),
|
||||
KEYCODE(KEYPAD_C),
|
||||
KEYCODE(KEYPAD_D),
|
||||
KEYCODE(KEYPAD_E),
|
||||
KEYCODE(KEYPAD_F),
|
||||
KEYCODE(KEYPAD_XOR),
|
||||
KEYCODE(KEYPAD_Caret),
|
||||
KEYCODE(KEYPAD_Percent),
|
||||
KEYCODE(KEYPAD_LessThan),
|
||||
KEYCODE(KEYPAD_GreaterThan),
|
||||
KEYCODE(KEYPAD_Ampersand),
|
||||
KEYCODE(KEYPAD_AmpersandAmpersand),
|
||||
KEYCODE(KEYPAD_Pipe),
|
||||
KEYCODE(KEYPAD_PipePipe),
|
||||
KEYCODE(KEYPAD_Colon),
|
||||
KEYCODE(KEYPAD_Pound),
|
||||
KEYCODE(KEYPAD_Space),
|
||||
KEYCODE(KEYPAD_At),
|
||||
KEYCODE(KEYPAD_Exclamation),
|
||||
KEYCODE(KEYPAD_MemoryStore),
|
||||
KEYCODE(KEYPAD_MemoryRecall),
|
||||
KEYCODE(KEYPAD_MemoryClear),
|
||||
KEYCODE(KEYPAD_MemoryAdd),
|
||||
KEYCODE(KEYPAD_MemorySubtract),
|
||||
KEYCODE(KEYPAD_MemoryMultiply),
|
||||
KEYCODE(KEYPAD_MemoryDivide),
|
||||
KEYCODE(KEYPAD_PlusMinus),
|
||||
KEYCODE(KEYPAD_Clear),
|
||||
KEYCODE(KEYPAD_ClearEntry),
|
||||
KEYCODE(KEYPAD_Binary),
|
||||
KEYCODE(KEYPAD_Octal),
|
||||
KEYCODE(KEYPAD_Decimal),
|
||||
KEYCODE(KEYPAD_Hexadecimal),
|
||||
KEYCODE(KEY_LeftControl),
|
||||
KEYCODE(KEY_LeftShift),
|
||||
KEYCODE(KEY_LeftAlt),
|
||||
KEYCODE(KEY_LeftGUI),
|
||||
KEYCODE(KEY_RightControl),
|
||||
KEYCODE(KEY_RightShift),
|
||||
KEYCODE(KEY_RightAlt),
|
||||
KEYCODE(KEY_RightGUI),
|
||||
};
|
||||
|
||||
const keyCode modkeycodes[] = {
|
||||
KEYCODE(MODKEY_LCTR),
|
||||
KEYCODE(MODKEY_LSHI),
|
||||
KEYCODE(MODKEY_LALT),
|
||||
KEYCODE(MODKEY_LWIN),
|
||||
KEYCODE(MODKEY_RCTR),
|
||||
KEYCODE(MODKEY_RSHI),
|
||||
KEYCODE(MODKEY_RALT),
|
||||
KEYCODE(MODKEY_RWIN),
|
||||
KEYCODE(MODKEY_RWIN_RSHI),
|
||||
KEYCODE(MODKEY_RWIN_RCTR),
|
||||
KEYCODE(MODKEY_RWIN_RALT),
|
||||
KEYCODE(MODKEY_RWIN_RCTR_RSHI),
|
||||
KEYCODE(MODKEY_RCTR_RALT),
|
||||
KEYCODE(MODKEY_RCTR_RSHI),
|
||||
KEYCODE(MODKEY_RALT_RSHI),
|
||||
KEYCODE(MODKEY_RALT_RCTR_RSHI),
|
||||
};
|
||||
|
||||
uint8_t get_keycode_by_name(char *key_name) {
|
||||
uint8_t keycode = -1;
|
||||
|
||||
for (int i = 0; i < (sizeof(keycodes) / sizeof(keycodes[0])); i++) {
|
||||
if (strcmp(keycodes[i].key_name, key_name) == 0) {
|
||||
keycode = keycodes[i].key_code;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return keycode;
|
||||
}
|
||||
|
||||
uint8_t get_modkeycode_by_name(char *modkey_name) {
|
||||
uint8_t keycode = -1;
|
||||
|
||||
for (int i = 0; i < (sizeof(modkeycodes) / sizeof(modkeycodes[0])); i++) {
|
||||
if (strcmp(modkeycodes[i].key_name, modkey_name) == 0) {
|
||||
keycode = modkeycodes[i].key_code;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return keycode;
|
||||
}
|
Loading…
Reference in New Issue