-
Notifications
You must be signed in to change notification settings - Fork 91
Expand file tree
/
Copy pathnvs_config.h
More file actions
403 lines (355 loc) · 23.8 KB
/
Copy pathnvs_config.h
File metadata and controls
403 lines (355 loc) · 23.8 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
#pragma once
// clang-format off
#include <stdint.h>
// Max length 15
#define NVS_CONFIG_WIFI_SSID "wifissid"
#define NVS_CONFIG_WIFI_PASS "wifipass"
#define NVS_CONFIG_HOSTNAME "hostname"
#define NVS_CONFIG_STRATUM_URL "stratumurl"
#define NVS_CONFIG_STRATUM_PORT "stratumport"
#define NVS_CONFIG_STRATUM_USER "stratumuser"
#define NVS_CONFIG_STRATUM_PASS "stratumpass"
#define NVS_CONFIG_STRATUM_ENONCE_SUB "stratumesub"
#define NVS_CONFIG_STRATUM_TLS "stratumtls"
#define NVS_CONFIG_STRATUM_FALLBACK_URL "fbstratumurl"
#define NVS_CONFIG_STRATUM_FALLBACK_PORT "fbstratumport"
#define NVS_CONFIG_STRATUM_FALLBACK_USER "fbstratumuser"
#define NVS_CONFIG_STRATUM_FALLBACK_PASS "fbstratumpass"
#define NVS_CONFIG_STRATUM_FALLBACK_ENONCE_SUB "fbstratumesub"
#define NVS_CONFIG_STRATUM_FALLBACK_TLS "fbstratumtls"
#define NVS_CONFIG_STRATUM_DIFFICULTY "stratumdiff"
#define NVS_CONFIG_STRATUM_KEEPALIVE "stratum_keep"
#define NVS_CONFIG_ASIC_FREQ "asicfrequency"
#define NVS_CONFIG_ASIC_VOLTAGE "asicvoltage"
#define NVS_CONFIG_ASIC_JOB_INTERVAL "asicjobinterval"
#define NVS_CONFIG_FLIP_SCREEN "flipscreen"
#define NVS_CONFIG_INVERT_SCREEN "invertscreen"
#define NVS_CONFIG_INVERT_FAN_POLARITY "invertfanpol" // kept for downgrade compatibility
#define NVS_CONFIG_AUTO_FAN_POLARITY "autofanpol" // kept for downgrade compatibility
#define NVS_CONFIG_FAN_PWM_POLARITY "pwmfanpol" // new setting
#define NVS_CONFIG_AUTO_FAN_SPEED "autofanspeed"
#define NVS_CONFIG_FAN_SPEED "fanspeed"
#define NVS_CONFIG_SELF_TEST "selftest"
#define NVS_CONFIG_AUTO_SCREEN_OFF "autoscreenoff"
#define NVS_CONFIG_OVERHEAT_TEMP "overheat_temp"
#define NVS_CONFIG_INFLUX_ENABLE "influx_enable"
#define NVS_CONFIG_INFLUX_URL "influx_url"
#define NVS_CONFIG_INFLUX_TOKEN "influx_token"
#define NVS_CONFIG_INFLUX_PORT "influx_port"
#define NVS_CONFIG_INFLUX_BUCKET "influx_bucket"
#define NVS_CONFIG_INFLUX_ORG "influx_org"
#define NVS_CONFIG_INFLUX_PREFIX "influx_prefix"
#define NVS_CONFIG_PID_TARGET_TEMP "pid_temp"
#define NVS_CONFIG_PID_P "pid_p"
#define NVS_CONFIG_PID_I "pid_i"
#define NVS_CONFIG_PID_D "pid_d"
// Fan channel 1 (independent second fan, e.g. for VR temp)
#define NVS_CONFIG_FAN1_SPEED "fan1speed"
#define NVS_CONFIG_FAN1_MODE "fan1mode"
#define NVS_CONFIG_FAN1_PID_TEMP "fan1_pid_temp"
#define NVS_CONFIG_FAN1_PID_P "fan1_pid_p"
#define NVS_CONFIG_FAN1_PID_I "fan1_pid_i"
#define NVS_CONFIG_FAN1_PID_D "fan1_pid_d"
#define NVS_CONFIG_FAN1_OVERHEAT "fan1_overheat"
#define NVS_CONFIG_FAN_PID_USE_MAX "fan_pid_max"
#define NVS_CONFIG_MEMPOOL_URL "mempool_url"
#define NVS_CONFIG_MEMPOOL_CUSTOM "mempool_cust"
#define CONFIG_DONATE_ADDR "bc1q7n70rumyv6lvu8avpml0c3uggvssfu52egum3q"
#define NVS_CONFIG_ALERT_DISCORD_WATCHDOG_ENABLE "alrt_disc_en"
#define NVS_CONFIG_ALERT_DISCORD_URL "alrt_disc_url"
#define NVS_CONFIG_ALERT_DISCORD_BLOCK_FOUND_ENABLE "alrt_disc_bf_en"
#define NVS_CONFIG_ALERT_DISCORD_BEST_DIFF "alrt_disc_bd_en"
#define NVS_CONFIG_ALERT_DISCORD_COINBASE_VERIFY "alrt_disc_cb_en"
#define NVS_CONFIG_SHOW_BLOCK_FOUND_ENABLE "block_found_en"
#define NVS_CONFIG_SWARM "swarmconfig"
#define NVS_CONFIG_CAN_ENABLED "can_enabled"
#define NVS_CONFIG_VR_FREQUENCY "vr_frequency"
// device global stats
#define NVS_TOTAL_FOUND_BLOCKS "totalblocks"
#define NVS_CONFIG_BEST_DIFF "bestdiff"
// Coinbase verification (per pool)
#define NVS_CONFIG_COINBASE_VERIFY_MODE "cb_verify_mode"
#define NVS_CONFIG_COINBASE_MAX_FEE "cb_max_fee"
#define NVS_CONFIG_COINBASE_VERIFY_FORCE "cb_vfy_force"
#define NVS_CONFIG_FB_COINBASE_VERIFY_MODE "fb_cb_vfy_mode"
#define NVS_CONFIG_FB_COINBASE_MAX_FEE "fb_cb_max_fee"
#define NVS_CONFIG_FB_COINBASE_VERIFY_FORCE "fb_cb_vfy_frc"
// OTP
#define NVS_CONFIG_OTP_SECRET "otp_secret"
#define NVS_CONFIG_OTP_ENABLED "otp_enabled"
#define NVS_CONFIG_OTP_LAST_STEP "otp_last_step"
#define NVS_CONFIG_OTP_USED_MASK "otp_used_mask"
#define NVS_CONFIG_OTP_SESSION_KEY "otp_sess_key"
#define NVS_CONFIG_OTP_BOOT_ID "otp_boot_id"
#define NVS_CONFIG_POOL_MODE_BALANCE "pool_balance"
#define NVS_CONFIG_POOL_MODE "pool_mode"
// Stratum V2
#define NVS_CONFIG_STRATUM_PROTOCOL "sv2_proto"
#define NVS_CONFIG_SV2_AUTHORITY_PUBKEY "sv2_auth_pk"
#define NVS_CONFIG_SV2_CHANNEL_TYPE "sv2_chan_type"
#define NVS_CONFIG_FB_STRATUM_PROTOCOL "fbsv2_proto"
#define NVS_CONFIG_FB_SV2_AUTHORITY_PUBKEY "fbsv2_authpk"
#define NVS_CONFIG_FB_SV2_CHANNEL_TYPE "fbsv2_chtype"
#if defined(CONFIG_FAN_MODE_MANUAL)
#define CONFIG_AUTO_FAN_SPEED_VALUE 0
#elif defined(CONFIG_FAN_MODE_CLASSIC)
#define CONFIG_AUTO_FAN_SPEED_VALUE 1
#elif defined(CONFIG_FAN_MODE_PID)
#define CONFIG_AUTO_FAN_SPEED_VALUE 2
#endif
#include <stdint.h>
namespace Config {
// ---- Lifecycle ----
void init(); // Load flat JSON blob or migrate legacy keys. Call once at boot.
void flush(); // Signal the non-PSRAM flush task to persist batched changes.
// ---- Direct document access (for API handlers — include ArduinoJson.h first) ----
// JsonDocument& getDoc();
void cfgLock();
void cfgUnlock();
// ---- Generic typed accessors (backed by the in-memory flat JSON doc) ----
char* cfgGetStrAlloc(const char* path, const char* def = ""); // caller must free
void cfgSetStr(const char* path, const char* value);
uint16_t cfgGetU16(const char* path, uint16_t def = 0);
void cfgSetU16(const char* path, uint16_t value);
bool cfgGetBool(const char* path, bool def = false);
void cfgSetBool(const char* path, bool value);
uint64_t cfgGetU64(const char* path, uint64_t def = 0);
void cfgSetU64(const char* path, uint64_t value);
bool cfgHasKey(const char* path);
// ---- String Getters ----
inline char* getWifiSSID() { return cfgGetStrAlloc(NVS_CONFIG_WIFI_SSID, CONFIG_ESP_WIFI_SSID); }
inline char* getWifiPass() { return cfgGetStrAlloc(NVS_CONFIG_WIFI_PASS, CONFIG_ESP_WIFI_PASSWORD); }
inline char* getHostname() { return cfgGetStrAlloc(NVS_CONFIG_HOSTNAME, CONFIG_LWIP_LOCAL_HOSTNAME); }
inline char* getStratumURL() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_URL, CONFIG_STRATUM_URL); }
inline char* getStratumUser() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_USER, CONFIG_STRATUM_USER); }
inline char* getStratumPass() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_PASS, CONFIG_STRATUM_PW); }
inline char* getStratumFallbackURL() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_FALLBACK_URL, CONFIG_STRATUM_FALLBACK_URL); }
inline char* getStratumFallbackUser() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_FALLBACK_USER, CONFIG_STRATUM_FALLBACK_USER); }
inline char* getStratumFallbackPass() { return cfgGetStrAlloc(NVS_CONFIG_STRATUM_FALLBACK_PASS, CONFIG_STRATUM_FALLBACK_PW); }
inline char* getInfluxURL() { return cfgGetStrAlloc(NVS_CONFIG_INFLUX_URL, CONFIG_INFLUX_URL); }
inline char* getInfluxToken() { return cfgGetStrAlloc(NVS_CONFIG_INFLUX_TOKEN, CONFIG_INFLUX_TOKEN); }
inline char* getInfluxBucket() { return cfgGetStrAlloc(NVS_CONFIG_INFLUX_BUCKET, CONFIG_INFLUX_BUCKET); }
inline char* getInfluxOrg() { return cfgGetStrAlloc(NVS_CONFIG_INFLUX_ORG, CONFIG_INFLUX_ORG); }
inline char* getInfluxPrefix() { return cfgGetStrAlloc(NVS_CONFIG_INFLUX_PREFIX, CONFIG_INFLUX_PREFIX); }
inline char* getSwarmConfig() { return cfgGetStrAlloc(NVS_CONFIG_SWARM, ""); }
inline char* getDiscordWebhook() { return cfgGetStrAlloc(NVS_CONFIG_ALERT_DISCORD_URL, CONFIG_ALERT_DISCORD_URL); }
inline char* getMempoolUrl() { return cfgGetStrAlloc(NVS_CONFIG_MEMPOOL_URL, CONFIG_MEMPOOL_URL); }
inline void setMempoolUrl(const char* value) { cfgSetStr(NVS_CONFIG_MEMPOOL_URL, value); }
inline bool isMempoolCustom() { return cfgGetU16(NVS_CONFIG_MEMPOOL_CUSTOM, 0) != 0; }
inline void setMempoolCustom(bool v) { cfgSetU16(NVS_CONFIG_MEMPOOL_CUSTOM, v ? 1 : 0); }
// ---- String Setters ----
inline void setWifiSSID(const char* value) { cfgSetStr(NVS_CONFIG_WIFI_SSID, value); }
inline void setWifiPass(const char* value) { cfgSetStr(NVS_CONFIG_WIFI_PASS, value); }
inline void setHostname(const char* value) { cfgSetStr(NVS_CONFIG_HOSTNAME, value); }
inline void setStratumURL(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_URL, value); }
inline void setStratumUser(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_USER, value); }
inline void setStratumPass(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_PASS, value); }
inline void setStratumFallbackURL(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_FALLBACK_URL, value); }
inline void setStratumFallbackUser(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_FALLBACK_USER, value); }
inline void setStratumFallbackPass(const char* value) { cfgSetStr(NVS_CONFIG_STRATUM_FALLBACK_PASS, value); }
inline void setInfluxURL(const char* value) { cfgSetStr(NVS_CONFIG_INFLUX_URL, value); }
inline void setInfluxToken(const char* value) { cfgSetStr(NVS_CONFIG_INFLUX_TOKEN, value); }
inline void setInfluxBucket(const char* value) { cfgSetStr(NVS_CONFIG_INFLUX_BUCKET, value); }
inline void setInfluxOrg(const char* value) { cfgSetStr(NVS_CONFIG_INFLUX_ORG, value); }
inline void setInfluxPrefix(const char* value) { cfgSetStr(NVS_CONFIG_INFLUX_PREFIX, value); }
inline void setSwarmConfig(const char* value) { cfgSetStr(NVS_CONFIG_SWARM, value); }
inline void setDiscordWebhook(const char* value) { cfgSetStr(NVS_CONFIG_ALERT_DISCORD_URL, value); }
// ---- uint16_t Getters ----
inline uint16_t getStratumPortNumber() { return cfgGetU16(NVS_CONFIG_STRATUM_PORT, CONFIG_STRATUM_PORT); }
inline uint16_t getStratumFallbackPortNumber() { return cfgGetU16(NVS_CONFIG_STRATUM_FALLBACK_PORT, CONFIG_STRATUM_FALLBACK_PORT); }
inline uint16_t getFanSpeed() { return cfgGetU16(NVS_CONFIG_FAN_SPEED, CONFIG_FAN_SPEED); }
inline uint16_t getOverheatTemp() { return cfgGetU16(NVS_CONFIG_OVERHEAT_TEMP, CONFIG_OVERHEAT_TEMP); }
inline uint16_t getInfluxPort() { return cfgGetU16(NVS_CONFIG_INFLUX_PORT, CONFIG_INFLUX_PORT); }
inline uint16_t getPoolMode() { return cfgGetU16(NVS_CONFIG_POOL_MODE, 0); }
inline uint16_t getPoolBalance() { return cfgGetU16(NVS_CONFIG_POOL_MODE_BALANCE, 50); }
// ---- uint16_t Setters ----
inline void setAsicFrequency(uint16_t value) { cfgSetU16(NVS_CONFIG_ASIC_FREQ, value); }
inline void setAsicVoltage(uint16_t value) { cfgSetU16(NVS_CONFIG_ASIC_VOLTAGE, value); }
inline void setAsicJobInterval(uint16_t value) { cfgSetU16(NVS_CONFIG_ASIC_JOB_INTERVAL, value); }
inline void setStratumPortNumber(uint16_t value) { cfgSetU16(NVS_CONFIG_STRATUM_PORT, value); }
inline void setStratumFallbackPortNumber(uint16_t value) { cfgSetU16(NVS_CONFIG_STRATUM_FALLBACK_PORT, value); }
inline void setFanSpeed(uint16_t value) { cfgSetU16(NVS_CONFIG_FAN_SPEED, value); }
inline void setOverheatTemp(uint16_t value) { cfgSetU16(NVS_CONFIG_OVERHEAT_TEMP, value); }
inline void setInfluxPort(uint16_t value) { cfgSetU16(NVS_CONFIG_INFLUX_PORT, value); }
inline void setTempControlMode(uint16_t value) { cfgSetU16(NVS_CONFIG_AUTO_FAN_SPEED, value); }
inline void setPoolMode(uint16_t value) { cfgSetU16(NVS_CONFIG_POOL_MODE, value); }
inline void setPoolBalance(uint16_t value) { cfgSetU16(NVS_CONFIG_POOL_MODE_BALANCE, value); }
inline void setPidTargetTemp(uint16_t value) { cfgSetU16(NVS_CONFIG_PID_TARGET_TEMP, value); }
inline void setPidP(uint16_t value) { cfgSetU16(NVS_CONFIG_PID_P, value); }
inline void setPidI(uint16_t value) { cfgSetU16(NVS_CONFIG_PID_I, value); }
inline void setPidD(uint16_t value) { cfgSetU16(NVS_CONFIG_PID_D, value); }
// Indexed fan-channel getters (ch=0 → ch0 NVS keys, ch=1 → fan1 NVS keys)
// ch0 defaults: mode=CONFIG_AUTO_FAN_SPEED_VALUE, speed=CONFIG_FAN_SPEED, overheat=CONFIG_OVERHEAT_TEMP
// ch1 defaults: mode=3 (linked), speed=100%, overheat=80°C
inline uint16_t getFanMode(int ch, uint16_t def) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_AUTO_FAN_SPEED, def)
: cfgGetU16(NVS_CONFIG_FAN1_MODE, def);
}
inline uint16_t getFanManualSpeed(int ch) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_FAN_SPEED, CONFIG_FAN_SPEED)
: cfgGetU16(NVS_CONFIG_FAN1_SPEED, 100);
}
inline uint16_t getFanOverheatTemp(int ch) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_OVERHEAT_TEMP, CONFIG_OVERHEAT_TEMP)
: cfgGetU16(NVS_CONFIG_FAN1_OVERHEAT, CONFIG_OVERHEAT_TEMP);
}
inline uint16_t getFanPidTargetTemp(int ch, uint16_t d) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_PID_TARGET_TEMP, d)
: cfgGetU16(NVS_CONFIG_FAN1_PID_TEMP, d);
}
inline uint16_t getFanPidP(int ch, uint16_t d) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_PID_P, d)
: cfgGetU16(NVS_CONFIG_FAN1_PID_P, d);
}
inline uint16_t getFanPidI(int ch, uint16_t d) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_PID_I, d)
: cfgGetU16(NVS_CONFIG_FAN1_PID_I, d);
}
inline uint16_t getFanPidD(int ch, uint16_t d) {
return ch == 0 ? cfgGetU16(NVS_CONFIG_PID_D, d)
: cfgGetU16(NVS_CONFIG_FAN1_PID_D, d);
}
// Indexed fan-channel setters
inline void setFanMode(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_AUTO_FAN_SPEED, v);
else cfgSetU16(NVS_CONFIG_FAN1_MODE, v);
}
inline void setFanManualSpeed(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_FAN_SPEED, v);
else cfgSetU16(NVS_CONFIG_FAN1_SPEED, v);
}
inline void setFanOverheatTemp(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_OVERHEAT_TEMP, v);
else cfgSetU16(NVS_CONFIG_FAN1_OVERHEAT, v);
}
inline void setFanPidTargetTemp(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_PID_TARGET_TEMP, v);
else cfgSetU16(NVS_CONFIG_FAN1_PID_TEMP, v);
}
inline void setFanPidP(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_PID_P, v);
else cfgSetU16(NVS_CONFIG_FAN1_PID_P, v);
}
inline void setFanPidI(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_PID_I, v);
else cfgSetU16(NVS_CONFIG_FAN1_PID_I, v);
}
inline void setFanPidD(int ch, uint16_t v) {
if (ch == 0) cfgSetU16(NVS_CONFIG_PID_D, v);
else cfgSetU16(NVS_CONFIG_FAN1_PID_D, v);
}
// Fan PID: use max(ASIC, VReg) as input instead of ASIC only
inline bool isFanPidUseMax() { return cfgGetU16(NVS_CONFIG_FAN_PID_USE_MAX, 1) != 0; }
inline void setFanPidUseMax(bool v) { cfgSetU16(NVS_CONFIG_FAN_PID_USE_MAX, v ? 1 : 0); }
// ---- uint64_t Getters ----
uint64_t getBestDiff();
uint32_t getTotalFoundBlocks();
inline uint32_t getStratumDifficulty() { return (uint32_t) cfgGetU64(NVS_CONFIG_STRATUM_DIFFICULTY, CONFIG_STRATUM_DIFFICULTY); }
// ---- uint64_t Setters ----
void setBestDiff(uint64_t value);
void setTotalFoundBlocks(uint32_t value);
inline void setStratumDifficulty(uint32_t value) { cfgSetU64(NVS_CONFIG_STRATUM_DIFFICULTY, value); }
inline void setVrFrequency(uint32_t value) { cfgSetU64(NVS_CONFIG_VR_FREQUENCY, value); }
// ---- Boolean Getters (Stored as uint16_t but used as bool) ----
inline bool isInvertScreenEnabled() { return cfgGetU16(NVS_CONFIG_INVERT_SCREEN, 0) != 0; } // todo unused?
inline bool isSelfTestEnabled() { return cfgGetU16(NVS_CONFIG_SELF_TEST, 0) != 0; }
inline bool isAutoScreenOffEnabled() { return cfgGetU16(NVS_CONFIG_AUTO_SCREEN_OFF, CONFIG_AUTO_SCREEN_OFF_VALUE) != 0; }
inline bool isInfluxEnabled() { return cfgGetU16(NVS_CONFIG_INFLUX_ENABLE, CONFIG_INFLUX_ENABLE_VALUE) != 0; }
inline bool isDiscordWatchdogAlertEnabled() { return cfgGetU16(NVS_CONFIG_ALERT_DISCORD_WATCHDOG_ENABLE, CONFIG_ALERT_DISCORD_WATCHDOG_ENABLE_VALUE) != 0; }
inline bool isDiscordBlockFoundAlertEnabled() { return cfgGetU16(NVS_CONFIG_ALERT_DISCORD_BLOCK_FOUND_ENABLE, CONFIG_ALERT_DISCORD_BLOCK_FOUND_ENABLE_VALUE) != 0; }
inline bool isDiscordBestDiffAlertEnabled() { return cfgGetU16(NVS_CONFIG_ALERT_DISCORD_BEST_DIFF, CONFIG_ALERT_DISCORD_BEST_DIFF_ENABLE_VALUE) != 0; }
inline bool isDiscordCoinbaseVerifyAlertEnabled() { return cfgGetU16(NVS_CONFIG_ALERT_DISCORD_COINBASE_VERIFY, 0) != 0; }
inline bool isStratumKeepaliveEnabled() { return cfgGetU16(NVS_CONFIG_STRATUM_KEEPALIVE, CONFIG_STRATUM_KEEPALIVE_ENABLE_VALUE) != 0; }
inline bool isStratumEnonceSubscribe() { return cfgGetU16(NVS_CONFIG_STRATUM_ENONCE_SUB, CONFIG_STRATUM_ENONCE_SUBSCRIBE_VALUE) != 0; }
inline bool isStratumFallbackEnonceSubscribe() { return cfgGetU16(NVS_CONFIG_STRATUM_FALLBACK_ENONCE_SUB, CONFIG_STRATUM_FALLBACK_ENONCE_SUBSCRIBE_VALUE) != 0; }
inline bool isStratumTLS() { return cfgGetU16(NVS_CONFIG_STRATUM_TLS, CONFIG_STRATUM_TLS_VALUE) != 0; }
inline bool isStratumFallbackTLS() { return cfgGetU16(NVS_CONFIG_STRATUM_FALLBACK_TLS, CONFIG_STRATUM_FALLBACK_TLS_VALUE) != 0; }
inline bool isShowBlockFoundEnabled() { return cfgGetU16(NVS_CONFIG_SHOW_BLOCK_FOUND_ENABLE, CONFIG_SHOW_BLOCK_FOUND_ENABLE_VALUE) != 0; }
inline bool isCanEnabled() { return cfgGetU16(NVS_CONFIG_CAN_ENABLED, 0) != 0; }
// Stratum V2
inline uint16_t getStratumProtocol() { return cfgGetU16(NVS_CONFIG_STRATUM_PROTOCOL, 0); }
inline void setStratumProtocol(uint16_t value) { cfgSetU16(NVS_CONFIG_STRATUM_PROTOCOL, value); }
inline uint16_t getFallbackStratumProtocol() { return cfgGetU16(NVS_CONFIG_FB_STRATUM_PROTOCOL, 0); }
inline void setFallbackStratumProtocol(uint16_t value) { cfgSetU16(NVS_CONFIG_FB_STRATUM_PROTOCOL, value); }
inline char* getSV2AuthorityPubkey() { return cfgGetStrAlloc(NVS_CONFIG_SV2_AUTHORITY_PUBKEY, ""); }
inline void setSV2AuthorityPubkey(const char* value) { cfgSetStr(NVS_CONFIG_SV2_AUTHORITY_PUBKEY, value); }
inline char* getFallbackSV2AuthorityPubkey() { return cfgGetStrAlloc(NVS_CONFIG_FB_SV2_AUTHORITY_PUBKEY, ""); }
inline void setFallbackSV2AuthorityPubkey(const char* value) { cfgSetStr(NVS_CONFIG_FB_SV2_AUTHORITY_PUBKEY, value); }
inline uint16_t getSV2ChannelType() { return cfgGetU16(NVS_CONFIG_SV2_CHANNEL_TYPE, 0); }
inline void setSV2ChannelType(uint16_t value) { cfgSetU16(NVS_CONFIG_SV2_CHANNEL_TYPE, value); }
inline uint16_t getFallbackSV2ChannelType() { return cfgGetU16(NVS_CONFIG_FB_SV2_CHANNEL_TYPE, 0); }
inline void setFallbackSV2ChannelType(uint16_t value) { cfgSetU16(NVS_CONFIG_FB_SV2_CHANNEL_TYPE, value); }
// ---- Boolean Setters ----
inline void setFlipScreen(bool value) { cfgSetU16(NVS_CONFIG_FLIP_SCREEN, value ? 1 : 0); }
inline void setInvertScreen(bool value) { cfgSetU16(NVS_CONFIG_INVERT_SCREEN, value ? 1 : 0); }
inline void setFanPolarity(bool value) { cfgSetU16(NVS_CONFIG_FAN_PWM_POLARITY, value ? 1 : 0); }
inline void setSelfTest(bool value) { cfgSetU16(NVS_CONFIG_SELF_TEST, value ? 1 : 0); }
inline void setAutoScreenOff(bool value) { cfgSetU16(NVS_CONFIG_AUTO_SCREEN_OFF, value ? 1 : 0); }
inline void setInfluxEnabled(bool value) { cfgSetU16(NVS_CONFIG_INFLUX_ENABLE, value ? 1 : 0); }
inline void setDiscordWatchdogAlertEnabled(bool value) { cfgSetU16(NVS_CONFIG_ALERT_DISCORD_WATCHDOG_ENABLE, value ? 1 : 0); }
inline void setDiscordAlertBlockFoundEnabled(bool value) { cfgSetU16(NVS_CONFIG_ALERT_DISCORD_BLOCK_FOUND_ENABLE, value ? 1 : 0); }
inline void setDiscordAlertBestDiffEnabled(bool value) { cfgSetU16(NVS_CONFIG_ALERT_DISCORD_BEST_DIFF, value ? 1 : 0); }
inline void setDiscordCoinbaseVerifyAlertEnabled(bool value) { cfgSetU16(NVS_CONFIG_ALERT_DISCORD_COINBASE_VERIFY, value ? 1 : 0); }
inline void setStratumKeepaliveEnabled(bool value) { cfgSetU16(NVS_CONFIG_STRATUM_KEEPALIVE, value ? 1 : 0); }
inline void setStratumEnonceSubscribe(bool value) { cfgSetU16(NVS_CONFIG_STRATUM_ENONCE_SUB, value ? 1 : 0); }
inline void setStratumFallbackEnonceSubscribe(bool value) { cfgSetU16(NVS_CONFIG_STRATUM_FALLBACK_ENONCE_SUB, value ? 1 : 0); }
inline void setStratumTLS(bool value) { cfgSetU16(NVS_CONFIG_STRATUM_TLS, value ? 1 : 0); }
inline void setStratumFallbackTLS(bool value) { cfgSetU16(NVS_CONFIG_STRATUM_FALLBACK_TLS, value ? 1 : 0); }
inline void setShowBlockFoundEnabled(bool value) { cfgSetU16(NVS_CONFIG_SHOW_BLOCK_FOUND_ENABLE, value ? 1 : 0); }
inline void setCanEnabled(bool value) { cfgSetU16(NVS_CONFIG_CAN_ENABLED, value ? 1 : 0); }
// with board specific default values
inline uint16_t getAsicFrequency(uint16_t d) { return cfgGetU16(NVS_CONFIG_ASIC_FREQ, d); }
inline uint16_t getAsicVoltage(uint16_t d) { return cfgGetU16(NVS_CONFIG_ASIC_VOLTAGE, d); }
inline uint16_t getAsicJobInterval(uint16_t d) { return cfgGetU16(NVS_CONFIG_ASIC_JOB_INTERVAL, d); }
inline bool isFlipScreenEnabled(bool d) { return cfgGetU16(NVS_CONFIG_FLIP_SCREEN, d ? 1 : 0) != 0; }
inline bool isFanPolarity(bool d) { return cfgGetU16(NVS_CONFIG_FAN_PWM_POLARITY, d ? 1 : 0) != 0; }
inline uint16_t getPidTargetTemp(uint16_t d) { return cfgGetU16(NVS_CONFIG_PID_TARGET_TEMP, d); }
inline uint16_t getPidP(uint16_t d) { return cfgGetU16(NVS_CONFIG_PID_P, d); }
inline uint16_t getPidI(uint16_t d) { return cfgGetU16(NVS_CONFIG_PID_I, d); }
inline uint16_t getPidD(uint16_t d) { return cfgGetU16(NVS_CONFIG_PID_D, d); }
inline uint32_t getVrFrequency(uint32_t d) { return (uint32_t) cfgGetU64(NVS_CONFIG_VR_FREQUENCY, d); }
// OTP Replay-Protection state (last_step + 3-bit mask)
inline void getOTPReplayState(int64_t& base_step, uint8_t& mask) {
base_step = (int64_t) cfgGetU64(NVS_CONFIG_OTP_LAST_STEP, 0ULL);
mask = (uint8_t) cfgGetU16(NVS_CONFIG_OTP_USED_MASK, 0);
}
inline void setOTPReplayState(int64_t base_step, uint8_t mask) {
cfgSetU64(NVS_CONFIG_OTP_LAST_STEP, (uint64_t) base_step);
cfgSetU16(NVS_CONFIG_OTP_USED_MASK, (uint16_t)(mask & 0x07));
}
inline void setOTPSecret(const char* value) { cfgSetStr(NVS_CONFIG_OTP_SECRET, value); }
inline char* getOTPSecret() { return cfgGetStrAlloc(NVS_CONFIG_OTP_SECRET, ""); }
inline void setOTTBootId(uint32_t boot_id) { cfgSetU64(NVS_CONFIG_OTP_BOOT_ID, boot_id); }
inline uint32_t getOTPBootId() { return (uint32_t) cfgGetU64(NVS_CONFIG_OTP_BOOT_ID, 0); }
inline void setOTPSessionKey(const char* value) { cfgSetStr(NVS_CONFIG_OTP_SESSION_KEY, value); }
inline char* getOTPSessionKey() { return cfgGetStrAlloc(NVS_CONFIG_OTP_SESSION_KEY, ""); }
inline void setOTPEnabled(bool value) { cfgSetU16(NVS_CONFIG_OTP_ENABLED, value ? 1 : 0); }
inline bool isOTPEnabled() { return cfgGetU16(NVS_CONFIG_OTP_ENABLED, 0) != 0; }
// 0 = disabled, 1 = Basic (address present), 2 = Extended (address present + fee <= maxFee)
inline void setCoinbaseVerifyMode(int pool, uint16_t v) {
pool == 0 ? cfgSetU16(NVS_CONFIG_COINBASE_VERIFY_MODE, v)
: cfgSetU16(NVS_CONFIG_FB_COINBASE_VERIFY_MODE, v);
}
inline uint16_t getCoinbaseVerifyMode(int pool = 0) {
return pool == 0 ? cfgGetU16(NVS_CONFIG_COINBASE_VERIFY_MODE, 0)
: cfgGetU16(NVS_CONFIG_FB_COINBASE_VERIFY_MODE, 0);
}
inline void setCoinbaseMaxFee(int pool, uint16_t v) {
pool == 0 ? cfgSetU16(NVS_CONFIG_COINBASE_MAX_FEE, v)
: cfgSetU16(NVS_CONFIG_FB_COINBASE_MAX_FEE, v);
}
// stored as tenths of percent: 5 = 0.5%, 30 = 3.0%
inline uint16_t getCoinbaseMaxFee(int pool = 0) {
return pool == 0 ? cfgGetU16(NVS_CONFIG_COINBASE_MAX_FEE, 30)
: cfgGetU16(NVS_CONFIG_FB_COINBASE_MAX_FEE, 30);
}
inline void setCoinbaseVerifyForce(int pool, bool v) {
pool == 0 ? cfgSetU16(NVS_CONFIG_COINBASE_VERIFY_FORCE, v ? 1 : 0)
: cfgSetU16(NVS_CONFIG_FB_COINBASE_VERIFY_FORCE, v ? 1 : 0);
}
inline bool getCoinbaseVerifyForce(int pool = 0) {
return pool == 0 ? cfgGetU16(NVS_CONFIG_COINBASE_VERIFY_FORCE, 0) != 0
: cfgGetU16(NVS_CONFIG_FB_COINBASE_VERIFY_FORCE, 0) != 0;
}
void migrate_config();
}