Source code for seabreeze.pyseabreeze.features.eeprom

from __future__ import annotations

from seabreeze.pyseabreeze.exceptions import SeaBreezeError
from seabreeze.pyseabreeze.features._base import SeaBreezeFeature
from seabreeze.pyseabreeze.protocol import ADCProtocol
from seabreeze.pyseabreeze.protocol import OOIProtocol
from seabreeze.pyseabreeze.types import PySeaBreezeProtocol


# Definition
# ==========
#
[docs]class SeaBreezeEEPROMFeature(SeaBreezeFeature): identifier = "eeprom" def eeprom_read_slot(self, slot_number: int, strip_zero_bytes: bool = False) -> str: raise NotImplementedError("implement in derived class") @classmethod def _func_eeprom_read_slot( cls, protocol: PySeaBreezeProtocol, slot_number: int, *, strip_zero_bytes: bool = False, ) -> str: raise NotImplementedError("implement in derived class")
# OOI spectrometer implementation # =============================== # class SeaBreezeEEPromFeatureOOI(SeaBreezeEEPROMFeature): _required_protocol_cls = OOIProtocol def eeprom_read_slot(self, slot_number: int, strip_zero_bytes: bool = False) -> str: return self._func_eeprom_read_slot( self.protocol, slot_number, strip_zero_bytes=strip_zero_bytes ) @staticmethod def _func_eeprom_read_raw(protocol: PySeaBreezeProtocol, slot_number: int) -> bytes: protocol.send(0x05, slot_number) ret = protocol.receive(size=17, mode="low_speed") if ret[0] != 0x05 or ret[1] != int(slot_number) % 0xFF: raise SeaBreezeError(f"read_eeprom_slot_raw: wrong answer: {ret!r}") return ret @staticmethod def _func_eeprom_read_slot( protocol: PySeaBreezeProtocol, slot_number: int, *, strip_zero_bytes: bool = False, ) -> str: ret = SeaBreezeEEPromFeatureOOI._func_eeprom_read_raw(protocol, slot_number) data = ret[2 : ret[2:].index(0) + 2].decode("utf-8") if not strip_zero_bytes: return data return data.rstrip("\x00") # ADC spectrometer interface implementation # ========================================= # class SeaBreezeEEPromFeatureADC(SeaBreezeEEPROMFeature): _required_protocol_cls = ADCProtocol def eeprom_read_slot(self, slot_number: int, strip_zero_bytes: bool = False) -> str: return self._func_eeprom_read_slot( self.protocol, slot_number, strip_zero_bytes=strip_zero_bytes ) @staticmethod def _func_eeprom_read_raw(protocol: PySeaBreezeProtocol, slot_number: int) -> bytes: protocol.send(0x05, slot_number) ret = protocol.receive(size=17, mode="low_speed") if ret[0] != 0x05 or ret[1] != int(slot_number) % 0xFF: raise SeaBreezeError(f"read_eeprom_slot_raw: wrong answer: {ret!r}") return ret @classmethod def _func_eeprom_read_slot( cls, protocol: PySeaBreezeProtocol, slot_number: int, *, strip_zero_bytes: bool = False, ) -> str: ret = cls._func_eeprom_read_raw(protocol, slot_number) try: end = ret[2:].index(0) + 2 except ValueError: end = len(ret) - 1 data = ret[2:end].decode("utf-8") if not strip_zero_bytes: return data return data.rstrip("\x00")