17 Commits

Author SHA1 Message Date
László Monda
1fbbeb0f33 Bump firmware version to 8.4.0, update changelog, package.json, versions.h 2018-07-24 15:30:18 +02:00
László Monda
456f0e9e58 Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-07-24 14:50:53 +02:00
László Monda
0248a0e79f Set debounce press and release time to 50ms by default. 2018-07-24 14:50:16 +02:00
Eric Tang
0e5ec29433 Tweak the logic of the USB stack test 2018-07-22 21:22:48 -07:00
László Monda
5ac10fabcb Add back simulateKeypresses. 2018-07-22 16:24:05 +02:00
László Monda
b11017609d Merge pull request #143 from UltimateHackingKeyboard/usb-variables
Expose variables via USB
2018-07-22 16:04:55 +02:00
Eric Tang
c3a5d258e5 Rename the test mode for clarity 2018-07-20 17:31:00 -07:00
Eric Tang
a2866feb77 Temporarily allow the USB stack test to be activated through USB 2018-07-20 17:23:44 -07:00
Eric Tang
8c50192d6c Introduce a new way of activating the test mode 2018-07-20 17:17:59 -07:00
Eric Tang
63d82d92db Expose variables via USB 2018-07-20 17:17:30 -07:00
László Monda
1bced1be13 Merge branch 'debounce-configuration' 2018-07-16 18:24:38 +02:00
Eric Tang
86196d438c Add a test mode 2018-07-05 20:15:33 -07:00
Eric Tang
d722b3d173 Make debounce times configurable on the fly 2018-07-05 14:41:19 -07:00
Eric Tang
2ef5c49090 Merge branch 'interrupt-removal' 2018-07-05 14:34:33 -07:00
Eric Tang
5a137392ee Remove the key scanning interrupt 2018-07-05 12:43:38 -07:00
Eric Tang
27d12ea31f Remove the debouncing interrupt 2018-07-05 12:33:55 -07:00
Eric Tang
9ba09ec8eb Convert key_state_t to a bit field 2018-07-05 11:50:13 -07:00
27 changed files with 277 additions and 143 deletions

View File

@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.4.0] - 2018-07-24
Device Protocol: 4.**4.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Rewrite the key debouncer and set the press and release timeouts to 50ms.
- Add hardcoded test keymap.
- Make debounce timeouts configurable via USB. `DEVICEPROTOCOL:MINOR`
- Make the hardcoded test keymap able to trigger via USB. `DEVICEPROTOCOL:MINOR`
- Allow the USB stack test mode to be activated via USB. `DEVICEPROTOCOL:MINOR`
## [8.3.3] - 2018-07-03
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0

View File

@@ -12,7 +12,6 @@
#include "init_peripherals.h"
#include "eeprom.h"
#include "timer.h"
#include "key_debouncer.h"
#include "usb_api.h"
#include "slave_scheduler.h"
#include "bootloader/wormhole.h"
@@ -66,8 +65,6 @@ static void initInterruptPriorities(void)
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
NVIC_SetPriority(PIT_KEY_SCANNER_IRQ_ID, 4);
NVIC_SetPriority(PIT_KEY_DEBOUNCER_IRQ_ID, 4);
NVIC_SetPriority(I2C_MAIN_BUS_IRQ_ID, 4);
NVIC_SetPriority(USB_IRQ_ID, 4);
}
@@ -159,6 +156,5 @@ void InitPeripherals(void)
TestLed_Init();
LedPwm_Init();
InitI2cWatchdog();
InitKeyDebouncer();
EEPROM_Init();
}

View File

