diff --git a/CMakeLists.txt b/CMakeLists.txt index f34a8f6..f4da08b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,11 +2,6 @@ cmake_minimum_required(VERSION 3.12) project(squirrel) -# target_compile_definitions(squirrel PUBLIC SQUIRREL_KEYCOUNT=your_keycount) -# Override this using the above line in your build of the library! Otherwise, it -# will default to 1 key. -add_compile_definitions(SQUIRREL_KEYCOUNT=1) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) add_compile_options(-Og) diff --git a/flake.nix b/flake.nix index 8091893..729895a 100644 --- a/flake.nix +++ b/flake.nix @@ -19,8 +19,6 @@ gcovr ]; }; - # Reminder! If you want to use SQUIRREL as a library in one of your projects, you MUST build it yourself by adding the directory to your project with CMAKE and changing SQUIRREL_KEYCOUNT, for example: - # add_compile_definitions(SQUIRREL_KEYCOUNT=100) packages.squirrel = pkgs.stdenv.mkDerivation { name = "squirrel"; src = ./.; diff --git a/include/squirrel.h b/include/squirrel.h index 80ce830..a9210dd 100644 --- a/include/squirrel.h +++ b/include/squirrel.h @@ -5,6 +5,7 @@ enum squirrel_error { ERR_NONE = 0, + ERR_OOM, ERR_PASSTHROUGH_ON_BOTTOM_LAYER, }; diff --git a/include/squirrel_init.h b/include/squirrel_init.h index 3cd30ef..42d480b 100644 --- a/include/squirrel_init.h +++ b/include/squirrel_init.h @@ -1,4 +1,4 @@ #pragma once -enum squirrel_error -squirrel_init(void); // Initialize the keyboard with the total number of keys. +enum squirrel_error squirrel_init( + int keys); // Initialize the keyboard with the total number of keys. diff --git a/include/squirrel_key.h b/include/squirrel_key.h index 49b8daa..7256dd4 100644 --- a/include/squirrel_key.h +++ b/include/squirrel_key.h @@ -23,7 +23,7 @@ release_key(uint8_t key_index); // Release the key at the index in the // key_states is an array of booleans that represent the state of each key. Used // by check_key to determine if a key is pressed or released. -extern bool key_states[SQUIRREL_KEYCOUNT]; +extern bool *key_states; // check_key compares the state of the key at the index to the key_states array // to determine if the key is pressed or released, and calls the appropriate diff --git a/include/squirrel_quantum.h b/include/squirrel_quantum.h index 7702591..8571c3f 100644 --- a/include/squirrel_quantum.h +++ b/include/squirrel_quantum.h @@ -9,7 +9,7 @@ struct layer { bool active; // true if this layer is currently active - struct key keys[SQUIRREL_KEYCOUNT]; + struct key *keys; }; // layers is a list of all the layers in the keyboard. 0-15 are configured, diff --git a/src/squirrel_init.c b/src/squirrel_init.c index 01807e9..d6c2d94 100644 --- a/src/squirrel_init.c +++ b/src/squirrel_init.c @@ -7,17 +7,27 @@ #include #include -enum squirrel_error squirrel_init(void) { +enum squirrel_error squirrel_init(int keys) { struct key passthrough_key = (struct key){ .pressed = quantum_passthrough_press, .released = quantum_passthrough_release, }; for (int j = 16; j >= 0; j--) { layers[j].active = false; - for (int i = 0; i < SQUIRREL_KEYCOUNT; i++) { + layers[j].keys = malloc(sizeof(struct key) * keys); + if (layers[j].keys == NULL) { + return ERR_OOM; + } + for (int i = 0; i < keys; i++) { copy_key(&passthrough_key, &layers[j].keys[i]); } } layers[16].active = true; + key_states = malloc(sizeof(bool) * keys); + + if (key_states == NULL) { + return ERR_OOM; + } + return ERR_NONE; }; diff --git a/src/squirrel_key.c b/src/squirrel_key.c index 57d027f..91a78f1 100644 --- a/src/squirrel_key.c +++ b/src/squirrel_key.c @@ -52,7 +52,7 @@ enum squirrel_error release_key(uint8_t key_index) { return ERR_NONE; } -bool key_states[SQUIRREL_KEYCOUNT]; +bool *key_states; enum squirrel_error check_key(uint8_t key_index, bool is_pressed) { if (key_states[key_index] == is_pressed) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1150de6..ea6f51d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,23 +4,27 @@ enable_testing() list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules") if(CMAKE_COMPILER_IS_GNUCXX) - include(CodeCoverage) - APPEND_COVERAGE_COMPILER_FLAGS() - setup_target_for_coverage_gcovr_html(squirrel squirrel_test coverage) - list(APPEND GCOVR_EXCLUDES "tests/") + include(CodeCoverage) + append_coverage_compiler_flags() + setup_target_for_coverage_gcovr_html(squirrel squirrel_test coverage) + list(APPEND GCOVR_EXCLUDES "tests/") endif() add_executable(keyboard_press_release tests/keyboard_press_release.c) target_link_libraries(keyboard_press_release squirrel) add_test(NAME keyboard_press_release COMMAND keyboard_press_release) -add_executable(keyboard_modifier_press_release tests/keyboard_modifier_press_release.c) +add_executable(keyboard_modifier_press_release + tests/keyboard_modifier_press_release.c) target_link_libraries(keyboard_modifier_press_release squirrel) -add_test(NAME keyboard_modifier_press_release COMMAND keyboard_modifier_press_release) +add_test(NAME keyboard_modifier_press_release + COMMAND keyboard_modifier_press_release) -add_executable(quantum_passthrough_press_release tests/quantum_passthrough_press_release.c) +add_executable(quantum_passthrough_press_release + tests/quantum_passthrough_press_release.c) target_link_libraries(quantum_passthrough_press_release squirrel) -add_test(NAME quantum_passthrough_press_release COMMAND quantum_passthrough_press_release) +add_test(NAME quantum_passthrough_press_release + COMMAND quantum_passthrough_press_release) add_executable(keyboard_get_keycodes tests/keyboard_get_keycodes.c) target_link_libraries(keyboard_get_keycodes squirrel) @@ -38,19 +42,24 @@ add_executable(layer_press_release tests/layer_press_release.c) target_link_libraries(layer_press_release squirrel) add_test(NAME layer_press_release COMMAND layer_press_release) -add_executable(consumer_activate_deactivate_get_consumer_code tests/consumer_activate_deactivate_get_consumer_code.c) +add_executable(consumer_activate_deactivate_get_consumer_code + tests/consumer_activate_deactivate_get_consumer_code.c) target_link_libraries(consumer_activate_deactivate_get_consumer_code squirrel) -add_test(NAME consumer_activate_deactivate_get_consumer_code COMMAND consumer_activate_deactivate_get_consumer_code) +add_test(NAME consumer_activate_deactivate_get_consumer_code + COMMAND consumer_activate_deactivate_get_consumer_code) -add_executable(keyboard_activate_deactivate_keycode tests/keyboard_activate_deactivate_keycode.c) +add_executable(keyboard_activate_deactivate_keycode + tests/keyboard_activate_deactivate_keycode.c) target_link_libraries(keyboard_activate_deactivate_keycode squirrel) -add_test(NAME keyboard_activate_deactivate_keycode COMMAND keyboard_activate_deactivate_keycode) +add_test(NAME keyboard_activate_deactivate_keycode + COMMAND keyboard_activate_deactivate_keycode) -add_executable(keyboard_activate_deactivate_get_modifier tests/keyboard_activate_deactivate_get_modifier.c) +add_executable(keyboard_activate_deactivate_get_modifier + tests/keyboard_activate_deactivate_get_modifier.c) target_link_libraries(keyboard_activate_deactivate_get_modifier squirrel) -add_test(NAME keyboard_activate_deactivate_get_modifier COMMAND keyboard_activate_deactivate_get_modifier) +add_test(NAME keyboard_activate_deactivate_get_modifier + COMMAND keyboard_activate_deactivate_get_modifier) add_executable(keymap tests/keymap.c) target_link_libraries(keymap squirrel) -target_compile_definitions(keymap PRIVATE SQUIRREL_KEYCOUNT=2) add_test(NAME keymap COMMAND keymap) diff --git a/tests/key.c b/tests/key.c index 6501525..d4c9966 100644 --- a/tests/key.c +++ b/tests/key.c @@ -28,10 +28,8 @@ enum squirrel_error test_release(uint8_t layer, uint8_t key_index, void *arg) { } // test: press_key, release_key + check_key - in squirrel_key.c -#define SQUIRREL_KEYCOUNT 1 - int main() { - squirrel_init(); + squirrel_init(1); // press_key + release_key uint8_t code = 0xF0; diff --git a/tests/layer_press_release.c b/tests/layer_press_release.c index 2645b84..196022e 100644 --- a/tests/layer_press_release.c +++ b/tests/layer_press_release.c @@ -13,9 +13,8 @@ // layer_solo_press // layer_solo_release // in squirrel_quantum.c -#define SQUIRREL_KEYCOUNT 1 int main() { - squirrel_init(); + squirrel_init(1); enum squirrel_error err; struct key test_key; diff --git a/tests/quantum_passthrough_press_release.c b/tests/quantum_passthrough_press_release.c index 1e619ab..bddec0f 100644 --- a/tests/quantum_passthrough_press_release.c +++ b/tests/quantum_passthrough_press_release.c @@ -31,9 +31,8 @@ enum squirrel_error bad_test_release(uint8_t layer, uint8_t key_index, // test: quantum_passthrough_press + quantum_passthrough_release test - in // squirrel_quantum.c -#define SQUIRREL_KEYCOUNT 1 int main() { - squirrel_init(); + squirrel_init(1); struct key testkey; testkey.pressed = test_press;