feature: add new service injectionguard

This commit is contained in:
Benjamin Labrecque
2026-07-16 09:43:21 +02:00
parent 1b3992075c
commit d48fe45b02
13 changed files with 1536 additions and 1 deletions
+1 -1
View File
@@ -8,4 +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-TUNEFBY | |
| AGEBD-CPCL-INJECTIONGUARD | |
@@ -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 }
}
file INJECTIONGUARD_automated.template {
pattern { NR Latch Description }
{ 01 1 "Beam Dump Kicker"}
{ 02 1 "Dump Valve"}
{ 03 1 "MIS"}
{ 04 1 "VCS"}
{ 05 1 "Linac KV/BB/BY"}
{ 06 1 "RF Linac"}
{ 07 1 "RF Booster"}
{ 08 1 "RF Ring"}
{ 09 1 "Magnets Pulsed"}
{ 10 1 "Magnets Booster"}
{ 11 1 "Magnets Corrector"}
{ 12 1 "Magnets Ring"}
{ 13 1 "Current Limit"}
{ 14 1 "IDs Ready"}
{ 15 1 "Single Bunch Charge"}
{ 16 1 "Injection Quality"}
{ 17 1 "Dump Quality"}
{ 18 1 "Lifetime"}
{ 19 1 "Tune"}
{ 20 0 "Pingers"}
{ 21 1 "Vacuum Pressure"}
{ 22 1 "Orbit Deviation"}
{ 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,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")
@@ -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,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