@@ -1,32 +0,0 @@
#include "key_debouncer.h"
#include "fsl_pit.h"
#include "slot.h"
#include "module.h"
#include "key_states.h"
#include "peripherals/test_led.h"
void PIT_KEY_DEBOUNCER_HANDLER(void)
{
TestLed_Toggle();
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
uint8_t *debounceCounter = &KeyStates[slotId][keyId].debounceCounter;
if (*debounceCounter) {
--(*debounceCounter);
}
}
}
PIT_ClearStatusFlags(PIT, PIT_KEY_DEBOUNCER_CHANNEL, PIT_TFLG_TIF_MASK);
}
void InitKeyDebouncer(void)
{
pit_config_t pitConfig;
PIT_GetDefaultConfig(&pitConfig);
PIT_Init(PIT, &pitConfig);
PIT_SetTimerPeriod(PIT, PIT_KEY_DEBOUNCER_CHANNEL, MSEC_TO_COUNT(KEY_DEBOUNCER_INTERVAL_MSEC, PIT_SOURCE_CLOCK));
PIT_EnableInterrupts(PIT, PIT_KEY_DEBOUNCER_CHANNEL, kPIT_TimerInterruptEnable);
EnableIRQ(PIT_KEY_DEBOUNCER_IRQ_ID);
PIT_StartTimer(PIT, PIT_KEY_DEBOUNCER_CHANNEL);
}

View File

@@ -1,18 +0,0 @@
#ifndef __KEY_DEBOUNCER_H__
#define __KEY_DEBOUNCER_H__
// Includes:
#include "peripherals/pit.h"
#include "fsl_common.h"
// Macros:
#define KEY_DEBOUNCER_INTERVAL_MSEC 1
#define KEY_DEBOUNCER_TIMEOUT_MSEC 100
// Functions:
void InitKeyDebouncer(void);
#endif

View File

@@ -1,22 +0,0 @@
#include "fsl_pit.h"
#include "key_scanner.h"
uint32_t KeyScannerCounter;
void PIT_KEY_SCANNER_HANDLER(void)
{
KeyMatrix_ScanRow(&RightKeyMatrix);
KeyScannerCounter++;
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
}
void InitKeyScanner(void)
{
pit_config_t pitConfig;
PIT_GetDefaultConfig(&pitConfig);
PIT_Init(PIT, &pitConfig);
PIT_SetTimerPeriod(PIT, PIT_KEY_SCANNER_CHANNEL, USEC_TO_COUNT(KEY_SCANNER_INTERVAL_USEC, PIT_SOURCE_CLOCK));
PIT_EnableInterrupts(PIT, PIT_KEY_SCANNER_CHANNEL, kPIT_TimerInterruptEnable);
EnableIRQ(PIT_KEY_SCANNER_IRQ_ID);
PIT_StartTimer(PIT, PIT_KEY_SCANNER_CHANNEL);
}

View File

@@ -1,21 +0,0 @@
#ifndef __KEY_SCANNER_H__
#define __KEY_SCANNER_H__
// Includes:
#include "peripherals/pit.h"
#include "right_key_matrix.h"
// Macros:
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
// Variables:
extern uint32_t KeyScannerCounter;
// Functions:
void InitKeyScanner(void);
#endif

View File

@@ -10,10 +10,11 @@
// Typedefs:
typedef struct {
bool previous;
bool current;
bool suppressed;
uint8_t debounceCounter;
uint8_t timestamp;
bool previous : 1;
bool current : 1;
bool suppressed : 1;
bool debouncing : 1;
} key_state_t;
// Variables:

View File

@@ -6,7 +6,7 @@
#include "bus_pal_hardware.h"
#include "command.h"
#include "eeprom.h"
#include "key_scanner.h"
#include "right_key_matrix.h"
#include "usb_commands/usb_command_apply_config.h"
#include "peripherals/reset_button.h"
#include "config_parser/config_globals.h"
@@ -44,7 +44,6 @@ int main(void)
} else {
InitSlaveScheduler();
KeyMatrix_Init(&RightKeyMatrix);
InitKeyScanner();
InitUsb();
while (1) {
@@ -52,6 +51,8 @@ int main(void)
UsbCommand_ApplyConfig();
IsConfigInitialized = true;
}
KeyMatrix_ScanRow(&RightKeyMatrix);
++MatrixScanCounter;
UpdateUsbReports();
__WFI();
}

View File

