From a9c5898ba5fcb06f11ff97c4fe1fbafb836ebd87 Mon Sep 17 00:00:00 2001 From: Jacob Alexander Date: Sat, 28 Feb 2015 22:13:17 -0800 Subject: [PATCH] Adding configurable DebounceDivThreshold Can be specified from any .kll file DebounceDivThreshold = 0xFFFFFFFF Sets to max debounce, default is 0xFFFF. The 0xFFFFFFFF is about a 2x longer debounce The max requires more ram (as it uses 32 bit variables instead of 16). Added support for submodule capabilities files. --- Lib/CMake/kll.cmake | 14 +++++--------- Lib/CMake/modules.cmake | 17 ++++++++++++----- Scan/MatrixARM/capabilities.kll | 20 ++++++++++++++++++++ Scan/MatrixARM/matrix_scan.c | 8 ++++---- Scan/MatrixARM/matrix_scan.h | 27 ++++++++++++++++++++++----- 5 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 Scan/MatrixARM/capabilities.kll diff --git a/Lib/CMake/kll.cmake b/Lib/CMake/kll.cmake index 09ec0d1..5d007d2 100644 --- a/Lib/CMake/kll.cmake +++ b/Lib/CMake/kll.cmake @@ -1,6 +1,6 @@ ###| CMAKE Kiibohd Controller KLL Configurator |### # -# Written by Jacob Alexander in 2014 for the Kiibohd Controller +# Written by Jacob Alexander in 2014-2015 for the Kiibohd Controller # # Released into the Public Domain # @@ -46,14 +46,10 @@ endif () # kll/kll.py exists #| KLL_DEPENDS is used to build a dependency tree for kll.py, this way when files are changed, kll.py gets re-run -#| Search for capabilities.kll in each module directory -foreach ( DIR ${ScanModulePath} ${MacroModulePath} ${OutputModulePath} ${DebugModulePath} ) - # capabilities.kll exists, add to BaseMap - set ( filename "${PROJECT_SOURCE_DIR}/${DIR}/capabilities.kll" ) - if ( EXISTS ${filename} ) - set ( BaseMap_Args ${BaseMap_Args} ${filename} ) - set ( KLL_DEPENDS ${KLL_DEPENDS} ${filename} ) - endif () +#| Add each of the detected capabilities.kll +foreach ( filename ${ScanModule_KLL} ${MacroModule_KLL} ${OutputModule_KLL} ${DebugModule_KLL} ) + set ( BaseMap_Args ${BaseMap_Args} ${filename} ) + set ( KLL_DEPENDS ${KLL_DEPENDS} ${filename} ) endforeach () #| If set BaseMap cannot be found, use default map diff --git a/Lib/CMake/modules.cmake b/Lib/CMake/modules.cmake index 02ecbe8..e251aa1 100644 --- a/Lib/CMake/modules.cmake +++ b/Lib/CMake/modules.cmake @@ -1,6 +1,6 @@ ###| CMAKE Kiibohd Controller Source Configurator |### # -# Written by Jacob Alexander in 2011-2014 for the Kiibohd Controller +# Written by Jacob Alexander in 2011-2015 for the Kiibohd Controller # # Released into the Public Domain # @@ -104,10 +104,8 @@ function ( AddModule ModuleType ModuleName ) PathPrepend ( Module_SRCS ${ModulePath} ${Module_SRCS} ) # Check the current scope to see if a sub-module added some source files - set ( Module_SRCS ${${ModuleType}_SRCS} ${Module_SRCS} ) - # Append each of the sources to each type of module srcs list - set ( ${ModuleType}_SRCS ${Module_SRCS} ) + set ( ${ModuleType}_SRCS ${${ModuleType}_SRCS} ${Module_SRCS} ) # Add .h files add_definitions ( -I${ModuleFullPath} ) @@ -124,8 +122,17 @@ function ( AddModule ModuleType ModuleName ) endif () endforeach () - # Finally, add the sources to the parent scope (i.e. return) + # Check for any capabilities.kll files in the Module + set ( kll_capabilities_file "${ModuleFullPath}/capabilities.kll" ) + if ( EXISTS ${kll_capabilities_file} ) + # Add the kll file and any submodule kll files to the running list + set ( ${ModuleType}Module_KLL ${${ModuleType}Module_KLL} ${kll_capabilities_file} ) + endif () + + + # Finally, add the sources and kll files to the parent scope (i.e. return) set ( ${ModuleType}_SRCS ${${ModuleType}_SRCS} PARENT_SCOPE ) + set ( ${ModuleType}Module_KLL ${${ModuleType}Module_KLL} PARENT_SCOPE ) endfunction () diff --git a/Scan/MatrixARM/capabilities.kll b/Scan/MatrixARM/capabilities.kll new file mode 100644 index 0000000..319b81d --- /dev/null +++ b/Scan/MatrixARM/capabilities.kll @@ -0,0 +1,20 @@ +Name = MatrixArmCapabilities; +Version = 0.1; +Author = "HaaTa (Jacob Alexander) 2015"; +KLL = 0.3a; + +# Modified Date +Date = 2015-02-28; + +# Defines available to the MatrixArm sub-module +# This debounce scheme uses a rolling counter for press/unpress on each key +# Each counter is incremented if pressed/unpressed and the opposite counter is divided by 2 +# Using the default division threshold (0xFFFF), there are approximately 13 cycles in a perfect cycle +# If debounce is actually necessary, this will increase (better switches will debounce faster) +# +# The maximum threshold is 0xFFFFFFFF, which will give around ~32 -> 36 cycles per perfect cycle +# Using a threshold higher than 0xFFFF will require 32 bit variables, and double the ram usage. +DebounceDivThreshold => DebounceDivThreshold_define; +DebounceDivThreshold = 0xFFFF; # Default debounce +#DebounceDivThreshold = 0xFFFFFFFF; # Max debounce + diff --git a/Scan/MatrixARM/matrix_scan.c b/Scan/MatrixARM/matrix_scan.c index b336efe..eaea368 100644 --- a/Scan/MatrixARM/matrix_scan.c +++ b/Scan/MatrixARM/matrix_scan.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 by Jacob Alexander +/* Copyright (C) 2014-2015 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -191,7 +191,7 @@ void Matrix_setup() Matrix_scanArray[ item ].prevState = KeyState_Off; Matrix_scanArray[ item ].curState = KeyState_Off; Matrix_scanArray[ item ].activeCount = 0; - Matrix_scanArray[ item ].inactiveCount = 0xFFFF; // Start at 'off' steady state + Matrix_scanArray[ item ].inactiveCount = DebounceDivThreshold_define; // Start at 'off' steady state } // Clear scan stats counters @@ -275,14 +275,14 @@ void Matrix_scan( uint16_t scanNum ) if ( Matrix_pin( Matrix_rows[ sense ], Type_Sense ) ) { // Only update if not going to wrap around - if ( state->activeCount < 0xFFFF ) state->activeCount += 1; + if ( state->activeCount < DebounceDivThreshold_define ) state->activeCount += 1; state->inactiveCount >>= 1; } // Signal Not Detected else { // Only update if not going to wrap around - if ( state->inactiveCount < 0xFFFF ) state->inactiveCount += 1; + if ( state->inactiveCount < DebounceDivThreshold_define ) state->inactiveCount += 1; state->activeCount >>= 1; } diff --git a/Scan/MatrixARM/matrix_scan.h b/Scan/MatrixARM/matrix_scan.h index 487abef..13839a1 100644 --- a/Scan/MatrixARM/matrix_scan.h +++ b/Scan/MatrixARM/matrix_scan.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2014 by Jacob Alexander +/* Copyright (C) 2014-2015 by Jacob Alexander * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,23 @@ // ----- Includes ----- +// KLL Generated Defines +#include + + + +// ----- Defines ----- + +#if ( DebounceDivThreshold_define < 0xFF + 1 ) +#define DebounceCounter uint8_t +#elif ( DebounceDivThreshold_define < 0xFFFF + 1 ) +#define DebounceCounter uint16_t +#elif ( DebounceDivThreshold_define < 0xFFFFFFFF + 1 ) +#define DebounceCounter uint32_t +#else +#error "Debounce threshold is too high... 32 bit max. Check .kll defines." +#endif + // ----- Enums ----- @@ -110,10 +127,10 @@ typedef struct GPIO_Pin { // Debounce Element typedef struct KeyState { - KeyPosition prevState; - KeyPosition curState; - uint16_t activeCount; - uint16_t inactiveCount; + KeyPosition prevState; + KeyPosition curState; + DebounceCounter activeCount; + DebounceCounter inactiveCount; } KeyState;