~toykeeper/flashlight-firmware/fsm

« back to all changes in this revision

Viewing changes to ToyKeeper/spaghetti-monster/anduril/ramp-mode.h

  • Committer: Selene ToyKeeper
  • Date: 2023-11-04 15:09:10 UTC
  • mfrom: (483.1.175 anduril2)
  • Revision ID: bzr@toykeeper.net-20231104150910-ddd3afw4nhfvof2l
merged anduril2 branch -> fsm, with *years* of changes
(this also means this code is now Anduril 2 instead of Anduril 1)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// ramp-mode.h: Ramping functions for Anduril.
 
2
// Copyright (C) 2017-2023 Selene ToyKeeper
 
3
// SPDX-License-Identifier: GPL-3.0-or-later
 
4
 
 
5
#pragma once
 
6
 
 
7
#ifndef RAMP_LENGTH
 
8
#define RAMP_LENGTH 150  // default, if not overridden in a driver cfg file
 
9
#endif
 
10
 
 
11
// thermal properties, if not defined per-driver
 
12
#ifndef MIN_THERM_STEPDOWN
 
13
// TODO: Replace MAX_Xx7135 with MAX_CH1, MAX_CH2, MAX_REGULATED, etc
 
14
#define MIN_THERM_STEPDOWN MAX_1x7135  // lowest value it'll step down to
 
15
#endif
 
16
#ifndef THERM_FASTER_LEVEL
 
17
    #ifdef MAX_Nx7135
 
18
    #define THERM_FASTER_LEVEL MAX_Nx7135  // throttle back faster when high
 
19
    #else
 
20
    #define THERM_FASTER_LEVEL (RAMP_SIZE*4/5)  // throttle back faster when high
 
21
    #endif
 
22
#endif
 
23
 
 
24
#if defined(USE_SIMPLE_UI)
 
25
// TODO: Move these settings to config-default.h?
 
26
// start in the simple UI after each factory reset?
 
27
#ifndef SIMPLE_UI_ACTIVE
 
28
#define SIMPLE_UI_ACTIVE 1
 
29
#endif
 
30
#ifndef SIMPLE_UI_FLOOR
 
31
#define SIMPLE_UI_FLOOR (RAMP_SIZE*2/15)
 
32
#endif
 
33
#ifndef SIMPLE_UI_CEIL
 
34
#define SIMPLE_UI_CEIL (RAMP_SIZE*9/15)
 
35
#endif
 
36
#ifndef SIMPLE_UI_STEPS
 
37
#define SIMPLE_UI_STEPS 5
 
38
#endif
 
39
#endif
 
40
 
 
41
 
 
42
// configure the timing of turning on/off in regular ramp mode
 
43
// press: react as soon as the button is pressed
 
44
#define B_PRESS_T 0
 
45
// release: react as soon as the button is released
 
46
#define B_RELEASE_T 1
 
47
// timeout: react as soon as we're sure the user isn't doing a double-click
 
48
#define B_TIMEOUT_T 2
 
49
// defaults are release on, timeout off
 
50
#ifndef B_TIMING_ON
 
51
//#define B_TIMING_ON B_PRESS_T
 
52
#define B_TIMING_ON B_RELEASE_T
 
53
#endif
 
54
#ifndef B_TIMING_OFF
 
55
//#define B_TIMING_OFF B_RELEASE_T
 
56
#define B_TIMING_OFF B_TIMEOUT_T
 
57
#endif
 
58
 
 
59
 
 
60
// default ramp options if not overridden earlier per-driver
 
61
#ifndef RAMP_STYLE
 
62
#define RAMP_STYLE 0  // smooth default
 
63
#endif
 
64
#ifndef DEFAULT_RAMP_SPEED
 
65
#define DEFAULT_RAMP_SPEED 1  // WDT ticks per "frame", must be 1 or more
 
66
#endif
 