@@ -17,12 +17,4 @@
#define PIT_TIMER_IRQ_ID PIT1_IRQn
#define PIT_TIMER_CHANNEL kPIT_Chnl_1
#define PIT_KEY_SCANNER_HANDLER PIT2_IRQHandler
#define PIT_KEY_SCANNER_IRQ_ID PIT2_IRQn
#define PIT_KEY_SCANNER_CHANNEL kPIT_Chnl_2
#define PIT_KEY_DEBOUNCER_HANDLER PIT3_IRQHandler
#define PIT_KEY_DEBOUNCER_IRQ_ID PIT3_IRQn
#define PIT_KEY_DEBOUNCER_CHANNEL kPIT_Chnl_3
#endif

View File

@@ -1,5 +1,7 @@
#include "right_key_matrix.h"
uint32_t MatrixScanCounter;
key_matrix_t RightKeyMatrix = {
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,

View File

@@ -14,5 +14,6 @@
// Variables:
extern key_matrix_t RightKeyMatrix;
extern uint32_t MatrixScanCounter;
#endif

113
right/src/test_switches.c Normal file
View File

@@ -0,0 +1,113 @@
#include "test_switches.h"
#include "led_display.h"
#include "key_action.h"
#include "keymap.h"
bool TestSwitches = false;
static const key_action_t TestKeymap[1][2][MAX_KEY_COUNT_PER_MODULE] = {
// Base layer
{
// Right keyboard half
{
// Row 1
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_7_AND_AMPERSAND } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_8_AND_ASTERISK } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_EQUAL_AND_PLUS } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_BACKSPACE } },
// Row 2
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_U } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_I } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_O } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_P } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_BACKSLASH_AND_PIPE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Y } },
// Row 3
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_J } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_K } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_L } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SEMICOLON_AND_COLON } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_PLUS } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_H } },
// Row 4
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_N } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_M } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT } },
{ .type = KeyActionType_None },
// Row 5
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_ASTERISK } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_7_AND_HOME } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT } },
},
// Left keyboard half
{
// Row 1
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_1_AND_EXCLAMATION } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_2_AND_AT } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_3_AND_HASHMARK } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_4_AND_DOLLAR } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_5_AND_PERCENTAGE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_6_AND_CARET } },
// Row 2
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_ESCAPE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Q } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_W } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_E } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_R } },
{ .type = KeyActionType_None },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_T } },
// Row 3
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_MINUS } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_A } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_S } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_D } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_F } },
{ .type = KeyActionType_None },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_G } },
// Row 4
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_SHIFT } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_Z } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_X } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_C } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_V } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_B } },
// Row 5
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_1_AND_END } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_SLASH } },
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_KEYPAD_5 } },
{ .type = KeyActionType_None },
}
}
};
void TestSwitches_Activate(void)
{
memcpy(&CurrentKeymap, &TestKeymap, sizeof TestKeymap);
LedDisplay_SetText(3, "TES");
}

16
right/src/test_switches.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef __TEST_MODE_H__
#define __TEST_MODE_H__
// Includes:
#include <stdbool.h>
// Functions:
void TestSwitches_Activate(void);
// Variables:
extern bool TestSwitches;
#endif

View File

@@ -5,7 +5,7 @@
#include "i2c_watchdog.h"
#include "buffer.h"
#include "timer.h"
#include "key_scanner.h"
#include "right_key_matrix.h"
#include "usb_report_updater.h"
#include "usb_interfaces/usb_interface_basic_keyboard.h"
#include "usb_interfaces/usb_interface_media_keyboard.h"
@@ -20,7 +20,7 @@ void UsbCommand_GetDebugBuffer(void)
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
SetDebugBufferUint32(17, KeyScannerCounter);
SetDebugBufferUint32(17, MatrixScanCounter);
SetDebugBufferUint32(21, UsbReportUpdateCounter);
SetDebugBufferUint32(25, Timer_GetCurrentTime());
SetDebugBufferUint32(29, UsbGenericHidActionCounter);

View File

