aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2022-11-20 12:28:55 +0000
committers-ol <s+removethis@s-ol.nu>2022-11-20 12:53:43 +0000
commit52c781602a35be85e06aa969dae4cb137b2e15bc (patch)
treeb6925c363af94d95f929ee7030639db2e0edafb8
parentdetect & display dev_mode (diff)
downloadfirmware-52c781602a35be85e06aa969dae4cb137b2e15bc.tar.gz
firmware-52c781602a35be85e06aa969dae4cb137b2e15bc.zip
fix profile saving
-rw-r--r--hex33board/__init__.py26
-rw-r--r--hex33board/menu.py48
2 files changed, 43 insertions, 31 deletions
diff --git a/hex33board/__init__.py b/hex33board/__init__.py
index 5caffd9..163fa29 100644
--- a/hex33board/__init__.py
+++ b/hex33board/__init__.py
@@ -199,41 +199,41 @@ class Keyboard:
self.settings.load()
self.mode.update_scale()
- def on_midi_ch_usb(self, ch):
+ def on_midi_ch_usb(self, ch, last):
self.midi_usb.out_channel = ch
- def on_midi_ch_trs(self, ch):
+ def on_midi_ch_trs(self, ch, last):
self.midi_trs.out_channel = ch
- def on_midi_vel(self, vel):
+ def on_midi_vel(self, vel, last):
self.velocity = vel
- def on_rgb_eff(self, effect):
+ def on_rgb_eff(self, effect, last):
self.modes["base"].rgb = RGB_EFFECTS[effect](self)
self.modes["base"].rgb.prepare()
- def on_rgb_bright(self, b):
+ def on_rgb_bright(self, b, last):
self.pixels.brightness = b / 100
- def on_jam_timeout(self, t):
+ def on_jam_timeout(self, t, last):
self.jam_timeout = t * 1000
- def on_layout(self, v):
+ def on_layout(self, v, last):
name = self.settings.get('layout_name').value
offset = self.settings.get('layout_offset').value
self.layout = LAYOUTS[name](offset)
self.modes["base"].update_scale()
- def on_flip(self, flip):
+ def on_flip(self, flip, last):
self.display.rotation = 0 if flip else 180
self.flip = flip
for key in self.modes["base"].keys:
key.update_pos()
- self.on_layout(None)
+ self.on_layout(None, None)
- def on_i2c(self, v):
+ def on_i2c(self, v, last):
if self.i2c:
self.i2c.deinit()
@@ -249,15 +249,15 @@ class Keyboard:
else:
raise ValueError("unknown i2c mode")
- def on_scale(self, v):
+ def on_scale(self, v, last):
name = self.settings.get('scale_name').value
root = self.settings.get('scale_root').value
self.scale = Scale(root, Scale.STEPS[name], name)
self.modes["base"].update_scale()
self.modes["base_shift"].update_display()
- def on_profile(self, profile):
- self.settings.store()
+ def on_profile(self, profile, last):
+ self.settings.store(last)
self.settings.load(profile)
@property
diff --git a/hex33board/menu.py b/hex33board/menu.py
index f7db1ff..34984c1 100644
--- a/hex33board/menu.py
+++ b/hex33board/menu.py
@@ -151,8 +151,9 @@ class ChoiceSetting(SliderSetting):
class Settings:
settings: dict[str, Setting]
- def __init__(self, settings: dict[str, Setting]):
+ def __init__(self, settings: dict[str, Setting], readonly=False):
self.settings = settings
+ self.readonly = readonly
self.change_handlers = {}
def on(self, id: str, fn):
@@ -160,8 +161,8 @@ class Settings:
raise ValueError("already have a handler for {}".format(id))
self.change_handlers[id] = fn
- def dispatch(self, id: str):
- self.change_handlers[id](self.settings[id].value)
+ def dispatch(self, id: str, last_val=None):
+ self.change_handlers[id](self.settings[id].value, last_val)
def get(self, id: str) -> Setting:
return self.settings[id]
@@ -169,11 +170,12 @@ class Settings:
def load(self, i=0):
order = ["layout_name", "layout_offset", "scale_name", "scale_root", "flip"]
for id in self.settings:
- if id not in order:
- order.append(id)
+ if id not in order:
+ order.append(id)
try:
with open(f'profile{i}.hex.json', 'r') as f:
+ print(f"loading profile{i}")
data = json.load(f)
for id in order:
if id in data:
@@ -182,25 +184,32 @@ class Settings:
if id != 'active_profile':
self.dispatch(id)
except OSError:
+ print(f"couldn't load profile{i}, falling back to defaults")
for id in order:
if id != 'active_profile':
self.dispatch(id)
self.settings['active_profile'].value = i
- def store(self):
+ def store(self, i=None):
+ if i == None:
+ i = self.settings['active_profile'].value
+
+ if self.readonly:
+ print(f"readonly, skipped storing profile{i}")
+ return
+
data = {}
for id in self.settings:
if id != 'active_profile':
data[id] = self.settings[id].value
try:
- i = self.settings['active_profile'].value
with open(f'profile{i}.hex.json', 'w') as f:
+ print(f"storing profile{i}")
json.dump(data, f)
- except OSError:
- pass
- pass
+ except OSError as e:
+ print("error while storing:", e)
class MenuMode(Mode):
@@ -305,20 +314,23 @@ class MenuMode(Mode):
self.update_display()
return True
+ last_val = self.setting.value
+ handled = False
+
if 23 < i < 48:
self.setting.press_key(i - 24)
- self.update_display()
- self.settings.dispatch(self.setting_id)
- return True
+ handled = True
if i == Key.PREV_I:
self.setting.press_prev()
- self.update_display()
- self.settings.dispatch(self.setting_id)
- return True
+ handled = True
if i == Key.NEXT_I:
self.setting.press_next()
+ handled = True
+
+ if handled:
self.update_display()
- self.settings.dispatch(self.setting_id)
- return True
+ self.settings.dispatch(self.setting_id, last_val)
+
+ return handled