aboutsummaryrefslogtreecommitdiff
path: root/hwdef-Sofirn_LT1S-Pro.c
blob: 3c31c96216ee7b248cfd3393af75cf7f42e15abe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// BLF LT1S Pro hwdef functions
// Copyright (C) 2023 Selene ToyKeeper
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once


// "auto tint" channel mode
void set_level_auto_3ch_blend(uint8_t level) {
    BLEND_PWM_DATATYPE vpwm;

    if (level == 0) {
        vpwm  = 0;
    } else {
        level --;  // PWM array index = level - 1
        vpwm  = PWM_GET(blend_pwm_levels, level);
    }

    // tint goes from 0 (red) to 127 (warm white) to 255 (cool white)
    uint8_t mytint;
    mytint = 255 * (uint16_t)level / RAMP_SIZE;

    BLEND_PWM_DATATYPE a, b, c;

    // red is high at 0, low at 255
    a = (((PWM_DATATYPE2)(255 - mytint)
          * (PWM_DATATYPE2)vpwm) + 127) / 255;
    // warm white is low at 0 and 255, high at 127
    b = (((PWM_DATATYPE2)triangle_wave(mytint)
          * (PWM_DATATYPE2)vpwm) + 127) / 255;
    // cool white is low at 0, high at 255
    c = (((PWM_DATATYPE2)mytint
          * (PWM_DATATYPE2)vpwm) + 127) / 255;

    RED_PWM_LVL  = a;
    WARM_PWM_LVL = b;
    COOL_PWM_LVL = c;
}


// "white + red" channel mode
void set_level_red_white_blend(uint8_t level) {
    // set the warm+cool white LEDs first
    channel_mode = CM_WHITE;
    set_level_2ch_blend(level);
    channel_mode = CM_WHITE_RED;

    BLEND_PWM_DATATYPE vpwm;

    // set the red LED as a ratio of the white output level
    if (level == 0) {
        vpwm  = 0;
    } else {
        level --;  // PWM array index = level - 1
        vpwm  = PWM_GET(blend_pwm_levels, level);
    }

    // 0 = no red
    // 255 = red at 100% of white channel PWM
    uint8_t ratio = channel_mode_args[channel_mode];

    PWM_DATATYPE red_pwm;
    red_pwm = (((PWM_DATATYPE2)ratio * (PWM_DATATYPE2)vpwm) + 127) / 255;

    RED_PWM_LVL = red_pwm;
}