11 Commits

Author SHA1 Message Date
László Monda
28f5999cbb Bump firmware version to 8.4.2, update changelog and versions.h 2018-08-02 13:00:31 +02:00
László Monda
fe7505a2df Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-08-02 12:51:22 +02:00
László Monda
b6ac16074c Merge pull request #149 from UltimateHackingKeyboard/secondary-role
Fix various secondary role bugs
2018-08-02 03:41:25 +02:00
Eric Tang
0bf205c5d2 Keep sticky modifiers active when modifier-only keys are pressed 2018-08-01 18:12:12 -07:00
Eric Tang
e4a99a9400 Make sticky modifiers work consistently 2018-08-01 16:36:29 -07:00
Eric Tang
1e9b5833eb Correctly handle keypresses which triggers a secondary role 2018-08-01 15:53:55 -07:00
Eric Tang
79b052fca7 Remove redundant conditions 2018-07-31 16:12:51 -07:00
László Monda
baee0b5682 Bump firmware version to 8.4.1, update changelog, package.json, versions.h 2018-07-31 23:57:33 +02:00
László Monda
6153d54f59 Merge pull request #144 from UltimateHackingKeyboard/sleep-wake
Make some improvements to the sleep/wake code
2018-07-26 22:47:40 +02:00
Eric Tang
0a6ebe2903 Remove the old code for detecting new keypresses 2018-07-25 15:16:15 -07:00
Eric Tang
2d7cd68459 Make some improvements to the sleep/wake code 2018-07-22 13:13:29 -07:00
7 changed files with 64 additions and 38 deletions

View File

@@ -5,6 +5,18 @@ 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/) 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. and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.4.2] - 2018-08-02
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Fix various bugs related to secondary role handling and sticky modifier states.
## [8.4.1] - 2018-07-31
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make some improvements to the sleep/wake code.
## [8.4.0] - 2018-07-24 ## [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 Device Protocol: 4.**4.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0

View File

@@ -163,21 +163,28 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
} }
}}; }};
bool IsHostSleeping = false; volatile bool SleepModeActive = true;
static volatile bool wakeUpHostAllowed;
static void suspendHost(void) { static void suspendUhk(void) {
IsHostSleeping = true; SleepModeActive = true;
LedSlaveDriver_DisableLeds(); LedSlaveDriver_DisableLeds();
} }
void WakeUpHost(bool sendResume) { static void wakeUpUhk(void) {
if (sendResume) { // The device should wake up the host. SleepModeActive = false;
LedSlaveDriver_UpdateLeds();
}
void WakeUpHost(void) {
if (!wakeUpHostAllowed) {
return;
}
// Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL); // Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL); USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
while (SleepModeActive) {
;
} }
IsHostSleeping = false;
LedSlaveDriver_UpdateLeds();
} }
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param) static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
@@ -190,10 +197,6 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
return status; return status;
} }
if (IsHostSleeping) {
WakeUpHost(false); // Wake up the keyboard if there is any activity on the bus.
}
switch (event) { switch (event) {
case kUSB_DeviceEventBusReset: case kUSB_DeviceEventBusReset:
UsbCompositeDevice.attach = 0; UsbCompositeDevice.attach = 0;
@@ -201,17 +204,17 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
break; break;
case kUSB_DeviceEventSuspend: case kUSB_DeviceEventSuspend:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
suspendHost(); // The host sends this event when it goes to sleep, so turn off all the LEDs. suspendUhk(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
status = kStatus_USB_Success; status = kStatus_USB_Success;
} }
break; break;
case kUSB_DeviceEventResume: case kUSB_DeviceEventResume:
// We will just wake up the host if there is any activity on the bus. wakeUpUhk();
// The problem is that the host won't send a resume event when it boots, so the lights will never come back on.
status = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetConfiguration: case kUSB_DeviceEventSetConfiguration:
UsbCompositeDevice.attach = 1; UsbCompositeDevice.attach = 1;
wakeUpUhk();
UsbCompositeDevice.currentConfiguration = *temp8; UsbCompositeDevice.currentConfiguration = *temp8;
UsbGenericHidSetConfiguration(UsbCompositeDevice.genericHidHandle, *temp8); UsbGenericHidSetConfiguration(UsbCompositeDevice.genericHidHandle, *temp8);
UsbBasicKeyboardSetConfiguration(UsbCompositeDevice.basicKeyboardHandle, *temp8); UsbBasicKeyboardSetConfiguration(UsbCompositeDevice.basicKeyboardHandle, *temp8);
@@ -266,6 +269,10 @@ static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event,
case kUSB_DeviceEventGetHidPhysicalDescriptor: case kUSB_DeviceEventGetHidPhysicalDescriptor:
status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param); status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventSetRemoteWakeup:
wakeUpHostAllowed = *temp8;
status = kStatus_USB_Success;
break;
} }
return status; return status;

