diff --git a/ltamp/ltAmpAsync.py b/ltamp/ltAmpAsync.py index 6238af5..980853f 100644 --- a/ltamp/ltAmpAsync.py +++ b/ltamp/ltAmpAsync.py @@ -25,6 +25,7 @@ class LtAmpAsync(LtAmpBase): - request_firmware_version() request firmware version from amp - set_preset(idx) change preset slot - request_current_preset() ask amp for current preset (status event) + retrieve_preset(idx) retrieve preset from amp (status event) - set_qa_slots(idx[]) set QA slots (footswitch assignments) - request_qa_slots() request QA slots from amp (status event) - audition_preset(preset_json) audition a preset @@ -47,6 +48,7 @@ class LtAmpAsync(LtAmpBase): self.loop = asyncio.get_event_loop() self._cs_event = asyncio.Event() # connection status self._fw_event = asyncio.Event() # firmware + self._cps_event = asyncio.Event() # current preset self._ps_event = asyncio.Event() # preset self._qa_event = asyncio.Event() # quick access self._aud_event = asyncio.Event() # audition @@ -74,14 +76,24 @@ class LtAmpAsync(LtAmpBase): async def request_current_preset(self): self._last_preset = None - self._ps_event.clear() + self._cps_event.clear() request_current_preset(self.device) try: - await asyncio.wait_for(self._ps_event.wait(), timeout=self.timeout) + await asyncio.wait_for(self._cps_event.wait(), timeout=self.timeout) return self._last_preset except asyncio.TimeoutError: raise TimeoutError("No current preset response received within timeout window.") + async def retrieve_preset(self, idx): + self._last_preset_json = None + self._ps_event.clear() + retrieve_preset(self.device, idx) + try: + await asyncio.wait_for(self._ps_event.wait(), timeout=self.timeout) + return self._last_preset_json + except asyncio.TimeoutError: + raise TimeoutError("No preset retrieval response received within timeout window.") + async def request_firmware_version(self): self._last_firmware_version = None self._fw_event.clear() diff --git a/ltamp/ltAmpBase.py b/ltamp/ltAmpBase.py index a681b6c..f6fa69d 100644 --- a/ltamp/ltAmpBase.py +++ b/ltamp/ltAmpBase.py @@ -29,6 +29,7 @@ class LtAmpBase: self._stop_event = threading.Event() self._cs_event = threading.Event() # connection status self._fw_event = threading.Event() # firmware + self._cps_event = threading.Event() # current preset self._ps_event = threading.Event() # preset self._qa_event = threading.Event() # quick access self._aud_event = threading.Event() # audition @@ -111,6 +112,11 @@ class LtAmpBase: preset_json = msg.currentPresetStatus.currentPresetData preset_index = msg.currentPresetStatus.currentSlotIndex self._last_preset = {"data": preset_json, "index": preset_index} + self._set_event(self._cps_event) + elif msg.HasField("presetJSONMessage"): + preset_json = msg.presetJSONMessage.data + preset_index = msg.presetJSONMessage.slotIndex + self._last_preset_json = {"data": preset_json, "index": preset_index} self._set_event(self._ps_event) elif msg.HasField("firmwareVersionStatus"): version = msg.firmwareVersionStatus.version diff --git a/ltamp/ltAmpSync.py b/ltamp/ltAmpSync.py index 1e95e53..b5df47d 100644 --- a/ltamp/ltAmpSync.py +++ b/ltamp/ltAmpSync.py @@ -23,7 +23,9 @@ class LtAmp(LtAmpBase): request_connection_status() request connection status (status event) - request_firmware_version() request firmware version from amp - set_preset(idx) change preset slot + retrieve_preset(idx) retrieve preset from amp (status event) - request_current_preset() ask amp for current preset (status event) + retrieve_preset(idx) retrieve preset from amp (status event) - set_qa_slots(idx[]) set QA slots (footswitch assignments) - request_qa_slots() request QA slots from amp (status event) - audition_preset(preset_json) audition a preset @@ -51,13 +53,22 @@ class LtAmp(LtAmpBase): def request_current_preset(self): self._last_preset = None - self._ps_event.clear() + self._cps_event.clear() request_current_preset(self.device) - if self._ps_event.wait(timeout=self.timeout): + if self._cps_event.wait(timeout=self.timeout): return self._last_preset else: raise TimeoutError("No current preset response received within timeout window.") + def retrieve_preset(self, idx): + self._last_preset_json = None + self._ps_event.clear() + retrieve_preset(self.device, idx) + if self._ps_event.wait(timeout=self.timeout): + return self._last_preset_json + else: + raise TimeoutError("No preset retrieval response received within timeout window.") + def request_firmware_version(self): self._last_firmware_version = None self._fw_event.clear() diff --git a/ltamp/protocol/__init__.py b/ltamp/protocol/__init__.py index 3aceade..70f0750 100644 --- a/ltamp/protocol/__init__.py +++ b/ltamp/protocol/__init__.py @@ -27,6 +27,7 @@ from .UsbGainRequest_pb2 import UsbGainRequest from .ConnectionStatusRequest_pb2 import ConnectionStatusRequest from .LT4FootswitchModeRequest_pb2 import LT4FootswitchModeRequest from .ProductIdentificationRequest_pb2 import ProductIdentificationRequest +from .RetrievePreset_pb2 import RetrievePreset def send_message(device, msg): """ @@ -102,6 +103,9 @@ def request_current_preset(device): def set_preset(device, preset_index): send_message(device, _msg(loadPreset=LoadPreset(presetIndex=preset_index))) +def retrieve_preset(device, preset_index): + send_message(device, _msg(retrievePreset=RetrievePreset(slot=preset_index))) + # --- auditioning --- def audition_preset(device, preset_json):