aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--hwdef-Sofirn_LT1S-Pro.c58
-rw-r--r--hwdef-Sofirn_LT1S-Pro.h29
2 files changed, 73 insertions, 14 deletions
diff --git a/hwdef-Sofirn_LT1S-Pro.c b/hwdef-Sofirn_LT1S-Pro.c
index 8e2163f..dd93f93 100644
--- a/hwdef-Sofirn_LT1S-Pro.c
+++ b/hwdef-Sofirn_LT1S-Pro.c
@@ -64,8 +64,33 @@ void set_level_white_blend(uint8_t level) {
PWM_DATATYPE warm_PWM, cool_PWM;
PWM_DATATYPE brightness = PWM_GET(pwm1_levels, level);
- PWM_DATATYPE top = PWM_GET(pwm_tops, level);
- uint8_t blend = cfg.channel_mode_args[cfg.channel_mode];
+ PWM_DATATYPE top = PWM_GET(pwm_tops, level);
+ uint8_t blend = cfg.channel_mode_args[cfg.channel_mode];
+
+ calc_2ch_blend(&warm_PWM, &cool_PWM, brightness, top, blend);
+
+ WARM_PWM_LVL = warm_PWM;
+ COOL_PWM_LVL = cool_PWM;
+ PWM_TOP = top;
+ if (! actual_level) PWM_CNT = 0; // reset phase
+}
+
+
+// same as white blend, but tint is calculated from the ramp level
+void set_level_auto_2ch_blend(uint8_t level) {
+ if (level == 0) {
+ WARM_PWM_LVL = 0;
+ COOL_PWM_LVL = 0;
+ PWM_CNT = 0; // reset phase
+ return;
+ }
+
+ level --; // PWM array index = level - 1
+
+ PWM_DATATYPE warm_PWM, cool_PWM;
+ PWM_DATATYPE brightness = PWM_GET(pwm1_levels, level);
+ PWM_DATATYPE top = PWM_GET(pwm_tops, level);
+ uint8_t blend = 255 * (uint16_t)level / RAMP_SIZE;
calc_2ch_blend(&warm_PWM, &cool_PWM, brightness, top, blend);
@@ -170,6 +195,35 @@ void gradual_tick_white_blend() {
}
+// same as white blend, but tint is calculated from the ramp level
+void gradual_tick_auto_2ch_blend() {
+ uint8_t gt = gradual_target;
+ if (gt < actual_level) gt = actual_level - 1;
+ else if (gt > actual_level) gt = actual_level + 1;
+ gt --;
+
+ // figure out what exact PWM levels we're aiming for
+ PWM_DATATYPE warm_PWM, cool_PWM;
+ PWM_DATATYPE brightness = PWM_GET(pwm1_levels, gt);
+ PWM_DATATYPE top = PWM_GET(pwm_tops, gt);
+ uint8_t blend = 255 * (uint16_t)gt / RAMP_SIZE;
+
+ calc_2ch_blend(&warm_PWM, &cool_PWM, brightness, top, blend);
+
+ // move up/down if necessary
+ GRADUAL_ADJUST_SIMPLE(warm_PWM, WARM_PWM_LVL);
+ GRADUAL_ADJUST_SIMPLE(cool_PWM, COOL_PWM_LVL);
+
+ // check for completion
+ if ( (WARM_PWM_LVL == warm_PWM)
+ && (COOL_PWM_LVL == cool_PWM)
+ )
+ {
+ GRADUAL_IS_ACTUAL();
+ }
+}
+
+
void gradual_tick_auto_3ch_blend() {
uint8_t gt = gradual_target;
if (gt < actual_level) gt = actual_level - 1;
diff --git a/hwdef-Sofirn_LT1S-Pro.h b/hwdef-Sofirn_LT1S-Pro.h
index d59e7bc..af0e6f0 100644
--- a/hwdef-Sofirn_LT1S-Pro.h
+++ b/hwdef-Sofirn_LT1S-Pro.h
@@ -20,20 +20,21 @@
// channel modes:
// * 0. warm/cool white blend
-// * 1. auto 3ch blend (red -> warm -> cool by ramp level)
-// * 2. red only
-// * 3. red + white blend
-#define NUM_CHANNEL_MODES 4
-//#define CHANNEL_MODES_ENABLED 1,1,1,1
+// * 1. auto 2ch white blend (warm -> cool by ramp level)
+// * 2. auto 3ch blend (red -> warm -> cool by ramp level)
+// * 3. red only
+// * 4. red + white blend
+#define NUM_CHANNEL_MODES 5
#define CM_WHITE 0
-#define CM_AUTO 1
-#define CM_RED 2
-#define CM_WHITE_RED 3
+#define CM_AUTO2 1
+#define CM_AUTO3 2
+#define CM_RED 3
+#define CM_WHITE_RED 4
-#define CHANNEL_MODES_ENABLED 0b00001111
-#define CHANNEL_HAS_ARGS 0b00001001
-// 128=middle CCT, N/A, N/A, 255=100% red
-#define CHANNEL_MODE_ARGS 128,0,0,255
+#define CHANNEL_MODES_ENABLED 0b00011111
+#define CHANNEL_HAS_ARGS 0b00010001
+// 128=middle CCT, _, _, _, 255=100% red
+#define CHANNEL_MODE_ARGS 128,0,0,0,255
// TODO: blend mode should enable this automatically?
#define USE_CHANNEL_MODES
@@ -41,11 +42,13 @@
#define USE_CHANNEL_MODE_ARGS
// TODO: or maybe if args are defined, the USE_ should be auto-set?
#define SET_LEVEL_MODES set_level_white_blend, \
+ set_level_auto_2ch_blend, \
set_level_auto_3ch_blend, \
set_level_red, \
set_level_red_white_blend
// gradual ticking for thermal regulation
#define GRADUAL_TICK_MODES gradual_tick_white_blend, \
+ gradual_tick_auto_2ch_blend, \
gradual_tick_auto_3ch_blend, \
gradual_tick_red, \
gradual_tick_red_white_blend
@@ -108,11 +111,13 @@
// custom channel modes
void set_level_red(uint8_t level);
void set_level_white_blend(uint8_t level);
+void set_level_auto_2ch_blend(uint8_t level);
void set_level_auto_3ch_blend(uint8_t level);
void set_level_red_white_blend(uint8_t level);
void gradual_tick_red();
void gradual_tick_white_blend();
+void gradual_tick_auto_2ch_blend();
void gradual_tick_auto_3ch_blend();
void gradual_tick_red_white_blend();