View File

@@ -28,12 +28,12 @@
// Variables: // Variables:
extern bool IsHostSleeping; extern volatile bool SleepModeActive;
extern usb_composite_device_t UsbCompositeDevice; extern usb_composite_device_t UsbCompositeDevice;
//Functions: //Functions:
void InitUsb(void); void InitUsb(void);
void WakeUpHost(bool sendResume); void WakeUpHost(void);
#endif #endif

View File

@@ -236,6 +236,7 @@ static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action)
static uint8_t basicScancodeIndex = 0; static uint8_t basicScancodeIndex = 0;
static uint8_t mediaScancodeIndex = 0; static uint8_t mediaScancodeIndex = 0;
static uint8_t systemScancodeIndex = 0; static uint8_t systemScancodeIndex = 0;
static uint8_t stickyModifiers;
static void applyKeyAction(key_state_t *keyState, key_action_t *action) static void applyKeyAction(key_state_t *keyState, key_action_t *action)
{ {
@@ -247,8 +248,13 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
switch (action->type) { switch (action->type) {
case KeyActionType_Keystroke: case KeyActionType_Keystroke:
if (action->keystroke.scancode) {
if (!keyState->previous) {
stickyModifiers = action->keystroke.modifiers;
}
} else {
ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers; ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers;
}
switch (action->keystroke.keystrokeType) { switch (action->keystroke.keystrokeType) {
case KeystrokeType_Basic: case KeystrokeType_Basic:
if (basicScancodeIndex >= USB_BASIC_KEYBOARD_MAX_KEYS || action->keystroke.scancode == 0) { if (basicScancodeIndex >= USB_BASIC_KEYBOARD_MAX_KEYS || action->keystroke.scancode == 0) {
@@ -271,6 +277,9 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
} }
break; break;
case KeyActionType_Mouse: case KeyActionType_Mouse:
if (!keyState->previous) {
stickyModifiers = 0;
}
activeMouseStates[action->mouseAction] = true; activeMouseStates[action->mouseAction] = true;
break; break;
case KeyActionType_SwitchLayer: case KeyActionType_SwitchLayer:
@@ -278,11 +287,13 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
break; break;
case KeyActionType_SwitchKeymap: case KeyActionType_SwitchKeymap:
if (!keyState->previous) { if (!keyState->previous) {
stickyModifiers = 0;
SwitchKeymapById(action->switchKeymap.keymapId); SwitchKeymapById(action->switchKeymap.keymapId);
} }
break; break;
case KeyActionType_PlayMacro: case KeyActionType_PlayMacro:
if (!keyState->previous) { if (!keyState->previous) {
stickyModifiers = 0;
Macros_StartMacro(action->playMacro.macroId); Macros_StartMacro(action->playMacro.macroId);
} }
break; break;
@@ -296,8 +307,6 @@ static secondary_role_t secondaryRole;
static void updateActiveUsbReports(void) static void updateActiveUsbReports(void)
{ {
static uint8_t previousModifiers = 0;
if (MacroPlaying) { if (MacroPlaying) {
Macros_ContinueMacro(); Macros_ContinueMacro();
memcpy(ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport); memcpy(ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
@@ -320,7 +329,11 @@ static void updateActiveUsbReports(void)
if (activeLayer == LayerId_Base) { if (activeLayer == LayerId_Base) {
activeLayer = GetActiveLayer(); activeLayer = GetActiveLayer();
} }
bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base; bool layerChanged = previousLayer != activeLayer;
if (layerChanged) {
stickyModifiers = 0;
}
bool layerGotReleased = layerChanged && activeLayer == LayerId_Base;
LedDisplay_SetLayer(activeLayer); LedDisplay_SetLayer(activeLayer);
if (TestUsbStack) { if (TestUsbStack) {
@@ -366,7 +379,7 @@ static void updateActiveUsbReports(void)
if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) { if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) {
// Press released secondary role key. // Press released secondary role key.
if (!keyState->previous && action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole && secondaryRoleState == SecondaryRoleState_Released) { if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) {
secondaryRoleState = SecondaryRoleState_Pressed; secondaryRoleState = SecondaryRoleState_Pressed;
secondaryRoleSlotId = slotId; secondaryRoleSlotId = slotId;
secondaryRoleKeyId = keyId; secondaryRoleKeyId = keyId;
@@ -377,6 +390,7 @@ static void updateActiveUsbReports(void)
// Trigger secondary role. // Trigger secondary role.
if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) { if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) {
secondaryRoleState = SecondaryRoleState_Triggered; secondaryRoleState = SecondaryRoleState_Triggered;
keyState->current = false;
} else { } else {
applyKeyAction(keyState, action); applyKeyAction(keyState, action);
} }
@@ -405,15 +419,12 @@ static void updateActiveUsbReports(void)
// When a layer switcher key gets pressed along with another key that produces some modifiers // When a layer switcher key gets pressed along with another key that produces some modifiers
// and the accomanying key gets released then keep the related modifiers active a long as the // and the accomanying key gets released then keep the related modifiers active a long as the
// layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like. // layer switcher key stays pressed. Useful for Alt+Tab keymappings and the like.
if (activeLayer != LayerId_Base && activeLayer == PreviousHeldLayer && basicScancodeIndex == 0) { ActiveUsbBasicKeyboardReport->modifiers |= stickyModifiers;
ActiveUsbBasicKeyboardReport->modifiers |= previousModifiers;
}
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_MODIFIER(secondaryRole)) { if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_MODIFIER(secondaryRole)) {
ActiveUsbBasicKeyboardReport->modifiers |= SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRole); ActiveUsbBasicKeyboardReport->modifiers |= SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRole);
} }
previousModifiers = ActiveUsbBasicKeyboardReport->modifiers;
previousLayer = activeLayer; previousLayer = activeLayer;
} }
@@ -425,11 +436,11 @@ void UpdateUsbReports(void)
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId]; KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
} }
if (IsHostSleeping) { if (SleepModeActive) {
for (uint8_t slotId = 0; slotId < SLOT_COUNT; slotId++) { for (uint8_t slotId = 0; slotId < SLOT_COUNT; slotId++) {
for (uint8_t keyId = 0; keyId < MAX_KEY_COUNT_PER_MODULE; keyId++) { for (uint8_t keyId = 0; keyId < MAX_KEY_COUNT_PER_MODULE; keyId++) {
if (KeyStates[slotId][keyId].current) { if (KeyStates[slotId][keyId].current) {
WakeUpHost(true); WakeUpHost();
return; return;
} }
} }
@@ -455,10 +466,6 @@ void UpdateUsbReports(void)
bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0; bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0;
bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0; bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0;
if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) {
WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
}
if (HasUsbBasicKeyboardReportChanged) { if (HasUsbBasicKeyboardReportChanged) {
usb_status_t status = UsbBasicKeyboardAction(); usb_status_t status = UsbBasicKeyboardAction();
if (status == kStatus_USB_Success) { if (status == kStatus_USB_Success) {

View File

@@ -15,7 +15,7 @@
"commander": "^2.11.0", "commander": "^2.11.0",
"shelljs": "^0.7.8" "shelljs": "^0.7.8"
}, },
"firmwareVersion": "8.4.0", "firmwareVersion": "8.4.2",
"deviceProtocolVersion": "4.4.0", "deviceProtocolVersion": "4.4.0",
"moduleProtocolVersion": "4.0.0", "moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.1.0", "userConfigVersion": "4.1.0",

View File

@@ -20,7 +20,7 @@
#define FIRMWARE_MAJOR_VERSION 8 #define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 4 #define FIRMWARE_MINOR_VERSION 4
#define FIRMWARE_PATCH_VERSION 0 #define FIRMWARE_PATCH_VERSION 2
#define DEVICE_PROTOCOL_MAJOR_VERSION 4 #define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 4 #define DEVICE_PROTOCOL_MINOR_VERSION 4