Compare commits
110 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28f5999cbb | ||
|
|
fe7505a2df | ||
|
|
b6ac16074c | ||
|
|
0bf205c5d2 | ||
|
|
e4a99a9400 | ||
|
|
1e9b5833eb | ||
|
|
79b052fca7 | ||
|
|
baee0b5682 | ||
|
|
6153d54f59 | ||
|
|
0a6ebe2903 | ||
|
|
1fbbeb0f33 | ||
|
|
456f0e9e58 | ||
|
|
0248a0e79f | ||
|
|
0e5ec29433 | ||
|
|
2d7cd68459 | ||
|
|
5ac10fabcb | ||
|
|
b11017609d | ||
|
|
c3a5d258e5 | ||
|
|
a2866feb77 | ||
|
|
8c50192d6c | ||
|
|
63d82d92db | ||
|
|
1bced1be13 | ||
|
|
86196d438c | ||
|
|
d722b3d173 | ||
|
|
2ef5c49090 | ||
|
|
5a137392ee | ||
|
|
27d12ea31f | ||
|
|
9ba09ec8eb | ||
|
|
014addd777 | ||
|
|
4562a17155 | ||
|
|
950843ca2c | ||
|
|
9600f46f83 | ||
|
|
ef7589d83a | ||
|
|
84f48ed055 | ||
|
|
ebef301e27 | ||
|
|
5b8b8d93e4 | ||
|
|
d48049535e | ||
|
|
5bd479ab8e | ||
|
|
372151848a | ||
|
|
5b32c0da43 | ||
|
|
edf34de4b5 | ||
|
|
8c7eb079ec | ||
|
|
6612f7cced | ||
|
|
7606f311c8 | ||
|
|
9fe73233af | ||
|
|
cba1ef97b6 | ||
|
|
c69f664e85 | ||
|
|
6c895988de | ||
|
|
f16a004583 | ||
|
|
c870f335a7 | ||
|
|
b6f59563c7 | ||
|
|
409bd01af6 | ||
|
|
b9b5eb2c76 | ||
|
|
11a8ffbaf5 | ||
|
|
9938f14d20 | ||
|
|
217259ba63 | ||
|
|
e5afa33b79 | ||
|
|
d3dfc9bd2c | ||
|
|
8f6251bc4d | ||
|
|
b93f211502 | ||
|
|
69411e53e9 | ||
|
|
39819e6058 | ||
|
|
bd97bba4b5 | ||
|
|
4214f3e0b6 | ||
|
|
6eceb6ad30 | ||
|
|
994e2f6b79 | ||
|
|
baa5e8f037 | ||
|
|
cbd5f1b500 | ||
|
|
c1dc4be8c8 | ||
|
|
1bd8c7dca8 | ||
|
|
d72ea4dde5 | ||
|
|
5d621880ec | ||
|
|
5c3e2966c4 | ||
|
|
8c02f3db53 | ||
|
|
02bbeb7177 | ||
|
|
0e9525ce9a | ||
|
|
633a6cec77 | ||
|
|
d35a7cc644 | ||
|
|
76a91c010b | ||
|
|
54b0a595bc | ||
|
|
4b9aa0860c | ||
|
|
df8792a60d | ||
|
|
5988fce59b | ||
|
|
314eb0d771 | ||
|
|
c1f5a96e1b | ||
|
|
64592d7032 | ||
|
|
c6b180b8f5 | ||
|
|
0155447c6a | ||
|
|
04f4053bde | ||
|
|
09a58b607c | ||
|
|
be82530412 | ||
|
|
6e11c0b8af | ||
|
|
9fade6368c | ||
|
|
a061febd01 | ||
|
|
e3773fd5c0 | ||
|
|
a92835454d | ||
|
|
64e5fa7ecb | ||
|
|
d1894fb62a | ||
|
|
fe7065be4a | ||
|
|
e7b3127af1 | ||
|
|
724378cf6c | ||
|
|
14eb9c6ec0 | ||
|
|
9a8b1ef8b9 | ||
|
|
2cc94bd1fc | ||
|
|
ad8de4dd56 | ||
|
|
5e97ad1b3c | ||
|
|
fe06ed0a4b | ||
|
|
d449123fab | ||
|
|
4d483e7896 | ||
|
|
9be3cf4865 |
36
.travis.yml
36
.travis.yml
@@ -1,36 +1,22 @@
|
|||||||
language: c
|
language: c
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- $HOME/Library/Caches/Homebrew/Cask
|
# Cache for the gcc archives
|
||||||
|
- $HOME/gcc-cache/
|
||||||
|
|
||||||
install: eclipse -noSplash
|
install:
|
||||||
-application org.eclipse.equinox.p2.director
|
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then GCC_NAME="gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2"; else GCC_NAME="gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"; fi
|
||||||
-repository http://gnuarmeclipse.sourceforge.net/updates
|
- if test ! -e $HOME/gcc-cache/$GCC_NAME ; then wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/$GCC_NAME" -O $HOME/gcc-cache/$GCC_NAME ; fi
|
||||||
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
|
- tar -xf $HOME/gcc-cache/$GCC_NAME -C $HOME
|
||||||
-profileProperties org.eclipse.update.install.features=true
|
- export PATH=$PATH:$HOME/gcc-arm-none-eabi-7-2017-q4-major/bin
|
||||||
|
|
||||||
before_script:
|
|
||||||
- tar -xf gcc-arm-none-eabi-7-2017-q4-major-*.tar.bz2
|
|
||||||
- export PATH=$PATH:$PWD/gcc-arm-none-eabi-7-2017-q4-major/bin
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- eclipse -noSplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import $TRAVIS_BUILD_DIR/left/build -import $TRAVIS_BUILD_DIR/right/build -build all
|
|
||||||
- make -C left clean && make -j2 -C left DEBUG=1
|
- make -C left clean && make -j2 -C left DEBUG=1
|
||||||
- make -C left clean && make -j2 -C left DEBUG=0
|
- make -C left clean && make -j2 -C left DEBUG=0
|
||||||
- make -C right clean && make -j2 -C right DEBUG=1
|
- make -C right clean && make -j2 -C right DEBUG=1
|
||||||
- make -C right clean && make -j2 -C right DEBUG=0
|
- make -C right clean && make -j2 -C right DEBUG=0
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
sudo: required
|
|
||||||
before_install:
|
|
||||||
- curl https://nixos.org/nix/install | sh && . ~/.nix-profile/etc/profile.d/nix.sh
|
|
||||||
- nix-env -i eclipse-cpp
|
|
||||||
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"
|
|
||||||
- os: osx
|
|
||||||
env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS"
|
|
||||||
before_install:
|
|
||||||
- brew cask install eclipse-cpp
|
|
||||||
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2"
|
|
||||||
|
|||||||
31
CHANGELOG.md
31
CHANGELOG.md
@@ -5,6 +5,37 @@ 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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
- Implement the macro engine.
|
||||||
|
- 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.3.2] - 2018-06-27
|
## [8.3.2] - 2018-06-27
|
||||||
|
|
||||||
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ void RunWatchdog(void)
|
|||||||
cntr++;
|
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 */
|
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;
|
cntr=0;
|
||||||
TEST_LED_TOGGLE();
|
TestLed_Toggle();
|
||||||
I2cWatchdog_WatchCounter++;
|
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 */
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ void InitPeripherals(void)
|
|||||||
{
|
{
|
||||||
initInterruptPriorities();
|
initInterruptPriorities();
|
||||||
InitLedDriver();
|
InitLedDriver();
|
||||||
InitTestLed();
|
TestLed_Init();
|
||||||
LedPwm_Init();
|
LedPwm_Init();
|
||||||
DebugOverSpi_Init();
|
DebugOverSpi_Init();
|
||||||
initI2c();
|
initI2c();
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ void SlaveRxHandler(void)
|
|||||||
case SlaveCommand_SetTestLed:
|
case SlaveCommand_SetTestLed:
|
||||||
TxMessage.length = 0;
|
TxMessage.length = 0;
|
||||||
bool isLedOn = RxMessage.data[1];
|
bool isLedOn = RxMessage.data[1];
|
||||||
TEST_LED_SET(isLedOn);
|
TestLed_Set(isLedOn);
|
||||||
break;
|
break;
|
||||||
case SlaveCommand_SetLedPwmBrightness:
|
case SlaveCommand_SetLedPwmBrightness:
|
||||||
TxMessage.length = 0;
|
TxMessage.length = 0;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
#include "test_led.h"
|
#include "test_led.h"
|
||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
|
|
||||||
extern void InitTestLed(void)
|
extern void TestLed_Init(void)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||||
PORT_SetPinMux(TEST_LED_PORT, TEST_LED_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(TEST_LED_PORT, TEST_LED_PIN, kPORT_MuxAsGpio);
|
||||||
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 0});
|
||||||
TEST_LED_ON();
|
TestLed_On();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,28 @@
|
|||||||
#define TEST_LED_CLOCK kCLOCK_PortB
|
#define TEST_LED_CLOCK kCLOCK_PortB
|
||||||
#define TEST_LED_PIN 13
|
#define TEST_LED_PIN 13
|
||||||
|
|
||||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
static inline void TestLed_On(void)
|
||||||
#define TEST_LED_OFF() GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
{
|
||||||
#define TEST_LED_SET(state) GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_PIN, (state))
|
GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Off(void)
|
||||||
|
{
|
||||||
|
GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Set(bool state)
|
||||||
|
{
|
||||||
|
GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_PIN, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Toggle(void)
|
||||||
|
{
|
||||||
|
GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void InitTestLed(void);
|
void TestLed_Init(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Submodule lib/agent updated: 81a83994ab...fa32f95438
@@ -38,7 +38,7 @@ JLINK_SCRIPT = ../scripts/flash-right.jlink
|
|||||||
BUILD_FLAGS = -DCPU_$(PART)_cm4 -DUSB_STACK_BM -DBL_HAS_BOOTLOADER_CONFIG=1
|
BUILD_FLAGS = -DCPU_$(PART)_cm4 -DUSB_STACK_BM -DBL_HAS_BOOTLOADER_CONFIG=1
|
||||||
|
|
||||||
# Address of the app vector table. The bootloader will take up the flash before this address.
|
# Address of the app vector table. The bootloader will take up the flash before this address.
|
||||||
BL_APP_VECTOR_TABLE_ADDRESS = 0xc000
|
BL_APP_VECTOR_TABLE_ADDRESS ?= 0xc000
|
||||||
|
|
||||||
# Source files.
|
# Source files.
|
||||||
SOURCE = $(wildcard src/*.c) \
|
SOURCE = $(wildcard src/*.c) \
|
||||||
|
|||||||
@@ -457,4 +457,87 @@
|
|||||||
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
|
<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"/>
|
||||||
|
<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"/>
|
||||||
|
</chip>
|
||||||
|
<processor><name gcc_name="cortex-m4">Cortex-M4</name>
|
||||||
|
<family>Cortex-M</family>
|
||||||
|
</processor>
|
||||||
|
<link href="MK22F51212_internal_peripheral.xml" show="embed" type="simple"/>
|
||||||
|
</info>
|
||||||
|
</infoList>
|
||||||
|
</TargetConfig></projectStorage>
|
||||||
|
</storageModule>
|
||||||
|
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
|
||||||
|
<sdkName>SDK_2.x_MK22FN512xxx12</sdkName>
|
||||||
|
<sdkVersion>2.3.1</sdkVersion>
|
||||||
|
</storageModule>
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ parser_error_t parseScrollMouseMacroAction(config_buffer_t *buffer, macro_action
|
|||||||
|
|
||||||
parser_error_t parseDelayMacroAction(config_buffer_t *buffer, macro_action_t *macroAction)
|
parser_error_t parseDelayMacroAction(config_buffer_t *buffer, macro_action_t *macroAction)
|
||||||
{
|
{
|
||||||
int16_t delay = ReadInt16(buffer);
|
uint16_t delay = ReadUInt16(buffer);
|
||||||
|
|
||||||
macroAction->type = MacroActionType_Delay;
|
macroAction->type = MacroActionType_Delay;
|
||||||
macroAction->delay.delay = delay;
|
macroAction->delay.delay = delay;
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
#include "init_peripherals.h"
|
#include "init_peripherals.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
|
||||||
#include "usb_api.h"
|
#include "usb_api.h"
|
||||||
#include "slave_scheduler.h"
|
#include "slave_scheduler.h"
|
||||||
#include "bootloader/wormhole.h"
|
#include "bootloader/wormhole.h"
|
||||||
@@ -66,8 +65,6 @@ static void initInterruptPriorities(void)
|
|||||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||||
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
|
NVIC_SetPriority(I2C_EEPROM_BUS_IRQ_ID, 0);
|
||||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 3);
|
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(I2C_MAIN_BUS_IRQ_ID, 4);
|
||||||
NVIC_SetPriority(USB_IRQ_ID, 4);
|
NVIC_SetPriority(USB_IRQ_ID, 4);
|
||||||
}
|
}
|
||||||
@@ -156,9 +153,8 @@ void InitPeripherals(void)
|
|||||||
InitMergeSensor();
|
InitMergeSensor();
|
||||||
ADC_Init();
|
ADC_Init();
|
||||||
initI2c();
|
initI2c();
|
||||||
InitTestLed();
|
TestLed_Init();
|
||||||
LedPwm_Init();
|
LedPwm_Init();
|
||||||
InitI2cWatchdog();
|
InitI2cWatchdog();
|
||||||
InitKeyDebouncer();
|
|
||||||
EEPROM_Init();
|
EEPROM_Init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
{
|
|
||||||
TEST_LED_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);
|
|
||||||
}
|
|
||||||
@@ -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 5
|
|
||||||
|
|
||||||
// Functions:
|
|
||||||
|
|
||||||
void InitKeyDebouncer(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
@@ -10,10 +10,11 @@
|
|||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool previous;
|
uint8_t timestamp;
|
||||||
bool current;
|
bool previous : 1;
|
||||||
bool suppressed;
|
bool current : 1;
|
||||||
uint8_t debounceCounter;
|
bool suppressed : 1;
|
||||||
|
bool debouncing : 1;
|
||||||
} key_state_t;
|
} key_state_t;
|
||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "config_parser/parse_macro.h"
|
#include "config_parser/parse_macro.h"
|
||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
macro_reference_t AllMacros[MAX_MACRO_NUM];
|
macro_reference_t AllMacros[MAX_MACRO_NUM];
|
||||||
uint8_t AllMacrosCount;
|
uint8_t AllMacrosCount;
|
||||||
@@ -18,69 +19,102 @@ uint8_t characterToScancode(char character)
|
|||||||
{
|
{
|
||||||
switch (character) {
|
switch (character) {
|
||||||
case 'A' ... 'Z':
|
case 'A' ... 'Z':
|
||||||
return 0;
|
|
||||||
case 'a' ... 'z':
|
case 'a' ... 'z':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_A - 1 + (character & 0x1F);
|
||||||
case '1' ... '9':
|
case '1' ... '9':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_1_AND_EXCLAMATION - 1 + (character & 0x0F);
|
||||||
case ')':
|
case ')':
|
||||||
case '0':
|
case '0':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS;
|
||||||
case '!':
|
case '!':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_1_AND_EXCLAMATION;
|
||||||
case '@':
|
case '@':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_2_AND_AT;
|
||||||
case '#':
|
case '#':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_3_AND_HASHMARK;
|
||||||
case '$':
|
case '$':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_4_AND_DOLLAR;
|
||||||
case '%':
|
case '%':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_5_AND_PERCENTAGE;
|
||||||
case '^':
|
case '^':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_6_AND_CARET;
|
||||||
case '&':
|
case '&':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_7_AND_AMPERSAND;
|
||||||
case '*':
|
case '*':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_8_AND_ASTERISK;
|
||||||
case '(':
|
case '(':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS;
|
||||||
case '`':
|
case '`':
|
||||||
case '~':
|
case '~':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE;
|
||||||
case '[':
|
case '[':
|
||||||
case '{':
|
case '{':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE;
|
||||||
case ']':
|
case ']':
|
||||||
case '}':
|
case '}':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE;
|
||||||
case ';':
|
case ';':
|
||||||
case ':':
|
case ':':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_SEMICOLON_AND_COLON;
|
||||||
case '\'':
|
case '\'':
|
||||||
case '\"':
|
case '\"':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE;
|
||||||
case '+':
|
case '+':
|
||||||
case '=':
|
case '=':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_EQUAL_AND_PLUS;
|
||||||
case '\\':
|
case '\\':
|
||||||
case '|':
|
case '|':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_BACKSLASH_AND_PIPE;
|
||||||
case '.':
|
case '.':
|
||||||
case '>':
|
case '>':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
|
||||||
case ',':
|
case ',':
|
||||||
case '<':
|
case '<':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN;
|
||||||
case '/':
|
case '/':
|
||||||
case '\?':
|
case '\?':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
|
||||||
case '-':
|
case '-':
|
||||||
case '_':
|
case '_':
|
||||||
return 0;
|
return HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE;
|
||||||
|
case '\n':
|
||||||
|
return HID_KEYBOARD_SC_ENTER;
|
||||||
|
case ' ':
|
||||||
|
return HID_KEYBOARD_SC_SPACE;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool characterToShift(char character)
|
||||||
|
{
|
||||||
|
switch (character) {
|
||||||
|
case 'A' ... 'Z':
|
||||||
|
case ')':
|
||||||
|
case '!':
|
||||||
|
case '@':
|
||||||
|
case '#':
|
||||||
|
case '$':
|
||||||
|
case '%':
|
||||||
|
case '^':
|
||||||
|
case '&':
|
||||||
|
case '*':
|
||||||
|
case '(':
|
||||||
|
case '~':
|
||||||
|
case '{':
|
||||||
|
case '}':
|
||||||
|
case ':':
|
||||||
|
case '\"':
|
||||||
|
case '+':
|
||||||
|
case '|':
|
||||||
|
case '>':
|
||||||
|
case '<':
|
||||||
|
case '\?':
|
||||||
|
case '_':
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void addBasicScancode(uint8_t scancode)
|
void addBasicScancode(uint8_t scancode)
|
||||||
{
|
{
|
||||||
if (!scancode) {
|
if (!scancode) {
|
||||||
@@ -184,89 +218,183 @@ void deleteSystemScancode(uint8_t scancode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool processKeyMacroAction(void)
|
void addScancode(uint16_t scancode, macro_sub_action_t type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case KeystrokeType_Basic:
|
||||||
|
addBasicScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_Media:
|
||||||
|
addMediaScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_System:
|
||||||
|
addSystemScancode(scancode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deleteScancode(uint16_t scancode, macro_sub_action_t type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case KeystrokeType_Basic:
|
||||||
|
deleteBasicScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_Media:
|
||||||
|
deleteMediaScancode(scancode);
|
||||||
|
break;
|
||||||
|
case KeystrokeType_System:
|
||||||
|
deleteSystemScancode(scancode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processKeyAction(void)
|
||||||
{
|
{
|
||||||
static bool pressStarted;
|
static bool pressStarted;
|
||||||
|
|
||||||
switch (currentMacroAction.key.action) {
|
switch (currentMacroAction.key.action) {
|
||||||
case MacroSubAction_Press:
|
case MacroSubAction_Tap:
|
||||||
if (!pressStarted) {
|
if (!pressStarted) {
|
||||||
pressStarted = true;
|
pressStarted = true;
|
||||||
addModifiers(currentMacroAction.key.modifierMask);
|
addModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
addBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// addMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
addSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
pressStarted = false;
|
pressStarted = false;
|
||||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
deleteBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// deleteMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
deleteSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MacroSubAction_Release:
|
case MacroSubAction_Release:
|
||||||
deleteModifiers(currentMacroAction.key.modifierMask);
|
deleteModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
deleteBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
break;
|
||||||
case KeystrokeType_Media:
|
case MacroSubAction_Press:
|
||||||
// deleteMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
deleteSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case MacroSubAction_Hold:
|
|
||||||
addModifiers(currentMacroAction.key.modifierMask);
|
addModifiers(currentMacroAction.key.modifierMask);
|
||||||
switch (currentMacroAction.key.type) {
|
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
|
||||||
case KeystrokeType_Basic:
|
|
||||||
addBasicScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_Media:
|
|
||||||
// addMediaScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
case KeystrokeType_System:
|
|
||||||
addSystemScancode(currentMacroAction.key.scancode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool processDelayAction(void)
|
||||||
|
{
|
||||||
|
static bool inDelay;
|
||||||
|
static uint32_t delayStart;
|
||||||
|
|
||||||
|
if (inDelay) {
|
||||||
|
if (Timer_GetElapsedTime(&delayStart) >= currentMacroAction.delay.delay) {
|
||||||
|
inDelay = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Timer_SetCurrentTime(&delayStart);
|
||||||
|
inDelay = true;
|
||||||
|
}
|
||||||
|
return inDelay;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processMouseButtonAction(void)
|
||||||
|
{
|
||||||
|
static bool pressStarted;
|
||||||
|
|
||||||
|
switch (currentMacroAction.key.action) {
|
||||||
|
case MacroSubAction_Tap:
|
||||||
|
if (!pressStarted) {
|
||||||
|
pressStarted = true;
|
||||||
|
MacroMouseReport.buttons |= currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
pressStarted = false;
|
||||||
|
MacroMouseReport.buttons &= ~currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
case MacroSubAction_Release:
|
||||||
|
MacroMouseReport.buttons &= ~currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
case MacroSubAction_Press:
|
||||||
|
MacroMouseReport.buttons |= currentMacroAction.mouseButton.mouseButtonsMask;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processMoveMouseAction(void)
|
||||||
|
{
|
||||||
|
static bool inMotion;
|
||||||
|
|
||||||
|
if (inMotion) {
|
||||||
|
MacroMouseReport.x = 0;
|
||||||
|
MacroMouseReport.y = 0;
|
||||||
|
inMotion = false;
|
||||||
|
} else {
|
||||||
|
MacroMouseReport.x = currentMacroAction.moveMouse.x;
|
||||||
|
MacroMouseReport.y = currentMacroAction.moveMouse.y;
|
||||||
|
inMotion = true;
|
||||||
|
}
|
||||||
|
return inMotion;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processScrollMouseAction(void)
|
||||||
|
{
|
||||||
|
static bool inMotion;
|
||||||
|
|
||||||
|
if (inMotion) {
|
||||||
|
MacroMouseReport.wheelX = 0;
|
||||||
|
MacroMouseReport.wheelY = 0;
|
||||||
|
inMotion = false;
|
||||||
|
} else {
|
||||||
|
MacroMouseReport.wheelX = currentMacroAction.scrollMouse.x;
|
||||||
|
MacroMouseReport.wheelY = currentMacroAction.scrollMouse.y;
|
||||||
|
inMotion = true;
|
||||||
|
}
|
||||||
|
return inMotion;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processTextAction(void)
|
||||||
|
{
|
||||||
|
static uint16_t textIndex;
|
||||||
|
static uint8_t reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
char character;
|
||||||
|
uint8_t scancode;
|
||||||
|
|
||||||
|
if (textIndex == currentMacroAction.text.textLen) {
|
||||||
|
textIndex = 0;
|
||||||
|
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
memset(&MacroBasicKeyboardReport, 0, sizeof MacroBasicKeyboardReport);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (reportIndex == USB_BASIC_KEYBOARD_MAX_KEYS) {
|
||||||
|
reportIndex = 0;
|
||||||
|
memset(&MacroBasicKeyboardReport, 0, sizeof MacroBasicKeyboardReport);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
character = currentMacroAction.text.text[textIndex];
|
||||||
|
scancode = characterToScancode(character);
|
||||||
|
for (uint8_t i = 0; i < reportIndex; i++) {
|
||||||
|
if (MacroBasicKeyboardReport.scancodes[i] == scancode) {
|
||||||
|
reportIndex = USB_BASIC_KEYBOARD_MAX_KEYS;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MacroBasicKeyboardReport.scancodes[reportIndex++] = scancode;
|
||||||
|
MacroBasicKeyboardReport.modifiers = characterToShift(character) ? HID_KEYBOARD_MODIFIER_LEFTSHIFT : 0;
|
||||||
|
++textIndex;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool processCurrentMacroAction(void)
|
bool processCurrentMacroAction(void)
|
||||||
{
|
{
|
||||||
switch (currentMacroAction.type) {
|
switch (currentMacroAction.type) {
|
||||||
case MacroActionType_Delay:
|
case MacroActionType_Delay:
|
||||||
return false;
|
return processDelayAction();
|
||||||
case MacroActionType_Key:
|
case MacroActionType_Key:
|
||||||
return processKeyMacroAction();
|
return processKeyAction();
|
||||||
case MacroActionType_MouseButton:
|
case MacroActionType_MouseButton:
|
||||||
return false;
|
return processMouseButtonAction();
|
||||||
case MacroActionType_MoveMouse:
|
case MacroActionType_MoveMouse:
|
||||||
return false;
|
return processMoveMouseAction();
|
||||||
case MacroActionType_ScrollMouse:
|
case MacroActionType_ScrollMouse:
|
||||||
return false;
|
return processScrollMouseAction();
|
||||||
case MacroActionType_Text:
|
case MacroActionType_Text:
|
||||||
return false;
|
return processTextAction();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
} macro_reference_t;
|
} macro_reference_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
MacroSubAction_Tap,
|
||||||
MacroSubAction_Press,
|
MacroSubAction_Press,
|
||||||
MacroSubAction_Hold,
|
|
||||||
MacroSubAction_Release,
|
MacroSubAction_Release,
|
||||||
} macro_sub_action_t;
|
} macro_sub_action_t;
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
int16_t y;
|
int16_t y;
|
||||||
} ATTR_PACKED scrollMouse;
|
} ATTR_PACKED scrollMouse;
|
||||||
struct {
|
struct {
|
||||||
int16_t delay;
|
uint16_t delay;
|
||||||
} ATTR_PACKED delay;
|
} ATTR_PACKED delay;
|
||||||
struct {
|
struct {
|
||||||
const char *text;
|
const char *text;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include "bus_pal_hardware.h"
|
#include "bus_pal_hardware.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "key_scanner.h"
|
#include "right_key_matrix.h"
|
||||||
#include "usb_commands/usb_command_apply_config.h"
|
#include "usb_commands/usb_command_apply_config.h"
|
||||||
#include "peripherals/reset_button.h"
|
#include "peripherals/reset_button.h"
|
||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
@@ -44,8 +44,6 @@ int main(void)
|
|||||||
} else {
|
} else {
|
||||||
InitSlaveScheduler();
|
InitSlaveScheduler();
|
||||||
KeyMatrix_Init(&RightKeyMatrix);
|
KeyMatrix_Init(&RightKeyMatrix);
|
||||||
InitKeyScanner();
|
|
||||||
UpdateUsbReports();
|
|
||||||
InitUsb();
|
InitUsb();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -53,6 +51,8 @@ int main(void)
|
|||||||
UsbCommand_ApplyConfig();
|
UsbCommand_ApplyConfig();
|
||||||
IsConfigInitialized = true;
|
IsConfigInitialized = true;
|
||||||
}
|
}
|
||||||
|
KeyMatrix_ScanRow(&RightKeyMatrix);
|
||||||
|
++MatrixScanCounter;
|
||||||
UpdateUsbReports();
|
UpdateUsbReports();
|
||||||
__WFI();
|
__WFI();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,4 @@
|
|||||||
#define PIT_TIMER_IRQ_ID PIT1_IRQn
|
#define PIT_TIMER_IRQ_ID PIT1_IRQn
|
||||||
#define PIT_TIMER_CHANNEL kPIT_Chnl_1
|
#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
|
#endif
|
||||||
|
|||||||
@@ -1,10 +1,31 @@
|
|||||||
#include "test_led.h"
|
#include "test_led.h"
|
||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
void InitTestLed(void)
|
void TestLed_Init(void)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(TEST_LED_CLOCK);
|
CLOCK_EnableClock(TEST_LED_CLOCK);
|
||||||
PORT_SetPinMux(TEST_LED_GPIO_PORT, TEST_LED_GPIO_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(TEST_LED_GPIO_PORT, TEST_LED_GPIO_PIN, kPORT_MuxAsGpio);
|
||||||
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_GPIO_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
GPIO_PinInit(TEST_LED_GPIO, TEST_LED_GPIO_PIN, &(gpio_pin_config_t){kGPIO_DigitalOutput, 1});
|
||||||
TEST_LED_ON();
|
TestLed_On();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestLed_Blink(uint8_t times)
|
||||||
|
{
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(500);
|
||||||
|
if (!times) {
|
||||||
|
TestLed_On();
|
||||||
|
Timer_Delay(500);
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(500);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (times--) {
|
||||||
|
TestLed_On();
|
||||||
|
Timer_Delay(100);
|
||||||
|
TestLed_Off();
|
||||||
|
Timer_Delay(100);
|
||||||
|
}
|
||||||
|
Timer_Delay(400);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,13 +15,29 @@
|
|||||||
#define TEST_LED_CLOCK kCLOCK_PortD
|
#define TEST_LED_CLOCK kCLOCK_PortD
|
||||||
#define TEST_LED_GPIO_PIN 7U
|
#define TEST_LED_GPIO_PIN 7U
|
||||||
|
|
||||||
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
static inline void TestLed_On(void)
|
||||||
#define TEST_LED_OFF() GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
{
|
||||||
#define TEST_LED_SET(state) GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_GPIO_PIN, (state))
|
GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Off(void)
|
||||||
|
{
|
||||||
|
GPIO_ClearPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Set(bool state)
|
||||||
|
{
|
||||||
|
GPIO_WritePinOutput(TEST_LED_GPIO, TEST_LED_GPIO_PIN, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void TestLed_Toggle(void)
|
||||||
|
{
|
||||||
|
GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN);
|
||||||
|
}
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void InitTestLed(void);
|
void TestLed_Init(void);
|
||||||
|
void TestLed_Blink(uint8_t times);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "right_key_matrix.h"
|
#include "right_key_matrix.h"
|
||||||
|
|
||||||
|
uint32_t MatrixScanCounter;
|
||||||
|
|
||||||
key_matrix_t RightKeyMatrix = {
|
key_matrix_t RightKeyMatrix = {
|
||||||
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
|
.colNum = RIGHT_KEY_MATRIX_COLS_NUM,
|
||||||
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,
|
.rowNum = RIGHT_KEY_MATRIX_ROWS_NUM,
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern key_matrix_t RightKeyMatrix;
|
extern key_matrix_t RightKeyMatrix;
|
||||||
|
extern uint32_t MatrixScanCounter;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
113
right/src/test_switches.c
Normal file
113
right/src/test_switches.c
Normal 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
16
right/src/test_switches.h
Normal 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
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
#include "fsl_pit.h"
|
#include "fsl_pit.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "peripherals/test_led.h"
|
||||||
|
|
||||||
static volatile uint32_t CurrentTime;
|
static uint32_t timerClockFrequency;
|
||||||
|
static volatile uint32_t currentTime, delayLength;
|
||||||
|
|
||||||
void PIT_TIMER_HANDLER(void)
|
void PIT_TIMER_HANDLER(void)
|
||||||
{
|
{
|
||||||
CurrentTime++;
|
currentTime++;
|
||||||
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, PIT_TFLG_TIF_MASK);
|
if (delayLength) {
|
||||||
|
--delayLength;
|
||||||
|
}
|
||||||
|
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, kPIT_TimerFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer_Init(void)
|
void Timer_Init(void)
|
||||||
@@ -15,9 +20,8 @@ void Timer_Init(void)
|
|||||||
PIT_GetDefaultConfig(&pitConfig);
|
PIT_GetDefaultConfig(&pitConfig);
|
||||||
PIT_Init(PIT, &pitConfig);
|
PIT_Init(PIT, &pitConfig);
|
||||||
|
|
||||||
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
|
timerClockFrequency = PIT_SOURCE_CLOCK;
|
||||||
// Figure it out and clean this up.
|
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, timerClockFrequency));
|
||||||
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
|
|
||||||
|
|
||||||
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
|
||||||
EnableIRQ(PIT_TIMER_IRQ_ID);
|
EnableIRQ(PIT_TIMER_IRQ_ID);
|
||||||
@@ -25,23 +29,61 @@ void Timer_Init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetCurrentTime() {
|
uint32_t Timer_GetCurrentTime() {
|
||||||
return CurrentTime;
|
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
|
||||||
|
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
|
||||||
|
uint32_t us = 1000U * TIMER_INTERVAL_MSEC - COUNT_TO_USEC(count, timerClockFrequency);
|
||||||
|
return ms * 1000U * TIMER_INTERVAL_MSEC + us;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer_SetCurrentTime(uint32_t *time)
|
void Timer_SetCurrentTime(uint32_t *time)
|
||||||
{
|
{
|
||||||
*time = CurrentTime;
|
*time = Timer_GetCurrentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Timer_SetCurrentTimeMicros(uint32_t *time)
|
||||||
|
{
|
||||||
|
*time = Timer_GetCurrentTimeMicros();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
uint32_t Timer_GetElapsedTime(uint32_t *time)
|
||||||
{
|
{
|
||||||
uint32_t elapsedTime = CurrentTime - *time;
|
uint32_t elapsedTime = Timer_GetCurrentTime() - *time;
|
||||||
|
return elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time)
|
||||||
|
{
|
||||||
|
uint32_t elapsedTime = Timer_GetCurrentTimeMicros() - *time;
|
||||||
return elapsedTime;
|
return elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
|
||||||
{
|
{
|
||||||
uint32_t elapsedTime = Timer_GetElapsedTime(time);
|
uint32_t elapsedTime = Timer_GetElapsedTime(time);
|
||||||
*time = CurrentTime;
|
*time = Timer_GetCurrentTime();
|
||||||
return elapsedTime;
|
return elapsedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time)
|
||||||
|
{
|
||||||
|
uint32_t elapsedTime = Timer_GetElapsedTimeMicros(time);
|
||||||
|
*time = Timer_GetCurrentTimeMicros();
|
||||||
|
return elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Timer_Delay(uint32_t length)
|
||||||
|
{
|
||||||
|
delayLength = length;
|
||||||
|
while (delayLength) {
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,8 +13,13 @@
|
|||||||
|
|
||||||
void Timer_Init(void);
|
void Timer_Init(void);
|
||||||
uint32_t Timer_GetCurrentTime();
|
uint32_t Timer_GetCurrentTime();
|
||||||
|
uint32_t Timer_GetCurrentTimeMicros();
|
||||||
void Timer_SetCurrentTime(uint32_t *time);
|
void Timer_SetCurrentTime(uint32_t *time);
|
||||||
|
void Timer_SetCurrentTimeMicros(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||||
|
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||||
|
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time);
|
||||||
|
void Timer_Delay(uint32_t length);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#include "i2c_watchdog.h"
|
#include "i2c_watchdog.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_scanner.h"
|
#include "right_key_matrix.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
#include "usb_interfaces/usb_interface_basic_keyboard.h"
|
||||||
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
#include "usb_interfaces/usb_interface_media_keyboard.h"
|
||||||
@@ -20,7 +20,7 @@ void UsbCommand_GetDebugBuffer(void)
|
|||||||
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
|
||||||
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
|
||||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
SetDebugBufferUint32(17, MatrixScanCounter);
|
||||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||||
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
||||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||||
|
|||||||
25
right/src/usb_commands/usb_command_get_variable.c
Normal file
25
right/src/usb_commands/usb_command_get_variable.c
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
right/src/usb_commands/usb_command_get_variable.h
Normal file
8
right/src/usb_commands/usb_command_get_variable.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __USB_COMMAND_GET_VARIABLE_H__
|
||||||
|
#define __USB_COMMAND_GET_VARIABLE_H__
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UsbCommand_GetVariable(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -6,6 +6,6 @@
|
|||||||
void UsbCommand_SetTestLed(void)
|
void UsbCommand_SetTestLed(void)
|
||||||
{
|
{
|
||||||
bool isTestLedOn = GetUsbRxBufferUint8(1);
|
bool isTestLedOn = GetUsbRxBufferUint8(1);
|
||||||
TEST_LED_SET(isTestLedOn);
|
TestLed_Set(isTestLedOn);
|
||||||
UhkModuleStates[UhkModuleDriverId_LeftKeyboardHalf].sourceVars.isTestLedOn = isTestLedOn;
|
UhkModuleStates[UhkModuleDriverId_LeftKeyboardHalf].sourceVars.isTestLedOn = isTestLedOn;
|
||||||
}
|
}
|
||||||
|
|||||||
28
right/src/usb_commands/usb_command_set_variable.c
Normal file
28
right/src/usb_commands/usb_command_set_variable.c
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
right/src/usb_commands/usb_command_set_variable.h
Normal file
8
right/src/usb_commands/usb_command_set_variable.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __USB_COMMAND_SET_VARIABLE_H__
|
||||||
|
#define __USB_COMMAND_SET_VARIABLE_H__
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UsbCommand_SetVariable(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -12,7 +12,13 @@
|
|||||||
// Macros:
|
// Macros:
|
||||||
|
|
||||||
#define USB_COMPOSITE_CONFIGURATION_INDEX 1
|
#define USB_COMPOSITE_CONFIGURATION_INDEX 1
|
||||||
#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 141
|
#define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH \
|
||||||
|
(5 * USB_DESCRIPTOR_LENGTH_INTERFACE + 5 * USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
6 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_CONFIGURE)
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern uint8_t UsbConfigurationDescriptor[USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH];
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -2,32 +2,79 @@
|
|||||||
#include "usb_descriptor_hid.h"
|
#include "usb_descriptor_hid.h"
|
||||||
#include "usb_descriptor_mouse_report.h"
|
#include "usb_descriptor_mouse_report.h"
|
||||||
#include "usb_descriptor_generic_hid_report.h"
|
#include "usb_descriptor_generic_hid_report.h"
|
||||||
|
#include "usb_descriptor_configuration.h"
|
||||||
|
|
||||||
|
#define USB_GENERIC_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_DESCRIPTOR_LENGTH_CONFIGURE + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_GENERIC_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
2 * USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
|
#define USB_MOUSE_HID_DESCRIPTOR_INDEX \
|
||||||
|
(USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX + USB_DESCRIPTOR_LENGTH_HID + \
|
||||||
|
USB_DESCRIPTOR_LENGTH_ENDPOINT + USB_DESCRIPTOR_LENGTH_INTERFACE)
|
||||||
|
|
||||||
usb_status_t USB_DeviceGetHidDescriptor(
|
usb_status_t USB_DeviceGetHidDescriptor(
|
||||||
usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor)
|
usb_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor)
|
||||||
{
|
{
|
||||||
|
hidDescriptor->length = USB_DESCRIPTOR_LENGTH_HID;
|
||||||
|
|
||||||
|
switch (hidDescriptor->interfaceNumber) {
|
||||||
|
case USB_GENERIC_HID_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_GENERIC_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_BASIC_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_BASIC_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_MEDIA_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MEDIA_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_SYSTEM_KEYBOARD_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
case USB_MOUSE_INTERFACE_INDEX:
|
||||||
|
hidDescriptor->buffer = &UsbConfigurationDescriptor[USB_MOUSE_HID_DESCRIPTOR_INDEX];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return kStatus_USB_InvalidRequest;
|
return kStatus_USB_InvalidRequest;
|
||||||
|
}
|
||||||
|
return kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t USB_DeviceGetHidReportDescriptor(
|
usb_status_t USB_DeviceGetHidReportDescriptor(
|
||||||
usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor)
|
usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor)
|
||||||
{
|
{
|
||||||
if (USB_GENERIC_HID_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
switch (hidReportDescriptor->interfaceNumber) {
|
||||||
|
case USB_GENERIC_HID_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
|
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
break;
|
||||||
|
case USB_BASIC_KEYBOARD_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
|
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
break;
|
||||||
|
case USB_MEDIA_KEYBOARD_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
|
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
break;
|
||||||
|
case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
|
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else if (USB_MOUSE_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
|
break;
|
||||||
|
case USB_MOUSE_INTERFACE_INDEX:
|
||||||
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
|
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
|
||||||
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
|
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
|
||||||
} else {
|
break;
|
||||||
|
default:
|
||||||
return kStatus_USB_InvalidRequest;
|
return kStatus_USB_InvalidRequest;
|
||||||
}
|
}
|
||||||
return kStatus_USB_Success;
|
return kStatus_USB_Success;
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
#include "led_display.h"
|
#include "led_display.h"
|
||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
|
||||||
uint32_t UsbBasicKeyboardActionCounter;
|
uint32_t UsbBasicKeyboardActionCounter;
|
||||||
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
|
||||||
volatile bool IsUsbBasicKeyboardReportSent = false;
|
|
||||||
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbBasicKeyboardReport(void)
|
static void SwitchActiveUsbBasicKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbBasicKeyboardReport = getInactiveUsbBasicKeyboardReport();
|
ActiveUsbBasicKeyboardReport = GetInactiveUsbBasicKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbBasicKeyboardReport(void)
|
void ResetActiveUsbBasicKeyboardReport(void)
|
||||||
@@ -22,14 +22,20 @@ void ResetActiveUsbBasicKeyboardReport(void)
|
|||||||
bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbBasicKeyboardAction(void)
|
usb_status_t UsbBasicKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbBasicKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbBasicKeyboardActionCounter++;
|
UsbBasicKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbBasicKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -37,11 +43,14 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbBasicKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
error = kStatus_USB_InvalidRequest;
|
error = kStatus_USB_InvalidRequest;
|
||||||
break;
|
break;
|
||||||
@@ -61,7 +70,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
report->reportBuffer = usbBasicKeyboardInBuffer;
|
report->reportBuffer = usbBasicKeyboardInBuffer;
|
||||||
error = kStatus_USB_Success;
|
error = kStatus_USB_Success;
|
||||||
} else {
|
} else {
|
||||||
error = kStatus_USB_InvalidRequest;
|
error = kStatus_USB_AllocFail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -79,16 +88,10 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
|
|
||||||
usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbBasicKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbBasicKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbBasicKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbBasicKeyboardReportSent;
|
|
||||||
extern uint32_t UsbBasicKeyboardActionCounter;
|
extern uint32_t UsbBasicKeyboardActionCounter;
|
||||||
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
extern usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport;
|
||||||
|
|
||||||
@@ -42,6 +41,7 @@
|
|||||||
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbBasicKeyboardReport(void);
|
void ResetActiveUsbBasicKeyboardReport(void);
|
||||||
void SwitchActiveUsbBasicKeyboardReport(void);
|
usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void);
|
||||||
|
usb_status_t UsbBasicKeyboardAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
|
|||||||
|
|
||||||
static usb_status_t UsbReceiveData(void)
|
static usb_status_t UsbReceiveData(void)
|
||||||
{
|
{
|
||||||
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle,
|
return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle,
|
||||||
USB_GENERIC_HID_ENDPOINT_OUT_INDEX,
|
USB_GENERIC_HID_ENDPOINT_OUT_INDEX,
|
||||||
GenericHidInBuffer,
|
GenericHidInBuffer,
|
||||||
@@ -18,7 +22,11 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
if (UsbCompositeDevice.attach) {
|
||||||
|
error = kStatus_USB_Success;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case kUSB_DeviceHidEventRecvResponse:
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
UsbProtocolHandler();
|
UsbProtocolHandler();
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbMediaKeyboardActionCounter;
|
uint32_t UsbMediaKeyboardActionCounter;
|
||||||
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
|
||||||
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
|
||||||
volatile bool IsUsbMediaKeyboardReportSent = false;
|
|
||||||
|
|
||||||
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbMediaKeyboardReport(void)
|
static void SwitchActiveUsbMediaKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbMediaKeyboardReport = getInactiveUsbMediaKeyboardReport();
|
ActiveUsbMediaKeyboardReport = GetInactiveUsbMediaKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbMediaKeyboardReport(void)
|
void ResetActiveUsbMediaKeyboardReport(void)
|
||||||
@@ -20,14 +20,20 @@ void ResetActiveUsbMediaKeyboardReport(void)
|
|||||||
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbMediaKeyboardAction(void)
|
usb_status_t UsbMediaKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbMediaKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbMediaKeyboardActionCounter++;
|
UsbMediaKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbMediaKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -35,11 +41,14 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbMediaKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -59,16 +68,10 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
|
|||||||
|
|
||||||
usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbMediaKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbMediaKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbMediaKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbMediaKeyboardReportSent;
|
|
||||||
extern uint32_t UsbMediaKeyboardActionCounter;
|
extern uint32_t UsbMediaKeyboardActionCounter;
|
||||||
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
extern usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport;
|
||||||
|
|
||||||
@@ -39,6 +38,7 @@
|
|||||||
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbMediaKeyboardReport(void);
|
void ResetActiveUsbMediaKeyboardReport(void);
|
||||||
void SwitchActiveUsbMediaKeyboardReport(void);
|
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void);
|
||||||
|
usb_status_t UsbMediaKeyboardAction();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbMouseActionCounter;
|
uint32_t UsbMouseActionCounter;
|
||||||
static usb_mouse_report_t usbMouseReports[2];
|
static usb_mouse_report_t usbMouseReports[2];
|
||||||
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
|
||||||
volatile bool IsUsbMouseReportSent = false;
|
|
||||||
|
|
||||||
static usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
usb_mouse_report_t* GetInactiveUsbMouseReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbMouseReport(void)
|
static void SwitchActiveUsbMouseReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbMouseReport = getInactiveUsbMouseReport();
|
ActiveUsbMouseReport = GetInactiveUsbMouseReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbMouseReport(void)
|
void ResetActiveUsbMouseReport(void)
|
||||||
@@ -20,25 +20,35 @@ void ResetActiveUsbMouseReport(void)
|
|||||||
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile usb_status_t usbMouseAction(void)
|
usb_status_t UsbMouseAction(void)
|
||||||
{
|
{
|
||||||
usb_mouse_report_t *mouseReport = getInactiveUsbMouseReport();
|
if (!UsbCompositeDevice.attach) {
|
||||||
IsUsbMouseReportSent = true;
|
return kStatus_USB_Error; // The device is not attached
|
||||||
return USB_DeviceHidSend(UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
|
}
|
||||||
(uint8_t*)mouseReport, USB_MOUSE_REPORT_LENGTH);
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
|
UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
|
||||||
|
(uint8_t *)ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
|
||||||
|
if (usb_status == kStatus_USB_Success) {
|
||||||
|
UsbMouseActionCounter++;
|
||||||
|
SwitchActiveUsbMouseReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
{
|
{
|
||||||
UsbMouseActionCounter++;
|
|
||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return usbMouseAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -58,16 +68,10 @@ usb_status_t UsbMouseCallback(class_handle_t handle, uint32_t event, void *param
|
|||||||
|
|
||||||
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbMouseSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return usbMouseAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_MOUSE_INTERFACE_INDEX == interface) {
|
|
||||||
return usbMouseAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbMouseReportSent;
|
|
||||||
extern uint32_t UsbMouseActionCounter;
|
extern uint32_t UsbMouseActionCounter;
|
||||||
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
||||||
|
|
||||||
@@ -42,6 +41,7 @@
|
|||||||
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbMouseReport(void);
|
void ResetActiveUsbMouseReport(void);
|
||||||
void SwitchActiveUsbMouseReport(void);
|
usb_mouse_report_t* GetInactiveUsbMouseReport(void);
|
||||||
|
usb_status_t UsbMouseAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
uint32_t UsbSystemKeyboardActionCounter;
|
uint32_t UsbSystemKeyboardActionCounter;
|
||||||
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
|
||||||
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
|
||||||
volatile bool IsUsbSystemKeyboardReportSent = false;
|
|
||||||
|
|
||||||
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport()
|
||||||
{
|
{
|
||||||
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchActiveUsbSystemKeyboardReport(void)
|
static void SwitchActiveUsbSystemKeyboardReport(void)
|
||||||
{
|
{
|
||||||
ActiveUsbSystemKeyboardReport = getInactiveUsbSystemKeyboardReport();
|
ActiveUsbSystemKeyboardReport = GetInactiveUsbSystemKeyboardReport();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResetActiveUsbSystemKeyboardReport(void)
|
void ResetActiveUsbSystemKeyboardReport(void)
|
||||||
@@ -20,14 +20,20 @@ void ResetActiveUsbSystemKeyboardReport(void)
|
|||||||
bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
bzero(ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_status_t UsbSystemKeyboardAction(void)
|
usb_status_t UsbSystemKeyboardAction(void)
|
||||||
{
|
{
|
||||||
usb_status_t status = USB_DeviceHidSend(
|
if (!UsbCompositeDevice.attach) {
|
||||||
|
return kStatus_USB_Error; // The device is not attached
|
||||||
|
}
|
||||||
|
|
||||||
|
usb_status_t usb_status = USB_DeviceHidSend(
|
||||||
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
|
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
|
||||||
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
(uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
|
||||||
IsUsbSystemKeyboardReportSent = true;
|
if (usb_status == kStatus_USB_Success) {
|
||||||
UsbSystemKeyboardActionCounter++;
|
UsbSystemKeyboardActionCounter++;
|
||||||
return status;
|
SwitchActiveUsbSystemKeyboardReport();
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
|
||||||
@@ -35,11 +41,14 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
|
|||||||
usb_status_t error = kStatus_USB_Error;
|
usb_status_t error = kStatus_USB_Error;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
// This event is received when the report has been sent
|
||||||
case kUSB_DeviceHidEventSendResponse:
|
case kUSB_DeviceHidEventSendResponse:
|
||||||
|
UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX);
|
||||||
if (UsbCompositeDevice.attach) {
|
if (UsbCompositeDevice.attach) {
|
||||||
return UsbSystemKeyboardAction();
|
error = kStatus_USB_Success;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceHidEventRecvResponse:
|
||||||
case kUSB_DeviceHidEventGetReport:
|
case kUSB_DeviceHidEventGetReport:
|
||||||
case kUSB_DeviceHidEventSetReport:
|
case kUSB_DeviceHidEventSetReport:
|
||||||
case kUSB_DeviceHidEventRequestReportBuffer:
|
case kUSB_DeviceHidEventRequestReportBuffer:
|
||||||
@@ -59,16 +68,10 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
|
|||||||
|
|
||||||
usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
usb_status_t UsbSystemKeyboardSetConfiguration(class_handle_t handle, uint8_t configuration)
|
||||||
{
|
{
|
||||||
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
|
|
||||||
return UsbSystemKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting)
|
||||||
{
|
{
|
||||||
if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == interface) {
|
|
||||||
return UsbSystemKeyboardAction();
|
|
||||||
}
|
|
||||||
return kStatus_USB_Error;
|
return kStatus_USB_Error;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern volatile bool IsUsbSystemKeyboardReportSent;
|
|
||||||
extern uint32_t UsbSystemKeyboardActionCounter;
|
extern uint32_t UsbSystemKeyboardActionCounter;
|
||||||
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
extern usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport;
|
||||||
|
|
||||||
@@ -40,6 +39,7 @@
|
|||||||
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
|
||||||
|
|
||||||
void ResetActiveUsbSystemKeyboardReport(void);
|
void ResetActiveUsbSystemKeyboardReport(void);
|
||||||
void SwitchActiveUsbSystemKeyboardReport(void);
|
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport();
|
||||||
|
usb_status_t UsbSystemKeyboardAction(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
|
#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_set_i2c_baud_rate.h"
|
||||||
#include "usb_commands/usb_command_switch_keymap.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)
|
void UsbProtocolHandler(void)
|
||||||
{
|
{
|
||||||
@@ -77,6 +79,12 @@ void UsbProtocolHandler(void)
|
|||||||
case UsbCommandId_SwitchKeymap:
|
case UsbCommandId_SwitchKeymap:
|
||||||
UsbCommand_SwitchKeymap();
|
UsbCommand_SwitchKeymap();
|
||||||
break;
|
break;
|
||||||
|
case UsbCommandId_GetVariable:
|
||||||
|
UsbCommand_GetVariable();
|
||||||
|
break;
|
||||||
|
case UsbCommandId_SetVariable:
|
||||||
|
UsbCommand_SetVariable();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -34,8 +34,17 @@
|
|||||||
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
||||||
UsbCommandId_SetI2cBaudRate = 0x10,
|
UsbCommandId_SetI2cBaudRate = 0x10,
|
||||||
UsbCommandId_SwitchKeymap = 0x11,
|
UsbCommandId_SwitchKeymap = 0x11,
|
||||||
|
UsbCommandId_GetVariable = 0x12,
|
||||||
|
UsbCommandId_SetVariable = 0x13,
|
||||||
} usb_command_id_t;
|
} usb_command_id_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UsbVariable_TestSwitches,
|
||||||
|
UsbVariable_TestUsbStack,
|
||||||
|
UsbVariable_DebounceTimePress,
|
||||||
|
UsbVariable_DebounceTimeRelease
|
||||||
|
} usb_variable_id_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UsbStatusCode_Success = 0,
|
UsbStatusCode_Success = 0,
|
||||||
UsbStatusCode_InvalidCommand = 1,
|
UsbStatusCode_InvalidCommand = 1,
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
#include "layer.h"
|
#include "layer.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "key_debouncer.h"
|
|
||||||
#include "config_parser/parse_keymap.h"
|
#include "config_parser/parse_keymap.h"
|
||||||
#include "usb_commands/usb_command_get_debug_buffer.h"
|
#include "usb_commands/usb_command_get_debug_buffer.h"
|
||||||
|
#include "arduino_hid/ConsumerAPI.h"
|
||||||
|
|
||||||
static uint32_t mouseUsbReportUpdateTime = 0;
|
static uint32_t mouseUsbReportUpdateTime = 0;
|
||||||
static uint32_t mouseElapsedTime;
|
static uint32_t mouseElapsedTime;
|
||||||
@@ -24,6 +24,9 @@ uint16_t DoubleTapSwitchLayerTimeout = 150;
|
|||||||
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
||||||
|
|
||||||
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||||
|
bool TestUsbStack = false;
|
||||||
|
|
||||||
|
volatile uint8_t UsbReportUpdateSemaphore = 0;
|
||||||
|
|
||||||
mouse_kinetic_state_t MouseMoveState = {
|
mouse_kinetic_state_t MouseMoveState = {
|
||||||
.isScroll = false,
|
.isScroll = false,
|
||||||
@@ -123,7 +126,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
kineticState->xOut = xSumInt;
|
kineticState->xOut = xSumInt;
|
||||||
|
|
||||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->xOut == 0 && horizontalMovement) {
|
||||||
kineticState->xOut = kineticState->xSum > 0 ? 1 : -1;
|
kineticState->xOut = kineticState->xSum ? copysignf(1.0, kineticState->xSum) : 0;
|
||||||
kineticState->xSum = 0;
|
kineticState->xSum = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +147,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
kineticState->yOut = ySumInt;
|
kineticState->yOut = ySumInt;
|
||||||
|
|
||||||
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
|
if (kineticState->isScroll && !kineticState->wasMoveAction && kineticState->yOut == 0 && verticalMovement) {
|
||||||
kineticState->yOut = kineticState->ySum > 0 ? 1 : -1;
|
kineticState->yOut = kineticState->ySum ? copysignf(1.0, kineticState->ySum) : 0;
|
||||||
kineticState->ySum = 0;
|
kineticState->ySum = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -233,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)
|
||||||
{
|
{
|
||||||
@@ -244,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) {
|
||||||
@@ -268,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:
|
||||||
@@ -275,9 +287,16 @@ 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:
|
||||||
|
if (!keyState->previous) {
|
||||||
|
stickyModifiers = 0;
|
||||||
|
Macros_StartMacro(action->playMacro.macroId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,18 +307,21 @@ static secondary_role_t secondaryRole;
|
|||||||
|
|
||||||
static void updateActiveUsbReports(void)
|
static void updateActiveUsbReports(void)
|
||||||
{
|
{
|
||||||
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
if (MacroPlaying) {
|
||||||
|
Macros_ContinueMacro();
|
||||||
|
memcpy(ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
|
||||||
|
memcpy(ActiveUsbBasicKeyboardReport, &MacroBasicKeyboardReport, sizeof MacroBasicKeyboardReport);
|
||||||
|
memcpy(ActiveUsbMediaKeyboardReport, &MacroMediaKeyboardReport, sizeof MacroMediaKeyboardReport);
|
||||||
|
memcpy(ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t previousModifiers = 0;
|
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
||||||
|
|
||||||
basicScancodeIndex = 0;
|
basicScancodeIndex = 0;
|
||||||
mediaScancodeIndex = 0;
|
mediaScancodeIndex = 0;
|
||||||
systemScancodeIndex = 0;
|
systemScancodeIndex = 0;
|
||||||
|
|
||||||
for (uint8_t keyId=0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
|
|
||||||
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
|
|
||||||
}
|
|
||||||
|
|
||||||
layer_id_t activeLayer = LayerId_Base;
|
layer_id_t activeLayer = LayerId_Base;
|
||||||
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole)) {
|
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole)) {
|
||||||
activeLayer = SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRole);
|
activeLayer = SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRole);
|
||||||
@@ -307,16 +329,30 @@ 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 (MacroPlaying) {
|
if (TestUsbStack) {
|
||||||
Macros_ContinueMacro();
|
static bool simulateKeypresses, isEven, isEvenMedia;
|
||||||
memcpy(&ActiveUsbMouseReport, &MacroMouseReport, sizeof MacroMouseReport);
|
static uint32_t mediaCounter = 0;
|
||||||
memcpy(&ActiveUsbBasicKeyboardReport, &MacroBasicKeyboardReport, sizeof MacroBasicKeyboardReport);
|
key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0];
|
||||||
memcpy(&ActiveUsbMediaKeyboardReport, &MacroMediaKeyboardReport, sizeof MacroMediaKeyboardReport);
|
|
||||||
memcpy(&ActiveUsbSystemKeyboardReport, &MacroSystemKeyboardReport, sizeof MacroSystemKeyboardReport);
|
if (activeLayer == LayerId_Fn && testKeyState->current && !testKeyState->previous) {
|
||||||
return;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
|
||||||
@@ -324,10 +360,15 @@ static void updateActiveUsbReports(void)
|
|||||||
key_state_t *keyState = &KeyStates[slotId][keyId];
|
key_state_t *keyState = &KeyStates[slotId][keyId];
|
||||||
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
|
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
|
||||||
|
|
||||||
if (keyState->debounceCounter) {
|
if (keyState->debouncing) {
|
||||||
|
if ((uint8_t)(Timer_GetCurrentTime() - keyState->timestamp) > (keyState->previous ? DebounceTimePress : DebounceTimeRelease)) {
|
||||||
|
keyState->debouncing = false;
|
||||||
|
} else {
|
||||||
keyState->current = keyState->previous;
|
keyState->current = keyState->previous;
|
||||||
|
}
|
||||||
} else if (keyState->previous != keyState->current) {
|
} else if (keyState->previous != keyState->current) {
|
||||||
keyState->debounceCounter = KEY_DEBOUNCER_TIMEOUT_MSEC + 1;
|
keyState->timestamp = Timer_GetCurrentTime();
|
||||||
|
keyState->debouncing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyState->current) {
|
if (keyState->current) {
|
||||||
@@ -338,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;
|
||||||
@@ -349,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);
|
||||||
}
|
}
|
||||||
@@ -377,41 +419,41 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t UsbReportUpdateCounter;
|
uint32_t UsbReportUpdateCounter;
|
||||||
static uint32_t lastMouseUpdateTime;
|
|
||||||
|
|
||||||
void UpdateUsbReports(void)
|
void UpdateUsbReports(void)
|
||||||
{
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UsbReportUpdateSemaphore) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
UsbReportUpdateCounter++;
|
UsbReportUpdateCounter++;
|
||||||
|
|
||||||
// Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent.
|
|
||||||
bool hasActiveMouseState = false;
|
|
||||||
for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) {
|
|
||||||
hasActiveMouseState = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasActiveMouseState) {
|
|
||||||
if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_MOUSE_INTERRUPT_IN_INTERVAL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Timer_SetCurrentTime(&lastMouseUpdateTime);
|
|
||||||
} else if (!IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResetActiveUsbBasicKeyboardReport();
|
ResetActiveUsbBasicKeyboardReport();
|
||||||
ResetActiveUsbMediaKeyboardReport();
|
ResetActiveUsbMediaKeyboardReport();
|
||||||
ResetActiveUsbSystemKeyboardReport();
|
ResetActiveUsbSystemKeyboardReport();
|
||||||
@@ -419,35 +461,38 @@ void UpdateUsbReports(void)
|
|||||||
|
|
||||||
updateActiveUsbReports();
|
updateActiveUsbReports();
|
||||||
|
|
||||||
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
|
bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0;
|
||||||
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
|
bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0;
|
||||||
last_basic_report = *ActiveUsbBasicKeyboardReport;
|
bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0;
|
||||||
SwitchActiveUsbBasicKeyboardReport();
|
bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0;
|
||||||
IsUsbBasicKeyboardReportSent = false;
|
|
||||||
|
if (HasUsbBasicKeyboardReportChanged) {
|
||||||
|
usb_status_t status = UsbBasicKeyboardAction();
|
||||||
|
if (status == kStatus_USB_Success) {
|
||||||
|
UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
|
if (HasUsbMediaKeyboardReportChanged) {
|
||||||
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
|
usb_status_t status = UsbMediaKeyboardAction();
|
||||||
last_media_report = *ActiveUsbMediaKeyboardReport;
|
if (status == kStatus_USB_Success) {
|
||||||
SwitchActiveUsbMediaKeyboardReport();
|
UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX;
|
||||||
IsUsbMediaKeyboardReportSent = false;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
|
if (HasUsbSystemKeyboardReportChanged) {
|
||||||
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
|
usb_status_t status = UsbSystemKeyboardAction();
|
||||||
last_system_report = *ActiveUsbSystemKeyboardReport;
|
if (status == kStatus_USB_Success) {
|
||||||
SwitchActiveUsbSystemKeyboardReport();
|
UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX;
|
||||||
IsUsbSystemKeyboardReportSent = false;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
|
// Send out the mouse position and wheel values continuously if the report is not zeros, but only send the mouse button states when they change.
|
||||||
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
|
if (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y ||
|
||||||
last_mouse_report = *ActiveUsbMouseReport;
|
ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) {
|
||||||
SwitchActiveUsbMouseReport();
|
usb_status_t status = UsbMouseAction();
|
||||||
IsUsbMouseReportSent = false;
|
if (status == kStatus_USB_Success) {
|
||||||
|
UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((previousLayer != LayerId_Base || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && IsHostSleeping) {
|
|
||||||
WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,8 @@
|
|||||||
extern mouse_kinetic_state_t MouseMoveState;
|
extern mouse_kinetic_state_t MouseMoveState;
|
||||||
extern mouse_kinetic_state_t MouseScrollState;
|
extern mouse_kinetic_state_t MouseScrollState;
|
||||||
extern uint32_t UsbReportUpdateCounter;
|
extern uint32_t UsbReportUpdateCounter;
|
||||||
|
extern volatile uint8_t UsbReportUpdateSemaphore;
|
||||||
|
extern bool TestUsbStack;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
"commander": "^2.11.0",
|
"commander": "^2.11.0",
|
||||||
"shelljs": "^0.7.8"
|
"shelljs": "^0.7.8"
|
||||||
},
|
},
|
||||||
"firmwareVersion": "8.3.2",
|
"firmwareVersion": "8.4.2",
|
||||||
"deviceProtocolVersion": "4.3.1",
|
"deviceProtocolVersion": "4.4.0",
|
||||||
"moduleProtocolVersion": "4.0.0",
|
"moduleProtocolVersion": "4.0.0",
|
||||||
"userConfigVersion": "4.1.0",
|
"userConfigVersion": "4.1.0",
|
||||||
"hardwareConfigVersion": "1.0.0",
|
"hardwareConfigVersion": "1.0.0",
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "fsl_gpio.h"
|
#include "fsl_gpio.h"
|
||||||
#include "key_matrix.h"
|
#include "key_matrix.h"
|
||||||
|
|
||||||
|
uint8_t DebounceTimePress = 50, DebounceTimeRelease = 50;
|
||||||
|
|
||||||
void KeyMatrix_Init(key_matrix_t *keyMatrix)
|
void KeyMatrix_Init(key_matrix_t *keyMatrix)
|
||||||
{
|
{
|
||||||
for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) {
|
for (key_matrix_pin_t *row = keyMatrix->rows; row < keyMatrix->rows + keyMatrix->rowNum; row++) {
|
||||||
|
|||||||
@@ -28,6 +28,10 @@
|
|||||||
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
|
uint8_t keyStates[MAX_KEYS_IN_MATRIX];
|
||||||
} key_matrix_t;
|
} key_matrix_t;
|
||||||
|
|
||||||
|
// Variables:
|
||||||
|
|
||||||
|
extern uint8_t DebounceTimePress, DebounceTimeRelease;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void KeyMatrix_Init(key_matrix_t *keyMatrix);
|
void KeyMatrix_Init(key_matrix_t *keyMatrix);
|
||||||
|
|||||||
@@ -19,12 +19,12 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
#define FIRMWARE_MAJOR_VERSION 8
|
#define FIRMWARE_MAJOR_VERSION 8
|
||||||
#define FIRMWARE_MINOR_VERSION 3
|
#define FIRMWARE_MINOR_VERSION 4
|
||||||
#define FIRMWARE_PATCH_VERSION 2
|
#define FIRMWARE_PATCH_VERSION 2
|
||||||
|
|
||||||
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
||||||
#define DEVICE_PROTOCOL_MINOR_VERSION 3
|
#define DEVICE_PROTOCOL_MINOR_VERSION 4
|
||||||
#define DEVICE_PROTOCOL_PATCH_VERSION 1
|
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
||||||
|
|
||||||
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
||||||
#define MODULE_PROTOCOL_MINOR_VERSION 0
|
#define MODULE_PROTOCOL_MINOR_VERSION 0
|
||||||
|
|||||||
Reference in New Issue
Block a user