diff options
| author | Selene ToyKeeper | 2023-04-19 00:48:20 -0600 |
|---|---|---|
| committer | Selene ToyKeeper | 2023-04-19 00:48:20 -0600 |
| commit | d64358060b99ebb5b6703a89034d885f1e3f1122 (patch) | |
| tree | c59ee46e2803473fc30f737f6d3358fcebe2744a /hw | |
| parent | made "Ramp 3H" do momentary turbo if current channel mode has no args (diff) | |
| download | anduril-d64358060b99ebb5b6703a89034d885f1e3f1122.tar.gz anduril-d64358060b99ebb5b6703a89034d885f1e3f1122.tar.bz2 anduril-d64358060b99ebb5b6703a89034d885f1e3f1122.zip | |
LT1S Pro: added white-only auto-tint mode, at gchart's request
Diffstat (limited to '')
| -rw-r--r-- | hwdef-Sofirn_LT1S-Pro.c | 58 | ||||
| -rw-r--r-- | hwdef-Sofirn_LT1S-Pro.h | 29 |
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(); |
