diff options
Diffstat (limited to 'tmk_core/common')
-rw-r--r-- | tmk_core/common/action.c | 35 | ||||
-rw-r--r-- | tmk_core/common/action.h | 2 | ||||
-rw-r--r-- | tmk_core/common/avr/suspend.c | 5 | ||||
-rw-r--r-- | tmk_core/common/backlight.c | 193 | ||||
-rw-r--r-- | tmk_core/common/backlight.h | 58 | ||||
-rw-r--r-- | tmk_core/common/chibios/printf.c | 9 | ||||
-rw-r--r-- | tmk_core/common/chibios/suspend.c | 5 | ||||
-rw-r--r-- | tmk_core/common/command.c | 5 | ||||
-rw-r--r-- | tmk_core/common/keyboard.c | 28 | ||||
-rw-r--r-- | tmk_core/common/timer.h | 4 | ||||
-rw-r--r-- | tmk_core/common/util.h | 8 | ||||
-rw-r--r-- | tmk_core/common/webusb.c | 72 | ||||
-rw-r--r-- | tmk_core/common/webusb.h | 44 |
13 files changed, 206 insertions, 262 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 1ba38a285e..bd6aeba4f8 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "mousekey.h" #include "command.h" #include "led.h" -#include "backlight.h" #include "action_layer.h" #include "action_tapping.h" #include "action_macro.h" @@ -28,6 +27,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "action.h" #include "wait.h" +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + #ifdef DEBUG_ACTION # include "debug.h" #else @@ -868,9 +871,9 @@ void tap_code(uint8_t code) { unregister_code(code); } -/** \brief Utilities for actions. (FIXME: Needs better description) +/** \brief Adds the given physically pressed modifiers and sends a keyboard report immediately. * - * FIXME: Needs documentation. + * \param mods A bitfield of modifiers to unregister. */ void register_mods(uint8_t mods) { if (mods) { @@ -879,9 +882,9 @@ void register_mods(uint8_t mods) { } } -/** \brief Utilities for actions. (FIXME: Needs better description) +/** \brief Removes the given physically pressed modifiers and sends a keyboard report immediately. * - * FIXME: Needs documentation. + * \param mods A bitfield of modifiers to unregister. */ void unregister_mods(uint8_t mods) { if (mods) { @@ -890,6 +893,28 @@ void unregister_mods(uint8_t mods) { } } +/** \brief Adds the given weak modifiers and sends a keyboard report immediately. + * + * \param mods A bitfield of modifiers to register. + */ +void register_weak_mods(uint8_t mods) { + if (mods) { + add_weak_mods(mods); + send_keyboard_report(); + } +} + +/** \brief Removes the given weak modifiers and sends a keyboard report immediately. + * + * \param mods A bitfield of modifiers to unregister. + */ +void unregister_weak_mods(uint8_t mods) { + if (mods) { + del_weak_mods(mods); + send_keyboard_report(); + } +} + /** \brief Utilities for actions. (FIXME: Needs better description) * * FIXME: Needs documentation. diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 633cedb06b..15f4ce15c0 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -90,6 +90,8 @@ void unregister_code(uint8_t code); void tap_code(uint8_t code); void register_mods(uint8_t mods); void unregister_mods(uint8_t mods); +void register_weak_mods(uint8_t mods); +void unregister_weak_mods(uint8_t mods); // void set_mods(uint8_t mods); void clear_keyboard(void); void clear_keyboard_but_mods(void); diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c index 574000fcd8..c59c196880 100644 --- a/tmk_core/common/avr/suspend.c +++ b/tmk_core/common/avr/suspend.c @@ -4,7 +4,6 @@ #include <avr/interrupt.h> #include "matrix.h" #include "action.h" -#include "backlight.h" #include "suspend_avr.h" #include "suspend.h" #include "timer.h" @@ -16,6 +15,10 @@ # include "lufa.h" #endif +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + #ifdef AUDIO_ENABLE # include "audio.h" #endif /* AUDIO_ENABLE */ diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c deleted file mode 100644 index 708022f68f..0000000000 --- a/tmk_core/common/backlight.c +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2013 Mathias Andersson <wraul@dbox.se> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include "backlight.h" -#include "eeconfig.h" -#include "debug.h" - -backlight_config_t backlight_config; - -/** \brief Backlight initialization - * - * FIXME: needs doc - */ -void backlight_init(void) { - /* check signature */ - if (!eeconfig_is_enabled()) { - eeconfig_init(); - } - backlight_config.raw = eeconfig_read_backlight(); - if (backlight_config.level > BACKLIGHT_LEVELS) { - backlight_config.level = BACKLIGHT_LEVELS; - } - backlight_set(backlight_config.enable ? backlight_config.level : 0); -} - -/** \brief Backlight increase - * - * FIXME: needs doc - */ -void backlight_increase(void) { - if (backlight_config.level < BACKLIGHT_LEVELS) { - backlight_config.level++; - } - backlight_config.enable = 1; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight increase: %u\n", backlight_config.level); - backlight_set(backlight_config.level); -} - -/** \brief Backlight decrease - * - * FIXME: needs doc - */ -void backlight_decrease(void) { - if (backlight_config.level > 0) { - backlight_config.level--; - backlight_config.enable = !!backlight_config.level; - eeconfig_update_backlight(backlight_config.raw); - } - dprintf("backlight decrease: %u\n", backlight_config.level); - backlight_set(backlight_config.level); -} - -/** \brief Backlight toggle - * - * FIXME: needs doc - */ -void backlight_toggle(void) { - bool enabled = backlight_config.enable; - dprintf("backlight toggle: %u\n", enabled); - if (enabled) - backlight_disable(); - else - backlight_enable(); -} - -/** \brief Enable backlight - * - * FIXME: needs doc - */ -void backlight_enable(void) { - if (backlight_config.enable) return; // do nothing if backlight is already on - - backlight_config.enable = true; - if (backlight_config.raw == 1) // enabled but level == 0 - backlight_config.level = 1; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight enable\n"); - backlight_set(backlight_config.level); -} - -/** \brief Disable backlight - * - * FIXME: needs doc - */ -void backlight_disable(void) { - if (!backlight_config.enable) return; // do nothing if backlight is already off - - backlight_config.enable = false; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight disable\n"); - backlight_set(0); -} - -/** /brief Get the backlight status - * - * FIXME: needs doc - */ -bool is_backlight_enabled(void) { return backlight_config.enable; } - -/** \brief Backlight step through levels - * - * FIXME: needs doc - */ -void backlight_step(void) { - backlight_config.level++; - if (backlight_config.level > BACKLIGHT_LEVELS) { - backlight_config.level = 0; - } - backlight_config.enable = !!backlight_config.level; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight step: %u\n", backlight_config.level); - backlight_set(backlight_config.level); -} - -/** \brief Backlight set level - * - * FIXME: needs doc - */ -void backlight_level(uint8_t level) { - if (level > BACKLIGHT_LEVELS) level = BACKLIGHT_LEVELS; - backlight_config.level = level; - backlight_config.enable = !!backlight_config.level; - eeconfig_update_backlight(backlight_config.raw); - backlight_set(backlight_config.level); -} - -/** \brief Get backlight level - * - * FIXME: needs doc - */ -uint8_t get_backlight_level(void) { return backlight_config.level; } - -#ifdef BACKLIGHT_BREATHING -/** \brief Backlight breathing toggle - * - * FIXME: needs doc - */ -void backlight_toggle_breathing(void) { - bool breathing = backlight_config.breathing; - dprintf("backlight breathing toggle: %u\n", breathing); - if (breathing) - backlight_disable_breathing(); - else - backlight_enable_breathing(); -} - -/** \brief Enable backlight breathing - * - * FIXME: needs doc - */ -void backlight_enable_breathing(void) { - if (backlight_config.breathing) return; // do nothing if breathing is already on - - backlight_config.breathing = true; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight breathing enable\n"); - breathing_enable(); -} - -/** \brief Disable backlight breathing - * - * FIXME: needs doc - */ -void backlight_disable_breathing(void) { - if (!backlight_config.breathing) return; // do nothing if breathing is already off - - backlight_config.breathing = false; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight breathing disable\n"); - breathing_disable(); -} - -/** \brief Get the backlight breathing status - * - * FIXME: needs doc - */ -bool is_backlight_breathing(void) { return backlight_config.breathing; } -#endif diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h deleted file mode 100644 index bb1f897ee8..0000000000 --- a/tmk_core/common/backlight.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2013 Mathias Andersson <wraul@dbox.se> - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#pragma once - -#include <stdint.h> -#include <stdbool.h> - -#ifndef BACKLIGHT_LEVELS -# define BACKLIGHT_LEVELS 3 -#elif BACKLIGHT_LEVELS > 31 -# error "Maximum value of BACKLIGHT_LEVELS is 31" -#endif - -typedef union { - uint8_t raw; - struct { - bool enable : 1; - bool breathing : 1; - uint8_t reserved : 1; // Reserved for possible future backlight modes - uint8_t level : 5; - }; -} backlight_config_t; - -void backlight_init(void); -void backlight_increase(void); -void backlight_decrease(void); -void backlight_toggle(void); -void backlight_enable(void); -void backlight_disable(void); -bool is_backlight_enabled(void); -void backlight_step(void); -void backlight_set(uint8_t level); -void backlight_level(uint8_t level); -uint8_t get_backlight_level(void); - -#ifdef BACKLIGHT_BREATHING -void backlight_toggle_breathing(void); -void backlight_enable_breathing(void); -void backlight_disable_breathing(void); -bool is_backlight_breathing(void); -void breathing_enable(void); -void breathing_disable(void); -#endif diff --git a/tmk_core/common/chibios/printf.c b/tmk_core/common/chibios/printf.c index dbd059448c..dcf33f35f8 100644 --- a/tmk_core/common/chibios/printf.c +++ b/tmk_core/common/chibios/printf.c @@ -186,6 +186,15 @@ void tfp_format(void* putp, putcf putf, char* fmt, va_list va) { case 's': putchw(putp, putf, w, 0, va_arg(va, char*)); break; + case 'b': +#ifdef PRINTF_LONG_SUPPORT + if (lng) + uli2a(va_arg(va, unsigned long int), 2, 0, bf); + else +#endif + ui2a(va_arg(va, unsigned int), 2, 0, bf); + putchw(putp, putf, w, lz, bf); + break; case '%': putf(putp, ch); default: diff --git a/tmk_core/common/chibios/suspend.c b/tmk_core/common/chibios/suspend.c index ae1c6f53e2..c0f9c28d44 100644 --- a/tmk_core/common/chibios/suspend.c +++ b/tmk_core/common/chibios/suspend.c @@ -8,10 +8,13 @@ #include "action_util.h" #include "mousekey.h" #include "host.h" -#include "backlight.h" #include "suspend.h" #include "wait.h" +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + /** \brief suspend idle * * FIXME: needs doc diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c index 8bf72ef258..82cd806091 100644 --- a/tmk_core/common/command.c +++ b/tmk_core/common/command.c @@ -32,10 +32,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "sleep_led.h" #include "led.h" #include "command.h" -#include "backlight.h" #include "quantum.h" #include "version.h" +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif + #ifdef MOUSEKEY_ENABLE # include "mousekey.h" #endif diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 060b45f1bc..8746b2c124 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -29,8 +29,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "util.h" #include "sendchar.h" #include "eeconfig.h" -#include "backlight.h" #include "action_layer.h" +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" +#endif #ifdef BOOTMAGIC_ENABLE # include "bootmagic.h" #else @@ -82,6 +84,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. # include "velocikey.h" #endif +// Only enable this if console is enabled to print to +#if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE) +static uint32_t matrix_timer = 0; +static uint32_t matrix_scan_count = 0; + +void matrix_scan_perf_task(void) { + matrix_scan_count++; + + uint32_t timer_now = timer_read32(); + if (TIMER_DIFF_32(timer_now, matrix_timer) > 1000) { + dprintf("matrix scan frequency: %d\n", matrix_scan_count); + + matrix_timer = timer_now; + matrix_scan_count = 0; + } +} +#else +# define matrix_scan_perf_task() +#endif + #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata) { @@ -296,6 +318,10 @@ void keyboard_task(void) { MATRIX_LOOP_END: +#ifdef DEBUG_MATRIX_SCAN_RATE + matrix_scan_perf_task(); +#endif + #ifdef QWIIC_ENABLE qwiic_task(); #endif diff --git a/tmk_core/common/timer.h b/tmk_core/common/timer.h index 853cb98396..378cf7892c 100644 --- a/tmk_core/common/timer.h +++ b/tmk_core/common/timer.h @@ -45,9 +45,9 @@ uint16_t timer_elapsed(uint16_t last); uint32_t timer_elapsed32(uint32_t last); // Utility functions to check if a future time has expired & autmatically handle time wrapping if checked / reset frequently (half of max value) -inline bool timer_expired(uint16_t current, uint16_t last) { return current - last < 0x8000; } +inline bool timer_expired(uint16_t current, uint16_t future) { return (uint16_t)(current - future) < 0x8000; } -inline bool timer_expired32(uint32_t current, uint32_t future) { return current - future < 0x80000000; } +inline bool timer_expired32(uint32_t current, uint32_t future) { return (uint32_t)(current - future) < 0x80000000; } #ifdef __cplusplus } diff --git a/tmk_core/common/util.h b/tmk_core/common/util.h index 5706b047d0..68642e7fd3 100644 --- a/tmk_core/common/util.h +++ b/tmk_core/common/util.h @@ -27,6 +27,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define STR(s) XSTR(s) #define XSTR(s) #s +#ifdef __cplusplus +extern "C" { +#endif + uint8_t bitpop(uint8_t bits); uint8_t bitpop16(uint16_t bits); uint8_t bitpop32(uint32_t bits); @@ -39,4 +43,8 @@ uint8_t bitrev(uint8_t bits); uint16_t bitrev16(uint16_t bits); uint32_t bitrev32(uint32_t bits); +#ifdef __cplusplus +} +#endif + #endif diff --git a/tmk_core/common/webusb.c b/tmk_core/common/webusb.c new file mode 100644 index 0000000000..2488e75de7 --- /dev/null +++ b/tmk_core/common/webusb.c @@ -0,0 +1,72 @@ +#include QMK_KEYBOARD_H +#include <string.h> +#include "webusb.h" +#include "wait.h" +webusb_state_t webusb_state = { + .paired = false, + .pairing = false, +}; + +void webusb_receive(uint8_t *data, uint8_t length) { + uint8_t command = data[0]; + + if(command == WEBUSB_CMD_PAIR && webusb_state.pairing == true) { + uint8_t event[3]; + webusb_state.pairing = false; + webusb_state.paired = true; + event[0] = WEBUSB_STATUS_OK; + event[1] = WEBUSB_EVT_PAIRED; + event[2] = WEBUSB_STOP_BIT; + webusb_send(event, sizeof(event)); + return; + } + + if(command == WEBUSB_GET_FW_VERSION) { + // Landing page + packet headers(2) + stop bit(1) + uint8_t lp_size = sizeof(FIRMWARE_VERSION) + 3; + uint8_t url[lp_size]; + + uint8_t event[2]; + event[0] = WEBUSB_STATUS_OK; + event[1] = WEBUSB_EVT_FW_VERSION; + + uint8_t stop[1]; + stop[0] = WEBUSB_STOP_BIT; + + memcpy(url, event, 2); + memcpy(url + 2, FIRMWARE_VERSION, sizeof(FIRMWARE_VERSION)); + memcpy(url + 2 + sizeof(FIRMWARE_VERSION), stop, 1); + webusb_send(url, lp_size); + return; + } + + if(webusb_state.paired == true) { + switch(command) { + //Handle commands in here + case WEBUSB_GET_LAYER: + webusb_layer_event(); + break; + default: + break; + } + } else { + webusb_error(WEBUSB_STATUS_NOT_PAIRED); + } +}; + +void webusb_layer_event() { + uint8_t layer; + uint8_t event[4]; + layer = biton32(layer_state); + event[0] = WEBUSB_STATUS_OK; + event[1] = WEBUSB_EVT_LAYER; + event[2] = layer; + event[3] = WEBUSB_STOP_BIT; + webusb_send(event, sizeof(event)); +} + +void webusb_error(uint8_t code) { + uint8_t buffer[1]; + buffer[0] = code; + webusb_send(buffer, 1); +} diff --git a/tmk_core/common/webusb.h b/tmk_core/common/webusb.h new file mode 100644 index 0000000000..18e884f1ab --- /dev/null +++ b/tmk_core/common/webusb.h @@ -0,0 +1,44 @@ +#pragma once + +#include <stdint.h> +#include <stdbool.h> + +#ifndef FIRMWARE_VERSION +#define FIRMWARE_VERSION u8"default" +#endif +#define WEBUSB_STOP_BIT -2 +#define WEBUSB_BLINK_STEPS 512 +#define WEBUSB_BLINK_END WEBUSB_BLINK_STEPS * 60 + +void webusb_receive(uint8_t *data, uint8_t length); +void webusb_send(uint8_t *data, uint8_t length); +void webusb_layer_event(void); +void webusb_error(uint8_t); +void webusb_set_pairing_state(void); + +typedef struct{ + bool paired; + bool pairing; +} webusb_state_t; + +extern webusb_state_t webusb_state; + +enum Webusb_Status_Code { + WEBUSB_STATUS_NOT_PAIRED = -1, + WEBUSB_STATUS_OK, + WEBUSB_STATUS_UNKNOWN_COMMAND, +}; + +enum Webusb_Command_Code { + WEBUSB_CMD_PAIR, + WEBUSB_GET_FW_VERSION, + WEBUSB_GET_LAYER +}; + +enum Webusb_Event_Code { + WEBUSB_EVT_PAIRED, + WEBUSB_EVT_KEYDOWN, + WEBUSB_EVT_KEYUP, + WEBUSB_EVT_LAYER, + WEBUSB_EVT_FW_VERSION +}; |