90 Commits

Author SHA1 Message Date
László Monda
014addd777 Bump version to 8.3.3, update changelog, package.json, versions.h 2018-07-03 01:26:40 +02:00
László Monda
4562a17155 Make the test code exercise the media and mouse interfaces too. 2018-07-03 00:34:39 +02:00
Eric Tang
950843ca2c Use return instead of break 2018-07-01 17:17:42 -07:00
László Monda
9600f46f83 Merge branch 'waking-on-keypress' 2018-07-01 22:34:35 +02:00
Eric Tang
ef7589d83a Fix the mouse scrolling issue 2018-07-01 08:34:59 -07:00
Eric Tang
84f48ed055 Wake up the host when a new keypress is detected 2018-07-01 08:34:17 -07:00
László Monda
ebef301e27 Merge pull request #123 from Lauszus/dev
Fix issue with keyboard freezing
2018-07-01 16:19:50 +02:00
László Monda
5b8b8d93e4 Merge pull request #135 from Lauszus/travis
Remove Eclipse build from the Travis job and cache the gcc archives
2018-07-01 00:43:07 +02:00
Kristian Sloth Lauszus
d48049535e Remove Eclipse build from the Travis job and cache the gcc archives 2018-07-01 00:32:03 +02:00
Kristian Sloth Lauszus
5bd479ab8e Fixed unused variable
This was due to a merge conflict in c69f664e85
2018-07-01 00:04:26 +02:00
Kristian Sloth Lauszus
372151848a Just define the usb_status_t variable inside the if-statements 2018-06-30 23:44:58 +02:00
Kristian Sloth Lauszus
5b32c0da43 Disable the key press test code 2018-06-30 23:42:39 +02:00
Kristian Sloth Lauszus
edf34de4b5 Fixed comment 2018-06-30 23:23:12 +02:00
Kristian Sloth Lauszus
8c7eb079ec Re-added code from 994e2f6b79 2018-06-30 23:03:50 +02:00
Kristian Sloth Lauszus
6612f7cced Fixed warning 2018-06-30 22:48:52 +02:00
Kristian Sloth Lauszus
7606f311c8 Fix coding style 2018-06-30 22:38:23 +02:00
Kristian Sloth Lauszus
9fe73233af Fix merge issue 2018-06-30 22:36:48 +02:00
Kristian Sloth Lauszus
cba1ef97b6 Revert "Set the USB interrupt priority to the maximum possible" 2018-06-30 22:31:32 +02:00
Kristian Sloth Lauszus
c69f664e85 Merge branch 'master' into dev
# Conflicts:
#	right/src/timer.c
#	right/src/timer.h
#	right/src/usb_report_updater.c
2018-06-30 22:27:52 +02:00
Kristian Sloth Lauszus
6c895988de Merge branch 'Lauszus-dev' into dev
# Conflicts:
#	right/src/usb_interfaces/usb_interface_basic_keyboard.c
#	right/src/usb_interfaces/usb_interface_media_keyboard.c
#	right/src/usb_interfaces/usb_interface_mouse.c
#	right/src/usb_interfaces/usb_interface_system_keyboard.c
#	right/src/usb_report_updater.c
2018-06-30 22:23:32 +02:00
Eric Tang
f16a004583 Revert "Default to kStatus_USB_Success"
This reverts commit 6eceb6ad30.
2018-06-30 13:06:23 -07:00
Kristian Sloth Lauszus
c870f335a7 Set the other interrupts back to the value there were before 2018-06-30 18:55:31 +02:00
Kristian Sloth Lauszus
b6f59563c7 Revert cancelling a transfer, as the USB endpoint is still locked up 2018-06-30 18:25:03 +02:00
Kristian Sloth Lauszus
409bd01af6 Decreasing the USB priority actually works better
Needs more testing
2018-06-30 17:28:19 +02:00
Kristian Sloth Lauszus
b9b5eb2c76 Make sure the device is attached before sending the report 2018-06-30 17:06:59 +02:00
Kristian Sloth Lauszus
11a8ffbaf5 Make sure the composite device is attached before setting the kStatus_USB_Success flag 2018-06-30 17:06:59 +02:00
Kristian Sloth Lauszus
9938f14d20 Set the USB interrupt priority to the maximum possible 2018-06-30 17:06:59 +02:00
Kristian Sloth Lauszus
217259ba63 Cancel the ongoing transfer if it is still in progress 2018-06-30 17:06:58 +02:00
Eric Tang
e5afa33b79 Allow scanning to continue if the host is asleep 2018-06-29 23:06:31 -07:00
Eric Tang
d3dfc9bd2c Revert "Simplify logic"
This reverts commit 994e2f6b79.
2018-06-29 23:01:31 -07:00
Eric Tang
8f6251bc4d Only set the semaphore if the report is successfully requested 2018-06-29 23:01:20 -07:00
Eric Tang
b93f211502 Don't retry sending a report if it fails 2018-06-29 22:44:42 -07:00
Eric Tang
69411e53e9 Rename usbMouseAction to UsbMouseAction 2018-06-29 17:23:15 -07:00
Eric Tang
39819e6058 Type Backspace instead of b 2018-06-29 13:29:40 -07:00
Eric Tang
bd97bba4b5 Wake up the host before attempting to send reports 2018-06-29 13:19:49 -07:00
Eric Tang
4214f3e0b6 Use a semaphore to control the rate at which reports are updated 2018-06-29 13:08:24 -07:00
Eric Tang
6eceb6ad30 Default to kStatus_USB_Success 2018-06-29 12:54:06 -07:00
Eric Tang
994e2f6b79 Simplify logic 2018-06-29 12:43:59 -07:00
Eric Tang
baa5e8f037 Remove redundant guard clauses 2018-06-29 12:37:53 -07:00
Eric Tang
cbd5f1b500 Redefine USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH 2018-06-28 17:25:14 -07:00
Eric Tang
c1dc4be8c8 Fix USB_DeviceGetHidDescriptor 2018-06-28 17:25:09 -07:00
Eric Tang
1bd8c7dca8 Use a switch statement 2018-06-28 16:10:26 -07:00
László Monda
d72ea4dde5 Merge pull request #131 from UltimateHackingKeyboard/macro-engine
Implement the macro engine
2018-06-27 23:02:09 +02:00
Eric Tang
5d621880ec Merge branch 'dev' of https://github.com/Lauszus/firmware into Lauszus-dev 2018-06-27 13:44:17 -07:00
László Monda
5c3e2966c4 Restore the logic of the key debouncer. Make it only debounce keypresses and set its timeout to 100ms. 2018-06-27 21:42:15 +02:00
László Monda
d21fe30139 Bump firmware version to 8.3.2. Update changelog, package.json and versions.h 2018-06-27 14:26:29 +02:00
László Monda
224d9eae42 Merge pull request #130 from UltimateHackingKeyboard/key-release-debouncing
Fix key chattering
2018-06-27 14:13:05 +02:00
Kristian Sloth Lauszus
8c02f3db53 Merge branch 'master' into dev
# Conflicts:
#	right/src/usb_interfaces/usb_interface_basic_keyboard.c
#	right/src/usb_interfaces/usb_interface_basic_keyboard.h
#	right/src/usb_interfaces/usb_interface_media_keyboard.c
#	right/src/usb_interfaces/usb_interface_media_keyboard.h
#	right/src/usb_interfaces/usb_interface_mouse.c
#	right/src/usb_interfaces/usb_interface_mouse.h
#	right/src/usb_interfaces/usb_interface_system_keyboard.c
#	right/src/usb_interfaces/usb_interface_system_keyboard.h
#	right/src/usb_report_updater.c
2018-06-27 10:12:40 +02:00
Eric Tang
02bbeb7177 Fix the formatting in timer.c 2018-06-26 22:13:13 -07:00
Eric Tang
cdfabaec42 Make the debounce counters count down 2018-06-26 21:58:48 -07:00
Eric Tang
0e9525ce9a Don't clear the whole report 2018-06-26 18:39:41 -07:00
Eric Tang
633a6cec77 Clear the report at the end of a move mouse or scroll mouse macro 2018-06-26 18:39:41 -07:00
Eric Tang
d35a7cc644 Clear the report at the end of a text macro 2018-06-26 18:39:41 -07:00
Eric Tang
76a91c010b Implement the text macro action 2018-06-26 18:39:41 -07:00
Eric Tang
54b0a595bc Rename functions for consistency 2018-06-26 18:39:41 -07:00
Eric Tang
4b9aa0860c Implement the mouse macro actions 2018-06-26 18:39:41 -07:00
Eric Tang
df8792a60d Fix code formatting 2018-06-26 18:39:41 -07:00
Eric Tang
5988fce59b Implement the delay macro action 2018-06-26 18:39:41 -07:00
Eric Tang
314eb0d771 Stop macros from repeating 2018-06-26 18:39:41 -07:00
Eric Tang
c1f5a96e1b Correctly pass pointers to the active reports to memcpy 2018-06-26 18:39:41 -07:00
Eric Tang
64592d7032 Add TestLed_Blink 2018-06-26 18:39:41 -07:00
Eric Tang
c6b180b8f5 Convert macros for controlling test LEDs to functions 2018-06-26 18:39:40 -07:00
Eric Tang
0155447c6a Rename InitTestLed to TestLed_Init 2018-06-26 18:37:49 -07:00
Eric Tang
04f4053bde Add a delay function 2018-06-26 18:37:49 -07:00
Eric Tang
09a58b607c Reduce code duplication 2018-06-26 18:34:38 -07:00
Eric Tang
be82530412 Rename macro key actions in accordance with Agent 2018-06-26 18:34:38 -07:00
Eric Tang
6e11c0b8af Handle macro actions and make the macro engine preempt normal behavior 2018-06-26 18:34:38 -07:00
Eric Tang
9fade6368c Correct the type of macro delay variables 2018-06-26 18:32:51 -07:00
Eric Tang
ff99c2e734 Change KEY_DEBOUNCER_TIMEOUT_MSEC to match keyswitch datasheets 2018-06-26 18:27:01 -07:00
Eric Tang
6d356114a8 Debounce key releases 2018-06-26 18:24:30 -07:00
Eric Tang
3041132959 Merge pull request #129 from UltimateHackingKeyboard/revert-120-dev
Revert "The UHK now only sends out data when it changes"
2018-06-26 18:13:36 -07:00
Eric Tang
2877773cac Revert "The UHK now only sends out data when it changes" 2018-06-26 17:59:57 -07:00
Kristian Sloth Lauszus
a061febd01 Merge test code 2018-06-24 23:57:49 +02:00
Kristian Sloth Lauszus
e3773fd5c0 Removed some unused code 2018-06-24 19:47:28 +02:00
Kristian Sloth Lauszus
a92835454d Make sure the keyboard is not read if any of the endpoints are busy sending data 2018-06-24 18:43:21 +02:00
Kristian Sloth Lauszus
64e5fa7ecb Just read the interruptInPipeBusy flag instead of storing the transfer state in a separate variable and switch the active report back if the HID Send command fails 2018-06-24 18:43:21 +02:00
Kristian Sloth Lauszus
d1894fb62a Removed call to UpdateUsbReports() before usb has been initialised 2018-06-24 18:43:21 +02:00
Kristian Sloth Lauszus
fe7065be4a Select the "MK22FN512xxx12" under MCU settings 2018-06-23 18:47:26 +02:00
Kristian Sloth Lauszus
e7b3127af1 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 2018-06-23 18:20:09 +02:00
Kristian Sloth Lauszus
724378cf6c Make sure we do not try to send another report before the old one has finished sending 2018-06-23 17:33:20 +02:00
Kristian Sloth Lauszus
14eb9c6ec0 Merge branch 'timer' into dev 2018-06-22 21:50:31 +02:00
Kristian Sloth Lauszus
9a8b1ef8b9 The PIT timer is counting downward, so we need to subtract the count from the period value 2018-06-22 21:50:14 +02:00
Kristian Sloth Lauszus
2cc94bd1fc The BL_APP_VECTOR_TABLE_ADDRESS should be overridable 2018-06-22 18:26:51 +02:00
Kristian Sloth Lauszus
ad8de4dd56 Increase the resolution of the elapsed timer when reading the keyboard 2018-06-22 18:03:27 +02:00
Kristian Sloth Lauszus
5e97ad1b3c Just compare the active report with the inactive report stored in each interface driver 2018-06-22 17:55:21 +02:00
Kristian Sloth Lauszus
fe06ed0a4b Merge branch 'timer' into dev 2018-06-22 17:48:53 +02:00
Kristian Sloth Lauszus
d449123fab Fix PIT timer period and added functions for getting the current time in microseconds 2018-06-22 17:39:22 +02:00
Kristian Sloth Lauszus
4d483e7896 Limit the update frequency for reading the keyboard 2018-06-15 14:03:59 +02:00
László Monda
b1cbeefa28 Add base layer key mappings for the left and right modules for testing purposes. 2018-06-13 02:41:01 +02:00
Kristian Sloth Lauszus
9be3cf4865 Invalidate the stored report if the command fails
Fixes #122
2018-06-08 20:23:58 +02:00
37 changed files with 824 additions and 295 deletions

