Compare commits
60 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b98e2d935c | ||
|
|
0066c09204 | ||
|
|
a59b43b433 | ||
|
|
ceb2f3de00 | ||
|
|
5cd4030a93 | ||
|
|
21ae72dd9e | ||
|
|
dba61c6a42 | ||
|
|
f61acc483b | ||
|
|
fb38e4099b | ||
|
|
5fe19abe06 | ||
|
|
06e34fdcbc | ||
|
|
cc6666b96d | ||
|
|
a22dfdd917 | ||
|
|
8b69a25dda | ||
|
|
6f2b45c27c | ||
|
|
98f7d512de | ||
|
|
c5cf738fd0 | ||
|
|
af31ae210a | ||
|
|
44799995b9 | ||
|
|
3f5f83a19b | ||
|
|
bc4f35e578 | ||
|
|
e9309aab16 | ||
|
|
f004b84399 | ||
|
|
58f8120611 | ||
|
|
5b71fb7aaa | ||
|
|
9d0f41bf5e | ||
|
|
47a3a8ad80 | ||
|
|
b4908bf2ac | ||
|
|
846342e851 | ||
|
|
3196abe574 | ||
|
|
5f0bae1840 | ||
|
|
c3a38c8b59 | ||
|
|
1f9d31cad4 | ||
|
|
b89de6655e | ||
|
|
4a1b747197 | ||
|
|
eca87d2f62 | ||
|
|
2e2b9d08a9 | ||
|
|
b4c2204e50 | ||
|
|
4c0546de6c | ||
|
|
bea4c34a51 | ||
|
|
bdc6232780 | ||
|
|
1d2d1c5049 | ||
|
|
67f07abd0d | ||
|
|
4bfcd6e02c | ||
|
|
848341e216 | ||
|
|
45d43dcc8d | ||
|
|
5ae351db6f | ||
|
|
7eb190489b | ||
|
|
26da686e4d | ||
|
|
640c034111 | ||
|
|
a6f12848ed | ||
|
|
47f6a27e48 | ||
|
|
9cc383a91d | ||
|
|
a441cdf5d2 | ||
|
|
8297dd5c48 | ||
|
|
225a481938 | ||
|
|
5572952dc8 | ||
|
|
7d011237f8 | ||
|
|
1a47c6e629 | ||
|
|
047a232e7e |
50
CHANGELOG.md
50
CHANGELOG.md
@@ -5,6 +5,55 @@ 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.5.3] - 2018-10-20
|
||||
|
||||
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Re-enable the I2C watchdog of the left keyboard half which was accidentally disabled starting from firmware 8.4.3. This should fix the freezes of the left keyboard half.
|
||||
|
||||
## [8.5.2] - 2018-10-06
|
||||
|
||||
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Don't suppress keys upon keymap change.
|
||||
|
||||
## [8.5.1] - 2018-10-04
|
||||
|
||||
Device Protocol: 4.5.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Reset UsbReportUpdateSemaphore if it gets stuck for 100ms. This should fix occasional freezes.
|
||||
|
||||
## [8.5.0] - 2018-10-04
|
||||
|
||||
Device Protocol: 4.**5.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Send primary role modifiers consistently.
|
||||
- Only allow layer switcher keys to deactivate toggled layers.
|
||||
- Deactivate secondary roles when switching keymaps.
|
||||
- Use the correct scancode so that commas are outputted for macros.
|
||||
- Move the pointer not by 1 but by 5 pixels when testing the USB stack to make the pointer easier to see.
|
||||
- Expose UsbReportUpdateSemaphore via UsbCommand_{Get,Set}Variable() `DEVICEPROTOCOL:MINOR`
|
||||
- Extract CurrentTime and remove Timer_{Get,Set}CurrentTime()
|
||||
|
||||
## [8.4.5] - 2018-08-21
|
||||
|
||||
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Suppress pressed keys when the layer or keymap changes.
|
||||
|
||||
## [8.4.4] - 2018-08-14
|
||||
|
||||
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Don't wake the host if a key is held down through the beginning of sleep.
|
||||
- Ensure that secondary roles are triggered consistently.
|
||||
|
||||
## [8.4.3] - 2018-08-12
|
||||
|
||||
Device Protocol: 4.4.0 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Compensate "double tap to lock layer" timeouts for the timer fix to make them as long as before 8.3.3
|
||||
|
||||
## [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
|
||||
@@ -32,6 +81,7 @@ Device Protocol: 4.**4.0** | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardw
|
||||
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||
|
||||
- Implement the macro engine.
|
||||
- Fix the timer which makes it tick twice as fast as before.
|
||||
- Fix the nondeterministic bug that made USB hang.
|
||||
- Restore the Windows related commits of firmware 8.3.1 because the USB hang bug has been fixed.
|
||||
- Restore debouncing to 100ms until it gets really fixed.
|
||||
|
||||
8
ISSUE_TEMPLATE
Normal file
8
ISSUE_TEMPLATE
Normal file
@@ -0,0 +1,8 @@
|
||||
Before submitting a new issue, make sure to do the following:
|
||||
|
||||
1. If you're using Karabiner Elements on your Mac, close it!
|
||||
2. Install the latest Agent:
|
||||
https://github.com/UltimateHackingKeyboard/agent/releases/latest
|
||||
3. Use Agent to update to the latest firmware:
|
||||
https://github.com/UltimateHackingKeyboard/firmware/releases/latest
|
||||
4. Try to reproduce the issue, and only report it if it still persists.
|
||||
12
README.md
12
README.md
@@ -12,19 +12,15 @@ If you're one of the brave few who wants to hack the firmware then read on.
|
||||
|
||||
`git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git`
|
||||
|
||||
2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.1.1_606.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.exe).
|
||||
2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.2.1_795.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.2.1_795.exe).
|
||||
|
||||
3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
|
||||
|
||||
## Building and flashing the firmware
|
||||
4. In order to be able to flash the firmware via USB from the IDE, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) which is Git submodule of the this repo and located in the `lib/agent` directory.
|
||||
|
||||
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button.
|
||||
5. Finally, in the IDE, click on *Run -> External Tools -> External Tools Configurations*, then select a release firmware to be flashed such as *uhk60-right_release_kboot*, and click on the *Run* button.
|
||||
|
||||
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first.
|
||||
|
||||
At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button.
|
||||
|
||||
From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe.
|
||||
Going forward, it's easier to flash the firmware of your choice by using the downwards toolbar icon which is located rightwards of the *green play + toolbox icon*.
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -44,7 +44,8 @@ SOURCE = $(wildcard src/*.c) \
|
||||
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.c \
|
||||
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.c \
|
||||
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c \
|
||||
$(wildcard ../shared/*.c)
|
||||
$(wildcard ../shared/*.c) \
|
||||
$(wildcard ../shared/slave/*.c)
|
||||
|
||||
# Header files.
|
||||
IPATH = src \
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef __CONFIG_H__
|
||||
#define __CONFIG_H__
|
||||
|
||||
// Macros:
|
||||
|
||||
#define I2C_WATCHDOG_VALUE_REINIT 1
|
||||
#define I2C_WATCHDOG_VALUE_REBOOT 2
|
||||
|
||||
// #define DEBUG_OVER_SPI
|
||||
#define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REINIT
|
||||
// #define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REBOOT
|
||||
|
||||
#endif
|
||||
@@ -1,56 +0,0 @@
|
||||
#ifdef DEBUG_OVER_SPI
|
||||
|
||||
#include "debug_over_spi.h"
|
||||
#include "config.h"
|
||||
#include "fsl_gpio.h"
|
||||
|
||||
|
||||
#define EXAMPLE_SPI_MASTER (SPI0)
|
||||
#define EXAMPLE_SPI_MASTER_SOURCE_CLOCK (kCLOCK_BusClk)
|
||||
|
||||
#define BUFFER_SIZE (64)
|
||||
static uint8_t srcBuff[BUFFER_SIZE];
|
||||
|
||||
static spi_transfer_t xfer = {0};
|
||||
static spi_master_config_t userConfig;
|
||||
spi_master_handle_t handle;
|
||||
|
||||
static volatile bool masterFinished = true;
|
||||
|
||||
static void masterCallback(SPI_Type *base, spi_master_handle_t *masterHandle, status_t status, void *userData)
|
||||
{
|
||||
masterFinished = true;
|
||||
}
|
||||
|
||||
void DebugOverSpi_Init(void)
|
||||
{
|
||||
CLOCK_EnableClock(DEBUG_OVER_SPI_MOSI_CLOCK);
|
||||
CLOCK_EnableClock(DEBUG_OVER_SPI_SCK_CLOCK);
|
||||
|
||||
PORT_SetPinMux(DEBUG_OVER_SPI_MOSI_PORT, DEBUG_OVER_SPI_MOSI_PIN, kPORT_MuxAlt3);
|
||||
PORT_SetPinMux(DEBUG_OVER_SPI_SCK_PORT, DEBUG_OVER_SPI_SCK_PIN, kPORT_MuxAlt3);
|
||||
|
||||
GPIO_PinInit(DEBUG_OVER_SPI_MOSI_GPIO, DEBUG_OVER_SPI_MOSI_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
||||
GPIO_PinInit(DEBUG_OVER_SPI_SCK_GPIO, DEBUG_OVER_SPI_SCK_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
||||
|
||||
GPIO_SetPinsOutput(DEBUG_OVER_SPI_MOSI_GPIO, 1U << DEBUG_OVER_SPI_MOSI_PIN);
|
||||
GPIO_SetPinsOutput(DEBUG_OVER_SPI_SCK_GPIO, 1U << DEBUG_OVER_SPI_SCK_PIN);
|
||||
|
||||
SPI_MasterGetDefaultConfig(&userConfig);
|
||||
uint32_t srcFreq = CLOCK_GetFreq(EXAMPLE_SPI_MASTER_SOURCE_CLOCK);
|
||||
SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, srcFreq);
|
||||
SPI_MasterTransferCreateHandle(EXAMPLE_SPI_MASTER, &handle, masterCallback, NULL);
|
||||
}
|
||||
|
||||
void DebugOverSpi_Send(uint8_t *tx, uint8_t len)
|
||||
{
|
||||
if (masterFinished) {
|
||||
masterFinished = false;
|
||||
memcpy(srcBuff, tx, MIN(BUFFER_SIZE, len));
|
||||
xfer.txData = srcBuff;
|
||||
xfer.dataSize = len;
|
||||
SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,34 +0,0 @@
|
||||
#ifdef DEBUG_OVER_SPI
|
||||
|
||||
#ifndef __DEBUG_OVER_SPI_H__
|
||||
#define __DEBUG_OVER_SPI_H__
|
||||
|
||||
// Includes:
|
||||
|
||||
#include "fsl_common.h"
|
||||
#include "fsl_port.h"
|
||||
#include "fsl_spi.h"
|
||||
|
||||
// Macros:
|
||||
|
||||
#define DEBUG_OVER_SPI_MOSI_PORT PORTA
|
||||
#define DEBUG_OVER_SPI_MOSI_GPIO GPIOA
|
||||
#define DEBUG_OVER_SPI_MOSI_CLOCK kCLOCK_PortA
|
||||
#define DEBUG_OVER_SPI_MOSI_PIN 7
|
||||
|
||||
#define DEBUG_OVER_SPI_SCK_PORT PORTB
|
||||
#define DEBUG_OVER_SPI_SCK_GPIO GPIOB
|
||||
#define DEBUG_OVER_SPI_SCK_CLOCK kCLOCK_PortB
|
||||
#define DEBUG_OVER_SPI_SCK_PIN 0
|
||||
|
||||
// Functions:
|
||||
|
||||
void DebugOverSpi_Init(void);
|
||||
void DebugOverSpi_Send(uint8_t *tx, uint8_t len);
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define DebugOverSpi_Init()
|
||||
#define DebugOverSpi_Send(tx, len)
|
||||
#endif
|
||||
@@ -3,40 +3,31 @@
|
||||
#include "i2c_watchdog.h"
|
||||
#include "test_led.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "config.h"
|
||||
|
||||
/* NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
||||
* See https://community.nxp.com/thread/457893
|
||||
* Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||
*/
|
||||
#ifdef I2C_WATCHDOG
|
||||
static uint32_t prevWatchdogCounter = 0;
|
||||
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
|
||||
// NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
|
||||
// See https://community.nxp.com/thread/457893
|
||||
// Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
|
||||
static uint32_t prevWatchdogCounter = 0;
|
||||
static uint32_t I2cWatchdog_RecoveryCounter; // Counter for how many times we had to recover and restart
|
||||
|
||||
void RunWatchdog(void)
|
||||
{
|
||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
|
||||
static int cntr = 0;
|
||||
static volatile uint32_t I2cWatchdog_WatchCounter = 0; // Counter for timer
|
||||
static int counter = 0;
|
||||
|
||||
cntr++;
|
||||
if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
|
||||
cntr=0;
|
||||
counter++;
|
||||
if (counter == 100) { // We get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period
|
||||
counter=0;
|
||||
TestLed_Toggle();
|
||||
I2cWatchdog_WatchCounter++;
|
||||
|
||||
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */
|
||||
if (I2cWatchdog_WatchCounter > 10) { // Do not check within the first 1000 ms, as I2C might not be running yet
|
||||
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
|
||||
I2cWatchdog_RecoveryCounter++;
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REBOOT
|
||||
NVIC_SystemReset();
|
||||
#endif
|
||||
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REINIT
|
||||
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
|
||||
initI2c();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
|
||||
prevWatchdogCounter = I2C_Watchdog;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "led_pwm.h"
|
||||
#include "slave_protocol_handler.h"
|
||||
#include "i2c_watchdog.h"
|
||||
#include "debug_over_spi.h"
|
||||
#include "main.h"
|
||||
|
||||
i2c_slave_config_t slaveConfig;
|
||||
@@ -23,7 +22,6 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
|
||||
{
|
||||
dosBuffer[0] = xfer->event;
|
||||
dosBuffer[1] = userData;
|
||||
DebugOverSpi_Send(dosBuffer, 2);
|
||||
|
||||
switch (xfer->event) {
|
||||
case kI2C_SlaveTransmitEvent:
|
||||
@@ -86,6 +84,5 @@ void InitPeripherals(void)
|
||||
InitLedDriver();
|
||||
TestLed_Init();
|
||||
LedPwm_Init();
|
||||
DebugOverSpi_Init();
|
||||
initI2c();
|
||||
}
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
#include "fsl_lptmr.h"
|
||||
#include "key_scanner.h"
|
||||
#include "config.h"
|
||||
#include "i2c_watchdog.h"
|
||||
|
||||
void KEY_SCANNER_HANDLER(void)
|
||||
{
|
||||
KeyMatrix_ScanRow(&keyMatrix);
|
||||
#ifdef I2C_WATCHDOG
|
||||
RunWatchdog();
|
||||
#endif
|
||||
LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
#include "main.h"
|
||||
#include "init_clock.h"
|
||||
#include "slave/init_clock.h"
|
||||
#include "init_peripherals.h"
|
||||
#include "bootloader.h"
|
||||
#include <stdio.h>
|
||||
#include "config.h"
|
||||
#include "key_scanner.h"
|
||||
|
||||
DEFINE_BOOTLOADER_CONFIG_AREA(I2C_ADDRESS_LEFT_KEYBOARD_HALF_BOOTLOADER)
|
||||
@@ -15,11 +14,7 @@ key_matrix_t keyMatrix = {
|
||||
{PORTB, GPIOB, kCLOCK_PortB, 11},
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 6},
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 8},
|
||||
#ifdef DEBUG_OVER_SPI
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 8},
|
||||
#else
|
||||
{PORTB, GPIOB, kCLOCK_PortB, 0},
|
||||
#endif
|
||||
{PORTB, GPIOB, kCLOCK_PortB, 6},
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 3},
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 12}
|
||||
@@ -28,11 +23,7 @@ key_matrix_t keyMatrix = {
|
||||
{PORTB, GPIOB, kCLOCK_PortB, 7},
|
||||
{PORTB, GPIOB, kCLOCK_PortB, 10},
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 5},
|
||||
#ifdef DEBUG_OVER_SPI
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 5},
|
||||
#else
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 7},
|
||||
#endif
|
||||
{PORTA, GPIOA, kCLOCK_PortA, 4}
|
||||
}
|
||||
};
|
||||
|
||||
Submodule lib/agent updated: fa32f95438...a4e3696078
@@ -460,73 +460,73 @@
|
||||
<storageModule moduleId="com.crt.config">
|
||||
<projectStorage><?xml version="1.0" encoding="UTF-8"?>
|
||||
<TargetConfig>
|
||||
<Properties property_3="NXP" property_4="MK22FN512xxx12" property_count="5" version="70200"/>
|
||||
<Properties property_3="NXP" property_4="MK22FN512xxx12" property_count="5" version="100200"/>
|
||||
<infoList vendor="NXP"><info chip="MK22FN512xxx12" name="MK22FN512xxx12"><chip><name>MK22FN512xxx12</name>
|
||||
<family>K2x</family>
|
||||
<vendor>NXP</vendor>
|
||||
<memory can_program="true" id="Flash" is_ro="true" size="512" type="Flash"/>
|
||||
<memory id="RAM" size="128" type="RAM"/>
|
||||
<memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x0" size="0x80000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x10000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x10000"/>
|
||||
<peripheralInstance derived_from="FTFA_FlashConfig" id="FTFA_FlashConfig" location="0x400"/>
|
||||
<peripheralInstance derived_from="DMA" id="DMA" location="0x40008000"/>
|
||||
<peripheralInstance derived_from="FB" id="FB" location="0x4000C000"/>
|
||||
<peripheralInstance derived_from="FMC" id="FMC" location="0x4001F000"/>
|
||||
<peripheralInstance derived_from="FTFA" id="FTFA" location="0x40020000"/>
|
||||
<peripheralInstance derived_from="DMAMUX" id="DMAMUX" location="0x40021000"/>
|
||||
<peripheralInstance derived_from="FTM0" id="FTM0" location="0x40038000"/>
|
||||
<peripheralInstance derived_from="FTM1" id="FTM1" location="0x40039000"/>
|
||||
<peripheralInstance derived_from="FTM2" id="FTM2" location="0x4003A000"/>
|
||||
<peripheralInstance derived_from="FTM3" id="FTM3" location="0x40026000"/>
|
||||
<peripheralInstance derived_from="ADC0" id="ADC0" location="0x4003B000"/>
|
||||
<peripheralInstance derived_from="ADC1" id="ADC1" location="0x40027000"/>
|
||||
<peripheralInstance derived_from="DAC0" id="DAC0" location="0x4003F000"/>
|
||||
<peripheralInstance derived_from="DAC1" id="DAC1" location="0x40028000"/>
|
||||
<peripheralInstance derived_from="RNG" id="RNG" location="0x40029000"/>
|
||||
<peripheralInstance derived_from="LPUART0" id="LPUART0" location="0x4002A000"/>
|
||||
<peripheralInstance derived_from="SPI0" id="SPI0" location="0x4002C000"/>
|
||||
<peripheralInstance derived_from="SPI1" id="SPI1" location="0x4002D000"/>
|
||||
<peripheralInstance derived_from="I2S0" id="I2S0" location="0x4002F000"/>
|
||||
<peripheralInstance derived_from="CRC" id="CRC" location="0x40032000"/>
|
||||
<peripheralInstance derived_from="PDB0" id="PDB0" location="0x40036000"/>
|
||||
<peripheralInstance derived_from="PIT" id="PIT" location="0x40037000"/>
|
||||
<peripheralInstance derived_from="RTC" id="RTC" location="0x4003D000"/>
|
||||
<peripheralInstance derived_from="RFVBAT" id="RFVBAT" location="0x4003E000"/>
|
||||
<peripheralInstance derived_from="LPTMR0" id="LPTMR0" location="0x40040000"/>
|
||||
<peripheralInstance derived_from="RFSYS" id="RFSYS" location="0x40041000"/>
|
||||
<peripheralInstance derived_from="SIM" id="SIM" location="0x40047000"/>
|
||||
<peripheralInstance derived_from="PORTA" id="PORTA" location="0x40049000"/>
|
||||
<peripheralInstance derived_from="PORTB" id="PORTB" location="0x4004A000"/>
|
||||
<peripheralInstance derived_from="PORTC" id="PORTC" location="0x4004B000"/>
|
||||
<peripheralInstance derived_from="PORTD" id="PORTD" location="0x4004C000"/>
|
||||
<peripheralInstance derived_from="PORTE" id="PORTE" location="0x4004D000"/>
|
||||
<peripheralInstance derived_from="WDOG" id="WDOG" location="0x40052000"/>
|
||||
<peripheralInstance derived_from="EWM" id="EWM" location="0x40061000"/>
|
||||
<peripheralInstance derived_from="MCG" id="MCG" location="0x40064000"/>
|
||||
<peripheralInstance derived_from="OSC" id="OSC" location="0x40065000"/>
|
||||
<peripheralInstance derived_from="I2C0" id="I2C0" location="0x40066000"/>
|
||||
<peripheralInstance derived_from="I2C1" id="I2C1" location="0x40067000"/>
|
||||
<peripheralInstance derived_from="UART0" id="UART0" location="0x4006A000"/>
|
||||
<peripheralInstance derived_from="UART1" id="UART1" location="0x4006B000"/>
|
||||
<peripheralInstance derived_from="UART2" id="UART2" location="0x4006C000"/>
|
||||
<peripheralInstance derived_from="USB0" id="USB0" location="0x40072000"/>
|
||||
<peripheralInstance derived_from="CMP0" id="CMP0" location="0x40073000"/>
|
||||
<peripheralInstance derived_from="CMP1" id="CMP1" location="0x40073008"/>
|
||||
<peripheralInstance derived_from="VREF" id="VREF" location="0x40074000"/>
|
||||
<peripheralInstance derived_from="LLWU" id="LLWU" location="0x4007C000"/>
|
||||
<peripheralInstance derived_from="PMC" id="PMC" location="0x4007D000"/>
|
||||
<peripheralInstance derived_from="SMC" id="SMC" location="0x4007E000"/>
|
||||
<peripheralInstance derived_from="RCM" id="RCM" location="0x4007F000"/>
|
||||
<peripheralInstance derived_from="GPIOA" id="GPIOA" location="0x400FF000"/>
|
||||
<peripheralInstance derived_from="GPIOB" id="GPIOB" location="0x400FF040"/>
|
||||
<peripheralInstance derived_from="GPIOC" id="GPIOC" location="0x400FF080"/>
|
||||
<peripheralInstance derived_from="GPIOD" id="GPIOD" location="0x400FF0C0"/>
|
||||
<peripheralInstance derived_from="GPIOE" id="GPIOE" location="0x400FF100"/>
|
||||
<peripheralInstance derived_from="SystemControl" id="SystemControl" location="0xE000E000"/>
|
||||
<peripheralInstance derived_from="SysTick" id="SysTick" location="0xE000E010"/>
|
||||
<peripheralInstance derived_from="NVIC" id="NVIC" location="0xE000E100"/>
|
||||
<peripheralInstance derived_from="MCM" id="MCM" location="0xE0080000"/>
|
||||
<memory can_program="true" id="Flash" is_ro="true" size="0" type="Flash"/>
|
||||
<memory id="RAM" size="0" type="RAM"/>
|
||||
<memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x00000000" size="0x00080000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x00010000"/>
|
||||
<memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x00010000"/>
|
||||
<peripheralInstance derived_from="FTFA-FlashConfig" determined="infoFile" id="FTFA-FlashConfig" location="0x400"/>
|
||||
<peripheralInstance derived_from="DMA" determined="infoFile" id="DMA" location="0x40008000"/>
|
||||
<peripheralInstance derived_from="FB" determined="infoFile" id="FB" location="0x4000C000"/>
|
||||
<peripheralInstance derived_from="FMC" determined="infoFile" id="FMC" location="0x4001F000"/>
|
||||
<peripheralInstance derived_from="FTFA" determined="infoFile" id="FTFA" location="0x40020000"/>
|
||||
<peripheralInstance derived_from="DMAMUX" determined="infoFile" id="DMAMUX" location="0x40021000"/>
|
||||
<peripheralInstance derived_from="FTM0" determined="infoFile" id="FTM0" location="0x40038000"/>
|
||||
<peripheralInstance derived_from="FTM1" determined="infoFile" id="FTM1" location="0x40039000"/>
|
||||
<peripheralInstance derived_from="FTM2" determined="infoFile" id="FTM2" location="0x4003A000"/>
|
||||
<peripheralInstance derived_from="FTM3" determined="infoFile" id="FTM3" location="0x40026000"/>
|
||||
<peripheralInstance derived_from="ADC0" determined="infoFile" id="ADC0" location="0x4003B000"/>
|
||||
<peripheralInstance derived_from="ADC1" determined="infoFile" id="ADC1" location="0x40027000"/>
|
||||
<peripheralInstance derived_from="DAC0" determined="infoFile" id="DAC0" location="0x4003F000"/>
|
||||
<peripheralInstance derived_from="DAC1" determined="infoFile" id="DAC1" location="0x40028000"/>
|
||||
<peripheralInstance derived_from="RNG" determined="infoFile" id="RNG" location="0x40029000"/>
|
||||
<peripheralInstance derived_from="LPUART0" determined="infoFile" id="LPUART0" location="0x4002A000"/>
|
||||
<peripheralInstance derived_from="SPI0" determined="infoFile" id="SPI0" location="0x4002C000"/>
|
||||
<peripheralInstance derived_from="SPI1" determined="infoFile" id="SPI1" location="0x4002D000"/>
|
||||
<peripheralInstance derived_from="I2S0" determined="infoFile" id="I2S0" location="0x4002F000"/>
|
||||
<peripheralInstance derived_from="CRC" determined="infoFile" id="CRC" location="0x40032000"/>
|
||||
<peripheralInstance derived_from="PDB0" determined="infoFile" id="PDB0" location="0x40036000"/>
|
||||
<peripheralInstance derived_from="PIT" determined="infoFile" id="PIT" location="0x40037000"/>
|
||||
<peripheralInstance derived_from="RTC" determined="infoFile" id="RTC" location="0x4003D000"/>
|
||||
<peripheralInstance derived_from="RFVBAT" determined="infoFile" id="RFVBAT" location="0x4003E000"/>
|
||||
<peripheralInstance derived_from="LPTMR0" determined="infoFile" id="LPTMR0" location="0x40040000"/>
|
||||
<peripheralInstance derived_from="RFSYS" determined="infoFile" id="RFSYS" location="0x40041000"/>
|
||||
<peripheralInstance derived_from="SIM" determined="infoFile" id="SIM" location="0x40047000"/>
|
||||
<peripheralInstance derived_from="PORTA" determined="infoFile" id="PORTA" location="0x40049000"/>
|
||||
<peripheralInstance derived_from="PORTB" determined="infoFile" id="PORTB" location="0x4004A000"/>
|
||||
<peripheralInstance derived_from="PORTC" determined="infoFile" id="PORTC" location="0x4004B000"/>
|
||||
<peripheralInstance derived_from="PORTD" determined="infoFile" id="PORTD" location="0x4004C000"/>
|
||||
<peripheralInstance derived_from="PORTE" determined="infoFile" id="PORTE" location="0x4004D000"/>
|
||||
<peripheralInstance derived_from="WDOG" determined="infoFile" id="WDOG" location="0x40052000"/>
|
||||
<peripheralInstance derived_from="EWM" determined="infoFile" id="EWM" location="0x40061000"/>
|
||||
<peripheralInstance derived_from="MCG" determined="infoFile" id="MCG" location="0x40064000"/>
|
||||
<peripheralInstance derived_from="OSC" determined="infoFile" id="OSC" location="0x40065000"/>
|
||||
<peripheralInstance derived_from="I2C0" determined="infoFile" id="I2C0" location="0x40066000"/>
|
||||
<peripheralInstance derived_from="I2C1" determined="infoFile" id="I2C1" location="0x40067000"/>
|
||||
<peripheralInstance derived_from="UART0" determined="infoFile" id="UART0" location="0x4006A000"/>
|
||||
<peripheralInstance derived_from="UART1" determined="infoFile" id="UART1" location="0x4006B000"/>
|
||||
<peripheralInstance derived_from="UART2" determined="infoFile" id="UART2" location="0x4006C000"/>
|
||||
<peripheralInstance derived_from="USB0" determined="infoFile" id="USB0" location="0x40072000"/>
|
||||
<peripheralInstance derived_from="CMP0" determined="infoFile" id="CMP0" location="0x40073000"/>
|
||||
<peripheralInstance derived_from="CMP1" determined="infoFile" id="CMP1" location="0x40073008"/>
|
||||
<peripheralInstance derived_from="VREF" determined="infoFile" id="VREF" location="0x40074000"/>
|
||||
<peripheralInstance derived_from="LLWU" determined="infoFile" id="LLWU" location="0x4007C000"/>
|
||||
<peripheralInstance derived_from="PMC" determined="infoFile" id="PMC" location="0x4007D000"/>
|
||||
<peripheralInstance derived_from="SMC" determined="infoFile" id="SMC" location="0x4007E000"/>
|
||||
<peripheralInstance derived_from="RCM" determined="infoFile" id="RCM" location="0x4007F000"/>
|
||||
<peripheralInstance derived_from="GPIOA" determined="infoFile" id="GPIOA" location="0x400FF000"/>
|
||||
<peripheralInstance derived_from="GPIOB" determined="infoFile" id="GPIOB" location="0x400FF040"/>
|
||||
<peripheralInstance derived_from="GPIOC" determined="infoFile" id="GPIOC" location="0x400FF080"/>
|
||||
<peripheralInstance derived_from="GPIOD" determined="infoFile" id="GPIOD" location="0x400FF0C0"/>
|
||||
<peripheralInstance derived_from="GPIOE" determined="infoFile" id="GPIOE" location="0x400FF100"/>
|
||||
<peripheralInstance derived_from="SystemControl" determined="infoFile" id="SystemControl" location="0xE000E000"/>
|
||||
<peripheralInstance derived_from="SysTick" determined="infoFile" id="SysTick" location="0xE000E010"/>
|
||||
<peripheralInstance derived_from="NVIC" determined="infoFile" id="NVIC" location="0xE000E100"/>
|
||||
<peripheralInstance derived_from="MCM" determined="infoFile" id="MCM" location="0xE0080000"/>
|
||||
</chip>
|
||||
<processor><name gcc_name="cortex-m4">Cortex-M4</name>
|
||||
<family>Cortex-M</family>
|
||||
@@ -538,6 +538,6 @@
|
||||
</storageModule>
|
||||
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
|
||||
<sdkName>SDK_2.x_MK22FN512xxx12</sdkName>
|
||||
<sdkVersion>2.3.1</sdkVersion>
|
||||
<sdkVersion>2.2.0</sdkVersion>
|
||||
</storageModule>
|
||||
</cproject>
|
||||
|
||||
@@ -146,8 +146,6 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
|
||||
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
|
||||
KeyBacklightBrightness = keyBacklightBrightness;
|
||||
|
||||
LedSlaveDriver_UpdateLeds();
|
||||
|
||||
// Update mouse key speeds
|
||||
|
||||
MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
|
||||
|
||||
@@ -15,7 +15,7 @@ void updateLayerStates(void)
|
||||
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];
|
||||
if (keyState->current) {
|
||||
if (keyState->current && !keyState->suppressed) {
|
||||
key_action_t action = CurrentKeymap[LayerId_Base][slotId][keyId];
|
||||
if (action.type == KeyActionType_SwitchLayer) {
|
||||
if (action.switchLayer.mode != SwitchLayerMode_Toggle) {
|
||||
|
||||
@@ -84,6 +84,7 @@ void LedDisplay_SetText(uint8_t length, const char* text)
|
||||
}
|
||||
allSegmentSets >>= 5;
|
||||
}
|
||||
LedSlaveDriver_UpdateLeds(LedDriverId_Left);
|
||||
}
|
||||
|
||||
void LedDisplay_SetLayer(layer_id_t layerId)
|
||||
@@ -95,6 +96,7 @@ void LedDisplay_SetLayer(layer_id_t layerId)
|
||||
if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) {
|
||||
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = IconsAndLayerTextsBrightness;
|
||||
}
|
||||
LedSlaveDriver_UpdateLeds(LedDriverId_Left);
|
||||
}
|
||||
|
||||
bool LedDisplay_GetIcon(led_display_icon_t icon)
|
||||
@@ -106,6 +108,7 @@ void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||
{
|
||||
ledIconStates[icon] = isEnabled;
|
||||
LedDriverValues[LedDriverId_Left][icon + 8] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||
LedSlaveDriver_UpdateLeds(LedDriverId_Left);
|
||||
}
|
||||
|
||||
void LedDisplay_UpdateIcons(void)
|
||||
|
||||
@@ -70,7 +70,7 @@ uint8_t characterToScancode(char character)
|
||||
return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
|
||||
case ',':
|
||||
case '<':
|
||||
return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN;
|
||||
return HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN;
|
||||
case '/':
|
||||
case '\?':
|
||||
return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
|
||||
@@ -286,7 +286,7 @@ bool processDelayAction(void)
|
||||
inDelay = false;
|
||||
}
|
||||
} else {
|
||||
Timer_SetCurrentTime(&delayStart);
|
||||
delayStart = CurrentTime;
|
||||
inDelay = true;
|
||||
}
|
||||
return inDelay;
|
||||
|
||||
@@ -16,8 +16,13 @@
|
||||
#define LED_DRIVER_SDB_CLOCK kCLOCK_PortA
|
||||
#define LED_DRIVER_SDB_PIN 2
|
||||
|
||||
#define LED_DRIVER_REGISTER_SHUTDOWN 0x0A
|
||||
#define LED_DRIVER_REGISTER_FRAME 0xFD
|
||||
#define LED_DRIVER_REGISTER_SHUTDOWN 0x0A
|
||||
#define LED_DRIVER_REGISTER_FRAME 0xFD
|
||||
#define LED_DRIVER_REGISTER_CONFIGURATION 0x00
|
||||
#define LED_DRIVER_REGISTER_AUTO_PLAY_CONTROL_1 0x02
|
||||
#define LED_DRIVER_REGISTER_AUTO_PLAY_CONTROL_2 0x03
|
||||
#define LED_DRIVER_REGISTER_BREATH_CONTROL_1 0x08
|
||||
#define LED_DRIVER_REGISTER_BREATH_CONTROL_2 0x09
|
||||
|
||||
#define LED_DRIVER_FRAME_1 0
|
||||
#define LED_DRIVER_FRAME_2 1
|
||||
@@ -42,6 +47,25 @@
|
||||
#define SHUTDOWN_MODE_SHUTDOWN 0
|
||||
#define SHUTDOWN_MODE_NORMAL 1
|
||||
|
||||
#define DISPLAY_MODE_AUTO_FRAME_PLAY 0b01
|
||||
#define DISPLAY_MODE_SHIFT 3
|
||||
#define FRAME_START_1 0b000
|
||||
#define FRAME_START_8 0b111
|
||||
|
||||
#define PLAY_LOOP_NUMBER_1 0b001
|
||||
#define PLAY_LOOP_NUMBER_SHIFT 4
|
||||
#define PLAY_FRAME_NUMBER_1 0b001
|
||||
|
||||
#define FRAME_DELAY_TIME 1
|
||||
|
||||
#define FADE_OUT_TIME 5
|
||||
#define FADE_OUT_TIME_SHIFT 4
|
||||
#define FADE_IN_TIME 5
|
||||
|
||||
#define BREATH_ENABLE 1
|
||||
#define BREATH_ENABLE_SHIFT 4
|
||||
#define EXTINGUISH_TIME 0
|
||||
|
||||
// Functions:
|
||||
|
||||
void InitLedDriver(void);
|
||||
|
||||
@@ -60,22 +60,48 @@ static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_COUNT] = {
|
||||
static uint8_t setFunctionFrameBuffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_FUNCTION};
|
||||
static uint8_t setShutdownModeNormalBuffer[] = {LED_DRIVER_REGISTER_SHUTDOWN, SHUTDOWN_MODE_NORMAL};
|
||||
static uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
|
||||
static uint8_t setFrame2Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_2};
|
||||
static uint8_t setFrame8Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_8};
|
||||
static uint8_t initLedControlRegistersZeroBuffer[19] = { FRAME_REGISTER_LED_CONTROL_FIRST };
|
||||
static uint8_t setConfigurationRegisterFadeInBuffer[] = {
|
||||
LED_DRIVER_REGISTER_CONFIGURATION,
|
||||
DISPLAY_MODE_AUTO_FRAME_PLAY << DISPLAY_MODE_SHIFT | FRAME_START_8
|
||||
};
|
||||
static uint8_t setConfigurationRegisterFadeOutBuffer[] = {
|
||||
LED_DRIVER_REGISTER_CONFIGURATION,
|
||||
DISPLAY_MODE_AUTO_FRAME_PLAY << DISPLAY_MODE_SHIFT | FRAME_START_1
|
||||
};
|
||||
static uint8_t initAutoPlayControlRegister1Buffer[] = {
|
||||
LED_DRIVER_REGISTER_AUTO_PLAY_CONTROL_1,
|
||||
PLAY_LOOP_NUMBER_1 << PLAY_LOOP_NUMBER_SHIFT | PLAY_FRAME_NUMBER_1
|
||||
};
|
||||
static uint8_t initAutoPlayControlRegister2Buffer[] = {
|
||||
LED_DRIVER_REGISTER_AUTO_PLAY_CONTROL_2,
|
||||
FRAME_DELAY_TIME
|
||||
};
|
||||
static uint8_t initBreathControlRegister1Buffer[] = {
|
||||
LED_DRIVER_REGISTER_BREATH_CONTROL_1,
|
||||
FADE_OUT_TIME << FADE_OUT_TIME_SHIFT | FADE_IN_TIME
|
||||
};
|
||||
static uint8_t initBreathControlRegister2Buffer[] = {
|
||||
LED_DRIVER_REGISTER_BREATH_CONTROL_2,
|
||||
BREATH_ENABLE << BREATH_ENABLE_SHIFT | EXTINGUISH_TIME
|
||||
};
|
||||
static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH];
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void)
|
||||
void LedSlaveDriver_DisableLeds(uint8_t ledDriverId)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], 0, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
ledDriverStates[ledDriverId].requests[LedDriverRequest_DisableLeds] = true;
|
||||
}
|
||||
|
||||
void LedSlaveDriver_UpdateLeds(void)
|
||||
void LedSlaveDriver_EnableLeds(uint8_t ledDriverId)
|
||||
{
|
||||
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
}
|
||||
ledDriverStates[ledDriverId].requests[LedDriverRequest_EnableLeds] = true;
|
||||
}
|
||||
|
||||
LedDisplay_UpdateAll();
|
||||
void LedSlaveDriver_UpdateLeds(uint8_t ledDriverId)
|
||||
{
|
||||
ledDriverStates[ledDriverId].requests[LedDriverRequest_UpdateLeds] = true;
|
||||
}
|
||||
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
@@ -85,13 +111,9 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
|
||||
}
|
||||
|
||||
led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame;
|
||||
currentLedDriverState->ledIndex = 0;
|
||||
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
|
||||
|
||||
if (ledDriverId == LedDriverId_Left) {
|
||||
LedDisplay_UpdateAll();
|
||||
}
|
||||
ledDriverStates[ledDriverId].requests[LedDriverRequest_Init] = true;
|
||||
}
|
||||
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
@@ -99,31 +121,62 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
status_t status = kStatus_Uhk_IdleSlave;
|
||||
uint8_t *ledValues = LedDriverValues[ledDriverId];
|
||||
led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
|
||||
uint8_t *ledDriverPhase = ¤tLedDriverState->phase;
|
||||
uint8_t ledDriverAddress = currentLedDriverState->i2cAddress;
|
||||
uint8_t *ledIndex = ¤tLedDriverState->ledIndex;
|
||||
|
||||
switch (*ledDriverPhase) {
|
||||
case LedDriverPhase_SetFunctionFrame:
|
||||
switch (currentLedDriverState->phase) {
|
||||
case LedDriverPhase_SetFunctionFrameInit:
|
||||
if (ledDriverId == LedDriverId_Left && !Slaves[SlaveId_LeftKeyboardHalf].isConnected) {
|
||||
break;
|
||||
}
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer));
|
||||
*ledDriverPhase = LedDriverPhase_SetShutdownModeNormal;
|
||||
currentLedDriverState->phase = LedDriverPhase_SetShutdownModeNormalInit;
|
||||
break;
|
||||
case LedDriverPhase_SetShutdownModeNormal:
|
||||
case LedDriverPhase_SetShutdownModeNormalInit:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setShutdownModeNormalBuffer, sizeof(setShutdownModeNormalBuffer));
|
||||
*ledDriverPhase = LedDriverPhase_SetFrame1;
|
||||
currentLedDriverState->phase = LedDriverPhase_InitAutoPlayControlRegister1Init;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame1:
|
||||
case LedDriverPhase_InitAutoPlayControlRegister1Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initAutoPlayControlRegister1Buffer, sizeof(initAutoPlayControlRegister1Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_InitAutoPlayControlRegister2Init;
|
||||
break;
|
||||
case LedDriverPhase_InitAutoPlayControlRegister2Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initAutoPlayControlRegister2Buffer, sizeof(initAutoPlayControlRegister2Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_InitBreathControlRegister1Init;
|
||||
break;
|
||||
case LedDriverPhase_InitBreathControlRegister1Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initBreathControlRegister1Buffer, sizeof(initBreathControlRegister1Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_InitBreathControlRegister2Init;
|
||||
break;
|
||||
case LedDriverPhase_InitBreathControlRegister2Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initBreathControlRegister2Buffer, sizeof(initBreathControlRegister2Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFrame2Init;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame2Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFrame2Buffer, sizeof(setFrame2Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_InitLedControlRegistersZero1Init;
|
||||
break;
|
||||
case LedDriverPhase_InitLedControlRegistersZero1Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initLedControlRegistersZeroBuffer, sizeof(initLedControlRegistersZeroBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFrame8Init;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame8Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFrame8Buffer, sizeof(setFrame8Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_InitLedControlRegistersZero2Init;
|
||||
break;
|
||||
case LedDriverPhase_InitLedControlRegistersZero2Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, initLedControlRegistersZeroBuffer, sizeof(initLedControlRegistersZeroBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFrame1Init;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame1Init:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer));
|
||||
*ledDriverPhase = LedDriverPhase_InitLedControlRegisters;
|
||||
currentLedDriverState->phase = LedDriverPhase_InitLedControlRegistersInit;
|
||||
break;
|
||||
case LedDriverPhase_InitLedControlRegisters:
|
||||
case LedDriverPhase_InitLedControlRegistersInit:
|
||||
status = I2cAsyncWrite(ledDriverAddress, currentLedDriverState->setupLedControlRegistersCommand, LED_CONTROL_REGISTERS_COMMAND_LENGTH);
|
||||
*ledDriverPhase = LedDriverPhase_InitLedValues;
|
||||
currentLedDriverState->phase = LedDriverPhase_InitLedValuesInit;
|
||||
break;
|
||||
case LedDriverPhase_InitLedValues:
|
||||
case LedDriverPhase_InitLedValuesInit:
|
||||
updatePwmRegistersBuffer[0] = FRAME_REGISTER_PWM_FIRST + *ledIndex;
|
||||
uint8_t chunkSize = MIN(LED_DRIVER_LED_COUNT - *ledIndex, PMW_REGISTER_UPDATE_CHUNK_SIZE);
|
||||
memcpy(updatePwmRegistersBuffer+1, ledValues + *ledIndex, chunkSize);
|
||||
@@ -132,10 +185,35 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
if (*ledIndex >= LED_DRIVER_LED_COUNT) {
|
||||
*ledIndex = 0;
|
||||
memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT);
|
||||
*ledDriverPhase = LedDriverPhase_UpdateChangedLedValues;
|
||||
currentLedDriverState->phase = LedDriverPhase_Idle;
|
||||
}
|
||||
break;
|
||||
case LedDriverPhase_UpdateChangedLedValues: {
|
||||
case LedDriverPhase_Idle: {
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i <= LedDriverRequest_Last; i++) {
|
||||
if (currentLedDriverState->requests[i]) {
|
||||
currentLedDriverState->requests[i] = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
switch (i) {
|
||||
case LedDriverRequest_Init:
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrameInit;
|
||||
break;
|
||||
case LedDriverRequest_EnableLeds:
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrameEnableLeds;
|
||||
break;
|
||||
case LedDriverRequest_DisableLeds:
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrameDisableLeds;
|
||||
break;
|
||||
case LedDriverRequest_UpdateLeds:
|
||||
currentLedDriverState->phase = LedDriverPhase_UpdateChangedLedValuesUpdateLeds;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LedDriverPhase_UpdateChangedLedValuesUpdateLeds: {
|
||||
uint8_t *targetLedValues = currentLedDriverState->targetLedValues;
|
||||
|
||||
uint8_t lastLedChunkStartIndex = LED_DRIVER_LED_COUNT - PMW_REGISTER_UPDATE_CHUNK_SIZE;
|
||||
@@ -155,6 +233,7 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
bool foundStartIndex = count < LED_DRIVER_LED_COUNT;
|
||||
if (!foundStartIndex) {
|
||||
*ledIndex = 0;
|
||||
currentLedDriverState->phase = LedDriverPhase_Idle;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -175,9 +254,34 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
|
||||
*ledIndex += length;
|
||||
if (*ledIndex >= LED_DRIVER_LED_COUNT) {
|
||||
*ledIndex = 0;
|
||||
currentLedDriverState->phase = LedDriverPhase_Idle;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LedDriverPhase_SetFunctionFrameDisableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetConfigurationRegisterDisableLeds;
|
||||
break;
|
||||
case LedDriverPhase_SetConfigurationRegisterDisableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setConfigurationRegisterFadeOutBuffer, sizeof(setConfigurationRegisterFadeOutBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFrame1DisableLeds;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame1DisableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_Idle;
|
||||
break;
|
||||
case LedDriverPhase_SetFunctionFrameEnableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetConfigurationRegisterEnableLeds;
|
||||
break;
|
||||
case LedDriverPhase_SetConfigurationRegisterEnableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setConfigurationRegisterFadeInBuffer, sizeof(setConfigurationRegisterFadeInBuffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_SetFrame1EnableLeds;
|
||||
break;
|
||||
case LedDriverPhase_SetFrame1EnableLeds:
|
||||
status = I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer));
|
||||
currentLedDriverState->phase = LedDriverPhase_Idle;
|
||||
break;
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
@@ -20,6 +20,14 @@
|
||||
|
||||
// Typedefs:
|
||||
|
||||
enum {
|
||||
LedDriverRequest_Init,
|
||||
LedDriverRequest_EnableLeds,
|
||||
LedDriverRequest_DisableLeds,
|
||||
LedDriverRequest_UpdateLeds,
|
||||
LedDriverRequest_Last = LedDriverRequest_UpdateLeds
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
LedDriverId_Right,
|
||||
LedDriverId_Left,
|
||||
@@ -27,15 +35,31 @@
|
||||
} led_driver_id_t;
|
||||
|
||||
typedef enum {
|
||||
LedDriverPhase_SetFunctionFrame,
|
||||
LedDriverPhase_SetShutdownModeNormal,
|
||||
LedDriverPhase_SetFrame1,
|
||||
LedDriverPhase_InitLedControlRegisters,
|
||||
LedDriverPhase_InitLedValues,
|
||||
LedDriverPhase_UpdateChangedLedValues,
|
||||
LedDriverPhase_Idle,
|
||||
LedDriverPhase_SetFunctionFrameInit,
|
||||
LedDriverPhase_SetFunctionFrameDisableLeds,
|
||||
LedDriverPhase_SetFunctionFrameEnableLeds,
|
||||
LedDriverPhase_SetShutdownModeNormalInit,
|
||||
LedDriverPhase_SetFrame1Init,
|
||||
LedDriverPhase_SetFrame1EnableLeds,
|
||||
LedDriverPhase_SetFrame1DisableLeds,
|
||||
LedDriverPhase_SetFrame2Init,
|
||||
LedDriverPhase_SetFrame8Init,
|
||||
LedDriverPhase_InitAutoPlayControlRegister1Init,
|
||||
LedDriverPhase_InitAutoPlayControlRegister2Init,
|
||||
LedDriverPhase_InitBreathControlRegister1Init,
|
||||
LedDriverPhase_InitBreathControlRegister2Init,
|
||||
LedDriverPhase_InitLedControlRegistersZero1Init,
|
||||
LedDriverPhase_InitLedControlRegistersZero2Init,
|
||||
LedDriverPhase_InitLedValuesInit,
|
||||
LedDriverPhase_UpdateChangedLedValuesUpdateLeds,
|
||||
LedDriverPhase_SetConfigurationRegisterDisableLeds,
|
||||
LedDriverPhase_SetConfigurationRegisterEnableLeds,
|
||||
LedDriverPhase_InitLedControlRegistersInit
|
||||
} led_driver_phase_t;
|
||||
|
||||
typedef struct {
|
||||
bool requests[LedDriverRequest_Last + 1];
|
||||
led_driver_phase_t phase;
|
||||
uint8_t targetLedValues[LED_DRIVER_LED_COUNT];
|
||||
uint8_t ledIndex;
|
||||
@@ -50,8 +74,9 @@
|
||||
|
||||
// Functions:
|
||||
|
||||
void LedSlaveDriver_DisableLeds(void);
|
||||
void LedSlaveDriver_UpdateLeds(void);
|
||||
void LedSlaveDriver_DisableLeds(uint8_t ledDriverId);
|
||||
void LedSlaveDriver_EnableLeds(uint8_t ledDriverId);
|
||||
void LedSlaveDriver_UpdateLeds(uint8_t ledDriverId);
|
||||
void LedSlaveDriver_Init(uint8_t ledDriverId);
|
||||
status_t LedSlaveDriver_Update(uint8_t ledDriverId);
|
||||
|
||||
|
||||
@@ -2,12 +2,13 @@
|
||||
#include "timer.h"
|
||||
#include "peripherals/test_led.h"
|
||||
|
||||
volatile uint32_t CurrentTime;
|
||||
static uint32_t timerClockFrequency;
|
||||
static volatile uint32_t currentTime, delayLength;
|
||||
static volatile uint32_t delayLength;
|
||||
|
||||
void PIT_TIMER_HANDLER(void)
|
||||
{
|
||||
currentTime++;
|
||||
CurrentTime++;
|
||||
if (delayLength) {
|
||||
--delayLength;
|
||||
}
|
||||
@@ -28,15 +29,11 @@ void Timer_Init(void)
|
||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||
}
|
||||
|
||||
uint32_t Timer_GetCurrentTime() {
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetCurrentTimeMicros() {
|
||||
uint32_t primask, count, ms;
|
||||
primask = DisableGlobalIRQ(); // Make sure the read is atomic
|
||||
count = PIT_GetCurrentTimerCount(PIT, PIT_TIMER_CHANNEL); // Read the current timer count
|
||||
ms = currentTime; // Read the overflow counter
|
||||
ms = CurrentTime; // Read the overflow counter
|
||||
EnableGlobalIRQ(primask); // Enable interrupts again if they where enabled before - this should make it interrupt safe
|
||||
|
||||
// Calculate the counter value in microseconds - note that the PIT timer is counting downward, so we need to subtract the count from the period value
|
||||
@@ -44,11 +41,6 @@ uint32_t Timer_GetCurrentTimeMicros() {
|
||||
return ms * 1000U * TIMER_INTERVAL_MSEC + us;
|
||||
}
|
||||
|
||||
void Timer_SetCurrentTime(uint32_t *time)
|
||||
{
|
||||
*time = Timer_GetCurrentTime();
|
||||
}
|
||||
|
||||
void Timer_SetCurrentTimeMicros(uint32_t *time)
|
||||
{
|
||||
*time = Timer_GetCurrentTimeMicros();
|
||||
@@ -56,20 +48,18 @@ void Timer_SetCurrentTimeMicros(uint32_t *time)
|
||||
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetCurrentTime() - *time;
|
||||
return elapsedTime;
|
||||
return CurrentTime - *time;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetCurrentTimeMicros() - *time;
|
||||
return elapsedTime;
|
||||
return Timer_GetCurrentTimeMicros() - *time;
|
||||
}
|
||||
|
||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
||||
{
|
||||
uint32_t elapsedTime = Timer_GetElapsedTime(time);
|
||||
*time = Timer_GetCurrentTime();
|
||||
*time = CurrentTime;
|
||||
return elapsedTime;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
|
||||
#define TIMER_INTERVAL_MSEC 1
|
||||
|
||||
// Variables:
|
||||
|
||||
extern volatile uint32_t CurrentTime;
|
||||
|
||||
// Functions:
|
||||
|
||||
void Timer_Init(void);
|
||||
uint32_t Timer_GetCurrentTime();
|
||||
uint32_t Timer_GetCurrentTimeMicros();
|
||||
void Timer_SetCurrentTime(uint32_t *time);
|
||||
void Timer_SetCurrentTimeMicros(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time);
|
||||
|
||||
@@ -22,7 +22,7 @@ void UsbCommand_GetDebugBuffer(void)
|
||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||
SetDebugBufferUint32(17, MatrixScanCounter);
|
||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
||||
SetDebugBufferUint32(25, CurrentTime);
|
||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||
|
||||
@@ -69,7 +69,7 @@ void UsbCommand_GetDeviceProperty(void)
|
||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||
break;
|
||||
case DevicePropertyId_Uptime:
|
||||
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
|
||||
SetUsbTxBufferUint32(1, CurrentTime);
|
||||
break;
|
||||
default:
|
||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||
|
||||
@@ -21,5 +21,8 @@ void UsbCommand_GetVariable(void)
|
||||
case UsbVariable_DebounceTimeRelease:
|
||||
SetUsbTxBufferUint8(1, DebounceTimeRelease);
|
||||
break;
|
||||
case UsbVariable_UsbReportSemaphore:
|
||||
SetUsbTxBufferUint8(1, UsbReportUpdateSemaphore);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,5 +24,8 @@ void UsbCommand_SetVariable(void)
|
||||
case UsbVariable_DebounceTimeRelease:
|
||||
DebounceTimeRelease = GetUsbRxBufferUint8(2);
|
||||
break;
|
||||
case UsbVariable_UsbReportSemaphore:
|
||||
UsbReportUpdateSemaphore = GetUsbRxBufferUint8(2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,12 +168,16 @@ static volatile bool wakeUpHostAllowed;
|
||||
|
||||
static void suspendUhk(void) {
|
||||
SleepModeActive = true;
|
||||
LedSlaveDriver_DisableLeds();
|
||||
for (uint8_t i = 0; i <= LedDriverId_Last; i++) {
|
||||
LedSlaveDriver_DisableLeds(i);
|
||||
}
|
||||
}
|
||||
|
||||
static void wakeUpUhk(void) {
|
||||
SleepModeActive = false;
|
||||
LedSlaveDriver_UpdateLeds();
|
||||
for (uint8_t i = 0; i <= LedDriverId_Last; i++) {
|
||||
LedSlaveDriver_EnableLeds(i);
|
||||
}
|
||||
}
|
||||
|
||||
void WakeUpHost(void) {
|
||||
|
||||
@@ -42,7 +42,8 @@
|
||||
UsbVariable_TestSwitches,
|
||||
UsbVariable_TestUsbStack,
|
||||
UsbVariable_DebounceTimePress,
|
||||
UsbVariable_DebounceTimeRelease
|
||||
UsbVariable_DebounceTimeRelease,
|
||||
UsbVariable_UsbReportSemaphore,
|
||||
} usb_variable_id_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -20,11 +20,12 @@
|
||||
static uint32_t mouseUsbReportUpdateTime = 0;
|
||||
static uint32_t mouseElapsedTime;
|
||||
|
||||
uint16_t DoubleTapSwitchLayerTimeout = 150;
|
||||
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
||||
uint16_t DoubleTapSwitchLayerTimeout = 300;
|
||||
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 200;
|
||||
|
||||
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||
bool TestUsbStack = false;
|
||||
static key_action_t actionCache[SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE];
|
||||
|
||||
volatile uint8_t UsbReportUpdateSemaphore = 0;
|
||||
|
||||
@@ -206,15 +207,15 @@ static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action)
|
||||
doubleTapSwitchLayerKey = NULL;
|
||||
}
|
||||
|
||||
if (action->type != KeyActionType_SwitchLayer) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!keyState->previous && isLayerDoubleTapToggled && ToggledLayer == action->switchLayer.layer) {
|
||||
ToggledLayer = LayerId_Base;
|
||||
isLayerDoubleTapToggled = false;
|
||||
}
|
||||
|
||||
if (action->type != KeyActionType_SwitchLayer) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (keyState->previous && doubleTapSwitchLayerKey == keyState &&
|
||||
Timer_GetElapsedTime(&doubleTapSwitchLayerTriggerTime) > DoubleTapSwitchLayerReleaseTimeout)
|
||||
{
|
||||
@@ -225,11 +226,11 @@ static void handleSwitchLayerAction(key_state_t *keyState, key_action_t *action)
|
||||
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||
ToggledLayer = action->switchLayer.layer;
|
||||
isLayerDoubleTapToggled = true;
|
||||
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
|
||||
doubleTapSwitchLayerTriggerTime = CurrentTime;
|
||||
} else {
|
||||
doubleTapSwitchLayerKey = keyState;
|
||||
}
|
||||
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
|
||||
doubleTapSwitchLayerStartTime = CurrentTime;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,6 +238,10 @@ static uint8_t basicScancodeIndex = 0;
|
||||
static uint8_t mediaScancodeIndex = 0;
|
||||
static uint8_t systemScancodeIndex = 0;
|
||||
static uint8_t stickyModifiers;
|
||||
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
||||
static uint8_t secondaryRoleSlotId;
|
||||
static uint8_t secondaryRoleKeyId;
|
||||
static secondary_role_t secondaryRole;
|
||||
|
||||
static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||
{
|
||||
@@ -288,6 +293,7 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||
case KeyActionType_SwitchKeymap:
|
||||
if (!keyState->previous) {
|
||||
stickyModifiers = 0;
|
||||
secondaryRoleState = SecondaryRoleState_Released;
|
||||
SwitchKeymapById(action->switchKeymap.keymapId);
|
||||
}
|
||||
break;
|
||||
@@ -300,11 +306,6 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t secondaryRoleState = SecondaryRoleState_Released;
|
||||
static uint8_t secondaryRoleSlotId;
|
||||
static uint8_t secondaryRoleKeyId;
|
||||
static secondary_role_t secondaryRole;
|
||||
|
||||
static void updateActiveUsbReports(void)
|
||||
{
|
||||
if (MacroPlaying) {
|
||||
@@ -333,7 +334,6 @@ static void updateActiveUsbReports(void)
|
||||
if (layerChanged) {
|
||||
stickyModifiers = 0;
|
||||
}
|
||||
bool layerGotReleased = layerChanged && activeLayer == LayerId_Base;
|
||||
LedDisplay_SetLayer(activeLayer);
|
||||
|
||||
if (TestUsbStack) {
|
||||
@@ -351,32 +351,42 @@ static void updateActiveUsbReports(void)
|
||||
isEvenMedia = !isEvenMedia;
|
||||
ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP;
|
||||
}
|
||||
MouseMoveState.xOut = isEven ? -1 : 1;
|
||||
MouseMoveState.xOut = isEven ? -5 : 5;
|
||||
}
|
||||
}
|
||||
|
||||
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];
|
||||
key_action_t *action;
|
||||
|
||||
if (keyState->debouncing) {
|
||||
if ((uint8_t)(Timer_GetCurrentTime() - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) {
|
||||
if ((uint8_t)(CurrentTime - 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->timestamp = CurrentTime;
|
||||
keyState->debouncing = true;
|
||||
}
|
||||
|
||||
if (keyState->current) {
|
||||
key_action_t *baseAction = &CurrentKeymap[LayerId_Base][slotId][keyId];
|
||||
if (layerGotReleased && !(baseAction->type == KeyActionType_Keystroke && baseAction->keystroke.scancode == 0 && baseAction->keystroke.modifiers)) {
|
||||
keyState->suppressed = true;
|
||||
if (keyState->current && !keyState->previous) {
|
||||
if (SleepModeActive) {
|
||||
WakeUpHost();
|
||||
}
|
||||
if (secondaryRoleState == SecondaryRoleState_Pressed) {
|
||||
// Trigger secondary role.
|
||||
secondaryRoleState = SecondaryRoleState_Triggered;
|
||||
keyState->current = false;
|
||||
} else {
|
||||
actionCache[slotId][keyId] = CurrentKeymap[activeLayer][slotId][keyId];
|
||||
}
|
||||
}
|
||||
|
||||
action = &actionCache[slotId][keyId];
|
||||
|
||||
if (keyState->current) {
|
||||
if (action->type == KeyActionType_Keystroke && action->keystroke.secondaryRole) {
|
||||
// Press released secondary role key.
|
||||
if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Released) {
|
||||
@@ -387,23 +397,16 @@ static void updateActiveUsbReports(void)
|
||||
keyState->suppressed = true;
|
||||
}
|
||||
} else {
|
||||
// Trigger secondary role.
|
||||
if (!keyState->previous && secondaryRoleState == SecondaryRoleState_Pressed) {
|
||||
secondaryRoleState = SecondaryRoleState_Triggered;
|
||||
keyState->current = false;
|
||||
} else {
|
||||
applyKeyAction(keyState, action);
|
||||
}
|
||||
applyKeyAction(keyState, action);
|
||||
}
|
||||
} else {
|
||||
if (keyState->suppressed) {
|
||||
keyState->suppressed = false;
|
||||
}
|
||||
keyState->suppressed = false;
|
||||
|
||||
// Release secondary role key.
|
||||
if (keyState->previous && secondaryRoleSlotId == slotId && secondaryRoleKeyId == keyId) {
|
||||
// Trigger primary role.
|
||||
if (secondaryRoleState == SecondaryRoleState_Pressed) {
|
||||
keyState->previous = false;
|
||||
applyKeyAction(keyState, action);
|
||||
}
|
||||
secondaryRoleState = SecondaryRoleState_Released;
|
||||
@@ -432,26 +435,21 @@ uint32_t UsbReportUpdateCounter;
|
||||
|
||||
void UpdateUsbReports(void)
|
||||
{
|
||||
static uint32_t lastUpdateTime;
|
||||
|
||||
for (uint8_t keyId = 0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
|
||||
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
|
||||
}
|
||||
|
||||
if (SleepModeActive) {
|
||||
for (uint8_t slotId = 0; slotId < SLOT_COUNT; slotId++) {
|
||||
for (uint8_t keyId = 0; keyId < MAX_KEY_COUNT_PER_MODULE; keyId++) {
|
||||
if (KeyStates[slotId][keyId].current) {
|
||||
WakeUpHost();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (UsbReportUpdateSemaphore && !SleepModeActive) {
|
||||
if (Timer_GetElapsedTime(&lastUpdateTime) < USB_SEMAPHORE_TIMEOUT) {
|
||||
return;
|
||||
} else {
|
||||
UsbReportUpdateSemaphore = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (UsbReportUpdateSemaphore) {
|
||||
return;
|
||||
}
|
||||
|
||||
lastUpdateTime = CurrentTime;
|
||||
UsbReportUpdateCounter++;
|
||||
|
||||
ResetActiveUsbBasicKeyboardReport();
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#define SECONDARY_ROLE_MODIFIER_TO_HID_MODIFIER(secondaryRoleModifier) (1 << ((secondaryRoleModifier) - 1))
|
||||
#define SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRoleLayer) ((secondaryRoleLayer) - SecondaryRole_RightSuper)
|
||||
|
||||
#define USB_SEMAPHORE_TIMEOUT 100 // ms
|
||||
|
||||
// Typedefs:
|
||||
|
||||
typedef enum {
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
"commander": "^2.11.0",
|
||||
"shelljs": "^0.7.8"
|
||||
},
|
||||
"firmwareVersion": "8.4.2",
|
||||
"deviceProtocolVersion": "4.4.0",
|
||||
"firmwareVersion": "8.5.3",
|
||||
"deviceProtocolVersion": "4.5.0",
|
||||
"moduleProtocolVersion": "4.0.0",
|
||||
"userConfigVersion": "4.1.0",
|
||||
"hardwareConfigVersion": "1.0.0",
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
// Variables:
|
||||
|
||||
#define FIRMWARE_MAJOR_VERSION 8
|
||||
#define FIRMWARE_MINOR_VERSION 4
|
||||
#define FIRMWARE_PATCH_VERSION 2
|
||||
#define FIRMWARE_MINOR_VERSION 5
|
||||
#define FIRMWARE_PATCH_VERSION 3
|
||||
|
||||
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
||||
#define DEVICE_PROTOCOL_MINOR_VERSION 4
|
||||
#define DEVICE_PROTOCOL_MINOR_VERSION 5
|
||||
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
||||
|
||||
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
||||
|
||||
Reference in New Issue
Block a user