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.simple
###| CMAKE Kiibohd Controller KLL Configurator |### | ###| 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 | # 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 | #| 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 () | endforeach () | ||||
#| If set BaseMap cannot be found, use default map | #| If set BaseMap cannot be found, use default map |
###| CMAKE Kiibohd Controller Source Configurator |### | ###| 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 | # Released into the Public Domain | ||||
# | # | ||||
PathPrepend ( Module_SRCS ${ModulePath} ${Module_SRCS} ) | PathPrepend ( Module_SRCS ${ModulePath} ${Module_SRCS} ) | ||||
# Check the current scope to see if a sub-module added some source files | # 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 | # 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 .h files | ||||
add_definitions ( -I${ModuleFullPath} ) | add_definitions ( -I${ModuleFullPath} ) | ||||
endif () | endif () | ||||
endforeach () | 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}_SRCS ${${ModuleType}_SRCS} PARENT_SCOPE ) | ||||
set ( ${ModuleType}Module_KLL ${${ModuleType}Module_KLL} PARENT_SCOPE ) | |||||
endfunction () | endfunction () | ||||
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 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
* of this software and associated documentation files (the "Software"), to deal | * of this software and associated documentation files (the "Software"), to deal | ||||
Matrix_scanArray[ item ].prevState = KeyState_Off; | Matrix_scanArray[ item ].prevState = KeyState_Off; | ||||
Matrix_scanArray[ item ].curState = KeyState_Off; | Matrix_scanArray[ item ].curState = KeyState_Off; | ||||
Matrix_scanArray[ item ].activeCount = 0; | 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 | // Clear scan stats counters | ||||
if ( Matrix_pin( Matrix_rows[ sense ], Type_Sense ) ) | if ( Matrix_pin( Matrix_rows[ sense ], Type_Sense ) ) | ||||
{ | { | ||||
// Only update if not going to wrap around | // 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; | state->inactiveCount >>= 1; | ||||
} | } | ||||
// Signal Not Detected | // Signal Not Detected | ||||
else | else | ||||
{ | { | ||||
// Only update if not going to wrap around | // 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; | 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 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
* of this software and associated documentation files (the "Software"), to deal | * of this software and associated documentation files (the "Software"), to deal | ||||
// ----- Includes ----- | // ----- 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 ----- | // ----- Enums ----- | ||||
// Debounce Element | // Debounce Element | ||||
typedef struct KeyState { | typedef struct KeyState { | ||||
KeyPosition prevState; | |||||
KeyPosition curState; | |||||
uint16_t activeCount; | |||||
uint16_t inactiveCount; | |||||
KeyPosition prevState; | |||||
KeyPosition curState; | |||||
DebounceCounter activeCount; | |||||
DebounceCounter inactiveCount; | |||||
} KeyState; | } KeyState; | ||||