diff options
| author | s-ol <s+removethis@s-ol.nu> | 2022-11-20 12:28:55 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2022-11-20 12:53:43 +0000 |
| commit | 52c781602a35be85e06aa969dae4cb137b2e15bc (patch) | |
| tree | b6925c363af94d95f929ee7030639db2e0edafb8 | |
| parent | detect & display dev_mode (diff) | |
| download | firmware-52c781602a35be85e06aa969dae4cb137b2e15bc.tar.gz firmware-52c781602a35be85e06aa969dae4cb137b2e15bc.zip | |
fix profile saving
| -rw-r--r-- | hex33board/__init__.py | 26 | ||||
| -rw-r--r-- | hex33board/menu.py | 48 |
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 |
