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
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.