summaryrefslogtreecommitdiff
path: root/tmk_core/common
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/common')
-rw-r--r--tmk_core/common/action.c35
-rw-r--r--tmk_core/common/action.h2
-rw-r--r--tmk_core/common/avr/suspend.c5
-rw-r--r--tmk_core/common/backlight.c193
-rw-r--r--tmk_core/common/backlight.h58
-rw-r--r--tmk_core/common/chibios/printf.c9
-rw-r--r--tmk_core/common/chibios/suspend.c5
-rw-r--r--tmk_core/common/command.c5
-rw-r--r--tmk_core/common/keyboard.c28
-rw-r--r--tmk_core/common/timer.h4
-rw-r--r--tmk_core/common/util.h8
-rw-r--r--tmk_core/common/webusb.c72
-rw-r--r--tmk_core/common/webusb.h44
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
+};