From f7f41462a8c7095a7bce43e18d83137e031db70e Mon Sep 17 00:00:00 2001 From: Cyril Guilloud on pcsht Date: Mon, 26 Jul 2021 12:06:36 +0200 Subject: [PATCH 1/2] Intraled cold light source support. --- bliss/controllers/intraled.py | 307 ++++++++++++++++++++++++++++++++++ doc/docs/config_intraled.md | 55 ++++++ doc/docs/dev_documentation.md | 2 +- doc/docs/img/intraled5.jpg | Bin 0 -> 38911 bytes doc/mkdocs.yml | 2 + 5 files changed, 365 insertions(+), 1 deletion(-) create mode 100644 bliss/controllers/intraled.py create mode 100644 doc/docs/config_intraled.md create mode 100644 doc/docs/img/intraled5.jpg diff --git a/bliss/controllers/intraled.py b/bliss/controllers/intraled.py new file mode 100644 index 0000000000..e5874217d4 --- /dev/null +++ b/bliss/controllers/intraled.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +# +# This file is part of the bliss project +# +# Copyright (c) 2015-2020 Beamline Control Unit, ESRF +# Distributed under the GNU LGPLv3. See LICENSE for more info. + +""" +FiberOptic Intralux DC-1100 - Cold Light Source +""" + +import time + +from bliss import global_map +from bliss.comm.util import get_comm, SERIAL +from bliss.common.utils import autocomplete_property +from bliss.comm.serial import SerialTimeout + + +TRIGGER_CODES = {"0": "HIGH ACTIVE", "1": "LOW ACTIVE"} + +SOURCE_CODES = {"1": "POTENTIOMETER", "2": "ANALOG IN", "4": "COM PORT"} + +MODUS_CODES = { + "01": "Standby", + "02": "On", + "04": "MultiPort", + "08": "undef", + "16": "Error", +} + +ERROR_CODES = { + "0": "No Error", + "1": "Overheat", + "2": "LED Failure 1", + "4": "LED Failure 2", +} + + +class IntraledController: + """ + Intraled controller + """ + + def __init__(self, config, name): + self.name = name + try: + self.comm = get_comm(config, ctype=SERIAL, timeout=1) + except SerialTimeout as com_exc: + _msg = f"{self.name} Serial Timeout: Cannot connect to Serial : {config}" + raise RuntimeError(_msg) from com_exc + + self.last_status = None + + def send(self, command): + """ + Send a command and check acknowledge from the device. + * Add starting character '>'. + * Add term characters. + * Encode string. + CYRIL [15]: ser0.write_readline(b'>si00100\r\n', eol='\r\n') + Out [15]: b'>si00100' + + Param: + : (str): ex: 'si00100' + + Return: + str: Decoded string with starting char '>' removed. + + """ + formated_command = ">" + command + "\r\n" + formated_command = formated_command.encode() + # print("FC=", formated_command) + + try: + raw_ans = self.comm.write_readline(formated_command, eol=b"\r\n") + except SerialTimeout as com_exc: + _msg = f"{self.name} Serial Timeout: Cannot connect to Serial: {self.comm.__info__()}" + raise RuntimeError(_msg) from com_exc + + # print("RA=", raw_ans) + ans = raw_ans.decode()[1:] + return ans + + def get_intensity(self): + """ + # Get Intensity + # 100 * 0.1 % -> 10% + """ + raw_ans = self.send("gi") + if raw_ans[0:2] == "gi": + raw_val = int(raw_ans[3:]) * 0.1 + ans = float(f"{raw_val:g}") + return ans + else: + raise RuntimeError(f"Error reading intensity (raw_ans={raw_ans})") + + def set_intensity(self, value): + """ + Set I + """ + if value < 0 or value > 100: + raise ValueError(f"Invalid intensity {value}") + + si_cmd = f"si{int(value * 10):05}" + # print("si_cmd=", si_cmd) + si_ans = self.send(si_cmd) + # print("si_ans = ", si_ans) + if si_ans != si_cmd: + print("set_intensity: hummm louche", si_ans, si_cmd) + + def get_fw_version(self): + """ + # Get firwmare version + # 30 * 0.1% -> v3.0 + CYRIL [20]: ser0.write_readline(b">gz\r\n", eol=b"\r\n") + Out [20]: b'>gz00030' + """ + return self.send(">gz") + + def get_temperature(self): + """ + Return: + float: Temperature read from device in degree Celcius. + raw_ans ≈ 'gt00356' + """ + raw_ans = self.send("gt") + if raw_ans[0:2] == "gt": + return float(f"{int(raw_ans[2:]) * 0.1:g}") + else: + raise RuntimeError(f"Error reading temperature (raw_ans={raw_ans}") + + def update_status(self): + """ + Read and decode device status. + raw_ans ≈ 'gs04020' + + Return: + dict: + * trigger: str + * source: str + * modus: str + * error: str + + + CYRIL [10]: with bench(): + ...: ss= il5._controller.get_status() + Execution time: 64ms 525μs + """ + _t0 = time.time() + # print("reading status") + raw_ans = self.send("gs") + if raw_ans[0:2] != "gs": + raise RuntimeError(f"Error reading status (raw_ans={raw_ans})") + + status = dict() + + trigger_code = raw_ans[2:3] + source_code = raw_ans[3:4] + modus_code = raw_ans[4:6] + error_code = raw_ans[6:7] + + status["trigger"] = TRIGGER_CODES[trigger_code] + status["source"] = SOURCE_CODES[source_code] + status["modus"] = MODUS_CODES[modus_code] + status["error"] = ERROR_CODES[error_code] + + self.last_status = status + self.last_status["last_read"] = time.time() + self.last_status["last_duration"] = self.last_status["last_read"] - _t0 + + def get_status(self): + """ + Read status from device (if needed). + Needed means: None or aged of more than 100 ms + """ + if self.last_status is None: + self.update_status() + else: + if time.time() - self.last_status["last_read"] > 0.1: + self.update_status() + + return self.last_status + + def get_param(self, param): + """ + Return: + str: status parameter coresponding to 'param' + """ + return self.get_status()[param] + + +class Intraled: + """ + Intraled interface object. + """ + + def __init__(self, name, config): + self.name = name + self._controller = IntraledController(config, name) + + global_map.register( + self, children_list=[self._controller.comm], tag=f"Intralux:{name}" + ) + + def __info__(self): + """ + Online info + """ + info_str = f"INTRALED {self.name}:\n" + info_str += f" Intensity: {self.intensity} %\n" + info_str += f" Temperature: {self.temperature} °C\n" + info_str += f" Source: {self.source}\n" + info_str += f" Mode: {self.modus}\n" + info_str += "\n" + info_str += self._controller.comm.__info__() + + return info_str + + @autocomplete_property + def intensity(self): + """ + Return: + float: intensity read from device. + """ + return self._controller.get_intensity() + + @intensity.setter + def intensity(self, intensity_value): + """ + Set intensity (0 - 100 %) + + Param: + : float in [0 ; 100] + """ + if self.modus in ["Standby", "MultiPort"]: + _msg = f"Cannot set intensity: {self.name} is in {self.modus} mode (check rear switch)." + raise RuntimeError(_msg) + else: + self._controller.set_intensity(intensity_value) + + def off(self): + """ + Switch light OFF by setting intensity to 0. + """ + self.intensity = 0 + + def on(self): + """ + Switch light ON + Q: which value ? + -> the minimum to have light ie 1.1% + TODO: use a setting ? + """ + self.intensity = 1.1 + + @autocomplete_property + def temperature(self): + """ + Return: + float (RO): Temperature in degree Celsius. + """ + return self._controller.get_temperature() + + @autocomplete_property + def source(self): + """ + Source of intensity control. + + The source switches automaticaly from POTENTIOMETER to COM_PORT when + intensity is set via serial line. + + Return: + str: source of the intensity setting: + 'POTENTIOMETER' or 'ANALOG IN' or 'COM PORT' + """ + return self._controller.get_param("source") + + @source.setter + def source(self, value): + """ + Select source of intensity control. + Param: + value: str in ['POTENTIOMETER', 'ANALOG IN', 'COM PORT'] + """ + if value not in SOURCE_CODES.values: + raise ValueError(f"Invalid value: {value}") + + self._controller.set_source(value) + + @autocomplete_property + def trigger_logic(self): + """ + """ + return self._controller.get_param("trigger") + + @autocomplete_property + def modus(self): + """ + """ + return self._controller.get_param("modus") + + @autocomplete_property + def error(self): + """ + """ + return self._controller.get_param("error") diff --git a/doc/docs/config_intraled.md b/doc/docs/config_intraled.md new file mode 100644 index 0000000000..198cb72dc2 --- /dev/null +++ b/doc/docs/config_intraled.md @@ -0,0 +1,55 @@ +# FiberOptic Intraled + +Intraled 5 is a Cold Light Source device from FiberOptic compagny (previously +Volpi). + +It is controlled via a RS232 serial line. + +![Front and Rear Views](img/intraled5.jpg) + + + +## Configuration + +```yaml +- name: il5 + plugin: bliss + class: Intraled + serial: + url: /dev/ttyS0 + eol: b"\r\n" + baudrate: 9600 + parity: "N" +``` + + +## Usage + +```python +DEMO [3]: il5 + Out [3]: INTRALED il5: + Intensity: 0.0 % + Temperature: 27.0 °C + Source: COM PORT + Mode: On + + SERIAL type=LOCAL url=/dev/ttyS0 + timeout(s)=1 eol=b"\r\n" + + +DEMO [4]: il5.on() +DEMO [5]: il5.intensity + Out [5]: 1.1 + +DEMO [6]: il5.intensity = 35 +DEMO [7]: il5 + Out [7]: INTRALED il5: + Intensity: 35.0 % + Temperature: 27.5 °C + Source: COM PORT + Mode: On + + SERIAL type=LOCAL url=/dev/ttyS0 + timeout(s)=1 eol=b"\r\n" +``` + diff --git a/doc/docs/dev_documentation.md b/doc/docs/dev_documentation.md index eba8dcafdd..9c18ae5f1e 100644 --- a/doc/docs/dev_documentation.md +++ b/doc/docs/dev_documentation.md @@ -444,7 +444,7 @@ result: #### Bitmap -PNG, SVG or GIF files can be used +PNG, SVG, JPG / JPEG or GIF files can be used. ![Screenshot](img/CT2/p201.png) diff --git a/doc/docs/img/intraled5.jpg b/doc/docs/img/intraled5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ca8ba29dd58fb85776dadf5301104e6e46c4151 GIT binary patch literal 38911 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 literal 0 HcmV?d00001 diff --git a/doc/mkdocs.yml b/doc/mkdocs.yml index fd30e9374e..4963bb030d 100755 --- a/doc/mkdocs.yml +++ b/doc/mkdocs.yml @@ -31,6 +31,8 @@ nav: - AutoFilter: config_autofilter.md - BCDU8: config_bcdu8.md - CITY: config_city.md + - Cold Light Sources: + - Intraled: config_intraled.md - Correlators: - Flex: config_correlator_flex.md - Diffractometer: using_diffractometer.md -- GitLab From aa98ee5d81f733f7d057e70beae71f6d1d40200c Mon Sep 17 00:00:00 2001 From: Cyril Guilloud on pcsht Date: Mon, 26 Jul 2021 15:45:54 +0200 Subject: [PATCH 2/2] fix python to 3.7 to avoid problems seen with 3.9 --- requirements-win64.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-win64.txt b/requirements-win64.txt index f06491e735..142456d376 100755 --- a/requirements-win64.txt +++ b/requirements-win64.txt @@ -32,7 +32,7 @@ pyfiglet pygments pyserial > 2 pytango >= 9.3.1 -python >= 3.7 +python >= 3.7, <3.8 pywin32 redis redis-py == 3.5.1 diff --git a/requirements.txt b/requirements.txt index e392ed8df3..04d66f49aa 100755 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ pygments pygraphviz >= 1.5 pyserial > 2 pytango >= 9.3.1 -python >= 3.7 +python >= 3.7, <3.8 redis >= 6.0.6 redis-py == 3.5.1 requests -- GitLab