From b5d662008a6889d06809e64650ab7198c0562ba1 Mon Sep 17 00:00:00 2001 From: Marco Rocchietti Date: Thu, 14 Nov 2024 16:28:55 -0300 Subject: [PATCH] Add SAL script to unpark MTMount. --- .../scripts/maintel/mtmount/unpark_mount.py | 27 +++++ .../maintel/mtmount/__init__.py | 1 + .../maintel/mtmount/unpark_mount.py | 102 ++++++++++++++++++ tests/test_maintel_mtmount_unpark_mount.py | 68 ++++++++++++ 4 files changed, 198 insertions(+) create mode 100755 python/lsst/ts/standardscripts/data/scripts/maintel/mtmount/unpark_mount.py create mode 100644 python/lsst/ts/standardscripts/maintel/mtmount/unpark_mount.py create mode 100644 tests/test_maintel_mtmount_unpark_mount.py diff --git a/python/lsst/ts/standardscripts/data/scripts/maintel/mtmount/unpark_mount.py b/python/lsst/ts/standardscripts/data/scripts/maintel/mtmount/unpark_mount.py new file mode 100755 index 00000000..e2604bda --- /dev/null +++ b/python/lsst/ts/standardscripts/data/scripts/maintel/mtmount/unpark_mount.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# This file is part of ts_standardscripts +# +# Developed for the LSST Telescope and Site Systems. +# This product includes software developed by the LSST Project +# (https://www.lsst.org). +# See the COPYRIGHT file at the top-level directory of this distribution +# for details of code ownership. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import asyncio + +from lsst.ts.standardscripts.maintel.mtmount import UnparkMount + +asyncio.run(UnparkMount.amain()) diff --git a/python/lsst/ts/standardscripts/maintel/mtmount/__init__.py b/python/lsst/ts/standardscripts/maintel/mtmount/__init__.py index afb3ac25..7d4e0f35 100644 --- a/python/lsst/ts/standardscripts/maintel/mtmount/__init__.py +++ b/python/lsst/ts/standardscripts/maintel/mtmount/__init__.py @@ -20,3 +20,4 @@ # along with this program. If not, see . from .park_mount import * +from .unpark_mount import * diff --git a/python/lsst/ts/standardscripts/maintel/mtmount/unpark_mount.py b/python/lsst/ts/standardscripts/maintel/mtmount/unpark_mount.py new file mode 100644 index 00000000..5b569415 --- /dev/null +++ b/python/lsst/ts/standardscripts/maintel/mtmount/unpark_mount.py @@ -0,0 +1,102 @@ +# +# Developed for the LSST Telescope and Site Systems. +# This product includes software developed by the LSST Project +# (https://www.lsst.org). +# See the COPYRIGHT file at the top-level directory of this distribution +# for details of code ownership. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see .`` + +__all__ = ["UnparkMount"] + +import yaml +from lsst.ts import salobj +from lsst.ts.observatory.control.maintel.mtcs import MTCS, MTCSUsages + + +class UnparkMount(salobj.BaseScript): + """Un-park Mount for the MTMount. + + Parameters + ---------- + index : `int` + Index of Script SAL component. + + Notes + ----- + **Checkpoints** + + None + """ + + def __init__(self, index): + super().__init__(index=index, descr="Unpark Mount for the MTMount.") + + self.mtcs = None + + @classmethod + def get_schema(cls): + schema_yaml = """ + $schema: http://json-schema.org/draft-07/schema# + $id: https://github.com/lsst-ts/ts_standardscripts/maintel/mtmount/unpark_mount.yaml + title: UnparkMount v1 + description: Configuration for UnparkMount. + type: object + properties: + ignore: + description: >- + CSCs from the group to ignore in status check. Name must + match those in self.group.components, e.g.; hexapod_1. + type: array + items: + type: string + additionalProperties: false + """ + return yaml.safe_load(schema_yaml) + + def set_metadata(self, metadata): + pass + + async def configure(self, config): + """Configure script. + + Parameters + ---------- + config : `types.SimpleNamespace` + Script configuration, as defined by `schema`. + """ + self.config = config + + if self.mtcs is None: + self.mtcs = MTCS( + domain=self.domain, + intended_usage=MTCSUsages.Slew | MTCSUsages.StateTransition, + log=self.log, + ) + await self.mtcs.start_task + + if hasattr(self.config, "ignore"): + for comp in self.config.ignore: + if comp not in self.mtcs.components_attr: + self.log.warning( + f"Component {comp} not in CSC Group. " + f"Must be one of {self.mtcs.components_attr}. Ignoring." + ) + else: + self.log.debug(f"Ignoring component {comp}.") + setattr(self.mtcs.check, comp, False) + + async def run(self): + await self.mtcs.assert_all_enabled() + await self.mtcs.unpark_mount() diff --git a/tests/test_maintel_mtmount_unpark_mount.py b/tests/test_maintel_mtmount_unpark_mount.py new file mode 100644 index 00000000..6820ddac --- /dev/null +++ b/tests/test_maintel_mtmount_unpark_mount.py @@ -0,0 +1,68 @@ +# This file is part of ts_standardscripts +# +# Developed for the LSST Telescope and Site Systems. +# This product includes software developed by the LSST Project +# (https://www.lsst.org). +# See the COPYRIGHT file at the top-level directory of this distribution +# for details of code ownership. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import contextlib +import unittest + +from lsst.ts import standardscripts +from lsst.ts.standardscripts.maintel.mtmount import UnparkMount + + +class TestUnparkMount( + standardscripts.BaseScriptTestCase, unittest.IsolatedAsyncioTestCase +): + async def basic_make_script(self, index): + self.script = UnparkMount(index=index) + return (self.script,) + + @contextlib.asynccontextmanager + async def make_dry_script(self): + async with self.make_script(self): + self.script.mtcs = unittest.mock.AsyncMock() + self.script.mtcs.assert_all_enabled = unittest.mock.AsyncMock() + self.script.mtcs.unpark_mount = unittest.mock.AsyncMock() + yield + + async def test_executable(self): + scripts_dir = standardscripts.get_scripts_dir() + script_path = scripts_dir / "maintel" / "mtmount" / "unpark_mount.py" + await self.check_executable(script_path) + + async def test_configure_ignore(self): + async with self.make_script(): + components = ["mtptg"] + await self.configure_script(ignore=components) + assert self.script.mtcs.check.mtptg is False + + async def test_configure_ignore_not_mtcs_component(self): + async with self.make_script(): + # Test the ignore feature with one non-MTCS component. + components = ["not_mtcs_comp", "mtptg"] + await self.configure_script(ignore=components) + assert not hasattr(self.script.mtcs.check, "not_mtcs_comp") + assert self.script.mtcs.check.mtptg is False + + async def test_run(self): + async with self.make_dry_script(): + await self.configure_script() + await self.run_script() + self.script.mtcs.assert_all_enabled.assert_awaited_once() + self.script.mtcs.unpark_mount.assert_called_once()