@@ -0,0 +1,25 @@
#include "usb_protocol_handler.h"
#include "usb_commands/usb_command_get_variable.h"
#include "key_matrix.h"
#include "test_switches.h"
#include "usb_report_updater.h"
void UsbCommand_GetVariable(void)
{
usb_variable_id_t variableId = GetUsbRxBufferUint8(1);
switch (variableId) {
case UsbVariable_TestSwitches:
SetUsbTxBufferUint8(1, TestSwitches);
break;
case UsbVariable_TestUsbStack:
SetUsbTxBufferUint8(1, TestUsbStack);
break;
case UsbVariable_DebounceTimePress:
SetUsbTxBufferUint8(1, DebounceTimePress);
break;
case UsbVariable_DebounceTimeRelease:
SetUsbTxBufferUint8(1, DebounceTimeRelease);
break;
}
}

View File

@@ -0,0 +1,8 @@
#ifndef __USB_COMMAND_GET_VARIABLE_H__
#define __USB_COMMAND_GET_VARIABLE_H__
// Functions:
void UsbCommand_GetVariable(void);
#endif

View File

@@ -0,0 +1,28 @@
#include "usb_protocol_handler.h"
#include "usb_commands/usb_command_set_variable.h"
#include "key_matrix.h"
#include "test_switches.h"
#include "usb_report_updater.h"
void UsbCommand_SetVariable(void)
{
usb_variable_id_t variableId = GetUsbRxBufferUint8(1);
switch (variableId) {
case UsbVariable_TestSwitches:
if (GetUsbRxBufferUint8(2)) {
TestSwitches = true;
TestSwitches_Activate();
}
break;
case UsbVariable_TestUsbStack:
TestUsbStack = GetUsbRxBufferUint8(2);
break;
case UsbVariable_DebounceTimePress:
DebounceTimePress = GetUsbRxBufferUint8(2);
break;
case UsbVariable_DebounceTimeRelease:
DebounceTimeRelease = GetUsbRxBufferUint8(2);
break;
}
}

View File

@@ -0,0 +1,8 @@
#ifndef __USB_COMMAND_SET_VARIABLE_H__
#define __USB_COMMAND_SET_VARIABLE_H__
// Functions:
void UsbCommand_SetVariable(void);
#endif

View File

