Feature/add new service all migrate #8

Closed
labrec_b wants to merge 33 commits from feature/add-new-service-all-migrate into main
175 changed files with 52589 additions and 0 deletions
+1
View File
@@ -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 | |
@@ -0,0 +1 @@
AGEBD-DBPM3CURR:ACCUMULATED-BEAM-DOSE
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -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"}
}
@@ -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
@@ -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")
}
@@ -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")
}
@@ -0,0 +1 @@
epicsEnvSet("ENGINEER", "armborst")
@@ -0,0 +1,988 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>1195</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="styleSheet">
<string notr="true">
/*-----------------------------------------------*/
/* Title */
/*-----------------------------------------------*/
/* Operation panels */
caLabel[statusTip=&quot;Operation&quot;]{
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));
}
</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="wmSignalPropagator" name="wmsignalpropagator">
<property name="geometry">
<rect>
<x>670</x>
<y>140</y>
<width>70</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="caCalc" name="cacalc_2">
<property name="geometry">
<rect>
<x>670</x>
<y>80</y>
<width>70</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Reload</string>
</property>
<property name="variable">
<string notr="true">RELOAD</string>
</property>
<property name="calc">
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH:INJECTIONGUARD-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
</property>
</widget>
<widget class="caMenu" name="camenu">
<property name="geometry">
<rect>
<x>130</x>
<y>36</y>
<width>460</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CONTROL-MODE</string>
</property>
</widget>
<widget class="caLabel" name="calabel">
<property name="geometry">
<rect>
<x>10</x>
<y>36</y>
<width>110</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>25</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Mode</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_21">
<property name="geometry">
<rect>
<x>10</x>
<y>78</y>
<width>580</width>
<height>60</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-SUM</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caMessageButton" name="VCS_Reset_Ring">
<property name="geometry">
<rect>
<x>652</x>
<y>394</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text">
<string>Ring Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ARS_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">Ring Reset</string>
</property>
<property name="background">
<color>
<red>212</red>
<green>219</green>
<blue>157</blue>
</color>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="VCS_Reset_LINAC">
<property name="geometry">
<rect>
<x>652</x>
<y>346</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text">
<string>LI LTB Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ALIVA_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">LI LTB Reset</string>
</property>
<property name="background">
<color>
<red>212</red>
<green>219</green>
<blue>157</blue>
</color>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="VCS_Reset_Booster">
<property name="geometry">
<rect>
<x>652</x>
<y>370</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text">
<string>Boster Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ABOVA_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">Boster Reset</string>
</property>
<property name="background">
<color>
<red>212</red>
<green>219</green>
<blue>157</blue>
</color>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="MIS_Reset">
<property name="geometry">
<rect>
<x>722</x>
<y>438</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>MIS Alarm Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-MIS-PLC-01:Alarm_Reset</string>
</property>
<property name="label">
<string notr="true">MIS Alarm Reset</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="MIS_FE">
<property name="geometry">
<rect>
<x>722</x>
<y>474</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>MIS-FE Alarm Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ACOSA-MIS-FE:ACKERR-REQUEST</string>
</property>
<property name="label">
<string notr="true">MIS-FE Alarm Reset</string>
</property>
<property name="releaseMessage">
<string notr="true">0</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="MIS_VCS_ALIVA">
<property name="geometry">
<rect>
<x>722</x>
<y>544</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>VCS ALIVA Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ALIVA_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">VCS ALIVA Reset</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="MIS_VCS_ABOVA">
<property name="geometry">
<rect>
<x>722</x>
<y>506</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>VCS ABOVA Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ABOVA_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">VCS ABOVA Reset</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caMessageButton" name="MIS_VCS_ARS">
<property name="geometry">
<rect>
<x>726</x>
<y>578</y>
<width>150</width>
<height>22</height>
</rect>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>VCS ARS Reset</string>
</property>
<property name="channel" stdset="0">
<string notr="true">ARS00-VCS:PLC_ARS_RESET_REQUEST</string>
</property>
<property name="label">
<string notr="true">VCS ARS Reset</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>140</y>
<width>580</width>
<height>1050</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Checks</string>
</attribute>
<widget class="caLed" name="caled_33">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>40</width>
<height>40</height>
</rect>
</property>
<property name="rectangular">
<bool>true</bool>
</property>
<property name="gradientEnabled">
<bool>false</bool>
</property>
<property name="ledWidth">
<number>30</number>
</property>
<property name="ledHeight">
<number>30</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
</property>
</widget>
<widget class="caLabel" name="Inj_trig_1">
<property name="geometry">
<rect>
<x>60</x>
<y>10</y>
<width>300</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
<string>Master Trigger Freigabe</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="fontScaleMode">
<enum>ESimpleLabel::None</enum>
</property>
<property name="foreground">
<color>
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</property>
<property name="background">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
</widget>
<widget class="caInclude" name="cainclude">
<property name="geometry">
<rect>
<x>0</x>
<y>110</y>
<width>580</width>
<height>901</height>
</rect>
</property>
<property name="macro">
<string>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</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_InjectionGuard_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>23</number>
</property>
</widget>
<widget class="Line" name="line_7">
<property name="geometry">
<rect>
<x>270</x>
<y>60</y>
<width>20</width>
<height>900</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<widget class="Line" name="line_8">
<property name="geometry">
<rect>
<x>10</x>
<y>96</y>
<width>560</width>
<height>20</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="Line" name="line_9">
<property name="geometry">
<rect>
<x>210</x>
<y>60</y>
<width>20</width>
<height>900</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_10">
<property name="geometry">
<rect>
<x>230</x>
<y>66</y>
<width>40</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<family>Monospace</family>
<pointsize>19</pointsize>
<weight>75</weight>
<bold>true</bold>
<stylestrategy>PreferDefault</stylestrategy>
</font>
</property>
<property name="inputMask">
<string>OP</string>
</property>
<property name="text">
<string>OP</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-SUM-OP</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLabel" name="calabel_25">
<property name="geometry">
<rect>
<x>340</x>
<y>66</y>
<width>111</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="text">
<string>BRIDGE</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="fontScaleMode">
<enum>ESimpleLabel::None</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_11">
<property name="geometry">
<rect>
<x>290</x>
<y>66</y>
<width>40</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<family>Monospace</family>
<pointsize>19</pointsize>
<weight>75</weight>
<bold>true</bold>
<stylestrategy>PreferDefault</stylestrategy>
</font>
</property>
<property name="inputMask">
<string>M\D</string>
</property>
<property name="text">
<string>MD</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-SUM-MD</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLabel" name="calabel_8">
<property name="geometry">
<rect>
<x>9</x>
<y>66</y>
<width>201</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Check</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="fontScaleMode">
<enum>ESimpleLabel::None</enum>
</property>
</widget>
<widget class="Line" name="line_11">
<property name="geometry">
<rect>
<x>440</x>
<y>60</y>
<width>20</width>
<height>900</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_12">
<property name="geometry">
<rect>
<x>470</x>
<y>66</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<family>Monospace</family>
<pointsize>19</pointsize>
<weight>75</weight>
<bold>true</bold>
<stylestrategy>PreferDefault</stylestrategy>
</font>
</property>
<property name="inputMask">
<string>L\ATC\H</string>
</property>
<property name="text">
<string>LATCH</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-SUM-LATCH</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caMessageButton" name="camessagebutton_14">
<property name="geometry">
<rect>
<x>460</x>
<y>10</y>
<width>100</width>
<height>40</height>
</rect>
</property>
<property name="text">
<string>Reset</string>
</property>
<property name="autoDefault">
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:RESET-LATCHES</string>
</property>
<property name="label">
<string notr="true">Reset</string>
</property>
<property name="background">
<color>
<red>160</red>
<green>160</green>
<blue>160</blue>
</color>
</property>
<property name="releaseMessage">
<string notr="true"/>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Logs</string>
</attribute>
<widget class="caMultiLineString" name="camultilinestring">
<property name="geometry">
<rect>
<x>0</x>
<y>38</y>
<width>575</width>
<height>983</height>
</rect>
</property>
<property name="font">
<font>
<family>Monospace</family>
<pointsize>10</pointsize>
<stylestrategy>PreferDefault</stylestrategy>
</font>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:LOG</string>
</property>
<property name="fontScaleMode" stdset="0">
<enum>caMultiLineString::None</enum>
</property>
</widget>
<widget class="caMessageButton" name="ClearLogs">
<property name="geometry">
<rect>
<x>470</x>
<y>2</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Clear Logs</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:LOG-CLEAR</string>
</property>
<property name="label">
<string notr="true">Clear Logs</string>
</property>
<property name="background">
<color>
<red>160</red>
<green>160</green>
<blue>160</blue>
</color>
</property>
<property name="releaseMessage">
<string notr="true">0</string>
</property>
<property name="pressMessage">
<string notr="true">1</string>
</property>
</widget>
<widget class="caChoice" name="cachoice_20">
<property name="geometry">
<rect>
<x>10</x>
<y>2</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:LOG-PAUSE</string>
</property>
<property name="background">
<color>
<red>160</red>
<green>160</green>
<blue>160</blue>
</color>
</property>
<property name="colorMode">
<enum>caChoice::Default</enum>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
</property>
<property name="endBit">
<number>1</number>
</property>
</widget>
</widget>
</widget>
<widget class="caLabel" name="calabel_2">
<property name="geometry">
<rect>
<x>-2</x>
<y>2</y>
<width>628</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
<pointsize>18</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="statusTip">
<string>Operation</string>
</property>
<property name="text">
<string>Injection Guard</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading</set>
</property>
<property name="background">
<color>
<red>218</red>
<green>218</green>
<blue>218</blue>
</color>
</property>
<property name="colorMode">
<enum>caLabel::Default</enum>
</property>
</widget>
<widget class="caMimeDisplay" name="camimedisplay_2">
<property name="geometry">
<rect>
<x>556</x>
<y>6</y>
<width>40</width>
<height>22</height>
</rect>
</property>
<property name="label">
<string notr="true">-Wiki</string>
</property>
<property name="background">
<color>
<red>183</red>
<green>157</green>
<blue>92</blue>
</color>
</property>
<property name="labels">
<string>Injection Guard</string>
</property>
<property name="files">
<string>https://acceleratorwiki.psi.ch/wiki/Injection_Guard</string>
</property>
<property name="args">
<string/>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caMenu</class>
<extends>QComboBox</extends>
<header>caMenu</header>
</customwidget>
<customwidget>
<class>caChoice</class>
<extends>QWidget</extends>
<header>caChoice</header>
</customwidget>
<customwidget>
<class>caMessageButton</class>
<extends>QPushButton</extends>
<header>caMessageButton</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caInclude</class>
<extends>QWidget</extends>
<header>caInclude</header>
</customwidget>
<customwidget>
<class>caLed</class>
<extends>QWidget</extends>
<header>caLed</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
<customwidget>
<class>caMultiLineString</class>
<extends>QPlainTextEdit</extends>
<header>caMultiLineString</header>
</customwidget>
<customwidget>
<class>caCalc</class>
<extends>QLabel</extends>
<header>caCalc</header>
</customwidget>
<customwidget>
<class>wmSignalPropagator</class>
<extends>QLabel</extends>
<header>wmSignalPropagator</header>
</customwidget>
<customwidget>
<class>caMimeDisplay</class>
<extends>QWidget</extends>
<header>caMimeDisplay</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>cacalc_2</sender>
<signal>emitSignal(bool)</signal>
<receiver>wmsignalpropagator</receiver>
<slot>reloadwindow()</slot>
<hints>
<hint type="sourcelabel">
<x>598</x>
<y>89</y>
</hint>
<hint type="destinationlabel">
<x>608</x>
<y>152</y>
</hint>
</hints>
</connection>
</connections>
</ui>
@@ -0,0 +1,243 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>580</width>
<height>30</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caToggleButton" name="catogglebutton_2">
<property name="geometry">
<rect>
<x>380</x>
<y>6</y>
<width>18</width>
<height>18</height>
</rect>
</property>
<property name="iconSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CONTROL-BRIDGE-CHECK-$(checknr)</string>
</property>
<property name="background">
<color alpha="0">
<red>200</red>
<green>200</green>
<blue>200</blue>
</color>
</property>
<property name="colorMode">
<enum>caToggleButton::Default</enum>
</property>
<property name="trueValue">
<string>1</string>
</property>
<property name="elevation">
<enum>caToggleButton::on_top</enum>
</property>
</widget>
<widget class="caLed" name="caled">
<property name="geometry">
<rect>
<x>220</x>
<y>0</y>
<width>40</width>
<height>30</height>
</rect>
</property>
<property name="rectangular">
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-$(checknr)</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
</property>
</widget>
<widget class="caLed" name="caled_5">
<property name="geometry">
<rect>
<x>280</x>
<y>0</y>
<width>40</width>
<height>30</height>
</rect>
</property>
<property name="rectangular">
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-$(checknr)-MD</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>200</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<family>Monospace</family>
<pointsize>13</pointsize>
<stylestrategy>PreferDefault</stylestrategy>
</font>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-$(checknr).DESC</string>
</property>
<property name="background">
<color alpha="0">
<red>160</red>
<green>160</green>
<blue>164</blue>
</color>
</property>
<property name="colorMode">
<enum>caLineEdit::Static</enum>
</property>
<property name="fontScaleMode" stdset="0">
<enum>caLineEdit::None</enum>
</property>
</widget>
<widget class="caFrame" name="caframe">
<property name="geometry">
<rect>
<x>460</x>
<y>0</y>
<width>120</width>
<height>30</height>
</rect>
</property>
<property name="background">
<color>
<red>160</red>
<green>160</green>
<blue>164</blue>
</color>
</property>
<property name="backgroundMode">
<enum>caFrame::Outline</enum>
</property>
<property name="visibility">
<enum>caFrame::Calc</enum>
</property>
<property name="visibilityMode">
<enum>caFrame::All</enum>
</property>
<property name="visibilityCalc">
<string notr="true">$(latch)</string>
</property>
<property name="channel" stdset="0">
<string notr="true"/>
</property>
<widget class="caLed" name="caled_6">
<property name="geometry">
<rect>
<x>40</x>
<y>0</y>
<width>40</width>
<height>30</height>
</rect>
</property>
<property name="rectangular">
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CHECK-$(checknr)-LATCH</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
</property>
</widget>
</widget>
<widget class="caLed" name="caled_2">
<property name="geometry">
<rect>
<x>376</x>
<y>4</y>
<width>22</width>
<height>23</height>
</rect>
</property>
<property name="rectangular">
<bool>true</bool>
</property>
<property name="gradientEnabled">
<bool>false</bool>
</property>
<property name="ledWidth">
<number>20</number>
</property>
<property name="ledHeight">
<number>20</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD:CONTROL-BRIDGE-CHECK-$(checknr)</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
</property>
<property name="borderColor">
<color alpha="0">
<red>0</red>
<green>0</green>
<blue>0</blue>
</color>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caToggleButton</class>
<extends>QCheckBox</extends>
<header>caToggleButton</header>
</customwidget>
<customwidget>
<class>caFrame</class>
<extends>QFrame</extends>
<header>caFrame</header>
<container>1</container>
</customwidget>
<customwidget>
<class>caLed</class>
<extends>QWidget</extends>
<header>caLed</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -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
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -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 }
}
@@ -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
@@ -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")
}
@@ -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")
}
+1
View File
@@ -0,0 +1 @@
# TODO: dev/prod templating
@@ -0,0 +1 @@
epicsEnvSet("ENGINEER", "armborst")
@@ -0,0 +1,409 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>770</width>
<height>990</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caInclude" name="cainclude">
<property name="geometry">
<rect>
<x>10</x>
<y>220</y>
<width>750</width>
<height>346</height>
</rect>
</property>
<property name="macro">
<string>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</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>9</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caInclude" name="cainclude_2">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>750</width>
<height>100</height>
</rect>
</property>
<property name="macro">
<string>sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO;sourcepoint=X10DG,beamline=X11HEAT</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>3</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caLabel" name="calabel">
<property name="geometry">
<rect>
<x>10</x>
<y>190</y>
<width>261</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Dipole Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_2">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>291</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Diagnostic Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_3">
<property name="geometry">
<rect>
<x>10</x>
<y>570</y>
<width>261</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>ID Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caInclude" name="cainclude_3">
<property name="geometry">
<rect>
<x>10</x>
<y>600</y>
<width>750</width>
<height>541</height>
</rect>
</property>
<property name="macro">
<string>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</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>11</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caLabel" name="calabel_4">
<property name="geometry">
<rect>
<x>330</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_5">
<property name="geometry">
<rect>
<x>440</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>15</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_6">
<property name="geometry">
<rect>
<x>550</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_7">
<property name="geometry">
<rect>
<x>660</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>15</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caRelatedDisplay" name="carelateddisplay">
<property name="geometry">
<rect>
<x>598</x>
<y>4</y>
<width>170</width>
<height>30</height>
</rect>
</property>
<property name="label">
<string notr="true">Expert Panel All</string>
</property>
<property name="background">
<color>
<red>183</red>
<green>157</green>
<blue>92</blue>
</color>
</property>
<property name="labels">
<string>Expert Panel All</string>
</property>
<property name="files">
<string>A_BD_OrbitBump_Expert_all.ui</string>
</property>
</widget>
<widget class="caLabel" name="calabel_8">
<property name="geometry">
<rect>
<x>2</x>
<y>2</y>
<width>767</width>
<height>33</height>
</rect>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
<pointsize>20</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Beamline local Bumps</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading</set>
</property>
<property name="foreground">
<color>
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</property>
<property name="background">
<color>
<red>100</red>
<green>100</green>
<blue>100</blue>
</color>
</property>
<property name="colorMode">
<enum>caLabel::Static</enum>
</property>
</widget>
<widget class="caCalc" name="cacalc_2">
<property name="geometry">
<rect>
<x>800</x>
<y>260</y>
<width>70</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Reload</string>
</property>
<property name="variable">
<string notr="true">RELOAD</string>
</property>
<property name="calc">
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH:ORBITBUMP-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
</property>
</widget>
<widget class="wmSignalPropagator" name="wmsignalpropagator">
<property name="geometry">
<rect>
<x>800</x>
<y>320</y>
<width>70</width>
<height>20</height>
</rect>
</property>
</widget>
<zorder>cainclude</zorder>
<zorder>cainclude_2</zorder>
<zorder>calabel</zorder>
<zorder>calabel_2</zorder>
<zorder>calabel_3</zorder>
<zorder>cainclude_3</zorder>
<zorder>calabel_4</zorder>
<zorder>calabel_5</zorder>
<zorder>calabel_6</zorder>
<zorder>calabel_7</zorder>
<zorder>calabel_8</zorder>
<zorder>carelateddisplay</zorder>
<zorder>cacalc_2</zorder>
<zorder>wmsignalpropagator</zorder>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caRelatedDisplay</class>
<extends>QWidget</extends>
<header>caRelatedDisplay</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caInclude</class>
<extends>QWidget</extends>
<header>caInclude</header>
</customwidget>
<customwidget>
<class>caCalc</class>
<extends>QLabel</extends>
<header>caCalc</header>
</customwidget>
<customwidget>
<class>wmSignalPropagator</class>
<extends>QLabel</extends>
<header>wmSignalPropagator</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>cacalc_2</sender>
<signal>emitSignal(bool)</signal>
<receiver>wmsignalpropagator</receiver>
<slot>reloadwindow()</slot>
<hints>
<hint type="sourcelabel">
<x>844</x>
<y>271</y>
</hint>
<hint type="destinationlabel">
<x>847</x>
<y>327</y>
</hint>
</hints>
</connection>
</connections>
</ui>
@@ -0,0 +1,465 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1801</width>
<height>196</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caInclude" name="cainclude_2">
<property name="geometry">
<rect>
<x>10</x>
<y>72</y>
<width>1790</width>
<height>120</height>
</rect>
</property>
<property name="macro">
<string>sourcepoint=$(sourcepoint),beamline=$(beamline)</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Expert_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>1</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>1</number>
</property>
</widget>
<widget class="caLabel" name="calabel_4">
<property name="geometry">
<rect>
<x>240</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_5">
<property name="geometry">
<rect>
<x>354</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>15</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_6">
<property name="geometry">
<rect>
<x>462</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_7">
<property name="geometry">
<rect>
<x>574</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>15</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_8">
<property name="geometry">
<rect>
<x>686</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>BPM 1</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_9">
<property name="geometry">
<rect>
<x>966</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>BPM 2</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_10">
<property name="geometry">
<rect>
<x>1246</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>BPM 3</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_11">
<property name="geometry">
<rect>
<x>1526</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>BPM 4</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_12">
<property name="geometry">
<rect>
<x>791</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dx</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_13">
<property name="geometry">
<rect>
<x>876</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_14">
<property name="geometry">
<rect>
<x>1071</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dx</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_15">
<property name="geometry">
<rect>
<x>1156</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_16">
<property name="geometry">
<rect>
<x>1631</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dx</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_17">
<property name="geometry">
<rect>
<x>1351</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dx</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_18">
<property name="geometry">
<rect>
<x>1716</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_19">
<property name="geometry">
<rect>
<x>1436</x>
<y>42</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>dy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1909</width>
<height>33</height>
</rect>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
<pointsize>20</pointsize>
<weight>75</weight>
<italic>false</italic>
<bold>true</bold>
</font>
</property>
<property name="text">
<string> $(sourcepoint) $(beamline)</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading</set>
</property>
<property name="foreground">
<color>
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</property>
<property name="background">
<color>
<red>100</red>
<green>100</green>
<blue>100</blue>
</color>
</property>
<property name="colorMode">
<enum>caLabel::Static</enum>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caInclude</class>
<extends>QWidget</extends>
<header>caInclude</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1178</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caMenu" name="camenu">
<property name="geometry">
<rect>
<x>80</x>
<y>30</y>
<width>460</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINE-BEND</string>
</property>
</widget>
<widget class="caMenu" name="camenu_2">
<property name="geometry">
<rect>
<x>650</x>
<y>30</y>
<width>460</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINE-ID</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_87">
<property name="geometry">
<rect>
<x>270</x>
<y>340</y>
<width>501</width>
<height>51</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINECALC</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_88">
<property name="geometry">
<rect>
<x>50</x>
<y>110</y>
<width>501</width>
<height>51</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINETYPE-BEND</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_89">
<property name="geometry">
<rect>
<x>270</x>
<y>230</y>
<width>501</width>
<height>51</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINETYPE</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_90">
<property name="geometry">
<rect>
<x>630</x>
<y>110</y>
<width>501</width>
<height>51</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINETYPE-ID</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_91">
<property name="geometry">
<rect>
<x>260</x>
<y>450</y>
<width>501</width>
<height>51</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:BEAMLINE</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caMenu</class>
<extends>QComboBox</extends>
<header>caMenu</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,627 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1790</width>
<height>120</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caLineEdit" name="calineedit">
<property name="geometry">
<rect>
<x>779</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_2">
<property name="geometry">
<rect>
<x>864</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_3">
<property name="geometry">
<rect>
<x>1059</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM2</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_4">
<property name="geometry">
<rect>
<x>1144</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM2</string>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_2">
<property name="geometry">
<rect>
<x>230</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_3">
<property name="geometry">
<rect>
<x>340</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_4">
<property name="geometry">
<rect>
<x>560</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_5">
<property name="geometry">
<rect>
<x>450</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_5">
<property name="geometry">
<rect>
<x>1619</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM4</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_6">
<property name="geometry">
<rect>
<x>1424</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_7">
<property name="geometry">
<rect>
<x>1704</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAY-BPM4</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_8">
<property name="geometry">
<rect>
<x>1339</x>
<y>1</y>
<width>80</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-DELTAX-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_9">
<property name="geometry">
<rect>
<x>674</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_10">
<property name="geometry">
<rect>
<x>954</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-BPM2</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_11">
<property name="geometry">
<rect>
<x>1234</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_12">
<property name="geometry">
<rect>
<x>1514</x>
<y>1</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-BPM4</string>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_6">
<property name="geometry">
<rect>
<x>450</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">$(sourcepoint)-ORBITBUMP:OFFSET-Y</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_7">
<property name="geometry">
<rect>
<x>230</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">$(sourcepoint)-ORBITBUMP:OFFSET-X</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_8">
<property name="geometry">
<rect>
<x>560</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">$(sourcepoint)-ORBITBUMP:OFFSET-YP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_9">
<property name="geometry">
<rect>
<x>340</x>
<y>42</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>3</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">$(sourcepoint)-ORBITBUMP:OFFSET-XP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
</property>
<property name="fixedFormat">
<bool>true</bool>
</property>
<property name="maxValue">
<double>0.100000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caLabel" name="calabel_3">
<property name="geometry">
<rect>
<x>0</x>
<y>40</y>
<width>225</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Beamline setpoint</string>
</property>
</widget>
<widget class="caGraphics" name="cagraphics">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1790</width>
<height>120</height>
</rect>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_17">
<property name="geometry">
<rect>
<x>230</x>
<y>80</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="framePresent" stdset="0">
<bool>false</bool>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_18">
<property name="geometry">
<rect>
<x>450</x>
<y>80</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_19">
<property name="geometry">
<rect>
<x>560</x>
<y>80</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_20">
<property name="geometry">
<rect>
<x>340</x>
<y>80</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLabel" name="calabel_5">
<property name="geometry">
<rect>
<x>0</x>
<y>80</y>
<width>225</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Total Bump</string>
</property>
</widget>
<widget class="caLabel" name="calabel_6">
<property name="geometry">
<rect>
<x>0</x>
<y>2</y>
<width>225</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>Machine setpoint</string>
</property>
</widget>
<zorder>cagraphics</zorder>
<zorder>calineedit</zorder>
<zorder>calineedit_2</zorder>
<zorder>calineedit_3</zorder>
<zorder>calineedit_4</zorder>
<zorder>caspinbox_2</zorder>
<zorder>caspinbox_3</zorder>
<zorder>caspinbox_4</zorder>
<zorder>caspinbox_5</zorder>
<zorder>calineedit_5</zorder>
<zorder>calineedit_6</zorder>
<zorder>calineedit_7</zorder>
<zorder>calineedit_8</zorder>
<zorder>calineedit_9</zorder>
<zorder>calineedit_10</zorder>
<zorder>calineedit_11</zorder>
<zorder>calineedit_12</zorder>
<zorder>caspinbox_6</zorder>
<zorder>caspinbox_7</zorder>
<zorder>caspinbox_8</zorder>
<zorder>caspinbox_9</zorder>
<zorder>calabel_3</zorder>
<zorder>calineedit_17</zorder>
<zorder>calineedit_18</zorder>
<zorder>calineedit_19</zorder>
<zorder>calineedit_20</zorder>
<zorder>calabel_5</zorder>
<zorder>calabel_6</zorder>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caSpinbox</class>
<extends>QFrame</extends>
<header>caSpinbox</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caGraphics</class>
<extends>QWidget</extends>
<header>caGraphics</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -0,0 +1,291 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>770</width>
<height>950</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caInclude" name="cainclude">
<property name="geometry">
<rect>
<x>10</x>
<y>190</y>
<width>750</width>
<height>346</height>
</rect>
</property>
<property name="macro">
<string>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</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>9</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caInclude" name="cainclude_2">
<property name="geometry">
<rect>
<x>10</x>
<y>80</y>
<width>750</width>
<height>80</height>
</rect>
</property>
<property name="macro">
<string>sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>2</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caLabel" name="calabel">
<property name="geometry">
<rect>
<x>10</x>
<y>160</y>
<width>261</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Dipole Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_2">
<property name="geometry">
<rect>
<x>10</x>
<y>50</y>
<width>291</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Diagnostic Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_3">
<property name="geometry">
<rect>
<x>10</x>
<y>530</y>
<width>261</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>ID Beamlines</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="caInclude" name="cainclude_3">
<property name="geometry">
<rect>
<x>10</x>
<y>560</y>
<width>750</width>
<height>541</height>
</rect>
</property>
<property name="macro">
<string>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</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_OrbitBump_Operator_inc.ui</string>
</property>
<property name="numberOfItems" stdset="0">
<number>11</number>
</property>
<property name="verticalSpacing" stdset="0">
<number>5</number>
</property>
</widget>
<widget class="caLabel" name="calabel_4">
<property name="geometry">
<rect>
<x>330</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_5">
<property name="geometry">
<rect>
<x>440</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>X' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_6">
<property name="geometry">
<rect>
<x>550</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y (um)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caLabel" name="calabel_7">
<property name="geometry">
<rect>
<x>660</x>
<y>50</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>18</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Y' (urad)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
<widget class="caRelatedDisplay" name="carelateddisplay">
<property name="geometry">
<rect>
<x>590</x>
<y>10</y>
<width>170</width>
<height>30</height>
</rect>
</property>
<property name="label">
<string notr="true">Expert Panel</string>
</property>
<property name="background">
<color>
<red>183</red>
<green>157</green>
<blue>92</blue>
</color>
</property>
<property name="labels">
<string>Expert Panel</string>
</property>
<property name="files">
<string>A_BD_OrbitBump_Expert.ui</string>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caRelatedDisplay</class>
<extends>QWidget</extends>
<header>caRelatedDisplay</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caInclude</class>
<extends>QWidget</extends>
<header>caInclude</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>750</width>
<height>30</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caLabel" name="calabel_2">
<property name="geometry">
<rect>
<x>160</x>
<y>0</y>
<width>150</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>$(beamline)</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit">
<property name="geometry">
<rect>
<x>320</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-X-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="framePresent" stdset="0">
<bool>false</bool>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_2">
<property name="geometry">
<rect>
<x>430</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-XP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_3">
<property name="geometry">
<rect>
<x>540</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-Y-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_4">
<property name="geometry">
<rect>
<x>650</x>
<y>0</y>
<width>100</width>
<height>30</height>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP:$(sourcepoint)-OFFSET-YP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
</property>
<property name="alarmHandling">
<enum>caLineEdit::onBackground</enum>
</property>
</widget>
<widget class="caRelatedDisplay" name="carelateddisplay">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>150</width>
<height>30</height>
</rect>
</property>
<property name="label">
<string notr="true">-$(sourcepoint) Expert</string>
</property>
<property name="background">
<color>
<red>183</red>
<green>157</green>
<blue>92</blue>
</color>
</property>
<property name="labels">
<string>$(sourcepoint) Expert</string>
</property>
<property name="files">
<string>A_BD_OrbitBump_Expert.ui</string>
</property>
<property name="args">
<string>sourcepoint=$(sourcepoint),beamline=$(beamline)</string>
</property>
</widget>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>caRelatedDisplay</class>
<extends>QWidget</extends>
<header>caRelatedDisplay</header>
</customwidget>
<customwidget>
<class>caLabel</class>
<extends>QLabel</extends>
<header>caLabel</header>
</customwidget>
<customwidget>
<class>caLineEdit</class>
<extends>QLineEdit</extends>
<header>caLineEdit</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -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
+47
View File
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -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 }
}
@@ -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
@@ -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")
}
@@ -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")
}
@@ -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")
}
+28
View File
@@ -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:** <br/>
- 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
```
@@ -0,0 +1,4 @@
epicsEnvSet("ENGINEER", "Operation")
require array
require SynApps
addScan 300
+103
View File
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caNumeric" name="canumeric">
<property name="geometry">
<rect>
<x>0</x>
<y>60</y>
<width>100</width>
<height>50</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>1</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string>AGEBD-PLOTS-DEV:AO</string>
</property>
<property name="maxValue">
<double>9.000000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>601</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>Toggle AGEBD-ALH-DEV:PLOTS-ONOFF</string>
</property>
<property name="channel" stdset="0">
<string>AGEBD-ALH-DEV:PLOTS-ONOFF</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>6</x>
<y>34</y>
<width>401</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="text">
<string>Value of AGEBD-PLOTS-DEV:AO</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>caNumeric</class>
<extends>QFrame</extends>
<header>caNumeric</header>
</customwidget>
<customwidget>
<class>caToggleButton</class>
<extends>QCheckBox</extends>
<header>caToggleButton</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
@@ -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
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -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 }
}
@@ -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
@@ -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")
}
@@ -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")
}
@@ -0,0 +1,2 @@
epicsEnvSet("ENGINEER", "armborst")
require array
File diff suppressed because it is too large Load Diff
@@ -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
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -0,0 +1,4 @@
file SCRUBBING.template {
pattern { DEVICE }
{ AGEBD-SCRUBBING{{ agebd_env }} }
}
@@ -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
@@ -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")
}
@@ -0,0 +1 @@
epicsEnvSet("ENGINEER", "armborst")
File diff suppressed because it is too large Load Diff
@@ -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
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -0,0 +1,4 @@
file SHIFTTOOL.template {
pattern { DEVICE }
{ AGEBD-SHIFTTOOL{{ agebd_env }} }
}
@@ -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
+1
View File
@@ -0,0 +1 @@
# TODO: does it have an ioc? (in A_OP?)
@@ -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")
}
@@ -0,0 +1 @@
epicsEnvSet("ENGINEER", "armborst")
+103
View File
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="caNumeric" name="canumeric">
<property name="geometry">
<rect>
<x>0</x>
<y>60</y>
<width>100</width>
<height>50</height>
</rect>
</property>
<property name="integerDigits" stdset="0">
<number>1</number>
</property>
<property name="decimalDigits" stdset="0">
<number>0</number>
</property>
<property name="channel" stdset="0">
<string>AGEBD-SHIFTTOOL-DEV:AO</string>
</property>
<property name="maxValue">
<double>9.000000000000000</double>
</property>
<property name="minValue">
<double>0.000000000000000</double>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>601</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>Toggle AGEBD-ALH-DEV:SHIFTTOOL-ONOFF</string>
</property>
<property name="channel" stdset="0">
<string>AGEBD-ALH-DEV:SHIFTTOOL-ONOFF</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>6</x>
<y>34</y>
<width>401</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
</font>
</property>
<property name="text">
<string>Value of AGEBD-SHIFTTOOL-DEV:AO</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<customwidgets>
<customwidget>
<class>caNumeric</class>
<extends>QFrame</extends>
<header>caNumeric</header>
</customwidget>
<customwidget>
<class>caToggleButton</class>
<extends>QCheckBox</extends>
<header>caToggleButton</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
+1
View File
@@ -0,0 +1 @@
# TODO: ui for this 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
@@ -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"]
@@ -0,0 +1 @@
from .service import PVs, Service
@@ -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)
@@ -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)
#######################################################################################
#######################################################################################
@@ -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()
+275
View File
@@ -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" },
]
@@ -0,0 +1,4 @@
file TAUPCT.template {
pattern { DEVICE }
{ AGEBD-TAUPCT{{ agebd_env }} }
}
@@ -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
@@ -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")
}
@@ -0,0 +1 @@
epicsEnvSet("ENGINEER", "armborst")

Some files were not shown because too many files have changed in this diff Show More