View File

@@ -1,36 +1,22 @@
language: c
os:
- linux
- osx
cache:
directories:
- $HOME/Library/Caches/Homebrew/Cask
# Cache for the gcc archives
- $HOME/gcc-cache/
install: eclipse -noSplash
-application org.eclipse.equinox.p2.director
-repository http://gnuarmeclipse.sourceforge.net/updates
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
-profileProperties org.eclipse.update.install.features=true
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
install:
- 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
- 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
- tar -xf $HOME/gcc-cache/$GCC_NAME -C $HOME
- export PATH=$PATH:$HOME/gcc-arm-none-eabi-7-2017-q4-major/bin
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=0
- make -C right clean && make -j2 -C right DEBUG=1
- 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"

View File

@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.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
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0
- Make the debouncer debounce not only on key presses but also on key releases, and change the debounce interval from 100ms to the suggested 5ms of MX switches.
- Revert the Windows related commits of firmware 8.3.1 because they introduced a nondeterministic bug that made USB hang.
- Add base layer key mappings for the left and right add-ons for testing purposes.
## [8.3.1] - 2018-06-07
Device Protocol: 4.3.1 | Module Protocol: 4.0.0 | User Config: 4.1.0 | Hardware Config: 1.0.0

View File

@@ -21,7 +21,7 @@ void RunWatchdog(void)
cntr++;
if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
cntr=0;
TEST_LED_TOGGLE();
TestLed_Toggle();
I2cWatchdog_WatchCounter++;
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */

