Source code for dlab.hardware.wrappers.powermeter_controller

from typing import Optional, Any, Dict

import pyvisa
from ThorlabsPM100 import ThorlabsPM100


[docs] class PowermeterControllerError(Exception): """Errors raised by PowermeterController."""
[docs] class PowermeterController: def __init__(self, powermeter_id: str) -> None: """ Parameters ---------- powermeter_id : str VISA resource string, e.g. 'USB0::0x1313::0x8078::P0045634::INSTR' """ self.powermeter_id = powermeter_id self._rm: Optional[pyvisa.ResourceManager] = None self.instrument: Optional[pyvisa.resources.MessageBasedResource] = None self.power_meter: Optional[ThorlabsPM100] = None
[docs] def activate(self) -> None: """Open VISA resource and initialize ThorlabsPM100.""" try: self._rm = pyvisa.ResourceManager() self.instrument = self._rm.open_resource(self.powermeter_id) self.power_meter = ThorlabsPM100(inst=self.instrument) self.set_auto_range(1) # default ON except Exception as e: self.power_meter = None self.instrument = None raise PowermeterControllerError(f"Failed to activate powermeter: {e}") from e
[docs] def deactivate(self) -> None: """Close the VISA resource.""" try: if self.instrument is not None: self.instrument.close() finally: self.instrument = None self.power_meter = None
[docs] def get_config(self) -> Dict[str, Any]: if self.power_meter is None: raise PowermeterControllerError("Device not active") pm = self.power_meter def _val(x): try: return x() if callable(x) else x except Exception: return None cfg = { "wavelength_nm": _val(pm.sense.correction.wavelength), "averaging_count": _val(pm.sense.average.count), "auto_range": _val(pm.sense.power.dc.range.auto), "lpass_state": _val(pm.input.pdiode.filter.lpass.state), } if hasattr(pm, "getconfigure"): try: cfg["raw_configure"] = pm.getconfigure() except Exception: cfg["raw_configure"] = None return cfg
[docs] def read_power(self) -> float: """ Trigger a measurement and return power in Watts (blocking). """ if self.power_meter is None: raise PowermeterControllerError("Device not active") try: return float(self.power_meter.read) except Exception as e: raise PowermeterControllerError(f"read_power failed: {e}") from e
[docs] def fetch_power(self) -> float: """ Return the last measured power in Watts. """ if self.power_meter is None: raise PowermeterControllerError("Device not active") try: return float(self.power_meter.fetch) except Exception as e: raise PowermeterControllerError(f"fetch_power failed: {e}") from e
[docs] def set_auto_range(self, auto_range: int | bool) -> None: """ Enable/disable autoranging. """ if self.power_meter is None: raise PowermeterControllerError("Device not active") val = "ON" if bool(auto_range) else "OFF" try: self.power_meter.sense.power.dc.range.auto = val except Exception as e: raise PowermeterControllerError(f"set_auto_range failed: {e}") from e
[docs] def set_avg(self, no_avg: int) -> None: """Set the averaging count.""" if self.power_meter is None: raise PowermeterControllerError("Device not active") if not isinstance(no_avg, int) or no_avg <= 0: raise ValueError("Averaging count must be a positive integer") try: self.power_meter.sense.average.count = no_avg except Exception as e: raise PowermeterControllerError(f"set_avg failed: {e}") from e
[docs] def set_wavelength(self, wavelength: float) -> None: """Set operating wavelength in nm.""" if self.power_meter is None: raise PowermeterControllerError("Device not active") try: self.power_meter.sense.correction.wavelength = float(wavelength) except Exception as e: raise PowermeterControllerError(f"set_wavelength failed: {e}") from e
[docs] def set_bandwidth(self, bandwidth: str) -> None: """ Set bandwidth: "high" or "low". """ if self.power_meter is None: raise PowermeterControllerError("Device not active") mode = (bandwidth or "").strip().lower() try: if mode == "high": self.power_meter.input.pdiode.filter.lpass.state = 0 elif mode == "low": self.power_meter.input.pdiode.filter.lpass.state = 1 else: raise ValueError("bandwidth must be 'high' or 'low'") except Exception as e: raise PowermeterControllerError(f"set_bandwidth failed: {e}") from e