-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nvram.py
128 lines (101 loc) · 4.97 KB
/
nvram.py
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
import microcontroller
class NVRAMValue:
def __init__(self, index: int, default = None, name: str = None):
self.index = index
self.default = default
self.value = default
self.has_read = False
self.name = name
def nvram_to_native(self, nvram_value: int):
raise NotImplementedError()
def native_to_nvram(self, native_value) -> int:
raise NotImplementedError()
def get(self):
value = self.value
if not self.has_read:
value = self.read()
return value
def read(self):
nvram_value = microcontroller.nvm[self.index]
self.value = self.default
if nvram_value != 0x0:
self.value = self.nvram_to_native(nvram_value)
self.has_read = True
return self.value
def write(self, native_value: int, only_if_changed: bool = True) -> None:
if not only_if_changed or native_value != self.value:
self.value = native_value
nvram_value = self.native_to_nvram(self.value)
microcontroller.nvm[self.index] = nvram_value
print(f"Wrote {self}")
def reset_to_default(self) -> None:
self.write(self.default)
def __str__(self) -> str:
if self.name is not None:
value = f"NVRAM {self.name}"
else:
value = f"NVRAM #{self.index}"
value += " -> " + str(self.value)
return value
class NVRAMBooleanValue(NVRAMValue):
def __init__(self, index: int, default: bool = None, name: str = None):
super().__init__(index, default, name)
def nvram_to_native(self, nvram_value: int) -> bool:
if nvram_value == 0xFF:
return True
elif nvram_value == 0xF0:
return False
else:
print(f"NVRAM value at index {self.index} isn't known true or false value; using default")
return self.default
def native_to_nvram(self, native_value: bool) -> int:
return 0xFF if native_value else 0xF0
def write(self, native_value: bool, only_if_changed: bool = True) -> None:
super().write(native_value, only_if_changed)
def get(self) -> bool:
return super().get()
def __bool__(self) -> bool:
return self.get()
class NVRAMIntegerValue(NVRAMValue):
def __init__(self, index: int, default: int = None, name: str = None):
super().__init__(index, default, name)
def nvram_to_native(self, nvram_value: int) -> int:
if nvram_value == 0x0:
print(f"NVRAM value is 0x0 which is ambiguous: could be int(0), could be unset, assuming the former")
return int(nvram_value)
def native_to_nvram(self, native_value: int) -> int:
if native_value == 0x0:
print("Using int(0) as an NVRAM value is ambiguous: could be int(0), could be unset, assuming the former")
return native_value
def get(self) -> int:
return super().get()
def __int__(self) -> int:
return self.get()
def __float__(self) -> float:
return float(int(self))
class NVRAMValues:
# True to play piezo sounds, False to not
PIEZO = NVRAMBooleanValue(0, True, "PIEZO")
# Baby Buddy child ID; 0 to autodiscover
CHILD_ID = NVRAMIntegerValue(2, 0, "CHILD_ID")
# How many seconds until backlight dims from user inactivity on most screens
BACKLIGHT_DIM_TIMEOUT = NVRAMIntegerValue(3, 30, "BACKLIGHT_DIM_TIMEOUT")
# How many seconds until the piezo makes a warning tone (repeating)
IDLE_WARNING = NVRAMIntegerValue(4, 60, "IDLE_WARNING")
# Bitmask of food types to enable in the feeding menu for flow.py; default is all
ENABLED_FOOD_TYPES_MASK = NVRAMIntegerValue(5, 0x1 + 0x2 + 0x4 + 0x8, "ENABLED_FOOD_TYPES_MASK")
# True to work offline; requires an RTC and SD card hardware
OFFLINE = NVRAMBooleanValue(6, False, "OFFLINE")
# True to force the RTC to update at next boot; use only for debugging
FORCE_RTC_UPDATE = NVRAMBooleanValue(7, False, "FORCE_RTC_UPDATE")
# For soft power control, wake up every N seconds to refresh the battery display, then go back to sleep. This is only applicable when running on battery; when
# charging, the refresh is much more often.
SOFT_SHUTDOWN_BATTERY_REFRESH_INTERVAL = NVRAMIntegerValue(8, 60 * 10, "SOFT_SHUTDOWN_BATTERY_REFRESH_INTERVAL")
# False (default) means this BabyPod doesn't use the Sparkfun LCD or hasn't configured some of its flags yet, or
# True if flags are configured and don't need to be reconfigured. No effect for the Adafruit LCD.
HAS_CONFIGURED_SPARKFUN_LCD = NVRAMBooleanValue(9, False, "HAS_CONFIGURED_SPARKFUN_LCD")
# How frequently in seconds to check for a MOTD
MOTD_CHECK_INTERVAL = NVRAMIntegerValue(10, 60 * 60 * 6, "MOTD_CHECK_INTERVAL")
# Soft shutdown after this many seconds of being idle and not in a timer; only has an effect if soft shutdown
# is enabled
IDLE_SHUTDOWN = NVRAMIntegerValue(11, 60 * 3 - 5, "IDLE_SHUTDOWN") # -5 seconds to avoid the warning triggering right at shutdown