-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBacklight.cpp
More file actions
105 lines (84 loc) · 3.3 KB
/
Copy pathBacklight.cpp
File metadata and controls
105 lines (84 loc) · 3.3 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "Backlight.h"
#include <M5Unified.h>
#include "Config.h"
#include "SettingsStore.h"
namespace {
// 部屋が暗いと判断されているか。自動調整が切でも覚えておき、入に戻したときに
// すぐ反映できるようにします。
bool g_dark = false;
// 触れて明るさを戻しているとき、いつまで戻したままにするか。
// 0なら戻していません。
uint32_t g_wakeUntilMillis = 0;
// 明るさを戻した直後、いつまでタッチを受け付けないか。
uint32_t g_touchGuardUntilMillis = 0;
bool awake() { return g_wakeUntilMillis != 0 && int32_t(millis() - g_wakeUntilMillis) < 0; }
// 手で選ぶときの範囲に丸めます。
int clampPercent(int percent) {
if (percent < BACKLIGHT_PERCENT_MIN) return BACKLIGHT_PERCENT_MIN;
if (percent > BACKLIGHT_PERCENT_MAX) return BACKLIGHT_PERCENT_MAX;
return percent;
}
// 画面へそのまま反映します。
//
// 手で選べる下限より暗くできるのは、この経路だけです。自動で暗くするときは
// 下限を下回る明るさを使うので、clampPercent()を通しません。
void applyRaw(int percent) {
if (percent < 0) percent = 0;
if (percent > 100) percent = 100;
M5.Display.setBrightness(uint8_t(255 * percent / 100));
}
} // namespace
namespace Backlight {
void begin() {
applyCurrent();
}
void preview(int percent) { applyRaw(clampPercent(percent)); }
void setPercent(int percent) {
percent = clampPercent(percent);
SettingsStore::setBrightnessPercent(percent);
// 選んだ値は「明るい部屋での明るさ」です。部屋が暗いと判断されている間は、
// 自動で下げた明るさのままにします。
//
// ここで自動調整を打ち切らないのは、意図した操作と、画面を送るときに指が
// かすめただけの接触とを区別できないためです。
applyCurrent();
}
void applyAuto(bool dark) {
g_dark = dark;
applyCurrent();
}
void applyCurrent() {
// 触れて戻している間は、暗いと判断していても通常の明るさにします。
bool dark = SettingsStore::backlightAuto() && g_dark && !awake();
// 暗いときは決めた明るさまで下げ、明るいときはスライダーで選んだ値に
// 戻します。途中の値は使いません。
int percent = dark ? BACKLIGHT_DARK_PERCENT : clampPercent(SettingsStore::brightnessPercent());
applyRaw(percent);
}
void update() {
// 戻していた時間が切れたら、暗い判断のままなら消し直します。
if (g_wakeUntilMillis == 0 || awake()) return;
g_wakeUntilMillis = 0;
applyCurrent();
}
bool isScreenOff() {
return SettingsStore::backlightAuto() && g_dark && !awake() && BACKLIGHT_DARK_PERCENT == 0;
}
bool wakeByTouch() {
bool wasOff = isScreenOff();
// 触れられた以上、消えるまでの時間は数え直します。見ている最中に消えては
// 困るためです。
if (SettingsStore::backlightAuto() && g_dark) {
g_wakeUntilMillis = millis() + BACKLIGHT_WAKE_MS;
if (wasOff) {
g_touchGuardUntilMillis = millis() + BACKLIGHT_WAKE_GUARD_MS;
applyCurrent();
}
}
return wasOff;
}
bool touchAllowed() {
if (isScreenOff()) return false;
return int32_t(millis() - g_touchGuardUntilMillis) >= 0;
}
} // namespace Backlight