67
#ifndef RAMP_SMOOTH_FLOOR
 
68
  #define RAMP_SMOOTH_FLOOR 1
 
69
#endif
 
70
#ifndef RAMP_SMOOTH_CEIL
 
71
  #if PWM_CHANNELS == 3
 
72
    #define RAMP_SMOOTH_CEIL MAX_Nx7135
 
73
  #else
 
74
    #define RAMP_SMOOTH_CEIL MAX_LEVEL - 30
 
75
  #endif
 
76
#endif
 
77
#ifndef RAMP_DISCRETE_FLOOR
 
78
  #define RAMP_DISCRETE_FLOOR 20
 
79
#endif
 
80
#ifndef RAMP_DISCRETE_CEIL
 
81
  #define RAMP_DISCRETE_CEIL RAMP_SMOOTH_CEIL
 
82
#endif
 
83
#ifndef RAMP_DISCRETE_STEPS
 
84
  #define RAMP_DISCRETE_STEPS 7
 
85
#endif
 
86
 
 
87
// mile marker(s) partway up the ramp
 
88
// default: blink only at border between regulated and FET
 
89
#ifdef BLINK_AT_RAMP_MIDDLE
 
90
  // FIXME: remove PWM_CHANNELS, use some other abstraction
 
91
  #if PWM_CHANNELS >= 3
 
92
    #ifndef BLINK_AT_RAMP_MIDDLE_1
 
93
      #define BLINK_AT_RAMP_MIDDLE_1 MAX_Nx7135
 
94
      #ifndef BLINK_AT_RAMP_MIDDLE_2
 
95
      #define BLINK_AT_RAMP_MIDDLE_2 MAX_1x7135
 
96
      #endif
 
97
    #endif
 
98
  #else
 
99
    #ifndef BLINK_AT_RAMP_MIDDLE_1
 
100
    #define BLINK_AT_RAMP_MIDDLE_1 MAX_1x7135
 
101
    #endif
 
102
  #endif
 
103
#endif
 
104
 
 
105
 
 
106
// ramping mode and its related config mode
 
107
uint8_t steady_state(Event event, uint16_t arg);
 
108
 
 
109
#ifdef USE_RAMP_CONFIG
 
110
uint8_t ramp_config_state(Event event, uint16_t arg);
 
111
void ramp_config_save(uint8_t step, uint8_t value);
 
112
#ifdef USE_SIMPLE_UI
 
113
uint8_t simple_ui_config_state(Event event, uint16_t arg);
 
114
#endif
 
115
#endif
 
116
 
 
117
#if defined(USE_MANUAL_MEMORY_TIMER) || defined(USE_RAMP_AFTER_MOON_CONFIG) || defined(USE_2C_STYLE_CONFIG) || defined(USE_AUTO_SUNSET)
 
118
#define USE_RAMP_EXTRAS_CONFIG
 
119
#endif
 
120
#ifdef USE_RAMP_EXTRAS_CONFIG
 
121
uint8_t ramp_extras_config_state(Event event, uint16_t arg);
 
122
#endif
 
123
 
 
124
// calculate the nearest ramp level which would be valid at the moment
 
125
// (is a no-op for smooth ramp, but limits discrete ramp to only the
 
126
// correct levels for the user's config)
 
127
uint8_t nearest_level(int16_t target);
 
128
 
 
129
// ensure ramp globals are correct
 
130
void ramp_update_config();
 
131
 
 
132
#if defined(USE_THERMAL_REGULATION) || defined(USE_SMOOTH_STEPS)
 
133
// brightness before thermal step-down
 
134
uint8_t target_level = 0;
 
135
void set_level_and_therm_target(uint8_t level);
 
136
#else
 
137
#define set_level_and_therm_target(level) set_level(level)
 
138
#endif
 
139
 
 
140
 
 
141
// brightness control
 
142
uint8_t memorized_level = DEFAULT_LEVEL;
 
