###| 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
#
#| 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
###| 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
#
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} )
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 ()
--- /dev/null
+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
+
-/* 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
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
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;
}
-/* 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
// ----- Includes -----
+// KLL Generated Defines
+#include <kll_defs.h>
+
+
+
+// ----- 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 -----
// Debounce Element
typedef struct KeyState {
- KeyPosition prevState;
- KeyPosition curState;
- uint16_t activeCount;
- uint16_t inactiveCount;
+ KeyPosition prevState;
+ KeyPosition curState;
+ DebounceCounter activeCount;
+ DebounceCounter inactiveCount;
} KeyState;