diff options
Diffstat (limited to '')
| -rw-r--r-- | hwdef-Sofirn_LT1S-Pro.c | 58 | ||||
| -rw-r--r-- | hwdef-Sofirn_LT1S-Pro.h | 29 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/cfg-sofirn-lt1s-pro.h | 14 |
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 |
