diff --git a/backend/recorder_adapters/extron_smp.py b/backend/recorder_adapters/extron_smp.py index 47326e7..b52a380 100644 --- a/backend/recorder_adapters/extron_smp.py +++ b/backend/recorder_adapters/extron_smp.py @@ -63,6 +63,7 @@ class SMP35x(TelnetAdapter, RecorderAdapter): Input_4 (int): The input number for Input 4. Input_5 (int): The input number for Input 5. """ + INPUT_1 = 1 INPUT_2 = 2 INPUT_3 = 3 @@ -77,9 +78,50 @@ class SMP35x(TelnetAdapter, RecorderAdapter): A (int): The first output channel. B (int): The second output channel. """ + A = 1 # channel A B = 2 # channel B + class UserEncoderLayoutPresetNumber(enum.IntEnum): + """ + An enumeration representing the available user encoder layout preset numbers. + + Attributes: + PRESET_1 (int): The preset number for layout 1. + PRESET_2 (int): The preset number for layout 2. + PRESET_3 (int): The preset number for layout 3. + PRESET_4 (int): The preset number for layout 4. + PRESET_5 (int): The preset number for layout 5. + PRESET_6 (int): The preset number for layout 6. + PRESET_7 (int): The preset number for layout 7. + PRESET_8 (int): The preset number for layout 8. + PRESET_9 (int): The preset number for layout 9. + PRESET_10 (int): The preset number for layout 10. + PRESET_11 (int): The preset number for layout 11. + PRESET_12 (int): The preset number for layout 12. + PRESET_13 (int): The preset number for layout 13. + PRESET_14 (int): The preset number for layout 14. + PRESET_15 (int): The preset number for layout 15. + PRESET_16 (int): The preset number for layout 16. + """ + + PRESET_1 = 1 + PRESET_2 = 2 + PRESET_3 = 3 + PRESET_4 = 4 + PRESET_5 = 5 + PRESET_6 = 6 + PRESET_7 = 7 + PRESET_8 = 8 + PRESET_9 = 9 + PRESET_10 = 10 + PRESET_11 = 11 + PRESET_12 = 12 + PRESET_13 = 13 + PRESET_14 = 14 + PRESET_15 = 15 + PRESET_16 = 16 + class AudioChannels(enum.IntEnum): """ Enum representing the available audio channels on the Extron SMP recorder. @@ -632,7 +674,9 @@ class SMP35x(TelnetAdapter, RecorderAdapter): ### File related stuff not implemented. (-> use sftp) - def set_input(self, input_num: Union[InputNumber, int], channel_num: Union[OutputChannel, int]): + def set_input( + self, input_num: Union[InputNumber, int], channel_num: Union[OutputChannel, int] + ): """ Switches input # (1 to 5) to output channel (1=A [input 1 and 2], 2=B [input 3, 4 and 5]) :param input_num: @@ -662,7 +706,7 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write(f"{channel_num}!\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_input_format(self, input_num: int, input_format: int): + def set_input_format(self, input_num: Union[InputNumber, int], input_format: int): """ Sets the input to the format, where the input_format parameter may be: 1 = YUVp / HDTV (default) @@ -672,22 +716,42 @@ class SMP35x(TelnetAdapter, RecorderAdapter): :param input_format: :return: """ - if input_num not in range(1, 6): - raise LrcException("input_num must be a value between 1 and 5!") + input_num = self._get_number_from_enum(input_num, SMP35x.InputNumber) if input_format not in range(1, 4): raise LrcException("input_num must be a value between 1 and 3!") self.tn.write(f"{input_num}*{input_format}\\\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_input_format(self, input_num: int): - if input_num not in range(1, 6): - raise LrcException("input_num must be a value between 1 and 5!") + def get_input_format(self, input_num: Union[InputNumber, int]): + """ + Get the input format for the specified input number. + + Args: + input_num (Union[InputNumber, int]): The input number to get the format for. + + Returns: + str: The input format for the specified input number. + """ + input_num = self._get_number_from_enum(input_num, SMP35x.InputNumber) self.tn.write(f"{input_num}\\\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_input_name(self, input_num: int, input_name: str): - if input_num not in range(1, 6): - raise LrcException("input_num must be a value between 1 and 5!") + def set_input_name(self, input_num: Union[InputNumber, int], input_name: str): + """ + Sets the name of the specified input on the Extron SMP device. + + Args: + input_num (Union[InputNumber, int]): The input number to set the name for. + input_name (str): The name to set for the input. Must be no longer than + 16 characters and only contain ASCII characters. + + Returns: + str: The response from the device after setting the input name. + Raises: + LrcException: If the input_name is longer than + 16 characters or contains non-ASCII characters. + """ + input_num = self._get_number_from_enum(input_num, SMP35x.InputNumber) if len(input_name) > 16: raise LrcException("input_name must be no longer than 16 chars") try: @@ -697,13 +761,29 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write(f"{self.esc_char}{input_num},{input_name}NI\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_input_name(self, input_num: int): - if input_num not in range(1, 6): - raise LrcException("input_num must be a value between 1 and 5!") + def get_input_name(self, input_num: Union[InputNumber, int]) -> str: + """ + Sends a command to the Extron SMP device to retrieve the name of the input + corresponding to the given input number. Returns the name of the input as a string. + + Args: + input_num (Union[InputNumber, int]): The number of the input to retrieve the name for. + + Returns: + str: The name of the input as a string. + """ + input_num = self._get_number_from_enum(input_num, SMP35x.InputNumber) self.tn.write(f"{self.esc_char}{input_num}NI\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_input_selction_per_channel(self): + def get_input_selection_per_channel(self): + """ + Sends a command to the Extron SMP device to get the + input selection per channel and returns the response. + + Returns: + str: The response from the device. + """ self.tn.write("32I\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) @@ -830,25 +910,74 @@ class SMP35x(TelnetAdapter, RecorderAdapter): ### Metadata part skipped - def recall_user_preset(self, channel_number: int, preset_number: int): - if channel_number not in range(1, 3): - raise LrcException("channel_number must be a value between 1 and 2!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def recall_user_preset( + self, + channel_number: Union["SMP35x.OutputChannel", int], + preset_number: Union["SMP35x.UserEncoderLayoutPresetNumber", int], + ): + """ + Recalls a user preset on the specified channel. + + Args: + channel_number (Union[SMP35x.OutputChannel, int]): The channel number to recall the preset on. + preset_number (Union[SMP35x.UserEncoderLayoutPresetNumber, int]): The preset number to recall. + + Returns: + str: The response from the device. + """ + channel_number = self._get_number_from_enum( + channel_number, SMP35x.OutputChannel + ) + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"1*{channel_number}*{preset_number}.\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def save_user_preset(self, channel_number: int, preset_number: int): - if channel_number not in range(1, 3): - raise LrcException("channel_number must be a value between 1 and 2!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def save_user_preset( + self, + channel_number: Union["SMP35x.OutputChannel", int], + preset_number: Union["SMP35x.UserEncoderLayoutPresetNumber", int], + ): + """ + Saves a user preset for the specified channel number and preset number. + + Args: + channel_number (Union[SMP35x.OutputChannel, int]): The channel number to save the preset for. + preset_number (Union[SMP35x.UserEncoderLayoutPresetNumber, int]): The preset number to save the preset to. + + Returns: + str: The response string from the Telnet server. + """ + channel_number = self._get_number_from_enum( + channel_number, SMP35x.OutputChannel + ) + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"1*{channel_number}*{preset_number},\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_user_preset_name(self, preset_number: int, preset_name: str): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def set_user_preset_name( + self, + preset_number: Union["SMP35x.UserEncoderLayoutPresetNumber", int], + preset_name: str, + ): + """ + Sets the name of a user encoder layout preset on the Extron SMP device. + + Args: + preset_number (Union[SMP35x.UserEncoderLayoutPresetNumber, int]): + The number of the preset to set the name for. + preset_name (str): The name to set for the preset. + Must be no longer than 16 characters and only contain ASCII characters. + + Returns: + str: The response from the device after setting the preset name. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) if len(preset_name) > 16: raise LrcException("preset_name must be no longer than 16 chars") try: @@ -860,37 +989,106 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write(f"{self.esc_char}1*{preset_number},{preset_name}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_user_preset_name(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def get_user_preset_name( + self, preset_number: Union["SMP35x.UserEncoderLayoutPresetNumber", int] + ): + """ + Retrieves the name of a user encoder layout preset from the Extron SMP device. + + Args: + preset_number (Union[SMP35x.UserEncoderLayoutPresetNumber, int]): + The number of the preset to retrieve. + + Returns: + str: The name of the specified user encoder layout preset. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}1*{preset_number}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_user_presets(self, input_number: int): - if input_number not in range(1, 6): - raise LrcException("input_number must be a value between 1 and 5!") + def get_user_presets(self, input_number: Union[InputNumber, int]): + """ + Retrieves the user presets for the specified input number. + + Args: + input_number (Union[InputNumber, int]): The input number to retrieve user presets for. + + Returns: + str: The response string from the device. + """ + input_number = self._get_number_from_enum(input_number, SMP35x.InputNumber) self.tn.write(f"52*{input_number}#\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) # Input Presets - def recall_input_preset(self, channel_number: int, preset_number: int): - if channel_number not in range(1, 3): - raise LrcException("channel_number must be a value between 1 and 2!") - if preset_number not in range(1, 129): + def recall_input_preset( + self, + channel_number: Union["SMP35x.OutputChannel", int], + input_preset_number: int, + ): + """ + Recalls an input preset on the specified channel. + + Args: + channel_number (Union[SMP35x.OutputChannel, int]): + The channel number to recall the input preset on. + input_preset_number (int): The input preset number to recall. + + Raises: + LrcException: If the input preset number is not between 1 and 128. + + Returns: + str: The response from the device. + """ + channel_number = self._get_number_from_enum( + channel_number, SMP35x.OutputChannel + ) + if input_preset_number not in range(1, 129): raise LrcException("preset_number must be a value between 1 and 128!") - self.tn.write(f"2*{channel_number}*{preset_number}.\n") + self.tn.write(f"2*{channel_number}*{input_preset_number}.\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def save_input_preset(self, channel_number: int, preset_number: int): - if channel_number not in range(1, 3): - raise LrcException("channel_number must be a value between 1 and 2!") - if preset_number not in range(1, 129): - raise LrcException("preset_number must be a value between 1 and 128!") - self.tn.write(f"1*{channel_number}*{preset_number},\n") - return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) + def save_input_preset( + self, + channel_number: Union["SMP35x.OutputChannel", int], + input_preset_number: int, + ): + """ + Saves the current input configuration as a preset on the specified channel. - def set_input_preset_name(self, preset_number: int, preset_name: str): - if preset_number not in range(1, 129): + Args: + channel_number (Union[SMP35x.OutputChannel, int]): + The channel number to save the preset on. + input_preset_number (int): The preset number to save the input configuration to. + + Raises: + LrcException: If the input_preset_number is not between 1 and 128. + + Returns: + str: The response from the device. + """ + + def set_input_preset_name(self, input_preset_number: int, preset_name: str): + """ + Sets the name of an input preset on the Extron SMP recorder. + + Args: + input_preset_number (int): The number of the input preset to set the name for. + Must be a value between 1 and 128. + preset_name (str): The name to set for the input preset. Must be a string of + ASCII characters no longer than 16 characters. + + Returns: + str: The response string returned by the Extron SMP recorder after setting + the input preset name. + + Raises: + LrcException: If the input_preset_number is not between 1 and 128, or if the + preset_name is longer than 16 characters or contains non-ASCII characters. + """ + if input_preset_number not in range(1, 129): raise LrcException("preset_number must be a value between 1 and 128!") if len(preset_name) > 16: raise LrcException("preset_name must be no longer than 16 chars") @@ -900,19 +1098,41 @@ class SMP35x(TelnetAdapter, RecorderAdapter): raise LrcException( "preset_name must only contain ascii characters" ) from exc - self.tn.write(f"{self.esc_char}2*{preset_number},{preset_name}PNAM\n") + self.tn.write(f"{self.esc_char}2*{input_preset_number},{preset_name}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_input_preset_name(self, preset_number: int): - if preset_number not in range(1, 129): + def get_input_preset_name(self, input_preset_number: int): + """ + Retrieves the name of the input preset with the given number. + + Args: + input_preset_number (int): The number of the input preset to retrieve the name of. + Must be a value between 1 and 128. + + Returns: + str: The name of the input preset. + + Raises: + LrcException: If the input_preset_number is not a value between 1 and 128. + """ + if input_preset_number not in range(1, 129): raise LrcException("preset_number must be a value between 1 and 128!") - self.tn.write(f"{self.esc_char}2*{preset_number}PNAM\n") + self.tn.write(f"{self.esc_char}2*{input_preset_number}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def delete_input_preset(self, preset_number: int): - if preset_number not in range(1, 129): + def delete_input_preset(self, input_preset_number: int): + """ + Deletes the input preset with the given number. + + Args: + input_preset_number (int): The number of the input preset to delete. Must be a value between 1 and 128. + + Returns: + str: The response from the device after attempting to delete the input preset. + """ + if input_preset_number not in range(1, 129): raise LrcException("preset_number must be a value between 1 and 128!") - self.tn.write(f"{self.esc_char}X2*{preset_number}PRST\n") + self.tn.write(f"{self.esc_char}X2*{input_preset_number}PRST\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) def get_input_presets(self): @@ -924,7 +1144,11 @@ class SMP35x(TelnetAdapter, RecorderAdapter): return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) # Streaming Presets - def recall_streaming_preset(self, output_number: int, preset_number: int): + def recall_streaming_preset( + self, + output_number: int, + preset_number: Union[UserEncoderLayoutPresetNumber, int], + ): """ Output_number: 1 = Channel A @@ -936,12 +1160,17 @@ class SMP35x(TelnetAdapter, RecorderAdapter): """ if output_number not in range(1, 4): raise LrcException("output_number must be a value between 1 and 3!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"3*{output_number}*{preset_number}.\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def save_streaming_preset(self, output_number: int, preset_number: int): + def save_streaming_preset( + self, + output_number: int, + preset_number: Union[UserEncoderLayoutPresetNumber, int], + ): """ Output_number: 1 = Channel A @@ -953,14 +1182,34 @@ class SMP35x(TelnetAdapter, RecorderAdapter): """ if output_number not in range(1, 4): raise LrcException("output_number must be a value between 1 and 3!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"3*{output_number}*{preset_number},\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_streaming_preset_name(self, preset_number: int, preset_name: str): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def set_streaming_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int], preset_name: str + ): + """ + Sets the name of a streaming preset on the Extron SMP device. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to set the name for. + preset_name (str): The name to set for the preset. + Must be no longer than 16 characters and contain only ASCII characters. + + Raises: + LrcException: If the preset_name is longer + than 16 characters or contains non-ASCII characters. + + Returns: + str: The response from the Extron SMP device. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) if len(preset_name) > 16: raise LrcException("preset_name must be no longer than 16 chars") try: @@ -972,20 +1221,48 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write(f"{self.esc_char}3*{preset_number},{preset_name}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_streaming_preset_name(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def get_streaming_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Retrieves the name of the streaming preset associated with the given preset number. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): The preset number or enum value. + + Returns: + str: The name of the streaming preset. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}3*{preset_number}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def reset_streaming_preset_to_default(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def reset_streaming_preset_to_default( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Resets the streaming preset to its default settings. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): The preset number to reset. + + Returns: + str: The response from the device. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}X3*{preset_number}PRST\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) # Encoder Presets - def recall_encoder_preset(self, output_number: int, preset_number: int): + def recall_encoder_preset( + self, + output_number: int, + preset_number: Union[UserEncoderLayoutPresetNumber, int], + ): """ Output_number: 1 = Channel A @@ -997,12 +1274,17 @@ class SMP35x(TelnetAdapter, RecorderAdapter): """ if output_number not in range(1, 4): raise LrcException("output_number must be a value between 1 and 3!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"4*{output_number}*{preset_number}.\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def save_encoder_preset(self, output_number: int, preset_number: int): + def save_encoder_preset( + self, + output_number: int, + preset_number: Union[UserEncoderLayoutPresetNumber, int], + ): """ Output_number: 1 = Channel A @@ -1014,14 +1296,33 @@ class SMP35x(TelnetAdapter, RecorderAdapter): """ if output_number not in range(1, 4): raise LrcException("output_number must be a value between 1 and 3!") - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"4*{output_number}*{preset_number},\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_encoder_preset_name(self, preset_number: int, preset_name: str): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def set_encoder_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int], preset_name: str + ): + """ + Sets the name of an encoder preset on the Extron SMP device. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to set the name for. + preset_name (str): The name to set for the preset. + Must be no longer than 16 characters and only contain ASCII characters. + + Returns: + str: The response from the device after setting the preset name. + Raises: + LrcException: If the preset_name is longer + than 16 characters or contains non-ASCII characters. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) if len(preset_name) > 16: raise LrcException("preset_name must be no longer than 16 chars") try: @@ -1033,39 +1334,113 @@ class SMP35x(TelnetAdapter, RecorderAdapter): self.tn.write(f"{self.esc_char}4*{preset_number},{preset_name}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_encoder_preset_name(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def get_encoder_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Sends a command to the Extron SMP device to retrieve the name of the encoder preset + associated with the given preset number. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): The preset number to + retrieve the name for. This can be either an integer or a value from the + UserEncoderLayoutPresetNumber enum. + + Returns: + str: The name of the encoder preset associated with the given preset number. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}4*{preset_number}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def reset_encoder_preset_to_default(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def reset_encoder_preset_to_default( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Resets the specified encoder preset to its default settings. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to reset. + + Returns: + str: The response from the device after sending the reset command. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}X4*{preset_number}PRST\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) # Layout Presets - def save_layout_preset(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + + def save_layout_preset( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Saves the current layout as a preset with the given number. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to save. + This can be either an integer or a + value from the UserEncoderLayoutPresetNumber enum. + + Returns: + str: The response from the device after sending the save command. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"7*{preset_number},\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) def recall_layout_preset( - self, preset_number: int, include_input_selections: bool = True + self, + preset_number: Union[UserEncoderLayoutPresetNumber, int], + include_input_selections: bool = True, ): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + """ + Recalls a layout preset on the Extron SMP device. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The preset number to recall. + include_input_selections (bool, optional): + Whether to include input selections in the recall. Defaults to True. + + Returns: + str: The response from the device. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) if include_input_selections: self.tn.write(f"7*{preset_number}.\n") else: self.tn.write(f"8*{preset_number}.\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def set_layout_preset_name(self, preset_number: int, preset_name: str): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def set_layout_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int], preset_name: str + ): + """ + Sets the name of a user encoder layout preset on the Extron SMP device. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to set the name for. + preset_name (str): The name to set for the preset. + Must be no longer than 16 characters and only contain ASCII characters. + + Returns: + str: The response from the device after setting the preset name. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) if len(preset_name) > 16: raise LrcException("preset_name must be no longer than 16 chars") try: @@ -1074,20 +1449,44 @@ class SMP35x(TelnetAdapter, RecorderAdapter): raise LrcException( "preset_name must only contain ascii characters" ) from exc - self.tn.write( - "{}7*{},{}PNAM\n".format(self.esc_char, preset_number, preset_name) - ) + self.tn.write(f"{self.esc_char}7*{preset_number},{preset_name}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def get_layout_preset_name(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def get_layout_preset_name( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Gets the name of the layout preset with the given preset number. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): The preset number + of the layout preset to get the name of. + + Returns: + str: The name of the layout preset with the given preset number. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}7*{preset_number}PNAM\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) - def reset_layout_preset_to_default(self, preset_number: int): - if preset_number not in range(1, 17): - raise LrcException("preset_number must be a value between 1 and 16!") + def reset_layout_preset_to_default( + self, preset_number: Union[UserEncoderLayoutPresetNumber, int] + ): + """ + Resets the layout preset to its default value. + + Args: + preset_number (Union[UserEncoderLayoutPresetNumber, int]): + The number of the preset to reset. + + Returns: + str: The response from the device. + """ + preset_number = self._get_number_from_enum( + preset_number, SMP35x.UserEncoderLayoutPresetNumber + ) self.tn.write(f"{self.esc_char}X7*{preset_number}PRST\n") return TelnetAdapter._get_response_str(self.tn.read_until_non_empty_line()) @@ -1239,13 +1638,12 @@ def main(): print(smp.is_audio_channel_muted(60000)) exit() - smp._login() + # smp._login() print(smp.get_version(verbose_info=False)) print(smp.get_file_transfer_config()) print(smp.save_configuration()) print(smp.restore_configuration()) - return print(smp.get_bootstrap_version()) print(smp.get_part_number()) print(smp.get_model_name()) @@ -1264,7 +1662,7 @@ def main(): print(smp.get_front_panel_lock()) print(smp.get_input_name(1)) - print(smp.get_input_selction_per_channel()) + print(smp.get_input_selection_per_channel()) print(smp.get_recording_status()) print("Preset Name: " + smp.get_user_preset_name(2)) print(smp.get_user_presets(1)) diff --git a/backend/tests/extron_smp_testing.py b/backend/tests/extron_smp_testing.py index b5526ca..866d9dd 100644 --- a/backend/tests/extron_smp_testing.py +++ b/backend/tests/extron_smp_testing.py @@ -13,15 +13,6 @@ pw = "123mzsmp" def print_tn(tn_response): - """ - Prints the given TN response, decoding it if necessary. - - Args: - tn_response (bytes or str): The TN response to print. - - Returns: - None - """ if isinstance(tn_response, bytes): print(tn_response.decode("ascii").rstrip()) else: