diff --git a/docs/ioc/ioc_overview.md b/docs/ioc/ioc_overview.md index 5d5d558..22a0c6c 100644 --- a/docs/ioc/ioc_overview.md +++ b/docs/ioc/ioc_overview.md @@ -8,3 +8,4 @@ The ports are configured in the [service registry](../../docs/ioc/ioc_overview.m | AGEBD-CPCL-NTURNS | IOC providing PVs for the DBPM3 stage0 and stage1 nr. of turns calculation service | | AGEBD-CPCL-DBPM3CURR | | | AGEBD-CPCL-TAUBPM | | +| AGEBD-CPCL-SHIFTTOOL | | diff --git a/services/dbpm3curr/current/ioc/cfg/AGEBD-CPCL-DBPM3CURR_set1.req b/services/dbpm3curr/current/ioc/cfg/AGEBD-CPCL-DBPM3CURR_set1.req new file mode 100644 index 0000000..8c8c606 --- /dev/null +++ b/services/dbpm3curr/current/ioc/cfg/AGEBD-CPCL-DBPM3CURR_set1.req @@ -0,0 +1 @@ +AGEBD-DBPM3CURR:ACCUMULATED-BEAM-DOSE \ No newline at end of file diff --git a/services/injectionguard/current/app/pyproject.toml b/services/injectionguard/current/app/pyproject.toml new file mode 100644 index 0000000..0344692 --- /dev/null +++ b/services/injectionguard/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-injectionguard" +version = "0.1.0" +description = "AGEBD-INJECTIONGUARD Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py b/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/main.py b/services/injectionguard/current/app/src/agebd_injectionguard/main.py new file mode 100644 index 0000000..afd7c4a --- /dev/null +++ b/services/injectionguard/current/app/src/agebd_injectionguard/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_injectionguard import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "INJECTIONGUARD" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/service.py b/services/injectionguard/current/app/src/agebd_injectionguard/service.py new file mode 100644 index 0000000..dddb14a --- /dev/null +++ b/services/injectionguard/current/app/src/agebd_injectionguard/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-INJECTIONGUARD:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-INJECTIONGUARD:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-INJECTIONGUARD:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/injectionguard/current/app/tests/test_app.py b/services/injectionguard/current/app/tests/test_app.py new file mode 100644 index 0000000..c6a1df9 --- /dev/null +++ b/services/injectionguard/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_injectionguard import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/injectionguard/current/app/uv.lock b/services/injectionguard/current/app/uv.lock new file mode 100644 index 0000000..943f9eb --- /dev/null +++ b/services/injectionguard/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-injectionguard" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs new file mode 100644 index 0000000..10eab88 --- /dev/null +++ b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs @@ -0,0 +1,31 @@ +file INJECTIONGUARD_individual.template { + pattern { DEVICE } + { AGEBD-INJECTIONGUARD{{ agebd_env }} } +} + +file INJECTIONGUARD_automated.template { + pattern { DEVICE NR Latch Description } + { AGEBD-INJECTIONGUARD{{ agebd_env }} 01 1 "Beam Dump Kicker"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 02 1 "Dump Valve"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 03 1 "MIS"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 04 1 "VCS"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 05 1 "Linac KV/BB/BY"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 06 1 "RF Linac"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 07 1 "RF Booster"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 08 1 "RF Ring"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 09 1 "Magnets Pulsed"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 10 1 "Magnets Booster"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 11 1 "Magnets Corrector"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 12 1 "Magnets Ring"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 13 1 "Current Limit"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 14 1 "IDs Ready"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 15 1 "Single Bunch Charge"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 16 1 "Injection Quality"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 17 1 "Dump Quality"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 18 1 "Lifetime"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 19 1 "Tune"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 20 0 "Pingers"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 21 1 "Vacuum Pressure"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 22 1 "Orbit Deviation"} + { AGEBD-INJECTIONGUARD{{ agebd_env }} 23 1 "Beam Dump Controller"} +} diff --git a/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/injectionguard/current/ioc/INJECTIONGUARD_automated.template b/services/injectionguard/current/ioc/INJECTIONGUARD_automated.template new file mode 100644 index 0000000..3661b8b --- /dev/null +++ b/services/injectionguard/current/ioc/INJECTIONGUARD_automated.template @@ -0,0 +1,87 @@ +record(bo, "$(DEVICE):CONTROL-BRIDGE-CHECK-$(NR)") { + field(DESC, "Only in MD mode: bridge check $(NR)") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):CHECK-$(NR)-MD") + field(VAL, "0") + field(ZSV, "NO_ALARM") + field(OSV, "MINOR") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK-$(NR)") { + field(DESC, "$(Description)") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):CHECK-$(NR)-MD") + field(ZSV, "MAJOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") + field(HIGH, "1") # Seconds until automatic switch to Alarm +} + +record(calc, "$(DEVICE):CHECK-$(NR)-MD") { + field(DESC, "Check $(NR) MD, written by IOC") + field(ASG, "READONLY") + field(FLNK, "$(DEVICE):CHECK-$(NR)-LATCHFWD") + field(LOLO, "0.1") + field(LLSV, "MAJOR") + field(CALC, "A ? 1 : B") + field(INPA, "$(DEVICE):CONTROL-BRIDGE-CHECK-$(NR)") + field(INPB, "$(DEVICE):CHECK-$(NR)") +} + +# forward only alarm states to latch bo +record(calcout, "$(DEVICE):CHECK-$(NR)-LATCHFWD") { + field(DESC, "Latchfwd for check $(NR)") + field(ASG, "READONLY") + field(FLNK, "$(DEVICE):CHECK-$(NR)-LATCH") + field(CALC, "$(Latch)? ( A? C : B ) : 1") + field(PINI, "YES") + field(INPA, "$(DEVICE):CONTROL-MODE CP") + field(INPB, "$(DEVICE):CHECK-$(NR) CP") + field(INPC, "$(DEVICE):CHECK-$(NR)-MD CP") + field(OOPT, "When Zero") + field(DOPT, "Use CALC") + field(OUT, "$(DEVICE):CHECK-$(NR)-LATCH.VAL") +} + +# forward current state to latch bo on reset event +record(calcout, "$(DEVICE):CHECK-$(NR)-LATCHRST") { + field(DESC, "Latchfwd for check $(NR)") + field(ASG, "READONLY") + field(FLNK, "$(DEVICE):CHECK-$(NR)-LATCH") + field(SCAN, "Event") + field(EVNT, "5") + field(CALC, "$(Latch)? ( A? C : B ) : 1") + field(PINI, "YES") + field(INPA, "$(DEVICE):CONTROL-MODE") + field(INPB, "$(DEVICE):CHECK-$(NR)") + field(INPC, "$(DEVICE):CHECK-$(NR)-MD") + field(OOPT, "Every Time") + field(DOPT, "Use CALC") + field(OUT, "$(DEVICE):CHECK-$(NR)-LATCH.VAL") +} + +record(bo, "$(DEVICE):CHECK-$(NR)-LATCH") { + field(DESC, "$(Description)") + field(ASG, "READONLY") + field(FLNK, "$(DEVICE):CHECK-SUM-OP-A") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") +} + +# emit event for master rearm when alarm state is left and non latched +record(calcout, "$(DEVICE):CHECK-$(NR)-REARM-MASTER") { + field(DESC, "Rearm Master for non latched checks") + field(ASG, "NOACCESS") + field(CALC, "!$(Latch)? ( A? C : B ) : 1") + field(PINI, "YES") + field(INPA, "$(DEVICE):CONTROL-MODE CP") + field(INPB, "$(DEVICE):CHECK-$(NR) CP") + field(INPC, "$(DEVICE):CHECK-$(NR)-MD CP") + field(OOPT, "Transition To Non-zero") + field(OEVT, "4") + field(ODLY, "0.1") +} diff --git a/services/injectionguard/current/ioc/INJECTIONGUARD_individual.template b/services/injectionguard/current/ioc/INJECTIONGUARD_individual.template new file mode 100644 index 0000000..b6e66d2 --- /dev/null +++ b/services/injectionguard/current/ioc/INJECTIONGUARD_individual.template @@ -0,0 +1,304 @@ +# HLA Service Control Parameters + +record(mbbo, "$(DEVICE):CONTROL-MODE") { + field(DESC, "Mode of Injection Guard") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):CHECK-SUM") + field(ZRST, "User Operation") + field(ZRVL, "0") + field(ONST, "Machine Development") + field(ONVL, "1") + field(PINI, "YES") +} + +# Local events on this IOC +# 1 - secret master trigger inhibited +# 2 - gun trigger inhibited +# 3 - booster extraction trigger inhibited +# 4 - rearm of master trigger if sum signal ok again +# 5 - request to reset latches + +record(waveform,"$(DEVICE):LOG") { + field(DESC, "Last failed checks") + field(ASG, "PROTECTED") + field(FTVL, "CHAR") + field(NELM, "$(SIZE=60000)") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):LOG-PAUSE") { + field(DESC, "pause/start logging") + field(ASG, "PROTECTED") + field(ZNAM, "Start") + field(ONAM, "Pause") + field(VAL, "1") + field(PINI, "YES") + field(HIGH, "60") # Seconds until automatic switch back to run +} + +record(bo,"$(DEVICE):LOG-CLEAR") { + field(DESC, "Clear log of last failed checks") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(bi,"$(DEVICE):STATUS-SECRET-MASTER") { + field(DESC, "Status of secret master trigger") + field(ASG, "READONLY") + field(ZSV, "MAJOR" ) + field(INP, "$(DEVICE):NOACCESS-SECRETMASTER CP") + field(PINI, "YES") +} + +record(bi,"$(DEVICE):NOACCESS-SECRETMASTER") { + field(DESC, "Status of secret master trigger") + field(ASG, "NOACCESS") + field(INP, "AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel-I CP") + field(PINI, "YES") +} + +record(calcout, "$(DEVICE):AUTO-REARM-MASTER-CALCOUT") { + field(DESC, "Automatic rearming of master trigger") + field(ASG, "READONLY") + field(SCAN, "Event") + field(EVNT, "4") + field(CALC, "(A > 0) ? 1 : 0") + field(INPA, "$(DEVICE):CHECK-SUM") + field(OOPT, "When Non-zero") + field(DOPT, "Use CALC") + field(OUT, "AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel") +} + +record(calcout, "$(DEVICE):OUTLINK-2-ONBEAM-FORWARD") { + field(DESC, "activate secret trigger if checks ok") + field(ASG, "READONLY") + field(CALC, "(A > 0) ? 0 : 1") + field(INPA, "$(DEVICE):CHECK-SUM") + field(OOPT, "Transition To Zero") + field(ODLY, "0") + field(DOPT, "Use OCAL") + field(OCAL, "1") + field(OUT, "AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel-I") +} + +record(calcout, "$(DEVICE):OUTLINK-2-ONBEAM-INHIBIT") { + field(DESC, "disable secret trigger if checks nok") + field(ASG, "READONLY") + field(CALC, "!A && B ? 0 : 1") + field(INPA, "$(DEVICE):CHECK-SUM") + field(INPB, "AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel-I CP") + field(OOPT, "When Zero") + field(OEVT, "1") + field(ODLY, "0") + field(DOPT, "Use CALC") + field(OUT, "AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel-I") +} + +# record(calcout, "$(DEVICE):OUTLINK-2-GUNTRI") { +# field(DESC, "disable gun if checks nok") +# field(ASG, "READONLY") +# field(CALC, "!A && B ? 0 : 1") +# field(INPA, "$(DEVICE):CHECK-SUM") +# field(INPB, "ALIRF-VME-A-GUN:CH1-MODE CP") +# field(OOPT, "Transition To Zero") +# field(OEVT, "2") +# field(ODLY, "0") +# field(DOPT, "Use CALC") +# field(OUT, "ALIRF-VME-A-GUN:CH1-MODE") +# } + +# record(calcout, "$(DEVICE):OUTLINK-2-BOOEXT") { +# field(DESC, "disable booster extraction if checks nok") +# field(ASG, "READONLY") +# field(CALC, "!A && B ? 0 : 1") +# field(INPA, "$(DEVICE):CHECK-SUM") +# field(INPB, "AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel CP") +# field(OOPT, "Transition To Zero") +# field(OEVT, "3") +# field(ODLY, "0") +# field(DOPT, "Use CALC") +# field(OUT, "AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel") +# } + +# Overall Check SUM +record(fanout, "$(DEVICE):CHECK-SUM-FANOUT") { + field(DESC, "FANOUT for checksum changes") + field(ASG, "READONLY") + field(SELM, "All") + field(LNK1, "$(DEVICE):OUTLINK-2-ONBEAM-FORWARD") + field(LNK2, "$(DEVICE):OUTLINK-2-ONBEAM-INHIBIT") + # field(LNK3, "$(DEVICE):OUTLINK-2-GUNTRI") + # field(LNK4, "$(DEVICE):OUTLINK-2-BOOEXT") +} + +record(mbbi, "$(DEVICE):CHECK-SUM") { + field(DESC, "Check SUM overall, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-FANOUT") + field(ASG, "READONLY") + field(ZRST, "Injection Inhibit") + field(ZRVL, "0") + field(ZRSV, "MAJOR") + field(ONST, "Injection Enabled") + field(ONVL, "1") + field(ONSV, "NO_ALARM") + field(TWST, "Linac Mode") + field(TWVL, "2") + field(TWSV, "MINOR") +} + +record(calcout, "$(DEVICE):CHECK-SUM-CALC") { + field(DESC, "Check SUM overall, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM") + field(ASG, "READONLY") + field(CALC, "!E & !F ? 2 : (A ? B & D : C & D)") + field(INPA, "$(DEVICE):CONTROL-MODE") + field(INPB, "$(DEVICE):CHECK-SUM-MD") + field(INPC, "$(DEVICE):CHECK-SUM-OP") + field(INPD, "$(DEVICE):CHECK-SUM-LATCH") + field(INPE, "ALI00-SGEN-PSYS:ALBSA-BB-OPEN") # Linac Mode, (0 closed, 1 opened) + field(INPF, "ALI00-SGEN-PSYS:ALBSA-KV-OPEN") # Linac Mode, (0 closed, 1 opened) + field(DOPT, "Use CALC") + field(OUT, "$(DEVICE):CHECK-SUM") +} + +# Check SUMs OP/MD +record(calc, "$(DEVICE):CHECK-SUM-OP-A") { + field(DESC, "Check SUM OP Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-OP") + field(ASG, "READONLY") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-12") + field(INPB, "$(DEVICE):CHECK-13") + field(INPC, "$(DEVICE):CHECK-14") + field(INPD, "$(DEVICE):CHECK-15") + field(INPE, "$(DEVICE):CHECK-16") + field(INPF, "$(DEVICE):CHECK-17") + field(INPG, "$(DEVICE):CHECK-18") + field(INPH, "$(DEVICE):CHECK-19") + field(INPI, "$(DEVICE):CHECK-20") + field(INPJ, "$(DEVICE):CHECK-21") + field(INPK, "$(DEVICE):CHECK-22") + field(INPL, "$(DEVICE):CHECK-23") +} + +record(calc, "$(DEVICE):CHECK-SUM-OP") { + field(DESC, "Check SUM OP Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-MD-A") + field(ASG, "READONLY") + field(LOLO, "0.1") + field(LLSV, "MAJOR") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-01") + field(INPB, "$(DEVICE):CHECK-02") + field(INPC, "$(DEVICE):CHECK-03") + field(INPD, "$(DEVICE):CHECK-04") + field(INPE, "$(DEVICE):CHECK-05") + field(INPF, "$(DEVICE):CHECK-06") + field(INPG, "$(DEVICE):CHECK-07") + field(INPH, "$(DEVICE):CHECK-08") + field(INPI, "$(DEVICE):CHECK-09") + field(INPJ, "$(DEVICE):CHECK-10") + field(INPK, "$(DEVICE):CHECK-11") + field(INPL, "$(DEVICE):CHECK-SUM-OP-A") +} + +record(calc, "$(DEVICE):CHECK-SUM-MD-A") { + field(DESC, "Check SUM MD Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-MD") + field(ASG, "READONLY") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-12-MD") + field(INPB, "$(DEVICE):CHECK-13-MD") + field(INPC, "$(DEVICE):CHECK-14-MD") + field(INPD, "$(DEVICE):CHECK-15-MD") + field(INPE, "$(DEVICE):CHECK-16-MD") + field(INPF, "$(DEVICE):CHECK-17-MD") + field(INPG, "$(DEVICE):CHECK-18-MD") + field(INPH, "$(DEVICE):CHECK-19-MD") + field(INPI, "$(DEVICE):CHECK-20-MD") + field(INPJ, "$(DEVICE):CHECK-21-MD") + field(INPK, "$(DEVICE):CHECK-22-MD") + field(INPL, "$(DEVICE):CHECK-23-MD") +} + +record(calc, "$(DEVICE):CHECK-SUM-MD") { + field(DESC, "Check SUM MD Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-LATCH-A") + field(ASG, "READONLY") + field(LOLO, "0.1") + field(LLSV, "MAJOR") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-01-MD") + field(INPB, "$(DEVICE):CHECK-02-MD") + field(INPC, "$(DEVICE):CHECK-03-MD") + field(INPD, "$(DEVICE):CHECK-04-MD") + field(INPE, "$(DEVICE):CHECK-05-MD") + field(INPF, "$(DEVICE):CHECK-06-MD") + field(INPG, "$(DEVICE):CHECK-07-MD") + field(INPH, "$(DEVICE):CHECK-08-MD") + field(INPI, "$(DEVICE):CHECK-09-MD") + field(INPJ, "$(DEVICE):CHECK-10-MD") + field(INPK, "$(DEVICE):CHECK-11-MD") + field(INPL, "$(DEVICE):CHECK-SUM-MD-A") +} + +record(calc, "$(DEVICE):CHECK-SUM-LATCH-A") { + field(DESC, "Check SUM LATCH Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-LATCH") + field(ASG, "READONLY") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-12-LATCH") + field(INPB, "$(DEVICE):CHECK-13-LATCH") + field(INPC, "$(DEVICE):CHECK-14-LATCH") + field(INPD, "$(DEVICE):CHECK-15-LATCH") + field(INPE, "$(DEVICE):CHECK-16-LATCH") + field(INPF, "$(DEVICE):CHECK-17-LATCH") + field(INPG, "$(DEVICE):CHECK-18-LATCH") + field(INPH, "$(DEVICE):CHECK-19-LATCH") + field(INPI, "$(DEVICE):CHECK-20-LATCH") + field(INPJ, "$(DEVICE):CHECK-21-LATCH") + field(INPK, "$(DEVICE):CHECK-22-LATCH") + field(INPL, "$(DEVICE):CHECK-23-LATCH") +} + +record(calc, "$(DEVICE):CHECK-SUM-LATCH") { + field(DESC, "Check SUM LATCH Mode, written by IOC") + field(FLNK, "$(DEVICE):CHECK-SUM-CALC") + field(ASG, "READONLY") + field(LOLO, "0.1") + field(LLSV, "MINOR") + field(CALC, "A & B & C & D & E & F & G & H & I & J & K & L") + field(INPA, "$(DEVICE):CHECK-01-LATCH") + field(INPB, "$(DEVICE):CHECK-02-LATCH") + field(INPC, "$(DEVICE):CHECK-03-LATCH") + field(INPD, "$(DEVICE):CHECK-04-LATCH") + field(INPE, "$(DEVICE):CHECK-05-LATCH") + field(INPF, "$(DEVICE):CHECK-06-LATCH") + field(INPG, "$(DEVICE):CHECK-07-LATCH") + field(INPH, "$(DEVICE):CHECK-08-LATCH") + field(INPI, "$(DEVICE):CHECK-09-LATCH") + field(INPJ, "$(DEVICE):CHECK-10-LATCH") + field(INPK, "$(DEVICE):CHECK-11-LATCH") + field(INPL, "$(DEVICE):CHECK-SUM-LATCH-A") +} + +record(bo, "$(DEVICE):RESET-LATCHES") { + field(DESC, "Reset all Latches") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):RESET-LATCHES-CALCOUT") + field(VAL, "0") + field(PINI, "YES") + field(HIGH, "1") # Seconds until automatic switch to 0 +} + +record(calcout, "$(DEVICE):RESET-LATCHES-CALCOUT") { + field(DESC, "Reset all Latches") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") + field(CALC, "A") + field(INPA, "$(DEVICE):RESET-LATCHES") + field(OOPT, "Transition To Non-zero") + field(OEVT, "5") +} diff --git a/services/injectionguard/current/ioc/startup.script b/services/injectionguard/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/injectionguard/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/injectionguard/current/qt/A_BD_InjectionGuard.ui b/services/injectionguard/current/qt/A_BD_InjectionGuard.ui new file mode 100644 index 0000000..d452d7b --- /dev/null +++ b/services/injectionguard/current/qt/A_BD_InjectionGuard.ui @@ -0,0 +1,988 @@ + + + MainWindow + + + + 0 + 0 + 600 + 1195 + + + + MainWindow + + + + +/*-----------------------------------------------*/ +/* Title */ +/*-----------------------------------------------*/ +/* Operation panels */ +caLabel[statusTip="Operation"]{ + color: rgba(0, 0, 0, 255); + font: bold 18pt; + font-family: Sans Serif; + padding: 1px; + margin: 0px; + qproperty-alignment: AlignLeft; + qproperty-frameShape: StyledPanel; + /*qproperty-geometry: rect(-2 0 1600 33);*/ + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(218, 218, 218, 255), + stop:0.5 rgba(200, 200, 200, 255), + stop:1 rgba(218, 218, 218, 255)); +} + + + + + + + 670 + 140 + 70 + 20 + + + + + + + 670 + 80 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:INJECTIONGUARD-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 130 + 36 + 460 + 40 + + + + + 16 + 75 + true + + + + AGEBD-INJECTIONGUARD:CONTROL-MODE + + + + + + 10 + 36 + 110 + 40 + + + + + 25 + 75 + true + + + + Mode + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 78 + 580 + 60 + + + + AGEBD-INJECTIONGUARD:CHECK-SUM + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 652 + 394 + 150 + 22 + + + + + 9 + + + + Ring Reset + + + ARS00-VCS:PLC_ARS_RESET_REQUEST + + + Ring Reset + + + + 212 + 219 + 157 + + + + 1 + + + + + + 652 + 346 + 150 + 22 + + + + + 9 + + + + LI LTB Reset + + + ARS00-VCS:PLC_ALIVA_RESET_REQUEST + + + LI LTB Reset + + + + 212 + 219 + 157 + + + + 1 + + + + + + 652 + 370 + 150 + 22 + + + + + 9 + + + + Boster Reset + + + ARS00-VCS:PLC_ABOVA_RESET_REQUEST + + + Boster Reset + + + + 212 + 219 + 157 + + + + 1 + + + + + + 722 + 438 + 150 + 22 + + + + + + + MIS Alarm Reset + + + ARS00-MIS-PLC-01:Alarm_Reset + + + MIS Alarm Reset + + + 1 + + + + + + 722 + 474 + 150 + 22 + + + + + + + MIS-FE Alarm Reset + + + ACOSA-MIS-FE:ACKERR-REQUEST + + + MIS-FE Alarm Reset + + + 0 + + + 1 + + + + + + 722 + 544 + 150 + 22 + + + + + + + VCS ALIVA Reset + + + ARS00-VCS:PLC_ALIVA_RESET_REQUEST + + + VCS ALIVA Reset + + + 1 + + + + + + 722 + 506 + 150 + 22 + + + + + + + VCS ABOVA Reset + + + ARS00-VCS:PLC_ABOVA_RESET_REQUEST + + + VCS ABOVA Reset + + + 1 + + + + + + 726 + 578 + 150 + 22 + + + + + + + VCS ARS Reset + + + ARS00-VCS:PLC_ARS_RESET_REQUEST + + + VCS ARS Reset + + + 1 + + + + + + 10 + 140 + 580 + 1050 + + + + 0 + + + + Checks + + + + + 10 + 10 + 40 + 40 + + + + true + + + false + + + 30 + + + 30 + + + AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER + + + caLed::Alarm + + + + + + 60 + 10 + 300 + 40 + + + + + Sans Serif + 16 + 75 + true + + + + true + + + Qt::LeftToRight + + + Master Trigger Freigabe + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 0 + 110 + 580 + 901 + + + + checknr=01,bridge=1,latch=1;checknr=02,bridge=1,latch=1;checknr=03,bridge=1,latch=1;checknr=04,bridge=1,latch=1;checknr=05,bridge=1,latch=1;checknr=06,bridge=1,latch=1;checknr=07,bridge=1,latch=1;checknr=08,bridge=1,latch=1;checknr=09,bridge=1,latch=1;checknr=10,bridge=1,latch=1;checknr=11,bridge=1,latch=1;checknr=12,bridge=1,latch=1;checknr=13,bridge=1,latch=1;checknr=14,bridge=1,latch=1;checknr=15,bridge=1,latch=1;checknr=16,bridge=1,latch=1;checknr=17,bridge=1,latch=1;checknr=18,bridge=1,latch=1;checknr=19,bridge=1,latch=1;checknr=20,bridge=0,latch=0;checknr=21,bridge=1,latch=1;checknr=22,bridge=1,latch=1;checknr=23,bridge=1,latch=1 + + + A_BD_InjectionGuard_inc.ui + + + 23 + + + + + + 270 + 60 + 20 + 900 + + + + Qt::Vertical + + + + + + 10 + 96 + 560 + 20 + + + + Qt::Horizontal + + + + + + 210 + 60 + 20 + 900 + + + + Qt::Vertical + + + + + + 230 + 66 + 40 + 30 + + + + + Monospace + 19 + 75 + true + PreferDefault + + + + OP + + + OP + + + Qt::AlignCenter + + + AGEBD-INJECTIONGUARD:CHECK-SUM-OP + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 340 + 66 + 111 + 30 + + + + + 18 + 75 + false + true + + + + false + + + BRIDGE + + + Qt::AlignCenter + + + ESimpleLabel::None + + + + + + 290 + 66 + 40 + 30 + + + + + Monospace + 19 + 75 + true + PreferDefault + + + + M\D + + + MD + + + Qt::AlignCenter + + + AGEBD-INJECTIONGUARD:CHECK-SUM-MD + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 9 + 66 + 201 + 30 + + + + + 18 + 75 + true + + + + Check + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 440 + 60 + 20 + 900 + + + + Qt::Vertical + + + + + + 470 + 66 + 80 + 30 + + + + + Monospace + 19 + 75 + true + PreferDefault + + + + L\ATC\H + + + LATCH + + + Qt::AlignCenter + + + AGEBD-INJECTIONGUARD:CHECK-SUM-LATCH + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 460 + 10 + 100 + 40 + + + + Reset + + + false + + + AGEBD-INJECTIONGUARD:RESET-LATCHES + + + Reset + + + + 160 + 160 + 160 + + + + + + + 1 + + + + + + Logs + + + + + 0 + 38 + 575 + 983 + + + + + Monospace + 10 + PreferDefault + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + AGEBD-INJECTIONGUARD:LOG + + + caMultiLineString::None + + + + + + 470 + 2 + 101 + 30 + + + + Clear Logs + + + AGEBD-INJECTIONGUARD:LOG-CLEAR + + + Clear Logs + + + + 160 + 160 + 160 + + + + 0 + + + 1 + + + + + + 10 + 2 + 101 + 30 + + + + AGEBD-INJECTIONGUARD:LOG-PAUSE + + + + 160 + 160 + 160 + + + + caChoice::Default + + + caChoice::Column + + + 1 + + + + + + + + -2 + 2 + 628 + 30 + + + + + Sans Serif + 18 + 75 + false + true + + + + Operation + + + Injection Guard + + + Qt::AlignLeading + + + + 218 + 218 + 218 + + + + caLabel::Default + + + + + + 556 + 6 + 40 + 22 + + + + -Wiki + + + + 183 + 157 + 92 + + + + Injection Guard + + + https://acceleratorwiki.psi.ch/wiki/Injection_Guard + + + + + + + + + + caMenu + QComboBox +
caMenu
+
+ + caChoice + QWidget +
caChoice
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caMultiLineString + QPlainTextEdit +
caMultiLineString
+
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + caMimeDisplay + QWidget +
caMimeDisplay
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 598 + 89 + + + 608 + 152 + + + + +
diff --git a/services/injectionguard/current/qt/A_BD_InjectionGuard_inc.ui b/services/injectionguard/current/qt/A_BD_InjectionGuard_inc.ui new file mode 100644 index 0000000..1170830 --- /dev/null +++ b/services/injectionguard/current/qt/A_BD_InjectionGuard_inc.ui @@ -0,0 +1,243 @@ + + + MainWindow + + + + 0 + 0 + 580 + 30 + + + + MainWindow + + + + + + 380 + 6 + 18 + 18 + + + + + 20 + 20 + + + + AGEBD-INJECTIONGUARD:CONTROL-BRIDGE-CHECK-$(checknr) + + + + 200 + 200 + 200 + + + + caToggleButton::Default + + + 1 + + + caToggleButton::on_top + + + + + + 220 + 0 + 40 + 30 + + + + false + + + AGEBD-INJECTIONGUARD:CHECK-$(checknr) + + + caLed::Alarm + + + + + + 280 + 0 + 40 + 30 + + + + false + + + AGEBD-INJECTIONGUARD:CHECK-$(checknr)-MD + + + caLed::Alarm + + + + + + 0 + 0 + 200 + 30 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-INJECTIONGUARD:CHECK-$(checknr).DESC + + + + 160 + 160 + 164 + + + + caLineEdit::Static + + + caLineEdit::None + + + + + + 460 + 0 + 120 + 30 + + + + + 160 + 160 + 164 + + + + caFrame::Outline + + + caFrame::Calc + + + caFrame::All + + + $(latch) + + + + + + + + 40 + 0 + 40 + 30 + + + + false + + + AGEBD-INJECTIONGUARD:CHECK-$(checknr)-LATCH + + + caLed::Alarm + + + + + + + 376 + 4 + 22 + 23 + + + + true + + + false + + + 20 + + + 20 + + + AGEBD-INJECTIONGUARD:CONTROL-BRIDGE-CHECK-$(checknr) + + + caLed::Alarm + + + + 0 + 0 + 0 + + + + + + + + caToggleButton + QCheckBox +
caToggleButton
+
+ + caFrame + QFrame +
caFrame
+ 1 +
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+
+ + +
+ diff --git a/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service b/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service new file mode 100644 index 0000000..8bc6ae5 --- /dev/null +++ b/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-INJECTIONGUARD +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh INJECTIONGUARD +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-INJECTIONGUARD.service +# systemctl --user start AGEBD-SERVICE-INJECTIONGUARD diff --git a/services/orbitbump/current/app/pyproject.toml b/services/orbitbump/current/app/pyproject.toml new file mode 100644 index 0000000..7ef40d4 --- /dev/null +++ b/services/orbitbump/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-orbitbump" +version = "0.1.0" +description = "AGEBD-ORBITBUMP Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py b/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/main.py b/services/orbitbump/current/app/src/agebd_orbitbump/main.py new file mode 100644 index 0000000..d81391d --- /dev/null +++ b/services/orbitbump/current/app/src/agebd_orbitbump/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_orbitbump import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "ORBITBUMP" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/service.py b/services/orbitbump/current/app/src/agebd_orbitbump/service.py new file mode 100644 index 0000000..8b71fcb --- /dev/null +++ b/services/orbitbump/current/app/src/agebd_orbitbump/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-ORBITBUMP:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-ORBITBUMP:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-ORBITBUMP:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/orbitbump/current/app/tests/test_app.py b/services/orbitbump/current/app/tests/test_app.py new file mode 100644 index 0000000..a0e737f --- /dev/null +++ b/services/orbitbump/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_orbitbump import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/orbitbump/current/app/uv.lock b/services/orbitbump/current/app/uv.lock new file mode 100644 index 0000000..7f329ec --- /dev/null +++ b/services/orbitbump/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-orbitbump" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs new file mode 100644 index 0000000..e485117 --- /dev/null +++ b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs @@ -0,0 +1,62 @@ +file ORBITBUMP_machine.template { + pattern + {sourcepoint beamline LOX HIX X LOXP HIXP XP LOY HIY Y LOYP HIYP YP BPM1 C1xx C1xpx C1yy C1ypy BPM2 C2xx C2xpx C2yy C2ypy BPM3 C3xx C3xpx C3yy C3ypy BPM4 C4xx C4xpx C4yy C4ypy} + # Diagnostic dipole beamlines + {X01DD NEMO -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS01-DBPM-1080 -0.0009920 -0.0006308 -0.0001141 0.0001109 ARS01-DBPM-1460 0.9742755 -0.1432472 0.9455447 -0.0865934 ARS01-DBPM-1900 0.9277200 1.0454287 0.1445141 1.5920941 ARS01-DBPM-2410 -0.0809412 -0.0384293 0.0058229 0.1036650} + {X08DB DISCO -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS08-DBPM-1900 -0.2500389 -0.0365053 0.0001023 0.0000595 ARS08-DBPM-2410 1.2775662 -0.9246414 0.5814965 -0.4999301 ARS08-DBPM-2910 0.6885552 0.9211364 0.4873898 1.7550023 ARS08-DBPM-4220 -0.2391394 -0.0169593 0.0309046 0.1234665} + {X10DG X11HEAT -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS10-DBPM-4720 -0.0187 -0.0188 0 0 ARS10-DBPM-5250 1.6016 -1.2108 0.5496 -0.5376 ARS10-DBPM-5880 0.7075 1.0654 1.1093 1.9515 ARS11-DBPM-0850 0.0026 0.0044 0.0166 0.0304} + # User dipole beamlines + {X01DA DEBYE -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS01-DBPM-2410 -0.2169694 -0.0006291 0.0001170 0.0000325 ARS01-DBPM-2910 1.2765938 -0.9208697 0.5792863 -0.5011470 ARS01-DBPM-4220 0.6866207 0.9198858 0.4842977 1.7595080 ARS01-DBPM-4720 -0.1924402 0.0258918 0.0307458 0.1239361} + {X02DA S-TOMCAT -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS02-DBPM-2410 -0.2089937 0.0072435 0.0001169 0.0000325 ARS02-DBPM-2910 1.2772588 -0.9200089 0.5792866 -0.5011606 ARS02-DBPM-4220 0.6864959 0.9194778 0.4843170 1.7595616 ARS02-DBPM-4720 -0.1833930 0.0352770 0.0307471 0.1239392} + {X03DA PEARL -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS03-DBPM-2410 -0.2016647 0.0152728 0.0001171 0.0000326 ARS03-DBPM-2910 1.2831552 -0.9190247 0.5819894 -0.5004911 ARS03-DBPM-4220 0.6905553 0.9206615 0.4875028 1.7552635 ARS03-DBPM-4720 -0.1749243 0.0438144 0.0309089 0.1234182} + {X04DB VUV -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS04-DBPM-1900 -0.1917962 0.0214714 0.0001022 0.0000595 ARS04-DBPM-2410 1.2842031 -0.9179380 0.5814999 -0.5000284 ARS04-DBPM-2910 0.6887599 0.9211626 0.4874732 1.7553295 ARS04-DBPM-4220 -0.1710439 0.0514609 0.0309080 0.1234788} + {X05DA Optics -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS05-DBPM-2410 -0.2740176 -0.0571105 0.0001170 0.0000321 ARS05-DBPM-2910 1.2732647 -0.9287209 0.5819890 -0.5003730 ARS05-DBPM-4220 0.6913367 0.9213802 0.4873370 1.7548006 ARS05-DBPM-4720 -0.2592981 -0.0408063 0.0308988 0.1233928} + {X06DA PXIII -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS06-DBPM-2410 -0.2675305 -0.0508248 0.0001170 0.0000321 ARS06-DBPM-2910 1.2749858 -0.9266845 0.5818007 -0.5004548 ARS06-DBPM-4220 0.6916389 0.9218001 0.4871613 1.7552275 ARS06-DBPM-4720 -0.2517260 -0.0332473 0.0308895 0.1234316} + {X07DB nanoXAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS07-DBPM-1900 -0.2563387 -0.0425222 0.0001023 0.0000596 ARS07-DBPM-2410 1.2761628 -0.9263027 0.5814954 -0.4999177 ARS07-DBPM-2910 0.6888233 0.9216262 0.4873810 1.7549631 ARS07-DBPM-4220 -0.2469055 -0.0248794 0.0309043 0.1234651} + {X07DA PolLux -300 300 0 -150 150 0 -300 300 0 -250 250 0 ARS07-DBPM-2410 -0.2606076 -0.0450539 0.0001170 0.0000326 ARS07-DBPM-2910 1.2750718 -0.9205684 0.5819899 -0.4976199 ARS07-DBPM-4220 0.6915728 0.9246379 0.4873668 1.7572153 ARS07-DBPM-4720 -0.2433555 -0.0254434 0.0309006 0.1235450} + {X10DA SuperXAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS10-DBPM-2410 -0.2392400 -0.0226765 0.0001170 0.0000321 ARS10-DBPM-2910 1.2780895 -0.9235140 0.5818007 -0.5005005 ARS10-DBPM-4220 0.6911875 0.9212713 0.4872251 1.7554059 ARS10-DBPM-4720 -0.2190626 -0.0004438 0.0308933 0.1234413} + # ID beamlines + {X02SA I-TOMCAT -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS01-DBPM-5250 -0.0161762 0.0645315 -0.0000522 0.0002217 ARS01-DBPM-5880 1.3057217 -3.1586368 0.7340909 -1.7908669 ARS02-DBPM-1080 1.1637103 2.7703664 0.8405251 2.0415012 ARS02-DBPM-1460 0.0473369 0.1176477 0.0354851 0.0914118} + {X03MA ADRESS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS02-DBPM-5250 -0.0056074 0.0805576 -0.0000533 0.0001427 ARS02-DBPM-5880 1.2522257 -3.5240592 0.7649336 -2.1576328 ARS03-DBPM-0810 1.1134798 3.0406278 0.8874945 2.4488073 ARS03-DBPM-1080 0.0367597 0.0902093 0.0491615 0.1421129} + {X04SA ADDAMS -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS03-DBPM-5250 0.0006041 0.0811354 -0.0000524 0.0002222 ARS03-DBPM-5880 1.3048037 -3.1594991 0.7340820 -1.7909262 ARS04-DBPM-1080 1.1649402 2.7718322 0.8405182 2.0415768 ARS04-DBPM-1460 0.0441826 0.1145073 0.0354841 0.0914133} + {X05LA QUEST -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS04-DBPM-5880 0.0008866 0.0002252 -0.0001045 0.0002529 ARS05-DBPM-0410 0.8976150 -2.8499257 1.0112790 -2.8592349 ARS05-DBPM-1080 1.0880889 5.0183256 0.9137175 4.2390359 ARS05-DBPM-1460 0.0421489 0.1947713 0.0433357 0.2067705} + {X06SA PXI -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS05-DBPM-5250 -0.0776973 0.0030268 -0.0000523 0.0002212 ARS05-DBPM-5880 1.3044906 -3.1590695 0.7341239 -1.7906420 ARS06-DBPM-1080 1.1642809 2.7699897 0.8405515 2.0412179 ARS06-DBPM-1460 0.0604868 0.1306028 0.0354886 0.0914055} + {X07MA Phoenix/XTreme -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS06-DBPM-5250 -0.0684380 0.0189547 -0.0000531 0.0001447 ARS06-DBPM-5880 1.2508776 -3.5845660 0.7649630 -2.1939024 ARS07-DBPM-0810 1.1137188 2.9863773 0.8875136 2.4060190 ARS07-DBPM-1080 0.0093629 0.0606390 0.0491634 0.1397441} + {X08SA micro-XAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS07-DBPM-5250 -0.0624701 0.0181621 -0.0000523 0.0002216 ARS07-DBPM-5880 1.3039931 -3.1597229 0.7341156 -1.7906968 ARS08-DBPM-1080 1.1652753 2.7714013 0.8405450 2.0412871 ARS08-DBPM-1460 0.0575855 0.1278140 0.0354876 0.0914065} + {X09LA PEARL/XIL-II -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS08-DBPM-5880 0.0011254 0.0009724 -0.0000942 0.0002317 ARS09-DBPM-0570 0.8843735 -2.4344684 1.1263977 -3.0082085 ARS09-DBPM-1080 1.0591734 3.0395499 0.9413643 2.7184391 ARS09-DBPM-1460 0.0394021 0.1139547 0.0465775 0.1402264} + {X10SA PXII -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS09-DBPM-5250 -0.0473875 0.0333454 -0.0000523 0.0002213 ARS09-DBPM-5880 1.3047178 -3.1592507 0.7341077 -1.7907518 ARS10-DBPM-1080 1.1639981 2.7701547 0.8405387 2.0413565 ARS10-DBPM-1460 0.0540084 0.1242161 0.0354869 0.0914087} + {X11MA SIM -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS10-DBPM-5250 -0.0383667 0.0514782 -0.0000499 0.0001646 ARS10-DBPM-5880 1.2526899 -3.7342542 0.7640638 -2.2804441 ARS11-DBPM-0850 1.1168967 3.1441871 0.8845808 2.5170397 ARS11-DBPM-1080 0.0219427 0.0928506 0.0546028 0.1626088} + {X12SA cSAXS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS11-DBPM-5250 -0.0326376 0.0479239 -0.0000524 0.0002219 ARS11-DBPM-5880 1.3047910 -3.1591765 0.7340995 -1.7908066 ARS12-DBPM-1080 1.1653151 2.7718178 0.8405322 2.0414257 ARS12-DBPM-1460 0.0513287 0.1216036 0.0354860 0.0914097} +} + + +file ORBITBUMP_beamline.template { + pattern + {sourcepoint beamline DRVL DRVH X XP Y YP } + # Diagnostic dipole beamlines + {X01DD NEMO -10 10 0 0 0 0 } + {X08DB DISCO -10 10 0 0 0 0 } + {X10DG X11HEAT -10 10 0 0 0 0 } + # User dipole beamlines + {X01DA DEBYE -10 10 0 0 0 0 } + {X02DA S-TOMCAT -10 10 0 0 0 0 } + {X03DA PEARL -10 10 0 0 0 0 } + {X04DB VUV -10 10 0 0 0 0 } + {X05DA Optics -10 10 0 0 0 0 } + {X06DA PXIII -10 10 0 0 0 0 } + {X07DB nanoXAS -10 10 0 0 0 0 } + {X07DA PolLux -10 10 0 0 0 0 } + {X10DA SuperXAS -10 10 0 0 0 0 } + # ID beamlines + {X02SA I-TOMCAT -10 10 0 0 0 0 } + {X03MA ADRESS -10 10 0 0 0 0 } + {X04SA ADDAMS -10 10 0 0 0 0 } + {X05LA QUEST -10 10 0 0 0 0 } + {X06SA PXI -10 10 0 0 0 0 } + {X07MA Phoenix/XTreme -10 10 0 0 0 0 } + {X08SA micro-XAS -10 10 0 0 0 0 } + {X09LA PEARL/XIL-II -10 10 0 0 0 0 } + {X10SA PXII -10 10 0 0 0 0 } + {X11MA SIM -10 10 0 0 0 0 } + {X12SA cSAXS -10 10 0 0 0 0 } +} \ No newline at end of file diff --git a/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/orbitbump/current/ioc/ORBITBUMP_beamline.template b/services/orbitbump/current/ioc/ORBITBUMP_beamline.template new file mode 100644 index 0000000..14ba98f --- /dev/null +++ b/services/orbitbump/current/ioc/ORBITBUMP_beamline.template @@ -0,0 +1,87 @@ +record(ao, "$(sourcepoint)-ORBITBUMP:OFFSET-X") { + field(DESC, "Beamline x offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "um") + field(PREC, "0") + field(VAL, "$(X)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(DRVH, "$(DRVH)") + field(DRVL, "$(DRVL)") + field(HOPR, "$(DRVH)") + field(LOPR, "$(DRVL)") + field(HIHI, "10") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-10") + field(LLSV, "MAJOR") +} + +record(ao, "$(sourcepoint)-ORBITBUMP:OFFSET-XP") { + field(DESC, "Beamline xp offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "urad") + field(PREC, "0") + field(VAL, "$(XP)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(DRVH, "$(DRVH)") + field(DRVL, "$(DRVL)") + field(HOPR, "$(DRVH)") + field(LOPR, "$(DRVL)") + field(HIHI, "10") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-10") + field(LLSV, "MAJOR") +} + +record(ao, "$(sourcepoint)-ORBITBUMP:OFFSET-Y") { + field(DESC, "Beamline y offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "um") + field(PREC, "0") + field(VAL, "$(Y)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(DRVH, "$(DRVH)") + field(DRVL, "$(DRVL)") + field(HOPR, "$(DRVH)") + field(LOPR, "$(DRVL)") + field(HIHI, "10") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-10") + field(LLSV, "MAJOR") +} + +record(ao, "$(sourcepoint)-ORBITBUMP:OFFSET-YP") { + field(DESC, "Beamline yp offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "urad") + field(PREC, "0") + field(VAL, "$(YP)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(DRVH, "$(DRVH)") + field(DRVL, "$(DRVL)") + field(HOPR, "$(DRVH)") + field(LOPR, "$(DRVL)") + field(HIHI, "10") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-10") + field(LLSV, "MAJOR") +} \ No newline at end of file diff --git a/services/orbitbump/current/ioc/ORBITBUMP_machine.template b/services/orbitbump/current/ioc/ORBITBUMP_machine.template new file mode 100644 index 0000000..31b8ed0 --- /dev/null +++ b/services/orbitbump/current/ioc/ORBITBUMP_machine.template @@ -0,0 +1,504 @@ +# # on request writing total bump values to machine bumps and zero beamline bumps +# record(bo, "AGEBD-ORBITBUMP:$(sourcepoint)-COPYOVER") { +# field(DESC, "Request zeroing of beamline offsets") +# field(ASG, "PROTECTED") +# field(PINI, "YES") +# field(ZNAM, "Idle") +# field(ONAM, "Trigger") +# field(OUT, "myDevice:addAndZero.PROC PP") +# } + +# record(seq, "AGEBD-ORBITBUMP:$(sourcepoint)-COPYOVER") { +# field(DESC, "On trigger: add PV_A to PV_B, zero PV_A") + +# field(DOL1, "myDevice:add_calc NPP NMS") # Value = A + B +# field(LNK1, "myDevice:PV_B PP MS") # Step 1: write sum to PV_B + +# field(DLY1, "0.1") # Wait 0.1s before next step + +# field(DOL2, "0") # Value = 0 +# field(LNK2, "myDevice:PV_A PP MS") # Step 2: zero PV_A +# } + + + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X") { + field(DESC, "Machine x offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "um") + field(PREC, "0") + field(VAL, "$(X)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(DRVH, "$(HIX)") + field(DRVL, "$(LOX)") + field(HOPR, "$(HIX)") + field(LOPR, "$(LOX)") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP") { + field(DESC, "Machine xp offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "urad") + field(PREC, "0") + field(VAL, "$(XP)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(DRVH, "$(HIXP)") + field(DRVL, "$(LOXP)") + field(HOPR, "$(HIXP)") + field(LOPR, "$(LOXP)") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y") { + field(DESC, "Machine y offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "um") + field(PREC, "0") + field(VAL, "$(Y)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(DRVH, "$(HIY)") + field(DRVL, "$(LOY)") + field(HOPR, "$(HIY)") + field(LOPR, "$(LOY)") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP") { + field(DESC, "Machine yp offset for $(beamline)") + field(ASG, "PROTECTED") + field(EGU, "urad") + field(PREC, "0") + field(VAL, "$(YP)") + field(PINI, "YES") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(DRVH, "$(HIYP)") + field(DRVL, "$(LOYP)") + field(HOPR, "$(HIYP)") + field(LOPR, "$(LOYP)") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +# Sum PVs for total desired orbit bumps, i.e., sum of machine and beamline +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") { + field(DESC, "Total x offset for $(beamline)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "0") + field(CALC, "A + B") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X") + field(INPB, "$(sourcepoint)-ORBITBUMP:OFFSET-X") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM1") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") { + field(DESC, "Total xp offset for $(beamline)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "0") + field(CALC, "A + B") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP") + field(INPB, "$(sourcepoint)-ORBITBUMP:OFFSET-XP") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM1") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") { + field(DESC, "Total y offset for $(beamline)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "0") + field(CALC, "A + B") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y") + field(INPB, "$(sourcepoint)-ORBITBUMP:OFFSET-Y") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM1") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") { + field(DESC, "Total y offset for $(beamline)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "0") + field(CALC, "A + B") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP") + field(INPB, "$(sourcepoint)-ORBITBUMP:OFFSET-YP") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM1") + field(HIHI, "100") + field(HHSV, "MAJOR") + field(HIGH, "1") + field(HSV, "MINOR") + field(LOW, "-1") + field(LSV, "MINOR") + field(LOLO, "-100") + field(LLSV, "MAJOR") +} + +# BPM1, C1xx, C1xpx, C1yy, C1ypy, + +record(stringout, "AGEBD-ORBITBUMP:$(sourcepoint)-BPM1") { + field(DESC, "$(BPM1)") + field(ASG, "READONLY") + field(VAL, "$(BPM1)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C1xx") { + field(DESC, "Coefficient dx2dx at $(BPM1)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C1xx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C1xpx") { + field(DESC, "Coefficient dxp2dx at $(BPM1)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C1xpx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C1yy") { + field(DESC, "Coefficient dy2dy at $(BPM1)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C1yy)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C1ypy") { + field(DESC, "Coefficient dyp2dy at $(BPM1)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C1ypy)") + field(PINI, "YES") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM1") { + field(DESC, "Hor. change for $(BPM1)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C1xx") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C1xpx") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM1):X-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM2") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM1") { + field(DESC, "Hor. change for $(BPM1)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C1yy") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C1ypy") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM1):Y-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM2") +} + +# BPM2, C2xx, C2xpx, C2yy, C2ypy, + +record(stringout, "AGEBD-ORBITBUMP:$(sourcepoint)-BPM2") { + field(DESC, "$(BPM2)") + field(ASG, "READONLY") + field(VAL, "$(BPM2)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C2xx") { + field(DESC, "Coefficient dx2dx at $(BPM2)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C2xx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C2xpx") { + field(DESC, "Coefficient dxp2dx at $(BPM2)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C2xpx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C2yy") { + field(DESC, "Coefficient dy2dy at $(BPM2)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C2yy)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C2ypy") { + field(DESC, "Coefficient dyp2dy at $(BPM2)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C2ypy)") + field(PINI, "YES") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM2") { + field(DESC, "Hor. change for $(BPM2)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C2xx") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C2xpx") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(INPE, "$(sourcepoint)-ORBITBUMP:OFFSET-X") + field(INPF, "$(sourcepoint)-ORBITBUMP:OFFSET-XP") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM2):X-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM3") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM2") { + field(DESC, "Hor. change for $(BPM2)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C2yy") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C2ypy") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM2):Y-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM3") +} + +# BPM3, C3xx, C3xpx, C3yy, C3ypy, + +record(stringout, "AGEBD-ORBITBUMP:$(sourcepoint)-BPM3") { + field(DESC, "$(BPM3)") + field(VAL, "$(BPM3)") + field(ASG, "READONLY") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C3xx") { + field(DESC, "Coefficient dx2dx at $(BPM3)") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C3xx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C3xpx") { + field(DESC, "Coefficient dxp2dx at $(BPM3)") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C3xpx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C3yy") { + field(DESC, "Coefficient dy2dy at $(BPM3)") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C3yy)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C3ypy") { + field(DESC, "Coefficient dyp2dy at $(BPM3)") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C3ypy)") + field(PINI, "YES") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM3") { + field(DESC, "Hor. change for $(BPM3)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C3xx") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C3xpx") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(INPE, "$(sourcepoint)-ORBITBUMP:OFFSET-X") + field(INPF, "$(sourcepoint)-ORBITBUMP:OFFSET-XP") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM3):X-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM4") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM3") { + field(DESC, "Hor. change for $(BPM3)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C3yy") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C3ypy") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM3):Y-B-REF-OP") + field(FLNK, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM4") +} + +# BPM4, C4xx, C4xpx, C4yy, C4ypy, + +record(stringout, "AGEBD-ORBITBUMP:$(sourcepoint)-BPM4") { + field(DESC, "$(BPM4)") + field(ASG, "READONLY") + field(VAL, "$(BPM4)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C4xx") { + field(DESC, "Coefficient dx2dx at $(BPM4)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C4xx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C4xpx") { + field(DESC, "Coefficient dxp2dx at $(BPM4)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C4xpx)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C4yy") { + field(DESC, "Coefficient dy2dy at $(BPM4)") + field(ASG, "READONLY") + field(EGU, "mm/mm") + field(PREC, "3") + field(VAL, "$(C4yy)") + field(PINI, "YES") +} + +record(ao, "AGEBD-ORBITBUMP:$(sourcepoint)-C4ypy") { + field(DESC, "Coefficient dyp2dy at $(BPM4)") + field(ASG, "READONLY") + field(EGU, "mm/mrad") + field(PREC, "3") + field(VAL, "$(C4ypy)") + field(PINI, "YES") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM4") { + field(DESC, "Hor. change for $(BPM4)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C4xx") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C4xpx") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL") + field(INPE, "$(sourcepoint)-ORBITBUMP:OFFSET-X") + field(INPF, "$(sourcepoint)-ORBITBUMP:OFFSET-XP") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM4):X-B-REF-OP") +} + +record(calcout, "AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM4") { + field(DESC, "Hor. change for $(BPM4)") + field(ASG, "READONLY") + field(SCAN, "Passive") + field(PREC, "3") + field(CALC, "A*B/1000 + C*D/1000") + field(INPA, "AGEBD-ORBITBUMP:$(sourcepoint)-C4yy") + field(INPB, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL") + field(INPC, "AGEBD-ORBITBUMP:$(sourcepoint)-C4ypy") + field(INPD, "AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL") + field(OOPT, "On Change") + field(DOPT, "Use CALC") + field(OUT, "$(BPM4):Y-B-REF-OP") +} \ No newline at end of file diff --git a/services/orbitbump/current/ioc/README.md b/services/orbitbump/current/ioc/README.md new file mode 100644 index 0000000..9a0741c --- /dev/null +++ b/services/orbitbump/current/ioc/README.md @@ -0,0 +1 @@ +# TODO: dev/prod templating diff --git a/services/orbitbump/current/ioc/startup.script b/services/orbitbump/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/orbitbump/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump.ui b/services/orbitbump/current/qt/A_BD_OrbitBump.ui new file mode 100644 index 0000000..fcc9232 --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump.ui @@ -0,0 +1,409 @@ + + + MainWindow + + + + 0 + 0 + 770 + 990 + + + + MainWindow + + + + + + 10 + 220 + 750 + 346 + + + + sourcepoint=X01DA,beamline=Debye;sourcepoint=X02DA,beamline=S-TOMCAT;sourcepoint=X03DA,beamline=PEARL;sourcepoint=X04DB,beamline=VUV;sourcepoint=X05DA,beamline=Optics;sourcepoint=X06DA,beamline=PXIII;sourcepoint=X07DB,beamline=nanoXAS;sourcepoint=X07DA,beamline=PolLux;sourcepoint=X10DA,beamline=SuperXAS + + + A_BD_OrbitBump_Operator_inc.ui + + + 9 + + + 5 + + + + + + 10 + 80 + 750 + 100 + + + + sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO;sourcepoint=X10DG,beamline=X11HEAT + + + A_BD_OrbitBump_Operator_inc.ui + + + 3 + + + 5 + + + + + + 10 + 190 + 261 + 30 + + + + + 18 + 75 + true + + + + Dipole Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 50 + 291 + 30 + + + + + 18 + 75 + true + + + + Diagnostic Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 570 + 261 + 30 + + + + + 18 + 75 + true + + + + ID Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 600 + 750 + 541 + + + + sourcepoint=X02SA,beamline=I-TOMCAT;sourcepoint=X03MA,beamline=ADRESS;sourcepoint=X04SA,beamline=ADDAMS;sourcepoint=X05LA,beamline=QUEST;sourcepoint=X06SA,beamline=PXI;sourcepoint=X07MA,beamline=Phoenix/XTreme;sourcepoint=X08SA,beamline=micro-XAS;sourcepoint=X09LA,beamline=PEARL/XIL-II;sourcepoint=X10SA,beamline=PXII;sourcepoint=X11MA,beamline=SIM;sourcepoint=X12SA,beamline=cSAXS + + + A_BD_OrbitBump_Operator_inc.ui + + + 11 + + + 5 + + + + + + 330 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 440 + 50 + 100 + 30 + + + + + 15 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + 550 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 660 + 50 + 100 + 30 + + + + + 15 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 598 + 4 + 170 + 30 + + + + Expert Panel All + + + + 183 + 157 + 92 + + + + Expert Panel All + + + A_BD_OrbitBump_Expert_all.ui + + + + + + 2 + 2 + 767 + 33 + + + + + Sans Serif + 20 + 75 + false + true + + + + Beamline local Bumps + + + Qt::AlignLeading + + + + 255 + 255 + 255 + + + + + 100 + 100 + 100 + + + + caLabel::Static + + + + + + 800 + 260 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:ORBITBUMP-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 800 + 320 + 70 + 20 + + + + cainclude + cainclude_2 + calabel + calabel_2 + calabel_3 + cainclude_3 + calabel_4 + calabel_5 + calabel_6 + calabel_7 + calabel_8 + carelateddisplay + cacalc_2 + wmsignalpropagator + + + + + caRelatedDisplay + QWidget +
caRelatedDisplay
+
+ + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 844 + 271 + + + 847 + 327 + + + + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_Expert.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert.ui new file mode 100644 index 0000000..328eafb --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert.ui @@ -0,0 +1,465 @@ + + + MainWindow + + + + 0 + 0 + 1801 + 196 + + + + MainWindow + + + + + + 10 + 72 + 1790 + 120 + + + + sourcepoint=$(sourcepoint),beamline=$(beamline) + + + A_BD_OrbitBump_Expert_inc.ui + + + 1 + + + 1 + + + + + + 240 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 354 + 42 + 100 + 30 + + + + + 15 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + 462 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 574 + 42 + 100 + 30 + + + + + 15 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 686 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 1 + + + Qt::AlignCenter + + + + + + 966 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 2 + + + Qt::AlignCenter + + + + + + 1246 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 3 + + + Qt::AlignCenter + + + + + + 1526 + 42 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 4 + + + Qt::AlignCenter + + + + + + 791 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 876 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1071 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1156 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1631 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1351 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1716 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1436 + 42 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 0 + 0 + 1909 + 33 + + + + + Sans Serif + 20 + 75 + false + true + + + + $(sourcepoint) $(beamline) + + + Qt::AlignLeading + + + + 255 + 255 + 255 + + + + + 100 + 100 + 100 + + + + caLabel::Static + + + + + + + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+
+ + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_ExpertBackUp.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_ExpertBackUp.ui new file mode 100644 index 0000000..780ccbc --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_ExpertBackUp.ui @@ -0,0 +1,183 @@ + + + MainWindow + + + + 0 + 0 + 1178 + 600 + + + + MainWindow + + + + + + 80 + 30 + 460 + 40 + + + + + 16 + 75 + true + + + + AGEBD-ORBITBUMP:BEAMLINE-BEND + + + + + + 650 + 30 + 460 + 40 + + + + + 16 + 75 + true + + + + AGEBD-ORBITBUMP:BEAMLINE-ID + + + + + + 270 + 340 + 501 + 51 + + + + AGEBD-ORBITBUMP:BEAMLINECALC + + + caLineEdit::Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 50 + 110 + 501 + 51 + + + + AGEBD-ORBITBUMP:BEAMLINETYPE-BEND + + + caLineEdit::Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 270 + 230 + 501 + 51 + + + + AGEBD-ORBITBUMP:BEAMLINETYPE + + + caLineEdit::Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 630 + 110 + 501 + 51 + + + + AGEBD-ORBITBUMP:BEAMLINETYPE-ID + + + caLineEdit::Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 260 + 450 + 501 + 51 + + + + AGEBD-ORBITBUMP:BEAMLINE + + + caLineEdit::Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + + caMenu + QComboBox +
caMenu
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+
+ + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_all.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_all.ui new file mode 100644 index 0000000..b5f2dd1 --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_all.ui @@ -0,0 +1,1273 @@ + + + MainWindow + + + + 0 + 0 + 1819 + 1470 + + + + MainWindow + + + + + + 0 + 2 + 1837 + 33 + + + + + Sans Serif + 20 + 75 + false + true + + + + Beamline local Bumps Expert + + + Qt::AlignLeading + + + + 255 + 255 + 255 + + + + + 100 + 100 + 100 + + + + caLabel::Static + + + + + + 0 + 40 + 1819 + 1430 + + + + 0 + + + + Diagnostic Beamlines + + + + + 570 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 1629 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 964 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 2 + + + Qt::AlignCenter + + + + + + 240 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 1524 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 4 + + + Qt::AlignCenter + + + + + + 460 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 10 + 40 + 1790 + 242 + + + + sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO + + + A_BD_OrbitBump_Expert_inc.ui + + + 2 + + + 2 + + + + + + 684 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 1 + + + Qt::AlignCenter + + + + + + 1349 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 874 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1069 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 789 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1434 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1154 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1244 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 3 + + + Qt::AlignCenter + + + + + + 1714 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 350 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + Dipole Beamlines + + + + + 1067 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1242 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 3 + + + Qt::AlignCenter + + + + + + 682 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 1 + + + Qt::AlignCenter + + + + + + 1432 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 570 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 1627 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 240 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 350 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + 872 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1522 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 4 + + + Qt::AlignCenter + + + + + + 787 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 962 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 2 + + + Qt::AlignCenter + + + + + + 1347 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1152 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 460 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 1712 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 10 + 40 + 1790 + 1096 + + + + sourcepoint=X01DA,beamline=Debye;sourcepoint=X02DA,beamline=S-TOMCAT;sourcepoint=X03DA,beamline=PEARL;sourcepoint=X04DB,beamline=VUV;sourcepoint=X05DA,beamline=Optics;sourcepoint=X06DA,beamline=PXIII;sourcepoint=X07DB,beamline=nanoXAS;sourcepoint=X07DA,beamline=PolLux;sourcepoint=X10DA,beamline=SuperXAS + + + A_BD_OrbitBump_Expert_inc.ui + + + 9 + + + 2 + + + + + + ID Beamlines + + + + + 10 + 40 + 1790 + 1340 + + + + sourcepoint=X02SA,beamline=I-TOMCAT;sourcepoint=X03MA,beamline=ADRESS;sourcepoint=X04SA,beamline=ADDAMS;sourcepoint=X05LA,beamline=QUEST;sourcepoint=X06SA,beamline=PXI;sourcepoint=X07MA,beamline=Phoenix/XTreme;sourcepoint=X08SA,beamline=micro-XAS;sourcepoint=X09LA,beamline=PEARL/XIL-II;sourcepoint=X10SA,beamline=PXII;sourcepoint=X11MA,beamline=SIM;sourcepoint=X12SA,beamline=cSAXS + + + A_BD_OrbitBump_Expert_inc.ui + + + 11 + + + 2 + + + + + + 872 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1522 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 4 + + + Qt::AlignCenter + + + + + + 1627 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 682 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 1 + + + Qt::AlignCenter + + + + + + 1242 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 3 + + + Qt::AlignCenter + + + + + + 1432 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 240 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 787 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 350 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + 962 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + BPM 2 + + + Qt::AlignCenter + + + + + + 1067 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 1712 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + 1347 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dx + + + Qt::AlignCenter + + + + + + 460 + 6 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 570 + 6 + 100 + 30 + + + + + 15 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 1152 + 6 + 80 + 30 + + + + + 18 + 50 + false + + + + dy + + + Qt::AlignCenter + + + + + + + + + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+
+ + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_inc.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_inc.ui new file mode 100644 index 0000000..2aa7420 --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_Expert_inc.ui @@ -0,0 +1,627 @@ + + + MainWindow + + + + 0 + 0 + 1790 + 120 + + + + MainWindow + + + + + + 779 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM1 + + + + + + 864 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM1 + + + + + + 1059 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM2 + + + + + + 1144 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM2 + + + + + + 230 + 1 + 100 + 30 + + + + 3 + + + 0 + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 340 + 1 + 100 + 30 + + + + 3 + + + 0 + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 560 + 1 + 100 + 30 + + + + 3 + + + 0 + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 450 + 1 + 100 + 30 + + + + 3 + + + 0 + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 1619 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM4 + + + + + + 1424 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM3 + + + + + + 1704 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM4 + + + + + + 1339 + 1 + 80 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM3 + + + + + + 674 + 1 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-BPM1 + + + + + + 954 + 1 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-BPM2 + + + + + + 1234 + 1 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-BPM3 + + + + + + 1514 + 1 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-BPM4 + + + + + + 450 + 42 + 100 + 30 + + + + 3 + + + 0 + + + $(sourcepoint)-ORBITBUMP:OFFSET-Y + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 230 + 42 + 100 + 30 + + + + 3 + + + 0 + + + $(sourcepoint)-ORBITBUMP:OFFSET-X + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 560 + 42 + 100 + 30 + + + + 3 + + + 0 + + + $(sourcepoint)-ORBITBUMP:OFFSET-YP + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 340 + 42 + 100 + 30 + + + + 3 + + + 0 + + + $(sourcepoint)-ORBITBUMP:OFFSET-XP + + + caSpinbox::Alarm + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 0 + 40 + 225 + 30 + + + + Beamline setpoint + + + + + + 0 + 0 + 1790 + 120 + + + + + + + 230 + 80 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL + + + caLineEdit::Alarm_Default + + + false + + + caLineEdit::onBackground + + + + + + 450 + 80 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 560 + 80 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 340 + 80 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 0 + 80 + 225 + 30 + + + + Total Bump + + + + + + 0 + 2 + 225 + 30 + + + + Machine setpoint + + + cagraphics + calineedit + calineedit_2 + calineedit_3 + calineedit_4 + caspinbox_2 + caspinbox_3 + caspinbox_4 + caspinbox_5 + calineedit_5 + calineedit_6 + calineedit_7 + calineedit_8 + calineedit_9 + calineedit_10 + calineedit_11 + calineedit_12 + caspinbox_6 + caspinbox_7 + caspinbox_8 + caspinbox_9 + calabel_3 + calineedit_17 + calineedit_18 + calineedit_19 + calineedit_20 + calabel_5 + calabel_6 + + + + + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caGraphics + QWidget +
caGraphics
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+
+ + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_Operator.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_Operator.ui new file mode 100644 index 0000000..0a66761 --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_Operator.ui @@ -0,0 +1,291 @@ + + + MainWindow + + + + 0 + 0 + 770 + 950 + + + + MainWindow + + + + + + 10 + 190 + 750 + 346 + + + + sourcepoint=X01DA,beamline=Debye;sourcepoint=X02DA,beamline=S-TOMCAT;sourcepoint=X03DA,beamline=PEARL;sourcepoint=X04DB,beamline=VUV;sourcepoint=X05DA,beamline=Optics;sourcepoint=X06DA,beamline=PXIII;sourcepoint=X07DB,beamline=nanoXAS;sourcepoint=X07DA,beamline=PolLux;sourcepoint=X10DA,beamline=SuperXAS + + + A_BD_OrbitBump_Operator_inc.ui + + + 9 + + + 5 + + + + + + 10 + 80 + 750 + 80 + + + + sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO + + + A_BD_OrbitBump_Operator_inc.ui + + + 2 + + + 5 + + + + + + 10 + 160 + 261 + 30 + + + + + 18 + 75 + true + + + + Dipole Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 50 + 291 + 30 + + + + + 18 + 75 + true + + + + Diagnostic Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 530 + 261 + 30 + + + + + 18 + 75 + true + + + + ID Beamlines + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 560 + 750 + 541 + + + + sourcepoint=X02SA,beamline=I-TOMCAT;sourcepoint=X03MA,beamline=ADRESS;sourcepoint=X04SA,beamline=ADDAMS;sourcepoint=X05LA,beamline=QUEST;sourcepoint=X06SA,beamline=PXI;sourcepoint=X07MA,beamline=Phoenix/XTreme;sourcepoint=X08SA,beamline=micro-XAS;sourcepoint=X09LA,beamline=PEARL/XIL-II;sourcepoint=X10SA,beamline=PXII;sourcepoint=X11MA,beamline=SIM;sourcepoint=X12SA,beamline=cSAXS + + + A_BD_OrbitBump_Operator_inc.ui + + + 11 + + + 5 + + + + + + 330 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + X (um) + + + Qt::AlignCenter + + + + + + 440 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + X' (urad) + + + Qt::AlignCenter + + + + + + 550 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + Y (um) + + + Qt::AlignCenter + + + + + + 660 + 50 + 100 + 30 + + + + + 18 + 75 + true + + + + Y' (urad) + + + Qt::AlignCenter + + + + + + 590 + 10 + 170 + 30 + + + + Expert Panel + + + + 183 + 157 + 92 + + + + Expert Panel + + + A_BD_OrbitBump_Expert.ui + + + + + + + caRelatedDisplay + QWidget +
caRelatedDisplay
+
+ + caLabel + QLabel +
caLabel
+
+ + caInclude + QWidget +
caInclude
+
+
+ + +
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump_Operator_inc.ui b/services/orbitbump/current/qt/A_BD_OrbitBump_Operator_inc.ui new file mode 100644 index 0000000..2845c39 --- /dev/null +++ b/services/orbitbump/current/qt/A_BD_OrbitBump_Operator_inc.ui @@ -0,0 +1,159 @@ + + + MainWindow + + + + 0 + 0 + 750 + 30 + + + + MainWindow + + + + + + 160 + 0 + 150 + 30 + + + + $(beamline) + + + + + + 320 + 0 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL + + + caLineEdit::Alarm_Default + + + false + + + caLineEdit::onBackground + + + + + + 430 + 0 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 540 + 0 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 650 + 0 + 100 + 30 + + + + AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + + + + 0 + 0 + 150 + 30 + + + + -$(sourcepoint) Expert + + + + 183 + 157 + 92 + + + + $(sourcepoint) Expert + + + A_BD_OrbitBump_Expert.ui + + + sourcepoint=$(sourcepoint),beamline=$(beamline) + + + + + + + caRelatedDisplay + QWidget +
caRelatedDisplay
+
+ + caLabel + QLabel +
caLabel
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+
+ + +
diff --git a/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service b/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service new file mode 100644 index 0000000..4358d12 --- /dev/null +++ b/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-ORBITBUMP +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh ORBITBUMP +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-ORBITBUMP.service +# systemctl --user start AGEBD-SERVICE-ORBITBUMP diff --git a/services/plots/current/app/pyproject.toml b/services/plots/current/app/pyproject.toml new file mode 100644 index 0000000..facd875 --- /dev/null +++ b/services/plots/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-plots" +version = "0.1.0" +description = "AGEBD-PLOTS Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/plots/current/app/src/agebd_plots/__init__.py b/services/plots/current/app/src/agebd_plots/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/plots/current/app/src/agebd_plots/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/plots/current/app/src/agebd_plots/main.py b/services/plots/current/app/src/agebd_plots/main.py new file mode 100644 index 0000000..a89cd64 --- /dev/null +++ b/services/plots/current/app/src/agebd_plots/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_plots import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "PLOTS" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/plots/current/app/src/agebd_plots/service.py b/services/plots/current/app/src/agebd_plots/service.py new file mode 100644 index 0000000..cbd8253 --- /dev/null +++ b/services/plots/current/app/src/agebd_plots/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-PLOTS:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-PLOTS:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-PLOTS:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/plots/current/app/tests/test_app.py b/services/plots/current/app/tests/test_app.py new file mode 100644 index 0000000..842d66f --- /dev/null +++ b/services/plots/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_plots import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/plots/current/app/uv.lock b/services/plots/current/app/uv.lock new file mode 100644 index 0000000..f8e7691 --- /dev/null +++ b/services/plots/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-plots" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs new file mode 100644 index 0000000..250d28c --- /dev/null +++ b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs @@ -0,0 +1,64 @@ +file PLOTS_timeaxis.template { + pattern + { DEVICE } + { AGEBD-PLOTS{{ agebd_env }} } +} + + +file PLOTS_9h.template { + pattern + { DEVICE, NAME, INP } + { AGEBD-PLOTS{{ agebd_env }}, CURRENT, AGEBD-PARAMS:CURRENT } + { AGEBD-PLOTS{{ agebd_env }}, CURRENT-BPM, AGEBD-DBPM3CURR:CURRENT-AVG } + { AGEBD-PLOTS{{ agebd_env }}, CURRENT-PCT, ARS07-DPCT-0000:CURR } + { AGEBD-PLOTS{{ agebd_env }}, INJECTION-RATE, AGEBD-PARAMS:INJECTION-RATE } + { AGEBD-PLOTS{{ agebd_env }}, TRANSMISSION, AGEBD-PARAMS:TRANSMISSION } + { AGEBD-PLOTS{{ agebd_env }}, LIFETIME, AGEBD-PARAMS:LIFETIME } + { AGEBD-PLOTS{{ agebd_env }}, MAVAC-AVG, ARIVA-VMAVE:PRESS-AVE } + { AGEBD-PLOTS{{ agebd_env }}, MAVAC-MAX, ARIVA-VMAVE:PRESS-MAX } + { AGEBD-PLOTS{{ agebd_env }}, FEVAC-AVG, ARIVA-VMAVE-FE:PRESS-AVE } + { AGEBD-PLOTS{{ agebd_env }}, FEVAC-MAX, ARIVA-VMAVE-FE:PRESS-MAX } + { AGEBD-PLOTS{{ agebd_env }}, ABRTL-DDRM-0670, ABRTL-DDRM-0670:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ABRTL-DDRM-0950, ABRTL-DDRM-0950:FET1_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, X05LA-DDRM-0330, X05LA-DDRM-0330:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, X05LA-DDRM-0650, X05LA-DDRM-0650:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, X09LA-DDRM-0330, X09LA-DDRM-0330:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, X09LA-DDRM-0790, X09LA-DDRM-0790:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS01-DDRM-0375, ARS01-DDRM-0375:FET1_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS01-DDRM-1530, ARS01-DDRM-1530:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS05-DDRM-1530, ARS05-DDRM-1530:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS05-DDRM-3500, ARS05-DDRM-3500:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS09-DDRM-1530, ARS09-DDRM-1530:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS09-DDRM-3500, ARS09-DDRM-3500:FET2_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS12-DDRM-1530, ARS12-DDRM-1530:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS12-DDRM-3500, ARS12-DDRM-3500:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS12-DDRM-4400, ARS12-DDRM-4400:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, ARS12-DDRM-5480, ARS12-DDRM-5480:FET1_BIAS_DOSE} + { AGEBD-PLOTS{{ agebd_env }}, X02SA-UIND-GAP, AGEOP-STATUS:X02SA-UIND-GAP} # Soft Blue #A0C4FF + # { AGEBD-PLOTS{{ agebd_env }}, X03MA-UIND-GAP, AGEOP-STATUS:X03MA-UIND-GAP} # Warm Orange #FFD6A5 + { AGEBD-PLOTS{{ agebd_env }}, X04SA-UIND-GAP, AGEOP-STATUS:X04SA-UIND-GAP} # Light Green #CAFFBF + # { AGEBD-PLOTS{{ agebd_env }}, X05LA-UIND-GAP, AGEOP-STATUS:X05LA-UIND-GAP} # Coral Red #FFADAD + { AGEBD-PLOTS{{ agebd_env }}, X06SA-UIND-GAP, AGEOP-STATUS:X06SA-UIND-GAP} # Lavender #CDB4DB + # { AGEBD-PLOTS{{ agebd_env }}, X07MA-UIND-GAP, AGEOP-STATUS:X07MA-UIND-GAP} # Desert Tan #DDB892 + # { AGEBD-PLOTS{{ agebd_env }}, X08SA-UIND-GAP, AGEOP-STATUS:X08SA-UIND-GAP} # Peach Pink #FFB5A7 + { AGEBD-PLOTS{{ agebd_env }}, X09LB-UIND-GAP, AGEOP-STATUS:X09LB-UIND-GAP} # Aqua Blue #9BF6FF + { AGEBD-PLOTS{{ agebd_env }}, X10SA-UIND-GAP, AGEOP-STATUS:X10SA-UIND-GAP} # Pale Yellow #FDFFB6 + { AGEBD-PLOTS{{ agebd_env }}, X11MA-UIND2-GAP, AGEOP-STATUS:X11MA-UIND2-GAP} # Periwinkle #BDB2FF + { AGEBD-PLOTS{{ agebd_env }}, X12SA-UIND-GAP, AGEOP-STATUS:X12SA-UIND-GAP} # Mint Green #B0F2C2 +} + +file PLOTS_week.template { + pattern + { DEVICE, NAME, INP } + { AGEBD-PLOTS{{ agebd_env }}, CURRENT-BPM, AGEBD-DBPM3CURR:CURRENT-AVG } + { AGEBD-PLOTS{{ agebd_env }}, CURRENT-PCT, ARS07-DPCT-0000:CURR } + { AGEBD-PLOTS{{ agebd_env }}, TAU-BPM, AGEBD-TAUBPM:TAU } + { AGEBD-PLOTS{{ agebd_env }}, TAU-PCT, AGEBD-TAUPCT:TAU } + { AGEBD-PLOTS{{ agebd_env }}, TAU-TOPUP, AGEBD-SCRUBBING:TOPUP-TAU } + { AGEBD-PLOTS{{ agebd_env }}, INJRATE-BPM, AGEBD-TAUBPM:INJRATE } + { AGEBD-PLOTS{{ agebd_env }}, INJRATE-PCT, AGEBD-TAUPCT:INJRATE } + { AGEBD-PLOTS{{ agebd_env }}, MAVAC-AVG, ARIVA-VMAVE:PRESS-AVE } + { AGEBD-PLOTS{{ agebd_env }}, MAVAC-MAX, ARIVA-VMAVE:PRESS-MAX } + { AGEBD-PLOTS{{ agebd_env }}, FEVAC-AVG, ARIVA-VMAVE-FE:PRESS-AVE } + { AGEBD-PLOTS{{ agebd_env }}, FEVAC-MAX, ARIVA-VMAVE-FE:PRESS-MAX } +} diff --git a/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/plots/current/ioc/PLOTS_9h.template b/services/plots/current/ioc/PLOTS_9h.template new file mode 100644 index 0000000..707d073 --- /dev/null +++ b/services/plots/current/ioc/PLOTS_9h.template @@ -0,0 +1,8 @@ +## 9 Hour Plots +record(compress, "$(DEVICE):$(NAME)-9h-BUFFER") { + field(DESC, "9h Buffer for SLS Status Panel") + field(SCAN, "1 second") + field(INP, "$(INP)") + field(ALG, "Circular Buffer") + field(NSAM, "32400") +} diff --git a/services/plots/current/ioc/PLOTS_timeaxis.template b/services/plots/current/ioc/PLOTS_timeaxis.template new file mode 100644 index 0000000..974d670 --- /dev/null +++ b/services/plots/current/ioc/PLOTS_timeaxis.template @@ -0,0 +1,23 @@ +# 9 Hour Plots +record(waveform, "$(DEVICE):PAST-9-HOURS") { + field(DESC, "Time axis for 9h buffer") + field(EGU, "h") + field(FTVL, "FLOAT") + field(DTYP, "sequence") + field(NELM, "32400") + field(LOPR, "-9.0") + field(HOPR, "0.0") + field(PINI, "YES") +} + +# 1 Week Plot +record(waveform, "$(DEVICE):PAST-168-HOURS") { + field(DESC, "Time axis for 1 week buffer") + field(EGU, "h") + field(FTVL, "FLOAT") + field(DTYP, "sequence") + field(NELM, "604800") + field(LOPR, "-168.0") + field(HOPR, "0.0") + field(PINI, "YES") +} \ No newline at end of file diff --git a/services/plots/current/ioc/PLOTS_week.template b/services/plots/current/ioc/PLOTS_week.template new file mode 100644 index 0000000..cd5e692 --- /dev/null +++ b/services/plots/current/ioc/PLOTS_week.template @@ -0,0 +1,8 @@ +## 1 Week Plot +record(compress, "$(DEVICE):$(NAME)-168h-BUFFER") { + field(DESC, "1 Week Buffer for SLS Status Panel") + field(SCAN, "1 second") + field(INP, "$(INP)") + field(ALG, "Circular Buffer") + field(NSAM, "604800") +} diff --git a/services/plots/current/ioc/README.md b/services/plots/current/ioc/README.md new file mode 100644 index 0000000..13b004e --- /dev/null +++ b/services/plots/current/ioc/README.md @@ -0,0 +1,28 @@ +# Contact +:envelope: [Felix Armborst](mailto:felix.armborst@psi.ch) +:envelope: [Stefan Mäder](mailto:stefan.maeder@psi.ch) + +**The relevant panels are:**
+- 9h Plots for Panels (SLS status / Scrubbing) + +:pushpin: + Some useful tools/commands + +``` + ## ssh to you local clone of this repo on sls-lca + # (re-)install this ioc + ioc install -V --ioc AGEBD-CPCL-PLOTS + + # connect to ioc shell of running ioc and resart via ctrl+x to restart with made changes + ioc shell AGEBD-CPCL-PLOTS + + ## useful debugging commands + # get the most important variables,softioc server port etc + ioc boots AGEBD-CPCL-PLOTS + ioc records -f SLS --sort name --ioc AGEBD-CPCL-PLOTS >ioc_records.txt + ioc duplicates -f SLS + + # make a clean test installation + mkdir -p ./TTT; ioc install --instbase ./TTT --clean --ioc AGEBD-CPCL-PLOTS + meld ./TTT/AGEBD-CPCL-PLOTS /ioc/AGEBD-CPCL-PLOTS + ``` diff --git a/services/plots/current/ioc/startup.script b/services/plots/current/ioc/startup.script new file mode 100644 index 0000000..4da8df1 --- /dev/null +++ b/services/plots/current/ioc/startup.script @@ -0,0 +1,4 @@ +epicsEnvSet("ENGINEER", "Operation") +require array +require SynApps +addScan 300 diff --git a/services/plots/current/qt/A_BD_Plots.ui b/services/plots/current/qt/A_BD_Plots.ui new file mode 100644 index 0000000..0fa9278 --- /dev/null +++ b/services/plots/current/qt/A_BD_Plots.ui @@ -0,0 +1,103 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 0 + 60 + 100 + 50 + + + + 1 + + + 0 + + + AGEBD-PLOTS-DEV:AO + + + 9.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 0 + 601 + 22 + + + + Toggle AGEBD-ALH-DEV:PLOTS-ONOFF + + + AGEBD-ALH-DEV:PLOTS-ONOFF + + + + + + 6 + 34 + 401 + 21 + + + + + 13 + + + + Value of AGEBD-PLOTS-DEV:AO + + + + + + + 0 + 0 + 800 + 20 + + + + + + + + caNumeric + QFrame +
caNumeric
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+
+ + +
diff --git a/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service b/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service new file mode 100644 index 0000000..a1b82cd --- /dev/null +++ b/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-PLOTS +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh PLOTS +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-PLOTS.service +# systemctl --user start AGEBD-SERVICE-PLOTS diff --git a/services/postmortemlog/current/app/pyproject.toml b/services/postmortemlog/current/app/pyproject.toml new file mode 100644 index 0000000..dc6c4c3 --- /dev/null +++ b/services/postmortemlog/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-postmortemlog" +version = "0.1.0" +description = "AGEBD-POSTMORTEMLOG Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py new file mode 100644 index 0000000..0c762eb --- /dev/null +++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_postmortemlog import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "POSTMORTEMLOG" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py new file mode 100644 index 0000000..f0d50db --- /dev/null +++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-POSTMORTEMLOG:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-POSTMORTEMLOG:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-POSTMORTEMLOG:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/postmortemlog/current/app/tests/test_app.py b/services/postmortemlog/current/app/tests/test_app.py new file mode 100644 index 0000000..3da58c5 --- /dev/null +++ b/services/postmortemlog/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_postmortemlog import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/postmortemlog/current/app/uv.lock b/services/postmortemlog/current/app/uv.lock new file mode 100644 index 0000000..4d2e5ff --- /dev/null +++ b/services/postmortemlog/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-postmortemlog" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs new file mode 100644 index 0000000..628ba75 --- /dev/null +++ b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs @@ -0,0 +1,129 @@ +file POSTMORTEMLOG.template { + pattern + { DEVICE } + { AGEBD-POSTMORTEMLOG{{ agebd_env}} } +} + +file POSTMORTEMLOG_15min10Hz.template { + pattern + { DEVICE NAME INP} + # ---------- BEAM CURRENT -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} CURRBPM AGEBD-DBPM3CURR:CURRENT-AVG } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} CURRPCT ARS07-DPCT-0000:CURR } + # ---------- BEAM LIFETIME -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} TAUBPM AGEBD-TAUBPM:TAU } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} TAUPCT AGEBD-TAUPCT:TAU } + # ---------- TUNES -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} QX AGEBD-TUNEBUMP:QX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} QY AGEBD-TUNEBUMP:QY } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} QZ AGEBD-TUNEBUMP:QZ } + # ---------- LOSSES -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-DDRM-0375 ARS01-DDRM-0375:FET1_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ABRTL-DDRM-0670 ABRTL-DDRM-0670:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ABRTL-DDRM-0950 ABRTL-DDRM-0950:FET1_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-DDRM-1530 ARS01-DDRM-1530:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X05LA-DDRM-0330 X05LA-DDRM-0330:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-DDRM-1530 ARS05-DDRM-1530:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-DDRM-3500 ARS05-DDRM-3500:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X09LA-DDRM-0330 X09LA-DDRM-0330:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-DDRM-1530 ARS09-DDRM-1530:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-DDRM-3500 ARS09-DDRM-3500:FET2_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-DDRM-1530 ARS12-DDRM-1530:FET1_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-DDRM-3500 ARS12-DDRM-3500:FET2_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-DDRM-4400 ARS12-DDRM-4400:FET2_BIAS_DOSE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-DDRM-5480 ARS12-DDRM-5480:FET1_BIAS_DOSE } + # ---------- RF -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} MASTERFREQ-SET AGERF-MO01:FREQ-SET } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} MASTERFREQ-GET AGERF-MO01:FREQ-GET } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0140-INP ARS05-RCAV-0140:CO1i-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0060-INP ARS05-RCAV-0060:CO1i-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0230-INP ARS05-RCAV-0230:CO1i-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0310-INP ARS05-RCAV-0310:CO1i-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0060-REF ARS05-RCAV-0060:CO1r-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0140-REF ARS05-RCAV-0140:CO1r-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0230-REF ARS05-RCAV-0230:CO1r-POWER-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} RFPOW-0310-REF ARS05-RCAV-0310:CO1r-POWER-MAX } + # ---------- BEAM SIZE -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X01DD-SIGX X01DD-FE-CAM1:SIG-X } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X01DD-SIGY X01DD-FE-CAM1:SIG-Y } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X08DB-SIGX X08DB-FE-CAM1:SIG-X } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} X08DB-SIGY X08DB-FE-CAM1:SIG-Y } + # ---------- VACUUM -------------- + { AGEBD-POSTMORTEMLOG{{ agebd_env }} VACMAX ARIVA-VMAVE:PRESS-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} VACMAXFE ARIVA-VMAVE-FE:PRESS-MAX } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-0110 ARS01-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-0210 ARS01-VMCC-0210:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-0225 ARS01-VMCC-0225:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-0310 ARS01-VMCC-0310:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-1550 ARS01-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-3510 ARS01-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS01-VMCC-5460 ARS01-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-0110 ARS02-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-0210 ARS02-VMCC-0210:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-0310 ARS02-VMCC-0310:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-1550 ARS02-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-3510 ARS02-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS02-VMCC-5460 ARS02-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS03-VMCC-0110 ARS03-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS03-VMCC-0320 ARS03-VMCC-0320:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS03-VMCC-1550 ARS03-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS03-VMCC-3510 ARS03-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS03-VMCC-5460 ARS03-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS04-VMCC-0110 ARS04-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS04-VMCC-1550 ARS04-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS04-VMCC-3510 ARS04-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS04-VMCC-5460 ARS04-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0110 ARS05-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0115 ARS05-VMCC-0115:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0210 ARS05-VMCC-0210:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0215 ARS05-VMCC-0215:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0310 ARS05-VMCC-0310:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0315 ARS05-VMCC-0315:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0410 ARS05-VMCC-0410:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0415 ARS05-VMCC-0415:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0510 ARS05-VMCC-0510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0520 ARS05-VMCC-0520:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0530 ARS05-VMCC-0530:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-0810 ARS05-VMCC-0810:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-1550 ARS05-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-3510 ARS05-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS05-VMCC-5460 ARS05-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS06-VMCC-0110 ARS06-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS06-VMCC-1550 ARS06-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS06-VMCC-3510 ARS06-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS06-VMCC-5460 ARS06-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-0010 ARS07-VMCC-0010:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-0120 ARS07-VMCC-0120:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-0210 ARS07-VMCC-0210:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-1550 ARS07-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-3510 ARS07-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS07-VMCC-5460 ARS07-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS08-VMCC-0110 ARS08-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS08-VMCC-1550 ARS08-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS08-VMCC-3510 ARS08-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS08-VMCC-5460 ARS08-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-0110 ARS09-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-0120 ARS09-VMCC-0120:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-0410 ARS09-VMCC-0410:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-0510 ARS09-VMCC-0510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-0810 ARS09-VMCC-0810:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-1550 ARS09-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-3510 ARS09-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS09-VMCC-5460 ARS09-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS10-VMCC-0110 ARS10-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS10-VMCC-1550 ARS10-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS10-VMCC-3510 ARS10-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS10-VMCC-5460 ARS10-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-0110 ARS11-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-0210 ARS11-VMCC-0210:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-0310 ARS11-VMCC-0310:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-0410 ARS11-VMCC-0410:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-0510 ARS11-VMCC-0510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-1550 ARS11-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-3510 ARS11-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS11-VMCC-5460 ARS11-VMCC-5460:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-VMCC-0110 ARS12-VMCC-0110:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-VMCC-1550 ARS12-VMCC-1550:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-VMCC-3510 ARS12-VMCC-3510:PRESSURE } + { AGEBD-POSTMORTEMLOG{{ agebd_env }} ARS12-VMCC-5460 ARS12-VMCC-5460:PRESSURE } +} diff --git a/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/postmortemlog/current/ioc/POSTMORTEMLOG.template b/services/postmortemlog/current/ioc/POSTMORTEMLOG.template new file mode 100644 index 0000000..857d84a --- /dev/null +++ b/services/postmortemlog/current/ioc/POSTMORTEMLOG.template @@ -0,0 +1,37 @@ +# This is a template for preaparing an IOC providing BD Service specific PVs +# Access Security Groups: +# DEFAULT - logt wenn EGU oder so veraendert werden +# LOG - logt wenn neuer wert geschrieben wird +# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL +# READONLY - verhindert versuchte caputs und aktiviert caputlog +# Input links can specify CA, CP, or CPP. +# If the input link specifies CA, it will be forced to be a Channel Access link. +# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies. +# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links. +# + +record(ao, "$(DEVICE):AO") { + field(DESC, "Analog Output Record (ao)") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):BO") { + field(DESC, "Binary Output Record (bo)") + field(ASG, "READONLY") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") +} + +# TODO: ok? +record(bo, "$(DEVICE):CALLBACK") { + field(DESC, "Callback PV to listen to for changes") + field(ASG, "READONLY") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") +} \ No newline at end of file diff --git a/services/postmortemlog/current/ioc/POSTMORTEMLOG_15min10Hz.template b/services/postmortemlog/current/ioc/POSTMORTEMLOG_15min10Hz.template new file mode 100644 index 0000000..c287ae4 --- /dev/null +++ b/services/postmortemlog/current/ioc/POSTMORTEMLOG_15min10Hz.template @@ -0,0 +1,30 @@ +# Circular Buffer Record for Live Copy of desired PVs +record (compress, "$(DEVICE):BUFFER-$(NAME)") { + field(DESC, "15min 10Hz buffer for post mortem") + field(ASG, "READONLY") + field(SCAN, ".1 second") + field(INP, "$(INP)") + field(ALG, "Circular Buffer") + field(NSAM, "9000") +} + +# Records for automatically copying EPICS circular buffer Records after beam abort +record (waveform, "$(DEVICE):BUFFER-$(NAME)-LAST"){ + field(DESC, "Copy of post mortem buffer") + field(ASG, "READONLY") + field(FTVL, "FLOAT") + field(NELM, "9000") + field(INP, "$(DEVICE):BUFFER-$(NAME) VAL") + field(SCAN, "Event") # Process on event + field(EVNT, "1") # Event number to trigger +} + +# Records for writing to from HLA when viewing beam abort data history +record (waveform, "$(DEVICE):BUFFER-$(NAME)-HLA"){ + field(DESC, "Post mortem buffer filled by HLA") + field(ASG, "PROTECTED") + field(FTVL, "FLOAT") + field(NELM, "9000") +} + + diff --git a/services/postmortemlog/current/ioc/startup.script b/services/postmortemlog/current/ioc/startup.script new file mode 100644 index 0000000..b62221c --- /dev/null +++ b/services/postmortemlog/current/ioc/startup.script @@ -0,0 +1,2 @@ +epicsEnvSet("ENGINEER", "armborst") +require array diff --git a/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui b/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui new file mode 100644 index 0000000..0d48d96 --- /dev/null +++ b/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui @@ -0,0 +1,1197 @@ + + + MainWindow + + + Qt::WindowModal + + + + 0 + 0 + 1200 + 1275 + + + + MainWindow + + + false + + + + + + + + + 1460 + 210 + 70 + 20 + + + + + + + 1460 + 150 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:POSTMORTEMLOG-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 1450 + 260 + 91 + 21 + + + + 99999 + + + true + + + AGEBD-MASTER:LOG + + + + + + 5 + 5 + 1190 + 1265 + + + + 3 + + + + Live + + + + + 5 + 415 + 1175 + 200 + + + + Horizontal Tune (nominal: Qx = 39.37) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QX + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 620 + 1175 + 200 + + + + Vertival Tune (nominal: Qy = 15.22) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QY + + + + 139 + 26 + 150 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 1030 + 1175 + 200 + + + + Vertival Beam Size (nominal: Sig_y = 10) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGY + + + + 118 + 23 + 130 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGY + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 154 + 30 + 170 + + + + + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 825 + 1175 + 200 + + + + Horizontal Beam Size (nominal: Sig_x = 9) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGX + + + + 38 + 92 + 208 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGX + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 46 + 113 + 248 + + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 5 + 1175 + 200 + + + + Stored Beam Current + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRPCT + + + + 0 + 255 + 0 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRBPM + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 0 + 200 + 0 + + + + + + + + 255 + 255 + 255 + + + + + 0 + 200 + 0 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 210 + 1175 + 200 + + + + Beam Lifetime + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUBPM + + + caCartesianPlot::FatDots + + + + 38 + 92 + 208 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUPCT + + + caCartesianPlot::FatDots + + + caCartesianPlot::NoSymbol + + + + 46 + 113 + 248 + + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::User + + + -870;30 + + + 0;15 + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + Last + + + + + 5 + 1030 + 1175 + 200 + + + + Vertival Beam Size (nominal: Sig_y = 10) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGY-LAST + + + + 118 + 23 + 130 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGY-LAST + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 154 + 30 + 170 + + + + + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 5 + 1175 + 200 + + + + Stored Beam Current + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRPCT-LAST + + + + 0 + 255 + 0 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRBPM-LAST + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 0 + 200 + 0 + + + + + + + + 255 + 255 + 255 + + + + + 0 + 200 + 0 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 415 + 1175 + 200 + + + + Horizontal Tune (nominal: Qx = 39.37) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QX-LAST + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 825 + 1175 + 200 + + + + Horizontal Beam Size (nominal: Sig_x = 9) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGX-LAST + + + + 38 + 92 + 208 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGX-LAST + + + caCartesianPlot::Lines + + + caCartesianPlot::NoSymbol + + + + 46 + 113 + 248 + + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 620 + 1175 + 200 + + + + Vertival Tune (nominal: Qy = 15.22) + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QY-LAST + + + + 139 + 26 + 150 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + -870;30 + + + + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + 5 + 210 + 1175 + 200 + + + + Beam Lifetime + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUBPM-LAST + + + caCartesianPlot::FatDots + + + + 38 + 92 + 208 + + + + AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUPCT-LAST + + + caCartesianPlot::FatDots + + + caCartesianPlot::NoSymbol + + + + 46 + 113 + 248 + + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::User + + + caCartesianPlot::User + + + -870;30 + + + 0;15 + + + true + + + false + + + 9 + + + caCartesianPlot::linear + + + + + + Historic + + + + + Debug + + + + + 0 + 40 + 1187 + 1200 + + + + QTextEdit::NoWrap + + + + + + 250 + 5 + 241 + 30 + + + + Update Logs + + + AGEBD-MASTER:POSTMORTEMLOG-LOGS-REQ + + + Update Logs + + + + 160 + 160 + 160 + + + + + + + 1 + + + + + + 0 + 5 + 241 + 30 + + + + Test Trigger Post Mortem + + + AGEBD-POSTMORTEMLOG:TEST + + + Test Trigger Post Mortem + + + + 160 + 160 + 160 + + + + + + + 1 + + + + + + + + + caMessageButton + QPushButton +
caMessageButton
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 1460 + 159 + + + 1460 + 222 + + + + + calineedit + textChanged(QString) + textBrowser + setHtml(QString) + + + 1495 + 270 + + + 600 + 671 + + + + +
diff --git a/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service b/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service new file mode 100644 index 0000000..eb0ff43 --- /dev/null +++ b/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-POSTMORTEMLOG +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh POSTMORTEMLOG +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service +# systemctl --user start AGEBD-SERVICE-POSTMORTEMLOG diff --git a/services/scrubbing/current/app/pyproject.toml b/services/scrubbing/current/app/pyproject.toml new file mode 100644 index 0000000..f984959 --- /dev/null +++ b/services/scrubbing/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-scrubbing" +version = "0.1.0" +description = "AGEBD-SCRUBBING Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py b/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/main.py b/services/scrubbing/current/app/src/agebd_scrubbing/main.py new file mode 100644 index 0000000..b92c9fc --- /dev/null +++ b/services/scrubbing/current/app/src/agebd_scrubbing/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_scrubbing import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "SCRUBBING" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/service.py b/services/scrubbing/current/app/src/agebd_scrubbing/service.py new file mode 100644 index 0000000..06d6f6d --- /dev/null +++ b/services/scrubbing/current/app/src/agebd_scrubbing/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-SCRUBBING:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-SCRUBBING:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-SCRUBBING:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/scrubbing/current/app/tests/test_app.py b/services/scrubbing/current/app/tests/test_app.py new file mode 100644 index 0000000..4e3b1a8 --- /dev/null +++ b/services/scrubbing/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_scrubbing import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/scrubbing/current/app/uv.lock b/services/scrubbing/current/app/uv.lock new file mode 100644 index 0000000..fadbe6f --- /dev/null +++ b/services/scrubbing/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-scrubbing" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs new file mode 100644 index 0000000..c5f2732 --- /dev/null +++ b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs @@ -0,0 +1,4 @@ +file SCRUBBING.template { + pattern { DEVICE } + { AGEBD-SCRUBBING{{ agebd_env }} } +} diff --git a/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/scrubbing/current/ioc/SCRUBBING.template b/services/scrubbing/current/ioc/SCRUBBING.template new file mode 100644 index 0000000..94ad8aa --- /dev/null +++ b/services/scrubbing/current/ioc/SCRUBBING.template @@ -0,0 +1,290 @@ +# HLA Service Control Parameters + +record(mbbo, "$(DEVICE):CONTROL-SCRUB") { + field(DESC, "Scrubbing Mode") + field(ASG, "PROTECTED") + field(ZRST, "Off") + field(ZRVL, "0") + field(ONST, "Vertical Pinger") + field(ONVL, "1") + field(TWST, "Horizontal Pingers") + field(TWVL, "2") + field(THST, "Both Pingers") + field(THVL, "3") + field(FRST, "Vertical MBFB") + field(FRVL, "4") + field(FVST, "Horizontal MBFB") + field(FVVL, "5") + field(SXST, "Both MBFBs") + field(SXVL, "6") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-MAX") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "PROTECTED") + field(EGU, "1e-9 mbar") + field(VAL, "360") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-DYN") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "PROTECTED") + field(EGU, "1e-9 mbar") + field(VAL, "27") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-DYN-FRAC") { + field(DESC, "Fraction defining dynamic pressure ") + field(ASG, "PROTECTED") + field(VAL, "1.2") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-MIN") { + field(DESC, "Start injection at this vacuum pressure") + field(ASG, "PROTECTED") + field(EGU, "1e-9 mbar") + field(VAL, "0") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-MAX") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-DYN") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-MIN") +} + +record(ao, "$(DEVICE):CONTROL-CURRENT-MAX") { + field(DESC, "Stop injection at this current") + field(ASG, "PROTECTED") + field(EGU, "mA") + field(VAL, "403") + field(PREC, "3") + field(PINI, "YES") + field(DRVH, "425") + field(DRVL, "0") +} + +record(ao, "$(DEVICE):CONTROL-CURRENT-MIN") { + field(DESC, "Start injection at this current") + field(ASG, "PROTECTED") + field(EGU, "mA") + field(VAL, "400") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-TIME-MAX") { + field(DESC, "Stop injection after this time") + field(ASG, "PROTECTED") + field(EGU, "s") + field(VAL, "30") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-TIME-MIN") { + field(DESC, "Start injection after this time") + field(ASG, "PROTECTED") + field(EGU, "s") + field(VAL, "300") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):MBFBY-GAIN-SP") { + field(DESC, "MBFBy Gain SP for scrubbing") + field(ASG, "PROTECTED") + field(EGU, "%") + field(VAL, "1") + field(PREC, "3") + field(PINI, "YES") + field(DRVH, "100") + field(DRVL, "0") +} + +record(ao, "$(DEVICE):MBFBX-GAIN-SP") { + field(DESC, "MBFBx Gain SP for scrubbing") + field(ASG, "PROTECTED") + field(EGU, "%") + field(VAL, "1") + field(PREC, "3") + field(PINI, "YES") + field(DRVH, "100") + field(DRVL, "0") +} + +record(ao, "$(DEVICE):CONTROL-GUNGRID-ACCUM") { + field(DESC, "Gungrid val for accumulation") + field(ASG, "PROTECTED") + field(EGU, "V") + field(VAL, "100") + field(PREC, "3") + field(PINI, "YES") + field(DRVH, "180") + field(DRVL, "40") +} + +record(ao, "$(DEVICE):CONTROL-GUNGRID-FPFB") { + field(DESC, "Gungrid val for FPFB Injection") + field(ASG, "PROTECTED") + field(EGU, "V") + field(VAL, "160") + field(PREC, "3") + field(PINI, "YES") + field(DRVH, "180") + field(DRVL, "40") +} + +# HLA Service Output/Result Parameters + +record(ao, "$(DEVICE):TOPUP-TAU") { + field(DESC, "Average tau since last top up") + field(ASG, "PROTECTED") + field(EGU, "h") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):TOPUP-DELTAT") { + field(DESC, "Time since last top up") + field(ASG, "PROTECTED") + field(EGU, "min") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):TOPUP-DELTAI") { + field(DESC, "Current change since last top up") + field(ASG, "PROTECTED") + field(EGU, "mA") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOIN-SP") { + field(DESC, "Warmup cycles for booster injection") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOMB-SP") { + field(DESC, "Warmup cycles for ABOMA-B") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "5") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOME-SP") { + field(DESC, "Warmup cycles for ABOMA-ELSE") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOEX-SP") { + field(DESC, "Warmup cycles for booster extraction") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-SRIN-SP") { + field(DESC, "Warmup cycles for SR Injection") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOIN-RB") { + field(DESC, "Warmup cycles for booster injection") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOMB-RB") { + field(DESC, "Warmup cycles for ABOMA-B") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "5") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOME-RB") { + field(DESC, "Warmup cycles for ABOMA-ELSE") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-BOEX-RB") { + field(DESC, "Warmup cycles for booster extraction") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):WARMUPCYCLES-SRIN-RB") { + field(DESC, "Warmup cycles for SR Injection") + field(ASG, "PROTECTED") + field(EGU, "") + field(VAL, "15") + field(PREC, "1") + field(PINI, "YES") +} \ No newline at end of file diff --git a/services/scrubbing/current/ioc/startup.script b/services/scrubbing/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/scrubbing/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/scrubbing/current/qt/A_BD_Scrubbing.ui b/services/scrubbing/current/qt/A_BD_Scrubbing.ui new file mode 100644 index 0000000..00f96bd --- /dev/null +++ b/services/scrubbing/current/qt/A_BD_Scrubbing.ui @@ -0,0 +1,5326 @@ + + + MainWindow + + + + 0 + 0 + 1500 + 1000 + + + + MainWindow + + + + + + 10 + 10 + 211 + 61 + + + + AGEBD-ALH:SCRUBBING-ONOFF + + + caChoice::Column + + + 1 + + + + + + 640 + 280 + 861 + 461 + + + + + 10 + 75 + true + + + + Vakuum (last 60 seconds) + + + + + + + + + ARIVA-VMAVE:PRESS-MAX;ARIVA-VMAVE-FE:PRESS-MAX;ARIVA-VMAVE-ALL:PRESS-MAX;AGEBD-SCRUBBING:CONTROL-VACUUM-MAX-PLOT;AGEBD-SCRUBBING:CONTROL-VACUUM-MIN-PLOT;AGEBD-SCRUBBING:CONTROL-VACUUM-DYN-PLOT + + + caStripPlot::Second + + + 60.000000000000000 + + + caStripPlot::High + + + caStripPlot::log10 + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 255 + 127 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + 260 + 40 + 350 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + ARIVA-VMAVE-ALL:PRESS-MAX + + + + 252 + 192 + 11 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + caLineEdit::exponential + + + + + + 260 + 100 + 350 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + ARIVA-VMAVE:PRESS-MAX + + + + 255 + 255 + 127 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + caLineEdit::exponential + + + + + + 70 + 40 + 190 + 50 + + + + + 31 + 50 + false + + + + Frontend + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 252 + 192 + 11 + + + + + + + 70 + 100 + 230 + 50 + + + + + 31 + 50 + false + + + + Machine + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 255 + 255 + 127 + + + + + + + + 1990 + 540 + 70 + 20 + + + + + + + 1980 + 360 + 71 + 20 + + + + RELOAD + + + Qt::AlignCenter + + + RELOAD + + + A + + + AGEBD-ALH:SCRUBBING-GUIRELOAD + + + caCalc::TriggerOneToZero + + + + + + 10 + 80 + 391 + 41 + + + + AGEBD-ALH:SCRUBBING-INFO + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 230 + 40 + 50 + 30 + + + + AGEBD-SCRUBBING:TOPUP-DELTAT + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 349 + 40 + 50 + 30 + + + + AGEBD-SCRUBBING:TOPUP-TAU + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 350 + 10 + 50 + 30 + + + + + 18 + 75 + true + + + + Tau + + + Qt::AlignCenter + + + + + + 290 + 10 + 50 + 30 + + + + + 18 + 75 + true + + + + dI + + + Qt::AlignCenter + + + + + + 230 + 10 + 50 + 30 + + + + + 18 + 75 + true + + + + dt + + + Qt::AlignCenter + + + + + + 290 + 40 + 50 + 30 + + + + AGEBD-SCRUBBING:TOPUP-DELTAI + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 5 + 450 + 631 + 291 + + + + Events, Trigger und Top-Up Save + + + + + 135 + 173 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 215 + 32 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 10 + 31 + 100 + 22 + + + + + Sans Serif + 13 + + + + true + + + Master + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 211 + 173 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 215 + 177 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 135 + 28 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=0 + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 139 + 177 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 10 + 176 + 100 + 22 + + + + + Sans Serif + 13 + + + + true + + + Booster Ext + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 211 + 28 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 139 + 32 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 139 + 119 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 10 + 118 + 121 + 22 + + + + + Sans Serif + 13 + + + + true + + + ABOMA-B + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 135 + 115 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 215 + 119 + 70 + 20 + + + + true + + + External + + + AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel + + + External + + + + 219 + 212 + 157 + + + + 1 + + + + + + 211 + 115 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 139 + 206 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 215 + 206 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 211 + 202 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 10 + 205 + 150 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Ring Inj + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 135 + 202 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 211 + 57 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 215 + 61 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 135 + 57 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 10 + 60 + 91 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Gun + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 139 + 61 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 139 + 90 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 215 + 90 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 135 + 86 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 211 + 86 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 10 + 89 + 111 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Booster Inj + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 95 + 28 + 28 + 28 + + + + true + + + false + + + 22 + + + 22 + + + AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER + + + caLed::Alarm + + + + + + 520 + 28 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Event-Seq-Cnt-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 520 + 86 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 520 + 115 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 520 + 173 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ext-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 520 + 202 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 520 + 231 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 135 + 231 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 139 + 235 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 211 + 231 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 215 + 235 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 10 + 234 + 101 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Hor. Pinger + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 520 + 260 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 10 + 263 + 101 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Ver. Pinger + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 139 + 264 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 215 + 264 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 135 + 260 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 211 + 260 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 10 + 147 + 121 + 22 + + + + + Sans Serif + 13 + + + + true + + + ABOMA-ELSE + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 135 + 144 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 139 + 148 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 211 + 144 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 520 + 144 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 215 + 148 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 520 + 57 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 300 + 88 + 100 + 28 + + + + 2 + + + 0 + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOIN-SP.VAL + + + caSpinbox::User + + + true + + + + + + 300 + 120 + 100 + 28 + + + + 2 + + + 0 + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOMB-SP.VAL + + + caSpinbox::User + + + true + + + + + + 300 + 150 + 100 + 25 + + + + 2 + + + 0 + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOME-SP.VAL + + + caSpinbox::User + + + true + + + + + + 300 + 180 + 100 + 25 + + + + 2 + + + 0 + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOEX-SP.VAL + + + caSpinbox::User + + + true + + + + + + 300 + 210 + 100 + 25 + + + + 2 + + + 0 + + + AGEBD-SCRUBBING:WARMUPCYCLES-SRIN-SP.VAL + + + caSpinbox::User + + + true + + + + + + 300 + 30 + 100 + 41 + + + + + 9 + 75 + true + + + + Warmup Cycles +Setpoint + + + Qt::PlainText + + + Qt::AlignCenter + + + true + + + + + + 410 + 117 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOMB-RB.VAL + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + + + + 410 + 88 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOIN-RB.VAL + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + + + + 410 + 146 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOME-RB.VAL + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + + + + 410 + 204 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-SCRUBBING:WARMUPCYCLES-SRIN-RB.VAL + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + + + + 410 + 175 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGEBD-SCRUBBING:WARMUPCYCLES-BOEX-RB.VAL + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + + + + 410 + 30 + 100 + 41 + + + + + 9 + 75 + true + + + + Warmup Cycles +Remaining + + + Qt::AlignCenter + + + true + + + BOO_Ext_External_frame_8 + BOO_Ext_Disable_frame_8 + BOO_Ext_Disable_frame_5 + BOO_Ext_External_frame_5 + BOO_Ext_Disable_frame_4 + BOO_Ext_External_frame_4 + Inj_trig_Enable_frame + BOO_Ext_Disable_frame_2 + BOO_Ext_External_frame_2 + Inj_trig_Enable + Inj_trig_ + BOO_Ext_External_2 + Inj_trig_Disable_frame + BOO_Ext_Diasable_2 + BOO_Ext + Inj_trig_Disable + Gun_trig_2 + Gun_trig_Disable_frame_2 + Gun_trig_External_frame_2 + Gun_trig_External_2 + Gun_trig_Diasable_2 + BOO_Ext_Diasable_4 + BOO_Ext_External_4 + BOO_Ext_3 + BOO_Ext_External_frame_6 + BOO_Ext_External_6 + BOO_Ext_Disable_frame_6 + BOO_Ext_5 + BOO_Ext_Diasable_6 + BOO_Ext_Diasable_5 + BOO_Ext_External_5 + BOO_Ext_4 + caled_23 + calineedit + calineedit_4 + calineedit_6 + calineedit_7 + calineedit_8 + calineedit_9 + BOO_Ext_Disable_frame_7 + BOO_Ext_Diasable_7 + BOO_Ext_External_frame_7 + BOO_Ext_External_7 + BOO_Ext_6 + calineedit_10 + BOO_Ext_7 + BOO_Ext_Diasable_8 + BOO_Ext_External_8 + Gun_trig_3 + BOO_Ext_Disable_frame_3 + BOO_Ext_Diasable_3 + BOO_Ext_External_frame_3 + calineedit_13 + BOO_Ext_External_3 + calineedit_2 + caspinbox_10 + caspinbox_11 + caspinbox_12 + caspinbox_13 + caspinbox_14 + calabel_18 + calineedit_16 + calineedit_5 + calineedit_17 + calineedit_18 + calineedit_19 + calabel_19 + + + + + 420 + 750 + 1081 + 241 + + + + + + + ;AGEBD-TIMING:TARGET-BUCKET + + + caCartesianPlot::Sticks + + + + 0 + 255 + 0 + + + + ;X08DB-DFPM-DI:FW-SIS0DAQ-CH0-FPM-WF + + + caCartesianPlot::Sticks + + + + 255 + 170 + 255 + + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + + 255 + 255 + 255 + + + + + 160 + 160 + 160 + + + + caCartesianPlot::User + + + caCartesianPlot::User + + + 0;480 + + + 0;1.3 + + + true + + + false + + + 24 + + + + + + 5 + 750 + 410 + 241 + + + + Filling Pattern Feedback (FPFB) + + + + + 0 + 20 + 40 + 40 + + + + AGEBD-TIMING:GO + + + + 0 + 255 + 0 + + + + + + + 10 + 60 + 391 + 30 + + + + + 9 + + + + space separated bucket ranges (e.g., 0-450) and single buckets + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::WidthAndHeight + + + + + + 10 + 90 + 391 + 45 + + + + AGEBD-TIMING:CONTROL-FILLPATTERN-string.VAL + + + 0 + + + caLineEdit::User + + + caLineEdit::User + + + 479.000000000000000 + + + + + + 40 + 25 + 361 + 40 + + + + + 16 + 75 + true + + + + AGEBD-TIMING:FPFB-MODE + + + + + + 210 + 190 + 191 + 40 + + + + + 20 + + + + Reset + + + EPushButton::WidthAndHeight + + + AGEBD-TIMING:ZERO-TARGET-BUCKET + + + Reset + + + + 160 + 160 + 160 + + + + + 160 + 160 + 160 + + + + + + + + + + 1 + + + + + + 240 + 140 + 150 + 40 + + + + 3 + + + 0 + + + true + + + AGEBD-TIMING:CURRENT-THRESHOLD + + + caSpinbox::User + + + true + + + caSpinbox::Channel + + + + + + 10 + 190 + 80 + 40 + + + + + 25 + 75 + true + + + + Nth + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 90 + 190 + 111 + 40 + + + + 3 + + + 0 + + + AGEBD-TIMING:FPFB-NTH + + + caSpinbox::User + + + true + + + caSpinbox::Channel + + + + + + 10 + 140 + 211 + 40 + + + + + 18 + 75 + true + + + + FPFB Threshold + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + 5 + 130 + 530 + 140 + + + + Top-Up Grenzen + + + + + 220 + 95 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-SCRUBBING:CONTROL-CURRENT-MIN + + + caSpinbox::User + + + true + + + + + + 220 + 50 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-SCRUBBING:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 10 + 95 + 50 + 40 + + + + + 12 + 75 + true + + + + Start + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 50 + 50 + 40 + + + + + 13 + 75 + true + + + + Stop + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 70 + 95 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-SCRUBBING:CONTROL-VACUUM-MIN + + + caSpinbox::User + + + true + + + + + + 220 + 20 + 140 + 30 + + + + + 18 + 75 + true + + + + Strom + + + Qt::AlignCenter + + + + + + 70 + 20 + 140 + 30 + + + + + 18 + 75 + true + + + + Vakuum + + + Qt::AlignCenter + + + + + + 70 + 50 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-SCRUBBING:CONTROL-VACUUM-MAX + + + caSpinbox::User + + + true + + + + + + 370 + 20 + 140 + 30 + + + + + 18 + 75 + true + + + + Zeit + + + Qt::AlignCenter + + + + + + 370 + 50 + 140 + 40 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:CONTROL-TIME-MAX + + + caSpinbox::User + + + true + + + + + + 370 + 95 + 140 + 40 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:CONTROL-TIME-MIN + + + caSpinbox::User + + + true + + + + + + + 5 + 280 + 255 + 160 + + + + Gun Ladung + + + + + 50 + 20 + 211 + 40 + + + + + 20 + 75 + true + + + + Gun Grid + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 125 + 120 + 120 + 40 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:CONTROL-GUNGRID-FPFB + + + caSpinbox::User + + + true + + + + + + 125 + 70 + 120 + 40 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:CONTROL-GUNGRID-ACCUM + + + caSpinbox::User + + + true + + + + + + 5 + 70 + 110 + 40 + + + + + 12 + 75 + true + + + + Accumulate + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 5 + 120 + 110 + 40 + + + + + 12 + 75 + true + + + + Top-Up + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + + 550 + 0 + 951 + 271 + + + + + 10 + 75 + true + + + + Beam Current (last 10 minutes) + + + + + + + + + ARS07-DPCT-0000:CURR;AGEBD-SCRUBBING:CONTROL-CURRENT-MAX;AGEBD-SCRUBBING:CONTROL-CURRENT-MIN + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + 11 + + + caStripPlot::linear + + + 404.000000000000000 + + + 399.000000000000000 + + + caStripPlot::User + + + caStripPlot::User + + + caStripPlot::Lines + + + + 0 + 255 + 0 + + + + 404.000000000000000 + + + 399.000000000000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 0 + + + + 404.000000000000000 + + + 399.000000000000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 0 + + + + 404.000000000000000 + + + 399.000000000000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + 60 + 30 + 250 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + ARS07-DPCT-0000:CURR + + + + 0 + 255 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + + + + 660 + 30 + 250 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing + + + AGEBD-PARAMS:LIFETIME + + + + 0 + 255 + 255 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + + + + 350 + 30 + 250 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + AGEBD-PARAMS:TRANSMISSION + + + + 255 + 170 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::Height + + + true + + + + + + + 410 + 30 + 120 + 40 + + + + + 12 + 75 + true + + + + Dyn Vac Frac + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 410 + 80 + 120 + 40 + + + + 1 + + + 2 + + + +AGEBD-SCRUBBING:CONTROL-VACUUM-DYN-FRAC + + + caSpinbox::User + + + true + + + + + + 270 + 280 + 360 + 180 + + + + Strahlwaschen + + + + + 10 + 60 + 340 + 35 + + + + + 16 + 75 + true + + + + AGEBD-SCRUBBING:CONTROL-SCRUB + + + + + + 10 + 20 + 191 + 40 + + + + + 20 + 75 + true + + + + Scrubbing + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 95 + 360 + 85 + + + + + 85 + 170 + 0 + + + + caFrame::Calc + + + A>3 + + + AGEBD-SCRUBBING:CONTROL-SCRUB + + + + + 230 + 45 + 100 + 35 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + ARSGE-CECL-MBFB:MBFB-T-Y-DDS-FRQ + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + true + + + + + + 65 + 45 + 100 + 35 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:MBFBY-GAIN-SP.VAL + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 100.000000000000000 + + + 0.000000000000000 + + + + + + 230 + 5 + 100 + 35 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + ARSGE-CECL-MBFB:MBFB-T-X-DDS-FRQ + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + true + + + + + + 10 + 45 + 45 + 35 + + + + + 8 + 75 + true + + + + MBFBy + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 65 + 5 + 100 + 35 + + + + 3 + + + 0 + + + AGEBD-SCRUBBING:MBFBX-GAIN-SP.VAL + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 100.000000000000000 + + + 0.000000000000000 + + + + + + 10 + 5 + 45 + 35 + + + + + 8 + 75 + true + + + + MBFBx + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 175 + 45 + 45 + 35 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + ARSGE-CECL-MBFB:MBFB-T-Y-DDS-GAIN + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + false + + + + + + 175 + 5 + 45 + 35 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + ARSGE-CECL-MBFB:MBFB-T-X-DDS-GAIN + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::User + + + caLineEdit::None + + + false + + + + + + 335 + 5 + 17 + 17 + + + + true + + + false + + + 15 + + + 15 + + + +ARSGE-MBFBT-AMP-03:SET-ON-OFF + + + + 0 + 255 + 0 + + + + + + + 335 + 23 + 17 + 17 + + + + true + + + false + + + 15 + + + 15 + + + +ARSGE-MBFBT-AMP-04:SET-ON-OFF + + + + 0 + 255 + 0 + + + + + + + 335 + 45 + 17 + 17 + + + + true + + + false + + + 15 + + + 15 + + + ARSGE-MBFBT-AMP-01:SET-ON-OFF + + + + 0 + 255 + 0 + + + + + + + 335 + 63 + 17 + 17 + + + + true + + + false + + + 15 + + + 15 + + + +ARSGE-MBFBT-AMP-02:SET-ON-OFF + + + + 0 + 255 + 0 + + + + + + + + 0 + 95 + 360 + 85 + + + + + 85 + 170 + 0 + + + + caFrame::Calc + + + A<4 & A>0 + + + AGEBD-SCRUBBING:CONTROL-SCRUB + + + + + 70 + 45 + 150 + 35 + + + + 4 + + + 2 + + + ARS01-MKIK-0320:I-SET + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 100.000000000000000 + + + 0.000000000000000 + + + + + + 10 + 45 + 50 + 35 + + + + + 10 + 75 + true + + + + PINGy + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 70 + 5 + 150 + 35 + + + + 4 + + + 2 + + + ARS01-MKIK-0290:I-SET + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 100.000000000000000 + + + 0.000000000000000 + + + + + + 10 + 5 + 50 + 35 + + + + + 10 + 75 + true + + + + PINGx + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 230 + 5 + 35 + 35 + + + + + 35 + 35 + + + + ARS01-MKIK-0290:CTRL-ON-OFF + + + + + + 230 + 45 + 35 + 35 + + + + + 35 + 35 + + + + ARS01-MKIK-0320:CTRL-ON-OFF + + + + + + + + + caMenu + QComboBox +
caMenu
+
+ + caChoice + QWidget +
caChoice
+
+ + caTextEntry + caLineEdit +
caTextEntry
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caFrame + QFrame +
caFrame
+ 1 +
+ + caLabel + QLabel +
caLabel
+
+ + caGraphics + QWidget +
caGraphics
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caStripPlot + QwtPlot +
caStripPlot
+ 1 +
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 2020 + 374 + + + 2022 + 545 + + + + +
diff --git a/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service b/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service new file mode 100644 index 0000000..1bf2013 --- /dev/null +++ b/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-SCRUBBING +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh SCRUBBING +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-SCRUBBING.service +# systemctl --user start AGEBD-SERVICE-SCRUBBING diff --git a/services/shifttool/current/app/pyproject.toml b/services/shifttool/current/app/pyproject.toml new file mode 100644 index 0000000..990a34c --- /dev/null +++ b/services/shifttool/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-shifttool" +version = "0.1.0" +description = "AGEBD-SHIFTTOOL Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/shifttool/current/app/src/agebd_shifttool/__init__.py b/services/shifttool/current/app/src/agebd_shifttool/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/shifttool/current/app/src/agebd_shifttool/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/shifttool/current/app/src/agebd_shifttool/main.py b/services/shifttool/current/app/src/agebd_shifttool/main.py new file mode 100644 index 0000000..a96df33 --- /dev/null +++ b/services/shifttool/current/app/src/agebd_shifttool/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_shifttool import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "SHIFTTOOL" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/shifttool/current/app/src/agebd_shifttool/service.py b/services/shifttool/current/app/src/agebd_shifttool/service.py new file mode 100644 index 0000000..a5c4ea0 --- /dev/null +++ b/services/shifttool/current/app/src/agebd_shifttool/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-SHIFTTOOL:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-SHIFTTOOL:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-SHIFTTOOL:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/shifttool/current/app/tests/test_app.py b/services/shifttool/current/app/tests/test_app.py new file mode 100644 index 0000000..257fc01 --- /dev/null +++ b/services/shifttool/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_shifttool import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/shifttool/current/app/uv.lock b/services/shifttool/current/app/uv.lock new file mode 100644 index 0000000..b6efa83 --- /dev/null +++ b/services/shifttool/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-shifttool" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_main.subs b/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_main.subs new file mode 100644 index 0000000..6141523 --- /dev/null +++ b/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_main.subs @@ -0,0 +1,4 @@ +file SHIFTTOOL.template { + pattern { DEVICE } + { AGEBD-SHIFTTOOL{{ agebd_env }} } +} diff --git a/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_parameters.yaml b/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/shifttool/current/ioc/AGEBD-CPCL-SHIFTTOOL_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/shifttool/current/ioc/README.md b/services/shifttool/current/ioc/README.md new file mode 100644 index 0000000..028b87b --- /dev/null +++ b/services/shifttool/current/ioc/README.md @@ -0,0 +1 @@ +# TODO: does it have an ioc? (in A_OP?) diff --git a/services/shifttool/current/ioc/SHIFTTOOL.template b/services/shifttool/current/ioc/SHIFTTOOL.template new file mode 100644 index 0000000..857d84a --- /dev/null +++ b/services/shifttool/current/ioc/SHIFTTOOL.template @@ -0,0 +1,37 @@ +# This is a template for preaparing an IOC providing BD Service specific PVs +# Access Security Groups: +# DEFAULT - logt wenn EGU oder so veraendert werden +# LOG - logt wenn neuer wert geschrieben wird +# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL +# READONLY - verhindert versuchte caputs und aktiviert caputlog +# Input links can specify CA, CP, or CPP. +# If the input link specifies CA, it will be forced to be a Channel Access link. +# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies. +# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links. +# + +record(ao, "$(DEVICE):AO") { + field(DESC, "Analog Output Record (ao)") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):BO") { + field(DESC, "Binary Output Record (bo)") + field(ASG, "READONLY") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") +} + +# TODO: ok? +record(bo, "$(DEVICE):CALLBACK") { + field(DESC, "Callback PV to listen to for changes") + field(ASG, "READONLY") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "1") + field(PINI, "YES") +} \ No newline at end of file diff --git a/services/shifttool/current/ioc/startup.script b/services/shifttool/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/shifttool/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/shifttool/current/qt/A_BD_.ui b/services/shifttool/current/qt/A_BD_.ui new file mode 100644 index 0000000..472b163 --- /dev/null +++ b/services/shifttool/current/qt/A_BD_.ui @@ -0,0 +1,103 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 0 + 60 + 100 + 50 + + + + 1 + + + 0 + + + AGEBD-SHIFTTOOL-DEV:AO + + + 9.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 0 + 601 + 22 + + + + Toggle AGEBD-ALH-DEV:SHIFTTOOL-ONOFF + + + AGEBD-ALH-DEV:SHIFTTOOL-ONOFF + + + + + + 6 + 34 + 401 + 21 + + + + + 13 + + + + Value of AGEBD-SHIFTTOOL-DEV:AO + + + + + + + 0 + 0 + 800 + 20 + + + + + + + + caNumeric + QFrame +
caNumeric
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+
+ + +
diff --git a/services/shifttool/current/qt/README.md b/services/shifttool/current/qt/README.md new file mode 100644 index 0000000..6e3690d --- /dev/null +++ b/services/shifttool/current/qt/README.md @@ -0,0 +1 @@ +# TODO: ui for this service... diff --git a/services/shifttool/current/systemd/AGEBD-SERVICE-SHIFTTOOL.service b/services/shifttool/current/systemd/AGEBD-SERVICE-SHIFTTOOL.service new file mode 100644 index 0000000..ee945c0 --- /dev/null +++ b/services/shifttool/current/systemd/AGEBD-SERVICE-SHIFTTOOL.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-SHIFTTOOL +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh SHIFTTOOL +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-SHIFTTOOL.service +# systemctl --user start AGEBD-SERVICE-SHIFTTOOL diff --git a/services/taupct/current/app/pyproject.toml b/services/taupct/current/app/pyproject.toml new file mode 100644 index 0000000..cf97407 --- /dev/null +++ b/services/taupct/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-taupct" +version = "0.1.0" +description = "AGEBD-TAUPCT Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/taupct/current/app/src/agebd_taupct/__init__.py b/services/taupct/current/app/src/agebd_taupct/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/taupct/current/app/src/agebd_taupct/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/taupct/current/app/src/agebd_taupct/main.py b/services/taupct/current/app/src/agebd_taupct/main.py new file mode 100644 index 0000000..64fb8a6 --- /dev/null +++ b/services/taupct/current/app/src/agebd_taupct/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_taupct import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TAUPCT" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/taupct/current/app/src/agebd_taupct/service.py b/services/taupct/current/app/src/agebd_taupct/service.py new file mode 100644 index 0000000..b1d2135 --- /dev/null +++ b/services/taupct/current/app/src/agebd_taupct/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TAUPCT:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TAUPCT:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TAUPCT:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/taupct/current/app/tests/test_app.py b/services/taupct/current/app/tests/test_app.py new file mode 100644 index 0000000..a8bf6c4 --- /dev/null +++ b/services/taupct/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_taupct import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/taupct/current/app/uv.lock b/services/taupct/current/app/uv.lock new file mode 100644 index 0000000..5a4fc6b --- /dev/null +++ b/services/taupct/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-taupct" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs new file mode 100644 index 0000000..ab45b7c --- /dev/null +++ b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs @@ -0,0 +1,4 @@ +file TAUPCT.template { + pattern { DEVICE } + { AGEBD-TAUPCT{{ agebd_env }} } +} diff --git a/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/taupct/current/ioc/TAUPCT.template b/services/taupct/current/ioc/TAUPCT.template new file mode 100644 index 0000000..e984743 --- /dev/null +++ b/services/taupct/current/ioc/TAUPCT.template @@ -0,0 +1,70 @@ +record(ao, "$(DEVICE):CONTROL-NSAMPLES-FIT-TAU") { + field(DESC, "Nr. of charge points for TAU fit") + field(VAL, "60") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-NSAMPLES-FIT-ROC") { + field(DESC, "Nr. of charge points for ROC fit") + field(VAL, "5") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-MIN-CURR") { + field(DESC, "Minimum current") + field(VAL, "0.1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):TAU") { + field(DESC, "PCT injection rate") + field(PREC, "3") + field(EGU, "hours") +} + +record(ao, "$(DEVICE):TAU-ERR") { + field(DESC, "PCT injection rate error") + field(PREC, "3") + field(EGU, "hours") +} + +record(ao, "$(DEVICE):INJRATE") { + field(DESC, "PCT injection rate") + field(PREC, "3") + field(EGU, "mA/min") + field(FLNK, "$(DEVICE):INJRATE-nC") +} + +record(ao, "$(DEVICE):INJRATE-ERR") { + field(DESC, "PCT injection rate error") + field(PREC, "3") + field(EGU, "mA/min") + field(FLNK, "$(DEVICE):INJRATE-ERR-nC") +} + +record(calc, "$(DEVICE):INJRATE-nC") { + field(DESC, "Rate der Akkumulation im Speicherring") + field(ASG, "READONLY") + field(PREC, "3") + field(EGU, "nC/shot") + field(CALC, "A / 60 / 3.125 * 0.96") + field(INPA, "$(DEVICE):INJRATE") +} + +record(calc, "$(DEVICE):INJRATE-ERR-nC") { + field(DESC, "Fehler der Injektionsrate Speicherring") + field(ASG, "READONLY") + field(PREC, "3") + field(EGU, "nC/shot") + field(CALC, "A / 60 / 3.125 * 0.96") + field(INPA, "$(DEVICE):INJRATE-ERR") +} + +record(calc, "$(DEVICE):LOSSRATIO") { + field(DESC, "Lossratio now to nominal 400 mA, 10 h") + field(ASG, "READONLY") + field(PREC, "3") + field(CALC, "(I / B) / 50") # = (strom / e / tau) / (400 / e / 10) + field(INPB, "$(DEVICE):TAU CP") + field(INPI, "ARS07-DPCT-0000:CURR") +} \ No newline at end of file diff --git a/services/taupct/current/ioc/startup.script b/services/taupct/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/taupct/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/taupct/current/qt/A_BD_LifetimePCT.ui b/services/taupct/current/qt/A_BD_LifetimePCT.ui new file mode 100644 index 0000000..8ab773b --- /dev/null +++ b/services/taupct/current/qt/A_BD_LifetimePCT.ui @@ -0,0 +1,527 @@ + + + MainWindow + + + + 0 + 0 + 570 + 260 + + + + MainWindow + + + + + + 10 + 60 + 260 + 30 + + + + Nr. of points for Lifetime fit + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 140 + 260 + 30 + + + + Minimum Current + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 10 + 180 + 260 + 30 + + + + Lifetime + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 280 + 180 + 120 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TAUPCT:TAU + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 440 + 180 + 120 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TAUPCT:TAU-ERR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 410 + 180 + 21 + 30 + + + + ± + + + Qt::AlignCenter + + + + + + 280 + 220 + 120 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TAUPCT:INJRATE + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 440 + 220 + 120 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TAUPCT:INJRATE-ERR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 410 + 220 + 21 + 30 + + + + ± + + + Qt::AlignCenter + + + + + + 660 + 130 + 70 + 20 + + + + + + + 660 + 70 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:TAUPCT-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 10 + 220 + 260 + 30 + + + + Injection rate + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 280 + 60 + 280 + 30 + + + + AGEBD-TAUPCT:CONTROL-NSAMPLES-FIT-TAU + + + caLineEdit::User + + + + + + 280 + 140 + 280 + 30 + + + + AGEBD-TAUPCT:CONTROL-MIN-CURR + + + 12 + + + caLineEdit::User + + + + + + 0 + 10 + 561 + 40 + + + + AGEBD-ALH:TAUPCT-ONOFF + + + caChoice::Column + + + 1 + + + + + + 280 + 100 + 280 + 30 + + + + AGEBD-TAUPCT:CONTROL-NSAMPLES-FIT-ROC + + + caLineEdit::User + + + + + + 10 + 100 + 260 + 30 + + + + Nr. of points for inj. rate fit + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + caChoice + QWidget +
caChoice
+
+ + caTextEntry + caLineEdit +
caTextEntry
+
+ + caLabel + QLabel +
caLabel
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 695 + 80 + + + 699 + 145 + + + + +
diff --git a/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service b/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service new file mode 100644 index 0000000..95c1241 --- /dev/null +++ b/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TAUPCT +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TAUPCT +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TAUPCT.service +# systemctl --user start AGEBD-SERVICE-TAUPCT diff --git a/services/timing/current/app/pyproject.toml b/services/timing/current/app/pyproject.toml new file mode 100644 index 0000000..7bad054 --- /dev/null +++ b/services/timing/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-timing" +version = "0.1.0" +description = "AGEBD-TIMING Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/timing/current/app/src/agebd_timing/__init__.py b/services/timing/current/app/src/agebd_timing/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/timing/current/app/src/agebd_timing/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/timing/current/app/src/agebd_timing/main.py b/services/timing/current/app/src/agebd_timing/main.py new file mode 100644 index 0000000..5312def --- /dev/null +++ b/services/timing/current/app/src/agebd_timing/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_timing import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TIMING" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/timing/current/app/src/agebd_timing/service.py b/services/timing/current/app/src/agebd_timing/service.py new file mode 100644 index 0000000..3f81c3e --- /dev/null +++ b/services/timing/current/app/src/agebd_timing/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TIMING:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TIMING:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TIMING:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/timing/current/app/tests/test_app.py b/services/timing/current/app/tests/test_app.py new file mode 100644 index 0000000..f058e5e --- /dev/null +++ b/services/timing/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_timing import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/timing/current/app/uv.lock b/services/timing/current/app/uv.lock new file mode 100644 index 0000000..d427488 --- /dev/null +++ b/services/timing/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-timing" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs b/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs new file mode 100644 index 0000000..1a840a4 --- /dev/null +++ b/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs @@ -0,0 +1,4 @@ +file TIMING.template { + pattern { DEVICE } + { AGEBD-TIMING{{ agebd_env }} } +} diff --git a/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml b/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/timing/current/ioc/TIMING.template b/services/timing/current/ioc/TIMING.template new file mode 100644 index 0000000..a9bd791 --- /dev/null +++ b/services/timing/current/ioc/TIMING.template @@ -0,0 +1,409 @@ +############################### +## follow bucket flags +############################### + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-GUN") { + field(DESC, "Gun") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lindi-ictone") { + field(DESC, "Linac ICT 1/2") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lindi-icts23") { + field(DESC, "Linac ICT 3") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-llemast") { + field(DESC, "Linac RF LLE Master") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-preamp1") { + field(DESC, "Linac RF Preamp 1") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-preamp2") { + field(DESC, "Linac RF Preamp 2") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-klystr1") { + field(DESC, "Linac RF Klystron 1") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-klystr2") { + field(DESC, "Linac RF Klystron 2") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-3GHzQdm") { + field(DESC, "Linac RF 3GHz Qdm") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-500-PBU") { + field(DESC, "Linac RF 500 MHz PBU") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-3GHzScp") { + field(DESC, "Linac RF 3 GHz Scope") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-Kly1PMU") { + field(DESC, "Linac RF Klystron 1 PMU") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-Kly2PMU") { + field(DESC, "Linac RF Klystron 2 PMU") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOINKI") { + field(DESC, "Booster Inj. Kicker") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOINSE") { + field(DESC, "Booster Inj. Septum") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOEXKI") { + field(DESC, "Booster Ext. Kicker") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOEXSE") { + field(DESC, "Booster Ext. Septum") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BTRICT") { + field(DESC, "BRTL ICT") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BTRBPM") { + field(DESC, "BRTL BPM") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINSE") { + field(DESC, "Ring Inj. Septum") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK1") { + field(DESC, "Ring Inj. Kicker 1") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK2") { + field(DESC, "Ring Inj. Kicker 2") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK3") { + field(DESC, "Ring Inj. Kicker 3") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK4") { + field(DESC, "Ring Inj. Kicker 4") + field(ASG, "PROTECTED") + field(PINI, "YES") +} + +############################### +## base delays for bucket zero +############################### + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-GUN") { + field(DESC, "Gun delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lindi-ictone") { + field(DESC, "Linac ICT delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lindi-icts23") { + field(DESC, "Linac ICT delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-llemast") { + field(DESC, "Linac RF lemast delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-preamp1") { + field(DESC, "Linac RF reamp1 delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-preamp2") { + field(DESC, "Linac RF reamp2 delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-klystr1") { + field(DESC, "Linac RF lystr1 delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-klystr2") { + field(DESC, "Linac RF lystr2 delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-3GHzQdm") { + field(DESC, "Linac RF GHzQdm delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-500-PBU") { + field(DESC, "Linac RF 00-PBU delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-3GHzScp") { + field(DESC, "Linac RF GHzScp delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-Kly1PMU") { + field(DESC, "Linac RF ly1PMU delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-Kly2PMU") { + field(DESC, "Linac RF ly2PMU delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOINKI") { + field(DESC, "Booster inj kicker delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOINSE") { + field(DESC, "Booster inj sept delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOEXKI") { + field(DESC, "Booster ext kicker delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOEXSE") { + field(DESC, "Booster ext septum delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BTRICT") { + field(DESC, "BRTL ICT delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BTRBPM") { + field(DESC, "BRTL BPM delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINSE") { + field(DESC, "SR septum delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK1") { + field(DESC, "SR kicker bump delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK2") { + field(DESC, "SR kicker bump delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK3") { + field(DESC, "SR kicker bump delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK4") { + field(DESC, "SR kicker bump delay for bucket zero") + field(ASG, "PROTECTED") + field(PREC, "0") + field(PINI, "YES") +} + +############################### +## HLA pvs +############################### + +record(lso, "$(DEVICE):CONTROL-FILLPATTERN-string") { + field(DESC, "Fillpattern - String Define") + field(OMSL, "supervisory") + field(SIZV, "1000") + field(PINI, "YES") +} + +record(waveform,"$(DEVICE):TARGET-BUCKET") { + field(DESC, "Fillpattern - current bucket of 0...480") + field(ASG, "PROTECTED") + field(FTVL, "FLOAT") + field(NELM, "480") + field(PINI, "YES") +} + +record(waveform,"$(DEVICE):TARGET-FILLPATTERN") { + field(DESC, "Fillpattern reference plot") + field(ASG, "PROTECTED") + field(FTVL, "FLOAT") + field(NELM, "480") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):SETALL-DELAY") { + field(DESC, "Delay for setting all timings") + field(EGU, "seconds") + field(VAL, "0") + field(PREC, "5") + field(PINI, "YES") +} + +record(int64out, "$(DEVICE):SETALL-ERROR") { + field(DESC, "Error counter for setting all timings") + field(ASG, "PROTECTED") + field(VAL, "0") +} + +record(bo,"$(DEVICE):ZERO-TARGET-BUCKET") { + field(DESC, "request target bucket 0") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):SYNC-BASE-DELAYS") { + field(DESC, "request base delay sync to master") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):GO") { + field(DESC, "pause/stop timing service callbacks") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CURRENT-THRESHOLD") { + field(DESC, "current above which fpfb is started") + field(ASG, "PROTECTED") + field(EGU, "mA") + field(VAL, "300") + field(PREC, "5") + field(PINI, "YES") +} + +record(int64out, "$(DEVICE):FPFB-NTH") { + field(DESC, "n for every nth bucket fpfb mode") + field(ASG, "PROTECTED") + field(VAL, "2") + field(PINI, "YES") +} + +record(mbbo, "$(DEVICE):FPFB-MODE") { + field(DESC, "choice of fpfb mode to use") + field(ASG, "PROTECTED") + field(ZRST, "Sorted BPM Measurement") + field(ONST, "Sorted APD Measurement") + field(TWST, "FPFB from Pedro via EPICS") + field(THST, "Every Nth Bucket") + field(PINI, "YES") + field(VAL, "0") +} \ No newline at end of file diff --git a/services/timing/current/ioc/cfg/AGEBD-CPCL-TIMING_set.req b/services/timing/current/ioc/cfg/AGEBD-CPCL-TIMING_set.req new file mode 100644 index 0000000..4e0f824 --- /dev/null +++ b/services/timing/current/ioc/cfg/AGEBD-CPCL-TIMING_set.req @@ -0,0 +1,48 @@ +#ENABLE-PASS=2 +AGEBD-TIMING:CONTROL-ZERO-DELAY-GUN +AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-ictone +AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-icts23 +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-llemast +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp1 +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp2 +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr1 +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr2 +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzQdm +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-500-PBU +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzScp +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly1PMU +AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly2PMU +AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINKI +AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINSE +AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXKI +AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXSE +AGEBD-TIMING:CONTROL-ZERO-DELAY-BTRICT +AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINSE +AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK1 +AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK2 +AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK3 +AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK4 +AGEBD-TIMING:CONTROL-FLW-BCKT-GUN +AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-ictone +AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-icts23 +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-llemast +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp1 +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp2 +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr1 +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr2 +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzQdm +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-500-PBU +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzScp +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly1PMU +AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly2PMU +AGEBD-TIMING:CONTROL-FLW-BCKT-BOINKI +AGEBD-TIMING:CONTROL-FLW-BCKT-BOINSE +AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXKI +AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXSE +AGEBD-TIMING:CONTROL-FLW-BCKT-BTRICT +AGEBD-TIMING:CONTROL-FLW-BCKT-BTRBPM +AGEBD-TIMING:CONTROL-FLW-BCKT-SRINSE +AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK1 +AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK2 +AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK3 +AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK4 \ No newline at end of file diff --git a/services/timing/current/ioc/startup.script b/services/timing/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/timing/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/timing/current/qt/A_BD_Timing.ui b/services/timing/current/qt/A_BD_Timing.ui new file mode 100644 index 0000000..596cb26 --- /dev/null +++ b/services/timing/current/qt/A_BD_Timing.ui @@ -0,0 +1,4571 @@ + + + MainWindow + + + + 0 + 0 + 750 + 880 + + + + + + + (Qt::Window | Qt::FramelessWindowHint); + + + + + + 1390 + 270 + 70 + 20 + + + + + + + 1390 + 210 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:TIMING-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 10 + 20 + 161 + 31 + + + + + 18 + 75 + true + + + + Fillpattern + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 10 + 170 + 431 + 705 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 0 + 10 + 200 + 25 + + + + + 14 + + + + GUN + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 100 + 200 + 25 + + + + + 14 + + + + Linac - LLE Master + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 10 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-GUN + + + caSpinbox::User + + + true + + + 500.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 100 + 210 + 25 + + + + 6 + + + 3 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-llemast + + + caSpinbox::User + + + true + + + 5.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 400 + 200 + 25 + + + + + 14 + + + + Booster Inj Kicker + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 400 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINKI + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 430 + 200 + 25 + + + + + 14 + + + + Booster Inj Septum + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 430 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINSE + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 460 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXKI + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 460 + 200 + 25 + + + + + 14 + + + + Booster Ext Kicker + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 490 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXSE + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 490 + 200 + 25 + + + + + 14 + + + + Booster Ext Septum + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 550 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINSE + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 550 + 200 + 25 + + + + + 14 + + + + Ring Inj Septum + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 580 + 200 + 25 + + + + + 14 + + + + Ring Inj 4 Kicker K1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 520 + 200 + 25 + + + + + 14 + + + + ICT 4 (BRTL) + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 520 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-BTRICT + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 190 + 200 + 25 + + + + + 14 + + + + Linac - Klystron 1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 310 + 200 + 25 + + + + + 14 + + + + Linac - 3 GHz Scope + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 220 + 200 + 25 + + + + + 14 + + + + Linac - klystron 2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 160 + 200 + 25 + + + + + 14 + + + + Linac - Preamp2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 130 + 200 + 25 + + + + + 14 + + + + Linac - Preamp1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 250 + 200 + 25 + + + + + 14 + + + + Linac - 3 GHz Qdm + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 340 + 200 + 25 + + + + + 14 + + + + Linac - Kly 1 PMU + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 280 + 200 + 25 + + + + + 14 + + + + Linac - 500 MHz_PBU + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 370 + 200 + 25 + + + + + 14 + + + + Linac - Kly 2 PMU + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 220 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr2 + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 310 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzScp + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 280 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-500-PBU + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 340 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly1PMU + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 190 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr1 + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 130 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp1 + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 250 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzQdm + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 160 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp2 + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 370 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly2PMU + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 40 + 200 + 25 + + + + + 14 + + + + ICT 1 & 2 (Linac) + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 610 + 200 + 25 + + + + + 14 + + + + Ring Inj 4 Kicker K2 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 640 + 200 + 25 + + + + + 14 + + + + Ring Inj 4 Kicker K3 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 0 + 670 + 200 + 25 + + + + + 14 + + + + Ring Inj 4 Kicker K4 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 580 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK1 + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 610 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK2 + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 640 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK3 + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 670 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK4 + + + caSpinbox::User + + + true + + + caSpinbox::User + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 0 + 70 + 200 + 25 + + + + + 14 + + + + ICT 3 (LTB) + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 210 + 40 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-ictone + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + 210 + 70 + 210 + 25 + + + + 6 + + + 0 + + + AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-icts23 + + + caSpinbox::User + + + true + + + 10000000.000000000000000 + + + 0.000000000000000 + + + + + + + 480 + 170 + 260 + 705 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-GUN:CH1-DLY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 100 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-A1-LLE-CTR:MASTER-DELF + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 400 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR0:SETUP.OT1D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 430 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR0:SETUP.OT0D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 460 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OT1D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 520 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIDI-CECL-DIAG:EEVR-EVENT2-PULSE-DELAY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 490 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OT0D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 550 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OT2D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 580 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OT3D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 130 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT0D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 160 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT1D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 190 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT2D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 220 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT3D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 250 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT4D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 340 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OTAD + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 280 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT5D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 370 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OTCD + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 310 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-EVR2:SETUP.OT6D + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 40 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIDI-CECL-DIAG:EEVR-EVENT0-PULSE-DELAY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 1000000.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 610 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OTBD + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 640 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OTCD + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 670 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ABOMA-VME-KY-EVR1:SETUP.OTDD + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 70 + 100 + 25 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIDI-CECL-DIAG:EEVR-EVENT1-PULSE-DELAY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 1000000.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 120 + 310 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 340 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 280 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 160 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 220 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 610 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 130 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 370 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 40 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 400 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 520 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 430 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 550 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 190 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 640 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 10 + 131 + 25 + + + + + 14 + + + + in 2 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 100 + 151 + 25 + + + + + 14 + + + + in us, 4 ns res + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 460 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 670 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 250 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 70 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 580 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 120 + 490 + 131 + 25 + + + + + 14 + + + + in 8 ns ticks + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + + 10 + 50 + 411 + 30 + + + + + 9 + + + + space separated bucket ranges (e.g., 0-450) and single buckets + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::WidthAndHeight + + + + + + 550 + 10 + 100 + 60 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ALIRF-VME-A-GUN:CH1-DLY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 410 + 10 + 140 + 40 + + + + + 25 + 75 + true + + + + Bucket + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 440 + 170 + 41 + 705 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-GUN + + + + + + 10 + 100 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-llemast + + + + + + 10 + 400 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-BOINKI + + + + + + 10 + 430 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-BOINSE + + + + + + 10 + 460 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXKI + + + + + + 10 + 490 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXSE + + + + + + 10 + 520 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-BTRICT + + + + + + 10 + 550 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-SRINSE + + + + + + 10 + 670 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK4 + + + + + + 10 + 130 + 30 + 30 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp1 + + + + + + 10 + 250 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzQdm + + + + + + 10 + 280 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-500-PBU + + + + + + 10 + 160 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp2 + + + + + + 10 + 220 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr2 + + + + + + 10 + 310 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzScp + + + + + + 10 + 340 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly1PMU + + + + + + 10 + 190 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr1 + + + + + + 10 + 370 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly2PMU + + + + + + 10 + 40 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-ictone + + + + + + 10 + 70 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-icts23 + + + + + + 10 + 640 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK3 + + + + + + 10 + 610 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK2 + + + + + + 10 + 580 + 30 + 25 + + + + + + + + 30 + 30 + + + + false + + + AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK1 + + + catogglebutton_3 + catogglebutton_6 + catogglebutton_7 + catogglebutton_10 + catogglebutton_12 + catogglebutton_15 + catogglebutton_16 + catogglebutton_19 + catogglebutton_21 + catogglebutton_23 + catogglebutton_24 + catogglebutton_28 + catogglebutton_29 + catogglebutton_32 + catogglebutton_33 + catogglebutton_34 + catogglebutton_37 + catogglebutton_2 + catogglebutton + catogglebutton_5 + catogglebutton_20 + catogglebutton_22 + catogglebutton_25 + + + + + 571 + 75 + 80 + 25 + + + + + 13 + + + + Put Time + + + Qt::AlignCenter + + + ESimpleLabel::WidthAndHeight + + + + + + 661 + 80 + 80 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TIMING:SETALL-DELAY + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 5 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 660 + 105 + 80 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TIMING:SETALL-ERROR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 0 + + + caLineEdit::User + + + caLineEdit::Channel + + + 400.000000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + true + + + + 570 + 105 + 80 + 25 + + + + + 12 + + + + > 150 ms + + + Qt::AlignCenter + + + ESimpleLabel::WidthAndHeight + + + + + + 10 + 80 + 550 + 45 + + + + AGEBD-TIMING:CONTROL-FILLPATTERN-string.VAL + + + 0 + + + caLineEdit::User + + + caLineEdit::User + + + 479.000000000000000 + + + + + + 660 + 40 + 80 + 30 + + + + + 14 + + + + Reset + + + EPushButton::WidthAndHeight + + + AGEBD-TIMING:ZERO-TARGET-BUCKET + + + Reset + + + + 160 + 160 + 160 + + + + + 160 + 160 + 160 + + + + onoff + + + 0 + + + 1 + + + + + + 400 + 140 + 81 + 30 + + + + + 16 + 75 + true + + + + Follow + + + Qt::AlignCenter + + + + + + 10 + 140 + 271 + 30 + + + + + 15 + 75 + true + + + + Base Delays (Bucket 0) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 490 + 140 + 241 + 30 + + + + + 15 + 75 + true + + + + Changed EVR Delays + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 410 + 50 + 131 + 20 + + + + + + + + 183 + 157 + 92 + + + + Timing Master + + + /ioc/modules/qt/A_GE_TI_MASTER_control_expert.ui + + + SYS=AGETI-CVME-MASTER,DEVICE=EVG0,TMA=TMA,DBUFF=DBUFF230,EVT=12,LINAC=ALIRF-VME-A,DEV_LINAC=EVR2,PM=ABOMA-VME-KY,DEV_PM1=EVR0,DEV_PM2=EVR1;stylefile=/sls/controls/config/qt/slses.qss + + + caRelatedDisplay::as_is + + + + + + 310 + 130 + 70 + 20 + + + + onoff + + + + 0 + 0 + 0 + + + + + 192 + 192 + 192 + + + + !A + + + AGEBD-ALH:TIMING-ONOFF + + + + + + 660 + 10 + 80 + 30 + + + + + 14 + + + + Reset + + + EPushButton::WidthAndHeight + + + AGETI-CVME-MASTER-TMA:FP-Local-Reset-Bucket-SP + + + Reset + + + + 160 + 160 + 160 + + + + + 160 + 160 + 160 + + + + AGEBD-ALH:TIMING-ONOFF + + + 0 + + + 1 + + + frame + wmsignalpropagator + cacalc_2 + calabel + frame_2 + calabel_42 + caLineEdit_35 + calabel_43 + frame_3 + calabel_44 + caLineEdit_47 + caLineEdit_48 + calabel_49 + catextentry_5 + camessagebutton_39 + calabel_45 + calabel_5 + calabel_39 + carelateddisplay_20 + cacalc + camessagebutton_40 + + + + + caRelatedDisplay + QWidget +
caRelatedDisplay
+
+ + caTextEntry + caLineEdit +
caTextEntry
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 1220 + 224 + + + 1222 + 277 + + + + +
diff --git a/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service b/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service new file mode 100644 index 0000000..596bcec --- /dev/null +++ b/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TIMING +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TIMING +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TIMING.service +# systemctl --user start AGEBD-SERVICE-TIMING diff --git a/services/topuptool/current/app/pyproject.toml b/services/topuptool/current/app/pyproject.toml new file mode 100644 index 0000000..eeaa6db --- /dev/null +++ b/services/topuptool/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-topuptool" +version = "0.1.0" +description = "AGEBD-TOPUPTOOL Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/topuptool/current/app/src/agebd_topuptool/__init__.py b/services/topuptool/current/app/src/agebd_topuptool/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/topuptool/current/app/src/agebd_topuptool/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/topuptool/current/app/src/agebd_topuptool/main.py b/services/topuptool/current/app/src/agebd_topuptool/main.py new file mode 100644 index 0000000..1537f0c --- /dev/null +++ b/services/topuptool/current/app/src/agebd_topuptool/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_topuptool import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TOPUPTOOL" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/topuptool/current/app/src/agebd_topuptool/service.py b/services/topuptool/current/app/src/agebd_topuptool/service.py new file mode 100644 index 0000000..7b8fe2c --- /dev/null +++ b/services/topuptool/current/app/src/agebd_topuptool/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TOPUPTOOL:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TOPUPTOOL:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TOPUPTOOL:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/topuptool/current/app/tests/test_app.py b/services/topuptool/current/app/tests/test_app.py new file mode 100644 index 0000000..74339a1 --- /dev/null +++ b/services/topuptool/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_topuptool import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/topuptool/current/app/uv.lock b/services/topuptool/current/app/uv.lock new file mode 100644 index 0000000..fe504cb --- /dev/null +++ b/services/topuptool/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-topuptool" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_main.subs b/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_main.subs new file mode 100644 index 0000000..374cb6e --- /dev/null +++ b/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_main.subs @@ -0,0 +1,4 @@ +file TOPUPTOOL.template { + pattern { DEVICE } + { AGEBD-TOPUPTOOL{{ agebd_env }} } +} diff --git a/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_parameters.yaml b/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/topuptool/current/ioc/AGEBD-CPCL-TOPUPTOOL_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/topuptool/current/ioc/TOPUPTOOL.template b/services/topuptool/current/ioc/TOPUPTOOL.template new file mode 100644 index 0000000..43540d9 --- /dev/null +++ b/services/topuptool/current/ioc/TOPUPTOOL.template @@ -0,0 +1,121 @@ +# HLA Service Control Parameters + +record(bo, "$(DEVICE):CONTROL-SCRUB") { + field(DESC, "Activate scrubbung during decay") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-MAX") { + field(DESC, "Stop injection at this vacuum pressure") + field(EGU, "1e-9 mbar") + field(VAL, "30") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-DYN") { + field(DESC, "Stop injection at this vacuum pressure") + field(EGU, "1e-9 mbar") + field(VAL, "27") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-DYN-FRAC") { + field(DESC, "Fraction defining dynamic pressure ") + field(VAL, "1.05") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VACUUM-MIN") { + field(DESC, "Start injection at this vacuum pressure") + field(EGU, "1e-9 mbar") + field(VAL, "24") + field(PREC, "3") + field(FLNK, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-MAX") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-DYN") +} + +record(calc, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT") { + field(DESC, "Stop injection at this vacuum pressure") + field(ASG, "READONLY") + field(EGU, "mbar") + field(PREC, "-5") + field(CALC, "A/1e9") + field(INPA, "$(DEVICE):CONTROL-VACUUM-MIN") +} + +record(ao, "$(DEVICE):CONTROL-CURRENT-MAX") { + field(DESC, "Stop injection at this current") + field(EGU, "mA") + field(VAL, "400") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-CURRENT-MIN") { + field(DESC, "Start injection at this current") + field(EGU, "mA") + field(VAL, "396") + field(PREC, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-GUNGRID-MAX") { + field(DESC, "Set gun grid to val before injection") + field(EGU, "V") + field(VAL, "170") + field(PREC, "3") + field(PINI, "YES") +} + +# HLA Service Output/Result Parameters + +record(ao, "$(DEVICE):TOPUP-TAU") { + field(DESC, "Average tau since last top up") + field(EGU, "h") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):TOPUP-DELTAT") { + field(DESC, "Time since last top up") + field(EGU, "min") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):TOPUP-DELTAI") { + field(DESC, "Current change since last top up") + field(EGU, "mA") + field(VAL, "100") + field(PREC, "3") + field(VAL, "-1") + field(PINI, "YES") +} diff --git a/services/topuptool/current/ioc/startup.script b/services/topuptool/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/topuptool/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/topuptool/current/qt/A_BD_TopUpTool.ui b/services/topuptool/current/qt/A_BD_TopUpTool.ui new file mode 100644 index 0000000..9800d32 --- /dev/null +++ b/services/topuptool/current/qt/A_BD_TopUpTool.ui @@ -0,0 +1,3533 @@ + + + MainWindow + + + + 0 + 0 + 1852 + 610 + + + + MainWindow + + + + + + 10 + 10 + 391 + 61 + + + + AGEBD-ALH:TOPUPTOOL-ONOFF + + + caChoice::Column + + + 1 + + + + + + 729 + 0 + 1111 + 601 + + + + + 10 + 75 + true + + + + Strahlstrom + + + + + + mA + + + ARS07-DPCT-0000:CURR + + + caStripPlot::Second + + + 480.000000000000000 + + + caStripPlot::High + + + 8 + + + caStripPlot::linear + + + caStripPlot::fixedScale + + + caStripPlot::off + + + 408.000000000000000 + + + 300.000000000000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 0 + 255 + 0 + + + + 0.000000100000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 241 + 252 + 122 + + + + 0.000000100000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000100000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000100000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + 0.000000100000000 + + + 0.000000001000000 + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + false + + + + + + 280 + 140 + 85 + 40 + + + + 3 + + + 0 + + + AGEBD-TOPUPTOOL:CONTROL-GUNGRID-MAX + + + caSpinbox::User + + + true + + + + + + 160 + 140 + 105 + 40 + + + + + 15 + 75 + true + + + + Gun Grid + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 1990 + 540 + 70 + 20 + + + + + + + 1980 + 360 + 71 + 20 + + + + RELOAD + + + Qt::AlignCenter + + + RELOAD + + + A + + + AGEBD-ALH:SCRUBBING-GUIRELOAD + + + caCalc::TriggerOneToZero + + + + + + 10 + 90 + 391 + 41 + + + + AGEBD-ALH:SCRUBBING-INFO + + + caLineEdit::Alarm_Default + + + caLineEdit::onBackground + + + caLineEdit::User + + + + + + 570 + 190 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAT + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 570 + 310 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-TAU + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 480 + 310 + 50 + 30 + + + + + 18 + 75 + true + + + + Tau + + + Qt::AlignCenter + + + + + + 480 + 230 + 50 + 30 + + + + + 18 + 75 + true + + + + dI + + + Qt::AlignCenter + + + + + + 480 + 190 + 50 + 30 + + + + + 18 + 75 + true + + + + dt + + + Qt::AlignCenter + + + + + + 570 + 230 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAI + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 10 + 330 + 601 + 270 + + + + Top-Up Save Einstellungen + + + + + 133 + 172 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 209 + 56 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=2 + + + ALIRF-VME-A-GUN:CH1-MODE + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 213 + 31 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 9 + 33 + 100 + 22 + + + + + Sans Serif + 13 + + + + true + + + Master + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 137 + 60 + 70 + 20 + + + + true + + + Disable + + + ALIRF-VME-A-GUN:CH1-MODE + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 209 + 172 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 213 + 176 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 133 + 27 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=0 + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 137 + 176 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-10-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 9 + 178 + 100 + 22 + + + + + Sans Serif + 13 + + + + true + + + Booster Ext + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 209 + 27 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 213 + 60 + 70 + 20 + + + + true + + + External + + + ALIRF-VME-A-GUN:CH1-MODE + + + External + + + + 219 + 212 + 157 + + + + 2 + + + + + + 9 + 62 + 100 + 22 + + + + + Sans Serif + 13 + + + + true + + + Gun TX + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 133 + 56 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + ALIRF-VME-A-GUN:CH1-MODE + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 137 + 31 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 137 + 147 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-Old-BO-HW-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 9 + 149 + 121 + 22 + + + + + Sans Serif + 13 + + + + true + + + Booster Ramp + + + Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::Height + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 133 + 143 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-Old-BO-HW-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 213 + 147 + 70 + 20 + + + + true + + + External + + + AGETI-CVME-MASTER-TMA:Evt-Old-BO-HW-Ena-Sel + + + External + + + + 219 + 212 + 157 + + + + 1 + + + + + + 209 + 143 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-Old-BO-HW-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 137 + 205 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 213 + 205 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 209 + 201 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 9 + 204 + 150 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Ring Inj + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 133 + 201 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 209 + 85 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 213 + 89 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 133 + 85 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 9 + 91 + 91 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Gun Event + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 137 + 89 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 137 + 118 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 213 + 118 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 133 + 114 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 209 + 114 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 9 + 120 + 111 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Booster Inj + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 98 + 27 + 28 + 28 + + + + true + + + false + + + 22 + + + 22 + + + AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER + + + caLed::Alarm + + + + + + 303 + 27 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Event-Seq-Cnt-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 56 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + ALIRF-VME-A:SoftEvent-Linac-Gun-Evnt-Count-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 85 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 114 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-BO-Inj-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 143 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + AGETI-CVME-MASTER-TMA:Evt-Old-BO-HW-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 172 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-BO-Ext-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 303 + 201 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-SR-Inj-EVRCount-I + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 453 + 27 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 304 + 230 + 100 + 28 + + + + + Monospace + 13 + PreferDefault + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + +AGETI-CVME-MASTER-TMA:Evt-14.VALA + + + + 160 + 160 + 164 + + + + caLineEdit::Default + + + caLineEdit::None + + + + + + 214 + 234 + 70 + 20 + + + + true + + + Enable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-Ena-Sel + + + Enable + + + + 219 + 212 + 157 + + + + 1 + + + + + + 138 + 234 + 70 + 20 + + + + true + + + Disable + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-Ena-Sel + + + Disable + + + + 219 + 212 + 157 + + + + 0 + + + + + + 133 + 230 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::IfZero + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + 0 + + + 90 + + + + + + 10 + 233 + 101 + 22 + + + + + Sans Serif + 13 + + + + true + + + Qt::LeftToRight + + + Pingers + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + QFrame::NoFrame + + + + + + 210 + 230 + 78 + 28 + + + + true + + + + 0 + 0 + 176 + + + + caGraphics::Filled + + + 1 + + + + 0 + 0 + 0 + + + + caGraphics::Calc + + + A=1 + + + AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-Ena-Sel + + + caGraphics::Rectangle + + + 22 + + + 180 + + + + + + 423 + 27 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 56 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 114 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 85 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 201 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 143 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 172 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 423 + 230 + 28 + 28 + + + + + 40 + 40 + + + + caToggleButton::WidthAndHeight + + + caToggleButton::Alarm + + + + + + 453 + 56 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 114 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 85 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 230 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 201 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 172 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 453 + 143 + 140 + 28 + + + + 2 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + BOO_Ext_External_frame_7 + BOO_Ext_Disable_frame_7 + BOO_Ext_Disable_frame_5 + BOO_Ext_External_frame_5 + BOO_Ext_Disable_frame_4 + BOO_Ext_External_frame_4 + Inj_trig_Enable_frame + BOO_Ext_Disable_frame_2 + BOO_Ext_External_frame_2 + Gun_trig_Disable_frame + Gun_trig_External_frame + Inj_trig_Enable + Inj_trig_ + Gun_trig_Diasable + BOO_Ext_External_2 + Inj_trig_Disable_frame + BOO_Ext_Diasable_2 + BOO_Ext + Gun_trig_External + Gun_trig + Inj_trig_Disable + Gun_trig_2 + Gun_trig_Disable_frame_2 + Gun_trig_External_frame_2 + Gun_trig_External_2 + Gun_trig_Diasable_2 + BOO_Ext_Diasable_4 + BOO_Ext_External_4 + BOO_Ext_3 + BOO_Ext_External_frame_6 + BOO_Ext_External_6 + BOO_Ext_Disable_frame_6 + BOO_Ext_5 + BOO_Ext_Diasable_6 + BOO_Ext_Diasable_5 + BOO_Ext_External_5 + BOO_Ext_4 + caled_23 + calineedit + calineedit_2 + calineedit_4 + calineedit_6 + calineedit_7 + calineedit_8 + calineedit_9 + caspinbox_6 + calineedit_10 + BOO_Ext_External_7 + BOO_Ext_Diasable_7 + BOO_Ext_6 + catogglebutton + catogglebutton_2 + catogglebutton_3 + catogglebutton_4 + catogglebutton_5 + catogglebutton_6 + catogglebutton_7 + catogglebutton_8 + caspinbox_8 + caspinbox_9 + caspinbox_10 + caspinbox_11 + caspinbox_12 + caspinbox_13 + caspinbox_14 + + + + + 440 + 20 + 271 + 50 + + + + + Lucida Sans Typewriter + 32 + 75 + true + + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + ARS07-DPCT-0000:CURR + + + + 0 + 0 + 0 + + + + + 170 + 255 + 127 + + + + caLineEdit::Static + + + 1 + + + caLineEdit::User + + + caLineEdit::WidthAndHeight + + + true + + + + + + 10 + 170 + 461 + 151 + + + + Top-Up Schwellen + + + + + 160 + 60 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MAX + + + caSpinbox::User + + + true + + + + + + 310 + 30 + 140 + 30 + + + + + 18 + 75 + true + + + + min + + + Qt::AlignCenter + + + + + + 10 + 30 + 140 + 30 + + + + + 18 + 75 + true + + + + pbar + + + Qt::AlignCenter + + + + + + 310 + 65 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-TIME-FREQ + + + caSpinbox::User + + + true + + + + + + 160 + 30 + 140 + 30 + + + + + 18 + 75 + true + + + + mA + + + Qt::AlignCenter + + + + + + 160 + 105 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-CURRENT-MIN + + + caSpinbox::User + + + true + + + + + + 10 + 60 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-VAC-MAX + + + caSpinbox::User + + + true + + + + + + 10 + 105 + 140 + 40 + + + + 3 + + + 1 + + + AGEBD-TOPUPTOOL:CONTROL-VAC-MIN + + + caSpinbox::User + + + true + + + + + + + 480 + 270 + 71 + 30 + + + + + 18 + 75 + true + + + + dI/dt + + + Qt::AlignCenter + + + + + + 630 + 190 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAT + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 630 + 230 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAI + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 570 + 270 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-TAU + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 630 + 270 + 50 + 30 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAI + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + 550 + 150 + 71 + 30 + + + + + 15 + 75 + true + + + + Decay + + + Qt::AlignCenter + + + + + + 630 + 150 + 71 + 30 + + + + + 15 + 75 + true + + + + Inject + + + Qt::AlignCenter + + + + + + 440 + 90 + 161 + 30 + + + + + 15 + 75 + true + + + + Next Injection + + + Qt::AlignCenter + + + + + + 620 + 90 + 51 + 31 + + + + AGEBD-TOPUPTOOL:TOPUP-DELTAT + + + caLineEdit::Default + + + caLineEdit::onBackground + + + 2 + + + caLineEdit::User + + + + + + + caChoice + QWidget +
caChoice
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caGraphics + QWidget +
caGraphics
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caStripPlot + QwtPlot +
caStripPlot
+ 1 +
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 2020 + 374 + + + 2022 + 545 + + + + +
diff --git a/services/topuptool/current/systemd/AGEBD-SERVICE-TOPUPTOOL.service b/services/topuptool/current/systemd/AGEBD-SERVICE-TOPUPTOOL.service new file mode 100644 index 0000000..beb2436 --- /dev/null +++ b/services/topuptool/current/systemd/AGEBD-SERVICE-TOPUPTOOL.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TOPUPTOOL +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TOPUPTOOL +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TOPUPTOOL.service +# systemctl --user start AGEBD-SERVICE-TOPUPTOOL diff --git a/services/tune/current/app/pyproject.toml b/services/tune/current/app/pyproject.toml new file mode 100644 index 0000000..0c62707 --- /dev/null +++ b/services/tune/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-tune" +version = "0.1.0" +description = "AGEBD-TUNE Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/tune/current/app/src/agebd_tune/__init__.py b/services/tune/current/app/src/agebd_tune/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/tune/current/app/src/agebd_tune/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/tune/current/app/src/agebd_tune/main.py b/services/tune/current/app/src/agebd_tune/main.py new file mode 100644 index 0000000..f3eaab0 --- /dev/null +++ b/services/tune/current/app/src/agebd_tune/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_tune import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TUNE" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/tune/current/app/src/agebd_tune/service.py b/services/tune/current/app/src/agebd_tune/service.py new file mode 100644 index 0000000..be08b40 --- /dev/null +++ b/services/tune/current/app/src/agebd_tune/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TUNE:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TUNE:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TUNE:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/tune/current/app/tests/test_app.py b/services/tune/current/app/tests/test_app.py new file mode 100644 index 0000000..2afcc45 --- /dev/null +++ b/services/tune/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_tune import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/tune/current/app/uv.lock b/services/tune/current/app/uv.lock new file mode 100644 index 0000000..38d5733 --- /dev/null +++ b/services/tune/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-tune" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/tune/current/ioc/AGEBD-CPCL-TUNE_main.subs b/services/tune/current/ioc/AGEBD-CPCL-TUNE_main.subs new file mode 100644 index 0000000..378be70 --- /dev/null +++ b/services/tune/current/ioc/AGEBD-CPCL-TUNE_main.subs @@ -0,0 +1,4 @@ +file TUNE.template { + pattern { DEVICE } + { AGEBD-TUNE{{ agebd_env }} } +} diff --git a/services/tune/current/ioc/AGEBD-CPCL-TUNE_parameters.yaml b/services/tune/current/ioc/AGEBD-CPCL-TUNE_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/tune/current/ioc/AGEBD-CPCL-TUNE_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/tune/current/ioc/TUNE.template b/services/tune/current/ioc/TUNE.template new file mode 100644 index 0000000..ad157d3 --- /dev/null +++ b/services/tune/current/ioc/TUNE.template @@ -0,0 +1,439 @@ +# HLA Service Control Parameters + +record(ao, "$(DEVICE):SVD-CLEAN-Neigenvalues") { + field(DESC, "Nr of EV in SVD") + field(VAL, "3") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-TbTFirstIndex") { + field(DESC, "Index of first TbT data point to use") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-TbTLastIndex") { + field(DESC, "Index of last TbT data point to use") + field(VAL, "511") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-NAveraging") { + field(DESC, "Nr. of samples to take for averaging") + field(VAL, "1") + field(PREC, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ZeroPaddingN") { + field(DESC, "Add zeropadding to obtain N datapoints") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Xi") { + field(DESC, "First datapoint for hor. peak search") + field(VAL, "0.1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Xf") { + field(DESC, "Last datapoint for hor. peak search") + field(VAL, "0.5") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Yi") { + field(DESC, "First datapoint for ver. peak search") + field(VAL, "0.1") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Yf") { + field(DESC, "Last datapoint for ver. peak search") + field(VAL, "0.5") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Zi") { + field(DESC, "First datapoint for long. peak search") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-ROI-Zf") { + field(DESC, "Last datapoint for long. peak search") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-HOR-PING-ISET") { + field(DESC, "default current value for x pinger") + field(VAL, "20") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-HOR-PING-DELAY") { + field(DESC, "default delay value for x pinger") + field(VAL, "80") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VER-PING-ISET") { + field(DESC, "default current value for y pinger") + field(VAL, "20") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-VER-PING-DELAY") { + field(DESC, "default delay value for y pinger") + field(VAL, "80") + field(PINI, "YES") +} + + +# # HLA Service Output/Result Parameters + +record(ao, "$(DEVICE):HORIZONTAL-PEAK1-FREQ") { + field(DESC, "Horizontal tune frequency") +} + +record(ao, "$(DEVICE):HORIZONTAL-PEAK1-AMP") { + field(DESC, "Horizontal tune amplitude") +} + +record(ao, "$(DEVICE):HORIZONTAL-PEAK2-FREQ") { + field(DESC, "Horizontal sideband 1 frequency") +} + +record(ao, "$(DEVICE):HORIZONTAL-PEAK2-AMP") { + field(DESC, "Horizontal sideband 1 amplitude") +} + +record(ao, "$(DEVICE):HORIZONTAL-PEAK3-FREQ") { + field(DESC, "Horizontal sideband 2 frequency") +} + +record(ao, "$(DEVICE):HORIZONTAL-PEAK3-AMP") { + field(DESC, "Horizontal sideband 2 amplitude") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK1-FREQ") { + field(DESC, "Vertical tune frequency") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK1-AMP") { + field(DESC, "Vertical tune amplitude") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK2-FREQ") { + field(DESC, "Vertical sideband 1 frequency") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK2-AMP") { + field(DESC, "Vertical sideband 1 amplitude") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK3-FREQ") { + field(DESC, "Vertical sideband 2 frequency") +} + +record(ao, "$(DEVICE):VERTICAL-PEAK3-AMP") { + field(DESC, "Vertical sideband 2 amplitude") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK1-FREQ") { + field(DESC, "Longitudinal tune frequency") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK1-AMP") { + field(DESC, "Longitudinal tune amplitude") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK2-FREQ") { + field(DESC, "Longitudinal sideband 1 frequency") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK2-AMP") { + field(DESC, "Longitudinal sideband 1 amplitude") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK3-FREQ") { + field(DESC, "Longitudinal sideband 2 frequency") +} + +record(ao, "$(DEVICE):LONGITUDINAL-PEAK3-AMP") { + field(DESC, "Longitudinal sideband 2 amplitude") +} + +record(waveform, "$(DEVICE):HORIZONTAL-SPEC-ALL") { + field(DESC, "Entire measured horizontal spectrum") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):HORIZONTAL-SPEC-ROI") { + field(DESC, "Entire measured horizontal spectrum") + field(NELM, "4096") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):VERTICAL-SPEC-ALL") { + field(DESC, "Entire measured vertical spectrum") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):VERTICAL-SPEC-ROI") { + field(DESC, "Entire measured vertical spectrum") + field(NELM, "4096") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):LONGITUDINAL-SPEC-ALL") { + field(DESC, "Entire measured longitudinal spectrum") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):LONGITUDINAL-SPEC-ROI") { + field(DESC, "Entire measured longitudinal spectrum") + field(NELM, "4096") + field(FTVL, "FLOAT") +} + + +record (ao,"$(DEVICE):Q1_NAFF"){ + field (DESC, "Horizontal tune calculated using NAFF") + field (VAL, 0) + field (EGU, "") +} + +record (ao,"$(DEVICE):Q2_NAFF"){ + field (DESC, "Vertical tune calculated using NAFF") + field (VAL, 0) + field (EGU, "") +} + +record (ao,"$(DEVICE):NPOINTS"){ + field (DESC, "Number of points in pos/fft waveform") + field (VAL, 16384) + field (EGU, "") +} + +record(waveform, "$(DEVICE):SPEC-SAMPLE-ALL") { + field(DESC, "FFT spectrum tune axis") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):OSCILLATION-X-ALL") { + field(DESC, "Entire measured horizontal oscillation") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):OSCILLATION-Y-ALL") { + field(DESC, "Entire measured vertical oscillation") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):OSCILLATION-SAMPLE-ALL") { + field(DESC, "Sample index for oscillations") + field(NELM, "16384") + field(FTVL, "FLOAT") +} + +record (ao,"$(DEVICE):CONTROL-NAFF"){ + field (DESC, "Control NAFF calc.") + field (VAL, 1) + field (EGU, "") +} + +record (ao,"$(DEVICE):SINGLE-BPM"){ + field (VAL, 0) +} + +record (ao,"$(DEVICE):SVD-CLEAN"){ + field (VAL, 0) +} + +record (ao,"$(DEVICE):MEAS-TIME"){ + field (DESC, "Time for measurement") + field (VAL, 0) + field (EGU, "ms") +} + +record (ao,"$(DEVICE):DUMMY1"){ + field (DESC, "Dummy PV with value 1") + field (VAL, 1) +} + +record(stringout, "$(DEVICE):BPM-SELECT-SINGLE") { + field(DESC, "String defining selected BPM") + field(VAL, "ARS07-DBPM-0840") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-01") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-01") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-02") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-02") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-03") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-03") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-04") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-04") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-05") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-05") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-06") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-06") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-07") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-07") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-08") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-08") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-09") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-09") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-10") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-10") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-11") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-11") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPM-12") { + field(DESC, "Select BPMs") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo,"$(DEVICE):BPM-SELECT-BPMA-12") { + field(DESC, "Select BPMAs") + field(VAL, "0") + field(PINI, "YES") +} + +record (ao,"$(DEVICE):NAFF-HARMONICS"){ + field(DESC, "Number") + field(VAL, "5") + field(EGU, "") + field(PINI, "YES") + field(DRVH, "20") + field(DRVL, "1") +} diff --git a/services/tune/current/ioc/startup.script b/services/tune/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/tune/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/tune/current/qt/A_BD_Tune.ui b/services/tune/current/qt/A_BD_Tune.ui new file mode 100644 index 0000000..844a7bc --- /dev/null +++ b/services/tune/current/qt/A_BD_Tune.ui @@ -0,0 +1,2300 @@ + + + MainWindow + + + + 0 + 0 + 950 + 780 + + + + + 1600 + 800 + + + + MainWindow + + + + + + 20 + 400 + 911 + 331 + + + + 0 + + + + Oscillation plot + + + + + 10 + 10 + 421 + 271 + + + + Horizontal beam oscillation + + + Turn + + + x [mm] + + + AGEBD-TUNE:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE:OSCILLATION-X-ALL + + + caCartesianPlot::NoSymbol + + + + 0 + 255 + 0 + + + + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0;0 + + + 0;1 + + + + + + 460 + 10 + 431 + 271 + + + + Vertical beam oscillation + + + Turn + + + y [mm] + + + AGEBD-TUNE:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE:OSCILLATION-Y-ALL + + + caCartesianPlot::NoSymbol + + + + 0 + 255 + 0 + + + + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0;0.5 + + + + + + Tune plot + + + + + 10 + 10 + 421 + 271 + + + + Horizontal tune spectrum + + + Tune + + + Amplitude + + + AGEBD-TUNE:SPEC-SAMPLE-ALL;AGEBD-TUNE:HORIZONTAL-SPEC-ALL + + + caCartesianPlot::NoSymbol + + + + 0 + 255 + 0 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;0.5 + + + + + + 460 + 10 + 431 + 271 + + + + Vertical tune spectrum + + + Tune + + + Amplitude + + + AGEBD-TUNE:SPEC-SAMPLE-ALL;AGEBD-TUNE:VERTICAL-SPEC-ALL + + + caCartesianPlot::NoSymbol + + + + 0 + 255 + 0 + + + + + + + caCartesianPlot::Sticks + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;0.5 + + + + + + + + 20 + 20 + 141 + 171 + + + + Tune loop control + + + + + 10 + 30 + 129 + 132 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + true + + + false + + + 28 + + + 28 + + + true + + + false + + + AGEBD-ALH:TUNE-ALIVE + + + caLed::Alarm + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + true + + + false + + + 28 + + + 28 + + + true + + + false + + + AGEBD-ALH:TUNE-ONOFF-RB + + + caLed::Alarm + + + + + + + Program alive + + + + + + + Measurement +running + + + Qt::AlignCenter + + + + + + + Activate +measurement + + + true + + + AGEBD-ALH:TUNE-ONOFF + + + + + + + + + + 180 + 20 + 281 + 141 + + + + Results + + + + + 10 + 110 + 111 + 20 + + + + + 10 + + + + Meas. time [ms] + + + + + + 130 + 110 + 71 + 20 + + + + AGEBD-TUNE:MEAS-TIME + + + + + + 10 + 30 + 211 + 71 + + + + + + + + 10 + + + + Q1 + + + + + + + AGEBD-TUNE:VERTICAL-PEAK1-FREQ + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 100.000000000000000 + + + -100.000000000000000 + + + + + + + + 10 + + + + Q2 + + + + + + + AGEBD-TUNE:HORIZONTAL-PEAK1-FREQ + + + 4 + + + caLineEdit::User + + + 100.000000000000000 + + + -100.000000000000000 + + + + + + + + 10 + + + + FFT + + + Qt::AlignCenter + + + + + + + + 10 + + + + NAFF + + + Qt::AlignCenter + + + + + + + AGEBD-TUNE:Q1_NAFF + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 100.000000000000000 + + + -100.000000000000000 + + + + + + + AGEBD-TUNE:Q2_NAFF + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 100.000000000000000 + + + -100.000000000000000 + + + + + + + + + + 20 + 200 + 911 + 191 + + + + 2 + + + + Tune analysis settings + + + + + 190 + 10 + 91 + 141 + + + + SVD cleaning + + + + + 10 + 30 + 71 + 21 + + + + + Arial + 11 + 75 + true + + + + Enable + + + false + + + AGEBD-TUNE:SVD-CLEAN + + + + + + 10 + 90 + 71 + 41 + + + + 2 + + + 0 + + + AGEBD-TUNE:SVD-CLEAN-Neigenvalues + + + false + + + caNumeric::User + + + 115.000000000000000 + + + 1.000000000000000 + + + + + + 10 + 60 + 81 + 31 + + + + + 10 + + + + # Singular +values + + + + + + + 500 + 10 + 211 + 121 + + + + Region of Interest + + + + + 10 + 30 + 191 + 81 + + + + + + + + 45 + 20 + + + + + 9 + + + + 2 + + + AGEBD-TUNE:CONTROL-ROI-Yi + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + + 10 + + + + From + + + Qt::AlignCenter + + + + + + + + 45 + 20 + + + + + 9 + + + + 2 + + + 0.000000000000000 + + + AGEBD-TUNE:CONTROL-ROI-Xf + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + + 45 + 20 + + + + + 9 + + + + 2 + + + AGEBD-TUNE:CONTROL-ROI-Xi + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + + 10 + + + + Q1 + + + Qt::AlignCenter + + + + + + + + 10 + + + + Q2 + + + Qt::AlignCenter + + + + + + + + 10 + + + + To + + + Qt::AlignCenter + + + + + + + + 45 + 20 + + + + + 9 + + + + 2 + + + 0.000000000000000 + + + AGEBD-TUNE:CONTROL-ROI-Yf + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + 0.000000000000000 + + + + + + + + + + 290 + 10 + 191 + 111 + + + + Turn selection + + + + + 10 + 30 + 171 + 71 + + + + + + + + 45 + 20 + + + + + 9 + + + + 4 + + + 0 + + + false + + + AGEBD-TUNE:CONTROL-TbTLastIndex + + + caSpinbox::User + + + 4095.000000000000000 + + + 1.000000000000000 + + + + + + + + 10 + + + + First turn + + + + + + + + 10 + + + + Last turn + + + + + + + + 45 + 20 + + + + + 9 + + + + 4 + + + 0 + + + false + + + AGEBD-TUNE:CONTROL-TbTFirstIndex + + + false + + + caSpinbox::User + + + 4094.000000000000000 + + + 0.000000000000000 + + + + + + + + + + 20 + 10 + 141 + 51 + + + + + + + # samples + + + Qt::AlignCenter + + + + + + + 1 + + + 0 + + + true + + + AGEBD-TUNE:CONTROL-NAveraging + + + caNumeric::Channel + + + true + + + caNumeric::User + + + 99.000000000000000 + + + 1.000000000000000 + + + caNumeric::on_top + + + + + + + + + 20 + 60 + 141 + 91 + + + + + + + + Arial + 16 + 75 + true + + + + Calc. NAFF + + + true + + + AGEBD-TUNE:CONTROL-NAFF + + + + + + + + + + 9 + + + + # NAFF +harmonics + + + Qt::AlignCenter + + + + + + + 1 + + + 0 + + + true + + + AGEBD-TUNE:NAFF-HARMONICS + + + caNumeric::Channel + + + true + + + caNumeric::User + + + 99.000000000000000 + + + 1.000000000000000 + + + caNumeric::on_top + + + + + + + + + + + BPM select + + + + + 350 + 50 + 159 + 29 + + + + Recommended: +ARS07-DBPM-0840 + + + + + + 170 + 20 + 159 + 111 + + + + AGEBD-TUNE:BPM-SELECT-SINGLE + + + + ARS01-DBPM-0390 + + + + + ARS01-DBPM-0760 + + + + + ARS01-DBPM-1080 + + + + + ARS01-DBPM-1460 + + + + + ARS01-DBPM-1900 + + + + + ARS01-DBPM-2410 + + + + + ARS01-DBPM-2910 + + + + + ARS01-DBPM-4220 + + + + + ARS01-DBPM-4720 + + + + + ARS01-DBPM-5250 + + + + + ARS01-DBPM-5530 + + + + + ARS01-DBPM-5880 + + + + + ARS02-DBPM-1080 + + + + + ARS02-DBPM-1460 + + + + + ARS02-DBPM-1900 + + + + + ARS02-DBPM-2410 + + + + + ARS02-DBPM-2910 + + + + + ARS02-DBPM-4220 + + + + + ARS02-DBPM-4720 + + + + + ARS02-DBPM-5250 + + + + + ARS02-DBPM-5530 + + + + + ARS02-DBPM-5880 + + + + + ARS03-DBPM-0810 + + + + + ARS03-DBPM-1080 + + + + + ARS03-DBPM-1460 + + + + + ARS03-DBPM-1900 + + + + + ARS03-DBPM-2410 + + + + + ARS03-DBPM-2910 + + + + + ARS03-DBPM-4220 + + + + + ARS03-DBPM-4720 + + + + + ARS03-DBPM-5250 + + + + + ARS03-DBPM-5530 + + + + + ARS03-DBPM-5880 + + + + + ARS04-DBPM-0090 + + + + + ARS04-DBPM-0900 + + + + + ARS04-DBPM-1080 + + + + + ARS04-DBPM-1460 + + + + + ARS04-DBPM-1900 + + + + + ARS04-DBPM-2410 + + + + + ARS04-DBPM-2910 + + + + + ARS04-DBPM-4220 + + + + + ARS04-DBPM-4720 + + + + + ARS04-DBPM-5250 + + + + + ARS04-DBPM-5530 + + + + + ARS04-DBPM-5880 + + + + + ARS05-DBPM-0410 + + + + + ARS05-DBPM-1080 + + + + + ARS05-DBPM-1460 + + + + + ARS05-DBPM-1900 + + + + + ARS05-DBPM-2410 + + + + + ARS05-DBPM-2910 + + + + + ARS05-DBPM-4220 + + + + + ARS05-DBPM-4720 + + + + + ARS05-DBPM-5250 + + + + + ARS05-DBPM-5530 + + + + + ARS05-DBPM-5880 + + + + + ARS06-DBPM-1080 + + + + + ARS06-DBPM-1460 + + + + + ARS06-DBPM-1900 + + + + + ARS06-DBPM-2410 + + + + + ARS06-DBPM-2910 + + + + + ARS06-DBPM-4220 + + + + + ARS06-DBPM-4720 + + + + + ARS06-DBPM-5250 + + + + + ARS06-DBPM-5530 + + + + + ARS06-DBPM-5880 + + + + + ARS07-DBPM-0810 + + + + + ARS07-DBPM-0840 + + + + + ARS07-DBPM-1080 + + + + + ARS07-DBPM-1460 + + + + + ARS07-DBPM-1900 + + + + + ARS07-DBPM-2410 + + + + + ARS07-DBPM-2910 + + + + + ARS07-DBPM-4220 + + + + + ARS07-DBPM-4720 + + + + + ARS07-DBPM-5250 + + + + + ARS07-DBPM-5530 + + + + + ARS07-DBPM-5880 + + + + + ARS08-DBPM-1080 + + + + + ARS08-DBPM-1460 + + + + + ARS08-DBPM-1900 + + + + + ARS08-DBPM-2410 + + + + + ARS08-DBPM-2910 + + + + + ARS08-DBPM-4220 + + + + + ARS08-DBPM-4720 + + + + + ARS08-DBPM-5250 + + + + + ARS08-DBPM-5530 + + + + + ARS08-DBPM-5880 + + + + + ARS09-DBPM-0570 + + + + + ARS09-DBPM-1080 + + + + + ARS09-DBPM-1460 + + + + + ARS09-DBPM-1900 + + + + + ARS09-DBPM-2410 + + + + + ARS09-DBPM-2910 + + + + + ARS09-DBPM-4220 + + + + + ARS09-DBPM-4720 + + + + + ARS09-DBPM-5250 + + + + + ARS09-DBPM-5530 + + + + + ARS09-DBPM-5880 + + + + + ARS10-DBPM-1080 + + + + + ARS10-DBPM-1460 + + + + + ARS10-DBPM-1900 + + + + + ARS10-DBPM-2410 + + + + + ARS10-DBPM-2910 + + + + + ARS10-DBPM-4220 + + + + + ARS10-DBPM-4720 + + + + + ARS10-DBPM-5250 + + + + + ARS10-DBPM-5530 + + + + + ARS10-DBPM-5880 + + + + + ARS11-DBPM-0850 + + + + + ARS11-DBPM-1080 + + + + + ARS11-DBPM-1460 + + + + + ARS11-DBPM-1900 + + + + + ARS11-DBPM-2410 + + + + + ARS11-DBPM-2910 + + + + + ARS11-DBPM-4220 + + + + + ARS11-DBPM-4720 + + + + + ARS11-DBPM-5250 + + + + + ARS11-DBPM-5530 + + + + + ARS11-DBPM-5880 + + + + + ARS12-DBPM-0970 + + + + + ARS12-DBPM-1080 + + + + + ARS12-DBPM-1460 + + + + + ARS12-DBPM-1900 + + + + + ARS12-DBPM-2410 + + + + + ARS12-DBPM-2910 + + + + + ARS12-DBPM-4220 + + + + + ARS12-DBPM-4720 + + + + + ARS12-DBPM-5250 + + + + + ARS12-DBPM-5530 + + + + + ARS12-DBPM-5880 + + + + + + + 30 + 40 + 104 + 24 + + + + + 0 + 0 + + + + + Arial + 12 + 50 + false + + + + Single BPM + + + false + + + AGEBD-TUNE:SINGLE-BPM + + + + + + Other settings + + + + + 460 + 0 + 151 + 121 + + + + BPM trigger + + + + + 10 + 30 + 131 + 80 + + + + + + + -Trigger on pinger + + + Restart analysis script + + + /opt/gfa/python-3.8/latest/bin/python /sls/diag/bin/s_di_bpm_cmd.py put_trig_on_pinger + + + + + + + + + + + -Trigger on extraction + + + Restart analysis script + + + /opt/gfa/python-3.8/latest/bin/python /sls/diag/bin/s_di_bpm_cmd.py put_trig_on_extraction + + + + + + + + + + + -Trigger on 3 Hz + + + Restart analysis script + + + /opt/gfa/python-3.8/latest/bin/python /sls/diag/bin/s_di_bpm_cmd.py put_trig_on_3hz + + + + + + + + + + + + + 10 + 0 + 441 + 151 + + + + Pinger settings + + + + + 10 + 30 + 421 + 114 + + + + + + + + Lucida Sans Typewriter + 10 + + + + ARS01-MKIK-0320:I-READ-POS + + + + + + + + 20 + 16777215 + + + + + + + ARS01-MKIK-0290:CTRL-ON-OFF + + + + + + + + 10 + + + + Pinger V + + + + + + + + 10 + + + + Set current +[A] + + + Qt::AlignCenter + + + + + + + + 10 + + + + 4 + + + false + + + ABOMA-VME-KY-EVR0:OUT3-Delay-SP + + + + + + + + 150 + 20 + + + + + 10 + + + + 3 + + + false + + + ARS01-MKIK-0320:I-SET + + + + + + + + 10 + + + + Pinger H + + + + + + + + Lucida Sans Typewriter + 10 + + + + ARS01-MKIK-0290:I-READ-POS + + + + + + + + 10 + + + + Timing Delay +[us] + + + Qt::AlignCenter + + + + + + + + 20 + 16777215 + + + + + + + ARS01-MKIK-0320:CTRL-ON-OFF + + + + + + + + 10 + + + + Read current +[A] + + + Qt::AlignCenter + + + + + + + + 10 + + + + 4 + + + false + + + ABOMA-VME-KY-EVR0:OUT2-Delay-SP + + + + + + + + 150 + 20 + + + + + 10 + + + + 3 + + + false + + + ARS01-MKIK-0290:I-SET + + + + + + + + + + 750 + 30 + 71 + 31 + + + + ARS07-CECL-DBPM3-1:EEVR-EVENT0-ID + + + + + + 620 + 30 + 121 + 31 + + + + + 10 + + + + BPM Trigger ID +ARS07-DBPM-0840 + + + Qt::AutoText + + + Qt::AlignCenter + + + + + + + + + 0 + 0 + 950 + 25 + + + + + + + + caNumeric + QFrame +
caNumeric
+
+ + caMenu + QComboBox +
caMenu
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caShellCommand + QWidget +
caShellCommand
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + +
diff --git a/services/tune/current/systemd/AGEBD-SERVICE-TUNE.service b/services/tune/current/systemd/AGEBD-SERVICE-TUNE.service new file mode 100644 index 0000000..f70014a --- /dev/null +++ b/services/tune/current/systemd/AGEBD-SERVICE-TUNE.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TUNE +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNE +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNE.service +# systemctl --user start AGEBD-SERVICE-TUNE diff --git a/services/tunebump/current/app/pyproject.toml b/services/tunebump/current/app/pyproject.toml new file mode 100644 index 0000000..e1009e9 --- /dev/null +++ b/services/tunebump/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-tunebump" +version = "0.1.0" +description = "AGEBD-TUNEBUMP Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/tunebump/current/app/src/agebd_tunebump/__init__.py b/services/tunebump/current/app/src/agebd_tunebump/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/tunebump/current/app/src/agebd_tunebump/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/tunebump/current/app/src/agebd_tunebump/main.py b/services/tunebump/current/app/src/agebd_tunebump/main.py new file mode 100644 index 0000000..092188a --- /dev/null +++ b/services/tunebump/current/app/src/agebd_tunebump/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_tunebump import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TUNEBUMP" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/tunebump/current/app/src/agebd_tunebump/service.py b/services/tunebump/current/app/src/agebd_tunebump/service.py new file mode 100644 index 0000000..f39cf83 --- /dev/null +++ b/services/tunebump/current/app/src/agebd_tunebump/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TUNEBUMP:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TUNEBUMP:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TUNEBUMP:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/tunebump/current/app/tests/test_app.py b/services/tunebump/current/app/tests/test_app.py new file mode 100644 index 0000000..ea2bb02 --- /dev/null +++ b/services/tunebump/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_tunebump import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/tunebump/current/app/uv.lock b/services/tunebump/current/app/uv.lock new file mode 100644 index 0000000..e28b4bb --- /dev/null +++ b/services/tunebump/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-tunebump" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs new file mode 100644 index 0000000..cf91d27 --- /dev/null +++ b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs @@ -0,0 +1,4 @@ +file TUNEBUMP.template { + pattern { DEVICE } + { AGEBD-TUNEBUMP{{ agebd_env }} } +} diff --git a/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/tunebump/current/ioc/TUNEBUMP.template b/services/tunebump/current/ioc/TUNEBUMP.template new file mode 100644 index 0000000..b2bb298 --- /dev/null +++ b/services/tunebump/current/ioc/TUNEBUMP.template @@ -0,0 +1,493 @@ +#################################### +## USED BPMs +#################################### +# HORIZONTAL ARS01-DBPM-0760 (Im FOFB) +# ARS07-DBPM-0840 (BPMA) +# ---------------------------------- +# VERTICAL ARS09-DBPM-0570 (Im FOFB) +# ARS07-DBPM-5530 (BPMA) +# ---------------------------------- +# LONGITUDINAL ARS02-DBPM-2910 (Im FOFB) +# +#################################### + + +record(bo, "$(DEVICE):WRITE2MAG") { + field(DESC, "Only print or apply setpoints") + field(VAL, "1") + field(PINI, "YES") +} + +record(waveform,"$(DEVICE):CHANGELOG") { + field(DESC, "overview of to be applied changes") + field(FTVL, "UCHAR") + field(NELM, "$(SIZE=60000)") + field(PINI, "YES") +} + +record(calcout, "$(DEVICE):CALLBACK"){ + field(DESC, "1 if a tune step has been requested") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "A + B + C + D") + field(INPA, "$(DEVICE):QX-STEPUP") + field(INPB, "$(DEVICE):QX-STEPDOWN") + field(INPC, "$(DEVICE):QY-STEPUP") + field(INPD, "$(DEVICE):QY-STEPDOWN") +} + +record(ao, "$(DEVICE):QX-STEPSIZE"){ + field(DESC, "hor. tune step size, e.g. 0.0001") + field(VAL, "0.0001") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):QX-FIT"){ + field(DESC, "hor. tune from fit") + field(VAL, "0.0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):QX-STEPUP"){ + field(DESC, "request hor. tune step up") + field(FLNK, "$(DEVICE):CALLBACK") + field(VAL, "0") + field(PINI, "YES") + field(HIGH, "1") +} + +record(bo, "$(DEVICE):QX-STEPDOWN"){ + field(DESC, "request hor. tune step down") + field(FLNK, "$(DEVICE):CALLBACK") + field(VAL, "0") + field(PINI, "YES") + field(HIGH, "1") +} + +record(ao, "$(DEVICE):QY-STEPSIZE"){ + field(DESC, "ver. tune step size, e.g. 0.0001") + field(VAL, "0.0001") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):QY-FIT"){ + field(DESC, "ver. tune from fit") + field(VAL, "0.0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):QY-STEPUP"){ + field(DESC, "request ver. tune step up") + field(FLNK, "$(DEVICE):CALLBACK") + field(VAL, "0") + field(PINI, "YES") + field(HIGH, "1") +} + +record(bo, "$(DEVICE):QY-STEPDOWN"){ + field(DESC, "request ver. tune step down") + field(FLNK, "$(DEVICE):CALLBACK") + field(VAL, "0") + field(PINI, "YES") + field(HIGH, "1") +} + + +## spectra + +record (waveform, "$(DEVICE):SIGN-X"){ + field (DESC, "Copy of ARS07-DBPM-0840:DAQ-BEAM-STG0-X") + field (FTVL, "FLOAT") + field (NELM, "16384") + field (INP, "ARS07-DBPM-0840:DAQ-BEAM-STG0-X CP MS") + field (FLNK, "$(DEVICE):SPEC-X") + field (PREC, "6") +} + +record (waveform, "$(DEVICE):SPEC-X"){ + field (FTVL, "FLOAT") + field (DTYP, "FFT spsd") + field (NELM, "8193") + field (INP, "$(DEVICE):SIGN-X MS") + field (FLNK, "$(DEVICE):SPEC-FREQ-qX") + field (PREC, "3") +} + +record(calcout, "$(DEVICE):OVERSAMPLE-2-qxVEC"){ + field(DESC, "Sampling Rate") + field(CALC, "0.5 * A / (299792458 / 288 / 1000)") + field(INPA, "ARS07-DBPM-0840:DWC-STG0-RATE CP") + field(OUT, "$(DEVICE):SPEC-FREQ-qX.HOPR PP") +} + +record (waveform, "$(DEVICE):SPEC-FREQ-qX"){ + field (FTVL, "FLOAT") + field (DTYP, "sequence") + field (NELM, "8193") + field (LOPR, "0") + field (HOPR, "0.5") + field (PREC, "3") + field (PINI, "YES") +} + +record (waveform, "$(DEVICE):SIGN-Y"){ + field (DESC, "Copy of ARS07-DBPM-5530:DAQ-BEAM-STG0-Y") + field (FTVL, "FLOAT") + field (NELM, "16384") + field (INP, "ARS07-DBPM-5530:DAQ-BEAM-STG0-Y CP MS") + field (FLNK, "$(DEVICE):SPEC-Y") + field (PREC, "6") +} + +record (waveform, "$(DEVICE):SPEC-Y"){ + field (FTVL, "FLOAT") + field (DTYP, "FFT spsd") + field (NELM, "8192") + field (INP, "$(DEVICE):SIGN-Y MS") + field (FLNK, "$(DEVICE):SPEC-FREQ-qY") + field (PREC, "3") +} + +record(calcout, "$(DEVICE):OVERSAMPLE-2-qYVEC"){ + field(DESC, "Sampling Rate") + field(CALC, "0.5 * A / (299792458 / 288 / 1000)") + field(INPA, "ARS07-DBPM-5530:DWC-STG0-RATE CP") + field(OUT, "$(DEVICE):SPEC-FREQ-qY.HOPR PP") +} + +record (waveform, "$(DEVICE):SPEC-FREQ-qY"){ + field (FTVL, "FLOAT") + field (DTYP, "sequence") + field (NELM, "8192") + field (LOPR, "0") + field (HOPR, "0.5") + field (PREC, "3") + field (PINI, "YES") +} + +record (waveform, "$(DEVICE):SIGN-Z"){ + field (DESC, "Copy of ARS02-DBPM-2910:DAQ-BEAM-STG1-X") + field (FTVL, "FLOAT") + field (NELM, "16384") + field (INP, "ARS02-DBPM-2910:DAQ-BEAM-STG1-X CP MS") + field (FLNK, "$(DEVICE):SPEC-Z") + field (PREC, "6") +} + +record (waveform, "$(DEVICE):SPEC-Z"){ + field (FTVL, "FLOAT") + field (DTYP, "FFT spsd") + field (NELM, "8192") + field (INP, "$(DEVICE):SIGN-Z MS") + field (FLNK, "$(DEVICE):SPEC-FREQ-qZ") + field (PREC, "3") +} + +record(calcout, "$(DEVICE):OVERSAMPLE-2-qZVEC"){ + field(DESC, "Sampling Rate") + field(CALC, "0.5 * A / (299792458 / 288 / 1000)") + field(INPA, "ARS02-DBPM-2910:DWC-STG1-RATE CP") + field(OUT, "$(DEVICE):SPEC-FREQ-qZ.HOPR PP") +} + +record (waveform, "$(DEVICE):SPEC-FREQ-qZ"){ + field (FTVL, "FLOAT") + field (DTYP, "sequence") + field (NELM, "8192") + field (LOPR, "0") + field (HOPR, "0.5") + field (PREC, "3") + field (PINI, "YES") +} + +record(ao, "$(DEVICE):REF-QX") { + field(DESC, "PV for the hor. reference tune") + field(PREC, "3") + field(ASG, "READONLY") + field(VAL, "39.37") +} + +record(ao, "$(DEVICE):QX") { + field(DESC, "PV for the measured hor. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QX-FREQ") + field(HIHI, "0.40") + field(HHSV, "MAJOR") + field(HIGH, "0.38") + field(HSV, "MINOR") + field(LOW, "0.36") + field(LSV, "MINOR") + field(LOLO, "0.34") + field(LLSV, "MAJOR") +} + +record(calcout, "$(DEVICE):QX-FREQ") { + field(DESC, "Freq hor. tune") + field(EGU, "kHz") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "A * B / 480 / 1000") + field(INPA, "$(DEVICE):QX") + field(INPB, "AGERF-MO01:FREQ-GET") +} + +record(ao, "$(DEVICE):QX-SB1") { + field(DESC, "PV for the measured hor. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QX-SB1-DIFF") +} + +record(calcout, "$(DEVICE):QX-SB1-DIFF") { + field(DESC, "PV for the measured hor. tune") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "ABS(A - B)") + field(INPA, "$(DEVICE):QX") + field(INPB, "$(DEVICE):QX-SB1") +} + +record(ao, "$(DEVICE):QX-SB2") { + field(DESC, "PV for the measured hor. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QX-SB2-DIFF") +} + +record(calcout, "$(DEVICE):QX-SB2-DIFF") { + field(DESC, "PV for the measured hor. tune") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "ABS(A - B)") + field(INPA, "$(DEVICE):QX") + field(INPB, "$(DEVICE):QX-SB2") +} + +record(ao, "$(DEVICE):QX-ULIM") { + field(DESC, "upper limit qx search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.44") +} +record(ao, "$(DEVICE):QX-LLIM") { + field(DESC, "lower limit qx search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.30") +} + +record(waveform, "$(DEVICE):NORM-QX-AMP") { + field(DESC, "normalized, hor. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):NORM-QX-FREQ") { + field(DESC, "normalized, hor. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QX-PEAKS-FREQ") { + field(DESC, "peaks in hor. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QX-PEAKS") { + field(DESC, "peaks in hor. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(ao, "$(DEVICE):REF-QY") { + field(DESC, "PV for the ver. reference tune") + field(PREC, "3") + field(ASG, "READONLY") + field(VAL, "15.22") +} + +record(ao, "$(DEVICE):QY") { + field(DESC, "PV for the measured ver. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QY-FREQ") + field(HIHI, "0.25") + field(HHSV, "MAJOR") + field(HIGH, "0.23") + field(HSV, "MINOR") + field(LOW, "0.21") + field(LSV, "MINOR") + field(LOLO, "0.19") + field(LLSV, "MAJOR") +} + +record(calcout, "$(DEVICE):QY-FREQ") { + field(DESC, "Freq ver. tune") + field(EGU, "kHz") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "A * B / 480 / 1000") + field(INPA, "$(DEVICE):QY") + field(INPB, "AGERF-MO01:FREQ-GET") +} + +record(ao, "$(DEVICE):QY-SB1") { + field(DESC, "PV for the measured ver. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QY-SB1-DIFF") +} + +record(calcout, "$(DEVICE):QY-SB1-DIFF") { + field(DESC, "PV for the measured ver. tune") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "ABS(A - B)") + field(INPA, "$(DEVICE):QY") + field(INPB, "$(DEVICE):QY-SB1") +} + +record(ao, "$(DEVICE):QY-SB2") { + field(DESC, "PV for the measured ver. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QY-SB2-DIFF") +} + +record(calcout, "$(DEVICE):QY-SB2-DIFF") { + field(DESC, "PV for the measured ver. tune") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "ABS(A - B)") + field(INPA, "$(DEVICE):QY") + field(INPB, "$(DEVICE):QY-SB2") +} + +record(ao, "$(DEVICE):QY-ULIM") { + field(DESC, "upper limit qy search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.29") +} +record(ao, "$(DEVICE):QY-LLIM") { + field(DESC, "lower limit qy search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.15") +} + +record(waveform, "$(DEVICE):NORM-QY-AMP") { + field(DESC, "normalized, ver. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):NORM-QY-FREQ") { + field(DESC, "normalized, ver. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QY-PEAKS-FREQ") { + field(DESC, "peaks in ver. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QY-PEAKS") { + field(DESC, "peaks in ver. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(ao, "$(DEVICE):REF-QZ") { + field(DESC, "PV for the long. reference tune, no 3HC") + field(PREC, "3") + field(ASG, "READONLY") + field(VAL, "0.0027") +} + +record(ao, "$(DEVICE):QZ") { + field(DESC, "PV for the measured long. tune") + field(PREC, "3") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QZ-FREQ") + field(HIHI, "0.004") + field(HHSV, "MAJOR") + field(HIGH, "0.003") + field(HSV, "MINOR") + field(LOW, "0.001") + field(LSV, "MINOR") + field(LOLO, "0.0005") + field(LLSV, "MAJOR") +} + +record(calcout, "$(DEVICE):QZ-FREQ") { + field(DESC, "Freq ver. tune") + field(EGU, "kHz") + field(PREC, "3") + field(ASG, "READONLY") + field(PINI, "YES") + field(VAL, "0") + field(CALC, "A * B / 480 / 1000") + field(INPA, "$(DEVICE):QZ") + field(INPB, "AGERF-MO01:FREQ-GET") +} + +record(ao, "$(DEVICE):QZ-ULIM") { + field(DESC, "upper limit qz search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.0025") +} +record(ao, "$(DEVICE):QZ-LLIM") { + field(DESC, "lower limit qz search range") + field(PREC, "3") + field(ASG, "PROTECTED") + field(VAL, "0.0005") +} + +record(waveform, "$(DEVICE):NORM-QZ-AMP") { + field(DESC, "normalized, long. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):NORM-QZ-FREQ") { + field(DESC, "normalized, long. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QZ-PEAKS-FREQ") { + field(DESC, "peaks in long. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(waveform, "$(DEVICE):QZ-PEAKS") { + field(DESC, "peaks in long. spectrum") + field(NELM, "8192") + field(FTVL, "FLOAT") +} + +record(bo, "$(DEVICE):MEAS-VALID") { + field(DESC, "reflects validity of tune measurement") + field(VAL, "0") + field(PINI, "YES") +} \ No newline at end of file diff --git a/services/tunebump/current/ioc/startup.script b/services/tunebump/current/ioc/startup.script new file mode 100644 index 0000000..5c6f31b --- /dev/null +++ b/services/tunebump/current/ioc/startup.script @@ -0,0 +1,4 @@ +epicsEnvSet("ENGINEER", "armborst") +require fft +require array +require SynApps diff --git a/services/tunebump/current/qt/A_BD_TuneBump.ui b/services/tunebump/current/qt/A_BD_TuneBump.ui new file mode 100644 index 0000000..22fe977 --- /dev/null +++ b/services/tunebump/current/qt/A_BD_TuneBump.ui @@ -0,0 +1,6779 @@ + + + MainWindow + + + + 0 + 0 + 605 + 960 + + + + MainWindow + + + /*################################################*/ +/*# Settings for new templates/forms #*/ +/*################################################*/ +QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{ + background: rgba(236, 236, 236, 255); +} + +QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{ + background: rgba(0, 0, 0, 0); +} + +/*-----------------------------------------------*/ +/* Title */ +/*-----------------------------------------------*/ +/* Operation panels */ +caLabel[statusTip="Operation"]{ + color: rgba(0, 0, 0, 255); + font: bold 18pt; + font-family: Sans Serif; + padding: 1px; + margin: 0px; + qproperty-alignment: AlignLeft; + qproperty-frameShape: StyledPanel; + /*qproperty-geometry: rect(-2 0 1600 33);*/ + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(218, 218, 218, 255), + stop:0.5 rgba(200, 200, 200, 255), + stop:1 rgba(218, 218, 218, 255)); +} + + QGroupBox { + background: rgba(225,225,225,255); + border: 2px solid black; + border-radius: 5px; + margin-top: 1ex; /* leave space at the top for the title */ + } + + + + + + 810 + 120 + 70 + 20 + + + + + + + 810 + 60 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:TUNEBUMP-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 340 + 60 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QX-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 390 + 60 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QX-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 160 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QY-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 35 + 150 + 20 + + + + + 12 + 75 + true + + + + Step Size + + + Qt::AlignCenter + + + + + + 340 + 160 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QY-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 10 + 60 + 50 + 30 + + + + + 18 + 75 + true + + + + Qx + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 160 + 50 + 30 + + + + + 18 + 75 + true + + + + Qy + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 550 + 160 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QY-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 547 + 60 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QX-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 0 + 0 + 600 + 32 + + + + + Sans Serif + 18 + 75 + false + true + + + + Operation + + + Tune Shift + + + Qt::AlignLeading + + + + 218 + 218 + 218 + + + + caLabel::Default + + + + + + 0 + 300 + 605 + 660 + + + + 0 + + + + Meas + + + + + 5 + 210 + 590 + 200 + + + + Vertical Tune (nominal: Qy = 15.22) + + + AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP + + + + 139 + 26 + 150 + + + + AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + 5 + 415 + 590 + 200 + + + + Synchrotron Tune (nominal: 0.0027) + + + AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP + + + + 205 + 97 + 0 + + + + AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 205 + 97 + 0 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + false + + + 10 + + + caCartesianPlot::linear + + + + + + 5 + 5 + 590 + 200 + + + + Horizontal Tune (nominal: Qx = 39.37) + + + AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP + + + + 42 + 99 + 228 + + + + AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + + + + false + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + FFT + + + + + 0 + 415 + 590 + 200 + + + + Tune Z + + + AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + 10 + + + caCartesianPlot::log10 + + + + + + 0 + 210 + 590 + 200 + + + + Tune Y + + + AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + 14 + + + caCartesianPlot::log10 + + + + + + 0 + 5 + 590 + 200 + + + + Tune X + + + AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + 0:1 + + + 14 + + + caCartesianPlot::log10 + + + + + + Raw + + + + + 0 + 210 + 590 + 200 + + + + Vertical TbT data + + + ;AGEBD-TUNEBUMP:SIGN-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + 0 + 415 + 590 + 200 + + + + Longitudinal Stage 1 Data + + + ;AGEBD-TUNEBUMP:SIGN-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 10 + + + caCartesianPlot::linear + + + + + + 0 + 5 + 590 + 200 + + + + Horizontal TbT data + + + ;AGEBD-TUNEBUMP:SIGN-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + Settings + + + + + 10 + 260 + 371 + 51 + + + + + 19 + 75 + true + + + + Pinger Settings (ca. 10 A) + + + Qt::AlignCenter + + + + + + 440 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0320:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 140 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0290:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 160 + 490 + 291 + 30 + + + + + 15 + 50 + false + + + + Enable Energy Stabelization: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 10 + 450 + 581 + 30 + + + + + 12 + 75 + true + + + + Defined by FOFB Mean Horizontal Corrector Integral Setpoint: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 250 + 530 + 110 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Alarm_Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 30 + 490 + 110 + 30 + + + + 1 + + + 4 + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + -1.000000000000000 + + + + + + 10 + 10 + 400 + 40 + + + + + 24 + 75 + true + + + + Qx Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 130 + 400 + 40 + + + + + 25 + 75 + true + + + + Qy Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 440 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 140 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 440 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 140 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 320 + 121 + 40 + + + + + 17 + 50 + false + + + + Horizontal + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 320 + 121 + 40 + + + + + 24 + 50 + false + + + + Vertical + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 390 + 371 + 51 + + + + + 22 + 75 + true + + + + Beam Energy Setpoint + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 450 + 490 + 31 + 30 + + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN + + + + + + 160 + 530 + 91 + 30 + + + + + 15 + 50 + false + + + + ERROR: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + BPMs + + + + + 10 + 20 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 140 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 270 + 400 + 30 + + + + + 18 + 75 + true + + + + Longitudinal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 10 + 180 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Y.INP + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 60 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-X.INP + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 310 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Z.INP + + + + 205 + 97 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-INT-SWITCH + + + + + + 170 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-EXT-SWITCH + + + + + + 330 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:CHOPPER-MODE + + + + + + 170 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-EXT-SWITCH + + + + + + 10 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-INT-SWITCH + + + + + + 330 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:CHOPPER-MODE + + + + + + FeedBack QX + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 60 + 80 + 40 + + + + + 23 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 160 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBX:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBX:CONTROL-QX-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBX:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBX:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBX-ONOFF + + + caChoice::Column + + + 1 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 30 + 30 + + + + true + + + true + + + AGEBD-TUNEFBX:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Feedback QY + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QY + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBY:CONTROL-QY-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 160 + 80 + 40 + + + + + 18 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 60 + 80 + 40 + + + + + 24 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBY:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 33 + 30 + + + + true + + + 18 + + + 18 + + + true + + + AGEBD-TUNEFBY:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBY-ONOFF + + + caChoice::Column + + + 1 + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBY:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBY:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Debug + + + + + 250 + 20 + 31 + 30 + + + + AGEBD-TUNEBUMP:WRITE2MAG + + + + + + 10 + 20 + 231 + 30 + + + + + 15 + 50 + false + + + + Apply MQCO Setpoints + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 4 + 50 + 595 + 575 + + + + + Monospace + 10 + PreferDefault + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + AGEBD-TUNEBUMP:CHANGELOG + + + caMultiLineString::None + + + + + + + + 60 + 60 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 60 + 160 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 110 + 100 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 130 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 380 + 100 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 130 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 200 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 200 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 230 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 110 + 230 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 170 + 60 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-FREQ + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 170 + 160 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-FREQ + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 10 + 260 + 50 + 30 + + + + + 18 + 75 + true + + + + Qz + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 60 + 260 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 170 + 260 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ-FREQ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 340 + 60 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBX-ONOFF + + + + + + 340 + 160 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBY-ONOFF + + + calabel_3 + wmsignalpropagator + cacalc_2 + camessagebutton_14 + caspinbox + caspinbox_2 + calabel_12 + camessagebutton_15 + calabel_13 + calabel_14 + camessagebutton_16 + camessagebutton_17 + tabWidget + caLineEdit_39 + caLineEdit_40 + calabel_18 + caLineEdit_43 + caLineEdit_45 + calabel_19 + caLineEdit_48 + caLineEdit_49 + calabel_20 + calabel_21 + calabel_22 + caLineEdit_44 + calabel_23 + calabel_24 + calabel_25 + caLineEdit_50 + caLineEdit_46 + caLineEdit_51 + caLineEdit_42 + caLineEdit_54 + calabel_33 + caLineEdit_55 + caLineEdit_56 + calabel + calabel_2 + + + + + caMenu + QComboBox +
caMenu
+
+ + caChoice + QWidget +
caChoice
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caMultiLineString + QPlainTextEdit +
caMultiLineString
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caStripPlot + QwtPlot +
caStripPlot
+ 1 +
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 598 + 89 + + + 608 + 152 + + + + +
diff --git a/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service b/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service new file mode 100644 index 0000000..09eeef8 --- /dev/null +++ b/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TUNEBUMP +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEBUMP +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEBUMP.service +# systemctl --user start AGEBD-SERVICE-TUNEBUMP diff --git a/services/tunefbx/current/app/pyproject.toml b/services/tunefbx/current/app/pyproject.toml new file mode 100644 index 0000000..04d77bf --- /dev/null +++ b/services/tunefbx/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-tunefbx" +version = "0.1.0" +description = "AGEBD-TUNEFBX Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py b/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/main.py b/services/tunefbx/current/app/src/agebd_tunefbx/main.py new file mode 100644 index 0000000..a589168 --- /dev/null +++ b/services/tunefbx/current/app/src/agebd_tunefbx/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_tunefbx import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TUNEFBX" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/service.py b/services/tunefbx/current/app/src/agebd_tunefbx/service.py new file mode 100644 index 0000000..9e58ff5 --- /dev/null +++ b/services/tunefbx/current/app/src/agebd_tunefbx/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TUNEFBX:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TUNEFBX:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TUNEFBX:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/tunefbx/current/app/tests/test_app.py b/services/tunefbx/current/app/tests/test_app.py new file mode 100644 index 0000000..b0158a0 --- /dev/null +++ b/services/tunefbx/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_tunefbx import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/tunefbx/current/app/uv.lock b/services/tunefbx/current/app/uv.lock new file mode 100644 index 0000000..f4a9ae0 --- /dev/null +++ b/services/tunefbx/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-tunefbx" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs new file mode 100644 index 0000000..eaabe8c --- /dev/null +++ b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs @@ -0,0 +1,4 @@ +file TUNEFBX.template { + pattern { DEVICE } + { AGEBD-TUNEFBX{{ agebd_env }} } +} diff --git a/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/tunefbx/current/ioc/TUNEFBX.template b/services/tunefbx/current/ioc/TUNEFBX.template new file mode 100644 index 0000000..b11ca9a --- /dev/null +++ b/services/tunefbx/current/ioc/TUNEFBX.template @@ -0,0 +1,185 @@ +record(ao, "$(DEVICE):CONTROL-KP") { + field(DESC, "PID Proportional Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-KI") { + field(DESC, "PID Integral Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-KD") { + field(DESC, "PID Derivative Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QX") { + field(DESC, "PID Setpoint for QX") + field(ASG, "PROTECTED") + field(VAL, "0.37") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QX-OKRNG") { + field(DESC, "PID THRESHOLD") + field(ASG, "PROTECTED") + field(VAL, "0.0005") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QXMIN") { + field(DESC, "PID LOWER LIMIT") + field(ASG, "PROTECTED") + field(VAL, "0.31") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QXMAX") { + field(DESC, "PID UPPER LIMIT") + field(ASG, "PROTECTED") + field(VAL, "0.43") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-MIN-CURR") { + field(DESC, "PID MIN CURR") + field(ASG, "PROTECTED") + field(VAL, "400") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ") { + field(DESC, "PID SETPOINT for archive") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ-ULIM") { + field(DESC, "PID SETPOINT upper limit") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "0.001") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ-LLIM") { + field(DESC, "PID SETPOINT lower limit") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "-0.001") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):QSTEPS") { + field(DESC, "PID SETPOINT accumulated") + field(ASG, "READONLY") + field(PREC, "4") + field(VAL, "0") + field(PINI, "YES") + field(CALC, "VAL + A") + field(INPA, "$(DEVICE):DELTAQ") +} + +record(bo, "$(DEVICE):CHECK1") { + field(DESC, "measured tune realistic") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK2") { + field(DESC, "measured tune okrng") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK3") { + field(DESC, "injection not active") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK4") { + field(DESC, "current above min") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK5") { + field(DESC, "tune bpm config") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK6") { + field(DESC, "pingers on") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK7") { + field(DESC, "dt corresponds to 3.125 Hz") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK8") { + field(DESC, "calculated step within limits") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):CHECKALL") { + field(DESC, "Check SUM, written by IOC") + field(ASG, "READONLY") + field(LOLO, "0.1") + field(LLSV, "MINOR") + field(CALC, "A & B & C & D & E & F & G & H") + field(INPA, "$(DEVICE):CHECK1") + field(INPB, "$(DEVICE):CHECK2") + field(INPC, "$(DEVICE):CHECK3") + field(INPD, "$(DEVICE):CHECK4") + field(INPE, "$(DEVICE):CHECK5") + field(INPF, "$(DEVICE):CHECK6") + field(INPG, "$(DEVICE):CHECK7") + field(INPH, "$(DEVICE):CHECK8") +} \ No newline at end of file diff --git a/services/tunefbx/current/ioc/startup.script b/services/tunefbx/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/tunefbx/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/tunefbx/current/qt/A_BD_TuneBump.ui b/services/tunefbx/current/qt/A_BD_TuneBump.ui new file mode 100644 index 0000000..22fe977 --- /dev/null +++ b/services/tunefbx/current/qt/A_BD_TuneBump.ui @@ -0,0 +1,6779 @@ + + + MainWindow + + + + 0 + 0 + 605 + 960 + + + + MainWindow + + + /*################################################*/ +/*# Settings for new templates/forms #*/ +/*################################################*/ +QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{ + background: rgba(236, 236, 236, 255); +} + +QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{ + background: rgba(0, 0, 0, 0); +} + +/*-----------------------------------------------*/ +/* Title */ +/*-----------------------------------------------*/ +/* Operation panels */ +caLabel[statusTip="Operation"]{ + color: rgba(0, 0, 0, 255); + font: bold 18pt; + font-family: Sans Serif; + padding: 1px; + margin: 0px; + qproperty-alignment: AlignLeft; + qproperty-frameShape: StyledPanel; + /*qproperty-geometry: rect(-2 0 1600 33);*/ + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(218, 218, 218, 255), + stop:0.5 rgba(200, 200, 200, 255), + stop:1 rgba(218, 218, 218, 255)); +} + + QGroupBox { + background: rgba(225,225,225,255); + border: 2px solid black; + border-radius: 5px; + margin-top: 1ex; /* leave space at the top for the title */ + } + + + + + + 810 + 120 + 70 + 20 + + + + + + + 810 + 60 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:TUNEBUMP-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 340 + 60 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QX-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 390 + 60 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QX-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 160 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QY-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 35 + 150 + 20 + + + + + 12 + 75 + true + + + + Step Size + + + Qt::AlignCenter + + + + + + 340 + 160 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QY-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 10 + 60 + 50 + 30 + + + + + 18 + 75 + true + + + + Qx + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 160 + 50 + 30 + + + + + 18 + 75 + true + + + + Qy + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 550 + 160 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QY-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 547 + 60 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QX-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 0 + 0 + 600 + 32 + + + + + Sans Serif + 18 + 75 + false + true + + + + Operation + + + Tune Shift + + + Qt::AlignLeading + + + + 218 + 218 + 218 + + + + caLabel::Default + + + + + + 0 + 300 + 605 + 660 + + + + 0 + + + + Meas + + + + + 5 + 210 + 590 + 200 + + + + Vertical Tune (nominal: Qy = 15.22) + + + AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP + + + + 139 + 26 + 150 + + + + AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + 5 + 415 + 590 + 200 + + + + Synchrotron Tune (nominal: 0.0027) + + + AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP + + + + 205 + 97 + 0 + + + + AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 205 + 97 + 0 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + false + + + 10 + + + caCartesianPlot::linear + + + + + + 5 + 5 + 590 + 200 + + + + Horizontal Tune (nominal: Qx = 39.37) + + + AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP + + + + 42 + 99 + 228 + + + + AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + + + + false + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + FFT + + + + + 0 + 415 + 590 + 200 + + + + Tune Z + + + AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + 10 + + + caCartesianPlot::log10 + + + + + + 0 + 210 + 590 + 200 + + + + Tune Y + + + AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + 14 + + + caCartesianPlot::log10 + + + + + + 0 + 5 + 590 + 200 + + + + Tune X + + + AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + 0:1 + + + 14 + + + caCartesianPlot::log10 + + + + + + Raw + + + + + 0 + 210 + 590 + 200 + + + + Vertical TbT data + + + ;AGEBD-TUNEBUMP:SIGN-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + 0 + 415 + 590 + 200 + + + + Longitudinal Stage 1 Data + + + ;AGEBD-TUNEBUMP:SIGN-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 10 + + + caCartesianPlot::linear + + + + + + 0 + 5 + 590 + 200 + + + + Horizontal TbT data + + + ;AGEBD-TUNEBUMP:SIGN-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + Settings + + + + + 10 + 260 + 371 + 51 + + + + + 19 + 75 + true + + + + Pinger Settings (ca. 10 A) + + + Qt::AlignCenter + + + + + + 440 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0320:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 140 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0290:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 160 + 490 + 291 + 30 + + + + + 15 + 50 + false + + + + Enable Energy Stabelization: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 10 + 450 + 581 + 30 + + + + + 12 + 75 + true + + + + Defined by FOFB Mean Horizontal Corrector Integral Setpoint: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 250 + 530 + 110 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Alarm_Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 30 + 490 + 110 + 30 + + + + 1 + + + 4 + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + -1.000000000000000 + + + + + + 10 + 10 + 400 + 40 + + + + + 24 + 75 + true + + + + Qx Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 130 + 400 + 40 + + + + + 25 + 75 + true + + + + Qy Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 440 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 140 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 440 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 140 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 320 + 121 + 40 + + + + + 17 + 50 + false + + + + Horizontal + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 320 + 121 + 40 + + + + + 24 + 50 + false + + + + Vertical + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 390 + 371 + 51 + + + + + 22 + 75 + true + + + + Beam Energy Setpoint + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 450 + 490 + 31 + 30 + + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN + + + + + + 160 + 530 + 91 + 30 + + + + + 15 + 50 + false + + + + ERROR: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + BPMs + + + + + 10 + 20 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 140 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 270 + 400 + 30 + + + + + 18 + 75 + true + + + + Longitudinal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 10 + 180 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Y.INP + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 60 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-X.INP + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 310 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Z.INP + + + + 205 + 97 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-INT-SWITCH + + + + + + 170 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-EXT-SWITCH + + + + + + 330 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:CHOPPER-MODE + + + + + + 170 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-EXT-SWITCH + + + + + + 10 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-INT-SWITCH + + + + + + 330 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:CHOPPER-MODE + + + + + + FeedBack QX + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 60 + 80 + 40 + + + + + 23 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 160 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBX:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBX:CONTROL-QX-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBX:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBX:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBX-ONOFF + + + caChoice::Column + + + 1 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 30 + 30 + + + + true + + + true + + + AGEBD-TUNEFBX:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Feedback QY + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QY + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBY:CONTROL-QY-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 160 + 80 + 40 + + + + + 18 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 60 + 80 + 40 + + + + + 24 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBY:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 33 + 30 + + + + true + + + 18 + + + 18 + + + true + + + AGEBD-TUNEFBY:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBY-ONOFF + + + caChoice::Column + + + 1 + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBY:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBY:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Debug + + + + + 250 + 20 + 31 + 30 + + + + AGEBD-TUNEBUMP:WRITE2MAG + + + + + + 10 + 20 + 231 + 30 + + + + + 15 + 50 + false + + + + Apply MQCO Setpoints + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 4 + 50 + 595 + 575 + + + + + Monospace + 10 + PreferDefault + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + AGEBD-TUNEBUMP:CHANGELOG + + + caMultiLineString::None + + + + + + + + 60 + 60 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 60 + 160 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 110 + 100 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 130 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 380 + 100 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 130 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 200 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 200 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 230 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 110 + 230 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 170 + 60 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-FREQ + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 170 + 160 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-FREQ + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 10 + 260 + 50 + 30 + + + + + 18 + 75 + true + + + + Qz + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 60 + 260 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 170 + 260 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ-FREQ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 340 + 60 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBX-ONOFF + + + + + + 340 + 160 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBY-ONOFF + + + calabel_3 + wmsignalpropagator + cacalc_2 + camessagebutton_14 + caspinbox + caspinbox_2 + calabel_12 + camessagebutton_15 + calabel_13 + calabel_14 + camessagebutton_16 + camessagebutton_17 + tabWidget + caLineEdit_39 + caLineEdit_40 + calabel_18 + caLineEdit_43 + caLineEdit_45 + calabel_19 + caLineEdit_48 + caLineEdit_49 + calabel_20 + calabel_21 + calabel_22 + caLineEdit_44 + calabel_23 + calabel_24 + calabel_25 + caLineEdit_50 + caLineEdit_46 + caLineEdit_51 + caLineEdit_42 + caLineEdit_54 + calabel_33 + caLineEdit_55 + caLineEdit_56 + calabel + calabel_2 + + + + + caMenu + QComboBox +
caMenu
+
+ + caChoice + QWidget +
caChoice
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caMultiLineString + QPlainTextEdit +
caMultiLineString
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caStripPlot + QwtPlot +
caStripPlot
+ 1 +
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 598 + 89 + + + 608 + 152 + + + + +
diff --git a/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service b/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service new file mode 100644 index 0000000..84b2c61 --- /dev/null +++ b/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TUNEFBX +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEFBX +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEFBX.service +# systemctl --user start AGEBD-SERVICE-TUNEFBX diff --git a/services/tunefby/current/app/pyproject.toml b/services/tunefby/current/app/pyproject.toml new file mode 100644 index 0000000..b3dd565 --- /dev/null +++ b/services/tunefby/current/app/pyproject.toml @@ -0,0 +1,47 @@ +[project] +name = "agebd-tunefby" +version = "0.1.0" +description = "AGEBD-TUNEFBY Service" +requires-python = "==3.10.*" +dependencies = [ + "agebd", +] + +[dependency-groups] +dev = [ + "pyepics>=3.5.8", + "pytest>=8.4.2", + "ruff>=0.15.20", +] + +[tool.uv.sources] +# Path is relative to where agebd package is deployed on hla +# machines (see CI/CD in .gitea/workflows) +agebd = { path = "../../../../packages/agebd", editable = true } + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +package = true + +[tool.pytest.ini_options] +pythonpath = ["src"] +env = [ + "AGEBD_ENV=local", +] + +[tool.ruff] +include = [ + "src/**/*.py", + "tests/**/*.py", +] +line-length = 100 + +[tool.ruff.lint] +# use isort to sort imports +extend-select = ["I"] + +[tool.ruff.lint.isort] +known-first-party = ["agebd"] diff --git a/services/tunefby/current/app/src/agebd_tunefby/__init__.py b/services/tunefby/current/app/src/agebd_tunefby/__init__.py new file mode 100644 index 0000000..1800c27 --- /dev/null +++ b/services/tunefby/current/app/src/agebd_tunefby/__init__.py @@ -0,0 +1 @@ +from .service import PVs, Service diff --git a/services/tunefby/current/app/src/agebd_tunefby/main.py b/services/tunefby/current/app/src/agebd_tunefby/main.py new file mode 100644 index 0000000..ff69b86 --- /dev/null +++ b/services/tunefby/current/app/src/agebd_tunefby/main.py @@ -0,0 +1,31 @@ +import typer + +from agebd.enums import LogLevel +from agebd.runner import CallbackRunner +from agebd.utils import init_logging +from agebd_tunefby import PVs, Service + + +# TODO: remove: cicd test 10 + +def main( + log_level: LogLevel = typer.Option( + LogLevel.INFO, + "--log-level", + "-l", + # Looks at the OS env variable first. If empty, falls back to "INFO" + envvar="AGEBD_LOG_LEVEL", + # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL", + case_sensitive=False, + ), +): + init_logging(log_level) + service_name = "TUNEFBY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + runner = CallbackRunner(service=service) + runner.start() + + +if __name__ == "__main__": + typer.run(main) diff --git a/services/tunefby/current/app/src/agebd_tunefby/service.py b/services/tunefby/current/app/src/agebd_tunefby/service.py new file mode 100644 index 0000000..736310e --- /dev/null +++ b/services/tunefby/current/app/src/agebd_tunefby/service.py @@ -0,0 +1,93 @@ +import time + +from epics import dbr + +from agebd.pv import LocalPVLink +from agebd.service.base import BaseService +from agebd.service.pvs import BasePVs +from agebd.utils import printgetversion +from agebd.pv import get_pv_class + +__version__ = printgetversion(__file__) + +PV = get_pv_class() + + +class PVs(BasePVs): + # Option 1: + ## Service specific PVs from dedicated IOC + my_pv1 = PV("AGEBD-TUNEFBY:AO") # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + def __init__(self, service_name: str, pv_factory=PV): + super().__init__(service_name, pv_factory) + PV = pv_factory + + # TODO: can we do this cleaner? Maybe mechanism for + # settings initial values in dev mode (e.g. ini file) + if isinstance(self.onoff, LocalPVLink): + self.onoff.value = True + + # Option 2: + ## Service specific PVs from dedicated IOC + self.my_pv2 = PV( + "AGEBD-TUNEFBY:BO" + ) # TODO: is this a good PV to use? + + ## Service specific PVs from other IOCs + # ... + + # TODO: class attribute names usually lowercase + # usually it is advisable to trigger the mainloop of a service on changes of certain PVs: + self.CallbackPV = PV( + "AGEBD-TUNEFBY:CALLBACK", auto_monitor=dbr.DBE_VALUE + ) # TODO: ok? + + +class Service(BaseService[PVs]): + def __init__( + self, + name: str, + pvs: PVs, + version: str = __version__, + sleep_interval: float = 0.1, + ): + super().__init__(name, pvs, version, sleep_interval) + + # TODO: What is this for? + self.path = "sls/bd/bin" + + def update(self): + # when callback is fired, this code will be executed + if self.CallbackFired: + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running when the callback is fired + time.sleep(1) + ####################################################################################### + ####################################################################################### + + # callback done + self.CallbackFired = 0 + + ####################################################################################### + ####################################################################################### + # here goes all the code that your service + # is supposed to be running in any case, e.g., + + # update some pvs/vals + my_pv1_random_val = str(time.clock_gettime_ns(0))[-1] + self.pvs.my_pv1.put(my_pv1_random_val) + # self.pvs.my_pv2.put("MY_PV2 value") + + # get some pvs/vals + self.val1 = self.pvs.my_pv1.get() + self.val2 = self.pvs.my_pv2.get() + + # maybe sleep to limit the update loop execution rate + time.sleep(1) + ####################################################################################### + ####################################################################################### diff --git a/services/tunefby/current/app/tests/test_app.py b/services/tunefby/current/app/tests/test_app.py new file mode 100644 index 0000000..d8727c2 --- /dev/null +++ b/services/tunefby/current/app/tests/test_app.py @@ -0,0 +1,9 @@ +from agebd_tunefby import PVs, Service + + +def test_app(): + service_name = "DUMMY" + pvs = PVs(service_name=service_name) + service = Service(name=service_name, pvs=pvs) + service.CallbackFired = 1 + service.update() diff --git a/services/tunefby/current/app/uv.lock b/services/tunefby/current/app/uv.lock new file mode 100644 index 0000000..c79326d --- /dev/null +++ b/services/tunefby/current/app/uv.lock @@ -0,0 +1,275 @@ +version = 1 +revision = 3 +requires-python = "==3.10.*" + +[[package]] +name = "agebd" +version = "0.1.0" +source = { editable = "../../../../packages/agebd" } +dependencies = [ + { name = "typer" }, +] + +[package.metadata] +requires-dist = [{ name = "typer", specifier = ">=0.23.2" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyright", specifier = ">=1.1.410" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.19" }, +] + +[[package]] +name = "agebd-tunefby" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "agebd" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyepics" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pyepics", specifier = ">=3.5.8" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "ruff", specifier = ">=0.15.20" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pyepics" +version = "3.5.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" }, + { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" }, + { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typer" +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] diff --git a/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs new file mode 100644 index 0000000..8e1d851 --- /dev/null +++ b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs @@ -0,0 +1,4 @@ +file TUNEFBY.template { + pattern { DEVICE } + { AGEBD-TUNEFBY{{ agebd_env }} } +} diff --git a/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml new file mode 100644 index 0000000..ff8e70f --- /dev/null +++ b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml @@ -0,0 +1,6 @@ +cpu_architecture: x86_64 +epics_version: 7.0.8 +ioc_host: sls-vserv-bd-01{{ agebd_env }} +ioc_port: {{ ioc_port }} +os: RHEL8 +os_id: rhel diff --git a/services/tunefby/current/ioc/TUNEFBY.template b/services/tunefby/current/ioc/TUNEFBY.template new file mode 100644 index 0000000..756df39 --- /dev/null +++ b/services/tunefby/current/ioc/TUNEFBY.template @@ -0,0 +1,185 @@ +record(ao, "$(DEVICE):CONTROL-KP") { + field(DESC, "PID Proportional Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-KI") { + field(DESC, "PID Integral Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-KD") { + field(DESC, "PID Derivative Gain") + field(ASG, "PROTECTED") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QY") { + field(DESC, "PID Setpoint for QY") + field(ASG, "PROTECTED") + field(VAL, "0.22") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QY-OKRNG") { + field(DESC, "PID THRESHOLD") + field(ASG, "PROTECTED") + field(VAL, "0.0005") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QYMIN") { + field(DESC, "PID LOWER LIMIT") + field(ASG, "PROTECTED") + field(VAL, "0.15") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-QYMAX") { + field(DESC, "PID UPPER LIMIT") + field(ASG, "PROTECTED") + field(VAL, "0.28") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):CONTROL-MIN-CURR") { + field(DESC, "PID MIN CURR") + field(ASG, "PROTECTED") + field(VAL, "400") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ") { + field(DESC, "PID SETPOINT for archive") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "0") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ-ULIM") { + field(DESC, "PID SETPOINT upper limit") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "0.001") + field(PINI, "YES") +} + +record(ao, "$(DEVICE):DELTAQ-LLIM") { + field(DESC, "PID SETPOINT lower limit") + field(ASG, "PROTECTED") + field(FLNK, "$(DEVICE):QSTEPS") + field(VAL, "-0.001") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):QSTEPS") { + field(DESC, "PID SETPOINT accumulated") + field(ASG, "READONLY") + field(PREC, "4") + field(VAL, "0") + field(PINI, "YES") + field(CALC, "VAL + A") + field(INPA, "$(DEVICE):DELTAQ") +} + +record(bo, "$(DEVICE):CHECK1") { + field(DESC, "measured tune realistic") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK2") { + field(DESC, "measured tune okrng") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK3") { + field(DESC, "injection not active") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK4") { + field(DESC, "current above min") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK5") { + field(DESC, "tune bpm config") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK6") { + field(DESC, "pingers on") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK7") { + field(DESC, "dt corresponds to 3.125 Hz") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(bo, "$(DEVICE):CHECK8") { + field(DESC, "calculated step within limits") + field(FLNK, "$(DEVICE):CHECKALL") + field(ASG, "PROTECTED") + field(ZSV, "MINOR") + field(OSV, "NO_ALARM") + field(VAL, "0") + field(PINI, "YES") +} + +record(calc, "$(DEVICE):CHECKALL") { + field(DESC, "Check SUM, written by IOC") + field(ASG, "READONLY") + field(LOLO, "0.1") + field(LLSV, "MINOR") + field(CALC, "A & B & C & D & E & F & G & H") + field(INPA, "$(DEVICE):CHECK1") + field(INPB, "$(DEVICE):CHECK2") + field(INPC, "$(DEVICE):CHECK3") + field(INPD, "$(DEVICE):CHECK4") + field(INPE, "$(DEVICE):CHECK5") + field(INPF, "$(DEVICE):CHECK6") + field(INPG, "$(DEVICE):CHECK7") + field(INPH, "$(DEVICE):CHECK8") +} \ No newline at end of file diff --git a/services/tunefby/current/ioc/startup.script b/services/tunefby/current/ioc/startup.script new file mode 100644 index 0000000..0fa52ff --- /dev/null +++ b/services/tunefby/current/ioc/startup.script @@ -0,0 +1 @@ +epicsEnvSet("ENGINEER", "armborst") diff --git a/services/tunefby/current/qt/A_BD_TuneBump.ui b/services/tunefby/current/qt/A_BD_TuneBump.ui new file mode 100644 index 0000000..22fe977 --- /dev/null +++ b/services/tunefby/current/qt/A_BD_TuneBump.ui @@ -0,0 +1,6779 @@ + + + MainWindow + + + + 0 + 0 + 605 + 960 + + + + MainWindow + + + /*################################################*/ +/*# Settings for new templates/forms #*/ +/*################################################*/ +QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{ + background: rgba(236, 236, 236, 255); +} + +QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{ + background: rgba(0, 0, 0, 0); +} + +/*-----------------------------------------------*/ +/* Title */ +/*-----------------------------------------------*/ +/* Operation panels */ +caLabel[statusTip="Operation"]{ + color: rgba(0, 0, 0, 255); + font: bold 18pt; + font-family: Sans Serif; + padding: 1px; + margin: 0px; + qproperty-alignment: AlignLeft; + qproperty-frameShape: StyledPanel; + /*qproperty-geometry: rect(-2 0 1600 33);*/ + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(218, 218, 218, 255), + stop:0.5 rgba(200, 200, 200, 255), + stop:1 rgba(218, 218, 218, 255)); +} + + QGroupBox { + background: rgba(225,225,225,255); + border: 2px solid black; + border-radius: 5px; + margin-top: 1ex; /* leave space at the top for the title */ + } + + + + + + 810 + 120 + 70 + 20 + + + + + + + 810 + 60 + 70 + 20 + + + + Reload + + + RELOAD + + + A + + + AGEBD-ALH:TUNEBUMP-GUIRELOAD + + + caCalc::TriggerZeroToOne + + + + + + 340 + 60 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QX-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 390 + 60 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QX-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 160 + 150 + 30 + + + + 1 + + + 4 + + + AGEBD-TUNEBUMP:QY-STEPSIZE + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + caSpinbox::as_is + + + + + + 390 + 35 + 150 + 20 + + + + + 12 + 75 + true + + + + Step Size + + + Qt::AlignCenter + + + + + + 340 + 160 + 40 + 30 + + + + << + + + false + + + AGEBD-TUNEBUMP:QY-STEPDOWN + + + << + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 10 + 60 + 50 + 30 + + + + + 18 + 75 + true + + + + Qx + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 160 + 50 + 30 + + + + + 18 + 75 + true + + + + Qy + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 550 + 160 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QY-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 547 + 60 + 40 + 30 + + + + >> + + + false + + + AGEBD-TUNEBUMP:QX-STEPUP + + + >> + + + + 160 + 160 + 160 + + + + + + + 1 + + + caMessageButton::as_is + + + + + + 0 + 0 + 600 + 32 + + + + + Sans Serif + 18 + 75 + false + true + + + + Operation + + + Tune Shift + + + Qt::AlignLeading + + + + 218 + 218 + 218 + + + + caLabel::Default + + + + + + 0 + 300 + 605 + 660 + + + + 0 + + + + Meas + + + + + 5 + 210 + 590 + 200 + + + + Vertical Tune (nominal: Qy = 15.22) + + + AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP + + + + 139 + 26 + 150 + + + + AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 139 + 26 + 150 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + 5 + 415 + 590 + 200 + + + + Synchrotron Tune (nominal: 0.0027) + + + AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP + + + + 205 + 97 + 0 + + + + AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS + + + caCartesianPlot::Sticks + + + + 255 + 255 + 255 + + + + + 205 + 97 + 0 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + false + + + 10 + + + caCartesianPlot::linear + + + + + + 5 + 5 + 590 + 200 + + + + Horizontal Tune (nominal: Qx = 39.37) + + + AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP + + + + 42 + 99 + 228 + + + + AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS + + + caCartesianPlot::Sticks + + + caCartesianPlot::NoSymbol + + + + + + + 255 + 255 + 255 + + + + + 42 + 99 + 228 + + + + caCartesianPlot::Auto + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + + + + false + + + false + + + 14 + + + caCartesianPlot::linear + + + + + + FFT + + + + + 0 + 415 + 590 + 200 + + + + Tune Z + + + AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.0005;0.0025 + + + 10 + + + caCartesianPlot::log10 + + + + + + 0 + 210 + 590 + 200 + + + + Tune Y + + + AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.15;0.29 + + + 14 + + + caCartesianPlot::log10 + + + + + + 0 + 5 + 590 + 200 + + + + Tune X + + + AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0.3;0.44 + + + 0:1 + + + 14 + + + caCartesianPlot::log10 + + + + + + Raw + + + + + 0 + 210 + 590 + 200 + + + + Vertical TbT data + + + ;AGEBD-TUNEBUMP:SIGN-Y + + + + 139 + 26 + 150 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + 0 + 415 + 590 + 200 + + + + Longitudinal Stage 1 Data + + + ;AGEBD-TUNEBUMP:SIGN-Z + + + + 205 + 97 + 0 + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 10 + + + caCartesianPlot::linear + + + + + + 0 + 5 + 590 + 200 + + + + Horizontal TbT data + + + ;AGEBD-TUNEBUMP:SIGN-X + + + + 42 + 99 + 228 + + + + + + + caCartesianPlot::Sticks + + + + + + + 255 + 255 + 255 + + + + caCartesianPlot::User + + + caCartesianPlot::Auto + + + 0;16384 + + + + + + 14 + + + caCartesianPlot::linear + + + + + + Settings + + + + + 10 + 260 + 371 + 51 + + + + + 19 + 75 + true + + + + Pinger Settings (ca. 10 A) + + + Qt::AlignCenter + + + + + + 440 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0320:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 140 + 320 + 150 + 40 + + + + 3 + + + 2 + + + ARS01-MKIK-0290:I-SET + + + caSpinbox::User + + + caSpinbox::User + + + 300.000000000000000 + + + 0.000000000000000 + + + + + + 160 + 490 + 291 + 30 + + + + + 15 + 50 + false + + + + Enable Energy Stabelization: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 10 + 450 + 581 + 30 + + + + + 12 + 75 + true + + + + Defined by FOFB Mean Horizontal Corrector Integral Setpoint: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 250 + 530 + 110 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR + + + + 0 + 0 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Alarm_Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 30 + 490 + 110 + 30 + + + + 1 + + + 4 + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT + + + caSpinbox::User + + + caSpinbox::User + + + 1.000000000000000 + + + -1.000000000000000 + + + + + + 10 + 10 + 400 + 40 + + + + + 24 + 75 + true + + + + Qx Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 130 + 400 + 40 + + + + + 25 + 75 + true + + + + Qy Search Range + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 60 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 440 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 140 + 60 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QX-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 440 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Upper limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 140 + 180 + 150 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEBUMP:QY-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 180 + 121 + 40 + + + + + 16 + 50 + false + + + + Lower limit + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 320 + 121 + 40 + + + + + 17 + 50 + false + + + + Horizontal + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 320 + 121 + 40 + + + + + 24 + 50 + false + + + + Vertical + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 10 + 390 + 371 + 51 + + + + + 22 + 75 + true + + + + Beam Energy Setpoint + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 450 + 490 + 31 + 30 + + + + ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN + + + + + + 160 + 530 + 91 + 30 + + + + + 15 + 50 + false + + + + ERROR: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + BPMs + + + + + 10 + 20 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 10 + 140 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 10 + 270 + 400 + 30 + + + + + 18 + 75 + true + + + + Longitudinal Tune BPM + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 10 + 180 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Y.INP + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 60 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-X.INP + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 310 + 580 + 30 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:SIGN-Z.INP + + + + 205 + 97 + 0 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 10 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-INT-SWITCH + + + + + + 170 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:PILOT-EXT-SWITCH + + + + + + 330 + 100 + 150 + 30 + + + + ARS07-DBPM-0840:CHOPPER-MODE + + + + + + 170 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-EXT-SWITCH + + + + + + 10 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:PILOT-INT-SWITCH + + + + + + 330 + 220 + 150 + 30 + + + + ARS07-DBPM-5530:CHOPPER-MODE + + + + + + FeedBack QX + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Horizontal Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 42 + 99 + 228 + + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 60 + 80 + 40 + + + + + 23 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBX:CONTROL-QXMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 160 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBX:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBX:CONTROL-QX-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBX:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBX:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBX-ONOFF + + + caChoice::Column + + + 1 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBX:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 30 + 30 + + + + true + + + true + + + AGEBD-TUNEFBX:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBX:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Feedback QY + + + + + 10 + 10 + 400 + 30 + + + + + 18 + 75 + true + + + + Vertical Tune Feedback + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 139 + 26 + 150 + + + + + + + 120 + 60 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QY + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 210 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 210 + 171 + 40 + + + + 1 + + + 4 + + + true + + + AGEBD-TUNEFBY:CONTROL-QY-OKRNG + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 200 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 260 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KI + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 60 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>ΔQ</p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 310 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 270 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK4 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 400 + 210 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KP + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 110 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMAX + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 250 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 300 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 160 + 80 + 40 + + + + + 18 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 310 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:CONTROL-KD + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 220 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK3 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 350 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 150 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 60 + 80 + 40 + + + + + 24 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 210 + 80 + 40 + + + + + 16 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 60 + 150 + 40 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEFBY:DELTAQ + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 500 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + = + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 520 + 350 + 33 + 30 + + + + true + + + 18 + + + 18 + + + true + + + AGEBD-TUNEFBY:CHECKALL + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 320 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK5 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 170 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK2 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 310 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 160 + 171 + 40 + + + + 1 + + + 2 + + + AGEBD-TUNEFBY:CONTROL-QYMIN + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 120 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK1 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 40 + 355 + 80 + 20 + + + + + 11 + 50 + false + + + + <html><head/><body><p>Conditions<br/></p></body></html> + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 390 + 10 + 160 + 30 + + + + AGEBD-ALH:TUNEFBY-ONOFF + + + caChoice::Column + + + 1 + + + + + + 370 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK6 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 20 + 380 + 571 + 240 + + + + + 10 + 75 + true + + + + Accumulated Tune Steps + + + + + + + + + AGEBD-TUNEFBY:QSTEPS + + + caStripPlot::Second + + + 600.000000000000000 + + + caStripPlot::High + + + caStripPlot::linear + + + caStripPlot::autoScale + + + 0.000000000000000 + + + 0.000000001000000 + + + caStripPlot::Channel + + + caStripPlot::Channel + + + + 42 + 99 + 228 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 252 + 192 + 11 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 239 + 41 + 41 + + + + 0.000000410000000 + + + 0.000000001000000 + + + caStripPlot::User + + + caStripPlot::User + + + + 255 + 0 + 255 + + + + 0.000000100000000 + + + 0.000000001000000 + + + + 218 + 218 + 218 + + + + true + + + false + + + + + + 20 + 260 + 80 + 40 + + + + + 25 + 50 + false + + + + <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 20 + 110 + 80 + 40 + + + + + 17 + 50 + false + + + + <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 120 + 260 + 171 + 40 + + + + 3 + + + 1 + + + AGEBD-TUNEFBY:CONTROL-MIN-CURR + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 420 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK7 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 470 + 350 + 30 + 30 + + + + AGEBD-TUNEFBY:CHECK8 + + + + 0 + 205 + 0 + + + + 0 + + + 1 + + + + + + 450 + 350 + 20 + 30 + + + + + 15 + 50 + false + + + + + + + + Qt::AlignCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 310 + 160 + 80 + 40 + + + + + 21 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 400 + 110 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-ULIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 400 + 160 + 150 + 40 + + + + 1 + + + 3 + + + AGEBD-TUNEFBY:DELTAQ-LLIM + + + caSpinbox::User + + + true + + + 0.100000000000000 + + + 0.000000000000000 + + + + + + 310 + 110 + 80 + 40 + + + + + 20 + 50 + false + + + + <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + Debug + + + + + 250 + 20 + 31 + 30 + + + + AGEBD-TUNEBUMP:WRITE2MAG + + + + + + 10 + 20 + 231 + 30 + + + + + 15 + 50 + false + + + + Apply MQCO Setpoints + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + ESimpleLabel::None + + + + + + 4 + 50 + 595 + 575 + + + + + Monospace + 10 + PreferDefault + + + + Qt::ScrollBarAlwaysOn + + + Qt::ScrollBarAsNeeded + + + AGEBD-TUNEBUMP:CHANGELOG + + + caMultiLineString::None + + + + + + + + 60 + 60 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 60 + 160 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 110 + 100 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 100 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB1-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 130 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2 + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 130 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-SB2-DIFF + + + + 42 + 99 + 228 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 380 + 100 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 130 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 200 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 110 + 200 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 1 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 380 + 230 + 91 + 20 + + + + + 12 + 75 + true + + + + Distance + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 110 + 230 + 121 + 20 + + + + + 12 + 75 + true + + + + Sideband 2 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 0 + 0 + 0 + + + + + 255 + 252 + 255 + + + + + + + 250 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2 + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 200 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB1-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 480 + 230 + 110 + 20 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-SB2-DIFF + + + + 139 + 26 + 150 + + + + + 255 + 255 + 225 + + + + caLineEdit::Static + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::Height + + + false + + + caLineEdit::decimal + + + + + + 170 + 60 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QX-FREQ + + + + 42 + 99 + 228 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 42 + 99 + 228 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 170 + 160 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QY-FREQ + + + + 139 + 26 + 150 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 139 + 26 + 150 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 10 + 260 + 50 + 30 + + + + + 18 + 75 + true + + + + Qz + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + 205 + 97 + 0 + + + + + + + 60 + 260 + 100 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 4 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + false + + + caLineEdit::decimal + + + + + + 170 + 260 + 160 + 30 + + + + + Lucida Sans Typewriter + 16 + + + + true + + + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + AGEBD-TUNEBUMP:QZ-FREQ + + + + 205 + 97 + 0 + + + + + 0 + 0 + 0 + + + + caLineEdit::Static + + + true + + + + 205 + 97 + 0 + + + + 1 + + + caLineEdit::onBackground + + + 3 + + + caLineEdit::User + + + caLineEdit::Channel + + + 0.100000000000000 + + + 0.000000000000000 + + + caLineEdit::None + + + true + + + caLineEdit::decimal + + + + + + 340 + 60 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBX-ONOFF + + + + + + 340 + 160 + 250 + 30 + + + + + Sans Serif + 18 + + + + Feedback ON + + + Qt::AlignCenter + + + + 0 + 205 + 0 + + + + caLabel::Calc + + + A + + + AGEBD-ALH:TUNEFBY-ONOFF + + + calabel_3 + wmsignalpropagator + cacalc_2 + camessagebutton_14 + caspinbox + caspinbox_2 + calabel_12 + camessagebutton_15 + calabel_13 + calabel_14 + camessagebutton_16 + camessagebutton_17 + tabWidget + caLineEdit_39 + caLineEdit_40 + calabel_18 + caLineEdit_43 + caLineEdit_45 + calabel_19 + caLineEdit_48 + caLineEdit_49 + calabel_20 + calabel_21 + calabel_22 + caLineEdit_44 + calabel_23 + calabel_24 + calabel_25 + caLineEdit_50 + caLineEdit_46 + caLineEdit_51 + caLineEdit_42 + caLineEdit_54 + calabel_33 + caLineEdit_55 + caLineEdit_56 + calabel + calabel_2 + + + + + caMenu + QComboBox +
caMenu
+
+ + caChoice + QWidget +
caChoice
+
+ + caMessageButton + QPushButton +
caMessageButton
+
+ + caToggleButton + QCheckBox +
caToggleButton
+
+ + caSpinbox + QFrame +
caSpinbox
+
+ + caLabel + QLabel +
caLabel
+
+ + caLed + QWidget +
caLed
+
+ + caLineEdit + QLineEdit +
caLineEdit
+
+ + caMultiLineString + QPlainTextEdit +
caMultiLineString
+
+ + caCartesianPlot + QwtPlot +
caCartesianPlot
+
+ + caStripPlot + QwtPlot +
caStripPlot
+ 1 +
+ + caCalc + QLabel +
caCalc
+
+ + wmSignalPropagator + QLabel +
wmSignalPropagator
+
+ + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + cacalc_2 + emitSignal(bool) + wmsignalpropagator + reloadwindow() + + + 598 + 89 + + + 608 + 152 + + + + +
diff --git a/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service b/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service new file mode 100644 index 0000000..3cbbb68 --- /dev/null +++ b/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service @@ -0,0 +1,16 @@ +[Unit] +Description=AGEBD-SERVICE-TUNEFBY +After=network.target + +[Service] +Environment=AGEBD_ENV={{ agebd_env }} +ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEFBY +Restart=no + +[Install] +WantedBy=default.target + +# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html +# systemctl --user daemon-reload +# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEFBY.service +# systemctl --user start AGEBD-SERVICE-TUNEFBY