View File

@@ -84,7 +84,7 @@ void InitPeripherals(void)
{
initInterruptPriorities();
InitLedDriver();
InitTestLed();
TestLed_Init();
LedPwm_Init();
DebugOverSpi_Init();
initI2c();

View File

@@ -42,7 +42,7 @@ void SlaveRxHandler(void)
case SlaveCommand_SetTestLed:
TxMessage.length = 0;
bool isLedOn = RxMessage.data[1];
TEST_LED_SET(isLedOn);
TestLed_Set(isLedOn);
break;
case SlaveCommand_SetLedPwmBrightness:
TxMessage.length = 0;

View File

@@ -1,10 +1,10 @@
#include "test_led.h"
#include "fsl_port.h"
extern void InitTestLed(void)
extern void TestLed_Init(void)
{
CLOCK_EnableClock(TEST_LED_CLOCK);
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});
TEST_LED_ON();
TestLed_On();
}

View File

@@ -15,13 +15,28 @@
#define TEST_LED_CLOCK kCLOCK_PortB
#define TEST_LED_PIN 13
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
#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))
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_PIN)
static inline void TestLed_On(void)
{
GPIO_SetPinsOutput(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:
void InitTestLed(void);
void TestLed_Init(void);
#endif

View File

@@ -38,7 +38,7 @@ JLINK_SCRIPT = ../scripts/flash-right.jlink
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.
BL_APP_VECTOR_TABLE_ADDRESS = 0xc000
BL_APP_VECTOR_TABLE_ADDRESS ?= 0xc000
# Source files.
SOURCE = $(wildcard src/*.c) \

View File

@@ -457,4 +457,87 @@
<resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration>
</storageModule>
<storageModule moduleId="com.crt.config">
<projectStorage>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;TargetConfig&gt;
&lt;Properties property_3="NXP" property_4="MK22FN512xxx12" property_count="5" version="70200"/&gt;
&lt;infoList vendor="NXP"&gt;&lt;info chip="MK22FN512xxx12" name="MK22FN512xxx12"&gt;&lt;chip&gt;&lt;name&gt;MK22FN512xxx12&lt;/name&gt;
&lt;family&gt;K2x&lt;/family&gt;
&lt;vendor&gt;NXP&lt;/vendor&gt;
&lt;memory can_program="true" id="Flash" is_ro="true" size="512" type="Flash"/&gt;
&lt;memory id="RAM" size="128" type="RAM"/&gt;
&lt;memoryInstance derived_from="Flash" driver="FTFA_2K.cfx" id="PROGRAM_FLASH" location="0x0" size="0x80000"/&gt;
&lt;memoryInstance derived_from="RAM" id="SRAM_UPPER" location="0x20000000" size="0x10000"/&gt;
&lt;memoryInstance derived_from="RAM" id="SRAM_LOWER" location="0x1fff0000" size="0x10000"/&gt;
&lt;peripheralInstance derived_from="FTFA_FlashConfig" id="FTFA_FlashConfig" location="0x400"/&gt;
&lt;peripheralInstance derived_from="DMA" id="DMA" location="0x40008000"/&gt;
&lt;peripheralInstance derived_from="FB" id="FB" location="0x4000C000"/&gt;
&lt;peripheralInstance derived_from="FMC" id="FMC" location="0x4001F000"/&gt;
&lt;peripheralInstance derived_from="FTFA" id="FTFA" location="0x40020000"/&gt;
&lt;peripheralInstance derived_from="DMAMUX" id="DMAMUX" location="0x40021000"/&gt;
&lt;peripheralInstance derived_from="FTM0" id="FTM0" location="0x40038000"/&gt;
&lt;peripheralInstance derived_from="FTM1" id="FTM1" location="0x40039000"/&gt;
&lt;peripheralInstance derived_from="FTM2" id="FTM2" location="0x4003A000"/&gt;
&lt;peripheralInstance derived_from="FTM3" id="FTM3" location="0x40026000"/&gt;
&lt;peripheralInstance derived_from="ADC0" id="ADC0" location="0x4003B000"/&gt;
&lt;peripheralInstance derived_from="ADC1" id="ADC1" location="0x40027000"/&gt;
&lt;peripheralInstance derived_from="DAC0" id="DAC0" location="0x4003F000"/&gt;
&lt;peripheralInstance derived_from="DAC1" id="DAC1" location="0x40028000"/&gt;
&lt;peripheralInstance derived_from="RNG" id="RNG" location="0x40029000"/&gt;
&lt;peripheralInstance derived_from="LPUART0" id="LPUART0" location="0x4002A000"/&gt;
&lt;peripheralInstance derived_from="SPI0" id="SPI0" location="0x4002C000"/&gt;
&lt;peripheralInstance derived_from="SPI1" id="SPI1" location="0x4002D000"/&gt;
&lt;peripheralInstance derived_from="I2S0" id="I2S0" location="0x4002F000"/&gt;
&lt;peripheralInstance derived_from="CRC" id="CRC" location="0x40032000"/&gt;
&lt;peripheralInstance derived_from="PDB0" id="PDB0" location="0x40036000"/&gt;
&lt;peripheralInstance derived_from="PIT" id="PIT" location="0x40037000"/&gt;
&lt;peripheralInstance derived_from="RTC" id="RTC" location="0x4003D000"/&gt;
&lt;peripheralInstance derived_from="RFVBAT" id="RFVBAT" location="0x4003E000"/&gt;
&lt;peripheralInstance derived_from="LPTMR0" id="LPTMR0" location="0x40040000"/&gt;
&lt;peripheralInstance derived_from="RFSYS" id="RFSYS" location="0x40041000"/&gt;
&lt;peripheralInstance derived_from="SIM" id="SIM" location="0x40047000"/&gt;
&lt;peripheralInstance derived_from="PORTA" id="PORTA" location="0x40049000"/&gt;
&lt;peripheralInstance derived_from="PORTB" id="PORTB" location="0x4004A000"/&gt;
&lt;peripheralInstance derived_from="PORTC" id="PORTC" location="0x4004B000"/&gt;
&lt;peripheralInstance derived_from="PORTD" id="PORTD" location="0x4004C000"/&gt;
&lt;peripheralInstance derived_from="PORTE" id="PORTE" location="0x4004D000"/&gt;
&lt;peripheralInstance derived_from="WDOG" id="WDOG" location="0x40052000"/&gt;
&lt;peripheralInstance derived_from="EWM" id="EWM" location="0x40061000"/&gt;
&lt;peripheralInstance derived_from="MCG" id="MCG" location="0x40064000"/&gt;
&lt;peripheralInstance derived_from="OSC" id="OSC" location="0x40065000"/&gt;
&lt;peripheralInstance derived_from="I2C0" id="I2C0" location="0x40066000"/&gt;
&lt;peripheralInstance derived_from="I2C1" id="I2C1" location="0x40067000"/&gt;
&lt;peripheralInstance derived_from="UART0" id="UART0" location="0x4006A000"/&gt;
&lt;peripheralInstance derived_from="UART1" id="UART1" location="0x4006B000"/&gt;
&lt;peripheralInstance derived_from="UART2" id="UART2" location="0x4006C000"/&gt;
&lt;peripheralInstance derived_from="USB0" id="USB0" location="0x40072000"/&gt;
&lt;peripheralInstance derived_from="CMP0" id="CMP0" location="0x40073000"/&gt;
&lt;peripheralInstance derived_from="CMP1" id="CMP1" location="0x40073008"/&gt;
&lt;peripheralInstance derived_from="VREF" id="VREF" location="0x40074000"/&gt;
&lt;peripheralInstance derived_from="LLWU" id="LLWU" location="0x4007C000"/&gt;
&lt;peripheralInstance derived_from="PMC" id="PMC" location="0x4007D000"/&gt;
&lt;peripheralInstance derived_from="SMC" id="SMC" location="0x4007E000"/&gt;
&lt;peripheralInstance derived_from="RCM" id="RCM" location="0x4007F000"/&gt;
&lt;peripheralInstance derived_from="GPIOA" id="GPIOA" location="0x400FF000"/&gt;
&lt;peripheralInstance derived_from="GPIOB" id="GPIOB" location="0x400FF040"/&gt;
&lt;peripheralInstance derived_from="GPIOC" id="GPIOC" location="0x400FF080"/&gt;
&lt;peripheralInstance derived_from="GPIOD" id="GPIOD" location="0x400FF0C0"/&gt;
&lt;peripheralInstance derived_from="GPIOE" id="GPIOE" location="0x400FF100"/&gt;
&lt;peripheralInstance derived_from="SystemControl" id="SystemControl" location="0xE000E000"/&gt;
&lt;peripheralInstance derived_from="SysTick" id="SysTick" location="0xE000E010"/&gt;
&lt;peripheralInstance derived_from="NVIC" id="NVIC" location="0xE000E100"/&gt;
&lt;peripheralInstance derived_from="MCM" id="MCM" location="0xE0080000"/&gt;
&lt;/chip&gt;
&lt;processor&gt;&lt;name gcc_name="cortex-m4"&gt;Cortex-M4&lt;/name&gt;
&lt;family&gt;Cortex-M&lt;/family&gt;
&lt;/processor&gt;
&lt;link href="MK22F51212_internal_peripheral.xml" show="embed" type="simple"/&gt;
&lt;/info&gt;
&lt;/infoList&gt;
&lt;/TargetConfig&gt;</projectStorage>
</storageModule>
<storageModule moduleId="com.nxp.mcuxpresso.core.datamodels">
<sdkName>SDK_2.x_MK22FN512xxx12</sdkName>
<sdkVersion>2.3.1</sdkVersion>
</storageModule>
</cproject>

View File

@@ -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)
{
int16_t delay = ReadInt16(buffer);
uint16_t delay = ReadUInt16(buffer);
macroAction->type = MacroActionType_Delay;
macroAction->delay.delay = delay;

View File

@@ -156,7 +156,7 @@ void InitPeripherals(void)
InitMergeSensor();
ADC_Init();
initI2c();
InitTestLed();
TestLed_Init();
LedPwm_Init();
InitI2cWatchdog();
InitKeyDebouncer();

View File

@@ -7,12 +7,12 @@
void PIT_KEY_DEBOUNCER_HANDLER(void)
{
TEST_LED_TOGGLE();
TestLed_Toggle();
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
uint8_t *debounceCounter = &KeyStates[slotId][keyId].debounceCounter;
if (*debounceCounter < 0xff) {
(*debounceCounter)++;
if (*debounceCounter) {
--(*debounceCounter);
}
}
}

View File

@@ -128,6 +128,102 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
{ .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_LEFT_CONTROL }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Fn }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SPACE }},
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mod }},
{ .type = KeyActionType_None },
},
// Left module
{
// 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_TAB }},
{ .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_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
{ .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_LEFT_CONTROL }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_ALT }},
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Fn }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_SPACE }},
{ .type = KeyActionType_SwitchLayer, .switchLayer = { .layer = LayerId_Mod }},
{ .type = KeyActionType_None },
},
// Right module
{
// 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_TAB }},
{ .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_SwitchLayer, .switchLayer = { .layer = LayerId_Mouse }},
{ .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_LEFT_CONTROL }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_LEFT_GUI }},

View File

@@ -1,6 +1,7 @@
#include "macros.h"
#include "config_parser/parse_macro.h"
#include "config_parser/config_globals.h"
#include "timer.h"
macro_reference_t AllMacros[MAX_MACRO_NUM];
uint8_t AllMacrosCount;
@@ -18,69 +19,102 @@ uint8_t characterToScancode(char character)
{
switch (character) {
case 'A' ... 'Z':
return 0;
case 'a' ... 'z':
return 0;
return HID_KEYBOARD_SC_A - 1 + (character & 0x1F);
case '1' ... '9':
return 0;
return HID_KEYBOARD_SC_1_AND_EXCLAMATION - 1 + (character & 0x0F);
case ')':
case '0':
return 0;
return HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS;
case '!':
return 0;
return HID_KEYBOARD_SC_1_AND_EXCLAMATION;
case '@':
return 0;
return HID_KEYBOARD_SC_2_AND_AT;
case '#':
return 0;
return HID_KEYBOARD_SC_3_AND_HASHMARK;
case '$':
return 0;
return HID_KEYBOARD_SC_4_AND_DOLLAR;
case '%':
return 0;
return HID_KEYBOARD_SC_5_AND_PERCENTAGE;
case '^':
return 0;
return HID_KEYBOARD_SC_6_AND_CARET;
case '&':
return 0;
return HID_KEYBOARD_SC_7_AND_AMPERSAND;
case '*':
return 0;
return HID_KEYBOARD_SC_8_AND_ASTERISK;
case '(':
return 0;
return HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS;
case '`':
case '~':
return 0;
return HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE;
case '[':
case '{':
return 0;
return HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE;
case ']':
case '}':
return 0;
return HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE;
case ';':
case ':':
return 0;
return HID_KEYBOARD_SC_SEMICOLON_AND_COLON;
case '\'':
case '\"':
return 0;
return HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE;
case '+':
case '=':
return 0;
return HID_KEYBOARD_SC_EQUAL_AND_PLUS;
case '\\':
case '|':
return 0;
return HID_KEYBOARD_SC_BACKSLASH_AND_PIPE;
case '.':
case '>':
return 0;
return HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN;
case ',':
case '<':
return 0;
return HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN;
case '/':
case '\?':
return 0;
return HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK;
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;
}
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)
{
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;
switch (currentMacroAction.key.action) {
case MacroSubAction_Press:
case MacroSubAction_Tap:
if (!pressStarted) {
pressStarted = true;
addModifiers(currentMacroAction.key.modifierMask);
switch (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;
}
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
return true;
}
pressStarted = false;
deleteModifiers(currentMacroAction.key.modifierMask);
switch (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;
}
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
break;
case MacroSubAction_Release:
deleteModifiers(currentMacroAction.key.modifierMask);
switch (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;
}
deleteScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
break;
case MacroSubAction_Hold:
case MacroSubAction_Press:
addModifiers(currentMacroAction.key.modifierMask);
switch (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;
}
addScancode(currentMacroAction.key.scancode, currentMacroAction.key.type);
break;
}
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)
{
switch (currentMacroAction.type) {
case MacroActionType_Delay:
return false;
return processDelayAction();
case MacroActionType_Key:
return processKeyMacroAction();
return processKeyAction();
case MacroActionType_MouseButton:
return false;
return processMouseButtonAction();
case MacroActionType_MoveMouse:
return false;
return processMoveMouseAction();
case MacroActionType_ScrollMouse:
return false;
return processScrollMouseAction();
case MacroActionType_Text:
return false;
return processTextAction();
}
return false;
}

View File

@@ -20,8 +20,8 @@
} macro_reference_t;
typedef enum {
MacroSubAction_Tap,
MacroSubAction_Press,
MacroSubAction_Hold,
MacroSubAction_Release,
} macro_sub_action_t;
@@ -55,7 +55,7 @@
int16_t y;
} ATTR_PACKED scrollMouse;
struct {
int16_t delay;
uint16_t delay;
} ATTR_PACKED delay;
struct {
const char *text;

View File

@@ -45,7 +45,6 @@ int main(void)
InitSlaveScheduler();
KeyMatrix_Init(&RightKeyMatrix);
InitKeyScanner();
UpdateUsbReports();
InitUsb();
while (1) {

View File

@@ -1,10 +1,31 @@
#include "test_led.h"
#include "fsl_port.h"
#include "timer.h"
void InitTestLed(void)
void TestLed_Init(void)
{
CLOCK_EnableClock(TEST_LED_CLOCK);
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});
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);
}

View File

@@ -15,13 +15,29 @@
#define TEST_LED_CLOCK kCLOCK_PortD
#define TEST_LED_GPIO_PIN 7U
#define TEST_LED_ON() GPIO_SetPinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
#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))
#define TEST_LED_TOGGLE() GPIO_TogglePinsOutput(TEST_LED_GPIO, 1U << TEST_LED_GPIO_PIN)
static inline void TestLed_On(void)
{
GPIO_SetPinsOutput(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:
void InitTestLed(void);
void TestLed_Init(void);
void TestLed_Blink(uint8_t times);
#endif

View File

@@ -1,12 +1,17 @@
#include "fsl_pit.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)
{
CurrentTime++;
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, PIT_TFLG_TIF_MASK);
currentTime++;
if (delayLength) {
--delayLength;
}
PIT_ClearStatusFlags(PIT, PIT_TIMER_CHANNEL, kPIT_TimerFlag);
}
void Timer_Init(void)
@@ -15,9 +20,8 @@ void Timer_Init(void)
PIT_GetDefaultConfig(&pitConfig);
PIT_Init(PIT, &pitConfig);
// TODO: Why the interval needs to be multiplied by two to arrive to the correct timing?
// Figure it out and clean this up.
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC*2, PIT_SOURCE_CLOCK));
timerClockFrequency = PIT_SOURCE_CLOCK;
PIT_SetTimerPeriod(PIT, PIT_TIMER_CHANNEL, MSEC_TO_COUNT(TIMER_INTERVAL_MSEC, timerClockFrequency));
PIT_EnableInterrupts(PIT, PIT_TIMER_CHANNEL, kPIT_TimerInterruptEnable);
EnableIRQ(PIT_TIMER_IRQ_ID);
@@ -25,23 +29,61 @@ void Timer_Init(void)
}
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)
{
*time = CurrentTime;
*time = Timer_GetCurrentTime();
}
void Timer_SetCurrentTimeMicros(uint32_t *time)
{
*time = Timer_GetCurrentTimeMicros();
}
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;
}
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
{
uint32_t elapsedTime = Timer_GetElapsedTime(time);
*time = CurrentTime;
*time = Timer_GetCurrentTime();
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) {
;
}
}

View File

@@ -13,8 +13,13 @@
void Timer_Init(void);
uint32_t Timer_GetCurrentTime();
uint32_t Timer_GetCurrentTimeMicros();
void Timer_SetCurrentTime(uint32_t *time);
void Timer_SetCurrentTimeMicros(uint32_t *time);
uint32_t Timer_GetElapsedTime(uint32_t *time);
uint32_t Timer_GetElapsedTimeMicros(uint32_t *time);
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
uint32_t Timer_GetElapsedTimeAndSetCurrentMicros(uint32_t *time);
void Timer_Delay(uint32_t length);
#endif

View File

@@ -6,6 +6,6 @@
void UsbCommand_SetTestLed(void)
{
bool isTestLedOn = GetUsbRxBufferUint8(1);
TEST_LED_SET(isTestLedOn);
TestLed_Set(isTestLedOn);
UhkModuleStates[UhkModuleDriverId_LeftKeyboardHalf].sourceVars.isTestLedOn = isTestLedOn;
}

View File

@@ -12,7 +12,13 @@
// Macros:
#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:

View File

@@ -2,33 +2,80 @@
#include "usb_descriptor_hid.h"
#include "usb_descriptor_mouse_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_device_handle handle, usb_device_get_hid_descriptor_struct_t *hidDescriptor)
{
return kStatus_USB_InvalidRequest;
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_Success;
}
usb_status_t USB_DeviceGetHidReportDescriptor(
usb_device_handle handle, usb_device_get_hid_report_descriptor_struct_t *hidReportDescriptor)
{
if (USB_GENERIC_HID_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
} else if (USB_BASIC_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
} else if (USB_MEDIA_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
} else if (USB_SYSTEM_KEYBOARD_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
} else if (USB_MOUSE_INTERFACE_INDEX == hidReportDescriptor->interfaceNumber) {
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
} else {
return kStatus_USB_InvalidRequest;
switch (hidReportDescriptor->interfaceNumber) {
case USB_GENERIC_HID_INTERFACE_INDEX:
hidReportDescriptor->buffer = UsbGenericHidReportDescriptor;
hidReportDescriptor->length = USB_GENERIC_HID_REPORT_DESCRIPTOR_LENGTH;
break;
case USB_BASIC_KEYBOARD_INTERFACE_INDEX:
hidReportDescriptor->buffer = UsbBasicKeyboardReportDescriptor;
hidReportDescriptor->length = USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
break;
case USB_MEDIA_KEYBOARD_INTERFACE_INDEX:
hidReportDescriptor->buffer = UsbMediaKeyboardReportDescriptor;
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
break;
case USB_SYSTEM_KEYBOARD_INTERFACE_INDEX:
hidReportDescriptor->buffer = UsbSystemKeyboardReportDescriptor;
hidReportDescriptor->length = USB_MEDIA_KEYBOARD_REPORT_DESCRIPTOR_LENGTH;
break;
case USB_MOUSE_INTERFACE_INDEX:
hidReportDescriptor->buffer = UsbMouseReportDescriptor;
hidReportDescriptor->length = USB_MOUSE_REPORT_DESCRIPTOR_LENGTH;
break;
default:
return kStatus_USB_InvalidRequest;
}
return kStatus_USB_Success;
}

View File

@@ -1,19 +1,20 @@
#include "led_display.h"
#include "usb_composite_device.h"
#include "usb_report_updater.h"
static usb_basic_keyboard_report_t usbBasicKeyboardReports[2];
uint32_t UsbBasicKeyboardActionCounter;
usb_basic_keyboard_report_t* ActiveUsbBasicKeyboardReport = usbBasicKeyboardReports;
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;
}
void SwitchActiveUsbBasicKeyboardReport(void)
static void SwitchActiveUsbBasicKeyboardReport(void)
{
ActiveUsbBasicKeyboardReport = getInactiveUsbBasicKeyboardReport();
ActiveUsbBasicKeyboardReport = GetInactiveUsbBasicKeyboardReport();
}
void ResetActiveUsbBasicKeyboardReport(void)
@@ -23,10 +24,18 @@ void ResetActiveUsbBasicKeyboardReport(void)
usb_status_t UsbBasicKeyboardAction(void)
{
UsbBasicKeyboardActionCounter++;
return USB_DeviceHidSend(
UsbCompositeDevice.basicKeyboardHandle, USB_BASIC_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbBasicKeyboardReport(), USB_BASIC_KEYBOARD_REPORT_LENGTH);
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,
(uint8_t *)ActiveUsbBasicKeyboardReport, USB_BASIC_KEYBOARD_REPORT_LENGTH);
if (usb_status == kStatus_USB_Success) {
UsbBasicKeyboardActionCounter++;
SwitchActiveUsbBasicKeyboardReport();
}
return usb_status;
}
usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -34,7 +43,14 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
usb_status_t error = kStatus_USB_Error;
switch (event) {
// This event is received when the report has been sent
case kUSB_DeviceHidEventSendResponse:
UsbReportUpdateSemaphore &= ~(1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX);
if (UsbCompositeDevice.attach) {
error = kStatus_USB_Success;
}
break;
case kUSB_DeviceHidEventRecvResponse:
case kUSB_DeviceHidEventGetReport:
error = kStatus_USB_InvalidRequest;
break;
@@ -54,7 +70,7 @@ usb_status_t UsbBasicKeyboardCallback(class_handle_t handle, uint32_t event, voi
report->reportBuffer = usbBasicKeyboardInBuffer;
error = kStatus_USB_Success;
} else {
error = kStatus_USB_InvalidRequest;
error = kStatus_USB_AllocFail;
}
break;
}
@@ -72,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)
{
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
//return UsbBasicKeyboardAction();
}
return kStatus_USB_Error;
}
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;
}

View File

@@ -41,7 +41,7 @@
usb_status_t UsbBasicKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
void ResetActiveUsbBasicKeyboardReport(void);
void SwitchActiveUsbBasicKeyboardReport(void);
usb_basic_keyboard_report_t* GetInactiveUsbBasicKeyboardReport(void);
usb_status_t UsbBasicKeyboardAction(void);
#endif

View File

@@ -7,6 +7,10 @@ uint8_t GenericHidOutBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
static usb_status_t UsbReceiveData(void)
{
if (!UsbCompositeDevice.attach) {
return kStatus_USB_Error; // The device is not attached
}
return USB_DeviceHidRecv(UsbCompositeDevice.genericHidHandle,
USB_GENERIC_HID_ENDPOINT_OUT_INDEX,
GenericHidInBuffer,
@@ -18,7 +22,11 @@ usb_status_t UsbGenericHidCallback(class_handle_t handle, uint32_t event, void *
usb_status_t error = kStatus_USB_Error;
switch (event) {
// This event is received when the report has been sent
case kUSB_DeviceHidEventSendResponse:
if (UsbCompositeDevice.attach) {
error = kStatus_USB_Success;
}
break;
case kUSB_DeviceHidEventRecvResponse:
UsbProtocolHandler();

View File

@@ -1,17 +1,18 @@
#include "usb_composite_device.h"
#include "usb_report_updater.h"
uint32_t UsbMediaKeyboardActionCounter;
static usb_media_keyboard_report_t usbMediaKeyboardReports[2];
usb_media_keyboard_report_t* ActiveUsbMediaKeyboardReport = usbMediaKeyboardReports;
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void)
{
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
}
void SwitchActiveUsbMediaKeyboardReport(void)
static void SwitchActiveUsbMediaKeyboardReport(void)
{
ActiveUsbMediaKeyboardReport = getInactiveUsbMediaKeyboardReport();
ActiveUsbMediaKeyboardReport = GetInactiveUsbMediaKeyboardReport();
}
void ResetActiveUsbMediaKeyboardReport(void)
@@ -19,12 +20,20 @@ void ResetActiveUsbMediaKeyboardReport(void)
bzero(ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
}
usb_status_t UsbMediaKeyboardAction()
usb_status_t UsbMediaKeyboardAction(void)
{
UsbMediaKeyboardActionCounter++;
return USB_DeviceHidSend(
UsbCompositeDevice.mediaKeyboardHandle, USB_MEDIA_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMediaKeyboardReport(), USB_MEDIA_KEYBOARD_REPORT_LENGTH);
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,
(uint8_t *)ActiveUsbMediaKeyboardReport, USB_MEDIA_KEYBOARD_REPORT_LENGTH);
if (usb_status == kStatus_USB_Success) {
UsbMediaKeyboardActionCounter++;
SwitchActiveUsbMediaKeyboardReport();
}
return usb_status;
}
usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -32,7 +41,14 @@ usb_status_t UsbMediaKeyboardCallback(class_handle_t handle, uint32_t event, voi
usb_status_t error = kStatus_USB_Error;
switch (event) {
// This event is received when the report has been sent
case kUSB_DeviceHidEventSendResponse:
UsbReportUpdateSemaphore &= ~(1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX);
if (UsbCompositeDevice.attach) {
error = kStatus_USB_Success;
}
break;
case kUSB_DeviceHidEventRecvResponse:
case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer:
@@ -52,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)
{
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
//return UsbMediaKeyboardAction();
}
return kStatus_USB_Error;
}
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;
}

View File

@@ -38,7 +38,7 @@
usb_status_t UsbMediaKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
void ResetActiveUsbMediaKeyboardReport(void);
void SwitchActiveUsbMediaKeyboardReport(void);
usb_media_keyboard_report_t* GetInactiveUsbMediaKeyboardReport(void);
usb_status_t UsbMediaKeyboardAction();
#endif

View File

@@ -1,17 +1,18 @@
#include "usb_composite_device.h"
#include "usb_report_updater.h"
uint32_t UsbMouseActionCounter;
static usb_mouse_report_t usbMouseReports[2];
usb_mouse_report_t* ActiveUsbMouseReport = usbMouseReports;
static usb_mouse_report_t* getInactiveUsbMouseReport(void)
usb_mouse_report_t* GetInactiveUsbMouseReport(void)
{
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
}
void SwitchActiveUsbMouseReport(void)
static void SwitchActiveUsbMouseReport(void)
{
ActiveUsbMouseReport = getInactiveUsbMouseReport();
ActiveUsbMouseReport = GetInactiveUsbMouseReport();
}
void ResetActiveUsbMouseReport(void)
@@ -19,31 +20,35 @@ void ResetActiveUsbMouseReport(void)
bzero(ActiveUsbMouseReport, USB_MOUSE_REPORT_LENGTH);
}
usb_status_t usbMouseAction(void)
usb_status_t UsbMouseAction(void)
{
UsbMouseActionCounter++;
return USB_DeviceHidSend(
UsbCompositeDevice.mouseHandle, USB_MOUSE_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbMouseReport(), USB_MOUSE_REPORT_LENGTH);
if (!UsbCompositeDevice.attach) {
return kStatus_USB_Error; // The device is not attached
}
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)
{
static bool usbMouseActionActive = false;
usb_status_t error = kStatus_USB_Error;
switch (event) {
// This event is received when the report has been sent
case kUSB_DeviceHidEventSendResponse:
UsbReportUpdateSemaphore &= ~(1 << USB_MOUSE_INTERFACE_INDEX);
if (UsbCompositeDevice.attach) {
// Send out the report continuously if the report is not zeros
usb_mouse_report_t *report = getInactiveUsbMouseReport();
uint8_t zeroBuf[sizeof(usb_mouse_report_t)] = { 0 };
bool reportChanged = memcmp(report, zeroBuf, sizeof(usb_mouse_report_t)) != 0;
if (usbMouseActionActive || reportChanged) {
usbMouseActionActive = reportChanged; // Used to send out all zeros once after a report has been sent
return usbMouseAction();
}
error = kStatus_USB_Success;
}
break;
case kUSB_DeviceHidEventRecvResponse:
case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer:
@@ -63,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)
{
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
//return usbMouseAction();
}
return kStatus_USB_Error;
}
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;
}

View File

@@ -41,7 +41,7 @@
usb_status_t UsbMouseSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
void ResetActiveUsbMouseReport(void);
void SwitchActiveUsbMouseReport(void);
usb_status_t usbMouseAction(void);
usb_mouse_report_t* GetInactiveUsbMouseReport(void);
usb_status_t UsbMouseAction(void);
#endif

View File

@@ -1,17 +1,18 @@
#include "usb_composite_device.h"
#include "usb_report_updater.h"
uint32_t UsbSystemKeyboardActionCounter;
static usb_system_keyboard_report_t usbSystemKeyboardReports[2];
usb_system_keyboard_report_t* ActiveUsbSystemKeyboardReport = usbSystemKeyboardReports;
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport()
{
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
}
void SwitchActiveUsbSystemKeyboardReport(void)
static void SwitchActiveUsbSystemKeyboardReport(void)
{
ActiveUsbSystemKeyboardReport = getInactiveUsbSystemKeyboardReport();
ActiveUsbSystemKeyboardReport = GetInactiveUsbSystemKeyboardReport();
}
void ResetActiveUsbSystemKeyboardReport(void)
@@ -21,10 +22,18 @@ void ResetActiveUsbSystemKeyboardReport(void)
usb_status_t UsbSystemKeyboardAction(void)
{
UsbSystemKeyboardActionCounter++;
return USB_DeviceHidSend(
UsbCompositeDevice.systemKeyboardHandle, USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX,
(uint8_t*)getInactiveUsbSystemKeyboardReport(), USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
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,
(uint8_t *)ActiveUsbSystemKeyboardReport, USB_SYSTEM_KEYBOARD_REPORT_LENGTH);
if (usb_status == kStatus_USB_Success) {
UsbSystemKeyboardActionCounter++;
SwitchActiveUsbSystemKeyboardReport();
}
return usb_status;
}
usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, void *param)
@@ -32,7 +41,14 @@ usb_status_t UsbSystemKeyboardCallback(class_handle_t handle, uint32_t event, vo
usb_status_t error = kStatus_USB_Error;
switch (event) {
// This event is received when the report has been sent
case kUSB_DeviceHidEventSendResponse:
UsbReportUpdateSemaphore &= ~(1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX);
if (UsbCompositeDevice.attach) {
error = kStatus_USB_Success;
}
break;
case kUSB_DeviceHidEventRecvResponse:
case kUSB_DeviceHidEventGetReport:
case kUSB_DeviceHidEventSetReport:
case kUSB_DeviceHidEventRequestReportBuffer:
@@ -52,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)
{
if (USB_COMPOSITE_CONFIGURATION_INDEX == configuration) {
//return UsbSystemKeyboardAction();
}
return kStatus_USB_Error;
}
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;
}

View File

@@ -39,7 +39,7 @@
usb_status_t UsbSystemKeyboardSetInterface(class_handle_t handle, uint8_t interface, uint8_t alternateSetting);
void ResetActiveUsbSystemKeyboardReport(void);
void SwitchActiveUsbSystemKeyboardReport(void);
usb_system_keyboard_report_t* GetInactiveUsbSystemKeyboardReport();
usb_status_t UsbSystemKeyboardAction(void);
#endif

View File

@@ -16,6 +16,7 @@
#include "key_debouncer.h"
#include "config_parser/parse_keymap.h"
#include "usb_commands/usb_command_get_debug_buffer.h"
#include "arduino_hid/ConsumerAPI.h"
static uint32_t mouseUsbReportUpdateTime = 0;
static uint32_t mouseElapsedTime;
@@ -25,6 +26,8 @@ static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
volatile uint8_t UsbReportUpdateSemaphore = 0;
mouse_kinetic_state_t MouseMoveState = {
.isScroll = false,
.upState = SerializedMouseAction_MoveUp,
@@ -123,7 +126,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
kineticState->xOut = xSumInt;
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;
}
@@ -144,7 +147,7 @@ static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
kineticState->yOut = ySumInt;
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;
}
} else {
@@ -278,6 +281,11 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action)
SwitchKeymapById(action->switchKeymap.keymapId);
}
break;
case KeyActionType_PlayMacro:
if (!keyState->previous) {
Macros_StartMacro(action->playMacro.macroId);
}
break;
}
}
@@ -288,18 +296,23 @@ static secondary_role_t secondaryRole;
static void updateActiveUsbReports(void)
{
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
static uint8_t previousModifiers = 0;
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;
}
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
basicScancodeIndex = 0;
mediaScancodeIndex = 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;
if (secondaryRoleState == SecondaryRoleState_Triggered && IS_SECONDARY_ROLE_LAYER_SWITCHER(secondaryRole)) {
activeLayer = SECONDARY_ROLE_LAYER_TO_LAYER_ID(secondaryRole);
@@ -310,24 +323,37 @@ static void updateActiveUsbReports(void)
bool layerGotReleased = previousLayer != LayerId_Base && activeLayer == LayerId_Base;
LedDisplay_SetLayer(activeLayer);
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;
#if 0 // Used to toggle key presses at the maximum rate - this was used to reproduce: https://github.com/UltimateHackingKeyboard/firmware/issues/122
static bool simulateKeypresses = false;
static bool isEven = false;
static bool isEvenMedia = false;
static uint32_t mediaCounter = 0;
key_state_t *testKeyState = &KeyStates[SlotId_LeftKeyboardHalf][0];
if (!testKeyState->previous && testKeyState->current && activeLayer == LayerId_Fn) {
simulateKeypresses = !simulateKeypresses;
}
if (simulateKeypresses) {
isEven = !isEven;
ActiveUsbBasicKeyboardReport->scancodes[basicScancodeIndex++] = isEven ? HID_KEYBOARD_SC_A : HID_KEYBOARD_SC_BACKSPACE;
if (++mediaCounter % 200 == 0) {
isEvenMedia = !isEvenMedia;
ActiveUsbMediaKeyboardReport->scancodes[mediaScancodeIndex++] = isEvenMedia ? MEDIA_VOLUME_DOWN : MEDIA_VOLUME_UP;
}
MouseMoveState.xOut = isEven ? -1 : 1;
}
#endif
for (uint8_t slotId=0; slotId<SLOT_COUNT; slotId++) {
for (uint8_t keyId=0; keyId<MAX_KEY_COUNT_PER_MODULE; keyId++) {
key_state_t *keyState = &KeyStates[slotId][keyId];
key_action_t *action = &CurrentKeymap[activeLayer][slotId][keyId];
if (keyState->debounceCounter < KEY_DEBOUNCER_TIMEOUT_MSEC) {
if (keyState->debounceCounter) {
keyState->current = keyState->previous;
} else if (!keyState->previous && keyState->current) {
keyState->debounceCounter = 0;
keyState->debounceCounter = KEY_DEBOUNCER_TIMEOUT_MSEC + 1;
}
if (keyState->current) {
@@ -390,26 +416,31 @@ static void updateActiveUsbReports(void)
}
uint32_t UsbReportUpdateCounter;
static uint32_t lastMouseUpdateTime;
void UpdateUsbReports(void)
{
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;
for (uint8_t keyId = 0; keyId < RIGHT_KEY_MATRIX_KEY_COUNT; keyId++) {
KeyStates[SlotId_RightKeyboardHalf][keyId].current = RightKeyMatrix.keyStates[keyId];
}
if (hasActiveMouseState) {
if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_MOUSE_INTERRUPT_IN_INTERVAL) {
return;
if (IsHostSleeping) {
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(true);
return;
}
}
}
Timer_SetCurrentTime(&lastMouseUpdateTime);
return;
}
if (UsbReportUpdateSemaphore) {
return;
}
UsbReportUpdateCounter++;
ResetActiveUsbBasicKeyboardReport();
ResetActiveUsbMediaKeyboardReport();
ResetActiveUsbSystemKeyboardReport();
@@ -417,43 +448,42 @@ void UpdateUsbReports(void)
updateActiveUsbReports();
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
bool HasUsbBasicKeyboardReportChanged = false;
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
last_basic_report = *ActiveUsbBasicKeyboardReport;
SwitchActiveUsbBasicKeyboardReport();
HasUsbBasicKeyboardReportChanged = true;
UsbBasicKeyboardAction();
}
bool HasUsbBasicKeyboardReportChanged = memcmp(ActiveUsbBasicKeyboardReport, GetInactiveUsbBasicKeyboardReport(), sizeof(usb_basic_keyboard_report_t)) != 0;
bool HasUsbMediaKeyboardReportChanged = memcmp(ActiveUsbMediaKeyboardReport, GetInactiveUsbMediaKeyboardReport(), sizeof(usb_media_keyboard_report_t)) != 0;
bool HasUsbSystemKeyboardReportChanged = memcmp(ActiveUsbSystemKeyboardReport, GetInactiveUsbSystemKeyboardReport(), sizeof(usb_system_keyboard_report_t)) != 0;
bool HasUsbMouseReportChanged = memcmp(ActiveUsbMouseReport, GetInactiveUsbMouseReport(), sizeof(usb_mouse_report_t)) != 0;
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
bool HasUsbMediaKeyboardReportChanged = false;
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
last_media_report = *ActiveUsbMediaKeyboardReport;
HasUsbMediaKeyboardReportChanged = true;
SwitchActiveUsbMediaKeyboardReport();
UsbMediaKeyboardAction();
}
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
bool HasUsbSystemKeyboardReportChanged = false;
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
last_system_report = *ActiveUsbSystemKeyboardReport;
HasUsbSystemKeyboardReportChanged = true;
SwitchActiveUsbSystemKeyboardReport();
UsbSystemKeyboardAction();
}
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
bool HasUsbMouseReportChanged = false;
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
last_mouse_report = *ActiveUsbMouseReport;
HasUsbMouseReportChanged = true;
SwitchActiveUsbMouseReport();
usbMouseAction();
}
if ((previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged) && IsHostSleeping) {
if (IsHostSleeping && (previousLayer != LayerId_Base || HasUsbBasicKeyboardReportChanged || HasUsbMediaKeyboardReportChanged || HasUsbSystemKeyboardReportChanged || HasUsbMouseReportChanged)) {
WakeUpHost(true); // Wake up the host if any key is pressed and the computer is sleeping.
}
if (HasUsbBasicKeyboardReportChanged) {
usb_status_t status = UsbBasicKeyboardAction();
if (status == kStatus_USB_Success) {
UsbReportUpdateSemaphore |= 1 << USB_BASIC_KEYBOARD_INTERFACE_INDEX;
}
}
if (HasUsbMediaKeyboardReportChanged) {
usb_status_t status = UsbMediaKeyboardAction();
if (status == kStatus_USB_Success) {
UsbReportUpdateSemaphore |= 1 << USB_MEDIA_KEYBOARD_INTERFACE_INDEX;
}
}
if (HasUsbSystemKeyboardReportChanged) {
usb_status_t status = UsbSystemKeyboardAction();
if (status == kStatus_USB_Success) {
UsbReportUpdateSemaphore |= 1 << USB_SYSTEM_KEYBOARD_INTERFACE_INDEX;
}
}
// 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 (HasUsbMouseReportChanged || ActiveUsbMouseReport->x || ActiveUsbMouseReport->y ||
ActiveUsbMouseReport->wheelX || ActiveUsbMouseReport->wheelY) {
usb_status_t status = UsbMouseAction();
if (status == kStatus_USB_Success) {
UsbReportUpdateSemaphore |= 1 << USB_MOUSE_INTERFACE_INDEX;
}
}
}

View File

@@ -70,6 +70,7 @@
extern mouse_kinetic_state_t MouseMoveState;
extern mouse_kinetic_state_t MouseScrollState;
extern uint32_t UsbReportUpdateCounter;
extern volatile uint8_t UsbReportUpdateSemaphore;
// Functions:

View File

@@ -15,7 +15,7 @@
"commander": "^2.11.0",
"shelljs": "^0.7.8"
},
"firmwareVersion": "8.3.1",
"firmwareVersion": "8.3.3",
"deviceProtocolVersion": "4.3.1",
"moduleProtocolVersion": "4.0.0",
"userConfigVersion": "4.1.0",

View File

@@ -20,7 +20,7 @@
#define FIRMWARE_MAJOR_VERSION 8
#define FIRMWARE_MINOR_VERSION 3
#define FIRMWARE_PATCH_VERSION 1
#define FIRMWARE_PATCH_VERSION 3
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
#define DEVICE_PROTOCOL_MINOR_VERSION 3