aboutsummaryrefslogtreecommitdiff
path: root/quantum
diff options
context:
space:
mode:
Diffstat (limited to 'quantum')
-rw-r--r--quantum/basic_profiling.h2
-rw-r--r--quantum/color.c11
-rw-r--r--quantum/color.h24
-rw-r--r--quantum/keycodes.h40
-rw-r--r--quantum/led_matrix/led_matrix.c17
-rw-r--r--quantum/led_matrix/led_matrix.h2
-rw-r--r--quantum/logging/debug.h5
-rw-r--r--quantum/os_detection.c54
-rw-r--r--quantum/painter/qp.h6
-rw-r--r--quantum/painter/qp_internal.c1
-rw-r--r--quantum/painter/rules.mk27
-rw-r--r--quantum/pointing_device/pointing_device.c30
-rw-r--r--quantum/pointing_device/pointing_device.h14
-rw-r--r--quantum/pointing_device/pointing_device_drivers.c10
-rw-r--r--quantum/process_keycode/process_combo.c46
-rw-r--r--quantum/process_keycode/process_connection.c36
-rw-r--r--quantum/process_keycode/process_connection.h9
-rw-r--r--quantum/quantum.c29
-rw-r--r--quantum/quantum.h1
-rw-r--r--quantum/quantum_keycodes_legacy.h2
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c17
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h2
-rw-r--r--quantum/rgb_matrix/rgb_matrix_drivers.c58
-rw-r--r--quantum/rgblight/rgblight.c152
-rw-r--r--quantum/rgblight/rgblight.h1
-rw-r--r--quantum/rgblight/rgblight_drivers.c20
-rw-r--r--quantum/rgblight/rgblight_drivers.h5
27 files changed, 315 insertions, 306 deletions
diff --git a/quantum/basic_profiling.h b/quantum/basic_profiling.h
index d371acd6f0..e0a88d49cf 100644
--- a/quantum/basic_profiling.h
+++ b/quantum/basic_profiling.h
@@ -25,8 +25,6 @@
# define TIMESTAMP_GETTER TCNT0
#elif defined(PROTOCOL_CHIBIOS)
# define TIMESTAMP_GETTER chSysGetRealtimeCounterX()
-#elif defined(PROTOCOL_ARM_ATSAM)
-# error arm_atsam not currently supported
#else
# error Unknown protocol in use
#endif
diff --git a/quantum/color.c b/quantum/color.c
index 96d548a33c..5f264cb76f 100644
--- a/quantum/color.c
+++ b/quantum/color.c
@@ -108,14 +108,3 @@ RGB hsv_to_rgb(HSV hsv) {
RGB hsv_to_rgb_nocie(HSV hsv) {
return hsv_to_rgb_impl(hsv, false);
}
-
-#ifdef WS2812_RGBW
-void convert_rgb_to_rgbw(rgb_led_t *led) {
- // Determine lowest value in all three colors, put that into
- // the white channel and then shift all colors by that amount
- led->w = MIN(led->r, MIN(led->g, led->b));
- led->r -= led->w;
- led->g -= led->w;
- led->b -= led->w;
-}
-#endif
diff --git a/quantum/color.h b/quantum/color.h
index b6a9dd0641..81a2c1e7ba 100644
--- a/quantum/color.h
+++ b/quantum/color.h
@@ -74,31 +74,10 @@
// clang-format on
-#define WS2812_BYTE_ORDER_RGB 0
-#define WS2812_BYTE_ORDER_GRB 1
-#define WS2812_BYTE_ORDER_BGR 2
-
-#ifndef WS2812_BYTE_ORDER
-# define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_GRB
-#endif
-
typedef struct PACKED rgb_led_t {
-#if (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_GRB)
- uint8_t g;
- uint8_t r;
- uint8_t b;
-#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_RGB)
uint8_t r;
uint8_t g;
uint8_t b;
-#elif (WS2812_BYTE_ORDER == WS2812_BYTE_ORDER_BGR)
- uint8_t b;
- uint8_t g;
- uint8_t r;
-#endif
-#ifdef WS2812_RGBW
- uint8_t w;
-#endif
} rgb_led_t;
typedef rgb_led_t RGB;
@@ -111,6 +90,3 @@ typedef struct PACKED HSV {
RGB hsv_to_rgb(HSV hsv);
RGB hsv_to_rgb_nocie(HSV hsv);
-#ifdef WS2812_RGBW
-void convert_rgb_to_rgbw(rgb_led_t *led);
-#endif
diff --git a/quantum/keycodes.h b/quantum/keycodes.h
index f461e4a586..38127bb6da 100644
--- a/quantum/keycodes.h
+++ b/quantum/keycodes.h
@@ -72,6 +72,8 @@ enum qk_keycode_ranges {
QK_STENO_MAX = 0x74FF,
QK_MACRO = 0x7700,
QK_MACRO_MAX = 0x777F,
+ QK_CONNECTION = 0x7780,
+ QK_CONNECTION_MAX = 0x77BF,
QK_LIGHTING = 0x7800,
QK_LIGHTING_MAX = 0x78FF,
QK_QUANTUM = 0x7C00,
@@ -620,6 +622,20 @@ enum qk_keycode_defines {
QK_MACRO_29 = 0x771D,
QK_MACRO_30 = 0x771E,
QK_MACRO_31 = 0x771F,
+ QK_OUTPUT_NEXT = 0x7780,
+ QK_OUTPUT_PREV = 0x7781,
+ QK_OUTPUT_NONE = 0x7782,
+ QK_OUTPUT_USB = 0x7783,
+ QK_OUTPUT_2P4GHZ = 0x7784,
+ QK_OUTPUT_BLUETOOTH = 0x7785,
+ QK_BLUETOOTH_PROFILE_NEXT = 0x7790,
+ QK_BLUETOOTH_PROFILE_PREV = 0x7791,
+ QK_BLUETOOTH_UNPAIR = 0x7792,
+ QK_BLUETOOTH_PROFILE1 = 0x7793,
+ QK_BLUETOOTH_PROFILE2 = 0x7794,
+ QK_BLUETOOTH_PROFILE3 = 0x7795,
+ QK_BLUETOOTH_PROFILE4 = 0x7796,
+ QK_BLUETOOTH_PROFILE5 = 0x7797,
QK_BACKLIGHT_ON = 0x7800,
QK_BACKLIGHT_OFF = 0x7801,
QK_BACKLIGHT_TOGGLE = 0x7802,
@@ -690,9 +706,6 @@ enum qk_keycode_defines {
QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN = 0x7C1C,
QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE = 0x7C1D,
QK_SPACE_CADET_RIGHT_SHIFT_ENTER = 0x7C1E,
- QK_OUTPUT_AUTO = 0x7C20,
- QK_OUTPUT_USB = 0x7C21,
- QK_OUTPUT_BLUETOOTH = 0x7C22,
QK_UNICODE_MODE_NEXT = 0x7C30,
QK_UNICODE_MODE_PREVIOUS = 0x7C31,
QK_UNICODE_MODE_MACOS = 0x7C32,
@@ -1296,6 +1309,21 @@ enum qk_keycode_defines {
MC_29 = QK_MACRO_29,
MC_30 = QK_MACRO_30,
MC_31 = QK_MACRO_31,
+ OU_NEXT = QK_OUTPUT_NEXT,
+ OU_AUTO = QK_OUTPUT_NEXT,
+ OU_PREV = QK_OUTPUT_PREV,
+ OU_NONE = QK_OUTPUT_NONE,
+ OU_USB = QK_OUTPUT_USB,
+ OU_2P4G = QK_OUTPUT_2P4GHZ,
+ OU_BT = QK_OUTPUT_BLUETOOTH,
+ BT_NEXT = QK_BLUETOOTH_PROFILE_NEXT,
+ BT_PREV = QK_BLUETOOTH_PROFILE_PREV,
+ BT_UNPR = QK_BLUETOOTH_UNPAIR,
+ BT_PRF1 = QK_BLUETOOTH_PROFILE1,
+ BT_PRF2 = QK_BLUETOOTH_PROFILE2,
+ BT_PRF3 = QK_BLUETOOTH_PROFILE3,
+ BT_PRF4 = QK_BLUETOOTH_PROFILE4,
+ BT_PRF5 = QK_BLUETOOTH_PROFILE5,
BL_ON = QK_BACKLIGHT_ON,
BL_OFF = QK_BACKLIGHT_OFF,
BL_TOGG = QK_BACKLIGHT_TOGGLE,
@@ -1365,9 +1393,6 @@ enum qk_keycode_defines {
SC_LAPO = QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN,
SC_RAPC = QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE,
SC_SENT = QK_SPACE_CADET_RIGHT_SHIFT_ENTER,
- OU_AUTO = QK_OUTPUT_AUTO,
- OU_USB = QK_OUTPUT_USB,
- OU_BT = QK_OUTPUT_BLUETOOTH,
UC_NEXT = QK_UNICODE_MODE_NEXT,
UC_PREV = QK_UNICODE_MODE_PREVIOUS,
UC_MAC = QK_UNICODE_MODE_MACOS,
@@ -1444,6 +1469,7 @@ enum qk_keycode_defines {
#define IS_QK_AUDIO(code) ((code) >= QK_AUDIO && (code) <= QK_AUDIO_MAX)
#define IS_QK_STENO(code) ((code) >= QK_STENO && (code) <= QK_STENO_MAX)
#define IS_QK_MACRO(code) ((code) >= QK_MACRO && (code) <= QK_MACRO_MAX)
+#define IS_QK_CONNECTION(code) ((code) >= QK_CONNECTION && (code) <= QK_CONNECTION_MAX)
#define IS_QK_LIGHTING(code) ((code) >= QK_LIGHTING && (code) <= QK_LIGHTING_MAX)
#define IS_QK_QUANTUM(code) ((code) >= QK_QUANTUM && (code) <= QK_QUANTUM_MAX)
#define IS_QK_KB(code) ((code) >= QK_KB && (code) <= QK_KB_MAX)
@@ -1468,6 +1494,7 @@ enum qk_keycode_defines {
#define IS_AUDIO_KEYCODE(code) ((code) >= QK_AUDIO_ON && (code) <= QK_AUDIO_VOICE_PREVIOUS)
#define IS_STENO_KEYCODE(code) ((code) >= QK_STENO_BOLT && (code) <= QK_STENO_COMB_MAX)
#define IS_MACRO_KEYCODE(code) ((code) >= QK_MACRO_0 && (code) <= QK_MACRO_31)
+#define IS_CONNECTION_KEYCODE(code) ((code) >= QK_OUTPUT_NEXT && (code) <= QK_BLUETOOTH_PROFILE5)
#define IS_BACKLIGHT_KEYCODE(code) ((code) >= QK_BACKLIGHT_ON && (code) <= QK_BACKLIGHT_TOGGLE_BREATHING)
#define IS_LED_MATRIX_KEYCODE(code) ((code) >= QK_LED_MATRIX_ON && (code) <= QK_LED_MATRIX_SPEED_DOWN)
#define IS_UNDERGLOW_KEYCODE(code) ((code) >= QK_UNDERGLOW_TOGGLE && (code) <= QK_UNDERGLOW_SPEED_DOWN)
@@ -1493,6 +1520,7 @@ enum qk_keycode_defines {
#define AUDIO_KEYCODE_RANGE QK_AUDIO_ON ... QK_AUDIO_VOICE_PREVIOUS
#define STENO_KEYCODE_RANGE QK_STENO_BOLT ... QK_STENO_COMB_MAX
#define MACRO_KEYCODE_RANGE QK_MACRO_0 ... QK_MACRO_31
+#define CONNECTION_KEYCODE_RANGE QK_OUTPUT_NEXT ... QK_BLUETOOTH_PROFILE5
#define BACKLIGHT_KEYCODE_RANGE QK_BACKLIGHT_ON ... QK_BACKLIGHT_TOGGLE_BREATHING
#define LED_MATRIX_KEYCODE_RANGE QK_LED_MATRIX_ON ... QK_LED_MATRIX_SPEED_DOWN
#define UNDERGLOW_KEYCODE_RANGE QK_UNDERGLOW_TOGGLE ... QK_UNDERGLOW_SPEED_DOWN
diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c
index 798ab9a120..58263c62e3 100644
--- a/quantum/led_matrix/led_matrix.c
+++ b/quantum/led_matrix/led_matrix.c
@@ -139,11 +139,20 @@ void led_matrix_update_pwm_buffers(void) {
led_matrix_driver.flush();
}
+__attribute__((weak)) int led_matrix_led_index(int index) {
+#if defined(LED_MATRIX_SPLIT)
+ if (!is_keyboard_left() && index >= k_led_matrix_split[0]) {
+ return index - k_led_matrix_split[0];
+ }
+#endif
+ return index;
+}
+
void led_matrix_set_value(int index, uint8_t value) {
#ifdef USE_CIE1931_CURVE
value = pgm_read_byte(&CIE1931_CURVE[value]);
#endif
- led_matrix_driver.set_value(index, value);
+ led_matrix_driver.set_value(led_matrix_led_index(index), value);
}
void led_matrix_set_value_all(uint8_t value) {
@@ -387,7 +396,6 @@ struct led_matrix_limits_t led_matrix_get_limits(uint8_t iter) {
limits.led_min_index = LED_MATRIX_LED_PROCESS_LIMIT * (iter);
limits.led_max_index = limits.led_min_index + LED_MATRIX_LED_PROCESS_LIMIT;
if (limits.led_max_index > LED_MATRIX_LED_COUNT) limits.led_max_index = LED_MATRIX_LED_COUNT;
- uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
if (is_keyboard_left() && (limits.led_max_index > k_led_matrix_split[0])) limits.led_max_index = k_led_matrix_split[0];
if (!(is_keyboard_left()) && (limits.led_min_index < k_led_matrix_split[0])) limits.led_min_index = k_led_matrix_split[0];
# else
@@ -397,9 +405,8 @@ struct led_matrix_limits_t led_matrix_get_limits(uint8_t iter) {
# endif
#else
# if defined(LED_MATRIX_SPLIT)
- limits.led_min_index = 0;
- limits.led_max_index = LED_MATRIX_LED_COUNT;
- const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
+ limits.led_min_index = 0;
+ limits.led_max_index = LED_MATRIX_LED_COUNT;
if (is_keyboard_left() && (limits.led_max_index > k_led_matrix_split[0])) limits.led_max_index = k_led_matrix_split[0];
if (!(is_keyboard_left()) && (limits.led_min_index < k_led_matrix_split[0])) limits.led_min_index = k_led_matrix_split[0];
# else
diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h
index 9a13c3e52b..a3468a2003 100644
--- a/quantum/led_matrix/led_matrix.h
+++ b/quantum/led_matrix/led_matrix.h
@@ -121,6 +121,8 @@ void eeconfig_debug_led_matrix(void);
uint8_t led_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i);
uint8_t led_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i);
+int led_matrix_led_index(int index);
+
void led_matrix_set_value(int index, uint8_t value);
void led_matrix_set_value_all(uint8_t value);
diff --git a/quantum/logging/debug.h b/quantum/logging/debug.h
index d0590474c0..b0d9b9a10e 100644
--- a/quantum/logging/debug.h
+++ b/quantum/logging/debug.h
@@ -17,10 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
-#ifndef PROTOCOL_ARM_ATSAM
-# include <stdio.h>
-#endif
-
+#include <stdio.h>
#include <stdbool.h>
#include "print.h"
diff --git a/quantum/os_detection.c b/quantum/os_detection.c
index 96b026e247..99ffe1927a 100644
--- a/quantum/os_detection.c
+++ b/quantum/os_detection.c
@@ -34,7 +34,7 @@ static uint16_t usb_setups[STORED_USB_SETUPS];
#endif
#ifndef OS_DETECTION_DEBOUNCE
-# define OS_DETECTION_DEBOUNCE 200
+# define OS_DETECTION_DEBOUNCE 250
#endif
// 2s should always be more than enough (otherwise, you may have other issues)
@@ -59,25 +59,40 @@ struct setups_data_t setups_data = {
};
static volatile os_variant_t detected_os = OS_UNSURE;
-static os_variant_t reported_os = OS_UNSURE;
+static volatile os_variant_t reported_os = OS_UNSURE;
// we need to be able to report OS_UNSURE if that is the stable result of the guesses
-static bool first_report = true;
+static volatile bool first_report = true;
// to react on USB state changes
-static volatile enum usb_device_state current_usb_device_state = USB_DEVICE_STATE_INIT;
-static enum usb_device_state reported_usb_device_state = USB_DEVICE_STATE_INIT;
+static volatile enum usb_device_state current_usb_device_state = USB_DEVICE_STATE_NO_INIT;
+static volatile enum usb_device_state maxprev_usb_device_state = USB_DEVICE_STATE_NO_INIT;
// the OS detection might be unstable for a while, "debounce" it
static volatile bool debouncing = false;
-static volatile fast_timer_t last_time;
+static volatile fast_timer_t last_time = 0;
void os_detection_task(void) {
+#ifdef OS_DETECTION_KEYBOARD_RESET
+ // resetting the keyboard on the USB device state change callback results in instability, so delegate that to this task
+ // only take action if it's been stable at least once, to avoid issues with some KVMs
+ if (current_usb_device_state <= USB_DEVICE_STATE_INIT && maxprev_usb_device_state >= USB_DEVICE_STATE_CONFIGURED) {
+ if (debouncing && timer_elapsed_fast(last_time) >= OS_DETECTION_DEBOUNCE) {
+ soft_reset_keyboard();
+ }
+ return;
+ }
+#endif
+#ifdef OS_DETECTION_SINGLE_REPORT
+ if (!first_report) {
+ return;
+ }
+#endif
if (current_usb_device_state == USB_DEVICE_STATE_CONFIGURED) {
// debouncing goes for both the detected OS as well as the USB state
if (debouncing && timer_elapsed_fast(last_time) >= OS_DETECTION_DEBOUNCE) {
- debouncing = false;
- reported_usb_device_state = current_usb_device_state;
+ debouncing = false;
+ last_time = 0;
if (detected_os != reported_os || first_report) {
first_report = false;
reported_os = detected_os;
@@ -85,13 +100,6 @@ void os_detection_task(void) {
}
}
}
-#ifdef OS_DETECTION_KEYBOARD_RESET
- // resetting the keyboard on the USB device state change callback results in instability, so delegate that to this task
- // only take action if it's been stable at least once, to avoid issues with some KVMs
- else if (current_usb_device_state == USB_DEVICE_STATE_INIT && reported_usb_device_state != USB_DEVICE_STATE_INIT) {
- soft_reset_keyboard();
- }
-#endif
}
__attribute__((weak)) bool process_detected_host_os_kb(os_variant_t detected_os) {
@@ -155,16 +163,20 @@ os_variant_t detected_host_os(void) {
void erase_wlength_data(void) {
memset(&setups_data, 0, sizeof(setups_data));
- detected_os = OS_UNSURE;
- reported_os = OS_UNSURE;
- current_usb_device_state = USB_DEVICE_STATE_INIT;
- reported_usb_device_state = USB_DEVICE_STATE_INIT;
- debouncing = false;
- first_report = true;
+ detected_os = OS_UNSURE;
+ reported_os = OS_UNSURE;
+ current_usb_device_state = USB_DEVICE_STATE_NO_INIT;
+ maxprev_usb_device_state = USB_DEVICE_STATE_NO_INIT;
+ debouncing = false;
+ last_time = 0;
+ first_report = true;
}
void os_detection_notify_usb_device_state_change(enum usb_device_state usb_device_state) {
// treat this like any other source of instability
+ if (maxprev_usb_device_state < current_usb_device_state) {
+ maxprev_usb_device_state = current_usb_device_state;
+ }
current_usb_device_state = usb_device_state;
last_time = timer_read_fast();
debouncing = true;
diff --git a/quantum/painter/qp.h b/quantum/painter/qp.h
index 820c418f43..3dc77b42cf 100644
--- a/quantum/painter/qp.h
+++ b/quantum/painter/qp.h
@@ -557,6 +557,12 @@ int16_t qp_drawtext_recolor(painter_device_t device, uint16_t x, uint16_t y, pai
# define SH1106_NUM_DEVICES 0
#endif // QUANTUM_PAINTER_SH1106_ENABLE
+#ifdef QUANTUM_PAINTER_LD7032_ENABLE
+# include "qp_ld7032.h"
+#else // QUANTUM_PAINTER_LD7032_ENABLE
+# define LD7032_NUM_DEVICES 0
+#endif // QUANTUM_PAINTER_LD7032_ENABLE
+
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Quantum Painter Extras
diff --git a/quantum/painter/qp_internal.c b/quantum/painter/qp_internal.c
index 7d4a6430af..5097edfa07 100644
--- a/quantum/painter/qp_internal.c
+++ b/quantum/painter/qp_internal.c
@@ -19,6 +19,7 @@ enum {
+ (GC9107_NUM_DEVICES) // GC9107
+ (SSD1351_NUM_DEVICES) // SSD1351
+ (SH1106_NUM_DEVICES) // SH1106
+ + (LD7032_NUM_DEVICES) // LD7032
};
static painter_device_t qp_devices[QP_NUM_DEVICES] = {NULL};
diff --git a/quantum/painter/rules.mk b/quantum/painter/rules.mk
index 7b2ab702ee..b773dd091c 100644
--- a/quantum/painter/rules.mk
+++ b/quantum/painter/rules.mk
@@ -17,7 +17,9 @@ VALID_QUANTUM_PAINTER_DRIVERS := \
gc9107_spi \
ssd1351_spi \
sh1106_i2c \
- sh1106_spi
+ sh1106_spi \
+ ld7032_i2c \
+ ld7032_spi
#-------------------------------------------------------------------------------
@@ -182,6 +184,29 @@ define handle_quantum_painter_driver
$(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \
$(DRIVER_PATH)/painter/sh1106/qp_sh1106.c
+ else ifeq ($$(strip $$(CURRENT_PAINTER_DRIVER)),ld7032_spi)
+ QUANTUM_PAINTER_NEEDS_SURFACE := yes
+ QUANTUM_PAINTER_NEEDS_COMMS_SPI := yes
+ QUANTUM_PAINTER_NEEDS_COMMS_SPI_DC_RESET := yes
+ OPT_DEFS += -DQUANTUM_PAINTER_LD7032_ENABLE -DQUANTUM_PAINTER_LD7032_SPI_ENABLE
+ COMMON_VPATH += \
+ $(DRIVER_PATH)/painter/oled_panel \
+ $(DRIVER_PATH)/painter/ld7032
+ SRC += \
+ $(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \
+ $(DRIVER_PATH)/painter/ld7032/qp_ld7032.c
+
+ else ifeq ($$(strip $$(CURRENT_PAINTER_DRIVER)),ld7032_i2c)
+ QUANTUM_PAINTER_NEEDS_SURFACE := yes
+ QUANTUM_PAINTER_NEEDS_COMMS_I2C := yes
+ OPT_DEFS += -DQUANTUM_PAINTER_LD7032_ENABLE -DQUANTUM_PAINTER_LD7032_I2C_ENABLE
+ COMMON_VPATH += \
+ $(DRIVER_PATH)/painter/oled_panel \
+ $(DRIVER_PATH)/painter/ld7032
+ SRC += \
+ $(DRIVER_PATH)/painter/oled_panel/qp_oled_panel.c \
+ $(DRIVER_PATH)/painter/ld7032/qp_ld7032.c
+
endif
endef
diff --git a/quantum/pointing_device/pointing_device.c b/quantum/pointing_device/pointing_device.c
index 74ce9108a9..7d3be9e524 100644
--- a/quantum/pointing_device/pointing_device.c
+++ b/quantum/pointing_device/pointing_device.c
@@ -377,28 +377,28 @@ void pointing_device_set_cpi_on_side(bool left, uint16_t cpi) {
}
/**
- * @brief clamps int16_t to int8_t
+ * @brief clamps int16_t to int8_t, or int32_t to int16_t
*
- * @param[in] int16_t value
- * @return int8_t clamped value
+ * @param[in] hv_clamp_range_t value
+ * @return mouse_hv_report_t clamped value
*/
-static inline int8_t pointing_device_hv_clamp(int16_t value) {
- if (value < INT8_MIN) {
- return INT8_MIN;
- } else if (value > INT8_MAX) {
- return INT8_MAX;
+static inline mouse_hv_report_t pointing_device_hv_clamp(hv_clamp_range_t value) {
+ if (value < HV_REPORT_MIN) {
+ return HV_REPORT_MIN;
+ } else if (value > HV_REPORT_MAX) {
+ return HV_REPORT_MAX;
} else {
return value;
}
}
/**
- * @brief clamps int16_t to int8_t
+ * @brief clamps int16_t to int8_t, or int32_t to int16_t
*
- * @param[in] clamp_range_t value
+ * @param[in] xy_clamp_range_t value
* @return mouse_xy_report_t clamped value
*/
-static inline mouse_xy_report_t pointing_device_xy_clamp(clamp_range_t value) {
+static inline mouse_xy_report_t pointing_device_xy_clamp(xy_clamp_range_t value) {
if (value < XY_REPORT_MIN) {
return XY_REPORT_MIN;
} else if (value > XY_REPORT_MAX) {
@@ -419,10 +419,10 @@ static inline mouse_xy_report_t pointing_device_xy_clamp(clamp_range_t value) {
* @return combined report_mouse_t of left_report and right_report
*/
report_mouse_t pointing_device_combine_reports(report_mouse_t left_report, report_mouse_t right_report) {
- left_report.x = pointing_device_xy_clamp((clamp_range_t)left_report.x + right_report.x);
- left_report.y = pointing_device_xy_clamp((clamp_range_t)left_report.y + right_report.y);
- left_report.h = pointing_device_hv_clamp((int16_t)left_report.h + right_report.h);
- left_report.v = pointing_device_hv_clamp((int16_t)left_report.v + right_report.v);
+ left_report.x = pointing_device_xy_clamp((xy_clamp_range_t)left_report.x + right_report.x);
+ left_report.y = pointing_device_xy_clamp((xy_clamp_range_t)left_report.y + right_report.y);
+ left_report.h = pointing_device_hv_clamp((hv_clamp_range_t)left_report.h + right_report.h);
+ left_report.v = pointing_device_hv_clamp((hv_clamp_range_t)left_report.v + right_report.v);
left_report.buttons |= right_report.buttons;
return left_report;
}
diff --git a/quantum/pointing_device/pointing_device.h b/quantum/pointing_device/pointing_device.h
index 1cd4b0b5e6..b0f8533d6d 100644
--- a/quantum/pointing_device/pointing_device.h
+++ b/quantum/pointing_device/pointing_device.h
@@ -95,11 +95,21 @@ typedef enum {
#ifdef MOUSE_EXTENDED_REPORT
# define XY_REPORT_MIN INT16_MIN
# define XY_REPORT_MAX INT16_MAX
-typedef int32_t clamp_range_t;
+typedef int32_t xy_clamp_range_t;
#else
# define XY_REPORT_MIN INT8_MIN
# define XY_REPORT_MAX INT8_MAX
-typedef int16_t clamp_range_t;
+typedef int16_t xy_clamp_range_t;
+#endif
+
+#ifdef WHEEL_EXTENDED_REPORT
+# define HV_REPORT_MIN INT16_MIN
+# define HV_REPORT_MAX INT16_MAX
+typedef int32_t hv_clamp_range_t;
+#else
+# define HV_REPORT_MIN INT8_MIN
+# define HV_REPORT_MAX INT8_MAX
+typedef int16_t hv_clamp_range_t;
#endif
void pointing_device_init(void);
diff --git a/quantum/pointing_device/pointing_device_drivers.c b/quantum/pointing_device/pointing_device_drivers.c
index bf131c6eda..6cbe427401 100644
--- a/quantum/pointing_device/pointing_device_drivers.c
+++ b/quantum/pointing_device/pointing_device_drivers.c
@@ -391,7 +391,7 @@ const pointing_device_driver_t pointing_device_driver = {
};
#elif defined(POINTING_DEVICE_DRIVER_pimoroni_trackball)
-mouse_xy_report_t pimoroni_trackball_adapt_values(clamp_range_t* offset) {
+mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t* offset) {
if (*offset > XY_REPORT_MAX) {
*offset -= XY_REPORT_MAX;
return (mouse_xy_report_t)XY_REPORT_MAX;
@@ -406,10 +406,10 @@ mouse_xy_report_t pimoroni_trackball_adapt_values(clamp_range_t* offset) {
}
report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report) {
- static uint16_t debounce = 0;
- static uint8_t error_count = 0;
- pimoroni_data_t pimoroni_data = {0};
- static clamp_range_t x_offset = 0, y_offset = 0;
+ static uint16_t debounce = 0;
+ static uint8_t error_count = 0;
+ pimoroni_data_t pimoroni_data = {0};
+ static xy_clamp_range_t x_offset = 0, y_offset = 0;
if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT) {
i2c_status_t status = read_pimoroni_trackball(&pimoroni_data);
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index b0034d136a..38171c2f54 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -65,12 +65,20 @@ __attribute__((weak)) bool process_combo_key_release(uint16_t combo_index, combo
}
#endif
+#ifdef COMBO_PROCESS_KEY_REPRESS
+__attribute__((weak)) bool process_combo_key_repress(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode) {
+ return false;
+}
+#endif
+
#ifdef COMBO_SHOULD_TRIGGER
__attribute__((weak)) bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
return true;
}
#endif
+typedef enum { COMBO_KEY_NOT_PRESSED, COMBO_KEY_PRESSED, COMBO_KEY_REPRESSED } combo_key_action_t;
+
#ifndef COMBO_NO_TIMER
static uint16_t timer = 0;
#endif
@@ -414,14 +422,14 @@ static bool keys_pressed_in_order(uint16_t combo_index, combo_t *combo, uint16_t
}
#endif
-static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) {
+static combo_key_action_t process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) {
uint8_t key_count = 0;
uint16_t key_index = -1;
_find_key_index_and_count(combo->keys, keycode, &key_index, &key_count);
/* Continue processing if key isn't part of current combo. */
if (-1 == (int16_t)key_index) {
- return false;
+ return COMBO_KEY_NOT_PRESSED;
}
bool key_is_part_of_combo = (!COMBO_DISABLED(combo) && is_combo_enabled()
@@ -449,7 +457,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *
/* Don't buffer this combo if its combo term has passed. */
if (timer && timer_elapsed(timer) > time) {
DISABLE_COMBO(combo);
- return true;
+ return COMBO_KEY_PRESSED;
} else
#endif
{
@@ -485,6 +493,15 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *
}
} // if timer elapsed end
}
+#ifdef COMBO_PROCESS_KEY_REPRESS
+ } else if (record->event.pressed) {
+ if (COMBO_ACTIVE(combo)) {
+ if (process_combo_key_repress(combo_index, combo, key_index, keycode)) {
+ KEY_STATE_DOWN(combo->state, key_index);
+ return COMBO_KEY_REPRESSED;
+ }
+ }
+#endif
} else {
// chord releases
if (!COMBO_ACTIVE(combo) && ALL_COMBO_KEYS_ARE_DOWN(COMBO_STATE(combo), key_count)) {
@@ -531,12 +548,12 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *
KEY_STATE_UP(combo->state, key_index);
}
- return key_is_part_of_combo;
+ return key_is_part_of_combo ? COMBO_KEY_PRESSED : COMBO_KEY_NOT_PRESSED;
}
bool process_combo(uint16_t keycode, keyrecord_t *record) {
- bool is_combo_key = false;
- bool no_combo_keys_pressed = true;
+ uint8_t is_combo_key = COMBO_KEY_NOT_PRESSED;
+ bool no_combo_keys_pressed = true;
if (keycode == QK_COMBO_ON && record->event.pressed) {
combo_enable();
@@ -582,12 +599,17 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
# endif
#endif
- if (key_buffer_size < COMBO_KEY_BUFFER_LENGTH) {
- key_buffer[key_buffer_size++] = (queued_record_t){
- .record = *record,
- .keycode = keycode,
- .combo_index = -1, // this will be set when applying combos
- };
+#ifdef COMBO_PROCESS_KEY_REPRESS
+ if (is_combo_key == COMBO_KEY_PRESSED)
+#endif
+ {
+ if (key_buffer_size < COMBO_KEY_BUFFER_LENGTH) {
+ key_buffer[key_buffer_size++] = (queued_record_t){
+ .record = *record,
+ .keycode = keycode,
+ .combo_index = -1, // this will be set when applying combos
+ };
+ }
}
} else {
if (combo_buffer_read != combo_buffer_write) {
diff --git a/quantum/process_keycode/process_connection.c b/quantum/process_keycode/process_connection.c
new file mode 100644
index 0000000000..b0e230d680
--- /dev/null
+++ b/quantum/process_keycode/process_connection.c
@@ -0,0 +1,36 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "outputselect.h"
+#include "process_connection.h"
+
+bool process_connection(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case QK_OUTPUT_NEXT:
+ set_output(OUTPUT_AUTO); // This should cycle through the outputs going forward. Ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated when it does.
+ return false;
+ case QK_OUTPUT_USB:
+ set_output(OUTPUT_USB);
+ return false;
+ case QK_OUTPUT_BLUETOOTH:
+ set_output(OUTPUT_BLUETOOTH);
+ return false;
+
+ case QK_OUTPUT_PREV:
+ case QK_OUTPUT_NONE:
+ case QK_OUTPUT_2P4GHZ:
+ case QK_BLUETOOTH_PROFILE_NEXT:
+ case QK_BLUETOOTH_PROFILE_PREV:
+ case QK_BLUETOOTH_UNPAIR:
+ case QK_BLUETOOTH_PROFILE1:
+ case QK_BLUETOOTH_PROFILE2:
+ case QK_BLUETOOTH_PROFILE3:
+ case QK_BLUETOOTH_PROFILE4:
+ case QK_BLUETOOTH_PROFILE5:
+ // As-yet unimplemented.
+ // When implementation is done, ensure `docs/keycodes.md`, `docs/features/bluetooth.md` are updated accordingly.
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/quantum/process_keycode/process_connection.h b/quantum/process_keycode/process_connection.h
new file mode 100644
index 0000000000..cc58011bb7
--- /dev/null
+++ b/quantum/process_keycode/process_connection.h
@@ -0,0 +1,9 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "action.h"
+
+bool process_connection(uint16_t keycode, keyrecord_t *record);
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 011f9d73e4..892beee1be 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -21,7 +21,7 @@
#endif
#ifdef BLUETOOTH_ENABLE
-# include "outputselect.h"
+# include "process_connection.h"
#endif
#ifdef GRAVE_ESC_ENABLE
@@ -246,10 +246,9 @@ uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache) {
/* Get keycode, and then process pre tapping functionality */
bool pre_process_record_quantum(keyrecord_t *record) {
- uint16_t keycode = get_record_keycode(record, true);
- return pre_process_record_kb(keycode, record) &&
+ return pre_process_record_kb(get_record_keycode(record, true), record) &&
#ifdef COMBO_ENABLE
- process_combo(keycode, record) &&
+ process_combo(get_record_keycode(record, true), record) &&
#endif
true;
}
@@ -394,6 +393,9 @@ bool process_record_quantum(keyrecord_t *record) {
#ifdef TRI_LAYER_ENABLE
process_tri_layer(keycode, record) &&
#endif
+#ifdef BLUETOOTH_ENABLE
+ process_connection(keycode, record) &&
+#endif
true)) {
return false;
}
@@ -431,17 +433,6 @@ bool process_record_quantum(keyrecord_t *record) {
velocikey_toggle();
return false;
#endif
-#ifdef BLUETOOTH_ENABLE
- case QK_OUTPUT_AUTO:
- set_output(OUTPUT_AUTO);
- return false;
- case QK_OUTPUT_USB:
- set_output(OUTPUT_USB);
- return false;
- case QK_OUTPUT_BLUETOOTH:
- set_output(OUTPUT_BLUETOOTH);
- return false;
-#endif
#ifndef NO_ACTION_ONESHOT
case QK_ONE_SHOT_TOGGLE:
oneshot_toggle();
@@ -486,14 +477,18 @@ bool process_record_quantum(keyrecord_t *record) {
return process_action_kb(record);
}
-void set_single_persistent_default_layer(uint8_t default_layer) {
+void set_single_default_layer(uint8_t default_layer) {
#if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
PLAY_SONG(default_layer_songs[default_layer]);
#endif
- eeconfig_update_default_layer((layer_state_t)1 << default_layer);
default_layer_set((layer_state_t)1 << default_layer);
}
+void set_single_persistent_default_layer(uint8_t default_layer) {
+ eeconfig_update_default_layer((layer_state_t)1 << default_layer);
+ set_single_default_layer(default_layer);
+}
+
//------------------------------------------------------------------------------
// Override these functions in your keymap file to play different tunes on
// different events such as startup and bootloader jump
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 5446ab1ad7..b60d8a86bf 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -240,6 +240,7 @@ extern layer_state_t layer_state;
# include "os_detection.h"
#endif
+void set_single_default_layer(uint8_t default_layer);
void set_single_persistent_default_layer(uint8_t default_layer);
#define IS_LAYER_ON(layer) layer_state_is(layer)
diff --git a/quantum/quantum_keycodes_legacy.h b/quantum/quantum_keycodes_legacy.h
index e1562077e5..21aec90675 100644
--- a/quantum/quantum_keycodes_legacy.h
+++ b/quantum/quantum_keycodes_legacy.h
@@ -55,3 +55,5 @@
#define KC_ACL1 QK_MOUSE_ACCELERATION_1
#define KC_MS_ACCEL2 QK_MOUSE_ACCELERATION_2
#define KC_ACL2 QK_MOUSE_ACCELERATION_2
+
+#define QK_OUTPUT_AUTO OU_AUTO
diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c
index 70175f9d50..47bba278e4 100644
--- a/quantum/rgb_matrix/rgb_matrix.c
+++ b/quantum/rgb_matrix/rgb_matrix.c
@@ -143,8 +143,17 @@ void rgb_matrix_update_pwm_buffers(void) {
rgb_matrix_driver.flush();
}
+__attribute__((weak)) int rgb_matrix_led_index(int index) {
+#if defined(RGB_MATRIX_SPLIT)
+ if (!is_keyboard_left() && index >= k_rgb_matrix_split[0]) {
+ return index - k_rgb_matrix_split[0];
+ }
+#endif
+ return index;
+}
+
void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
- rgb_matrix_driver.set_color(index, red, green, blue);
+ rgb_matrix_driver.set_color(rgb_matrix_led_index(index), red, green, blue);
}
void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) {
@@ -404,7 +413,6 @@ struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter) {
limits.led_min_index = RGB_MATRIX_LED_PROCESS_LIMIT * (iter);
limits.led_max_index = limits.led_min_index + RGB_MATRIX_LED_PROCESS_LIMIT;
if (limits.led_max_index > RGB_MATRIX_LED_COUNT) limits.led_max_index = RGB_MATRIX_LED_COUNT;
- uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
if (is_keyboard_left() && (limits.led_max_index > k_rgb_matrix_split[0])) limits.led_max_index = k_rgb_matrix_split[0];
if (!(is_keyboard_left()) && (limits.led_min_index < k_rgb_matrix_split[0])) limits.led_min_index = k_rgb_matrix_split[0];
# else
@@ -414,9 +422,8 @@ struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter) {
# endif
#else
# if defined(RGB_MATRIX_SPLIT)
- limits.led_min_index = 0;
- limits.led_max_index = RGB_MATRIX_LED_COUNT;
- const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
+ limits.led_min_index = 0;
+ limits.led_max_index = RGB_MATRIX_LED_COUNT;
if (is_keyboard_left() && (limits.led_max_index > k_rgb_matrix_split[0])) limits.led_max_index = k_rgb_matrix_split[0];
if (!(is_keyboard_left()) && (limits.led_min_index < k_rgb_matrix_split[0])) limits.led_min_index = k_rgb_matrix_split[0];
# else
diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h
index ceb3185d1a..a1115a721e 100644
--- a/quantum/rgb_matrix/rgb_matrix.h
+++ b/quantum/rgb_matrix/rgb_matrix.h
@@ -145,6 +145,8 @@ void eeconfig_update_rgb_matrix(void);
uint8_t rgb_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i);
uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i);
+int rgb_matrix_led_index(int index);
+
void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue);
void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
diff --git a/quantum/rgb_matrix/rgb_matrix_drivers.c b/quantum/rgb_matrix/rgb_matrix_drivers.c
index bf5209a9d3..3b45e82cb9 100644
--- a/quantum/rgb_matrix/rgb_matrix_drivers.c
+++ b/quantum/rgb_matrix/rgb_matrix_drivers.c
@@ -146,61 +146,11 @@ const rgb_matrix_driver_t rgb_matrix_driver = {
# pragma message "You need to use a custom driver, or re-implement the WS2812 driver to use a different configuration."
# endif
-// LED color buffer
-rgb_led_t rgb_matrix_ws2812_array[WS2812_LED_COUNT];
-bool ws2812_dirty = false;
-
-static void init(void) {
- ws2812_init();
- ws2812_dirty = false;
-}
-
-static void flush(void) {
- if (ws2812_dirty) {
- ws2812_setleds(rgb_matrix_ws2812_array, WS2812_LED_COUNT);
- ws2812_dirty = false;
- }
-}
-
-// Set an led in the buffer to a color
-static inline void setled(int i, uint8_t r, uint8_t g, uint8_t b) {
-# if defined(RGB_MATRIX_SPLIT)
- const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
- if (!is_keyboard_left()) {
- if (i >= k_rgb_matrix_split[0]) {
- i -= k_rgb_matrix_split[0];
- } else {
- return;
- }
- } else if (i >= k_rgb_matrix_split[0]) {
- return;
- }
-# endif
-
- if (rgb_matrix_ws2812_array[i].r == r && rgb_matrix_ws2812_array[i].g == g && rgb_matrix_ws2812_array[i].b == b) {
- return;
- }
-
- ws2812_dirty = true;
- rgb_matrix_ws2812_array[i].r = r;
- rgb_matrix_ws2812_array[i].g = g;
- rgb_matrix_ws2812_array[i].b = b;
-# ifdef WS2812_RGBW
- convert_rgb_to_rgbw(&rgb_matrix_ws2812_array[i]);
-# endif
-}
-
-static void setled_all(uint8_t r, uint8_t g, uint8_t b) {
- for (int i = 0; i < ARRAY_SIZE(rgb_matrix_ws2812_array); i++) {
- setled(i, r, g, b);
- }
-}
-
const rgb_matrix_driver_t rgb_matrix_driver = {
- .init = init,
- .flush = flush,
- .set_color = setled,
- .set_color_all = setled_all,
+ .init = ws2812_init,
+ .flush = ws2812_flush,
+ .set_color = ws2812_set_color,
+ .set_color_all = ws2812_set_color_all,
};
#endif
diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c
index b0f2dfdc1d..e16fb99c3b 100644
--- a/quantum/rgblight/rgblight.c
+++ b/quantum/rgblight/rgblight.c
@@ -115,11 +115,6 @@ static bool pre_suspend_enabled;
animation_status_t animation_status = {};
#endif
-#ifndef LED_ARRAY
-rgb_led_t led[RGBLIGHT_LED_COUNT];
-# define LED_ARRAY led
-#endif
-
#ifdef RGBLIGHT_LAYERS
rgblight_segment_t const *const *rgblight_layers = NULL;
@@ -145,23 +140,26 @@ __attribute__((weak)) RGB rgblight_hsv_to_rgb(HSV hsv) {
return hsv_to_rgb(hsv);
}
-void setrgb(uint8_t r, uint8_t g, uint8_t b, rgb_led_t *led1) {
- led1->r = r;
- led1->g = g;
- led1->b = b;
-#ifdef WS2812_RGBW
- led1->w = 0;
+uint8_t rgblight_led_index(uint8_t index) {
+#if defined(RGBLIGHT_LED_MAP)
+ return pgm_read_byte(&led_map[index]) - rgblight_ranges.clipping_start_pos;
+#else
+ return index - rgblight_ranges.clipping_start_pos;
#endif
}
-void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1) {
+void setrgb(uint8_t r, uint8_t g, uint8_t b, int index) {
+ rgblight_driver.set_color(rgblight_led_index(index), r, g, b);
+}
+
+void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, int index) {
HSV hsv = {hue, sat, val};
RGB rgb = rgblight_hsv_to_rgb(hsv);
- setrgb(rgb.r, rgb.g, rgb.b, led1);
+ setrgb(rgb.r, rgb.g, rgb.b, index);
}
-void sethsv(uint8_t hue, uint8_t sat, uint8_t val, rgb_led_t *led1) {
- sethsv_raw(hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val, led1);
+void sethsv(uint8_t hue, uint8_t sat, uint8_t val, int index) {
+ sethsv_raw(hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val, index);
}
void rgblight_check_config(void) {
@@ -515,9 +513,8 @@ void rgblight_decrease_speed_noeeprom(void) {
void rgblight_sethsv_noeeprom_old(uint8_t hue, uint8_t sat, uint8_t val) {
if (rgblight_config.enable) {
- rgb_led_t tmp_led;
- sethsv(hue, sat, val, &tmp_led);
- rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b);
+ RGB rgb = hsv_to_rgb((HSV){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val});
+ rgblight_setrgb(rgb.r, rgb.g, rgb.b);
}
}
@@ -531,13 +528,12 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w
rgblight_status.base_mode = mode_base_table[rgblight_config.mode];
if (rgblight_config.mode == RGBLIGHT_MODE_STATIC_LIGHT) {
// same static color
- rgb_led_t tmp_led;
#ifdef RGBLIGHT_LAYERS_RETAIN_VAL
// needed for rgblight_layers_write() to get the new val, since it reads rgblight_config.val
rgblight_config.val = val;
#endif
- sethsv(hue, sat, val, &tmp_led);
- rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b);
+ RGB rgb = hsv_to_rgb((HSV){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val});
+ rgblight_setrgb(rgb.r, rgb.g, rgb.b);
} else {
// all LEDs in same color
if (1 == 0) { // dummy
@@ -575,7 +571,7 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w
_hue = hue - _hue;
}
dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range);
- sethsv(_hue, sat, val, (rgb_led_t *)&led[i + rgblight_ranges.effect_start_pos]);
+ sethsv(_hue, sat, val, i + rgblight_ranges.effect_start_pos);
}
# ifdef RGBLIGHT_LAYERS_RETAIN_VAL
// needed for rgblight_layers_write() to get the new val, since it reads rgblight_config.val
@@ -649,12 +645,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
}
for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
- led[i].r = r;
- led[i].g = g;
- led[i].b = b;
-#ifdef WS2812_RGBW
- led[i].w = 0;
-#endif
+ rgblight_driver.set_color(rgblight_led_index(i), r, g, b);
}
rgblight_set();
}
@@ -664,12 +655,7 @@ void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) {
return;
}
- led[index].r = r;
- led[index].g = g;
- led[index].b = b;
-#ifdef WS2812_RGBW
- led[index].w = 0;
-#endif
+ rgblight_driver.set_color(rgblight_led_index(index), r, g, b);
rgblight_set();
}
@@ -678,9 +664,8 @@ void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index) {
return;
}
- rgb_led_t tmp_led;
- sethsv(hue, sat, val, &tmp_led);
- rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index);
+ RGB rgb = hsv_to_rgb((HSV){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val});
+ rgblight_setrgb_at(rgb.r, rgb.g, rgb.b, index);
}
#if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
@@ -701,12 +686,7 @@ void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8
}
for (uint8_t i = start; i < end; i++) {
- led[i].r = r;
- led[i].g = g;
- led[i].b = b;
-#ifdef WS2812_RGBW
- led[i].w = 0;
-#endif
+ rgblight_driver.set_color(rgblight_led_index(i), r, g, b);
}
rgblight_set();
}
@@ -716,9 +696,8 @@ void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start,
return;
}
- rgb_led_t tmp_led;
- sethsv(hue, sat, val, &tmp_led);
- rgblight_setrgb_range(tmp_led.r, tmp_led.g, tmp_led.b, start, end);
+ RGB rgb = hsv_to_rgb((HSV){hue, sat, val > RGBLIGHT_LIMIT_VAL ? RGBLIGHT_LIMIT_VAL : val});
+ rgblight_setrgb_range(rgb.r, rgb.g, rgb.b, start, end);
}
#ifndef RGBLIGHT_SPLIT
@@ -785,12 +764,12 @@ static void rgblight_layers_write(void) {
break; // No more segments
}
// Write segment.count LEDs
- rgb_led_t *const limit = &led[MIN(segment.index + segment.count, RGBLIGHT_LED_COUNT)];
- for (rgb_led_t *led_ptr = &led[segment.index]; led_ptr < limit; led_ptr++) {
+ int limit = MIN(segment.index + segment.count, RGBLIGHT_LED_COUNT);
+ for (int i = segment.index; i < limit; i++) {
# ifdef RGBLIGHT_LAYERS_RETAIN_VAL
- sethsv(segment.hue, segment.sat, current_val, led_ptr);
+ sethsv(segment.hue, segment.sat, current_val, i);
# else
- sethsv(segment.hue, segment.sat, segment.val, led_ptr);
+ sethsv(segment.hue, segment.sat, segment.val, i);
# endif
}
segment_ptr++;
@@ -897,17 +876,9 @@ void rgblight_wakeup(void) {
#endif
void rgblight_set(void) {
- rgb_led_t *start_led;
- uint8_t num_leds = rgblight_ranges.clipping_num_leds;
-
if (!rgblight_config.enable) {
for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
- led[i].r = 0;
- led[i].g = 0;
- led[i].b = 0;
-#ifdef WS2812_RGBW
- led[i].w = 0;
-#endif
+ rgblight_driver.set_color(rgblight_led_index(i), 0, 0, 0);
}
}
@@ -923,22 +894,7 @@ void rgblight_set(void) {
}
#endif
-#ifdef RGBLIGHT_LED_MAP
- rgb_led_t led0[RGBLIGHT_LED_COUNT];
- for (uint8_t i = 0; i < RGBLIGHT_LED_COUNT; i++) {
- led0[i] = led[pgm_read_byte(&led_map[i])];
- }
- start_led = led0 + rgblight_ranges.clipping_start_pos;
-#else
- start_led = led + rgblight_ranges.clipping_start_pos;
-#endif
-
-#ifdef WS2812_RGBW
- for (uint8_t i = 0; i < num_leds; i++) {
- convert_rgb_to_rgbw(&start_led[i]);
- }
-#endif
- rgblight_driver.setleds(start_led, num_leds);
+ rgblight_driver.flush();
}
#ifdef RGBLIGHT_SPLIT
@@ -1222,7 +1178,7 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) {
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue);
- sethsv(hue, rgblight_config.sat, rgblight_config.val, (rgb_led_t *)&led[i + rgblight_ranges.effect_start_pos]);
+ sethsv(hue, rgblight_config.sat, rgblight_config.val, i + rgblight_ranges.effect_start_pos);
}
rgblight_set();
@@ -1259,13 +1215,8 @@ void rgblight_effect_snake(animation_status_t *anim) {
# endif
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
- rgb_led_t *ledp = led + i + rgblight_ranges.effect_start_pos;
- ledp->r = 0;
- ledp->g = 0;
- ledp->b = 0;
-# ifdef WS2812_RGBW
- ledp->w = 0;
-# endif
+ rgblight_driver.set_color(rgblight_led_index(i + rgblight_ranges.effect_start_pos), 0, 0, 0);
+
for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) {
k = pos + j * increment;
if (k > RGBLIGHT_LED_COUNT) {
@@ -1275,7 +1226,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
k = k + rgblight_ranges.effect_num_leds;
}
if (i == k) {
- sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp);
+ sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), i + rgblight_ranges.effect_start_pos);
}
}
}
@@ -1320,26 +1271,16 @@ void rgblight_effect_knight(animation_status_t *anim) {
# endif
// Set all the LEDs to 0
for (i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
- led[i].r = 0;
- led[i].g = 0;
- led[i].b = 0;
-# ifdef WS2812_RGBW
- led[i].w = 0;
-# endif
+ rgblight_driver.set_color(rgblight_led_index(i), 0, 0, 0);
}
// Determine which LEDs should be lit up
for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) {
cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % rgblight_ranges.effect_num_leds + rgblight_ranges.effect_start_pos;
if (i >= low_bound && i <= high_bound) {
- sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (rgb_led_t *)&led[cur]);
+ sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, cur);
} else {
- led[cur].r = 0;
- led[cur].g = 0;
- led[cur].b = 0;
-# ifdef WS2812_RGBW
- led[cur].w = 0;
-# endif
+ rgblight_driver.set_color(rgblight_led_index(cur), 0, 0, 0);
}
}
rgblight_set();
@@ -1384,7 +1325,7 @@ void rgblight_effect_christmas(animation_status_t *anim) {
for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
uint8_t local_hue = (i / RGBLIGHT_EFFECT_CHRISTMAS_STEP) % 2 ? hue : hue_green - hue;
- sethsv(local_hue, rgblight_config.sat, val, (rgb_led_t *)&led[i + rgblight_ranges.effect_start_pos]);
+ sethsv(local_hue, rgblight_config.sat, val, i + rgblight_ranges.effect_start_pos);
}
rgblight_set();
@@ -1407,9 +1348,8 @@ void rgblight_effect_rgbtest(animation_status_t *anim) {
uint8_t b;
if (maxval == 0) {
- rgb_led_t tmp_led;
- sethsv(0, 255, RGBLIGHT_LIMIT_VAL, &tmp_led);
- maxval = tmp_led.r;
+ RGB rgb = hsv_to_rgb((HSV){0, 255, RGBLIGHT_LIMIT_VAL});
+ maxval = rgb.r;
}
g = r = b = 0;
switch (anim->pos) {
@@ -1431,13 +1371,12 @@ void rgblight_effect_rgbtest(animation_status_t *anim) {
#ifdef RGBLIGHT_EFFECT_ALTERNATING
void rgblight_effect_alternating(animation_status_t *anim) {
for (int i = 0; i < rgblight_ranges.effect_num_leds; i++) {
- rgb_led_t *ledp = led + i + rgblight_ranges.effect_start_pos;
if (i < rgblight_ranges.effect_num_leds / 2 && anim->pos) {
- sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp);
+ sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, i + rgblight_ranges.effect_start_pos);
} else if (i >= rgblight_ranges.effect_num_leds / 2 && !anim->pos) {
- sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp);
+ sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, i + rgblight_ranges.effect_start_pos);
} else {
- sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp);
+ sethsv(rgblight_config.hue, rgblight_config.sat, 0, i + rgblight_ranges.effect_start_pos);
}
}
rgblight_set();
@@ -1504,8 +1443,7 @@ void rgblight_effect_twinkle(animation_status_t *anim) {
// This LED is off, and was NOT selected to start brightening
}
- rgb_led_t *ledp = led + i + rgblight_ranges.effect_start_pos;
- sethsv(c->h, c->s, c->v, ledp);
+ sethsv(c->h, c->s, c->v, i + rgblight_ranges.effect_start_pos);
}
rgblight_set();
diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h
index 0ed67ff6e3..7c23805129 100644
--- a/quantum/rgblight/rgblight.h
+++ b/quantum/rgblight/rgblight.h
@@ -169,7 +169,6 @@ enum RGBLIGHT_EFFECT_MODE {
#include "rgblight_drivers.h"
#include "progmem.h"
#include "eeconfig.h"
-#include "ws2812.h"
#include "color.h"
#ifdef RGBLIGHT_LAYERS
diff --git a/quantum/rgblight/rgblight_drivers.c b/quantum/rgblight/rgblight_drivers.c
index 76e9031aec..ef986ee13c 100644
--- a/quantum/rgblight/rgblight_drivers.c
+++ b/quantum/rgblight/rgblight_drivers.c
@@ -7,24 +7,20 @@
# include "ws2812.h"
const rgblight_driver_t rgblight_driver = {
- .init = ws2812_init,
- .setleds = ws2812_setleds,
+ .init = ws2812_init,
+ .set_color = ws2812_set_color,
+ .set_color_all = ws2812_set_color_all,
+ .flush = ws2812_flush,
};
#elif defined(RGBLIGHT_APA102)
# include "apa102.h"
-// Temporary shim
-static void apa102_setleds(rgb_led_t *ledarray, uint16_t number_of_leds) {
- for (uint16_t i = 0; i < number_of_leds; i++) {
- apa102_set_color(i, ledarray[i].r, ledarray[i].g, ledarray[i].b);
- }
- apa102_flush();
-}
-
const rgblight_driver_t rgblight_driver = {
- .init = apa102_init,
- .setleds = apa102_setleds,
+ .init = apa102_init,
+ .set_color = apa102_set_color,
+ .set_color_all = apa102_set_color_all,
+ .flush = apa102_flush,
};
#endif
diff --git a/quantum/rgblight/rgblight_drivers.h b/quantum/rgblight/rgblight_drivers.h
index af28b918e1..16fb4cebd6 100644
--- a/quantum/rgblight/rgblight_drivers.h
+++ b/quantum/rgblight/rgblight_drivers.h
@@ -4,11 +4,12 @@
#pragma once
#include <stdint.h>
-#include "color.h"
typedef struct {
void (*init)(void);
- void (*setleds)(rgb_led_t *ledarray, uint16_t number_of_leds);
+ void (*set_color)(int index, uint8_t red, uint8_t green, uint8_t blue);
+ void (*set_color_all)(uint8_t red, uint8_t green, uint8_t blue);
+ void (*flush)(void);
} rgblight_driver_t;
extern const rgblight_driver_t rgblight_driver;