~toykeeper/flashlight-firmware/fsm

« back to all changes in this revision

Viewing changes to ToyKeeper/hwdef-fw3x-lume1.c

  • Committer: Selene ToyKeeper
  • Date: 2023-11-02 17:05:02 UTC
  • mfrom: (483.12.159 multi-channel)
  • mto: This revision was merged to the branch mainline in revision 491.
  • Revision ID: bzr@toykeeper.net-20231102170502-sinkm18qjxlorsxa
merged multi-channel branch with a major refactor and half a year of updates

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// FW3X Lume1 PWM helper functions
 
2
// Copyright (C) 2023 Selene ToyKeeper
 
3
// SPDX-License-Identifier: GPL-3.0-or-later
 
4
#pragma once
 
5
 
 
6
#include "chan-rgbaux.c"
 
7
 
 
8
void set_level_zero();
 
9
 
 
10
void set_level_main(uint8_t level);
 
11
bool gradual_tick_main(uint8_t gt);
 
12
 
 
13
 
 
14
Channel channels[] = {
 
15
    { // channel 1 only
 
16
        .set_level    = set_level_main,
 
17
        .gradual_tick = gradual_tick_main
 
18
    },
 
19
    RGB_AUX_CHANNELS
 
20
};
 
21
 
 
22
 
 
23
void set_level_zero() {
 
24
    CH1_PWM = 0;
 
25
    CH2_PWM = 0;
 
26
    PWM_CNT = 0;  // reset phase
 
27
    CH1_ENABLE_PORT &= ~(1 << CH1_ENABLE_PIN);  // disable regulator
 
28
}
 
29
 
 
30
// single set of LEDs with 2 stacked power channels, regulated + DD FET
 
31
void set_level_main(uint8_t level) {
 
32
    CH1_ENABLE_PORT |= (1 << CH1_ENABLE_PIN);  // enable regulator
 
33
 
 
34
    PWM_DATATYPE ch1_pwm = PWM_GET(pwm1_levels, level);
 
35
    PWM_DATATYPE ch2_pwm = PWM_GET(pwm2_levels, level);
 
36
 
 
37
    CH1_PWM = ch1_pwm;
 
38
    CH2_PWM = ch2_pwm;
 
39
 
 
40
    // force reset phase when turning on from zero
 
41
    // (for faster, more consistent initial response)
 
42
    if (! actual_level) PWM_CNT = 0;
 
43
}
 
44
 
 
45
bool gradual_tick_main(uint8_t gt) {
 
46
    // 150/150 is full FET + zero regulated,
 
47
    // 149/150 is zero FET + full regulated,
 
48
    // so don't try to gradually adjust between
 
49
    if ((RAMP_SIZE == actual_level) || (gt >= RAMP_SIZE-1)) {
 
50
        set_level(gt + 1);
 
51
        return true;
 
52
    }
 
53
 
 
54
    PWM_DATATYPE pwm1 = PWM_GET(pwm1_levels, gt);
 
55
    GRADUAL_ADJUST_SIMPLE(pwm1, CH1_PWM);
 
56
 
 
57
    if (pwm1 == CH1_PWM) return true;  // done
 
58
    return false;  // not done yet
 
59
}
 
60