aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-04-19 00:48:20 -0600
committerSelene ToyKeeper2023-04-19 00:48:20 -0600
commitd64358060b99ebb5b6703a89034d885f1e3f1122 (patch)
treec59ee46e2803473fc30f737f6d3358fcebe2744a
parentmade "Ramp 3H" do momentary turbo if current channel mode has no args (diff)
downloadanduril-d64358060b99ebb5b6703a89034d885f1e3f1122.tar.gz
anduril-d64358060b99ebb5b6703a89034d885f1e3f1122.tar.bz2
anduril-d64358060b99ebb5b6703a89034d885f1e3f1122.zip
LT1S Pro: added white-only auto-tint mode, at gchart's request
-rw-r--r--hwdef-Sofirn_LT1S-Pro.c58
-rw-r--r--hwdef-Sofirn_LT1S-Pro.h29
-rw-r--r--spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h14
3 files changed, 81 insertions, 20 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();
diff --git a/spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h b/spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h
index 874d8a8..76ddbba 100644
--- a/spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h
+++ b/spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h
@@ -20,8 +20,8 @@
#define INDICATOR_LED_DEFAULT_MODE ((3<<2) + 1)
// channel modes...
-// CM_WHITE, CM_AUTO, CM_RED, CM_WHITE_RED
-#define DEFAULT_CHANNEL_MODE CM_AUTO
+// CM_WHITE, CM_AUTO2, CM_AUTO3, CM_RED, CM_WHITE_RED
+#define DEFAULT_CHANNEL_MODE CM_AUTO3
#define FACTORY_RESET_WARN_CHANNEL CM_RED
#define FACTORY_RESET_SUCCESS_CHANNEL CM_WHITE
@@ -38,7 +38,6 @@
#define TINT_RAMPING_CORRECTION 0
#define RAMP_SIZE 150
-// TODO? 200% power at top of ramp on white blend mode
// use dynamic PWM instead of plain 8-bit
// (so we can get lower lows and a smoother ramp)
// (also, red LEDs use a QX7138 chip which has max PWM speed of 10 kHz,
@@ -52,10 +51,13 @@
//
// This ramp is a bit higher: 0.2 / 3 / 19 / 61 / 152 / 320 / 600 lm
// level_calc.py 4.001 1 150 7135 1 0.2 600 --pwm dyn:78:16383:575:3.333
-#define PWM_LEVELS 1,1,2,4,5,6,7,8,9,10,12,13,14,15,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,33,34,34,35,35,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,37,37,38,38,39,40,40,41,43,44,45,47,48,50,52,54,56,59,62,64,67,69,72,75,78,81,84,87,90,94,97,101,104,108,112,116,120,124,128,133,137,142,147,151,156,161,167,172,177,183,189,194,200,206,213,219,226,232,239,246,253,260,268,275,283,291,299,307,316,324,333,342,351,361,370,380,390,400,410,420,431,442,453,464,476,487,499,511,523,536,549,562,575
+#define PWM1_LEVELS 1,1,2,4,5,6,7,8,9,10,12,13,14,15,17,18,19,21,22,23,24,25,26,27,28,29,30,31,32,33,33,34,34,35,35,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,37,37,38,38,39,40,40,41,43,44,45,47,48,50,52,54,56,59,62,64,67,69,72,75,78,81,84,87,90,94,97,101,104,108,112,116,120,124,128,133,137,142,147,151,156,161,167,172,177,183,189,194,200,206,213,219,226,232,239,246,253,260,268,275,283,291,299,307,316,324,333,342,351,361,370,380,390,400,410,420,431,442,453,464,476,487,499,511,523,536,549,562,575
#define PWM_TOPS 16383,8174,7823,14429,13603,12806,12046,11328,10652,10017,10402,9742,9134,8575,8615,8089,7605,7536,7093,6684,6307,5959,5636,5337,5060,4802,4562,4337,4127,3929,3633,3468,3216,3077,2862,2744,2559,2390,2234,2091,1960,1838,1727,1623,1528,1439,1357,1280,1209,1143,1081,1024,970,919,872,828,787,770,732,716,682,668,654,624,611,613,600,587,587,574,573,571,569,566,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575,575
-// shared table for white and red
-#define PWM1_LEVELS PWM_LEVELS
+// TODO? 200% power at top of ramp on white blend mode
+// 2nd table handles "200% power" turbo
+//#define PWM2_LEVELS ...
+// tops for PWM2
+//#define PWM3_LEVELS ...
#define MAX_1x7135 75
#define MIN_THERM_STEPDOWN 75 // should be above highest dyn_pwm level
#define HALFSPEED_LEVEL 12