@@ -17,6 +17,8 @@
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
#include "usb_commands/usb_command_switch_keymap.h"
#include "usb_commands/usb_command_get_variable.h"
#include "usb_commands/usb_command_set_variable.h"
void UsbProtocolHandler(void)
{
@@ -77,6 +79,12 @@ void UsbProtocolHandler(void)
case UsbCommandId_SwitchKeymap:
UsbCommand_SwitchKeymap();
break;
case UsbCommandId_GetVariable:
UsbCommand_GetVariable();
break;
case UsbCommandId_SetVariable:
UsbCommand_SetVariable();
break;
default:
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
break;

View File

@@ -34,8 +34,17 @@
UsbCommandId_GetSlaveI2cErrors = 0x0f,
UsbCommandId_SetI2cBaudRate = 0x10,
UsbCommandId_SwitchKeymap = 0x11,
UsbCommandId_GetVariable = 0x12,
UsbCommandId_SetVariable = 0x13,
} usb_command_id_t;
typedef enum {
UsbVariable_TestSwitches,
UsbVariable_TestUsbStack,
UsbVariable_DebounceTimePress,
UsbVariable_DebounceTimeRelease
} usb_variable_id_t;
typedef enum {
UsbStatusCode_Success = 0,
UsbStatusCode_InvalidCommand = 1,

View File

@@ -13,7 +13,6 @@
#include "layer.h"
#include "usb_report_updater.h"
#include "timer.h"
#include "key_debouncer.h"
#include "config_parser/parse_keymap.h"
#include "usb_commands/usb_command_get_debug_buffer.h"
#include "arduino_hid/ConsumerAPI.h"
@@ -25,6 +24,7 @@ uint16_t DoubleTapSwitchLayerTimeout = 150;
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
bool TestUsbStack = false;
volatile uint8_t UsbReportUpdateSemaphore = 0;
@@ -323,37 +323,39 @@ static void updateActiveUsbReports(void)
bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
LedDisplay_SetLayer(activeLayer);
#if 0 // Used to toggle key presses at the maximum rate - this was used to reproduce: https://github.com/UltimateHackingKeyboard/firmware/issues/122
static bool simulateKeypresses = false;
static bool isEven = false;
static bool isEvenMedia = false;
static uint32_t mediaCounter = 0;
if (TestUsbStack) {
static bool simulateKeypresses, isEven, isEvenMedia;
static uint32_t mediaCounter = 0;
key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0];
key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0];
if (!testKeyState->previous && testKeyState->current && activeLayer == LayerId_Fn) {
simulateKeypresses = !simulateKeypresses;
}
if (simulateKeypresses) {
isEven = !isEven;
ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = isEven ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE;
if (++mediaCounter % 200 == 0) {
isEvenMedia = !isEvenMedia;
ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP;
if (activeLayer == LayerId_Fn && testKeyState->current && !testKeyState->previous) {
simulateKeypresses = !simulateKeypresses;
}
if (simulateKeypresses) {
isEven = !isEven;
ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = isEven ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE;
if (++mediaCounter % 200 == 0) {
isEvenMedia = !isEvenMedia;
ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP;
}
MouseMoveState.xOut = isEven ? -1 : 1;
}
MouseMoveState.xOut = isEven ? -1 : 1;
}
#endif
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
key_state_t *keyState = &KeyStates[slotId][keyId];
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
if (keyState->debounceCounter) {
keyState->current = keyState->previous;
} else if (!keyState->previous && keyState->current) {
keyState->debounceCounter = KEY_DEBOUNCER_TIMEOUT_MSEC + 1;
if (keyState->debouncing) {
if ((uint8_t)(Timer_GetCurrentTime() - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) {
keyState->debouncing = false;
} else {
keyState->current = keyState->previous;
}
} else if (keyState->previous != keyState->current) {
keyState->timestamp = Timer_GetCurrentTime();
keyState->debouncing = true;
}
if (keyState->current) {

View File

@@ -71,6 +71,7 @@
extern mouse_kinetic_state_t MouseScrollState;
extern uint32_t UsbReportUpdateCounter;
extern volatile uint8_t UsbReportUpdateSemaphore;
extern bool TestUsbStack;
// Functions:

View File

@@ -15,8 +15,8 @@
"commander": "^2.11.0",
"shelljs": "^0.7.8"
},
"firmwareVersion": "8.3.3",
"deviceProtocolVersion": "4.3.1",
"firmwareVersion": "8.4.0",
"deviceProtocolVersion": "4.4.0",
"moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.1.0",
"hardwareConfigVersion": "1.0.0",

View File

@@ -1,6 +1,8 @@
#include "fsl_gpio.h"
#include "key_matrix.h"
uint8_t DebounceTimePress = 50, DebounceTimeRelease = 50;
void KeyMatrix_Init(key_matrix_t *keyMatrix)
{
for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) {

View File

@@ -28,6 +28,10 @@
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
} key_matrix_t;
// Variables:
extern uint8_t DebounceTimePress, DebounceTimeRelease;
// Functions:
void KeyMatrix_Init(key_matrix_t *keyMatrix);

View File

@@ -19,12 +19,12 @@
// Variables:
#define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 3
#define FIRMWARE_PATCH_VERSION 3
#define FIRMWARE_MINOR_VERSION 4
#define FIRMWARE_PATCH_VERSION 0
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 3
#define DEVICE_PROTOCOL_PATCH_VERSION 1
#define DEVICE_PROTOCOL_MINOR_VERSION 4
#define DEVICE_PROTOCOL_PATCH_VERSION 0
#define MODULE_PROTOCOL_MAJOR_VERSION 4
#define MODULE_PROTOCOL_MINOR_VERSION 0