diff --git a/docs/ioc/ioc_overview.md b/docs/ioc/ioc_overview.md
index 5d5d558..843d604 100644
--- a/docs/ioc/ioc_overview.md
+++ b/docs/ioc/ioc_overview.md
@@ -8,3 +8,4 @@ The ports are configured in the [service registry](../../docs/ioc/ioc_overview.m
| AGEBD-CPCL-NTURNS | IOC providing PVs for the DBPM3 stage0 and stage1 nr. of turns calculation service |
| AGEBD-CPCL-DBPM3CURR | |
| AGEBD-CPCL-TAUBPM | |
+| AGEBD-CPCL-PLOTS | |
diff --git a/services/injectionguard/current/app/pyproject.toml b/services/injectionguard/current/app/pyproject.toml
new file mode 100644
index 0000000..0344692
--- /dev/null
+++ b/services/injectionguard/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-injectionguard"
+version = "0.1.0"
+description = "AGEBD-INJECTIONGUARD Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py b/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/injectionguard/current/app/src/agebd_injectionguard/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/main.py b/services/injectionguard/current/app/src/agebd_injectionguard/main.py
new file mode 100644
index 0000000..afd7c4a
--- /dev/null
+++ b/services/injectionguard/current/app/src/agebd_injectionguard/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_injectionguard import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "INJECTIONGUARD"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/injectionguard/current/app/src/agebd_injectionguard/service.py b/services/injectionguard/current/app/src/agebd_injectionguard/service.py
new file mode 100644
index 0000000..dddb14a
--- /dev/null
+++ b/services/injectionguard/current/app/src/agebd_injectionguard/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-INJECTIONGUARD:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-INJECTIONGUARD:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-INJECTIONGUARD:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/injectionguard/current/app/tests/test_app.py b/services/injectionguard/current/app/tests/test_app.py
new file mode 100644
index 0000000..c6a1df9
--- /dev/null
+++ b/services/injectionguard/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_injectionguard import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/injectionguard/current/app/uv.lock b/services/injectionguard/current/app/uv.lock
new file mode 100644
index 0000000..943f9eb
--- /dev/null
+++ b/services/injectionguard/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-injectionguard"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs
new file mode 100644
index 0000000..9fe790b
--- /dev/null
+++ b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_main.subs
@@ -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"}
+}
\ No newline at end of file
diff --git a/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/injectionguard/current/ioc/AGEBD-CPCL-INJECTIONGUARD_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/injectionguard/current/ioc/INJECTIONGUARD.template b/services/injectionguard/current/ioc/INJECTIONGUARD.template
new file mode 100644
index 0000000..857d84a
--- /dev/null
+++ b/services/injectionguard/current/ioc/INJECTIONGUARD.template
@@ -0,0 +1,37 @@
+# This is a template for preaparing an IOC providing BD Service specific PVs
+# Access Security Groups:
+# DEFAULT - logt wenn EGU oder so veraendert werden
+# LOG - logt wenn neuer wert geschrieben wird
+# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL
+# READONLY - verhindert versuchte caputs und aktiviert caputlog
+# Input links can specify CA, CP, or CPP.
+# If the input link specifies CA, it will be forced to be a Channel Access link.
+# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies.
+# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links.
+#
+
+record(ao, "$(DEVICE):AO") {
+ field(DESC, "Analog Output Record (ao)")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):BO") {
+ field(DESC, "Binary Output Record (bo)")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
+
+# TODO: ok?
+record(bo, "$(DEVICE):CALLBACK") {
+ field(DESC, "Callback PV to listen to for changes")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/injectionguard/current/ioc/startup.script b/services/injectionguard/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/injectionguard/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/injectionguard/current/qt/A_BD_InjectionGuard.ui b/services/injectionguard/current/qt/A_BD_InjectionGuard.ui
new file mode 100644
index 0000000..d452d7b
--- /dev/null
+++ b/services/injectionguard/current/qt/A_BD_InjectionGuard.ui
@@ -0,0 +1,988 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 600
+ 1195
+
+
+
+ MainWindow
+
+
+
+
+/*-----------------------------------------------*/
+/* Title */
+/*-----------------------------------------------*/
+/* Operation panels */
+caLabel[statusTip="Operation"]{
+ color: rgba(0, 0, 0, 255);
+ font: bold 18pt;
+ font-family: Sans Serif;
+ padding: 1px;
+ margin: 0px;
+ qproperty-alignment: AlignLeft;
+ qproperty-frameShape: StyledPanel;
+ /*qproperty-geometry: rect(-2 0 1600 33);*/
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(218, 218, 218, 255),
+ stop:0.5 rgba(200, 200, 200, 255),
+ stop:1 rgba(218, 218, 218, 255));
+}
+
+
+
+
+
+
+ 670
+ 140
+ 70
+ 20
+
+
+
+
+
+
+ 670
+ 80
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:INJECTIONGUARD-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+
+ 10
+ 36
+ 110
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Mode
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 78
+ 580
+ 60
+
+
+
+ AGEBD-INJECTIONGUARD:CHECK-SUM
+
+
+ caLineEdit::Alarm_Default
+
+
+ caLineEdit::onBackground
+
+
+ caLineEdit::User
+
+
+
+
+
+ 652
+ 394
+ 150
+ 22
+
+
+
+
+ 9
+
+
+
+ Ring Reset
+
+
+ ARS00-VCS:PLC_ARS_RESET_REQUEST
+
+
+ Ring Reset
+
+
+
+ 212
+ 219
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 652
+ 346
+ 150
+ 22
+
+
+
+
+ 9
+
+
+
+ LI LTB Reset
+
+
+ ARS00-VCS:PLC_ALIVA_RESET_REQUEST
+
+
+ LI LTB Reset
+
+
+
+ 212
+ 219
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 652
+ 370
+ 150
+ 22
+
+
+
+
+ 9
+
+
+
+ Boster Reset
+
+
+ ARS00-VCS:PLC_ABOVA_RESET_REQUEST
+
+
+ Boster Reset
+
+
+
+ 212
+ 219
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 722
+ 438
+ 150
+ 22
+
+
+
+
+
+
+ MIS Alarm Reset
+
+
+ ARS00-MIS-PLC-01:Alarm_Reset
+
+
+ MIS Alarm Reset
+
+
+ 1
+
+
+
+
+
+ 722
+ 474
+ 150
+ 22
+
+
+
+
+
+
+ MIS-FE Alarm Reset
+
+
+ ACOSA-MIS-FE:ACKERR-REQUEST
+
+
+ MIS-FE Alarm Reset
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 722
+ 544
+ 150
+ 22
+
+
+
+
+
+
+ VCS ALIVA Reset
+
+
+ ARS00-VCS:PLC_ALIVA_RESET_REQUEST
+
+
+ VCS ALIVA Reset
+
+
+ 1
+
+
+
+
+
+ 722
+ 506
+ 150
+ 22
+
+
+
+
+
+
+ VCS ABOVA Reset
+
+
+ ARS00-VCS:PLC_ABOVA_RESET_REQUEST
+
+
+ VCS ABOVA Reset
+
+
+ 1
+
+
+
+
+
+ 726
+ 578
+ 150
+ 22
+
+
+
+
+
+
+ VCS ARS Reset
+
+
+ ARS00-VCS:PLC_ARS_RESET_REQUEST
+
+
+ VCS ARS Reset
+
+
+ 1
+
+
+
+
+
+ 10
+ 140
+ 580
+ 1050
+
+
+
+ 0
+
+
+
+ Checks
+
+
+
+
+ 10
+ 10
+ 40
+ 40
+
+
+
+ true
+
+
+ false
+
+
+ 30
+
+
+ 30
+
+
+ AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER
+
+
+ caLed::Alarm
+
+
+
+
+
+ 60
+ 10
+ 300
+ 40
+
+
+
+
+ Sans Serif
+ 16
+ 75
+ true
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Master Trigger Freigabe
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 0
+ 110
+ 580
+ 901
+
+
+
+ checknr=01,bridge=1,latch=1;checknr=02,bridge=1,latch=1;checknr=03,bridge=1,latch=1;checknr=04,bridge=1,latch=1;checknr=05,bridge=1,latch=1;checknr=06,bridge=1,latch=1;checknr=07,bridge=1,latch=1;checknr=08,bridge=1,latch=1;checknr=09,bridge=1,latch=1;checknr=10,bridge=1,latch=1;checknr=11,bridge=1,latch=1;checknr=12,bridge=1,latch=1;checknr=13,bridge=1,latch=1;checknr=14,bridge=1,latch=1;checknr=15,bridge=1,latch=1;checknr=16,bridge=1,latch=1;checknr=17,bridge=1,latch=1;checknr=18,bridge=1,latch=1;checknr=19,bridge=1,latch=1;checknr=20,bridge=0,latch=0;checknr=21,bridge=1,latch=1;checknr=22,bridge=1,latch=1;checknr=23,bridge=1,latch=1
+
+
+ A_BD_InjectionGuard_inc.ui
+
+
+ 23
+
+
+
+
+
+ 270
+ 60
+ 20
+ 900
+
+
+
+ Qt::Vertical
+
+
+
+
+
+ 10
+ 96
+ 560
+ 20
+
+
+
+ Qt::Horizontal
+
+
+
+
+
+ 210
+ 60
+ 20
+ 900
+
+
+
+ Qt::Vertical
+
+
+
+
+
+ 230
+ 66
+ 40
+ 30
+
+
+
+
+ Monospace
+ 19
+ 75
+ true
+ PreferDefault
+
+
+
+ OP
+
+
+ OP
+
+
+ Qt::AlignCenter
+
+
+ AGEBD-INJECTIONGUARD:CHECK-SUM-OP
+
+
+ caLineEdit::Alarm_Default
+
+
+ caLineEdit::onBackground
+
+
+ caLineEdit::User
+
+
+
+
+
+ 340
+ 66
+ 111
+ 30
+
+
+
+
+ 18
+ 75
+ false
+ true
+
+
+
+ false
+
+
+ BRIDGE
+
+
+ Qt::AlignCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 290
+ 66
+ 40
+ 30
+
+
+
+
+ Monospace
+ 19
+ 75
+ true
+ PreferDefault
+
+
+
+ M\D
+
+
+ MD
+
+
+ Qt::AlignCenter
+
+
+ AGEBD-INJECTIONGUARD:CHECK-SUM-MD
+
+
+ caLineEdit::Alarm_Default
+
+
+ caLineEdit::onBackground
+
+
+ caLineEdit::User
+
+
+
+
+
+ 9
+ 66
+ 201
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Check
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 440
+ 60
+ 20
+ 900
+
+
+
+ Qt::Vertical
+
+
+
+
+
+ 470
+ 66
+ 80
+ 30
+
+
+
+
+ Monospace
+ 19
+ 75
+ true
+ PreferDefault
+
+
+
+ L\ATC\H
+
+
+ LATCH
+
+
+ Qt::AlignCenter
+
+
+ AGEBD-INJECTIONGUARD:CHECK-SUM-LATCH
+
+
+ caLineEdit::Alarm_Default
+
+
+ caLineEdit::onBackground
+
+
+ caLineEdit::User
+
+
+
+
+
+ 460
+ 10
+ 100
+ 40
+
+
+
+ Reset
+
+
+ false
+
+
+ AGEBD-INJECTIONGUARD:RESET-LATCHES
+
+
+ Reset
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+
+
+
+ Logs
+
+
+
+
+ 0
+ 38
+ 575
+ 983
+
+
+
+
+ Monospace
+ 10
+ PreferDefault
+
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ AGEBD-INJECTIONGUARD:LOG
+
+
+ caMultiLineString::None
+
+
+
+
+
+ 470
+ 2
+ 101
+ 30
+
+
+
+ Clear Logs
+
+
+ AGEBD-INJECTIONGUARD:LOG-CLEAR
+
+
+ Clear Logs
+
+
+
+ 160
+ 160
+ 160
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 10
+ 2
+ 101
+ 30
+
+
+
+ AGEBD-INJECTIONGUARD:LOG-PAUSE
+
+
+
+ 160
+ 160
+ 160
+
+
+
+ caChoice::Default
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+
+
+ -2
+ 2
+ 628
+ 30
+
+
+
+
+ Sans Serif
+ 18
+ 75
+ false
+ true
+
+
+
+ Operation
+
+
+ Injection Guard
+
+
+ Qt::AlignLeading
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ caLabel::Default
+
+
+
+
+
+ 556
+ 6
+ 40
+ 22
+
+
+
+ -Wiki
+
+
+
+ 183
+ 157
+ 92
+
+
+
+ Injection Guard
+
+
+ https://acceleratorwiki.psi.ch/wiki/Injection_Guard
+
+
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caInclude
+ QWidget
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caMultiLineString
+ QPlainTextEdit
+
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ caMimeDisplay
+ QWidget
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 598
+ 89
+
+
+ 608
+ 152
+
+
+
+
+
diff --git a/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service b/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service
new file mode 100644
index 0000000..8bc6ae5
--- /dev/null
+++ b/services/injectionguard/current/systemd/AGEBD-SERVICE-INJECTIONGUARD.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-INJECTIONGUARD
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh INJECTIONGUARD
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-INJECTIONGUARD.service
+# systemctl --user start AGEBD-SERVICE-INJECTIONGUARD
diff --git a/services/orbitbump/current/app/pyproject.toml b/services/orbitbump/current/app/pyproject.toml
new file mode 100644
index 0000000..7ef40d4
--- /dev/null
+++ b/services/orbitbump/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-orbitbump"
+version = "0.1.0"
+description = "AGEBD-ORBITBUMP Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py b/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/orbitbump/current/app/src/agebd_orbitbump/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/main.py b/services/orbitbump/current/app/src/agebd_orbitbump/main.py
new file mode 100644
index 0000000..d81391d
--- /dev/null
+++ b/services/orbitbump/current/app/src/agebd_orbitbump/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_orbitbump import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "ORBITBUMP"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/orbitbump/current/app/src/agebd_orbitbump/service.py b/services/orbitbump/current/app/src/agebd_orbitbump/service.py
new file mode 100644
index 0000000..8b71fcb
--- /dev/null
+++ b/services/orbitbump/current/app/src/agebd_orbitbump/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-ORBITBUMP:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-ORBITBUMP:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-ORBITBUMP:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/orbitbump/current/app/tests/test_app.py b/services/orbitbump/current/app/tests/test_app.py
new file mode 100644
index 0000000..a0e737f
--- /dev/null
+++ b/services/orbitbump/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_orbitbump import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/orbitbump/current/app/uv.lock b/services/orbitbump/current/app/uv.lock
new file mode 100644
index 0000000..7f329ec
--- /dev/null
+++ b/services/orbitbump/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-orbitbump"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs
new file mode 100644
index 0000000..e485117
--- /dev/null
+++ b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_main.subs
@@ -0,0 +1,62 @@
+file ORBITBUMP_machine.template {
+ pattern
+ {sourcepoint beamline LOX HIX X LOXP HIXP XP LOY HIY Y LOYP HIYP YP BPM1 C1xx C1xpx C1yy C1ypy BPM2 C2xx C2xpx C2yy C2ypy BPM3 C3xx C3xpx C3yy C3ypy BPM4 C4xx C4xpx C4yy C4ypy}
+ # Diagnostic dipole beamlines
+ {X01DD NEMO -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS01-DBPM-1080 -0.0009920 -0.0006308 -0.0001141 0.0001109 ARS01-DBPM-1460 0.9742755 -0.1432472 0.9455447 -0.0865934 ARS01-DBPM-1900 0.9277200 1.0454287 0.1445141 1.5920941 ARS01-DBPM-2410 -0.0809412 -0.0384293 0.0058229 0.1036650}
+ {X08DB DISCO -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS08-DBPM-1900 -0.2500389 -0.0365053 0.0001023 0.0000595 ARS08-DBPM-2410 1.2775662 -0.9246414 0.5814965 -0.4999301 ARS08-DBPM-2910 0.6885552 0.9211364 0.4873898 1.7550023 ARS08-DBPM-4220 -0.2391394 -0.0169593 0.0309046 0.1234665}
+ {X10DG X11HEAT -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS10-DBPM-4720 -0.0187 -0.0188 0 0 ARS10-DBPM-5250 1.6016 -1.2108 0.5496 -0.5376 ARS10-DBPM-5880 0.7075 1.0654 1.1093 1.9515 ARS11-DBPM-0850 0.0026 0.0044 0.0166 0.0304}
+ # User dipole beamlines
+ {X01DA DEBYE -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS01-DBPM-2410 -0.2169694 -0.0006291 0.0001170 0.0000325 ARS01-DBPM-2910 1.2765938 -0.9208697 0.5792863 -0.5011470 ARS01-DBPM-4220 0.6866207 0.9198858 0.4842977 1.7595080 ARS01-DBPM-4720 -0.1924402 0.0258918 0.0307458 0.1239361}
+ {X02DA S-TOMCAT -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS02-DBPM-2410 -0.2089937 0.0072435 0.0001169 0.0000325 ARS02-DBPM-2910 1.2772588 -0.9200089 0.5792866 -0.5011606 ARS02-DBPM-4220 0.6864959 0.9194778 0.4843170 1.7595616 ARS02-DBPM-4720 -0.1833930 0.0352770 0.0307471 0.1239392}
+ {X03DA PEARL -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS03-DBPM-2410 -0.2016647 0.0152728 0.0001171 0.0000326 ARS03-DBPM-2910 1.2831552 -0.9190247 0.5819894 -0.5004911 ARS03-DBPM-4220 0.6905553 0.9206615 0.4875028 1.7552635 ARS03-DBPM-4720 -0.1749243 0.0438144 0.0309089 0.1234182}
+ {X04DB VUV -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS04-DBPM-1900 -0.1917962 0.0214714 0.0001022 0.0000595 ARS04-DBPM-2410 1.2842031 -0.9179380 0.5814999 -0.5000284 ARS04-DBPM-2910 0.6887599 0.9211626 0.4874732 1.7553295 ARS04-DBPM-4220 -0.1710439 0.0514609 0.0309080 0.1234788}
+ {X05DA Optics -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS05-DBPM-2410 -0.2740176 -0.0571105 0.0001170 0.0000321 ARS05-DBPM-2910 1.2732647 -0.9287209 0.5819890 -0.5003730 ARS05-DBPM-4220 0.6913367 0.9213802 0.4873370 1.7548006 ARS05-DBPM-4720 -0.2592981 -0.0408063 0.0308988 0.1233928}
+ {X06DA PXIII -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS06-DBPM-2410 -0.2675305 -0.0508248 0.0001170 0.0000321 ARS06-DBPM-2910 1.2749858 -0.9266845 0.5818007 -0.5004548 ARS06-DBPM-4220 0.6916389 0.9218001 0.4871613 1.7552275 ARS06-DBPM-4720 -0.2517260 -0.0332473 0.0308895 0.1234316}
+ {X07DB nanoXAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS07-DBPM-1900 -0.2563387 -0.0425222 0.0001023 0.0000596 ARS07-DBPM-2410 1.2761628 -0.9263027 0.5814954 -0.4999177 ARS07-DBPM-2910 0.6888233 0.9216262 0.4873810 1.7549631 ARS07-DBPM-4220 -0.2469055 -0.0248794 0.0309043 0.1234651}
+ {X07DA PolLux -300 300 0 -150 150 0 -300 300 0 -250 250 0 ARS07-DBPM-2410 -0.2606076 -0.0450539 0.0001170 0.0000326 ARS07-DBPM-2910 1.2750718 -0.9205684 0.5819899 -0.4976199 ARS07-DBPM-4220 0.6915728 0.9246379 0.4873668 1.7572153 ARS07-DBPM-4720 -0.2433555 -0.0254434 0.0309006 0.1235450}
+ {X10DA SuperXAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS10-DBPM-2410 -0.2392400 -0.0226765 0.0001170 0.0000321 ARS10-DBPM-2910 1.2780895 -0.9235140 0.5818007 -0.5005005 ARS10-DBPM-4220 0.6911875 0.9212713 0.4872251 1.7554059 ARS10-DBPM-4720 -0.2190626 -0.0004438 0.0308933 0.1234413}
+ # ID beamlines
+ {X02SA I-TOMCAT -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS01-DBPM-5250 -0.0161762 0.0645315 -0.0000522 0.0002217 ARS01-DBPM-5880 1.3057217 -3.1586368 0.7340909 -1.7908669 ARS02-DBPM-1080 1.1637103 2.7703664 0.8405251 2.0415012 ARS02-DBPM-1460 0.0473369 0.1176477 0.0354851 0.0914118}
+ {X03MA ADRESS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS02-DBPM-5250 -0.0056074 0.0805576 -0.0000533 0.0001427 ARS02-DBPM-5880 1.2522257 -3.5240592 0.7649336 -2.1576328 ARS03-DBPM-0810 1.1134798 3.0406278 0.8874945 2.4488073 ARS03-DBPM-1080 0.0367597 0.0902093 0.0491615 0.1421129}
+ {X04SA ADDAMS -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS03-DBPM-5250 0.0006041 0.0811354 -0.0000524 0.0002222 ARS03-DBPM-5880 1.3048037 -3.1594991 0.7340820 -1.7909262 ARS04-DBPM-1080 1.1649402 2.7718322 0.8405182 2.0415768 ARS04-DBPM-1460 0.0441826 0.1145073 0.0354841 0.0914133}
+ {X05LA QUEST -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS04-DBPM-5880 0.0008866 0.0002252 -0.0001045 0.0002529 ARS05-DBPM-0410 0.8976150 -2.8499257 1.0112790 -2.8592349 ARS05-DBPM-1080 1.0880889 5.0183256 0.9137175 4.2390359 ARS05-DBPM-1460 0.0421489 0.1947713 0.0433357 0.2067705}
+ {X06SA PXI -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS05-DBPM-5250 -0.0776973 0.0030268 -0.0000523 0.0002212 ARS05-DBPM-5880 1.3044906 -3.1590695 0.7341239 -1.7906420 ARS06-DBPM-1080 1.1642809 2.7699897 0.8405515 2.0412179 ARS06-DBPM-1460 0.0604868 0.1306028 0.0354886 0.0914055}
+ {X07MA Phoenix/XTreme -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS06-DBPM-5250 -0.0684380 0.0189547 -0.0000531 0.0001447 ARS06-DBPM-5880 1.2508776 -3.5845660 0.7649630 -2.1939024 ARS07-DBPM-0810 1.1137188 2.9863773 0.8875136 2.4060190 ARS07-DBPM-1080 0.0093629 0.0606390 0.0491634 0.1397441}
+ {X08SA micro-XAS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS07-DBPM-5250 -0.0624701 0.0181621 -0.0000523 0.0002216 ARS07-DBPM-5880 1.3039931 -3.1597229 0.7341156 -1.7906968 ARS08-DBPM-1080 1.1652753 2.7714013 0.8405450 2.0412871 ARS08-DBPM-1460 0.0575855 0.1278140 0.0354876 0.0914065}
+ {X09LA PEARL/XIL-II -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS08-DBPM-5880 0.0011254 0.0009724 -0.0000942 0.0002317 ARS09-DBPM-0570 0.8843735 -2.4344684 1.1263977 -3.0082085 ARS09-DBPM-1080 1.0591734 3.0395499 0.9413643 2.7184391 ARS09-DBPM-1460 0.0394021 0.1139547 0.0465775 0.1402264}
+ {X10SA PXII -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS09-DBPM-5250 -0.0473875 0.0333454 -0.0000523 0.0002213 ARS09-DBPM-5880 1.3047178 -3.1592507 0.7341077 -1.7907518 ARS10-DBPM-1080 1.1639981 2.7701547 0.8405387 2.0413565 ARS10-DBPM-1460 0.0540084 0.1242161 0.0354869 0.0914087}
+ {X11MA SIM -500 500 0 -150 150 0 -500 500 0 -150 150 0 ARS10-DBPM-5250 -0.0383667 0.0514782 -0.0000499 0.0001646 ARS10-DBPM-5880 1.2526899 -3.7342542 0.7640638 -2.2804441 ARS11-DBPM-0850 1.1168967 3.1441871 0.8845808 2.5170397 ARS11-DBPM-1080 0.0219427 0.0928506 0.0546028 0.1626088}
+ {X12SA cSAXS -300 300 0 -150 150 0 -300 300 0 -150 150 0 ARS11-DBPM-5250 -0.0326376 0.0479239 -0.0000524 0.0002219 ARS11-DBPM-5880 1.3047910 -3.1591765 0.7340995 -1.7908066 ARS12-DBPM-1080 1.1653151 2.7718178 0.8405322 2.0414257 ARS12-DBPM-1460 0.0513287 0.1216036 0.0354860 0.0914097}
+}
+
+
+file ORBITBUMP_beamline.template {
+ pattern
+ {sourcepoint beamline DRVL DRVH X XP Y YP }
+ # Diagnostic dipole beamlines
+ {X01DD NEMO -10 10 0 0 0 0 }
+ {X08DB DISCO -10 10 0 0 0 0 }
+ {X10DG X11HEAT -10 10 0 0 0 0 }
+ # User dipole beamlines
+ {X01DA DEBYE -10 10 0 0 0 0 }
+ {X02DA S-TOMCAT -10 10 0 0 0 0 }
+ {X03DA PEARL -10 10 0 0 0 0 }
+ {X04DB VUV -10 10 0 0 0 0 }
+ {X05DA Optics -10 10 0 0 0 0 }
+ {X06DA PXIII -10 10 0 0 0 0 }
+ {X07DB nanoXAS -10 10 0 0 0 0 }
+ {X07DA PolLux -10 10 0 0 0 0 }
+ {X10DA SuperXAS -10 10 0 0 0 0 }
+ # ID beamlines
+ {X02SA I-TOMCAT -10 10 0 0 0 0 }
+ {X03MA ADRESS -10 10 0 0 0 0 }
+ {X04SA ADDAMS -10 10 0 0 0 0 }
+ {X05LA QUEST -10 10 0 0 0 0 }
+ {X06SA PXI -10 10 0 0 0 0 }
+ {X07MA Phoenix/XTreme -10 10 0 0 0 0 }
+ {X08SA micro-XAS -10 10 0 0 0 0 }
+ {X09LA PEARL/XIL-II -10 10 0 0 0 0 }
+ {X10SA PXII -10 10 0 0 0 0 }
+ {X11MA SIM -10 10 0 0 0 0 }
+ {X12SA cSAXS -10 10 0 0 0 0 }
+}
\ No newline at end of file
diff --git a/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/orbitbump/current/ioc/AGEBD-CPCL-ORBITBUMP_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/orbitbump/current/ioc/ORBITBUMP.template b/services/orbitbump/current/ioc/ORBITBUMP.template
new file mode 100644
index 0000000..857d84a
--- /dev/null
+++ b/services/orbitbump/current/ioc/ORBITBUMP.template
@@ -0,0 +1,37 @@
+# This is a template for preaparing an IOC providing BD Service specific PVs
+# Access Security Groups:
+# DEFAULT - logt wenn EGU oder so veraendert werden
+# LOG - logt wenn neuer wert geschrieben wird
+# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL
+# READONLY - verhindert versuchte caputs und aktiviert caputlog
+# Input links can specify CA, CP, or CPP.
+# If the input link specifies CA, it will be forced to be a Channel Access link.
+# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies.
+# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links.
+#
+
+record(ao, "$(DEVICE):AO") {
+ field(DESC, "Analog Output Record (ao)")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):BO") {
+ field(DESC, "Binary Output Record (bo)")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
+
+# TODO: ok?
+record(bo, "$(DEVICE):CALLBACK") {
+ field(DESC, "Callback PV to listen to for changes")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/orbitbump/current/ioc/startup.script b/services/orbitbump/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/orbitbump/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/orbitbump/current/qt/A_BD_OrbitBump.ui b/services/orbitbump/current/qt/A_BD_OrbitBump.ui
new file mode 100644
index 0000000..fcc9232
--- /dev/null
+++ b/services/orbitbump/current/qt/A_BD_OrbitBump.ui
@@ -0,0 +1,409 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 770
+ 990
+
+
+
+ MainWindow
+
+
+
+
+
+ 10
+ 220
+ 750
+ 346
+
+
+
+ sourcepoint=X01DA,beamline=Debye;sourcepoint=X02DA,beamline=S-TOMCAT;sourcepoint=X03DA,beamline=PEARL;sourcepoint=X04DB,beamline=VUV;sourcepoint=X05DA,beamline=Optics;sourcepoint=X06DA,beamline=PXIII;sourcepoint=X07DB,beamline=nanoXAS;sourcepoint=X07DA,beamline=PolLux;sourcepoint=X10DA,beamline=SuperXAS
+
+
+ A_BD_OrbitBump_Operator_inc.ui
+
+
+ 9
+
+
+ 5
+
+
+
+
+
+ 10
+ 80
+ 750
+ 100
+
+
+
+ sourcepoint=X01DD,beamline=NEMO;sourcepoint=X08DB,beamline=DISCO;sourcepoint=X10DG,beamline=X11HEAT
+
+
+ A_BD_OrbitBump_Operator_inc.ui
+
+
+ 3
+
+
+ 5
+
+
+
+
+
+ 10
+ 190
+ 261
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Dipole Beamlines
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 50
+ 291
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Diagnostic Beamlines
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 570
+ 261
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ ID Beamlines
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 600
+ 750
+ 541
+
+
+
+ sourcepoint=X02SA,beamline=I-TOMCAT;sourcepoint=X03MA,beamline=ADRESS;sourcepoint=X04SA,beamline=ADDAMS;sourcepoint=X05LA,beamline=QUEST;sourcepoint=X06SA,beamline=PXI;sourcepoint=X07MA,beamline=Phoenix/XTreme;sourcepoint=X08SA,beamline=micro-XAS;sourcepoint=X09LA,beamline=PEARL/XIL-II;sourcepoint=X10SA,beamline=PXII;sourcepoint=X11MA,beamline=SIM;sourcepoint=X12SA,beamline=cSAXS
+
+
+ A_BD_OrbitBump_Operator_inc.ui
+
+
+ 11
+
+
+ 5
+
+
+
+
+
+ 330
+ 50
+ 100
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ X (um)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 440
+ 50
+ 100
+ 30
+
+
+
+
+ 15
+ 75
+ true
+
+
+
+ X' (urad)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 550
+ 50
+ 100
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Y (um)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 660
+ 50
+ 100
+ 30
+
+
+
+
+ 15
+ 75
+ true
+
+
+
+ Y' (urad)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 598
+ 4
+ 170
+ 30
+
+
+
+ Expert Panel All
+
+
+
+ 183
+ 157
+ 92
+
+
+
+ Expert Panel All
+
+
+ A_BD_OrbitBump_Expert_all.ui
+
+
+
+
+
+ 2
+ 2
+ 767
+ 33
+
+
+
+
+ Sans Serif
+ 20
+ 75
+ false
+ true
+
+
+
+ Beamline local Bumps
+
+
+ Qt::AlignLeading
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 100
+ 100
+ 100
+
+
+
+ caLabel::Static
+
+
+
+
+
+ 800
+ 260
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:ORBITBUMP-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 800
+ 320
+ 70
+ 20
+
+
+
+ cainclude
+ cainclude_2
+ calabel
+ calabel_2
+ calabel_3
+ cainclude_3
+ calabel_4
+ calabel_5
+ calabel_6
+ calabel_7
+ calabel_8
+ carelateddisplay
+ cacalc_2
+ wmsignalpropagator
+
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caInclude
+ QWidget
+
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 844
+ 271
+
+
+ 847
+ 327
+
+
+
+
+
diff --git a/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service b/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service
new file mode 100644
index 0000000..4358d12
--- /dev/null
+++ b/services/orbitbump/current/systemd/AGEBD-SERVICE-ORBITBUMP.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-ORBITBUMP
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh ORBITBUMP
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-ORBITBUMP.service
+# systemctl --user start AGEBD-SERVICE-ORBITBUMP
diff --git a/services/plots/current/app/pyproject.toml b/services/plots/current/app/pyproject.toml
new file mode 100644
index 0000000..facd875
--- /dev/null
+++ b/services/plots/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-plots"
+version = "0.1.0"
+description = "AGEBD-PLOTS Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/plots/current/app/src/agebd_plots/__init__.py b/services/plots/current/app/src/agebd_plots/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/plots/current/app/src/agebd_plots/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/plots/current/app/src/agebd_plots/main.py b/services/plots/current/app/src/agebd_plots/main.py
new file mode 100644
index 0000000..a89cd64
--- /dev/null
+++ b/services/plots/current/app/src/agebd_plots/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_plots import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "PLOTS"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/plots/current/app/src/agebd_plots/service.py b/services/plots/current/app/src/agebd_plots/service.py
new file mode 100644
index 0000000..cbd8253
--- /dev/null
+++ b/services/plots/current/app/src/agebd_plots/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-PLOTS:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-PLOTS:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-PLOTS:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/plots/current/app/tests/test_app.py b/services/plots/current/app/tests/test_app.py
new file mode 100644
index 0000000..842d66f
--- /dev/null
+++ b/services/plots/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_plots import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/plots/current/app/uv.lock b/services/plots/current/app/uv.lock
new file mode 100644
index 0000000..f8e7691
--- /dev/null
+++ b/services/plots/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-plots"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs
new file mode 100644
index 0000000..911e4f2
--- /dev/null
+++ b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_main.subs
@@ -0,0 +1,65 @@
+file AGEBD-CPCL-PLOTS_timeaxis.template {
+ pattern
+ { DEVICE }
+ { AGEBD-PLOTS }
+}
+
+
+file AGEBD-CPCL-PLOTS_9h.template {
+ pattern
+ { NAME, INP }
+ { CURRENT, AGEBD-PARAMS:CURRENT }
+ { CURRENT-BPM, AGEBD-DBPM3CURR:CURRENT-AVG }
+ { CURRENT-PCT, ARS07-DPCT-0000:CURR }
+ { INJECTION-RATE, AGEBD-PARAMS:INJECTION-RATE }
+ { TRANSMISSION, AGEBD-PARAMS:TRANSMISSION }
+ { LIFETIME, AGEBD-PARAMS:LIFETIME }
+ { MAVAC-AVG, ARIVA-VMAVE:PRESS-AVE }
+ { MAVAC-MAX, ARIVA-VMAVE:PRESS-MAX }
+ { FEVAC-AVG, ARIVA-VMAVE-FE:PRESS-AVE }
+ { FEVAC-MAX, ARIVA-VMAVE-FE:PRESS-MAX }
+ { ABRTL-DDRM-0670, ABRTL-DDRM-0670:FET1_BIAS_DOSE}
+ { ABRTL-DDRM-0950, ABRTL-DDRM-0950:FET1_DOSE}
+ { X05LA-DDRM-0330, X05LA-DDRM-0330:FET1_BIAS_DOSE}
+ { X05LA-DDRM-0650, X05LA-DDRM-0650:FET1_BIAS_DOSE}
+ { X09LA-DDRM-0330, X09LA-DDRM-0330:FET1_BIAS_DOSE}
+ { X09LA-DDRM-0790, X09LA-DDRM-0790:FET1_BIAS_DOSE}
+ { ARS01-DDRM-0375, ARS01-DDRM-0375:FET1_DOSE}
+ { ARS01-DDRM-1530, ARS01-DDRM-1530:FET1_BIAS_DOSE}
+ { ARS05-DDRM-1530, ARS05-DDRM-1530:FET1_BIAS_DOSE}
+ { ARS05-DDRM-3500, ARS05-DDRM-3500:FET1_BIAS_DOSE}
+ { ARS09-DDRM-1530, ARS09-DDRM-1530:FET1_BIAS_DOSE}
+ { ARS09-DDRM-3500, ARS09-DDRM-3500:FET2_BIAS_DOSE}
+ { ARS12-DDRM-1530, ARS12-DDRM-1530:FET1_BIAS_DOSE}
+ { ARS12-DDRM-3500, ARS12-DDRM-3500:FET1_BIAS_DOSE}
+ { ARS12-DDRM-4400, ARS12-DDRM-4400:FET1_BIAS_DOSE}
+ { ARS12-DDRM-5480, ARS12-DDRM-5480:FET1_BIAS_DOSE}
+ { X02SA-UIND-GAP, AGEOP-STATUS:X02SA-UIND-GAP} # Soft Blue #A0C4FF
+ # { X03MA-UIND-GAP, AGEOP-STATUS:X03MA-UIND-GAP} # Warm Orange #FFD6A5
+ { X04SA-UIND-GAP, AGEOP-STATUS:X04SA-UIND-GAP} # Light Green #CAFFBF
+ # { X05LA-UIND-GAP, AGEOP-STATUS:X05LA-UIND-GAP} # Coral Red #FFADAD
+ { X06SA-UIND-GAP, AGEOP-STATUS:X06SA-UIND-GAP} # Lavender #CDB4DB
+ # { X07MA-UIND-GAP, AGEOP-STATUS:X07MA-UIND-GAP} # Desert Tan #DDB892
+ # { X08SA-UIND-GAP, AGEOP-STATUS:X08SA-UIND-GAP} # Peach Pink #FFB5A7
+ { X09LB-UIND-GAP, AGEOP-STATUS:X09LB-UIND-GAP} # Aqua Blue #9BF6FF
+ { X10SA-UIND-GAP, AGEOP-STATUS:X10SA-UIND-GAP} # Pale Yellow #FDFFB6
+ { X11MA-UIND2-GAP, AGEOP-STATUS:X11MA-UIND2-GAP} # Periwinkle #BDB2FF
+ { X12SA-UIND-GAP, AGEOP-STATUS:X12SA-UIND-GAP} # Mint Green #B0F2C2
+}
+
+file AGEBD-CPCL-PLOTS_week.template {
+ pattern
+ { NAME, INP }
+ { CURRENT-BPM, AGEBD-DBPM3CURR:CURRENT-AVG }
+ { CURRENT-PCT, ARS07-DPCT-0000:CURR }
+ { TAU-BPM, AGEBD-TAUBPM:TAU }
+ { TAU-PCT, AGEBD-TAUPCT:TAU }
+ { TAU-TOPUP, AGEBD-SCRUBBING:TOPUP-TAU }
+ { INJRATE-BPM, AGEBD-TAUBPM:INJRATE }
+ { INJRATE-PCT, AGEBD-TAUPCT:INJRATE }
+ { MAVAC-AVG, ARIVA-VMAVE:PRESS-AVE }
+ { MAVAC-MAX, ARIVA-VMAVE:PRESS-MAX }
+ { FEVAC-AVG, ARIVA-VMAVE-FE:PRESS-AVE }
+ { FEVAC-MAX, ARIVA-VMAVE-FE:PRESS-MAX }
+}
+
diff --git a/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/plots/current/ioc/AGEBD-CPCL-PLOTS_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/plots/current/ioc/PLOTS.template b/services/plots/current/ioc/PLOTS.template
new file mode 100644
index 0000000..857d84a
--- /dev/null
+++ b/services/plots/current/ioc/PLOTS.template
@@ -0,0 +1,37 @@
+# This is a template for preaparing an IOC providing BD Service specific PVs
+# Access Security Groups:
+# DEFAULT - logt wenn EGU oder so veraendert werden
+# LOG - logt wenn neuer wert geschrieben wird
+# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL
+# READONLY - verhindert versuchte caputs und aktiviert caputlog
+# Input links can specify CA, CP, or CPP.
+# If the input link specifies CA, it will be forced to be a Channel Access link.
+# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies.
+# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links.
+#
+
+record(ao, "$(DEVICE):AO") {
+ field(DESC, "Analog Output Record (ao)")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):BO") {
+ field(DESC, "Binary Output Record (bo)")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
+
+# TODO: ok?
+record(bo, "$(DEVICE):CALLBACK") {
+ field(DESC, "Callback PV to listen to for changes")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/plots/current/ioc/startup.script b/services/plots/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/plots/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/plots/current/qt/A_BD_.ui b/services/plots/current/qt/A_BD_.ui
new file mode 100644
index 0000000..0fa9278
--- /dev/null
+++ b/services/plots/current/qt/A_BD_.ui
@@ -0,0 +1,103 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 800
+ 600
+
+
+
+ MainWindow
+
+
+
+
+
+ 0
+ 60
+ 100
+ 50
+
+
+
+ 1
+
+
+ 0
+
+
+ AGEBD-PLOTS-DEV:AO
+
+
+ 9.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 0
+ 601
+ 22
+
+
+
+ Toggle AGEBD-ALH-DEV:PLOTS-ONOFF
+
+
+ AGEBD-ALH-DEV:PLOTS-ONOFF
+
+
+
+
+
+ 6
+ 34
+ 401
+ 21
+
+
+
+
+ 13
+
+
+
+ Value of AGEBD-PLOTS-DEV:AO
+
+
+
+
+
+
+
+
+ caNumeric
+ QFrame
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+
+
+
diff --git a/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service b/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service
new file mode 100644
index 0000000..a1b82cd
--- /dev/null
+++ b/services/plots/current/systemd/AGEBD-SERVICE-PLOTS.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-PLOTS
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh PLOTS
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-PLOTS.service
+# systemctl --user start AGEBD-SERVICE-PLOTS
diff --git a/services/postmortemlog/current/app/pyproject.toml b/services/postmortemlog/current/app/pyproject.toml
new file mode 100644
index 0000000..dc6c4c3
--- /dev/null
+++ b/services/postmortemlog/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-postmortemlog"
+version = "0.1.0"
+description = "AGEBD-POSTMORTEMLOG Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py
new file mode 100644
index 0000000..0c762eb
--- /dev/null
+++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_postmortemlog import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "POSTMORTEMLOG"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py b/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py
new file mode 100644
index 0000000..f0d50db
--- /dev/null
+++ b/services/postmortemlog/current/app/src/agebd_postmortemlog/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-POSTMORTEMLOG:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-POSTMORTEMLOG:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-POSTMORTEMLOG:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/postmortemlog/current/app/tests/test_app.py b/services/postmortemlog/current/app/tests/test_app.py
new file mode 100644
index 0000000..3da58c5
--- /dev/null
+++ b/services/postmortemlog/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_postmortemlog import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/postmortemlog/current/app/uv.lock b/services/postmortemlog/current/app/uv.lock
new file mode 100644
index 0000000..4d2e5ff
--- /dev/null
+++ b/services/postmortemlog/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-postmortemlog"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs
new file mode 100644
index 0000000..ff33687
--- /dev/null
+++ b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_main.subs
@@ -0,0 +1,129 @@
+file POSTMORTEMLOG.template {
+ pattern
+ { DEVICE }
+ { AGEBD-POSTMORTEMLOG }
+}
+
+file POSTMORTEMLOG_15min10Hz.template {
+ pattern
+ { NAME INP}
+ # ---------- BEAM CURRENT --------------
+ { CURRBPM AGEBD-DBPM3CURR:CURRENT-AVG }
+ { CURRPCT ARS07-DPCT-0000:CURR }
+ # ---------- BEAM LIFETIME --------------
+ { TAUBPM AGEBD-TAUBPM:TAU }
+ { TAUPCT AGEBD-TAUPCT:TAU }
+ # ---------- TUNES --------------
+ { QX AGEBD-TUNEBUMP:QX }
+ { QY AGEBD-TUNEBUMP:QY }
+ { QZ AGEBD-TUNEBUMP:QZ }
+ # ---------- LOSSES --------------
+ { ARS01-DDRM-0375 ARS01-DDRM-0375:FET1_DOSE }
+ { ABRTL-DDRM-0670 ABRTL-DDRM-0670:FET1_BIAS_DOSE }
+ { ABRTL-DDRM-0950 ABRTL-DDRM-0950:FET1_DOSE }
+ { ARS01-DDRM-1530 ARS01-DDRM-1530:FET1_BIAS_DOSE }
+ { X05LA-DDRM-0330 X05LA-DDRM-0330:FET1_BIAS_DOSE }
+ { ARS05-DDRM-1530 ARS05-DDRM-1530:FET1_BIAS_DOSE }
+ { ARS05-DDRM-3500 ARS05-DDRM-3500:FET1_BIAS_DOSE }
+ { X09LA-DDRM-0330 X09LA-DDRM-0330:FET1_BIAS_DOSE }
+ { ARS09-DDRM-1530 ARS09-DDRM-1530:FET1_BIAS_DOSE }
+ { ARS09-DDRM-3500 ARS09-DDRM-3500:FET2_BIAS_DOSE }
+ { ARS12-DDRM-1530 ARS12-DDRM-1530:FET1_BIAS_DOSE }
+ { ARS12-DDRM-3500 ARS12-DDRM-3500:FET2_BIAS_DOSE }
+ { ARS12-DDRM-4400 ARS12-DDRM-4400:FET2_BIAS_DOSE }
+ { ARS12-DDRM-5480 ARS12-DDRM-5480:FET1_BIAS_DOSE }
+ # ---------- RF --------------
+ { MASTERFREQ-SET AGERF-MO01:FREQ-SET }
+ { MASTERFREQ-GET AGERF-MO01:FREQ-GET }
+ { RFPOW-0140-INP ARS05-RCAV-0140:CO1i-POWER-MAX }
+ { RFPOW-0060-INP ARS05-RCAV-0060:CO1i-POWER-MAX }
+ { RFPOW-0230-INP ARS05-RCAV-0230:CO1i-POWER-MAX }
+ { RFPOW-0310-INP ARS05-RCAV-0310:CO1i-POWER-MAX }
+ { RFPOW-0060-REF ARS05-RCAV-0060:CO1r-POWER-MAX }
+ { RFPOW-0140-REF ARS05-RCAV-0140:CO1r-POWER-MAX }
+ { RFPOW-0230-REF ARS05-RCAV-0230:CO1r-POWER-MAX }
+ { RFPOW-0310-REF ARS05-RCAV-0310:CO1r-POWER-MAX }
+ # ---------- BEAM SIZE --------------
+ { X01DD-SIGX X01DD-FE-CAM1:SIG-X }
+ { X01DD-SIGY X01DD-FE-CAM1:SIG-Y }
+ { X08DB-SIGX X08DB-FE-CAM1:SIG-X }
+ { X08DB-SIGY X08DB-FE-CAM1:SIG-Y }
+ # ---------- VACUUM --------------
+ { VACMAX ARIVA-VMAVE:PRESS-MAX }
+ { VACMAXFE ARIVA-VMAVE-FE:PRESS-MAX }
+ { ARS01-VMCC-0110 ARS01-VMCC-0110:PRESSURE }
+ { ARS01-VMCC-0210 ARS01-VMCC-0210:PRESSURE }
+ { ARS01-VMCC-0225 ARS01-VMCC-0225:PRESSURE }
+ { ARS01-VMCC-0310 ARS01-VMCC-0310:PRESSURE }
+ { ARS01-VMCC-1550 ARS01-VMCC-1550:PRESSURE }
+ { ARS01-VMCC-3510 ARS01-VMCC-3510:PRESSURE }
+ { ARS01-VMCC-5460 ARS01-VMCC-5460:PRESSURE }
+ { ARS02-VMCC-0110 ARS02-VMCC-0110:PRESSURE }
+ { ARS02-VMCC-0210 ARS02-VMCC-0210:PRESSURE }
+ { ARS02-VMCC-0310 ARS02-VMCC-0310:PRESSURE }
+ { ARS02-VMCC-1550 ARS02-VMCC-1550:PRESSURE }
+ { ARS02-VMCC-3510 ARS02-VMCC-3510:PRESSURE }
+ { ARS02-VMCC-5460 ARS02-VMCC-5460:PRESSURE }
+ { ARS03-VMCC-0110 ARS03-VMCC-0110:PRESSURE }
+ { ARS03-VMCC-0320 ARS03-VMCC-0320:PRESSURE }
+ { ARS03-VMCC-1550 ARS03-VMCC-1550:PRESSURE }
+ { ARS03-VMCC-3510 ARS03-VMCC-3510:PRESSURE }
+ { ARS03-VMCC-5460 ARS03-VMCC-5460:PRESSURE }
+ { ARS04-VMCC-0110 ARS04-VMCC-0110:PRESSURE }
+ { ARS04-VMCC-1550 ARS04-VMCC-1550:PRESSURE }
+ { ARS04-VMCC-3510 ARS04-VMCC-3510:PRESSURE }
+ { ARS04-VMCC-5460 ARS04-VMCC-5460:PRESSURE }
+ { ARS05-VMCC-0110 ARS05-VMCC-0110:PRESSURE }
+ { ARS05-VMCC-0115 ARS05-VMCC-0115:PRESSURE }
+ { ARS05-VMCC-0210 ARS05-VMCC-0210:PRESSURE }
+ { ARS05-VMCC-0215 ARS05-VMCC-0215:PRESSURE }
+ { ARS05-VMCC-0310 ARS05-VMCC-0310:PRESSURE }
+ { ARS05-VMCC-0315 ARS05-VMCC-0315:PRESSURE }
+ { ARS05-VMCC-0410 ARS05-VMCC-0410:PRESSURE }
+ { ARS05-VMCC-0415 ARS05-VMCC-0415:PRESSURE }
+ { ARS05-VMCC-0510 ARS05-VMCC-0510:PRESSURE }
+ { ARS05-VMCC-0520 ARS05-VMCC-0520:PRESSURE }
+ { ARS05-VMCC-0530 ARS05-VMCC-0530:PRESSURE }
+ { ARS05-VMCC-0810 ARS05-VMCC-0810:PRESSURE }
+ { ARS05-VMCC-1550 ARS05-VMCC-1550:PRESSURE }
+ { ARS05-VMCC-3510 ARS05-VMCC-3510:PRESSURE }
+ { ARS05-VMCC-5460 ARS05-VMCC-5460:PRESSURE }
+ { ARS06-VMCC-0110 ARS06-VMCC-0110:PRESSURE }
+ { ARS06-VMCC-1550 ARS06-VMCC-1550:PRESSURE }
+ { ARS06-VMCC-3510 ARS06-VMCC-3510:PRESSURE }
+ { ARS06-VMCC-5460 ARS06-VMCC-5460:PRESSURE }
+ { ARS07-VMCC-0010 ARS07-VMCC-0010:PRESSURE }
+ { ARS07-VMCC-0120 ARS07-VMCC-0120:PRESSURE }
+ { ARS07-VMCC-0210 ARS07-VMCC-0210:PRESSURE }
+ { ARS07-VMCC-1550 ARS07-VMCC-1550:PRESSURE }
+ { ARS07-VMCC-3510 ARS07-VMCC-3510:PRESSURE }
+ { ARS07-VMCC-5460 ARS07-VMCC-5460:PRESSURE }
+ { ARS08-VMCC-0110 ARS08-VMCC-0110:PRESSURE }
+ { ARS08-VMCC-1550 ARS08-VMCC-1550:PRESSURE }
+ { ARS08-VMCC-3510 ARS08-VMCC-3510:PRESSURE }
+ { ARS08-VMCC-5460 ARS08-VMCC-5460:PRESSURE }
+ { ARS09-VMCC-0110 ARS09-VMCC-0110:PRESSURE }
+ { ARS09-VMCC-0120 ARS09-VMCC-0120:PRESSURE }
+ { ARS09-VMCC-0410 ARS09-VMCC-0410:PRESSURE }
+ { ARS09-VMCC-0510 ARS09-VMCC-0510:PRESSURE }
+ { ARS09-VMCC-0810 ARS09-VMCC-0810:PRESSURE }
+ { ARS09-VMCC-1550 ARS09-VMCC-1550:PRESSURE }
+ { ARS09-VMCC-3510 ARS09-VMCC-3510:PRESSURE }
+ { ARS09-VMCC-5460 ARS09-VMCC-5460:PRESSURE }
+ { ARS10-VMCC-0110 ARS10-VMCC-0110:PRESSURE }
+ { ARS10-VMCC-1550 ARS10-VMCC-1550:PRESSURE }
+ { ARS10-VMCC-3510 ARS10-VMCC-3510:PRESSURE }
+ { ARS10-VMCC-5460 ARS10-VMCC-5460:PRESSURE }
+ { ARS11-VMCC-0110 ARS11-VMCC-0110:PRESSURE }
+ { ARS11-VMCC-0210 ARS11-VMCC-0210:PRESSURE }
+ { ARS11-VMCC-0310 ARS11-VMCC-0310:PRESSURE }
+ { ARS11-VMCC-0410 ARS11-VMCC-0410:PRESSURE }
+ { ARS11-VMCC-0510 ARS11-VMCC-0510:PRESSURE }
+ { ARS11-VMCC-1550 ARS11-VMCC-1550:PRESSURE }
+ { ARS11-VMCC-3510 ARS11-VMCC-3510:PRESSURE }
+ { ARS11-VMCC-5460 ARS11-VMCC-5460:PRESSURE }
+ { ARS12-VMCC-0110 ARS12-VMCC-0110:PRESSURE }
+ { ARS12-VMCC-1550 ARS12-VMCC-1550:PRESSURE }
+ { ARS12-VMCC-3510 ARS12-VMCC-3510:PRESSURE }
+ { ARS12-VMCC-5460 ARS12-VMCC-5460:PRESSURE }
+}
\ No newline at end of file
diff --git a/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/postmortemlog/current/ioc/AGEBD-CPCL-POSTMORTEMLOG_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/postmortemlog/current/ioc/POSTMORTEMLOG.template b/services/postmortemlog/current/ioc/POSTMORTEMLOG.template
new file mode 100644
index 0000000..857d84a
--- /dev/null
+++ b/services/postmortemlog/current/ioc/POSTMORTEMLOG.template
@@ -0,0 +1,37 @@
+# This is a template for preaparing an IOC providing BD Service specific PVs
+# Access Security Groups:
+# DEFAULT - logt wenn EGU oder so veraendert werden
+# LOG - logt wenn neuer wert geschrieben wird
+# PROTECTED - verhindert versuchte caputs auf alle fields ausser VAL
+# READONLY - verhindert versuchte caputs und aktiviert caputlog
+# Input links can specify CA, CP, or CPP.
+# If the input link specifies CA, it will be forced to be a Channel Access link.
+# If the input link specifies CP, it will also be forced to be a Channel Access link; in addition, it will cause the record containing the input link to process whenever a monitor is posted, no matter what the record's SCAN field specifies.
+# If the input link specifies CPP, it means the same thing as CP, except that the record will be processed if and only if the record itself specifies passive in its SCAN field. Output links can specify CA, which will simply cause them to be Channel Access links.
+#
+
+record(ao, "$(DEVICE):AO") {
+ field(DESC, "Analog Output Record (ao)")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):BO") {
+ field(DESC, "Binary Output Record (bo)")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
+
+# TODO: ok?
+record(bo, "$(DEVICE):CALLBACK") {
+ field(DESC, "Callback PV to listen to for changes")
+ field(ASG, "READONLY")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/postmortemlog/current/ioc/startup.script b/services/postmortemlog/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/postmortemlog/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui b/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui
new file mode 100644
index 0000000..0d48d96
--- /dev/null
+++ b/services/postmortemlog/current/qt/A_BD_PostMortemLog.ui
@@ -0,0 +1,1197 @@
+
+
+ MainWindow
+
+
+ Qt::WindowModal
+
+
+
+ 0
+ 0
+ 1200
+ 1275
+
+
+
+ MainWindow
+
+
+ false
+
+
+
+
+
+
+
+
+ 1460
+ 210
+ 70
+ 20
+
+
+
+
+
+
+ 1460
+ 150
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:POSTMORTEMLOG-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 1450
+ 260
+ 91
+ 21
+
+
+
+ 99999
+
+
+ true
+
+
+ AGEBD-MASTER:LOG
+
+
+
+
+
+ 5
+ 5
+ 1190
+ 1265
+
+
+
+ 3
+
+
+
+ Live
+
+
+
+
+ 5
+ 415
+ 1175
+ 200
+
+
+
+ Horizontal Tune (nominal: Qx = 39.37)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QX
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 620
+ 1175
+ 200
+
+
+
+ Vertival Tune (nominal: Qy = 15.22)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QY
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 1030
+ 1175
+ 200
+
+
+
+ Vertival Beam Size (nominal: Sig_y = 10)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGY
+
+
+
+ 118
+ 23
+ 130
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGY
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 154
+ 30
+ 170
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 825
+ 1175
+ 200
+
+
+
+ Horizontal Beam Size (nominal: Sig_x = 9)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGX
+
+
+
+ 38
+ 92
+ 208
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGX
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 46
+ 113
+ 248
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 5
+ 1175
+ 200
+
+
+
+ Stored Beam Current
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRPCT
+
+
+
+ 0
+ 255
+ 0
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRBPM
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 0
+ 200
+ 0
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 0
+ 200
+ 0
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 210
+ 1175
+ 200
+
+
+
+ Beam Lifetime
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUBPM
+
+
+ caCartesianPlot::FatDots
+
+
+
+ 38
+ 92
+ 208
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUPCT
+
+
+ caCartesianPlot::FatDots
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 46
+ 113
+ 248
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::User
+
+
+ -870;30
+
+
+ 0;15
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ Last
+
+
+
+
+ 5
+ 1030
+ 1175
+ 200
+
+
+
+ Vertival Beam Size (nominal: Sig_y = 10)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGY-LAST
+
+
+
+ 118
+ 23
+ 130
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGY-LAST
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 154
+ 30
+ 170
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 5
+ 1175
+ 200
+
+
+
+ Stored Beam Current
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRPCT-LAST
+
+
+
+ 0
+ 255
+ 0
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-CURRBPM-LAST
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 0
+ 200
+ 0
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 0
+ 200
+ 0
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 415
+ 1175
+ 200
+
+
+
+ Horizontal Tune (nominal: Qx = 39.37)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QX-LAST
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 825
+ 1175
+ 200
+
+
+
+ Horizontal Beam Size (nominal: Sig_x = 9)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X01DD-SIGX-LAST
+
+
+
+ 38
+ 92
+ 208
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-X08DB-SIGX-LAST
+
+
+ caCartesianPlot::Lines
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 46
+ 113
+ 248
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 620
+ 1175
+ 200
+
+
+
+ Vertival Tune (nominal: Qy = 15.22)
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-QY-LAST
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ -870;30
+
+
+
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 210
+ 1175
+ 200
+
+
+
+ Beam Lifetime
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUBPM-LAST
+
+
+ caCartesianPlot::FatDots
+
+
+
+ 38
+ 92
+ 208
+
+
+
+ AGEBD-POSTMORTEMLOG:BUFFER-TIME;AGEBD-POSTMORTEMLOG:BUFFER-TAUPCT-LAST
+
+
+ caCartesianPlot::FatDots
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+ 46
+ 113
+ 248
+
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::User
+
+
+ -870;30
+
+
+ 0;15
+
+
+ true
+
+
+ false
+
+
+ 9
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ Historic
+
+
+
+
+ Debug
+
+
+
+
+ 0
+ 40
+ 1187
+ 1200
+
+
+
+ QTextEdit::NoWrap
+
+
+
+
+
+ 250
+ 5
+ 241
+ 30
+
+
+
+ Update Logs
+
+
+ AGEBD-MASTER:POSTMORTEMLOG-LOGS-REQ
+
+
+ Update Logs
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+
+
+
+ 0
+ 5
+ 241
+ 30
+
+
+
+ Test Trigger Post Mortem
+
+
+ AGEBD-POSTMORTEMLOG:TEST
+
+
+ Test Trigger Post Mortem
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caCartesianPlot
+ QwtPlot
+
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ QwtPlot
+ QFrame
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 1460
+ 159
+
+
+ 1460
+ 222
+
+
+
+
+ calineedit
+ textChanged(QString)
+ textBrowser
+ setHtml(QString)
+
+
+ 1495
+ 270
+
+
+ 600
+ 671
+
+
+
+
+
diff --git a/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service b/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service
new file mode 100644
index 0000000..eb0ff43
--- /dev/null
+++ b/services/postmortemlog/current/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-POSTMORTEMLOG
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh POSTMORTEMLOG
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-POSTMORTEMLOG.service
+# systemctl --user start AGEBD-SERVICE-POSTMORTEMLOG
diff --git a/services/scrubbing/current/app/pyproject.toml b/services/scrubbing/current/app/pyproject.toml
new file mode 100644
index 0000000..f984959
--- /dev/null
+++ b/services/scrubbing/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-scrubbing"
+version = "0.1.0"
+description = "AGEBD-SCRUBBING Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py b/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/scrubbing/current/app/src/agebd_scrubbing/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/main.py b/services/scrubbing/current/app/src/agebd_scrubbing/main.py
new file mode 100644
index 0000000..b92c9fc
--- /dev/null
+++ b/services/scrubbing/current/app/src/agebd_scrubbing/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_scrubbing import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "SCRUBBING"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/scrubbing/current/app/src/agebd_scrubbing/service.py b/services/scrubbing/current/app/src/agebd_scrubbing/service.py
new file mode 100644
index 0000000..06d6f6d
--- /dev/null
+++ b/services/scrubbing/current/app/src/agebd_scrubbing/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-SCRUBBING:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-SCRUBBING:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-SCRUBBING:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/scrubbing/current/app/tests/test_app.py b/services/scrubbing/current/app/tests/test_app.py
new file mode 100644
index 0000000..4e3b1a8
--- /dev/null
+++ b/services/scrubbing/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_scrubbing import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/scrubbing/current/app/uv.lock b/services/scrubbing/current/app/uv.lock
new file mode 100644
index 0000000..fadbe6f
--- /dev/null
+++ b/services/scrubbing/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-scrubbing"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs
new file mode 100644
index 0000000..ec5596b
--- /dev/null
+++ b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_main.subs
@@ -0,0 +1,4 @@
+file SCRUBBING.template {
+ pattern { DEVICE }
+ { AGEBD-SCRUBBING }
+}
\ No newline at end of file
diff --git a/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/scrubbing/current/ioc/AGEBD-CPCL-SCRUBBING_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/scrubbing/current/ioc/SCRUBBING.template b/services/scrubbing/current/ioc/SCRUBBING.template
new file mode 100644
index 0000000..94ad8aa
--- /dev/null
+++ b/services/scrubbing/current/ioc/SCRUBBING.template
@@ -0,0 +1,290 @@
+# HLA Service Control Parameters
+
+record(mbbo, "$(DEVICE):CONTROL-SCRUB") {
+ field(DESC, "Scrubbing Mode")
+ field(ASG, "PROTECTED")
+ field(ZRST, "Off")
+ field(ZRVL, "0")
+ field(ONST, "Vertical Pinger")
+ field(ONVL, "1")
+ field(TWST, "Horizontal Pingers")
+ field(TWVL, "2")
+ field(THST, "Both Pingers")
+ field(THVL, "3")
+ field(FRST, "Vertical MBFB")
+ field(FRVL, "4")
+ field(FVST, "Horizontal MBFB")
+ field(FVVL, "5")
+ field(SXST, "Both MBFBs")
+ field(SXVL, "6")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-VACUUM-MAX") {
+ field(DESC, "Stop injection at this vacuum pressure")
+ field(ASG, "PROTECTED")
+ field(EGU, "1e-9 mbar")
+ field(VAL, "360")
+ field(PREC, "3")
+ field(FLNK, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-VACUUM-DYN") {
+ field(DESC, "Stop injection at this vacuum pressure")
+ field(ASG, "PROTECTED")
+ field(EGU, "1e-9 mbar")
+ field(VAL, "27")
+ field(PREC, "3")
+ field(FLNK, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-VACUUM-DYN-FRAC") {
+ field(DESC, "Fraction defining dynamic pressure ")
+ field(ASG, "PROTECTED")
+ field(VAL, "1.2")
+ field(PREC, "3")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-VACUUM-MIN") {
+ field(DESC, "Start injection at this vacuum pressure")
+ field(ASG, "PROTECTED")
+ field(EGU, "1e-9 mbar")
+ field(VAL, "0")
+ field(PREC, "3")
+ field(FLNK, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT")
+ field(PINI, "YES")
+}
+
+record(calc, "$(DEVICE):CONTROL-VACUUM-MAX-PLOT") {
+ field(DESC, "Stop injection at this vacuum pressure")
+ field(ASG, "READONLY")
+ field(EGU, "mbar")
+ field(PREC, "-5")
+ field(CALC, "A/1e9")
+ field(INPA, "$(DEVICE):CONTROL-VACUUM-MAX")
+}
+
+record(calc, "$(DEVICE):CONTROL-VACUUM-DYN-PLOT") {
+ field(DESC, "Stop injection at this vacuum pressure")
+ field(ASG, "READONLY")
+ field(EGU, "mbar")
+ field(PREC, "-5")
+ field(CALC, "A/1e9")
+ field(INPA, "$(DEVICE):CONTROL-VACUUM-DYN")
+}
+
+record(calc, "$(DEVICE):CONTROL-VACUUM-MIN-PLOT") {
+ field(DESC, "Stop injection at this vacuum pressure")
+ field(ASG, "READONLY")
+ field(EGU, "mbar")
+ field(PREC, "-5")
+ field(CALC, "A/1e9")
+ field(INPA, "$(DEVICE):CONTROL-VACUUM-MIN")
+}
+
+record(ao, "$(DEVICE):CONTROL-CURRENT-MAX") {
+ field(DESC, "Stop injection at this current")
+ field(ASG, "PROTECTED")
+ field(EGU, "mA")
+ field(VAL, "403")
+ field(PREC, "3")
+ field(PINI, "YES")
+ field(DRVH, "425")
+ field(DRVL, "0")
+}
+
+record(ao, "$(DEVICE):CONTROL-CURRENT-MIN") {
+ field(DESC, "Start injection at this current")
+ field(ASG, "PROTECTED")
+ field(EGU, "mA")
+ field(VAL, "400")
+ field(PREC, "3")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-TIME-MAX") {
+ field(DESC, "Stop injection after this time")
+ field(ASG, "PROTECTED")
+ field(EGU, "s")
+ field(VAL, "30")
+ field(PREC, "3")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-TIME-MIN") {
+ field(DESC, "Start injection after this time")
+ field(ASG, "PROTECTED")
+ field(EGU, "s")
+ field(VAL, "300")
+ field(PREC, "3")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):MBFBY-GAIN-SP") {
+ field(DESC, "MBFBy Gain SP for scrubbing")
+ field(ASG, "PROTECTED")
+ field(EGU, "%")
+ field(VAL, "1")
+ field(PREC, "3")
+ field(PINI, "YES")
+ field(DRVH, "100")
+ field(DRVL, "0")
+}
+
+record(ao, "$(DEVICE):MBFBX-GAIN-SP") {
+ field(DESC, "MBFBx Gain SP for scrubbing")
+ field(ASG, "PROTECTED")
+ field(EGU, "%")
+ field(VAL, "1")
+ field(PREC, "3")
+ field(PINI, "YES")
+ field(DRVH, "100")
+ field(DRVL, "0")
+}
+
+record(ao, "$(DEVICE):CONTROL-GUNGRID-ACCUM") {
+ field(DESC, "Gungrid val for accumulation")
+ field(ASG, "PROTECTED")
+ field(EGU, "V")
+ field(VAL, "100")
+ field(PREC, "3")
+ field(PINI, "YES")
+ field(DRVH, "180")
+ field(DRVL, "40")
+}
+
+record(ao, "$(DEVICE):CONTROL-GUNGRID-FPFB") {
+ field(DESC, "Gungrid val for FPFB Injection")
+ field(ASG, "PROTECTED")
+ field(EGU, "V")
+ field(VAL, "160")
+ field(PREC, "3")
+ field(PINI, "YES")
+ field(DRVH, "180")
+ field(DRVL, "40")
+}
+
+# HLA Service Output/Result Parameters
+
+record(ao, "$(DEVICE):TOPUP-TAU") {
+ field(DESC, "Average tau since last top up")
+ field(ASG, "PROTECTED")
+ field(EGU, "h")
+ field(VAL, "100")
+ field(PREC, "3")
+ field(VAL, "-1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):TOPUP-DELTAT") {
+ field(DESC, "Time since last top up")
+ field(ASG, "PROTECTED")
+ field(EGU, "min")
+ field(VAL, "100")
+ field(PREC, "3")
+ field(VAL, "-1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):TOPUP-DELTAI") {
+ field(DESC, "Current change since last top up")
+ field(ASG, "PROTECTED")
+ field(EGU, "mA")
+ field(VAL, "100")
+ field(PREC, "3")
+ field(VAL, "-1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOIN-SP") {
+ field(DESC, "Warmup cycles for booster injection")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOMB-SP") {
+ field(DESC, "Warmup cycles for ABOMA-B")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "5")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOME-SP") {
+ field(DESC, "Warmup cycles for ABOMA-ELSE")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOEX-SP") {
+ field(DESC, "Warmup cycles for booster extraction")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-SRIN-SP") {
+ field(DESC, "Warmup cycles for SR Injection")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOIN-RB") {
+ field(DESC, "Warmup cycles for booster injection")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOMB-RB") {
+ field(DESC, "Warmup cycles for ABOMA-B")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "5")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOME-RB") {
+ field(DESC, "Warmup cycles for ABOMA-ELSE")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-BOEX-RB") {
+ field(DESC, "Warmup cycles for booster extraction")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):WARMUPCYCLES-SRIN-RB") {
+ field(DESC, "Warmup cycles for SR Injection")
+ field(ASG, "PROTECTED")
+ field(EGU, "")
+ field(VAL, "15")
+ field(PREC, "1")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/scrubbing/current/ioc/startup.script b/services/scrubbing/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/scrubbing/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/scrubbing/current/qt/A_BD_Scrubbing.ui b/services/scrubbing/current/qt/A_BD_Scrubbing.ui
new file mode 100644
index 0000000..00f96bd
--- /dev/null
+++ b/services/scrubbing/current/qt/A_BD_Scrubbing.ui
@@ -0,0 +1,5326 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 1500
+ 1000
+
+
+
+ MainWindow
+
+
+
+
+
+ 10
+ 10
+ 211
+ 61
+
+
+
+ AGEBD-ALH:SCRUBBING-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 640
+ 280
+ 861
+ 461
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Vakuum (last 60 seconds)
+
+
+
+
+
+
+
+
+ ARIVA-VMAVE:PRESS-MAX;ARIVA-VMAVE-FE:PRESS-MAX;ARIVA-VMAVE-ALL:PRESS-MAX;AGEBD-SCRUBBING:CONTROL-VACUUM-MAX-PLOT;AGEBD-SCRUBBING:CONTROL-VACUUM-MIN-PLOT;AGEBD-SCRUBBING:CONTROL-VACUUM-DYN-PLOT
+
+
+ caStripPlot::Second
+
+
+ 60.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::log10
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 255
+ 127
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+ 260
+ 40
+ 350
+ 50
+
+
+
+
+ Lucida Sans Typewriter
+ 32
+ 75
+ true
+
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+ ARIVA-VMAVE-ALL:PRESS-MAX
+
+
+
+ 252
+ 192
+ 11
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ 1
+
+
+ caLineEdit::User
+
+
+ caLineEdit::WidthAndHeight
+
+
+ true
+
+
+ caLineEdit::exponential
+
+
+
+
+
+ 260
+ 100
+ 350
+ 50
+
+
+
+
+ Lucida Sans Typewriter
+ 32
+ 75
+ true
+
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+ ARIVA-VMAVE:PRESS-MAX
+
+
+
+ 255
+ 255
+ 127
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ 1
+
+
+ caLineEdit::User
+
+
+ caLineEdit::WidthAndHeight
+
+
+ true
+
+
+ caLineEdit::exponential
+
+
+
+
+
+ 70
+ 40
+ 190
+ 50
+
+
+
+
+ 31
+ 50
+ false
+
+
+
+ Frontend
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 252
+ 192
+ 11
+
+
+
+
+
+
+ 70
+ 100
+ 230
+ 50
+
+
+
+
+ 31
+ 50
+ false
+
+
+
+ Machine
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 255
+ 255
+ 127
+
+
+
+
+
+
+
+ 1990
+ 540
+ 70
+ 20
+
+
+
+
+
+
+ 1980
+ 360
+ 71
+ 20
+
+
+
+ RELOAD
+
+
+ Qt::AlignCenter
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:SCRUBBING-GUIRELOAD
+
+
+ caCalc::TriggerOneToZero
+
+
+
+
+
+ 10
+ 80
+ 391
+ 41
+
+
+
+ AGEBD-ALH:SCRUBBING-INFO
+
+
+ caLineEdit::Alarm_Default
+
+
+ caLineEdit::onBackground
+
+
+ caLineEdit::User
+
+
+
+
+
+ 230
+ 40
+ 50
+ 30
+
+
+
+ AGEBD-SCRUBBING:TOPUP-DELTAT
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::onBackground
+
+
+ 2
+
+
+ caLineEdit::User
+
+
+
+
+
+ 349
+ 40
+ 50
+ 30
+
+
+
+ AGEBD-SCRUBBING:TOPUP-TAU
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::onBackground
+
+
+ 2
+
+
+ caLineEdit::User
+
+
+
+
+
+ 350
+ 10
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Tau
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 290
+ 10
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ dI
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 230
+ 10
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ dt
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 290
+ 40
+ 50
+ 30
+
+
+
+ AGEBD-SCRUBBING:TOPUP-DELTAI
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::onBackground
+
+
+ 2
+
+
+ caLineEdit::User
+
+
+
+
+
+ 5
+ 450
+ 631
+ 291
+
+
+
+ Events, Trigger und Top-Up Save
+
+
+
+
+ 135
+ 173
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 215
+ 32
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 10
+ 31
+ 100
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Master
+
+
+ Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 211
+ 173
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 215
+ 177
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 135
+ 28
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=0
+
+
+ AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 139
+ 177
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ext-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 10
+ 176
+ 100
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Booster Ext
+
+
+ Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 211
+ 28
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 139
+ 32
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:SR-Inj-Status-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 139
+ 119
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 10
+ 118
+ 121
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ ABOMA-B
+
+
+ Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 135
+ 115
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 215
+ 119
+ 70
+ 20
+
+
+
+ true
+
+
+ External
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel
+
+
+ External
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 211
+ 115
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 139
+ 206
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 215
+ 206
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 211
+ 202
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 10
+ 205
+ 150
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Ring Inj
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 135
+ 202
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 211
+ 57
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 215
+ 61
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 135
+ 57
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 10
+ 60
+ 91
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Gun
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 139
+ 61
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 139
+ 90
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 215
+ 90
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 135
+ 86
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 211
+ 86
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Inj-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 10
+ 89
+ 111
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Booster Inj
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 95
+ 28
+ 28
+ 28
+
+
+
+ true
+
+
+ false
+
+
+ 22
+
+
+ 22
+
+
+ AGEBD-INJECTIONGUARD:STATUS-SECRET-MASTER
+
+
+ caLed::Alarm
+
+
+
+
+
+ 520
+ 28
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Event-Seq-Cnt-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 520
+ 86
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Inj-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 520
+ 115
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+
+AGETI-CVME-MASTER-TMA:Evt-BO-MA-B-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 520
+ 173
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ext-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 520
+ 202
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 520
+ 231
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 135
+ 231
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 139
+ 235
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 211
+ 231
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 215
+ 235
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-H-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 10
+ 234
+ 101
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Hor. Pinger
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 520
+ 260
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 10
+ 263
+ 101
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ Qt::LeftToRight
+
+
+ Ver. Pinger
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 139
+ 264
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 215
+ 264
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 135
+ 260
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 211
+ 260
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-SR-Pinger-V-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 10
+ 147
+ 121
+ 22
+
+
+
+
+ Sans Serif
+ 13
+
+
+
+ true
+
+
+ ABOMA-ELSE
+
+
+ Qt::AlignAbsolute|Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::Height
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ QFrame::NoFrame
+
+
+
+
+
+ 135
+ 144
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::IfZero
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+ 0
+
+
+ 90
+
+
+
+
+
+ 139
+ 148
+ 70
+ 20
+
+
+
+ true
+
+
+ Disable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel
+
+
+ Disable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 0
+
+
+
+
+
+ 211
+ 144
+ 78
+ 28
+
+
+
+ true
+
+
+
+ 0
+ 0
+ 176
+
+
+
+ caGraphics::Filled
+
+
+ 1
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caGraphics::Calc
+
+
+ A=1
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel
+
+
+ caGraphics::Rectangle
+
+
+ 22
+
+
+ 180
+
+
+
+
+
+ 520
+ 144
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+
+AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 215
+ 148
+ 70
+ 20
+
+
+
+ true
+
+
+ Enable
+
+
+ AGETI-CVME-MASTER-TMA:Evt-BO-Ramp-Ena-Sel
+
+
+ Enable
+
+
+
+ 219
+ 212
+ 157
+
+
+
+ 1
+
+
+
+
+
+ 520
+ 57
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+
+AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::None
+
+
+
+
+
+ 300
+ 88
+ 100
+ 28
+
+
+
+ 2
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOIN-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 300
+ 120
+ 100
+ 28
+
+
+
+ 2
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOMB-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 300
+ 150
+ 100
+ 25
+
+
+
+ 2
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOME-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 300
+ 180
+ 100
+ 25
+
+
+
+ 2
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOEX-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 300
+ 210
+ 100
+ 25
+
+
+
+ 2
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-SRIN-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 300
+ 30
+ 100
+ 41
+
+
+
+
+ 9
+ 75
+ true
+
+
+
+ Warmup Cycles
+Setpoint
+
+
+ Qt::PlainText
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+
+
+
+ 410
+ 117
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOMB-RB.VAL
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+
+
+
+ 410
+ 88
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOIN-RB.VAL
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+
+
+
+ 410
+ 146
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOME-RB.VAL
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+
+
+
+ 410
+ 204
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-SRIN-RB.VAL
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+
+
+
+ 410
+ 175
+ 100
+ 28
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ AGEBD-SCRUBBING:WARMUPCYCLES-BOEX-RB.VAL
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+
+
+
+ 410
+ 30
+ 100
+ 41
+
+
+
+
+ 9
+ 75
+ true
+
+
+
+ Warmup Cycles
+Remaining
+
+
+ Qt::AlignCenter
+
+
+ true
+
+
+ BOO_Ext_External_frame_8
+ BOO_Ext_Disable_frame_8
+ BOO_Ext_Disable_frame_5
+ BOO_Ext_External_frame_5
+ BOO_Ext_Disable_frame_4
+ BOO_Ext_External_frame_4
+ Inj_trig_Enable_frame
+ BOO_Ext_Disable_frame_2
+ BOO_Ext_External_frame_2
+ Inj_trig_Enable
+ Inj_trig_
+ BOO_Ext_External_2
+ Inj_trig_Disable_frame
+ BOO_Ext_Diasable_2
+ BOO_Ext
+ Inj_trig_Disable
+ Gun_trig_2
+ Gun_trig_Disable_frame_2
+ Gun_trig_External_frame_2
+ Gun_trig_External_2
+ Gun_trig_Diasable_2
+ BOO_Ext_Diasable_4
+ BOO_Ext_External_4
+ BOO_Ext_3
+ BOO_Ext_External_frame_6
+ BOO_Ext_External_6
+ BOO_Ext_Disable_frame_6
+ BOO_Ext_5
+ BOO_Ext_Diasable_6
+ BOO_Ext_Diasable_5
+ BOO_Ext_External_5
+ BOO_Ext_4
+ caled_23
+ calineedit
+ calineedit_4
+ calineedit_6
+ calineedit_7
+ calineedit_8
+ calineedit_9
+ BOO_Ext_Disable_frame_7
+ BOO_Ext_Diasable_7
+ BOO_Ext_External_frame_7
+ BOO_Ext_External_7
+ BOO_Ext_6
+ calineedit_10
+ BOO_Ext_7
+ BOO_Ext_Diasable_8
+ BOO_Ext_External_8
+ Gun_trig_3
+ BOO_Ext_Disable_frame_3
+ BOO_Ext_Diasable_3
+ BOO_Ext_External_frame_3
+ calineedit_13
+ BOO_Ext_External_3
+ calineedit_2
+ caspinbox_10
+ caspinbox_11
+ caspinbox_12
+ caspinbox_13
+ caspinbox_14
+ calabel_18
+ calineedit_16
+ calineedit_5
+ calineedit_17
+ calineedit_18
+ calineedit_19
+ calabel_19
+
+
+
+
+ 420
+ 750
+ 1081
+ 241
+
+
+
+
+
+
+ ;AGEBD-TIMING:TARGET-BUCKET
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 0
+ 255
+ 0
+
+
+
+ ;X08DB-DFPM-DI:FW-SIS0DAQ-CH0-FPM-WF
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 170
+ 255
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 160
+ 160
+ 160
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::User
+
+
+ 0;480
+
+
+ 0;1.3
+
+
+ true
+
+
+ false
+
+
+ 24
+
+
+
+
+
+ 5
+ 750
+ 410
+ 241
+
+
+
+ Filling Pattern Feedback (FPFB)
+
+
+
+
+ 0
+ 20
+ 40
+ 40
+
+
+
+ AGEBD-TIMING:GO
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+
+
+ 10
+ 60
+ 391
+ 30
+
+
+
+
+ 9
+
+
+
+ space separated bucket ranges (e.g., 0-450) and single buckets
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::WidthAndHeight
+
+
+
+
+
+ 10
+ 90
+ 391
+ 45
+
+
+
+ AGEBD-TIMING:CONTROL-FILLPATTERN-string.VAL
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::User
+
+
+ 479.000000000000000
+
+
+
+
+
+
+ 210
+ 190
+ 191
+ 40
+
+
+
+
+ 20
+
+
+
+ Reset
+
+
+ EPushButton::WidthAndHeight
+
+
+ AGEBD-TIMING:ZERO-TARGET-BUCKET
+
+
+ Reset
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+ 240
+ 140
+ 150
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ true
+
+
+ AGEBD-TIMING:CURRENT-THRESHOLD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::Channel
+
+
+
+
+
+ 10
+ 190
+ 80
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Nth
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 90
+ 190
+ 111
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-TIMING:FPFB-NTH
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::Channel
+
+
+
+
+
+ 10
+ 140
+ 211
+ 40
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ FPFB Threshold
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+
+ 5
+ 130
+ 530
+ 140
+
+
+
+ Top-Up Grenzen
+
+
+
+
+ 220
+ 95
+ 140
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-SCRUBBING:CONTROL-CURRENT-MIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 220
+ 50
+ 140
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-SCRUBBING:CONTROL-CURRENT-MAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 10
+ 95
+ 50
+ 40
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Start
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 50
+ 50
+ 40
+
+
+
+
+ 13
+ 75
+ true
+
+
+
+ Stop
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 70
+ 95
+ 140
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-SCRUBBING:CONTROL-VACUUM-MIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 220
+ 20
+ 140
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Strom
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 70
+ 20
+ 140
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vakuum
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 70
+ 50
+ 140
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-SCRUBBING:CONTROL-VACUUM-MAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 370
+ 20
+ 140
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Zeit
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 370
+ 50
+ 140
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:CONTROL-TIME-MAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 370
+ 95
+ 140
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:CONTROL-TIME-MIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+
+ 5
+ 280
+ 255
+ 160
+
+
+
+ Gun Ladung
+
+
+
+
+ 50
+ 20
+ 211
+ 40
+
+
+
+
+ 20
+ 75
+ true
+
+
+
+ Gun Grid
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 125
+ 120
+ 120
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:CONTROL-GUNGRID-FPFB
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 125
+ 70
+ 120
+ 40
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:CONTROL-GUNGRID-ACCUM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 5
+ 70
+ 110
+ 40
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Accumulate
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 5
+ 120
+ 110
+ 40
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Top-Up
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+
+ 550
+ 0
+ 951
+ 271
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Beam Current (last 10 minutes)
+
+
+
+
+
+
+
+
+ ARS07-DPCT-0000:CURR;AGEBD-SCRUBBING:CONTROL-CURRENT-MAX;AGEBD-SCRUBBING:CONTROL-CURRENT-MIN
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ 11
+
+
+ caStripPlot::linear
+
+
+ 404.000000000000000
+
+
+ 399.000000000000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+ caStripPlot::Lines
+
+
+
+ 0
+ 255
+ 0
+
+
+
+ 404.000000000000000
+
+
+ 399.000000000000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 0
+
+
+
+ 404.000000000000000
+
+
+ 399.000000000000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 0
+
+
+
+ 404.000000000000000
+
+
+ 399.000000000000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+ 60
+ 30
+ 250
+ 50
+
+
+
+
+ Lucida Sans Typewriter
+ 32
+ 75
+ true
+
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+ ARS07-DPCT-0000:CURR
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ 1
+
+
+ caLineEdit::User
+
+
+ caLineEdit::WidthAndHeight
+
+
+ true
+
+
+
+
+
+ 660
+ 30
+ 250
+ 50
+
+
+
+
+ Lucida Sans Typewriter
+ 32
+ 75
+ true
+
+
+
+ Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing
+
+
+ AGEBD-PARAMS:LIFETIME
+
+
+
+ 0
+ 255
+ 255
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ 1
+
+
+ caLineEdit::User
+
+
+ caLineEdit::WidthAndHeight
+
+
+ true
+
+
+
+
+
+ 350
+ 30
+ 250
+ 50
+
+
+
+
+ Lucida Sans Typewriter
+ 32
+ 75
+ true
+
+
+
+ AGEBD-PARAMS:TRANSMISSION
+
+
+
+ 255
+ 170
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ 1
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Height
+
+
+ true
+
+
+
+
+
+
+ 410
+ 30
+ 120
+ 40
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Dyn Vac Frac
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 410
+ 80
+ 120
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+
+AGEBD-SCRUBBING:CONTROL-VACUUM-DYN-FRAC
+
+
+ caSpinbox::User
+
+
+ true
+
+
+
+
+
+ 270
+ 280
+ 360
+ 180
+
+
+
+ Strahlwaschen
+
+
+
+
+
+ 10
+ 20
+ 191
+ 40
+
+
+
+
+ 20
+ 75
+ true
+
+
+
+ Scrubbing
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 95
+ 360
+ 85
+
+
+
+
+ 85
+ 170
+ 0
+
+
+
+ caFrame::Calc
+
+
+ A>3
+
+
+ AGEBD-SCRUBBING:CONTROL-SCRUB
+
+
+
+
+ 230
+ 45
+ 100
+ 35
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ ARSGE-CECL-MBFB:MBFB-T-Y-DDS-FRQ
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+ true
+
+
+
+
+
+ 65
+ 45
+ 100
+ 35
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:MBFBY-GAIN-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 100.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 230
+ 5
+ 100
+ 35
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ ARSGE-CECL-MBFB:MBFB-T-X-DDS-FRQ
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+ true
+
+
+
+
+
+ 10
+ 45
+ 45
+ 35
+
+
+
+
+ 8
+ 75
+ true
+
+
+
+ MBFBy
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 65
+ 5
+ 100
+ 35
+
+
+
+ 3
+
+
+ 0
+
+
+ AGEBD-SCRUBBING:MBFBX-GAIN-SP.VAL
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 100.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 5
+ 45
+ 35
+
+
+
+
+ 8
+ 75
+ true
+
+
+
+ MBFBx
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 175
+ 45
+ 45
+ 35
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ ARSGE-CECL-MBFB:MBFB-T-Y-DDS-GAIN
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+ false
+
+
+
+
+
+ 175
+ 5
+ 45
+ 35
+
+
+
+
+ Monospace
+ 13
+ PreferDefault
+
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ true
+
+
+ ARSGE-CECL-MBFB:MBFB-T-X-DDS-GAIN
+
+
+
+ 160
+ 160
+ 164
+
+
+
+ caLineEdit::Default
+
+
+ caLineEdit::User
+
+
+ caLineEdit::None
+
+
+ false
+
+
+
+
+
+ 335
+ 5
+ 17
+ 17
+
+
+
+ true
+
+
+ false
+
+
+ 15
+
+
+ 15
+
+
+
+ARSGE-MBFBT-AMP-03:SET-ON-OFF
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+
+
+ 335
+ 23
+ 17
+ 17
+
+
+
+ true
+
+
+ false
+
+
+ 15
+
+
+ 15
+
+
+
+ARSGE-MBFBT-AMP-04:SET-ON-OFF
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+
+
+ 335
+ 45
+ 17
+ 17
+
+
+
+ true
+
+
+ false
+
+
+ 15
+
+
+ 15
+
+
+ ARSGE-MBFBT-AMP-01:SET-ON-OFF
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+
+
+ 335
+ 63
+ 17
+ 17
+
+
+
+ true
+
+
+ false
+
+
+ 15
+
+
+ 15
+
+
+
+ARSGE-MBFBT-AMP-02:SET-ON-OFF
+
+
+
+ 0
+ 255
+ 0
+
+
+
+
+
+
+
+ 0
+ 95
+ 360
+ 85
+
+
+
+
+ 85
+ 170
+ 0
+
+
+
+ caFrame::Calc
+
+
+ A<4 & A>0
+
+
+ AGEBD-SCRUBBING:CONTROL-SCRUB
+
+
+
+
+ 70
+ 45
+ 150
+ 35
+
+
+
+ 4
+
+
+ 2
+
+
+ ARS01-MKIK-0320:I-SET
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 100.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 45
+ 50
+ 35
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ PINGy
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 70
+ 5
+ 150
+ 35
+
+
+
+ 4
+
+
+ 2
+
+
+ ARS01-MKIK-0290:I-SET
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 100.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 5
+ 50
+ 35
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ PINGx
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 230
+ 5
+ 35
+ 35
+
+
+
+
+ 35
+ 35
+
+
+
+ ARS01-MKIK-0290:CTRL-ON-OFF
+
+
+
+
+
+ 230
+ 45
+ 35
+ 35
+
+
+
+
+ 35
+ 35
+
+
+
+ ARS01-MKIK-0320:CTRL-ON-OFF
+
+
+
+
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+ caSpinbox
+ QFrame
+
+
+
+ caFrame
+ QFrame
+
+ 1
+
+
+ caLabel
+ QLabel
+
+
+
+ caGraphics
+ QWidget
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caCartesianPlot
+ QwtPlot
+
+
+
+ caStripPlot
+ QwtPlot
+
+ 1
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ QwtPlot
+ QFrame
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 2020
+ 374
+
+
+ 2022
+ 545
+
+
+
+
+
diff --git a/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service b/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service
new file mode 100644
index 0000000..1bf2013
--- /dev/null
+++ b/services/scrubbing/current/systemd/AGEBD-SERVICE-SCRUBBING.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-SCRUBBING
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh SCRUBBING
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-SCRUBBING.service
+# systemctl --user start AGEBD-SERVICE-SCRUBBING
diff --git a/services/taupct/current/app/pyproject.toml b/services/taupct/current/app/pyproject.toml
new file mode 100644
index 0000000..cf97407
--- /dev/null
+++ b/services/taupct/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-taupct"
+version = "0.1.0"
+description = "AGEBD-TAUPCT Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/taupct/current/app/src/agebd_taupct/__init__.py b/services/taupct/current/app/src/agebd_taupct/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/taupct/current/app/src/agebd_taupct/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/taupct/current/app/src/agebd_taupct/main.py b/services/taupct/current/app/src/agebd_taupct/main.py
new file mode 100644
index 0000000..64fb8a6
--- /dev/null
+++ b/services/taupct/current/app/src/agebd_taupct/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_taupct import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "TAUPCT"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/taupct/current/app/src/agebd_taupct/service.py b/services/taupct/current/app/src/agebd_taupct/service.py
new file mode 100644
index 0000000..b1d2135
--- /dev/null
+++ b/services/taupct/current/app/src/agebd_taupct/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-TAUPCT:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-TAUPCT:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-TAUPCT:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/taupct/current/app/tests/test_app.py b/services/taupct/current/app/tests/test_app.py
new file mode 100644
index 0000000..a8bf6c4
--- /dev/null
+++ b/services/taupct/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_taupct import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/taupct/current/app/uv.lock b/services/taupct/current/app/uv.lock
new file mode 100644
index 0000000..5a4fc6b
--- /dev/null
+++ b/services/taupct/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-taupct"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs
new file mode 100644
index 0000000..f25a3bd
--- /dev/null
+++ b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_main.subs
@@ -0,0 +1,4 @@
+file TAUPCT.template {
+ pattern { DEVICE }
+ { AGEBD-TAUPCT }
+}
\ No newline at end of file
diff --git a/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/taupct/current/ioc/AGEBD-CPCL-TAUPCT_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/taupct/current/ioc/TAUPCT.template b/services/taupct/current/ioc/TAUPCT.template
new file mode 100644
index 0000000..e984743
--- /dev/null
+++ b/services/taupct/current/ioc/TAUPCT.template
@@ -0,0 +1,70 @@
+record(ao, "$(DEVICE):CONTROL-NSAMPLES-FIT-TAU") {
+ field(DESC, "Nr. of charge points for TAU fit")
+ field(VAL, "60")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-NSAMPLES-FIT-ROC") {
+ field(DESC, "Nr. of charge points for ROC fit")
+ field(VAL, "5")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-MIN-CURR") {
+ field(DESC, "Minimum current")
+ field(VAL, "0.1")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):TAU") {
+ field(DESC, "PCT injection rate")
+ field(PREC, "3")
+ field(EGU, "hours")
+}
+
+record(ao, "$(DEVICE):TAU-ERR") {
+ field(DESC, "PCT injection rate error")
+ field(PREC, "3")
+ field(EGU, "hours")
+}
+
+record(ao, "$(DEVICE):INJRATE") {
+ field(DESC, "PCT injection rate")
+ field(PREC, "3")
+ field(EGU, "mA/min")
+ field(FLNK, "$(DEVICE):INJRATE-nC")
+}
+
+record(ao, "$(DEVICE):INJRATE-ERR") {
+ field(DESC, "PCT injection rate error")
+ field(PREC, "3")
+ field(EGU, "mA/min")
+ field(FLNK, "$(DEVICE):INJRATE-ERR-nC")
+}
+
+record(calc, "$(DEVICE):INJRATE-nC") {
+ field(DESC, "Rate der Akkumulation im Speicherring")
+ field(ASG, "READONLY")
+ field(PREC, "3")
+ field(EGU, "nC/shot")
+ field(CALC, "A / 60 / 3.125 * 0.96")
+ field(INPA, "$(DEVICE):INJRATE")
+}
+
+record(calc, "$(DEVICE):INJRATE-ERR-nC") {
+ field(DESC, "Fehler der Injektionsrate Speicherring")
+ field(ASG, "READONLY")
+ field(PREC, "3")
+ field(EGU, "nC/shot")
+ field(CALC, "A / 60 / 3.125 * 0.96")
+ field(INPA, "$(DEVICE):INJRATE-ERR")
+}
+
+record(calc, "$(DEVICE):LOSSRATIO") {
+ field(DESC, "Lossratio now to nominal 400 mA, 10 h")
+ field(ASG, "READONLY")
+ field(PREC, "3")
+ field(CALC, "(I / B) / 50") # = (strom / e / tau) / (400 / e / 10)
+ field(INPB, "$(DEVICE):TAU CP")
+ field(INPI, "ARS07-DPCT-0000:CURR")
+}
\ No newline at end of file
diff --git a/services/taupct/current/ioc/startup.script b/services/taupct/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/taupct/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/taupct/current/qt/A_BD_LifetimePCT.ui b/services/taupct/current/qt/A_BD_LifetimePCT.ui
new file mode 100644
index 0000000..8ab773b
--- /dev/null
+++ b/services/taupct/current/qt/A_BD_LifetimePCT.ui
@@ -0,0 +1,527 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 570
+ 260
+
+
+
+ MainWindow
+
+
+
+
+
+ 10
+ 60
+ 260
+ 30
+
+
+
+ Nr. of points for Lifetime fit
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 140
+ 260
+ 30
+
+
+
+ Minimum Current
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 180
+ 260
+ 30
+
+
+
+ Lifetime
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 280
+ 180
+ 120
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TAUPCT:TAU
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 440
+ 180
+ 120
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TAUPCT:TAU-ERR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 410
+ 180
+ 21
+ 30
+
+
+
+ ±
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 280
+ 220
+ 120
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TAUPCT:INJRATE
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 440
+ 220
+ 120
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TAUPCT:INJRATE-ERR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 410
+ 220
+ 21
+ 30
+
+
+
+ ±
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 660
+ 130
+ 70
+ 20
+
+
+
+
+
+
+ 660
+ 70
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:TAUPCT-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 10
+ 220
+ 260
+ 30
+
+
+
+ Injection rate
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 280
+ 60
+ 280
+ 30
+
+
+
+ AGEBD-TAUPCT:CONTROL-NSAMPLES-FIT-TAU
+
+
+ caLineEdit::User
+
+
+
+
+
+ 280
+ 140
+ 280
+ 30
+
+
+
+ AGEBD-TAUPCT:CONTROL-MIN-CURR
+
+
+ 12
+
+
+ caLineEdit::User
+
+
+
+
+
+ 0
+ 10
+ 561
+ 40
+
+
+
+ AGEBD-ALH:TAUPCT-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 280
+ 100
+ 280
+ 30
+
+
+
+ AGEBD-TAUPCT:CONTROL-NSAMPLES-FIT-ROC
+
+
+ caLineEdit::User
+
+
+
+
+
+ 10
+ 100
+ 260
+ 30
+
+
+
+ Nr. of points for inj. rate fit
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 695
+ 80
+
+
+ 699
+ 145
+
+
+
+
+
diff --git a/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service b/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service
new file mode 100644
index 0000000..95c1241
--- /dev/null
+++ b/services/taupct/current/systemd/AGEBD-SERVICE-TAUPCT.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-TAUPCT
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TAUPCT
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TAUPCT.service
+# systemctl --user start AGEBD-SERVICE-TAUPCT
diff --git a/services/timing/current/app/pyproject.toml b/services/timing/current/app/pyproject.toml
new file mode 100644
index 0000000..7bad054
--- /dev/null
+++ b/services/timing/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-timing"
+version = "0.1.0"
+description = "AGEBD-TIMING Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/timing/current/app/src/agebd_timing/__init__.py b/services/timing/current/app/src/agebd_timing/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/timing/current/app/src/agebd_timing/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/timing/current/app/src/agebd_timing/main.py b/services/timing/current/app/src/agebd_timing/main.py
new file mode 100644
index 0000000..5312def
--- /dev/null
+++ b/services/timing/current/app/src/agebd_timing/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_timing import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "TIMING"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/timing/current/app/src/agebd_timing/service.py b/services/timing/current/app/src/agebd_timing/service.py
new file mode 100644
index 0000000..3f81c3e
--- /dev/null
+++ b/services/timing/current/app/src/agebd_timing/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-TIMING:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-TIMING:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-TIMING:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/timing/current/app/tests/test_app.py b/services/timing/current/app/tests/test_app.py
new file mode 100644
index 0000000..f058e5e
--- /dev/null
+++ b/services/timing/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_timing import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/timing/current/app/uv.lock b/services/timing/current/app/uv.lock
new file mode 100644
index 0000000..d427488
--- /dev/null
+++ b/services/timing/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-timing"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs b/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs
new file mode 100644
index 0000000..d880674
--- /dev/null
+++ b/services/timing/current/ioc/AGEBD-CPCL-TIMING_main.subs
@@ -0,0 +1,4 @@
+file TIMING.template {
+ pattern { DEVICE }
+ { AGEBD-TIMING }
+}
\ No newline at end of file
diff --git a/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml b/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/timing/current/ioc/AGEBD-CPCL-TIMING_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/timing/current/ioc/TIMING.template b/services/timing/current/ioc/TIMING.template
new file mode 100644
index 0000000..a9bd791
--- /dev/null
+++ b/services/timing/current/ioc/TIMING.template
@@ -0,0 +1,409 @@
+###############################
+## follow bucket flags
+###############################
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-GUN") {
+ field(DESC, "Gun")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lindi-ictone") {
+ field(DESC, "Linac ICT 1/2")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lindi-icts23") {
+ field(DESC, "Linac ICT 3")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-llemast") {
+ field(DESC, "Linac RF LLE Master")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-preamp1") {
+ field(DESC, "Linac RF Preamp 1")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-preamp2") {
+ field(DESC, "Linac RF Preamp 2")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-klystr1") {
+ field(DESC, "Linac RF Klystron 1")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-klystr2") {
+ field(DESC, "Linac RF Klystron 2")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-3GHzQdm") {
+ field(DESC, "Linac RF 3GHz Qdm")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-500-PBU") {
+ field(DESC, "Linac RF 500 MHz PBU")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-3GHzScp") {
+ field(DESC, "Linac RF 3 GHz Scope")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-Kly1PMU") {
+ field(DESC, "Linac RF Klystron 1 PMU")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-lirf-Kly2PMU") {
+ field(DESC, "Linac RF Klystron 2 PMU")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOINKI") {
+ field(DESC, "Booster Inj. Kicker")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOINSE") {
+ field(DESC, "Booster Inj. Septum")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOEXKI") {
+ field(DESC, "Booster Ext. Kicker")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BOEXSE") {
+ field(DESC, "Booster Ext. Septum")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BTRICT") {
+ field(DESC, "BRTL ICT")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-BTRBPM") {
+ field(DESC, "BRTL BPM")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINSE") {
+ field(DESC, "Ring Inj. Septum")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK1") {
+ field(DESC, "Ring Inj. Kicker 1")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK2") {
+ field(DESC, "Ring Inj. Kicker 2")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK3") {
+ field(DESC, "Ring Inj. Kicker 3")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CONTROL-FLW-BCKT-SRINK4") {
+ field(DESC, "Ring Inj. Kicker 4")
+ field(ASG, "PROTECTED")
+ field(PINI, "YES")
+}
+
+###############################
+## base delays for bucket zero
+###############################
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-GUN") {
+ field(DESC, "Gun delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lindi-ictone") {
+ field(DESC, "Linac ICT delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lindi-icts23") {
+ field(DESC, "Linac ICT delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-llemast") {
+ field(DESC, "Linac RF lemast delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "3")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-preamp1") {
+ field(DESC, "Linac RF reamp1 delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-preamp2") {
+ field(DESC, "Linac RF reamp2 delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-klystr1") {
+ field(DESC, "Linac RF lystr1 delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-klystr2") {
+ field(DESC, "Linac RF lystr2 delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-3GHzQdm") {
+ field(DESC, "Linac RF GHzQdm delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-500-PBU") {
+ field(DESC, "Linac RF 00-PBU delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-3GHzScp") {
+ field(DESC, "Linac RF GHzScp delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-Kly1PMU") {
+ field(DESC, "Linac RF ly1PMU delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-lirf-Kly2PMU") {
+ field(DESC, "Linac RF ly2PMU delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOINKI") {
+ field(DESC, "Booster inj kicker delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOINSE") {
+ field(DESC, "Booster inj sept delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOEXKI") {
+ field(DESC, "Booster ext kicker delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BOEXSE") {
+ field(DESC, "Booster ext septum delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BTRICT") {
+ field(DESC, "BRTL ICT delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-BTRBPM") {
+ field(DESC, "BRTL BPM delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINSE") {
+ field(DESC, "SR septum delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK1") {
+ field(DESC, "SR kicker bump delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK2") {
+ field(DESC, "SR kicker bump delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK3") {
+ field(DESC, "SR kicker bump delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-ZERO-DELAY-SRINK4") {
+ field(DESC, "SR kicker bump delay for bucket zero")
+ field(ASG, "PROTECTED")
+ field(PREC, "0")
+ field(PINI, "YES")
+}
+
+###############################
+## HLA pvs
+###############################
+
+record(lso, "$(DEVICE):CONTROL-FILLPATTERN-string") {
+ field(DESC, "Fillpattern - String Define")
+ field(OMSL, "supervisory")
+ field(SIZV, "1000")
+ field(PINI, "YES")
+}
+
+record(waveform,"$(DEVICE):TARGET-BUCKET") {
+ field(DESC, "Fillpattern - current bucket of 0...480")
+ field(ASG, "PROTECTED")
+ field(FTVL, "FLOAT")
+ field(NELM, "480")
+ field(PINI, "YES")
+}
+
+record(waveform,"$(DEVICE):TARGET-FILLPATTERN") {
+ field(DESC, "Fillpattern reference plot")
+ field(ASG, "PROTECTED")
+ field(FTVL, "FLOAT")
+ field(NELM, "480")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):SETALL-DELAY") {
+ field(DESC, "Delay for setting all timings")
+ field(EGU, "seconds")
+ field(VAL, "0")
+ field(PREC, "5")
+ field(PINI, "YES")
+}
+
+record(int64out, "$(DEVICE):SETALL-ERROR") {
+ field(DESC, "Error counter for setting all timings")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+}
+
+record(bo,"$(DEVICE):ZERO-TARGET-BUCKET") {
+ field(DESC, "request target bucket 0")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo,"$(DEVICE):SYNC-BASE-DELAYS") {
+ field(DESC, "request base delay sync to master")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo,"$(DEVICE):GO") {
+ field(DESC, "pause/stop timing service callbacks")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CURRENT-THRESHOLD") {
+ field(DESC, "current above which fpfb is started")
+ field(ASG, "PROTECTED")
+ field(EGU, "mA")
+ field(VAL, "300")
+ field(PREC, "5")
+ field(PINI, "YES")
+}
+
+record(int64out, "$(DEVICE):FPFB-NTH") {
+ field(DESC, "n for every nth bucket fpfb mode")
+ field(ASG, "PROTECTED")
+ field(VAL, "2")
+ field(PINI, "YES")
+}
+
+record(mbbo, "$(DEVICE):FPFB-MODE") {
+ field(DESC, "choice of fpfb mode to use")
+ field(ASG, "PROTECTED")
+ field(ZRST, "Sorted BPM Measurement")
+ field(ONST, "Sorted APD Measurement")
+ field(TWST, "FPFB from Pedro via EPICS")
+ field(THST, "Every Nth Bucket")
+ field(PINI, "YES")
+ field(VAL, "0")
+}
\ No newline at end of file
diff --git a/services/timing/current/ioc/startup.script b/services/timing/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/timing/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/timing/current/qt/A_BD_Timing.ui b/services/timing/current/qt/A_BD_Timing.ui
new file mode 100644
index 0000000..596cb26
--- /dev/null
+++ b/services/timing/current/qt/A_BD_Timing.ui
@@ -0,0 +1,4571 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 750
+ 880
+
+
+
+
+
+
+ (Qt::Window | Qt::FramelessWindowHint);
+
+
+
+
+
+ 1390
+ 270
+ 70
+ 20
+
+
+
+
+
+
+ 1390
+ 210
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:TIMING-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 10
+ 20
+ 161
+ 31
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Fillpattern
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 10
+ 170
+ 431
+ 705
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 0
+ 10
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ GUN
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 100
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - LLE Master
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 10
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-GUN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 500.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 100
+ 210
+ 25
+
+
+
+ 6
+
+
+ 3
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-llemast
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 5.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 400
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Booster Inj Kicker
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 400
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINKI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 430
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Booster Inj Septum
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 430
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-BOINSE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 460
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXKI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 460
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Booster Ext Kicker
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 490
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-BOEXSE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 490
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Booster Ext Septum
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 550
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINSE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 550
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Ring Inj Septum
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 580
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Ring Inj 4 Kicker K1
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 520
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ ICT 4 (BRTL)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 520
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-BTRICT
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 190
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - Klystron 1
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 310
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - 3 GHz Scope
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 220
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - klystron 2
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 160
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - Preamp2
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 130
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - Preamp1
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 250
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - 3 GHz Qdm
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 340
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - Kly 1 PMU
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 280
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - 500 MHz_PBU
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 370
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Linac - Kly 2 PMU
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 220
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr2
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 310
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzScp
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 280
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-500-PBU
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 340
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly1PMU
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 190
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-klystr1
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 130
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp1
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 250
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-3GHzQdm
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 160
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-preamp2
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 370
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lirf-Kly2PMU
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 40
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ ICT 1 & 2 (Linac)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 610
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Ring Inj 4 Kicker K2
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 640
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Ring Inj 4 Kicker K3
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 0
+ 670
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ Ring Inj 4 Kicker K4
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 580
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK1
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 610
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK2
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 640
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK3
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 670
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-SRINK4
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ caSpinbox::User
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 0
+ 70
+ 200
+ 25
+
+
+
+
+ 14
+
+
+
+ ICT 3 (LTB)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 210
+ 40
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-ictone
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 210
+ 70
+ 210
+ 25
+
+
+
+ 6
+
+
+ 0
+
+
+ AGEBD-TIMING:CONTROL-ZERO-DELAY-lindi-icts23
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 10000000.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+
+ 480
+ 170
+ 260
+ 705
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 10
+ 10
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-GUN:CH1-DLY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 100
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-A1-LLE-CTR:MASTER-DELF
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 400
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR0:SETUP.OT1D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 430
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR0:SETUP.OT0D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 460
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OT1D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 520
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIDI-CECL-DIAG:EEVR-EVENT2-PULSE-DELAY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 490
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OT0D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 550
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OT2D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 580
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OT3D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 130
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT0D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 160
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT1D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 190
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT2D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 220
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT3D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 250
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT4D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 340
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OTAD
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 280
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT5D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 370
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OTCD
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 310
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-EVR2:SETUP.OT6D
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 40
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIDI-CECL-DIAG:EEVR-EVENT0-PULSE-DELAY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 1000000.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 610
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OTBD
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 640
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OTCD
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 670
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ABOMA-VME-KY-EVR1:SETUP.OTDD
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 70
+ 100
+ 25
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIDI-CECL-DIAG:EEVR-EVENT1-PULSE-DELAY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 1000000.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 120
+ 310
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 340
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 280
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 160
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 220
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 610
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 130
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 370
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 40
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 400
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 520
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 430
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 550
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 190
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 640
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 10
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 2 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 100
+ 151
+ 25
+
+
+
+
+ 14
+
+
+
+ in us, 4 ns res
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 460
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 670
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 250
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 70
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 580
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 120
+ 490
+ 131
+ 25
+
+
+
+
+ 14
+
+
+
+ in 8 ns ticks
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+
+ 10
+ 50
+ 411
+ 30
+
+
+
+
+ 9
+
+
+
+ space separated bucket ranges (e.g., 0-450) and single buckets
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::WidthAndHeight
+
+
+
+
+
+ 550
+ 10
+ 100
+ 60
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ALIRF-VME-A-GUN:CH1-DLY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 410
+ 10
+ 140
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Bucket
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 440
+ 170
+ 41
+ 705
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 10
+ 10
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-GUN
+
+
+
+
+
+ 10
+ 100
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-llemast
+
+
+
+
+
+ 10
+ 400
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-BOINKI
+
+
+
+
+
+ 10
+ 430
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-BOINSE
+
+
+
+
+
+ 10
+ 460
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXKI
+
+
+
+
+
+ 10
+ 490
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-BOEXSE
+
+
+
+
+
+ 10
+ 520
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-BTRICT
+
+
+
+
+
+ 10
+ 550
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-SRINSE
+
+
+
+
+
+ 10
+ 670
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK4
+
+
+
+
+
+ 10
+ 130
+ 30
+ 30
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp1
+
+
+
+
+
+ 10
+ 250
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzQdm
+
+
+
+
+
+ 10
+ 280
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-500-PBU
+
+
+
+
+
+ 10
+ 160
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-preamp2
+
+
+
+
+
+ 10
+ 220
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr2
+
+
+
+
+
+ 10
+ 310
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-3GHzScp
+
+
+
+
+
+ 10
+ 340
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly1PMU
+
+
+
+
+
+ 10
+ 190
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-klystr1
+
+
+
+
+
+ 10
+ 370
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lirf-Kly2PMU
+
+
+
+
+
+ 10
+ 40
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-ictone
+
+
+
+
+
+ 10
+ 70
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-lindi-icts23
+
+
+
+
+
+ 10
+ 640
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK3
+
+
+
+
+
+ 10
+ 610
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK2
+
+
+
+
+
+ 10
+ 580
+ 30
+ 25
+
+
+
+
+
+
+
+ 30
+ 30
+
+
+
+ false
+
+
+ AGEBD-TIMING:CONTROL-FLW-BCKT-SRINK1
+
+
+ catogglebutton_3
+ catogglebutton_6
+ catogglebutton_7
+ catogglebutton_10
+ catogglebutton_12
+ catogglebutton_15
+ catogglebutton_16
+ catogglebutton_19
+ catogglebutton_21
+ catogglebutton_23
+ catogglebutton_24
+ catogglebutton_28
+ catogglebutton_29
+ catogglebutton_32
+ catogglebutton_33
+ catogglebutton_34
+ catogglebutton_37
+ catogglebutton_2
+ catogglebutton
+ catogglebutton_5
+ catogglebutton_20
+ catogglebutton_22
+ catogglebutton_25
+
+
+
+
+ 571
+ 75
+ 80
+ 25
+
+
+
+
+ 13
+
+
+
+ Put Time
+
+
+ Qt::AlignCenter
+
+
+ ESimpleLabel::WidthAndHeight
+
+
+
+
+
+ 661
+ 80
+ 80
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TIMING:SETALL-DELAY
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 5
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 660
+ 105
+ 80
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TIMING:SETALL-ERROR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 400.000000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+ true
+
+
+
+ 570
+ 105
+ 80
+ 25
+
+
+
+
+ 12
+
+
+
+ > 150 ms
+
+
+ Qt::AlignCenter
+
+
+ ESimpleLabel::WidthAndHeight
+
+
+
+
+
+ 10
+ 80
+ 550
+ 45
+
+
+
+ AGEBD-TIMING:CONTROL-FILLPATTERN-string.VAL
+
+
+ 0
+
+
+ caLineEdit::User
+
+
+ caLineEdit::User
+
+
+ 479.000000000000000
+
+
+
+
+
+ 660
+ 40
+ 80
+ 30
+
+
+
+
+ 14
+
+
+
+ Reset
+
+
+ EPushButton::WidthAndHeight
+
+
+ AGEBD-TIMING:ZERO-TARGET-BUCKET
+
+
+ Reset
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+ 160
+ 160
+ 160
+
+
+
+ onoff
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 140
+ 81
+ 30
+
+
+
+
+ 16
+ 75
+ true
+
+
+
+ Follow
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 10
+ 140
+ 271
+ 30
+
+
+
+
+ 15
+ 75
+ true
+
+
+
+ Base Delays (Bucket 0)
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 490
+ 140
+ 241
+ 30
+
+
+
+
+ 15
+ 75
+ true
+
+
+
+ Changed EVR Delays
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 410
+ 50
+ 131
+ 20
+
+
+
+
+
+
+
+ 183
+ 157
+ 92
+
+
+
+ Timing Master
+
+
+ /ioc/modules/qt/A_GE_TI_MASTER_control_expert.ui
+
+
+ SYS=AGETI-CVME-MASTER,DEVICE=EVG0,TMA=TMA,DBUFF=DBUFF230,EVT=12,LINAC=ALIRF-VME-A,DEV_LINAC=EVR2,PM=ABOMA-VME-KY,DEV_PM1=EVR0,DEV_PM2=EVR1;stylefile=/sls/controls/config/qt/slses.qss
+
+
+ caRelatedDisplay::as_is
+
+
+
+
+
+ 310
+ 130
+ 70
+ 20
+
+
+
+ onoff
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 192
+ 192
+ 192
+
+
+
+ !A
+
+
+ AGEBD-ALH:TIMING-ONOFF
+
+
+
+
+
+ 660
+ 10
+ 80
+ 30
+
+
+
+
+ 14
+
+
+
+ Reset
+
+
+ EPushButton::WidthAndHeight
+
+
+ AGETI-CVME-MASTER-TMA:FP-Local-Reset-Bucket-SP
+
+
+ Reset
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+ 160
+ 160
+ 160
+
+
+
+ AGEBD-ALH:TIMING-ONOFF
+
+
+ 0
+
+
+ 1
+
+
+ frame
+ wmsignalpropagator
+ cacalc_2
+ calabel
+ frame_2
+ calabel_42
+ caLineEdit_35
+ calabel_43
+ frame_3
+ calabel_44
+ caLineEdit_47
+ caLineEdit_48
+ calabel_49
+ catextentry_5
+ camessagebutton_39
+ calabel_45
+ calabel_5
+ calabel_39
+ carelateddisplay_20
+ cacalc
+ camessagebutton_40
+
+
+
+
+ caRelatedDisplay
+ QWidget
+
+
+
+ caTextEntry
+ caLineEdit
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+ caSpinbox
+ QFrame
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 1220
+ 224
+
+
+ 1222
+ 277
+
+
+
+
+
diff --git a/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service b/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service
new file mode 100644
index 0000000..596bcec
--- /dev/null
+++ b/services/timing/current/systemd/AGEBD-SERVICE-TIMING.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-TIMING
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TIMING
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TIMING.service
+# systemctl --user start AGEBD-SERVICE-TIMING
diff --git a/services/tunebump/current/app/pyproject.toml b/services/tunebump/current/app/pyproject.toml
new file mode 100644
index 0000000..e1009e9
--- /dev/null
+++ b/services/tunebump/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-tunebump"
+version = "0.1.0"
+description = "AGEBD-TUNEBUMP Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/tunebump/current/app/src/agebd_tunebump/__init__.py b/services/tunebump/current/app/src/agebd_tunebump/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/tunebump/current/app/src/agebd_tunebump/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/tunebump/current/app/src/agebd_tunebump/main.py b/services/tunebump/current/app/src/agebd_tunebump/main.py
new file mode 100644
index 0000000..092188a
--- /dev/null
+++ b/services/tunebump/current/app/src/agebd_tunebump/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_tunebump import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "TUNEBUMP"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/tunebump/current/app/src/agebd_tunebump/service.py b/services/tunebump/current/app/src/agebd_tunebump/service.py
new file mode 100644
index 0000000..f39cf83
--- /dev/null
+++ b/services/tunebump/current/app/src/agebd_tunebump/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-TUNEBUMP:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-TUNEBUMP:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-TUNEBUMP:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/tunebump/current/app/tests/test_app.py b/services/tunebump/current/app/tests/test_app.py
new file mode 100644
index 0000000..ea2bb02
--- /dev/null
+++ b/services/tunebump/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_tunebump import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/tunebump/current/app/uv.lock b/services/tunebump/current/app/uv.lock
new file mode 100644
index 0000000..e28b4bb
--- /dev/null
+++ b/services/tunebump/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-tunebump"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs
new file mode 100644
index 0000000..8e9d768
--- /dev/null
+++ b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_main.subs
@@ -0,0 +1,4 @@
+file TUNEBUMP.template {
+ pattern { DEVICE }
+ { AGEBD-TUNEBUMP }
+}
\ No newline at end of file
diff --git a/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/tunebump/current/ioc/AGEBD-CPCL-TUNEBUMP_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/tunebump/current/ioc/TUNEBUMP.template b/services/tunebump/current/ioc/TUNEBUMP.template
new file mode 100644
index 0000000..b2bb298
--- /dev/null
+++ b/services/tunebump/current/ioc/TUNEBUMP.template
@@ -0,0 +1,493 @@
+####################################
+## USED BPMs
+####################################
+# HORIZONTAL ARS01-DBPM-0760 (Im FOFB)
+# ARS07-DBPM-0840 (BPMA)
+# ----------------------------------
+# VERTICAL ARS09-DBPM-0570 (Im FOFB)
+# ARS07-DBPM-5530 (BPMA)
+# ----------------------------------
+# LONGITUDINAL ARS02-DBPM-2910 (Im FOFB)
+#
+####################################
+
+
+record(bo, "$(DEVICE):WRITE2MAG") {
+ field(DESC, "Only print or apply setpoints")
+ field(VAL, "1")
+ field(PINI, "YES")
+}
+
+record(waveform,"$(DEVICE):CHANGELOG") {
+ field(DESC, "overview of to be applied changes")
+ field(FTVL, "UCHAR")
+ field(NELM, "$(SIZE=60000)")
+ field(PINI, "YES")
+}
+
+record(calcout, "$(DEVICE):CALLBACK"){
+ field(DESC, "1 if a tune step has been requested")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "A + B + C + D")
+ field(INPA, "$(DEVICE):QX-STEPUP")
+ field(INPB, "$(DEVICE):QX-STEPDOWN")
+ field(INPC, "$(DEVICE):QY-STEPUP")
+ field(INPD, "$(DEVICE):QY-STEPDOWN")
+}
+
+record(ao, "$(DEVICE):QX-STEPSIZE"){
+ field(DESC, "hor. tune step size, e.g. 0.0001")
+ field(VAL, "0.0001")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):QX-FIT"){
+ field(DESC, "hor. tune from fit")
+ field(VAL, "0.0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):QX-STEPUP"){
+ field(DESC, "request hor. tune step up")
+ field(FLNK, "$(DEVICE):CALLBACK")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(HIGH, "1")
+}
+
+record(bo, "$(DEVICE):QX-STEPDOWN"){
+ field(DESC, "request hor. tune step down")
+ field(FLNK, "$(DEVICE):CALLBACK")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(HIGH, "1")
+}
+
+record(ao, "$(DEVICE):QY-STEPSIZE"){
+ field(DESC, "ver. tune step size, e.g. 0.0001")
+ field(VAL, "0.0001")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):QY-FIT"){
+ field(DESC, "ver. tune from fit")
+ field(VAL, "0.0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):QY-STEPUP"){
+ field(DESC, "request ver. tune step up")
+ field(FLNK, "$(DEVICE):CALLBACK")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(HIGH, "1")
+}
+
+record(bo, "$(DEVICE):QY-STEPDOWN"){
+ field(DESC, "request ver. tune step down")
+ field(FLNK, "$(DEVICE):CALLBACK")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(HIGH, "1")
+}
+
+
+## spectra
+
+record (waveform, "$(DEVICE):SIGN-X"){
+ field (DESC, "Copy of ARS07-DBPM-0840:DAQ-BEAM-STG0-X")
+ field (FTVL, "FLOAT")
+ field (NELM, "16384")
+ field (INP, "ARS07-DBPM-0840:DAQ-BEAM-STG0-X CP MS")
+ field (FLNK, "$(DEVICE):SPEC-X")
+ field (PREC, "6")
+}
+
+record (waveform, "$(DEVICE):SPEC-X"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "FFT spsd")
+ field (NELM, "8193")
+ field (INP, "$(DEVICE):SIGN-X MS")
+ field (FLNK, "$(DEVICE):SPEC-FREQ-qX")
+ field (PREC, "3")
+}
+
+record(calcout, "$(DEVICE):OVERSAMPLE-2-qxVEC"){
+ field(DESC, "Sampling Rate")
+ field(CALC, "0.5 * A / (299792458 / 288 / 1000)")
+ field(INPA, "ARS07-DBPM-0840:DWC-STG0-RATE CP")
+ field(OUT, "$(DEVICE):SPEC-FREQ-qX.HOPR PP")
+}
+
+record (waveform, "$(DEVICE):SPEC-FREQ-qX"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "sequence")
+ field (NELM, "8193")
+ field (LOPR, "0")
+ field (HOPR, "0.5")
+ field (PREC, "3")
+ field (PINI, "YES")
+}
+
+record (waveform, "$(DEVICE):SIGN-Y"){
+ field (DESC, "Copy of ARS07-DBPM-5530:DAQ-BEAM-STG0-Y")
+ field (FTVL, "FLOAT")
+ field (NELM, "16384")
+ field (INP, "ARS07-DBPM-5530:DAQ-BEAM-STG0-Y CP MS")
+ field (FLNK, "$(DEVICE):SPEC-Y")
+ field (PREC, "6")
+}
+
+record (waveform, "$(DEVICE):SPEC-Y"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "FFT spsd")
+ field (NELM, "8192")
+ field (INP, "$(DEVICE):SIGN-Y MS")
+ field (FLNK, "$(DEVICE):SPEC-FREQ-qY")
+ field (PREC, "3")
+}
+
+record(calcout, "$(DEVICE):OVERSAMPLE-2-qYVEC"){
+ field(DESC, "Sampling Rate")
+ field(CALC, "0.5 * A / (299792458 / 288 / 1000)")
+ field(INPA, "ARS07-DBPM-5530:DWC-STG0-RATE CP")
+ field(OUT, "$(DEVICE):SPEC-FREQ-qY.HOPR PP")
+}
+
+record (waveform, "$(DEVICE):SPEC-FREQ-qY"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "sequence")
+ field (NELM, "8192")
+ field (LOPR, "0")
+ field (HOPR, "0.5")
+ field (PREC, "3")
+ field (PINI, "YES")
+}
+
+record (waveform, "$(DEVICE):SIGN-Z"){
+ field (DESC, "Copy of ARS02-DBPM-2910:DAQ-BEAM-STG1-X")
+ field (FTVL, "FLOAT")
+ field (NELM, "16384")
+ field (INP, "ARS02-DBPM-2910:DAQ-BEAM-STG1-X CP MS")
+ field (FLNK, "$(DEVICE):SPEC-Z")
+ field (PREC, "6")
+}
+
+record (waveform, "$(DEVICE):SPEC-Z"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "FFT spsd")
+ field (NELM, "8192")
+ field (INP, "$(DEVICE):SIGN-Z MS")
+ field (FLNK, "$(DEVICE):SPEC-FREQ-qZ")
+ field (PREC, "3")
+}
+
+record(calcout, "$(DEVICE):OVERSAMPLE-2-qZVEC"){
+ field(DESC, "Sampling Rate")
+ field(CALC, "0.5 * A / (299792458 / 288 / 1000)")
+ field(INPA, "ARS02-DBPM-2910:DWC-STG1-RATE CP")
+ field(OUT, "$(DEVICE):SPEC-FREQ-qZ.HOPR PP")
+}
+
+record (waveform, "$(DEVICE):SPEC-FREQ-qZ"){
+ field (FTVL, "FLOAT")
+ field (DTYP, "sequence")
+ field (NELM, "8192")
+ field (LOPR, "0")
+ field (HOPR, "0.5")
+ field (PREC, "3")
+ field (PINI, "YES")
+}
+
+record(ao, "$(DEVICE):REF-QX") {
+ field(DESC, "PV for the hor. reference tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(VAL, "39.37")
+}
+
+record(ao, "$(DEVICE):QX") {
+ field(DESC, "PV for the measured hor. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QX-FREQ")
+ field(HIHI, "0.40")
+ field(HHSV, "MAJOR")
+ field(HIGH, "0.38")
+ field(HSV, "MINOR")
+ field(LOW, "0.36")
+ field(LSV, "MINOR")
+ field(LOLO, "0.34")
+ field(LLSV, "MAJOR")
+}
+
+record(calcout, "$(DEVICE):QX-FREQ") {
+ field(DESC, "Freq hor. tune")
+ field(EGU, "kHz")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "A * B / 480 / 1000")
+ field(INPA, "$(DEVICE):QX")
+ field(INPB, "AGERF-MO01:FREQ-GET")
+}
+
+record(ao, "$(DEVICE):QX-SB1") {
+ field(DESC, "PV for the measured hor. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QX-SB1-DIFF")
+}
+
+record(calcout, "$(DEVICE):QX-SB1-DIFF") {
+ field(DESC, "PV for the measured hor. tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "ABS(A - B)")
+ field(INPA, "$(DEVICE):QX")
+ field(INPB, "$(DEVICE):QX-SB1")
+}
+
+record(ao, "$(DEVICE):QX-SB2") {
+ field(DESC, "PV for the measured hor. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QX-SB2-DIFF")
+}
+
+record(calcout, "$(DEVICE):QX-SB2-DIFF") {
+ field(DESC, "PV for the measured hor. tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "ABS(A - B)")
+ field(INPA, "$(DEVICE):QX")
+ field(INPB, "$(DEVICE):QX-SB2")
+}
+
+record(ao, "$(DEVICE):QX-ULIM") {
+ field(DESC, "upper limit qx search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.44")
+}
+record(ao, "$(DEVICE):QX-LLIM") {
+ field(DESC, "lower limit qx search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.30")
+}
+
+record(waveform, "$(DEVICE):NORM-QX-AMP") {
+ field(DESC, "normalized, hor. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):NORM-QX-FREQ") {
+ field(DESC, "normalized, hor. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QX-PEAKS-FREQ") {
+ field(DESC, "peaks in hor. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QX-PEAKS") {
+ field(DESC, "peaks in hor. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(ao, "$(DEVICE):REF-QY") {
+ field(DESC, "PV for the ver. reference tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(VAL, "15.22")
+}
+
+record(ao, "$(DEVICE):QY") {
+ field(DESC, "PV for the measured ver. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QY-FREQ")
+ field(HIHI, "0.25")
+ field(HHSV, "MAJOR")
+ field(HIGH, "0.23")
+ field(HSV, "MINOR")
+ field(LOW, "0.21")
+ field(LSV, "MINOR")
+ field(LOLO, "0.19")
+ field(LLSV, "MAJOR")
+}
+
+record(calcout, "$(DEVICE):QY-FREQ") {
+ field(DESC, "Freq ver. tune")
+ field(EGU, "kHz")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "A * B / 480 / 1000")
+ field(INPA, "$(DEVICE):QY")
+ field(INPB, "AGERF-MO01:FREQ-GET")
+}
+
+record(ao, "$(DEVICE):QY-SB1") {
+ field(DESC, "PV for the measured ver. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QY-SB1-DIFF")
+}
+
+record(calcout, "$(DEVICE):QY-SB1-DIFF") {
+ field(DESC, "PV for the measured ver. tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "ABS(A - B)")
+ field(INPA, "$(DEVICE):QY")
+ field(INPB, "$(DEVICE):QY-SB1")
+}
+
+record(ao, "$(DEVICE):QY-SB2") {
+ field(DESC, "PV for the measured ver. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QY-SB2-DIFF")
+}
+
+record(calcout, "$(DEVICE):QY-SB2-DIFF") {
+ field(DESC, "PV for the measured ver. tune")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "ABS(A - B)")
+ field(INPA, "$(DEVICE):QY")
+ field(INPB, "$(DEVICE):QY-SB2")
+}
+
+record(ao, "$(DEVICE):QY-ULIM") {
+ field(DESC, "upper limit qy search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.29")
+}
+record(ao, "$(DEVICE):QY-LLIM") {
+ field(DESC, "lower limit qy search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.15")
+}
+
+record(waveform, "$(DEVICE):NORM-QY-AMP") {
+ field(DESC, "normalized, ver. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):NORM-QY-FREQ") {
+ field(DESC, "normalized, ver. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QY-PEAKS-FREQ") {
+ field(DESC, "peaks in ver. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QY-PEAKS") {
+ field(DESC, "peaks in ver. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(ao, "$(DEVICE):REF-QZ") {
+ field(DESC, "PV for the long. reference tune, no 3HC")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(VAL, "0.0027")
+}
+
+record(ao, "$(DEVICE):QZ") {
+ field(DESC, "PV for the measured long. tune")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QZ-FREQ")
+ field(HIHI, "0.004")
+ field(HHSV, "MAJOR")
+ field(HIGH, "0.003")
+ field(HSV, "MINOR")
+ field(LOW, "0.001")
+ field(LSV, "MINOR")
+ field(LOLO, "0.0005")
+ field(LLSV, "MAJOR")
+}
+
+record(calcout, "$(DEVICE):QZ-FREQ") {
+ field(DESC, "Freq ver. tune")
+ field(EGU, "kHz")
+ field(PREC, "3")
+ field(ASG, "READONLY")
+ field(PINI, "YES")
+ field(VAL, "0")
+ field(CALC, "A * B / 480 / 1000")
+ field(INPA, "$(DEVICE):QZ")
+ field(INPB, "AGERF-MO01:FREQ-GET")
+}
+
+record(ao, "$(DEVICE):QZ-ULIM") {
+ field(DESC, "upper limit qz search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.0025")
+}
+record(ao, "$(DEVICE):QZ-LLIM") {
+ field(DESC, "lower limit qz search range")
+ field(PREC, "3")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.0005")
+}
+
+record(waveform, "$(DEVICE):NORM-QZ-AMP") {
+ field(DESC, "normalized, long. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):NORM-QZ-FREQ") {
+ field(DESC, "normalized, long. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QZ-PEAKS-FREQ") {
+ field(DESC, "peaks in long. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(waveform, "$(DEVICE):QZ-PEAKS") {
+ field(DESC, "peaks in long. spectrum")
+ field(NELM, "8192")
+ field(FTVL, "FLOAT")
+}
+
+record(bo, "$(DEVICE):MEAS-VALID") {
+ field(DESC, "reflects validity of tune measurement")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
\ No newline at end of file
diff --git a/services/tunebump/current/ioc/startup.script b/services/tunebump/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/tunebump/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/tunebump/current/qt/A_BD_TuneBump.ui b/services/tunebump/current/qt/A_BD_TuneBump.ui
new file mode 100644
index 0000000..22fe977
--- /dev/null
+++ b/services/tunebump/current/qt/A_BD_TuneBump.ui
@@ -0,0 +1,6779 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 605
+ 960
+
+
+
+ MainWindow
+
+
+ /*################################################*/
+/*# Settings for new templates/forms #*/
+/*################################################*/
+QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{
+ background: rgba(236, 236, 236, 255);
+}
+
+QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{
+ background: rgba(0, 0, 0, 0);
+}
+
+/*-----------------------------------------------*/
+/* Title */
+/*-----------------------------------------------*/
+/* Operation panels */
+caLabel[statusTip="Operation"]{
+ color: rgba(0, 0, 0, 255);
+ font: bold 18pt;
+ font-family: Sans Serif;
+ padding: 1px;
+ margin: 0px;
+ qproperty-alignment: AlignLeft;
+ qproperty-frameShape: StyledPanel;
+ /*qproperty-geometry: rect(-2 0 1600 33);*/
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(218, 218, 218, 255),
+ stop:0.5 rgba(200, 200, 200, 255),
+ stop:1 rgba(218, 218, 218, 255));
+}
+
+ QGroupBox {
+ background: rgba(225,225,225,255);
+ border: 2px solid black;
+ border-radius: 5px;
+ margin-top: 1ex; /* leave space at the top for the title */
+ }
+
+
+
+
+
+ 810
+ 120
+ 70
+ 20
+
+
+
+
+
+
+ 810
+ 60
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:TUNEBUMP-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 340
+ 60
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 390
+ 60
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QX-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 160
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QY-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 35
+ 150
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Step Size
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 340
+ 160
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 10
+ 60
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qx
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 160
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qy
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 550
+ 160
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 547
+ 60
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 0
+ 0
+ 600
+ 32
+
+
+
+
+ Sans Serif
+ 18
+ 75
+ false
+ true
+
+
+
+ Operation
+
+
+ Tune Shift
+
+
+ Qt::AlignLeading
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ caLabel::Default
+
+
+
+
+
+ 0
+ 300
+ 605
+ 660
+
+
+
+ 0
+
+
+
+ Meas
+
+
+
+
+ 5
+ 210
+ 590
+ 200
+
+
+
+ Vertical Tune (nominal: Qy = 15.22)
+
+
+ AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 415
+ 590
+ 200
+
+
+
+ Synchrotron Tune (nominal: 0.0027)
+
+
+ AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ false
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 5
+ 590
+ 200
+
+
+
+ Horizontal Tune (nominal: Qx = 39.37)
+
+
+ AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+
+
+
+ false
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ FFT
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Tune Z
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ 10
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Tune Y
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Tune X
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+ 0:1
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ Raw
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Vertical TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Longitudinal Stage 1 Data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Horizontal TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ Settings
+
+
+
+
+ 10
+ 260
+ 371
+ 51
+
+
+
+
+ 19
+ 75
+ true
+
+
+
+ Pinger Settings (ca. 10 A)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 440
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0320:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0290:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 160
+ 490
+ 291
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Enable Energy Stabelization:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 10
+ 450
+ 581
+ 30
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Defined by FOFB Mean Horizontal Corrector Integral Setpoint:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 250
+ 530
+ 110
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Alarm_Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 30
+ 490
+ 110
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 1.000000000000000
+
+
+ -1.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 40
+
+
+
+
+ 24
+ 75
+ true
+
+
+
+ Qx Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 130
+ 400
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Qy Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 440
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 440
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 140
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 320
+ 121
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ Horizontal
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 320
+ 121
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ Vertical
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 390
+ 371
+ 51
+
+
+
+
+ 22
+ 75
+ true
+
+
+
+ Beam Energy Setpoint
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 450
+ 490
+ 31
+ 30
+
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN
+
+
+
+
+
+ 160
+ 530
+ 91
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ ERROR:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ BPMs
+
+
+
+
+ 10
+ 20
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 140
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 270
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Longitudinal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 10
+ 180
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Y.INP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 60
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-X.INP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 310
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Z.INP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+
+
+
+ FeedBack QX
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 23
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBX:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CONTROL-QX-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBX:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBX:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 30
+ 30
+
+
+
+ true
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Feedback QY
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QY
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CONTROL-QY-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBY:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 33
+ 30
+
+
+
+ true
+
+
+ 18
+
+
+ 18
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBY:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBY:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Debug
+
+
+
+
+ 250
+ 20
+ 31
+ 30
+
+
+
+ AGEBD-TUNEBUMP:WRITE2MAG
+
+
+
+
+
+ 10
+ 20
+ 231
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Apply MQCO Setpoints
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 4
+ 50
+ 595
+ 575
+
+
+
+
+ Monospace
+ 10
+ PreferDefault
+
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ AGEBD-TUNEBUMP:CHANGELOG
+
+
+ caMultiLineString::None
+
+
+
+
+
+
+
+ 60
+ 60
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 60
+ 160
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 100
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 130
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 380
+ 100
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 130
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 200
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 200
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 230
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 110
+ 230
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 60
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-FREQ
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 160
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-FREQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 260
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qz
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 60
+ 260
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 260
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ-FREQ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 340
+ 60
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+
+
+
+ 340
+ 160
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ calabel_3
+ wmsignalpropagator
+ cacalc_2
+ camessagebutton_14
+ caspinbox
+ caspinbox_2
+ calabel_12
+ camessagebutton_15
+ calabel_13
+ calabel_14
+ camessagebutton_16
+ camessagebutton_17
+ tabWidget
+ caLineEdit_39
+ caLineEdit_40
+ calabel_18
+ caLineEdit_43
+ caLineEdit_45
+ calabel_19
+ caLineEdit_48
+ caLineEdit_49
+ calabel_20
+ calabel_21
+ calabel_22
+ caLineEdit_44
+ calabel_23
+ calabel_24
+ calabel_25
+ caLineEdit_50
+ caLineEdit_46
+ caLineEdit_51
+ caLineEdit_42
+ caLineEdit_54
+ calabel_33
+ caLineEdit_55
+ caLineEdit_56
+ calabel
+ calabel_2
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+ caSpinbox
+ QFrame
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caMultiLineString
+ QPlainTextEdit
+
+
+
+ caCartesianPlot
+ QwtPlot
+
+
+
+ caStripPlot
+ QwtPlot
+
+ 1
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ QwtPlot
+ QFrame
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 598
+ 89
+
+
+ 608
+ 152
+
+
+
+
+
diff --git a/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service b/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service
new file mode 100644
index 0000000..09eeef8
--- /dev/null
+++ b/services/tunebump/current/systemd/AGEBD-SERVICE-TUNEBUMP.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-TUNEBUMP
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEBUMP
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEBUMP.service
+# systemctl --user start AGEBD-SERVICE-TUNEBUMP
diff --git a/services/tunefbx/current/app/pyproject.toml b/services/tunefbx/current/app/pyproject.toml
new file mode 100644
index 0000000..04d77bf
--- /dev/null
+++ b/services/tunefbx/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-tunefbx"
+version = "0.1.0"
+description = "AGEBD-TUNEFBX Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py b/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/tunefbx/current/app/src/agebd_tunefbx/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/main.py b/services/tunefbx/current/app/src/agebd_tunefbx/main.py
new file mode 100644
index 0000000..a589168
--- /dev/null
+++ b/services/tunefbx/current/app/src/agebd_tunefbx/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_tunefbx import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "TUNEFBX"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/tunefbx/current/app/src/agebd_tunefbx/service.py b/services/tunefbx/current/app/src/agebd_tunefbx/service.py
new file mode 100644
index 0000000..9e58ff5
--- /dev/null
+++ b/services/tunefbx/current/app/src/agebd_tunefbx/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-TUNEFBX:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-TUNEFBX:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-TUNEFBX:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/tunefbx/current/app/tests/test_app.py b/services/tunefbx/current/app/tests/test_app.py
new file mode 100644
index 0000000..b0158a0
--- /dev/null
+++ b/services/tunefbx/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_tunefbx import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/tunefbx/current/app/uv.lock b/services/tunefbx/current/app/uv.lock
new file mode 100644
index 0000000..f4a9ae0
--- /dev/null
+++ b/services/tunefbx/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-tunefbx"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs
new file mode 100644
index 0000000..3e0664b
--- /dev/null
+++ b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_main.subs
@@ -0,0 +1,4 @@
+file TUNEFBX.template {
+ pattern { DEVICE }
+ { AGEBD-TUNEFBX }
+}
\ No newline at end of file
diff --git a/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/tunefbx/current/ioc/AGEBD-CPCL-TUNEFBX_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/tunefbx/current/ioc/TUNEFBX.template b/services/tunefbx/current/ioc/TUNEFBX.template
new file mode 100644
index 0000000..b11ca9a
--- /dev/null
+++ b/services/tunefbx/current/ioc/TUNEFBX.template
@@ -0,0 +1,185 @@
+record(ao, "$(DEVICE):CONTROL-KP") {
+ field(DESC, "PID Proportional Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-KI") {
+ field(DESC, "PID Integral Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-KD") {
+ field(DESC, "PID Derivative Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QX") {
+ field(DESC, "PID Setpoint for QX")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.37")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QX-OKRNG") {
+ field(DESC, "PID THRESHOLD")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.0005")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QXMIN") {
+ field(DESC, "PID LOWER LIMIT")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.31")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QXMAX") {
+ field(DESC, "PID UPPER LIMIT")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.43")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-MIN-CURR") {
+ field(DESC, "PID MIN CURR")
+ field(ASG, "PROTECTED")
+ field(VAL, "400")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ") {
+ field(DESC, "PID SETPOINT for archive")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ-ULIM") {
+ field(DESC, "PID SETPOINT upper limit")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "0.001")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ-LLIM") {
+ field(DESC, "PID SETPOINT lower limit")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "-0.001")
+ field(PINI, "YES")
+}
+
+record(calc, "$(DEVICE):QSTEPS") {
+ field(DESC, "PID SETPOINT accumulated")
+ field(ASG, "READONLY")
+ field(PREC, "4")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(CALC, "VAL + A")
+ field(INPA, "$(DEVICE):DELTAQ")
+}
+
+record(bo, "$(DEVICE):CHECK1") {
+ field(DESC, "measured tune realistic")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK2") {
+ field(DESC, "measured tune okrng")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK3") {
+ field(DESC, "injection not active")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK4") {
+ field(DESC, "current above min")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK5") {
+ field(DESC, "tune bpm config")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK6") {
+ field(DESC, "pingers on")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK7") {
+ field(DESC, "dt corresponds to 3.125 Hz")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK8") {
+ field(DESC, "calculated step within limits")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(calc, "$(DEVICE):CHECKALL") {
+ field(DESC, "Check SUM, written by IOC")
+ field(ASG, "READONLY")
+ field(LOLO, "0.1")
+ field(LLSV, "MINOR")
+ field(CALC, "A & B & C & D & E & F & G & H")
+ field(INPA, "$(DEVICE):CHECK1")
+ field(INPB, "$(DEVICE):CHECK2")
+ field(INPC, "$(DEVICE):CHECK3")
+ field(INPD, "$(DEVICE):CHECK4")
+ field(INPE, "$(DEVICE):CHECK5")
+ field(INPF, "$(DEVICE):CHECK6")
+ field(INPG, "$(DEVICE):CHECK7")
+ field(INPH, "$(DEVICE):CHECK8")
+}
\ No newline at end of file
diff --git a/services/tunefbx/current/ioc/startup.script b/services/tunefbx/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/tunefbx/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/tunefbx/current/qt/A_BD_TuneBump.ui b/services/tunefbx/current/qt/A_BD_TuneBump.ui
new file mode 100644
index 0000000..22fe977
--- /dev/null
+++ b/services/tunefbx/current/qt/A_BD_TuneBump.ui
@@ -0,0 +1,6779 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 605
+ 960
+
+
+
+ MainWindow
+
+
+ /*################################################*/
+/*# Settings for new templates/forms #*/
+/*################################################*/
+QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{
+ background: rgba(236, 236, 236, 255);
+}
+
+QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{
+ background: rgba(0, 0, 0, 0);
+}
+
+/*-----------------------------------------------*/
+/* Title */
+/*-----------------------------------------------*/
+/* Operation panels */
+caLabel[statusTip="Operation"]{
+ color: rgba(0, 0, 0, 255);
+ font: bold 18pt;
+ font-family: Sans Serif;
+ padding: 1px;
+ margin: 0px;
+ qproperty-alignment: AlignLeft;
+ qproperty-frameShape: StyledPanel;
+ /*qproperty-geometry: rect(-2 0 1600 33);*/
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(218, 218, 218, 255),
+ stop:0.5 rgba(200, 200, 200, 255),
+ stop:1 rgba(218, 218, 218, 255));
+}
+
+ QGroupBox {
+ background: rgba(225,225,225,255);
+ border: 2px solid black;
+ border-radius: 5px;
+ margin-top: 1ex; /* leave space at the top for the title */
+ }
+
+
+
+
+
+ 810
+ 120
+ 70
+ 20
+
+
+
+
+
+
+ 810
+ 60
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:TUNEBUMP-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 340
+ 60
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 390
+ 60
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QX-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 160
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QY-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 35
+ 150
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Step Size
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 340
+ 160
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 10
+ 60
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qx
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 160
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qy
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 550
+ 160
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 547
+ 60
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 0
+ 0
+ 600
+ 32
+
+
+
+
+ Sans Serif
+ 18
+ 75
+ false
+ true
+
+
+
+ Operation
+
+
+ Tune Shift
+
+
+ Qt::AlignLeading
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ caLabel::Default
+
+
+
+
+
+ 0
+ 300
+ 605
+ 660
+
+
+
+ 0
+
+
+
+ Meas
+
+
+
+
+ 5
+ 210
+ 590
+ 200
+
+
+
+ Vertical Tune (nominal: Qy = 15.22)
+
+
+ AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 415
+ 590
+ 200
+
+
+
+ Synchrotron Tune (nominal: 0.0027)
+
+
+ AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ false
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 5
+ 590
+ 200
+
+
+
+ Horizontal Tune (nominal: Qx = 39.37)
+
+
+ AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+
+
+
+ false
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ FFT
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Tune Z
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ 10
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Tune Y
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Tune X
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+ 0:1
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ Raw
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Vertical TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Longitudinal Stage 1 Data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Horizontal TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ Settings
+
+
+
+
+ 10
+ 260
+ 371
+ 51
+
+
+
+
+ 19
+ 75
+ true
+
+
+
+ Pinger Settings (ca. 10 A)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 440
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0320:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0290:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 160
+ 490
+ 291
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Enable Energy Stabelization:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 10
+ 450
+ 581
+ 30
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Defined by FOFB Mean Horizontal Corrector Integral Setpoint:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 250
+ 530
+ 110
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Alarm_Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 30
+ 490
+ 110
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 1.000000000000000
+
+
+ -1.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 40
+
+
+
+
+ 24
+ 75
+ true
+
+
+
+ Qx Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 130
+ 400
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Qy Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 440
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 440
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 140
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 320
+ 121
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ Horizontal
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 320
+ 121
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ Vertical
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 390
+ 371
+ 51
+
+
+
+
+ 22
+ 75
+ true
+
+
+
+ Beam Energy Setpoint
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 450
+ 490
+ 31
+ 30
+
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN
+
+
+
+
+
+ 160
+ 530
+ 91
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ ERROR:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ BPMs
+
+
+
+
+ 10
+ 20
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 140
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 270
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Longitudinal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 10
+ 180
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Y.INP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 60
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-X.INP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 310
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Z.INP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+
+
+
+ FeedBack QX
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 23
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBX:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CONTROL-QX-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBX:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBX:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 30
+ 30
+
+
+
+ true
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Feedback QY
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QY
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CONTROL-QY-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBY:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 33
+ 30
+
+
+
+ true
+
+
+ 18
+
+
+ 18
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBY:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBY:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Debug
+
+
+
+
+ 250
+ 20
+ 31
+ 30
+
+
+
+ AGEBD-TUNEBUMP:WRITE2MAG
+
+
+
+
+
+ 10
+ 20
+ 231
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Apply MQCO Setpoints
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 4
+ 50
+ 595
+ 575
+
+
+
+
+ Monospace
+ 10
+ PreferDefault
+
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ AGEBD-TUNEBUMP:CHANGELOG
+
+
+ caMultiLineString::None
+
+
+
+
+
+
+
+ 60
+ 60
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 60
+ 160
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 100
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 130
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 380
+ 100
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 130
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 200
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 200
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 230
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 110
+ 230
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 60
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-FREQ
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 160
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-FREQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 260
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qz
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 60
+ 260
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 260
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ-FREQ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 340
+ 60
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+
+
+
+ 340
+ 160
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ calabel_3
+ wmsignalpropagator
+ cacalc_2
+ camessagebutton_14
+ caspinbox
+ caspinbox_2
+ calabel_12
+ camessagebutton_15
+ calabel_13
+ calabel_14
+ camessagebutton_16
+ camessagebutton_17
+ tabWidget
+ caLineEdit_39
+ caLineEdit_40
+ calabel_18
+ caLineEdit_43
+ caLineEdit_45
+ calabel_19
+ caLineEdit_48
+ caLineEdit_49
+ calabel_20
+ calabel_21
+ calabel_22
+ caLineEdit_44
+ calabel_23
+ calabel_24
+ calabel_25
+ caLineEdit_50
+ caLineEdit_46
+ caLineEdit_51
+ caLineEdit_42
+ caLineEdit_54
+ calabel_33
+ caLineEdit_55
+ caLineEdit_56
+ calabel
+ calabel_2
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+ caSpinbox
+ QFrame
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caMultiLineString
+ QPlainTextEdit
+
+
+
+ caCartesianPlot
+ QwtPlot
+
+
+
+ caStripPlot
+ QwtPlot
+
+ 1
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ QwtPlot
+ QFrame
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 598
+ 89
+
+
+ 608
+ 152
+
+
+
+
+
diff --git a/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service b/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service
new file mode 100644
index 0000000..84b2c61
--- /dev/null
+++ b/services/tunefbx/current/systemd/AGEBD-SERVICE-TUNEFBX.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-TUNEFBX
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEFBX
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEFBX.service
+# systemctl --user start AGEBD-SERVICE-TUNEFBX
diff --git a/services/tunefby/current/app/pyproject.toml b/services/tunefby/current/app/pyproject.toml
new file mode 100644
index 0000000..b3dd565
--- /dev/null
+++ b/services/tunefby/current/app/pyproject.toml
@@ -0,0 +1,47 @@
+[project]
+name = "agebd-tunefby"
+version = "0.1.0"
+description = "AGEBD-TUNEFBY Service"
+requires-python = "==3.10.*"
+dependencies = [
+ "agebd",
+]
+
+[dependency-groups]
+dev = [
+ "pyepics>=3.5.8",
+ "pytest>=8.4.2",
+ "ruff>=0.15.20",
+]
+
+[tool.uv.sources]
+# Path is relative to where agebd package is deployed on hla
+# machines (see CI/CD in .gitea/workflows)
+agebd = { path = "../../../../packages/agebd", editable = true }
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[tool.uv]
+package = true
+
+[tool.pytest.ini_options]
+pythonpath = ["src"]
+env = [
+ "AGEBD_ENV=local",
+]
+
+[tool.ruff]
+include = [
+ "src/**/*.py",
+ "tests/**/*.py",
+]
+line-length = 100
+
+[tool.ruff.lint]
+# use isort to sort imports
+extend-select = ["I"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["agebd"]
diff --git a/services/tunefby/current/app/src/agebd_tunefby/__init__.py b/services/tunefby/current/app/src/agebd_tunefby/__init__.py
new file mode 100644
index 0000000..1800c27
--- /dev/null
+++ b/services/tunefby/current/app/src/agebd_tunefby/__init__.py
@@ -0,0 +1 @@
+from .service import PVs, Service
diff --git a/services/tunefby/current/app/src/agebd_tunefby/main.py b/services/tunefby/current/app/src/agebd_tunefby/main.py
new file mode 100644
index 0000000..ff69b86
--- /dev/null
+++ b/services/tunefby/current/app/src/agebd_tunefby/main.py
@@ -0,0 +1,31 @@
+import typer
+
+from agebd.enums import LogLevel
+from agebd.runner import CallbackRunner
+from agebd.utils import init_logging
+from agebd_tunefby import PVs, Service
+
+
+# TODO: remove: cicd test 10
+
+def main(
+ log_level: LogLevel = typer.Option(
+ LogLevel.INFO,
+ "--log-level",
+ "-l",
+ # Looks at the OS env variable first. If empty, falls back to "INFO"
+ envvar="AGEBD_LOG_LEVEL",
+ # help="Set log level: DEBUG, INFO, WARNING, ERROR, CRITICAL",
+ case_sensitive=False,
+ ),
+):
+ init_logging(log_level)
+ service_name = "TUNEFBY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ runner = CallbackRunner(service=service)
+ runner.start()
+
+
+if __name__ == "__main__":
+ typer.run(main)
diff --git a/services/tunefby/current/app/src/agebd_tunefby/service.py b/services/tunefby/current/app/src/agebd_tunefby/service.py
new file mode 100644
index 0000000..736310e
--- /dev/null
+++ b/services/tunefby/current/app/src/agebd_tunefby/service.py
@@ -0,0 +1,93 @@
+import time
+
+from epics import dbr
+
+from agebd.pv import LocalPVLink
+from agebd.service.base import BaseService
+from agebd.service.pvs import BasePVs
+from agebd.utils import printgetversion
+from agebd.pv import get_pv_class
+
+__version__ = printgetversion(__file__)
+
+PV = get_pv_class()
+
+
+class PVs(BasePVs):
+ # Option 1:
+ ## Service specific PVs from dedicated IOC
+ my_pv1 = PV("AGEBD-TUNEFBY:AO") # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ def __init__(self, service_name: str, pv_factory=PV):
+ super().__init__(service_name, pv_factory)
+ PV = pv_factory
+
+ # TODO: can we do this cleaner? Maybe mechanism for
+ # settings initial values in dev mode (e.g. ini file)
+ if isinstance(self.onoff, LocalPVLink):
+ self.onoff.value = True
+
+ # Option 2:
+ ## Service specific PVs from dedicated IOC
+ self.my_pv2 = PV(
+ "AGEBD-TUNEFBY:BO"
+ ) # TODO: is this a good PV to use?
+
+ ## Service specific PVs from other IOCs
+ # ...
+
+ # TODO: class attribute names usually lowercase
+ # usually it is advisable to trigger the mainloop of a service on changes of certain PVs:
+ self.CallbackPV = PV(
+ "AGEBD-TUNEFBY:CALLBACK", auto_monitor=dbr.DBE_VALUE
+ ) # TODO: ok?
+
+
+class Service(BaseService[PVs]):
+ def __init__(
+ self,
+ name: str,
+ pvs: PVs,
+ version: str = __version__,
+ sleep_interval: float = 0.1,
+ ):
+ super().__init__(name, pvs, version, sleep_interval)
+
+ # TODO: What is this for?
+ self.path = "sls/bd/bin"
+
+ def update(self):
+ # when callback is fired, this code will be executed
+ if self.CallbackFired:
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running when the callback is fired
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
+
+ # callback done
+ self.CallbackFired = 0
+
+ #######################################################################################
+ #######################################################################################
+ # here goes all the code that your service
+ # is supposed to be running in any case, e.g.,
+
+ # update some pvs/vals
+ my_pv1_random_val = str(time.clock_gettime_ns(0))[-1]
+ self.pvs.my_pv1.put(my_pv1_random_val)
+ # self.pvs.my_pv2.put("MY_PV2 value")
+
+ # get some pvs/vals
+ self.val1 = self.pvs.my_pv1.get()
+ self.val2 = self.pvs.my_pv2.get()
+
+ # maybe sleep to limit the update loop execution rate
+ time.sleep(1)
+ #######################################################################################
+ #######################################################################################
diff --git a/services/tunefby/current/app/tests/test_app.py b/services/tunefby/current/app/tests/test_app.py
new file mode 100644
index 0000000..d8727c2
--- /dev/null
+++ b/services/tunefby/current/app/tests/test_app.py
@@ -0,0 +1,9 @@
+from agebd_tunefby import PVs, Service
+
+
+def test_app():
+ service_name = "DUMMY"
+ pvs = PVs(service_name=service_name)
+ service = Service(name=service_name, pvs=pvs)
+ service.CallbackFired = 1
+ service.update()
diff --git a/services/tunefby/current/app/uv.lock b/services/tunefby/current/app/uv.lock
new file mode 100644
index 0000000..c79326d
--- /dev/null
+++ b/services/tunefby/current/app/uv.lock
@@ -0,0 +1,275 @@
+version = 1
+revision = 3
+requires-python = "==3.10.*"
+
+[[package]]
+name = "agebd"
+version = "0.1.0"
+source = { editable = "../../../../packages/agebd" }
+dependencies = [
+ { name = "typer" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "typer", specifier = ">=0.23.2" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyright", specifier = ">=1.1.410" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.19" },
+]
+
+[[package]]
+name = "agebd-tunefby"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "agebd" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "pyepics" },
+ { name = "pytest" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "agebd", editable = "../../../../packages/agebd" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "pyepics", specifier = ">=3.5.8" },
+ { name = "pytest", specifier = ">=8.4.2" },
+ { name = "ruff", specifier = ">=0.15.20" },
+]
+
+[[package]]
+name = "annotated-doc"
+version = "0.0.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "26.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "pyepics"
+version = "3.5.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "pyparsing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/69/57/29e1e9ef11ba2a3419f489946ae1d8190025a1e4f4e1c1686758bb2b6e0a/pyepics-3.5.10.tar.gz", hash = "sha256:f390cf9be40aba757b9528888114bc14d8db01086d0c93914720b1772460375b", size = 6150481, upload-time = "2026-05-20T18:44:36.336Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d6/36/e517fd83bd97d6bfe4105e0c6b322070c5cc36fb56a8fab2866e319f8804/pyepics-3.5.10-py3-none-any.whl", hash = "sha256:c9fac2c54f2b595268e66fc348cf5ec24e63718e7dbd07d73d1b37d4da6bfee1", size = 5332376, upload-time = "2026-05-20T18:44:34.242Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.20.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.3.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "9.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
+]
+
+[[package]]
+name = "rich"
+version = "15.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.15.21"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" },
+ { url = "https://files.pythonhosted.org/packages/28/9d/d825b07ee7ea9e2d61df92a860033c94e06e7300d50a1c2653aac27d24fe/ruff-0.15.21-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f212c5d7d54c01bbfe6dcab02b724a39300f3e34ed7acbe995ccb320a2c58bd", size = 11139539, upload-time = "2026-07-09T20:00:57.809Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/de/3b107712e642f063c7a9e0887c427b22cb44097de5aab36c05f2e280670c/ruff-0.15.21-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e6312e41bc96791299614995ea3a977c5857c3b5662b1ecef6755b02b87cb646", size = 10595437, upload-time = "2026-07-09T20:01:00.006Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" },
+ { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" },
+ { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/3c/37d0ecb729a7cc2d393ea7dce316fc585680f35d93b8d62139d7d0a3700c/ruff-0.15.21-py3-none-win32.whl", hash = "sha256:01f8d5be84823c172b389e123174f781f9daf86d6c58719d603f941932195cdd", size = 10896555, upload-time = "2026-07-09T20:01:26.941Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b8/e43466b2a6067ce91e669068f6e28d6c719a920f014b070d5c8731725de3/ruff-0.15.21-py3-none-win_amd64.whl", hash = "sha256:d4b8d9a2f0f12b816b50447f6eccb9f4bb01a6b82c86b50fb3b5354b458dc6d3", size = 12038772, upload-time = "2026-07-09T20:01:29.497Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/75/e90ab9aeece218a9fc5a5bc3ec97d0ee6bb3c4ff95869463c1de58e29a1c/ruff-0.15.21-py3-none-win_arm64.whl", hash = "sha256:6e83115d4b9377c1cbc13abf0e051f069fab0ef815ea0504a8a008cee24dd0a8", size = 11375265, upload-time = "2026-07-09T20:01:31.772Z" },
+]
+
+[[package]]
+name = "shellingham"
+version = "1.5.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" },
+]
+
+[[package]]
+name = "typer"
+version = "0.27.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "annotated-doc" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "rich" },
+ { name = "shellingham" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/37/78/fda3361b56efc27944f24225f6ecd13d96d6fcfe37bd0eb34e2f4c63f9fc/typer-0.27.0.tar.gz", hash = "sha256:629bd12ea5d13a17148125d9a264f949eb171fb3f120f9b04d85873cab054fa5", size = 203430, upload-time = "2026-07-15T19:21:07.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/03/26a383c9e58c213199d1aad1c3d353cfc22d4444ec6d2c0bf8ad02523843/typer-0.27.0-py3-none-any.whl", hash = "sha256:6f4b27631e47f077871b7dc30e933ec0131c1390fbe0e387ea5574b5bac9ccf1", size = 122716, upload-time = "2026-07-15T19:21:05.553Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.16.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
+]
diff --git a/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs
new file mode 100644
index 0000000..3d9cb1b
--- /dev/null
+++ b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_main.subs
@@ -0,0 +1,4 @@
+file TUNEFBY.template {
+ pattern { DEVICE }
+ { AGEBD-TUNEFBY }
+}
\ No newline at end of file
diff --git a/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml
new file mode 100644
index 0000000..ff8e70f
--- /dev/null
+++ b/services/tunefby/current/ioc/AGEBD-CPCL-TUNEFBY_parameters.yaml
@@ -0,0 +1,6 @@
+cpu_architecture: x86_64
+epics_version: 7.0.8
+ioc_host: sls-vserv-bd-01{{ agebd_env }}
+ioc_port: {{ ioc_port }}
+os: RHEL8
+os_id: rhel
diff --git a/services/tunefby/current/ioc/TUNEFBY.template b/services/tunefby/current/ioc/TUNEFBY.template
new file mode 100644
index 0000000..756df39
--- /dev/null
+++ b/services/tunefby/current/ioc/TUNEFBY.template
@@ -0,0 +1,185 @@
+record(ao, "$(DEVICE):CONTROL-KP") {
+ field(DESC, "PID Proportional Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-KI") {
+ field(DESC, "PID Integral Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-KD") {
+ field(DESC, "PID Derivative Gain")
+ field(ASG, "PROTECTED")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QY") {
+ field(DESC, "PID Setpoint for QY")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.22")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QY-OKRNG") {
+ field(DESC, "PID THRESHOLD")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.0005")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QYMIN") {
+ field(DESC, "PID LOWER LIMIT")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.15")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-QYMAX") {
+ field(DESC, "PID UPPER LIMIT")
+ field(ASG, "PROTECTED")
+ field(VAL, "0.28")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):CONTROL-MIN-CURR") {
+ field(DESC, "PID MIN CURR")
+ field(ASG, "PROTECTED")
+ field(VAL, "400")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ") {
+ field(DESC, "PID SETPOINT for archive")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ-ULIM") {
+ field(DESC, "PID SETPOINT upper limit")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "0.001")
+ field(PINI, "YES")
+}
+
+record(ao, "$(DEVICE):DELTAQ-LLIM") {
+ field(DESC, "PID SETPOINT lower limit")
+ field(ASG, "PROTECTED")
+ field(FLNK, "$(DEVICE):QSTEPS")
+ field(VAL, "-0.001")
+ field(PINI, "YES")
+}
+
+record(calc, "$(DEVICE):QSTEPS") {
+ field(DESC, "PID SETPOINT accumulated")
+ field(ASG, "READONLY")
+ field(PREC, "4")
+ field(VAL, "0")
+ field(PINI, "YES")
+ field(CALC, "VAL + A")
+ field(INPA, "$(DEVICE):DELTAQ")
+}
+
+record(bo, "$(DEVICE):CHECK1") {
+ field(DESC, "measured tune realistic")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK2") {
+ field(DESC, "measured tune okrng")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK3") {
+ field(DESC, "injection not active")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK4") {
+ field(DESC, "current above min")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK5") {
+ field(DESC, "tune bpm config")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK6") {
+ field(DESC, "pingers on")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK7") {
+ field(DESC, "dt corresponds to 3.125 Hz")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(bo, "$(DEVICE):CHECK8") {
+ field(DESC, "calculated step within limits")
+ field(FLNK, "$(DEVICE):CHECKALL")
+ field(ASG, "PROTECTED")
+ field(ZSV, "MINOR")
+ field(OSV, "NO_ALARM")
+ field(VAL, "0")
+ field(PINI, "YES")
+}
+
+record(calc, "$(DEVICE):CHECKALL") {
+ field(DESC, "Check SUM, written by IOC")
+ field(ASG, "READONLY")
+ field(LOLO, "0.1")
+ field(LLSV, "MINOR")
+ field(CALC, "A & B & C & D & E & F & G & H")
+ field(INPA, "$(DEVICE):CHECK1")
+ field(INPB, "$(DEVICE):CHECK2")
+ field(INPC, "$(DEVICE):CHECK3")
+ field(INPD, "$(DEVICE):CHECK4")
+ field(INPE, "$(DEVICE):CHECK5")
+ field(INPF, "$(DEVICE):CHECK6")
+ field(INPG, "$(DEVICE):CHECK7")
+ field(INPH, "$(DEVICE):CHECK8")
+}
\ No newline at end of file
diff --git a/services/tunefby/current/ioc/startup.script b/services/tunefby/current/ioc/startup.script
new file mode 100644
index 0000000..0fa52ff
--- /dev/null
+++ b/services/tunefby/current/ioc/startup.script
@@ -0,0 +1 @@
+epicsEnvSet("ENGINEER", "armborst")
diff --git a/services/tunefby/current/qt/A_BD_TuneBump.ui b/services/tunefby/current/qt/A_BD_TuneBump.ui
new file mode 100644
index 0000000..22fe977
--- /dev/null
+++ b/services/tunefby/current/qt/A_BD_TuneBump.ui
@@ -0,0 +1,6779 @@
+
+
+ MainWindow
+
+
+
+ 0
+ 0
+ 605
+ 960
+
+
+
+ MainWindow
+
+
+ /*################################################*/
+/*# Settings for new templates/forms #*/
+/*################################################*/
+QMainWindow#MainWindow, QWidget#Form, QDialog#Dialog{
+ background: rgba(236, 236, 236, 255);
+}
+
+QMainWindow#MainWindow[transparent=true], QWidget#Form[transparent=true], QDialog#Dialog[transparent=true]{
+ background: rgba(0, 0, 0, 0);
+}
+
+/*-----------------------------------------------*/
+/* Title */
+/*-----------------------------------------------*/
+/* Operation panels */
+caLabel[statusTip="Operation"]{
+ color: rgba(0, 0, 0, 255);
+ font: bold 18pt;
+ font-family: Sans Serif;
+ padding: 1px;
+ margin: 0px;
+ qproperty-alignment: AlignLeft;
+ qproperty-frameShape: StyledPanel;
+ /*qproperty-geometry: rect(-2 0 1600 33);*/
+ background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,
+ stop:0 rgba(218, 218, 218, 255),
+ stop:0.5 rgba(200, 200, 200, 255),
+ stop:1 rgba(218, 218, 218, 255));
+}
+
+ QGroupBox {
+ background: rgba(225,225,225,255);
+ border: 2px solid black;
+ border-radius: 5px;
+ margin-top: 1ex; /* leave space at the top for the title */
+ }
+
+
+
+
+
+ 810
+ 120
+ 70
+ 20
+
+
+
+
+
+
+ 810
+ 60
+ 70
+ 20
+
+
+
+ Reload
+
+
+ RELOAD
+
+
+ A
+
+
+ AGEBD-ALH:TUNEBUMP-GUIRELOAD
+
+
+ caCalc::TriggerZeroToOne
+
+
+
+
+
+ 340
+ 60
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 390
+ 60
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QX-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 160
+ 150
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ AGEBD-TUNEBUMP:QY-STEPSIZE
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caSpinbox::as_is
+
+
+
+
+
+ 390
+ 35
+ 150
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Step Size
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 340
+ 160
+ 40
+ 30
+
+
+
+ <<
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPDOWN
+
+
+ <<
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 10
+ 60
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qx
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 160
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qy
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 550
+ 160
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QY-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 547
+ 60
+ 40
+ 30
+
+
+
+ >>
+
+
+ false
+
+
+ AGEBD-TUNEBUMP:QX-STEPUP
+
+
+ >>
+
+
+
+ 160
+ 160
+ 160
+
+
+
+
+
+
+ 1
+
+
+ caMessageButton::as_is
+
+
+
+
+
+ 0
+ 0
+ 600
+ 32
+
+
+
+
+ Sans Serif
+ 18
+ 75
+ false
+ true
+
+
+
+ Operation
+
+
+ Tune Shift
+
+
+ Qt::AlignLeading
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ caLabel::Default
+
+
+
+
+
+ 0
+ 300
+ 605
+ 660
+
+
+
+ 0
+
+
+
+ Meas
+
+
+
+
+ 5
+ 210
+ 590
+ 200
+
+
+
+ Vertical Tune (nominal: Qy = 15.22)
+
+
+ AGEBD-TUNEBUMP:NORM-QY-FREQ;AGEBD-TUNEBUMP:NORM-QY-AMP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ AGEBD-TUNEBUMP:QY-PEAKS-FREQ;AGEBD-TUNEBUMP:QY-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 415
+ 590
+ 200
+
+
+
+ Synchrotron Tune (nominal: 0.0027)
+
+
+ AGEBD-TUNEBUMP:NORM-QZ-FREQ;AGEBD-TUNEBUMP:NORM-QZ-AMP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ AGEBD-TUNEBUMP:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP:QZ-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ false
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 5
+ 5
+ 590
+ 200
+
+
+
+ Horizontal Tune (nominal: Qx = 39.37)
+
+
+ AGEBD-TUNEBUMP:NORM-QX-FREQ;AGEBD-TUNEBUMP:NORM-QX-AMP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ AGEBD-TUNEBUMP:QX-PEAKS-FREQ;AGEBD-TUNEBUMP:QX-PEAKS
+
+
+ caCartesianPlot::Sticks
+
+
+ caCartesianPlot::NoSymbol
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ caCartesianPlot::Auto
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+
+
+
+ false
+
+
+ false
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ FFT
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Tune Z
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qZ;AGEBD-TUNEBUMP:SPEC-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.0005;0.0025
+
+
+ 10
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Tune Y
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qY;AGEBD-TUNEBUMP:SPEC-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.15;0.29
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Tune X
+
+
+ AGEBD-TUNEBUMP:SPEC-FREQ-qX;AGEBD-TUNEBUMP:SPEC-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0.3;0.44
+
+
+ 0:1
+
+
+ 14
+
+
+ caCartesianPlot::log10
+
+
+
+
+
+ Raw
+
+
+
+
+ 0
+ 210
+ 590
+ 200
+
+
+
+ Vertical TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Y
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 415
+ 590
+ 200
+
+
+
+ Longitudinal Stage 1 Data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-Z
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 10
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ 0
+ 5
+ 590
+ 200
+
+
+
+ Horizontal TbT data
+
+
+ ;AGEBD-TUNEBUMP:SIGN-X
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ caCartesianPlot::Sticks
+
+
+
+
+
+
+ 255
+ 255
+ 255
+
+
+
+ caCartesianPlot::User
+
+
+ caCartesianPlot::Auto
+
+
+ 0;16384
+
+
+
+
+
+ 14
+
+
+ caCartesianPlot::linear
+
+
+
+
+
+ Settings
+
+
+
+
+ 10
+ 260
+ 371
+ 51
+
+
+
+
+ 19
+ 75
+ true
+
+
+
+ Pinger Settings (ca. 10 A)
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ 440
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0320:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 320
+ 150
+ 40
+
+
+
+ 3
+
+
+ 2
+
+
+ ARS01-MKIK-0290:I-SET
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 300.000000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 160
+ 490
+ 291
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Enable Energy Stabelization:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 10
+ 450
+ 581
+ 30
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Defined by FOFB Mean Horizontal Corrector Integral Setpoint:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+ 250
+ 530
+ 110
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-ERR
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Alarm_Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 30
+ 490
+ 110
+ 30
+
+
+
+ 1
+
+
+ 4
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT
+
+
+ caSpinbox::User
+
+
+ caSpinbox::User
+
+
+ 1.000000000000000
+
+
+ -1.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 40
+
+
+
+
+ 24
+ 75
+ true
+
+
+
+ Qx Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 130
+ 400
+ 40
+
+
+
+
+ 25
+ 75
+ true
+
+
+
+ Qy Search Range
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 60
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 440
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 140
+ 60
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QX-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 440
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Upper limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 140
+ 180
+ 150
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEBUMP:QY-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 180
+ 121
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ Lower limit
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 320
+ 121
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ Horizontal
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 320
+ 121
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ Vertical
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 10
+ 390
+ 371
+ 51
+
+
+
+
+ 22
+ 75
+ true
+
+
+
+ Beam Energy Setpoint
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+
+
+ 450
+ 490
+ 31
+ 30
+
+
+
+ ARSGE-CECL-FOFB1:MCOX-INTEGRAL-REF-DEFAULT-EN
+
+
+
+
+
+ 160
+ 530
+ 91
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ ERROR:
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ BPMs
+
+
+
+
+ 10
+ 20
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 10
+ 140
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 10
+ 270
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Longitudinal Tune BPM
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 10
+ 180
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Y.INP
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 60
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-X.INP
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 310
+ 580
+ 30
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:SIGN-Z.INP
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+
+
+
+
+
+
+ FeedBack QX
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Horizontal Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 23
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBX:CONTROL-QXMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">X,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBX:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CONTROL-QX-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBX:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBX:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBX:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 30
+ 30
+
+
+
+ true
+
+
+ true
+
+
+ AGEBD-TUNEFBX:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBX:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Feedback QY
+
+
+
+
+ 10
+ 10
+ 400
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Vertical Tune Feedback
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+
+
+ 120
+ 60
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QY
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 210
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">P</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 210
+ 171
+ 40
+
+
+
+ 1
+
+
+ 4
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CONTROL-QY-OKRNG
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 200
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 260
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KI
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 60
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ</p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 310
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">D</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 270
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK4
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 400
+ 210
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KP
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 110
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMAX
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 250
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 300
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 160
+ 80
+ 40
+
+
+
+
+ 18
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVL</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 310
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:CONTROL-KD
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 220
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK3
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 350
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 150
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 60
+ 80
+ 40
+
+
+
+
+ 24
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,set</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 210
+ 80
+ 40
+
+
+
+
+ 16
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">OKrange</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 60
+ 150
+ 40
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEFBY:DELTAQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 500
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ =
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 520
+ 350
+ 33
+ 30
+
+
+
+ true
+
+
+ 18
+
+
+ 18
+
+
+ true
+
+
+ AGEBD-TUNEFBY:CHECKALL
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 320
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK5
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 170
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK2
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 310
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>K<span style=" vertical-align:sub;">I</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 160
+ 171
+ 40
+
+
+
+ 1
+
+
+ 2
+
+
+ AGEBD-TUNEFBY:CONTROL-QYMIN
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 120
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK1
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 40
+ 355
+ 80
+ 20
+
+
+
+
+ 11
+ 50
+ false
+
+
+
+ <html><head/><body><p>Conditions<br/></p></body></html>
+
+
+ Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 390
+ 10
+ 160
+ 30
+
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ caChoice::Column
+
+
+ 1
+
+
+
+
+
+ 370
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK6
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 20
+ 380
+ 571
+ 240
+
+
+
+
+ 10
+ 75
+ true
+
+
+
+ Accumulated Tune Steps
+
+
+
+
+
+
+
+
+ AGEBD-TUNEFBY:QSTEPS
+
+
+ caStripPlot::Second
+
+
+ 600.000000000000000
+
+
+ caStripPlot::High
+
+
+ caStripPlot::linear
+
+
+ caStripPlot::autoScale
+
+
+ 0.000000000000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::Channel
+
+
+ caStripPlot::Channel
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 252
+ 192
+ 11
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 239
+ 41
+ 41
+
+
+
+ 0.000000410000000
+
+
+ 0.000000001000000
+
+
+ caStripPlot::User
+
+
+ caStripPlot::User
+
+
+
+ 255
+ 0
+ 255
+
+
+
+ 0.000000100000000
+
+
+ 0.000000001000000
+
+
+
+ 218
+ 218
+ 218
+
+
+
+ true
+
+
+ false
+
+
+
+
+
+ 20
+ 260
+ 80
+ 40
+
+
+
+
+ 25
+ 50
+ false
+
+
+
+ <html><head/><body><p>I<span style=" vertical-align:sub;">min</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 20
+ 110
+ 80
+ 40
+
+
+
+
+ 17
+ 50
+ false
+
+
+
+ <html><head/><body><p>Q<span style=" vertical-align:sub;">Y,DRVH</span></p><p><br/></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 120
+ 260
+ 171
+ 40
+
+
+
+ 3
+
+
+ 1
+
+
+ AGEBD-TUNEFBY:CONTROL-MIN-CURR
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 420
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK7
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 470
+ 350
+ 30
+ 30
+
+
+
+ AGEBD-TUNEFBY:CHECK8
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ 0
+
+
+ 1
+
+
+
+
+
+ 450
+ 350
+ 20
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ +
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 310
+ 160
+ 80
+ 40
+
+
+
+
+ 21
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">min</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 400
+ 110
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-ULIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 400
+ 160
+ 150
+ 40
+
+
+
+ 1
+
+
+ 3
+
+
+ AGEBD-TUNEFBY:DELTAQ-LLIM
+
+
+ caSpinbox::User
+
+
+ true
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+
+
+
+ 310
+ 110
+ 80
+ 40
+
+
+
+
+ 20
+ 50
+ false
+
+
+
+ <html><head/><body><p>ΔQ<span style=" vertical-align:sub;">max</span></p></body></html>
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ Debug
+
+
+
+
+ 250
+ 20
+ 31
+ 30
+
+
+
+ AGEBD-TUNEBUMP:WRITE2MAG
+
+
+
+
+
+ 10
+ 20
+ 231
+ 30
+
+
+
+
+ 15
+ 50
+ false
+
+
+
+ Apply MQCO Setpoints
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+ ESimpleLabel::None
+
+
+
+
+
+ 4
+ 50
+ 595
+ 575
+
+
+
+
+ Monospace
+ 10
+ PreferDefault
+
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAsNeeded
+
+
+ AGEBD-TUNEBUMP:CHANGELOG
+
+
+ caMultiLineString::None
+
+
+
+
+
+
+
+ 60
+ 60
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 60
+ 160
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 100
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 100
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB1-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 130
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 130
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-SB2-DIFF
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 380
+ 100
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 130
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 200
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 110
+ 200
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 1
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 380
+ 230
+ 91
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Distance
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 110
+ 230
+ 121
+ 20
+
+
+
+
+ 12
+ 75
+ true
+
+
+
+ Sideband 2
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 0
+ 0
+ 0
+
+
+
+
+ 255
+ 252
+ 255
+
+
+
+
+
+
+ 250
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 200
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB1-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 480
+ 230
+ 110
+ 20
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-SB2-DIFF
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 255
+ 255
+ 225
+
+
+
+ caLineEdit::Static
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::Height
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 60
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QX-FREQ
+
+
+
+ 42
+ 99
+ 228
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 42
+ 99
+ 228
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 160
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QY-FREQ
+
+
+
+ 139
+ 26
+ 150
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 139
+ 26
+ 150
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 10
+ 260
+ 50
+ 30
+
+
+
+
+ 18
+ 75
+ true
+
+
+
+ Qz
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+
+
+ 60
+ 260
+ 100
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 4
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ false
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 170
+ 260
+ 160
+ 30
+
+
+
+
+ Lucida Sans Typewriter
+ 16
+
+
+
+ true
+
+
+
+
+
+ Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ AGEBD-TUNEBUMP:QZ-FREQ
+
+
+
+ 205
+ 97
+ 0
+
+
+
+
+ 0
+ 0
+ 0
+
+
+
+ caLineEdit::Static
+
+
+ true
+
+
+
+ 205
+ 97
+ 0
+
+
+
+ 1
+
+
+ caLineEdit::onBackground
+
+
+ 3
+
+
+ caLineEdit::User
+
+
+ caLineEdit::Channel
+
+
+ 0.100000000000000
+
+
+ 0.000000000000000
+
+
+ caLineEdit::None
+
+
+ true
+
+
+ caLineEdit::decimal
+
+
+
+
+
+ 340
+ 60
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBX-ONOFF
+
+
+
+
+
+ 340
+ 160
+ 250
+ 30
+
+
+
+
+ Sans Serif
+ 18
+
+
+
+ Feedback ON
+
+
+ Qt::AlignCenter
+
+
+
+ 0
+ 205
+ 0
+
+
+
+ caLabel::Calc
+
+
+ A
+
+
+ AGEBD-ALH:TUNEFBY-ONOFF
+
+
+ calabel_3
+ wmsignalpropagator
+ cacalc_2
+ camessagebutton_14
+ caspinbox
+ caspinbox_2
+ calabel_12
+ camessagebutton_15
+ calabel_13
+ calabel_14
+ camessagebutton_16
+ camessagebutton_17
+ tabWidget
+ caLineEdit_39
+ caLineEdit_40
+ calabel_18
+ caLineEdit_43
+ caLineEdit_45
+ calabel_19
+ caLineEdit_48
+ caLineEdit_49
+ calabel_20
+ calabel_21
+ calabel_22
+ caLineEdit_44
+ calabel_23
+ calabel_24
+ calabel_25
+ caLineEdit_50
+ caLineEdit_46
+ caLineEdit_51
+ caLineEdit_42
+ caLineEdit_54
+ calabel_33
+ caLineEdit_55
+ caLineEdit_56
+ calabel
+ calabel_2
+
+
+
+
+ caMenu
+ QComboBox
+
+
+
+ caChoice
+ QWidget
+
+
+
+ caMessageButton
+ QPushButton
+
+
+
+ caToggleButton
+ QCheckBox
+
+
+
+ caSpinbox
+ QFrame
+
+
+
+ caLabel
+ QLabel
+
+
+
+ caLed
+ QWidget
+
+
+
+ caLineEdit
+ QLineEdit
+
+
+
+ caMultiLineString
+ QPlainTextEdit
+
+
+
+ caCartesianPlot
+ QwtPlot
+
+
+
+ caStripPlot
+ QwtPlot
+
+ 1
+
+
+ caCalc
+ QLabel
+
+
+
+ wmSignalPropagator
+ QLabel
+
+
+
+ QwtPlot
+ QFrame
+
+
+
+
+
+
+ cacalc_2
+ emitSignal(bool)
+ wmsignalpropagator
+ reloadwindow()
+
+
+ 598
+ 89
+
+
+ 608
+ 152
+
+
+
+
+
diff --git a/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service b/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service
new file mode 100644
index 0000000..3cbbb68
--- /dev/null
+++ b/services/tunefby/current/systemd/AGEBD-SERVICE-TUNEFBY.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=AGEBD-SERVICE-TUNEFBY
+After=network.target
+
+[Service]
+Environment=AGEBD_ENV={{ agebd_env }}
+ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TUNEFBY
+Restart=no
+
+[Install]
+WantedBy=default.target
+
+# https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html
+# systemctl --user daemon-reload
+# systemctl --user enable /sls/bd/bin/systemd/AGEBD-SERVICE-TUNEFBY.service
+# systemctl --user start AGEBD-SERVICE-TUNEFBY