Skip to content

Commit

Permalink
Add SAL script to unpark MTMount.
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcoRocchietti committed Nov 16, 2024
1 parent b6309ea commit b5d6620
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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 <https://www.gnu.org/licenses/>.

import asyncio

from lsst.ts.standardscripts.maintel.mtmount import UnparkMount

asyncio.run(UnparkMount.amain())
1 change: 1 addition & 0 deletions python/lsst/ts/standardscripts/maintel/mtmount/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.

from .park_mount import *
from .unpark_mount import *
102 changes: 102 additions & 0 deletions python/lsst/ts/standardscripts/maintel/mtmount/unpark_mount.py
Original file line number Diff line number Diff line change
@@ -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 <https://www.gnu.org/licenses/>.``

__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()
68 changes: 68 additions & 0 deletions tests/test_maintel_mtmount_unpark_mount.py
Original file line number Diff line number Diff line change
@@ -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 <https://www.gnu.org/licenses/>.

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()

0 comments on commit b5d6620

Please sign in to comment.