143
#ifdef USE_MANUAL_MEMORY
 
144
    void manual_memory_restore();
 
145
    void manual_memory_save();
 
146
    #ifndef DEFAULT_MANUAL_MEMORY
 
147
        #define DEFAULT_MANUAL_MEMORY 0
 
148
    #endif
 
149
    #ifdef USE_MANUAL_MEMORY_TIMER
 
150
        #ifndef DEFAULT_MANUAL_MEMORY_TIMER
 
151
            #define DEFAULT_MANUAL_MEMORY_TIMER 0
 
152
        #endif
 
153
    #endif
 
154
#endif
 
155
 
 
156
#ifndef DEFAULT_2C_STYLE_SIMPLE
 
157
    #define DEFAULT_2C_STYLE_SIMPLE 0
 
158
#endif
 
159
 
 
160
#ifdef USE_2C_STYLE_CONFIG
 
161
#ifndef DEFAULT_2C_STYLE
 
162
#define DEFAULT_2C_STYLE 2
 
163
#endif
 
164
 
 
165
#ifdef USE_2C_MAX_TURBO
 
166
#error Cannot use USE_2C_MAX_TURBO and USE_2C_STYLE_CONFIG at the same time.
 
167
#endif
 
168
#endif
 
169
 
 
170
#ifdef USE_RAMP_SPEED_CONFIG
 
171
#define ramp_speed (cfg.ramp_stepss[0])
 
172
#endif
 
173
#ifdef USE_RAMP_AFTER_MOON_CONFIG
 
174
#ifndef DEFAULT_DONT_RAMP_AFTER_MOON
 
175
#define DEFAULT_DONT_RAMP_AFTER_MOON 0
 
176
#endif
 
177
#endif
 
178
// current values, regardless of style
 
179
uint8_t ramp_floor = RAMP_SMOOTH_FLOOR;
 
180
uint8_t ramp_ceil = RAMP_SMOOTH_CEIL;
 
181
 
 
182
uint8_t ramp_discrete_step_size;  // don't set this
 
183
 
 
184
#ifdef USE_SUNSET_TIMER
 
185
uint8_t sunset_timer_orig_level = 0;
 
186
void reset_sunset_timer();
 
187
#endif
 
188
 
 
189
#ifdef USE_RAMP_EXTRAS_CONFIG
 
190
typedef enum {
 
191
    ramp_extras_cfg_zero = 0,
 
192
    manual_memory_config_step,
 
193
    #ifdef USE_MANUAL_MEMORY_TIMER
 
194
    manual_memory_timer_config_step,
 
195
    #endif
 
196
    #ifdef USE_RAMP_AFTER_MOON_CONFIG
 
197
    dont_ramp_after_moon_config_step,
 
198
    #endif
 
199
    #ifdef USE_2C_STYLE_CONFIG
 
200
    ramp_2c_style_config_step,
 
201
    #endif
 
202
    #ifdef USE_SMOOTH_STEPS
 
203
    smooth_steps_style_config_step,
 
204
    #endif
 
205
    ramp_extras_config_num_steps
 
206
} ramp_extras_config_steps_e;
 
207
#endif
 
208
 
 
209
#ifdef USE_GLOBALS_CONFIG
 
210
typedef enum {
 
211
    globals_cfg_zero = 0,
 
212
    #if defined(USE_CHANNEL_MODE_ARGS) && defined(USE_STEPPED_TINT_RAMPING)
 
213
    tint_style_config_step,
 
214
    #endif
 
215
    #ifdef USE_JUMP_START
 
216
    jump_start_config_step,
 
217
    #endif
 
218
    globals_config_num_steps
 
219
} globals_config_steps_e;
 
220
 
 
221
void globals_config_save(uint8_t step, uint8_t value);
 
222
uint8_t globals_config_state(Event event, uint16_t arg);
 
223
#endif
 
224