Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b9ec89e20 | ||
|
|
7002e7de52 | ||
|
|
1e61a39210 | ||
|
|
5509cbb5f8 | ||
|
|
f650032fef | ||
|
|
fd787f74e9 | ||
|
|
75fe7904b6 | ||
|
|
b4ac82d2c0 | ||
|
|
9670523310 | ||
|
|
7763d8a32b | ||
|
|
3d9170402b | ||
|
|
b0192085bb | ||
|
|
c90261d549 | ||
|
|
5a756edf8b | ||
|
|
46ce16b8d4 | ||
|
|
d2acfba659 | ||
|
|
ac75d0ca8b | ||
|
|
10beb751ac | ||
|
|
e0528e1714 | ||
|
|
0afb3ab687 | ||
|
|
58fd3a78cf | ||
|
|
308a71e4a3 | ||
|
|
ecf1f1ac32 | ||
|
|
b34fb9daa3 | ||
|
|
b68c6bed18 | ||
|
|
ab24e78a5b | ||
|
|
4892d64795 | ||
|
|
c10d6440ce | ||
|
|
c109a9e202 | ||
|
|
5d59540c51 | ||
|
|
e12e219b4e | ||
|
|
3ab2ac18fc | ||
|
|
6e2eca7829 | ||
|
|
8f4fc1da8e | ||
|
|
5de0e5ac60 | ||
|
|
13a718f871 | ||
|
|
15d09552a4 | ||
|
|
0b100feb32 |
10
CHANGELOG.md
10
CHANGELOG.md
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
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.1.6] - 2018-04-10
|
||||||
|
|
||||||
|
Device Protocol: 4.**3.0** | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||||
|
|
||||||
|
- Change the scheduling of USB reports which changes mouse pointer speeds.
|
||||||
|
- Disable LEDs while the host sleeps.
|
||||||
|
- Make any key wake up the host while it sleeps.
|
||||||
|
- Add UsbCommand_SwitchKeymap(). `DEVICEPROTOCOL:MINOR`
|
||||||
|
- Make GCC optimize the release builds for execution speed (-O3).
|
||||||
|
|
||||||
## [8.1.5] - 2018-04-04
|
## [8.1.5] - 2018-04-04
|
||||||
|
|
||||||
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||||
|
|||||||
Submodule lib/KSDK_2.0_MK22FN512xxx12 updated: 9fbf2bbf08...e447ecee3a
Submodule lib/agent updated: 9beadb4aac...9b815ed9c1
@@ -17,7 +17,7 @@
|
|||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
|
||||||
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
|
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
|
||||||
@@ -136,9 +136,6 @@
|
|||||||
</tool>
|
</tool>
|
||||||
</toolChain>
|
</toolChain>
|
||||||
</folderInfo>
|
</folderInfo>
|
||||||
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.621318926" name="wormhole.c" rcbsApplicability="disable" resourcePath="bootloader-shared/wormhole.c" toolsToInvoke="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614">
|
|
||||||
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335"/>
|
|
||||||
</fileInfo>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
|
|||||||
@@ -196,21 +196,27 @@ SECTIONS
|
|||||||
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
text_end = ORIGIN(m_text) + LENGTH(m_text);
|
||||||
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
|
||||||
|
|
||||||
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
.bss :
|
.bss : ALIGN(4)
|
||||||
{
|
{
|
||||||
/* This is used by the startup in order to initialize the .bss section */
|
/* This is used by the startup in order to initialize the .bss section */
|
||||||
. = ALIGN(4);
|
|
||||||
__START_BSS = .;
|
__START_BSS = .;
|
||||||
__bss_start__ = .;
|
__bss_start__ = .;
|
||||||
*(.bss)
|
*(.bss)
|
||||||
*(.bss*)
|
*(.bss*)
|
||||||
. = ALIGN(512);
|
|
||||||
USB_RAM_START = .;
|
|
||||||
. += USB_RAM_GAP;
|
|
||||||
*(COMMON)
|
*(COMMON)
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_bdt (NOLOAD) :
|
||||||
|
{
|
||||||
|
. = ALIGN(512);
|
||||||
|
*(m_usb_bdt)
|
||||||
|
} > m_data
|
||||||
|
|
||||||
|
.m_usb_global (NOLOAD) :
|
||||||
|
{
|
||||||
|
*(m_usb_global)
|
||||||
__bss_end__ = .;
|
__bss_end__ = .;
|
||||||
__END_BSS = .;
|
__END_BSS = .;
|
||||||
} > m_data
|
} > m_data
|
||||||
@@ -239,17 +245,6 @@ SECTIONS
|
|||||||
. += STACK_SIZE;
|
. += STACK_SIZE;
|
||||||
} > m_data_2
|
} > m_data_2
|
||||||
|
|
||||||
m_usb_bdt USB_RAM_START (NOLOAD) :
|
|
||||||
{
|
|
||||||
*(m_usb_bdt)
|
|
||||||
USB_RAM_BDT_END = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_usb_global USB_RAM_BDT_END (NOLOAD) :
|
|
||||||
{
|
|
||||||
*(m_usb_global)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initializes stack on the end of block */
|
/* Initializes stack on the end of block */
|
||||||
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
|
||||||
__StackLimit = __StackTop - STACK_SIZE;
|
__StackLimit = __StackTop - STACK_SIZE;
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
#include "buffer.h"
|
#include "buffer.h"
|
||||||
|
|
||||||
bool IsEepromBusy;
|
volatile bool IsEepromBusy;
|
||||||
static eeprom_operation_t CurrentEepromOperation;
|
static eeprom_operation_t CurrentEepromOperation;
|
||||||
static config_buffer_id_t CurrentConfigBufferId;
|
static config_buffer_id_t CurrentConfigBufferId;
|
||||||
status_t LastEepromTransferStatus;
|
static status_t LastEepromTransferStatus;
|
||||||
void (*SuccessCallback)(void);
|
void (*SuccessCallback)(void);
|
||||||
|
|
||||||
static i2c_master_handle_t i2cHandle;
|
static i2c_master_handle_t i2cHandle;
|
||||||
|
|||||||
@@ -24,8 +24,7 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsEepromBusy;
|
extern volatile bool IsEepromBusy;
|
||||||
extern status_t EepromTransferStatus;
|
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -18,10 +18,10 @@
|
|||||||
#include "bootloader/wormhole.h"
|
#include "bootloader/wormhole.h"
|
||||||
|
|
||||||
bool IsBusPalOn;
|
bool IsBusPalOn;
|
||||||
uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
|
||||||
uint32_t I2cMainBusActualBaudRateBps;
|
volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||||
|
|
||||||
void initBusPalState(void) {
|
static void initBusPalState(void) {
|
||||||
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
|
||||||
if (IsBusPalOn) {
|
if (IsBusPalOn) {
|
||||||
Wormhole.magicNumber = 0;
|
Wormhole.magicNumber = 0;
|
||||||
@@ -29,7 +29,7 @@ void initBusPalState(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initInterruptPriorities(void)
|
static void initInterruptPriorities(void)
|
||||||
{
|
{
|
||||||
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
|
||||||
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
|
||||||
@@ -40,12 +40,12 @@ void initInterruptPriorities(void)
|
|||||||
NVIC_SetPriority(USB_IRQ_ID, 3);
|
NVIC_SetPriority(USB_IRQ_ID, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
void delay(void)
|
static void delay(void)
|
||||||
{
|
{
|
||||||
for (volatile uint32_t i=0; i<62; i++);
|
for (volatile uint32_t i=0; i<62; i++);
|
||||||
}
|
}
|
||||||
|
|
||||||
void recoverI2c(void)
|
static void recoverI2c(void)
|
||||||
{
|
{
|
||||||
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio);
|
||||||
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
|
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
|
||||||
@@ -74,7 +74,7 @@ void recoverI2c(void)
|
|||||||
delay();
|
delay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initI2cMainBus(void)
|
static void initI2cMainBus(void)
|
||||||
{
|
{
|
||||||
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
|
||||||
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
|
||||||
@@ -105,7 +105,7 @@ void ReinitI2cMainBus(void)
|
|||||||
InitSlaveScheduler();
|
InitSlaveScheduler();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initI2cEepromBus(void)
|
static void initI2cEepromBus(void)
|
||||||
{
|
{
|
||||||
port_pin_config_t pinConfig = {
|
port_pin_config_t pinConfig = {
|
||||||
.pullSelect = kPORT_PullUp,
|
.pullSelect = kPORT_PullUp,
|
||||||
@@ -126,7 +126,7 @@ void initI2cEepromBus(void)
|
|||||||
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
|
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initI2c(void)
|
static void initI2c(void)
|
||||||
{
|
{
|
||||||
initI2cMainBus();
|
initI2cMainBus();
|
||||||
initI2cEepromBus();
|
initI2cEepromBus();
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsBusPalOn;
|
extern bool IsBusPalOn;
|
||||||
extern uint32_t I2cMainBusRequestedBaudRateBps;
|
extern volatile uint32_t I2cMainBusRequestedBaudRateBps;
|
||||||
extern uint32_t I2cMainBusActualBaudRateBps;
|
extern volatile uint32_t I2cMainBusActualBaudRateBps;
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,19 @@
|
|||||||
#include "config_parser/config_globals.h"
|
#include "config_parser/config_globals.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
|
||||||
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { "FTY", 0, 3 } };
|
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = {
|
||||||
|
{
|
||||||
|
.abbreviation = "FTY",
|
||||||
|
.offset = 0,
|
||||||
|
.abbreviationLen = 3
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
uint8_t AllKeymapsCount;
|
uint8_t AllKeymapsCount;
|
||||||
uint8_t DefaultKeymapIndex;
|
uint8_t DefaultKeymapIndex;
|
||||||
uint8_t CurrentKeymapIndex = 0;
|
uint8_t CurrentKeymapIndex = 0;
|
||||||
|
|
||||||
void SwitchKeymap(uint8_t index)
|
void SwitchKeymapById(uint8_t index)
|
||||||
{
|
{
|
||||||
CurrentKeymapIndex = index;
|
CurrentKeymapIndex = index;
|
||||||
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
|
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
|
||||||
@@ -19,6 +26,18 @@ void SwitchKeymap(uint8_t index)
|
|||||||
LedDisplay_SetCurrentKeymapText();
|
LedDisplay_SetCurrentKeymapText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev)
|
||||||
|
{
|
||||||
|
for (uint8_t i=0; i<AllKeymapsCount; i++) {
|
||||||
|
keymap_reference_t *keymap = AllKeymaps + i;
|
||||||
|
if (keymap->abbreviationLen == length && memcmp(keymap->abbreviation, abbrev, length) == 0) {
|
||||||
|
SwitchKeymapById(i);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM.
|
// The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM.
|
||||||
key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] = {
|
key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] = {
|
||||||
// Base layer
|
// Base layer
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void SwitchKeymap(uint8_t index);
|
void SwitchKeymapById(uint8_t index);
|
||||||
|
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ void LedDisplay_SetCurrentKeymapText(void)
|
|||||||
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LedDisplay_SetLayer(uint8_t layerId)
|
void LedDisplay_SetLayer(layer_id_t layerId)
|
||||||
{
|
{
|
||||||
for (uint8_t i = 13; i <= 45; i += 16) {
|
for (uint8_t i = 13; i <= 45; i += 16) {
|
||||||
LedDriverValues[LedDriverId_Left][i] = 0;
|
LedDriverValues[LedDriverId_Left][i] = 0;
|
||||||
@@ -101,6 +101,11 @@ void LedDisplay_SetLayer(uint8_t layerId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LedDisplay_GetIcon(led_display_icon_t icon)
|
||||||
|
{
|
||||||
|
return LedDriverValues[LedDriverId_Left][8 + icon];
|
||||||
|
}
|
||||||
|
|
||||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
|
||||||
{
|
{
|
||||||
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? IconsAndLayerTextsBrightness : 0;
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "layer.h"
|
||||||
|
|
||||||
// Typedefs:
|
// Typedefs:
|
||||||
|
|
||||||
@@ -23,7 +24,9 @@
|
|||||||
|
|
||||||
void LedDisplay_SetText(uint8_t length, const char* text);
|
void LedDisplay_SetText(uint8_t length, const char* text);
|
||||||
void LedDisplay_SetCurrentKeymapText(void);
|
void LedDisplay_SetCurrentKeymapText(void);
|
||||||
void LedDisplay_SetLayer(uint8_t layerId);
|
void LedDisplay_SetLayer(layer_id_t layerId);
|
||||||
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
|
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
|
||||||
|
|
||||||
|
bool LedDisplay_GetIcon(led_display_icon_t icon);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -11,15 +11,15 @@
|
|||||||
#include "peripherals/reset_button.h"
|
#include "peripherals/reset_button.h"
|
||||||
#include "usb_report_updater.h"
|
#include "usb_report_updater.h"
|
||||||
|
|
||||||
bool IsEepromInitialized = false;
|
static bool IsEepromInitialized = false;
|
||||||
bool IsConfigInitialized = false;
|
static bool IsConfigInitialized = false;
|
||||||
|
|
||||||
void userConfigurationReadFinished(void)
|
static void userConfigurationReadFinished(void)
|
||||||
{
|
{
|
||||||
IsEepromInitialized = true;
|
IsEepromInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hardwareConfigurationReadFinished(void)
|
static void hardwareConfigurationReadFinished(void)
|
||||||
{
|
{
|
||||||
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
|
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "fsl_port.h"
|
#include "fsl_port.h"
|
||||||
#include "peripherals/adc.h"
|
#include "peripherals/adc.h"
|
||||||
|
|
||||||
adc16_channel_config_t adc16ChannelConfigStruct;
|
static adc16_channel_config_t adc16ChannelConfigStruct;
|
||||||
|
|
||||||
void ADC_Init(void)
|
void ADC_Init(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "fsl_pit.h"
|
#include "fsl_pit.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
uint32_t CurrentTime;
|
static volatile uint32_t CurrentTime;
|
||||||
|
|
||||||
void PIT_TIMER_HANDLER(void)
|
void PIT_TIMER_HANDLER(void)
|
||||||
{
|
{
|
||||||
@@ -24,6 +24,10 @@ void Timer_Init(void)
|
|||||||
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t Timer_GetCurrentTime() {
|
||||||
|
return CurrentTime;
|
||||||
|
}
|
||||||
|
|
||||||
void Timer_SetCurrentTime(uint32_t *time)
|
void Timer_SetCurrentTime(uint32_t *time)
|
||||||
{
|
{
|
||||||
*time = CurrentTime;
|
*time = CurrentTime;
|
||||||
|
|||||||
@@ -9,13 +9,10 @@
|
|||||||
|
|
||||||
#define TIMER_INTERVAL_MSEC 1
|
#define TIMER_INTERVAL_MSEC 1
|
||||||
|
|
||||||
// Variables:
|
|
||||||
|
|
||||||
extern uint32_t CurrentTime;
|
|
||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
void Timer_Init(void);
|
void Timer_Init(void);
|
||||||
|
uint32_t Timer_GetCurrentTime();
|
||||||
void Timer_SetCurrentTime(uint32_t *time);
|
void Timer_SetCurrentTime(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
uint32_t Timer_GetElapsedTime(uint32_t *time);
|
||||||
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
|
||||||
|
|||||||
@@ -45,15 +45,9 @@ void UsbCommand_ApplyConfig(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Switch to the keymap of the updated configuration of the same name or the default keymap.
|
// Switch to the keymap of the updated configuration of the same name or the default keymap.
|
||||||
|
if (SwitchKeymapByAbbreviation(oldKeymapAbbreviationLen, oldKeymapAbbreviation)) {
|
||||||
for (uint8_t keymapId = 0; keymapId < AllKeymapsCount; keymapId++) {
|
return;
|
||||||
if (AllKeymaps[keymapId].abbreviationLen == oldKeymapAbbreviationLen &&
|
|
||||||
!memcmp(oldKeymapAbbreviation, AllKeymaps[keymapId].abbreviation, oldKeymapAbbreviationLen))
|
|
||||||
{
|
|
||||||
SwitchKeymap(keymapId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SwitchKeymap(DefaultKeymapIndex);
|
SwitchKeymapById(DefaultKeymapIndex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ void UsbCommand_GetDebugBuffer(void)
|
|||||||
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
|
||||||
SetDebugBufferUint32(17, KeyScannerCounter);
|
SetDebugBufferUint32(17, KeyScannerCounter);
|
||||||
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
SetDebugBufferUint32(21, UsbReportUpdateCounter);
|
||||||
SetDebugBufferUint32(25, CurrentTime);
|
SetDebugBufferUint32(25, Timer_GetCurrentTime());
|
||||||
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
|
||||||
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
|
||||||
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ void UsbCommand_GetDeviceProperty(void)
|
|||||||
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
|
||||||
break;
|
break;
|
||||||
case DevicePropertyId_Uptime:
|
case DevicePropertyId_Uptime:
|
||||||
SetUsbTxBufferUint32(1, CurrentTime);
|
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
|
||||||
|
|||||||
17
right/src/usb_commands/usb_command_switch_keymap.c
Normal file
17
right/src/usb_commands/usb_command_switch_keymap.c
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#include "usb_protocol_handler.h"
|
||||||
|
#include "usb_commands/usb_command_switch_keymap.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
|
||||||
|
void UsbCommand_SwitchKeymap(void)
|
||||||
|
{
|
||||||
|
uint32_t keymapLength = GetUsbRxBufferUint8(1);
|
||||||
|
char *keymapAbbrev = (char*)GenericHidInBuffer + 2;
|
||||||
|
|
||||||
|
if (keymapLength > KEYMAP_ABBREVIATION_LENGTH) {
|
||||||
|
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SwitchKeymapByAbbreviation(keymapLength, keymapAbbrev)) {
|
||||||
|
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviation);
|
||||||
|
}
|
||||||
|
}
|
||||||
15
right/src/usb_commands/usb_command_switch_keymap.h
Normal file
15
right/src/usb_commands/usb_command_switch_keymap.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef __USB_COMMAND_SWITCH_KEYMAP_H__
|
||||||
|
#define __USB_COMMAND_SWITCH_KEYMAP_H__
|
||||||
|
|
||||||
|
// Functions:
|
||||||
|
|
||||||
|
void UsbCommand_SwitchKeymap(void);
|
||||||
|
|
||||||
|
// Typedefs:
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength = 2,
|
||||||
|
UsbStatusCode_SwitchKeymap_InvalidAbbreviation = 3,
|
||||||
|
} usb_status_code_switch_keymap_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
#include "config.h"
|
||||||
|
#include "led_display.h"
|
||||||
|
#include "slave_drivers/is31fl3731_driver.h"
|
||||||
#include "usb_device_config.h"
|
#include "usb_device_config.h"
|
||||||
#include "usb_composite_device.h"
|
#include "usb_composite_device.h"
|
||||||
#include "usb_descriptors/usb_descriptor_hid.h"
|
#include "usb_descriptors/usb_descriptor_hid.h"
|
||||||
@@ -160,21 +163,89 @@ static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
|
|||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
static bool computerSleeping = false;
|
||||||
|
#ifdef LED_DRIVERS_ENABLED
|
||||||
|
static uint8_t oldKeyBacklightBrightness = 0xFF;
|
||||||
|
static bool capsLockOn = false, agentOn = false, adaptiveOn = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool IsComputerSleeping(void) {
|
||||||
|
return computerSleeping;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ComputerIsSleeping(void) {
|
||||||
|
computerSleeping = true;
|
||||||
|
#ifdef LED_DRIVERS_ENABLED
|
||||||
|
// Save the state of the icons
|
||||||
|
capsLockOn = LedDisplay_GetIcon(LedDisplayIcon_CapsLock);
|
||||||
|
agentOn = LedDisplay_GetIcon(LedDisplayIcon_Agent);
|
||||||
|
adaptiveOn = LedDisplay_GetIcon(LedDisplayIcon_Adaptive);
|
||||||
|
|
||||||
|
// Disable keyboard backlight
|
||||||
|
oldKeyBacklightBrightness = KeyBacklightBrightness;
|
||||||
|
KeyBacklightBrightness = 0;
|
||||||
|
LedSlaveDriver_Init(LedDriverId_Right);
|
||||||
|
LedSlaveDriver_Init(LedDriverId_Left);
|
||||||
|
|
||||||
|
// Turn layer LEDs off
|
||||||
|
LedDisplay_SetLayer(LayerId_Base);
|
||||||
|
|
||||||
|
// Clear the text
|
||||||
|
LedDisplay_SetText(0, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void WakeupComputer(bool sendResume) {
|
||||||
|
if (sendResume) // The device should wake up the computer
|
||||||
|
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL); // Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
|
||||||
|
|
||||||
|
computerSleeping = false; // The computer is now awake
|
||||||
|
|
||||||
|
#ifdef LED_DRIVERS_ENABLED
|
||||||
|
// Restore keyboard backlight and text
|
||||||
|
KeyBacklightBrightness = oldKeyBacklightBrightness;
|
||||||
|
LedSlaveDriver_Init(LedDriverId_Right);
|
||||||
|
LedSlaveDriver_Init(LedDriverId_Left);
|
||||||
|
|
||||||
|
// Update the active layer
|
||||||
|
LedDisplay_SetLayer(GetActiveLayer());
|
||||||
|
|
||||||
|
// Restore icon states
|
||||||
|
LedDisplay_SetIcon(LedDisplayIcon_CapsLock, capsLockOn);
|
||||||
|
LedDisplay_SetIcon(LedDisplayIcon_Agent, agentOn);
|
||||||
|
LedDisplay_SetIcon(LedDisplayIcon_Adaptive, adaptiveOn);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
usb_status_t status = kStatus_USB_Error;
|
usb_status_t status = kStatus_USB_Error;
|
||||||
uint16_t *temp16 = (uint16_t*)param;
|
uint16_t *temp16 = (uint16_t*)param;
|
||||||
uint8_t *temp8 = (uint8_t*)param;
|
uint8_t *temp8 = (uint8_t*)param;
|
||||||
|
|
||||||
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) {
|
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface && event != kUSB_DeviceEventSuspend && event != kUSB_DeviceEventResume) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (computerSleeping)
|
||||||
|
WakeupComputer(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;
|
||||||
status = kStatus_USB_Success;
|
status = kStatus_USB_Success;
|
||||||
break;
|
break;
|
||||||
|
case kUSB_DeviceEventSuspend:
|
||||||
|
if (UsbCompositeDevice.attach) {
|
||||||
|
ComputerIsSleeping(); // The computer sends this event when it goes to sleep, so turn off all the LEDs
|
||||||
|
status = kStatus_USB_Success;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case kUSB_DeviceEventResume:
|
||||||
|
// We will just wake up the computer if there is any activity on the bus
|
||||||
|
// The problem is that the computer won't send a resume event when it boots, so the lights will never come back on
|
||||||
|
status = kStatus_USB_Success;
|
||||||
|
break;
|
||||||
case kUSB_DeviceEventSetConfiguration:
|
case kUSB_DeviceEventSetConfiguration:
|
||||||
UsbCompositeDevice.attach = 1;
|
UsbCompositeDevice.attach = 1;
|
||||||
UsbCompositeDevice.currentConfiguration = *temp8;
|
UsbCompositeDevice.currentConfiguration = *temp8;
|
||||||
|
|||||||
@@ -33,5 +33,7 @@
|
|||||||
//Functions:
|
//Functions:
|
||||||
|
|
||||||
void InitUsb(void);
|
void InitUsb(void);
|
||||||
|
bool IsComputerSleeping(void);
|
||||||
|
void WakeupComputer(bool sendResume);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,10 +23,10 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Whether the device is self-powered: 1 supported, 0 not supported
|
// Whether the device is self-powered: 1 supported, 0 not supported
|
||||||
#define USB_DEVICE_CONFIG_SELF_POWER 1
|
#define USB_DEVICE_CONFIG_SELF_POWER 0
|
||||||
|
|
||||||
// Whether device remote wakeup supported: 1 supported, 0 not supported
|
// Whether device remote wakeup supported: 1 supported, 0 not supported
|
||||||
#define USB_DEVICE_CONFIG_REMOTE_WAKEUP 0
|
#define USB_DEVICE_CONFIG_REMOTE_WAKEUP 1
|
||||||
|
|
||||||
// The number of control endpoints, which is always 1
|
// The number of control endpoints, which is always 1
|
||||||
#define USB_CONTROL_ENDPOINT_COUNT 1
|
#define USB_CONTROL_ENDPOINT_COUNT 1
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
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;
|
||||||
bool IsUsbBasicKeyboardReportSent = false;
|
volatile bool IsUsbBasicKeyboardReportSent = false;
|
||||||
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
static uint8_t usbBasicKeyboardInBuffer[USB_BASIC_KEYBOARD_REPORT_LENGTH];
|
||||||
|
|
||||||
usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
static usb_basic_keyboard_report_t* getInactiveUsbBasicKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
return ActiveUsbBasicKeyboardReport == usbBasicKeyboardReports ? usbBasicKeyboardReports+1 : usbBasicKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsUsbBasicKeyboardReportSent;
|
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;
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
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;
|
||||||
bool IsUsbMediaKeyboardReportSent = false;
|
volatile bool IsUsbMediaKeyboardReportSent = false;
|
||||||
|
|
||||||
usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
static usb_media_keyboard_report_t* getInactiveUsbMediaKeyboardReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
return ActiveUsbMediaKeyboardReport == usbMediaKeyboardReports ? usbMediaKeyboardReports+1 : usbMediaKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsUsbMediaKeyboardReportSent;
|
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;
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
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;
|
||||||
bool IsUsbMouseReportSent = false;
|
volatile bool IsUsbMouseReportSent = false;
|
||||||
|
|
||||||
usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
static usb_mouse_report_t* getInactiveUsbMouseReport(void)
|
||||||
{
|
{
|
||||||
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
return ActiveUsbMouseReport == usbMouseReports ? usbMouseReports+1 : usbMouseReports;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsUsbMouseReportSent;
|
extern volatile bool IsUsbMouseReportSent;
|
||||||
extern uint32_t UsbMouseActionCounter;
|
extern uint32_t UsbMouseActionCounter;
|
||||||
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
extern usb_mouse_report_t* ActiveUsbMouseReport;
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
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;
|
||||||
bool IsUsbSystemKeyboardReportSent = false;
|
volatile bool IsUsbSystemKeyboardReportSent = false;
|
||||||
|
|
||||||
usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
static usb_system_keyboard_report_t* getInactiveUsbSystemKeyboardReport()
|
||||||
{
|
{
|
||||||
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
return ActiveUsbSystemKeyboardReport == usbSystemKeyboardReports ? usbSystemKeyboardReports+1 : usbSystemKeyboardReports;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
// Variables:
|
// Variables:
|
||||||
|
|
||||||
extern bool IsUsbSystemKeyboardReportSent;
|
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;
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
#include "usb_commands/usb_command_send_kboot_command_to_module.h"
|
||||||
#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"
|
||||||
|
|
||||||
void UsbProtocolHandler(void)
|
void UsbProtocolHandler(void)
|
||||||
{
|
{
|
||||||
@@ -73,6 +74,9 @@ void UsbProtocolHandler(void)
|
|||||||
case UsbCommandId_SetI2cBaudRate:
|
case UsbCommandId_SetI2cBaudRate:
|
||||||
UsbCommand_SetI2cBaudRate();
|
UsbCommand_SetI2cBaudRate();
|
||||||
break;
|
break;
|
||||||
|
case UsbCommandId_SwitchKeymap:
|
||||||
|
UsbCommand_SwitchKeymap();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
SetUsbTxBufferUint8(0, UsbStatusCode_InvalidCommand);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
UsbCommandId_GetModuleProperty = 0x0e,
|
UsbCommandId_GetModuleProperty = 0x0e,
|
||||||
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
UsbCommandId_GetSlaveI2cErrors = 0x0f,
|
||||||
UsbCommandId_SetI2cBaudRate = 0x10,
|
UsbCommandId_SetI2cBaudRate = 0x10,
|
||||||
|
UsbCommandId_SwitchKeymap = 0x11,
|
||||||
} usb_command_id_t;
|
} usb_command_id_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -17,11 +17,11 @@
|
|||||||
#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"
|
||||||
|
|
||||||
uint32_t UsbReportUpdateTime = 0;
|
static uint32_t mouseUsbReportUpdateTime = 0;
|
||||||
static uint32_t elapsedTime;
|
static uint32_t mouseElapsedTime;
|
||||||
|
|
||||||
uint16_t DoubleTapSwitchLayerTimeout = 150;
|
uint16_t DoubleTapSwitchLayerTimeout = 150;
|
||||||
uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
static uint16_t DoubleTapSwitchLayerReleaseTimeout = 100;
|
||||||
|
|
||||||
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
static bool activeMouseStates[ACTIVE_MOUSE_STATES_COUNT];
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ mouse_kinetic_state_t MouseScrollState = {
|
|||||||
.acceleratedSpeed = 50,
|
.acceleratedSpeed = 50,
|
||||||
};
|
};
|
||||||
|
|
||||||
void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
static void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
||||||
{
|
{
|
||||||
float initialSpeed = kineticState->intMultiplier * kineticState->initialSpeed;
|
float initialSpeed = kineticState->intMultiplier * kineticState->initialSpeed;
|
||||||
float acceleration = kineticState->intMultiplier * kineticState->acceleration;
|
float acceleration = kineticState->intMultiplier * kineticState->acceleration;
|
||||||
@@ -87,18 +87,18 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
|
|
||||||
if (isMoveAction) {
|
if (isMoveAction) {
|
||||||
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||||
kineticState->currentSpeed += acceleration * elapsedTime / 1000;
|
kineticState->currentSpeed += acceleration * (float)mouseElapsedTime / 1000.0f;
|
||||||
if (kineticState->currentSpeed > kineticState->targetSpeed) {
|
if (kineticState->currentSpeed > kineticState->targetSpeed) {
|
||||||
kineticState->currentSpeed = kineticState->targetSpeed;
|
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
kineticState->currentSpeed -= acceleration * elapsedTime / 1000;
|
kineticState->currentSpeed -= acceleration * (float)mouseElapsedTime / 1000.0f;
|
||||||
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
if (kineticState->currentSpeed < kineticState->targetSpeed) {
|
||||||
kineticState->currentSpeed = kineticState->targetSpeed;
|
kineticState->currentSpeed = kineticState->targetSpeed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float distance = kineticState->currentSpeed * elapsedTime / 1000;
|
float distance = kineticState->currentSpeed * (float)mouseElapsedTime / 1000.0f;
|
||||||
|
|
||||||
|
|
||||||
if (kineticState->isScroll && !kineticState->wasMoveAction) {
|
if (kineticState->isScroll && !kineticState->wasMoveAction) {
|
||||||
@@ -155,8 +155,10 @@ void processMouseKineticState(mouse_kinetic_state_t *kineticState)
|
|||||||
kineticState->wasMoveAction = isMoveAction;
|
kineticState->wasMoveAction = isMoveAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
void processMouseActions()
|
static void processMouseActions()
|
||||||
{
|
{
|
||||||
|
mouseElapsedTime = Timer_GetElapsedTimeAndSetCurrent(&mouseUsbReportUpdateTime);
|
||||||
|
|
||||||
processMouseKineticState(&MouseMoveState);
|
processMouseKineticState(&MouseMoveState);
|
||||||
ActiveUsbMouseReport->x = MouseMoveState.xOut;
|
ActiveUsbMouseReport->x = MouseMoveState.xOut;
|
||||||
ActiveUsbMouseReport->y = MouseMoveState.yOut;
|
ActiveUsbMouseReport->y = MouseMoveState.yOut;
|
||||||
@@ -193,7 +195,7 @@ 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;
|
||||||
|
|
||||||
void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
static void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
||||||
{
|
{
|
||||||
static key_state_t *doubleTapSwitchLayerKey;
|
static key_state_t *doubleTapSwitchLayerKey;
|
||||||
static uint32_t doubleTapSwitchLayerStartTime;
|
static uint32_t doubleTapSwitchLayerStartTime;
|
||||||
@@ -245,16 +247,16 @@ void applyKeyAction(key_state_t *keyState, key_action_t *action)
|
|||||||
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
|
if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) {
|
||||||
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) {
|
||||||
ToggledLayer = action->switchLayer.layer;
|
ToggledLayer = action->switchLayer.layer;
|
||||||
doubleTapSwitchLayerTriggerTime = CurrentTime;
|
doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime();
|
||||||
} else {
|
} else {
|
||||||
doubleTapSwitchLayerKey = keyState;
|
doubleTapSwitchLayerKey = keyState;
|
||||||
}
|
}
|
||||||
doubleTapSwitchLayerStartTime = CurrentTime;
|
doubleTapSwitchLayerStartTime = Timer_GetCurrentTime();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case KeyActionType_SwitchKeymap:
|
case KeyActionType_SwitchKeymap:
|
||||||
if (!keyState->previous) {
|
if (!keyState->previous) {
|
||||||
SwitchKeymap(action->switchKeymap.keymapId);
|
SwitchKeymapById(action->switchKeymap.keymapId);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -265,12 +267,11 @@ static uint8_t secondaryRoleSlotId;
|
|||||||
static uint8_t secondaryRoleKeyId;
|
static uint8_t secondaryRoleKeyId;
|
||||||
static secondary_role_t secondaryRole;
|
static secondary_role_t secondaryRole;
|
||||||
|
|
||||||
void updateActiveUsbReports(void)
|
static void updateActiveUsbReports(void)
|
||||||
{
|
{
|
||||||
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
memset(activeMouseStates, 0, ACTIVE_MOUSE_STATES_COUNT);
|
||||||
|
|
||||||
static uint8_t previousModifiers = 0;
|
static uint8_t previousModifiers = 0;
|
||||||
elapsedTime = Timer_GetElapsedTimeAndSetCurrent(&UsbReportUpdateTime);
|
|
||||||
|
|
||||||
basicScancodeIndex = 0;
|
basicScancodeIndex = 0;
|
||||||
mediaScancodeIndex = 0;
|
mediaScancodeIndex = 0;
|
||||||
@@ -369,52 +370,26 @@ void updateActiveUsbReports(void)
|
|||||||
previousLayer = activeLayer;
|
previousLayer = activeLayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UsbBasicKeyboardReportEverSent = false;
|
|
||||||
bool UsbMediaKeyboardReportEverSent = false;
|
|
||||||
bool UsbSystemKeyboardReportEverSent = false;
|
|
||||||
bool UsbMouseReportEverSentEverSent = false;
|
|
||||||
|
|
||||||
uint32_t UsbReportUpdateCounter;
|
uint32_t UsbReportUpdateCounter;
|
||||||
static uint32_t lastUsbUpdateTime;
|
static uint32_t lastMouseUpdateTime;
|
||||||
|
|
||||||
void UpdateUsbReports(void)
|
void UpdateUsbReports(void)
|
||||||
{
|
{
|
||||||
UsbReportUpdateCounter++;
|
UsbReportUpdateCounter++;
|
||||||
|
|
||||||
if (Timer_GetElapsedTime(&lastUsbUpdateTime) > 100) {
|
// Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent
|
||||||
UsbBasicKeyboardReportEverSent = false;
|
bool hasActiveMouseState = false;
|
||||||
UsbMediaKeyboardReportEverSent = false;
|
for (uint8_t i=0; i<ACTIVE_MOUSE_STATES_COUNT; i++) {
|
||||||
UsbSystemKeyboardReportEverSent = false;
|
hasActiveMouseState = true;
|
||||||
UsbMouseReportEverSentEverSent = false;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsUsbBasicKeyboardReportSent) {
|
if (hasActiveMouseState) {
|
||||||
UsbBasicKeyboardReportEverSent = true;
|
if (Timer_GetElapsedTime(&lastMouseUpdateTime) < USB_MOUSE_INTERRUPT_IN_INTERVAL) {
|
||||||
}
|
return;
|
||||||
if (IsUsbMediaKeyboardReportSent) {
|
}
|
||||||
UsbMediaKeyboardReportEverSent = true;
|
Timer_SetCurrentTime(&lastMouseUpdateTime);
|
||||||
}
|
} else if (!IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) {
|
||||||
if (IsUsbSystemKeyboardReportSent) {
|
|
||||||
UsbSystemKeyboardReportEverSent = true;
|
|
||||||
}
|
|
||||||
if (IsUsbMouseReportSent) {
|
|
||||||
UsbMouseReportEverSentEverSent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool areUsbReportsSent = true;
|
|
||||||
if (UsbBasicKeyboardReportEverSent) {
|
|
||||||
areUsbReportsSent &= IsUsbBasicKeyboardReportSent;
|
|
||||||
}
|
|
||||||
if (UsbMediaKeyboardReportEverSent) {
|
|
||||||
areUsbReportsSent &= IsUsbMediaKeyboardReportSent;
|
|
||||||
}
|
|
||||||
if (UsbSystemKeyboardReportEverSent) {
|
|
||||||
areUsbReportsSent &= IsUsbSystemKeyboardReportSent;
|
|
||||||
}
|
|
||||||
if (UsbMouseReportEverSentEverSent) {
|
|
||||||
areUsbReportsSent &= IsUsbMouseReportSent;
|
|
||||||
}
|
|
||||||
if (!areUsbReportsSent) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -425,15 +400,35 @@ void UpdateUsbReports(void)
|
|||||||
|
|
||||||
updateActiveUsbReports();
|
updateActiveUsbReports();
|
||||||
|
|
||||||
SwitchActiveUsbBasicKeyboardReport();
|
static usb_basic_keyboard_report_t last_basic_report = { .scancodes[0] = 0xFF };
|
||||||
SwitchActiveUsbMediaKeyboardReport();
|
if (memcmp(ActiveUsbBasicKeyboardReport, &last_basic_report, sizeof(usb_basic_keyboard_report_t)) != 0) {
|
||||||
SwitchActiveUsbSystemKeyboardReport();
|
last_basic_report = *ActiveUsbBasicKeyboardReport;
|
||||||
SwitchActiveUsbMouseReport();
|
SwitchActiveUsbBasicKeyboardReport();
|
||||||
|
IsUsbBasicKeyboardReportSent = false;
|
||||||
|
}
|
||||||
|
|
||||||
IsUsbBasicKeyboardReportSent = false;
|
static usb_media_keyboard_report_t last_media_report = { .scancodes[0] = 0xFF };
|
||||||
IsUsbMediaKeyboardReportSent = false;
|
if (memcmp(ActiveUsbMediaKeyboardReport, &last_media_report, sizeof(usb_media_keyboard_report_t)) != 0) {
|
||||||
IsUsbSystemKeyboardReportSent = false;
|
last_media_report = *ActiveUsbMediaKeyboardReport;
|
||||||
IsUsbMouseReportSent = false;
|
SwitchActiveUsbMediaKeyboardReport();
|
||||||
|
IsUsbMediaKeyboardReportSent = false;
|
||||||
|
}
|
||||||
|
|
||||||
Timer_SetCurrentTime(&lastUsbUpdateTime);
|
static usb_system_keyboard_report_t last_system_report = { .scancodes[0] = 0xFF };
|
||||||
|
if (memcmp(ActiveUsbSystemKeyboardReport, &last_system_report, sizeof(usb_system_keyboard_report_t)) != 0) {
|
||||||
|
last_system_report = *ActiveUsbSystemKeyboardReport;
|
||||||
|
SwitchActiveUsbSystemKeyboardReport();
|
||||||
|
IsUsbSystemKeyboardReportSent = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static usb_mouse_report_t last_mouse_report = { .buttons = 0xFF };
|
||||||
|
if (memcmp(ActiveUsbMouseReport, &last_mouse_report, sizeof(usb_mouse_report_t)) != 0) {
|
||||||
|
last_mouse_report = *ActiveUsbMouseReport;
|
||||||
|
SwitchActiveUsbMouseReport();
|
||||||
|
IsUsbMouseReportSent = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((previousLayer != LayerId_Base || !IsUsbBasicKeyboardReportSent || !IsUsbMediaKeyboardReportSent || !IsUsbSystemKeyboardReportSent || !IsUsbMouseReportSent) && IsComputerSleeping()) {
|
||||||
|
WakeupComputer(true); // Wake up the computer if any key is pressed and the computer is sleeping
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ for (const device of package.devices) {
|
|||||||
mkdir('-p', deviceDir);
|
mkdir('-p', deviceDir);
|
||||||
chmod(644, deviceSource);
|
chmod(644, deviceSource);
|
||||||
cp(deviceSource, `${deviceDir}/firmware.hex`);
|
cp(deviceSource, `${deviceDir}/firmware.hex`);
|
||||||
|
exec(`cd ${usbDir}; git pull origin master; git checkout master`);
|
||||||
exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`);
|
exec(`${usbDir}/user-config-json-to-bin.ts ${deviceDir}/config.bin`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
"commander": "^2.11.0",
|
"commander": "^2.11.0",
|
||||||
"shelljs": "^0.7.8"
|
"shelljs": "^0.7.8"
|
||||||
},
|
},
|
||||||
"firmwareVersion": "8.1.5",
|
"firmwareVersion": "8.1.6",
|
||||||
"deviceProtocolVersion": "4.2.0",
|
"deviceProtocolVersion": "4.3.0",
|
||||||
"moduleProtocolVersion": "4.0.0",
|
"moduleProtocolVersion": "4.0.0",
|
||||||
"userConfigVersion": "4.0.0",
|
"userConfigVersion": "4.0.0",
|
||||||
"hardwareConfigVersion": "1.0.0",
|
"hardwareConfigVersion": "1.0.0",
|
||||||
|
|||||||
@@ -20,10 +20,10 @@
|
|||||||
|
|
||||||
#define FIRMWARE_MAJOR_VERSION 8
|
#define FIRMWARE_MAJOR_VERSION 8
|
||||||
#define FIRMWARE_MINOR_VERSION 1
|
#define FIRMWARE_MINOR_VERSION 1
|
||||||
#define FIRMWARE_PATCH_VERSION 5
|
#define FIRMWARE_PATCH_VERSION 6
|
||||||
|
|
||||||
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
#define DEVICE_PROTOCOL_MAJOR_VERSION 4
|
||||||
#define DEVICE_PROTOCOL_MINOR_VERSION 2
|
#define DEVICE_PROTOCOL_MINOR_VERSION 3
|
||||||
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
#define DEVICE_PROTOCOL_PATCH_VERSION 0
|
||||||
|
|
||||||
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
#define MODULE_PROTOCOL_MAJOR_VERSION 4
|
||||||
|
|||||||
Reference in New Issue
Block a user