Refactor/central substitutions #70

Open
labrec_b wants to merge 4 commits from refactor/central-substitutions into main
151 changed files with 2684 additions and 1547 deletions
+20 -23
View File
@@ -7,26 +7,22 @@ echo "=========================================="
echo "Deploying service: $SERVICE_NAME (${AGEBD_ENV})"
echo "=========================================="
SERVICE_NAME_LOWER=$(echo "$SERVICE_NAME" | tr '[:upper:]' '[:lower:]')
SERVICE_NAME_UPPER=$(echo "$SERVICE_NAME" | tr '[:lower:]' '[:upper:]')
SERVICE_DIR=/sls/bd/hla/${AGEBD_ENV}/services/${SERVICE_NAME_LOWER}/current
SYSTEMD_UNIT_NAME=AGEBD-SERVICE-${SERVICE_NAME_UPPER}.service
# Name forms and the systemd naming convention come from
# agebd.names.ServiceName, so this script carries no copy of them.
if ! SERVICE_NAMES=$(uv run --directory scripts ci/service_names.py "${SERVICE_NAME}"); then
echo "Could not derive names for '${SERVICE_NAME}' -- aborting deploy" >&2
exit 1
fi
eval "${SERVICE_NAMES}"
SERVICE_DIR=/sls/bd/hla/${AGEBD_ENV}/services/${SERVICE_DIR_NAME}/current
SYSTEMD_UNIT_FILE_PATH=${SERVICE_DIR}/systemd/${SYSTEMD_UNIT_NAME}
IOC_DIR=${SERVICE_DIR}/ioc
IOC_PORT=$(uv run --directory scripts ci/get_ioc_port.py ${SERVICE_NAME_LOWER})
if [ "${AGEBD_ENV}" = "dev" ]; then
AGEBD_ENV_SUFFIX_UPPER="-DEV"
AGEBD_ENV_SUFFIX_LOWER="-dev"
else
AGEBD_ENV_SUFFIX_UPPER=""
AGEBD_ENV_SUFFIX_LOWER=""
fi
# TODO: see https://gitea.psi.ch/sls/hla_framework_bd/issues/50
# rm -rf "${SERVICE_DIR}"
# mkdir -p ${SERVICE_DIR}
# cp -r ./services/${SERVICE_NAME_LOWER}/current/* ${SERVICE_DIR}/
# cp -r ./services/${SERVICE_DIR_NAME}/current/* ${SERVICE_DIR}/
rsync -avz --delete \
--exclude='.nfs*' \
@@ -35,17 +31,18 @@ rsync -avz --delete \
--exclude='__pycache__/' \
--exclude='*.pyc' \
--exclude='.pytest_cache/' \
./services/${SERVICE_NAME_LOWER}/current/* ${SERVICE_DIR}/
./services/${SERVICE_DIR_NAME}/current/* ${SERVICE_DIR}/
### SUBSTITUTIONS
### IOC
sed -i "s/{{ *agebd_env_suffix_upper* }}/${AGEBD_ENV_SUFFIX_UPPER}/g" "${IOC_DIR}/"*
sed -i "s/{{ *agebd_env_suffix_lower* }}/${AGEBD_ENV_SUFFIX_LOWER}/g" "${IOC_DIR}/"*
sed -i "s/{{ *ioc_port* }}/${IOC_PORT}/g" "${IOC_DIR}/"*
### SYSTEMD
if [ -f "${SYSTEMD_UNIT_FILE_PATH}" ]; then
sed -i "s/{{ *agebd_env* }}/${AGEBD_ENV}/g" "${SYSTEMD_UNIT_FILE_PATH}"
# Every @@token@@ is resolved from config/environments.yml and
# config/services_registry.yml. An unknown or misspelled token aborts the
# deploy instead of leaving the placeholder in a file the IOC will read.
if ! uv run --directory scripts ci/render_subs.py \
--env "${AGEBD_ENV}" \
--service "${SERVICE_DIR_NAME}" \
"${IOC_DIR}" "${SERVICE_DIR}/systemd"; then
echo "Substitution failed -- aborting deploy of ${SERVICE_NAME}" >&2
exit 1
fi
+6
View File
@@ -23,6 +23,12 @@ jobs:
echo $UV_CACHE_DIR
uv run --directory cli pytest
# Includes check_subs: every @@token@@ the new service brought in must be
# declared in config/environments.yml and live in a rendered path.
- name: Run scripts tests
run: |
uv run --directory scripts pytest
- name: Parse Service Directory Name
id: parse_branch
# Uses bash shell parameter elimination to strip 'feature/add-service-' from the front
+5
View File
@@ -116,6 +116,11 @@ jobs:
--exclude='.pytest_cache/' \
./qt/* "${DEST_DIR}/"
# Resolve @@token@@ in the deployed UI files. qt/ holds no
# per-service token, so no --service is needed; a file that
# acquired one would fail here rather than ship the placeholder.
uv run --directory scripts ci/render_subs.py --env "${AGEBD_ENV}" "${DEST_DIR}"
# -----------------------------------------------------------------
# Services Detection, Testing, and Deployment
# -----------------------------------------------------------------
-8
View File
@@ -1,8 +0,0 @@
[defaults]
remote_tmp = /tmp/ansible-$USER
# some responses of 'ioc ...' cli are non-utf8
module_strict_utf8_response = False
# ./ refers to dir in which this file is located
collections_path = ./installed-collections
-3
View File
@@ -1,3 +0,0 @@
collections:
- name: ansible.posix
version: 1.6.0
-19
View File
@@ -1,19 +0,0 @@
all:
vars:
agebd_env: "dev"
env_suffix_upper: "-DEV"
env_suffix_lower: "-dev"
children:
lc:
hosts:
sls-lc:
ansible_remote_tmp: /tmp/.ansible_${ansible_user}_tmp
vserv:
hosts:
sls-vserv-bd-01-dev:
ansible_ssh_pipelining: true
ansible_ssh_common_args: '-o ForwardAgent=yes'
vserv-hla:
hosts:
sls-vserv-bd-hla01-dev:
-18
View File
@@ -1,18 +0,0 @@
all:
vars:
agebd_env: "prod"
env_suffix_upper: ""
env_suffix_lower: ""
children:
lc:
hosts:
sls-lca:
ansible_remote_tmp: /tmp/.ansible_${ansible_user}_tmp
vserv:
hosts:
sls-vserv-bd-01:
ansible_ssh_pipelining: true
vserv-hla:
hosts:
sls-vserv-bd-hla01:
-42
View File
@@ -1,42 +0,0 @@
---
- name: Add a new service
hosts: vserv-hla
connection: local
gather_facts: true # Gather once here, available to all included tasks!
vars:
repo_root: "{{ playbook_dir }}/../.."
tasks:
# - name: Install Master IOC
# vars:
# preferred_service_name_lower: master
# branch_name: "feature/add-service-{{ service_name_lower }}"
# import_tasks: ../tasks/ioc/ioc-install.yml
# - name: Restart Master IOC
# vars:
# preferred_service_name_lower: master
# branch_name: "feature/add-service-{{ service_name_lower }}"
# import_tasks: ../tasks/ioc/ioc-restart.yml
- name: Deploy and Restart Master Service
vars:
preferred_service_name_lower: master
branch_name: "feature/add-service-{{ service_name_lower }}"
import_tasks: ../tasks/service/service-deploy-and-restart.yml
# - name: Install New IOC
# vars:
# branch_name: "feature/add-service-{{ service_name_lower }}"
# import_tasks: ../tasks/ioc/ioc-install.yml
# - name: Start New IOC
# vars:
# branch_name: "feature/add-service-{{ service_name_lower }}"
# import_tasks: ../tasks/ioc/ioc-start.yml
- name: Deploy and Restart New Service
vars:
branch_name: "feature/add-service-{{ service_name_lower }}"
import_tasks: ../tasks/service/service-deploy-and-restart.yml
@@ -1,24 +0,0 @@
---
- name: Deploy and Restart Modified Services
hosts: vserv-hla
connection: local
vars:
# Passed from the Gitea workflow, e.g., "master playground"
changed_services_raw: ""
agebd_env: "dev"
repo_root: "{{ playbook_dir }}/../.."
tasks:
# Fail early if no services were modified
- name: Check if there are services to deploy
ansible.builtin.meta: end_play
when: changed_services_raw | trim == ""
# Main Loop: loop through the list of modified service names
- name: Deploy and Restart Modified Services
include_tasks: ../tasks/service/service-deploy-and-restart.yml
loop: "{{ changed_services_raw.split() }}"
loop_control:
loop_var: service_name_lower
extended: yes
-11
View File
@@ -1,11 +0,0 @@
---
- name: Install an IOC
hosts: lc
gather_facts: false
vars:
workspace_dir: "/tmp/hla_framework_bd"
tasks:
- name: Run ioc install tasks
ansible.builtin.import_tasks: ../tasks/ioc/ioc-install.yml
-11
View File
@@ -1,11 +0,0 @@
---
- name: Restart an IOC
hosts: lc
gather_facts: false
vars:
workspace_dir: "/tmp/hla_framework_bd"
tasks:
- name: Run ioc restart tasks
ansible.builtin.include_tasks: ../tasks/ioc/ioc-restart.yml
-14
View File
@@ -1,14 +0,0 @@
# TODO: ansible seems to be very slow on this machine
# each step takes quite a while (e.g. cloning repo, which
# is significantly faster on other machines).
---
- name: Start an IOC
hosts: vserv
gather_facts: false
vars:
workspace_dir: "/tmp/hla_framework_bd"
tasks:
- name: Run ioc start tasks
ansible.builtin.import_tasks: ../tasks/ioc/ioc-start.yml
-63
View File
@@ -1,63 +0,0 @@
---
- name: Init service name
ansible.builtin.import_tasks: ../utils/init-service-name.yml
- name: Clone repo
ansible.builtin.import_tasks: ../utils/clone-repo.yml
- name: Get and set ioc_port
ansible.builtin.import_tasks: ../utils/get-ioc-port.yml
- name: "[{{ target_service_name_lower }}] Establish environment naming conventions"
ansible.builtin.set_fact:
service_name_upper: "{{ target_service_name_lower | upper }}"
- name: "[{{ target_service_name_lower }}] Define file paths"
ansible.builtin.set_fact:
ioc_base_dir: "{{ workspace_dir }}/services/{{ target_service_name_lower }}/current/ioc"
orig_subs_name: "AGEBD-CPCL-{{ service_name_upper }}_main.subs"
target_subs_name: "AGEBD-CPCL-{{ service_name_upper }}{{ env_suffix_upper }}_main.subs"
orig_params_name: "AGEBD-CPCL-{{ service_name_upper }}_parameters.yaml"
target_params_name: "AGEBD-CPCL-{{ service_name_upper }}{{ env_suffix_upper }}_parameters.yaml"
# Rename the subs file if we are in DEV
- name: "[{{ target_service_name_lower }}] Rename substitution file for environment"
ansible.builtin.command:
cmd: "mv {{ ioc_base_dir }}/{{ orig_subs_name }} {{ ioc_base_dir }}/{{ target_subs_name }}"
removes: "{{ ioc_base_dir }}/{{ orig_subs_name }}" # Only runs if the original file exists
# Rename the paramters file if we are in DEV
- name: "[{{ target_service_name_lower }}] Rename parameters file for environment"
ansible.builtin.command:
cmd: "mv {{ ioc_base_dir }}/{{ orig_params_name }} {{ ioc_base_dir }}/{{ target_params_name }}"
removes: "{{ ioc_base_dir }}/{{ orig_params_name }}" # Only runs if the original file exists
# Replace {{ agebd_env_suffix_upper }} inside the newly renamed subs file
- name: "[{{ target_service_name_lower }}] Substitute environment tokens inside subs file"
ansible.builtin.replace:
path: "{{ ioc_base_dir }}/{{ target_subs_name }}"
regexp: '\{\{\s*agebd_env_suffix_upper\s*\}\}'
replace: "{{ env_suffix_upper }}"
# Replace {{ agebd_env_suffix_lower }} and {{ ioc_port }} inside the newly renamed params file
- name: "[{{ target_service_name_lower }}] Substitute environment token inside params file"
ansible.builtin.replace:
path: "{{ ioc_base_dir }}/{{ target_params_name }}"
regexp: "{{ item.regexp }}"
replace: "{{ item.replace | string }}"
with_items:
- { regexp: '\{\{\s*agebd_env_suffix_lower\s*\}\}', replace: "{{ env_suffix_lower }}" }
- { regexp: '\{\{\s*ioc_port\s*\}\}', replace: "{{ ioc_port }}" }
- name: "[{{ target_service_name_lower }}] Run ioc install"
ansible.builtin.shell:
cmd: "ioc install -V --facility sls --ioc AGEBD-CPCL-{{ service_name_upper }}{{ env_suffix_upper }} --clean"
chdir: "{{ ioc_base_dir }}"
changed_when: true
register: ioc_install_result
# Force a pipeline failure if the command output contains error keywords
# (ioc install ... returns exit code 0 even on failure...)
failed_when: >
ioc_install_result.rc != 0 or
"[error]" in ioc_install_result.stderr or
"Unable to write" in ioc_install_result.stderr
-20
View File
@@ -1,20 +0,0 @@
---
- name: Init service name
ansible.builtin.import_tasks: ../utils/init-service-name.yml
- name: Clone repo
ansible.builtin.import_tasks: ../utils/clone-repo.yml
- name: "[{{ target_service_name_lower }}] Establish environment naming conventions"
ansible.builtin.set_fact:
service_name_upper: "{{ target_service_name_lower | upper }}"
- name: "[{{ target_service_name_lower }}] Define file paths"
ansible.builtin.set_fact:
ioc_base_dir: "{{ workspace_dir }}/services/{{ target_service_name_lower }}/current/ioc"
- name: "[{{ target_service_name_lower }}] Restart IOC"
ansible.builtin.shell:
cmd: "ioc restart AGEBD-CPCL-{{ service_name_upper }}{{ env_suffix_upper }}"
chdir: "{{ ioc_base_dir }}"
changed_when: true
-17
View File
@@ -1,17 +0,0 @@
---
- name: Init service name
ansible.builtin.import_tasks: ../utils/init-service-name.yml
- name: Clone repo
ansible.builtin.import_tasks: ../utils/clone-repo.yml
- name: Get and set ioc_port
ansible.builtin.import_tasks: ../utils/get-ioc-port.yml
- name: "[{{ ioc_port }}] Start IOC"
ansible.builtin.shell: |
sudo shellbox status
sudo shellbox reload
sudo shellbox status
sudo shellbox start {{ ioc_port }}
changed_when: true
@@ -1,53 +0,0 @@
---
- name: Initialize service name
ansible.builtin.set_fact:
# Uses preferred_service_name_lower if defined in vars, otherwise falls back to the CLI extra-vars
target_service_name_lower: "{{ preferred_service_name_lower | default(service_name_lower) }}"
- name: "[{{ target_service_name_lower }}] Define service specific paths and names"
ansible.builtin.set_fact:
svc_current_dir: "/sls/bd/hla/{{ agebd_env }}/services/{{ target_service_name_lower }}/current"
service_unit_name: "AGEBD-SERVICE-{{ target_service_name_lower | upper }}.service"
- name: "[{{ target_service_name_lower }}] Ensure target directory structure exists"
ansible.builtin.file:
path: "{{ svc_current_dir }}"
state: directory
# ansible.builtin.shell: |
# mkdir -p "{{ svc_current_dir }}"
# TODO: make sure this is what we want (essentially wipes existing dest dir). Does it remove .venv?
- name: "[{{ target_service_name_lower }}] Sync service deployment files"
ansible.posix.synchronize:
src: "{{ repo_root }}/services/{{ target_service_name_lower }}/current/"
dest: "{{ svc_current_dir }}/"
delete: yes # This removes stale files on the target that no longer exist locally
recursive: yes
- name: "[{{ target_service_name_lower }}] Substitute environment variable inline"
ansible.builtin.replace:
path: "{{ svc_current_dir }}/systemd/{{ service_unit_name }}"
regexp: '\{\{\s*agebd_env\s*\}\}'
replace: "{{ agebd_env }}"
# systemctl --user link --force "./{{ service_unit_name }}"
- name: "[{{ target_service_name_lower }}] Symlink systemd unit file (Absolute Path)"
ansible.builtin.file:
src: "{{ svc_current_dir }}/systemd/{{ service_unit_name }}"
dest: "~/.config/systemd/user/{{ service_unit_name }}"
state: link
force: yes # This overwrites the broken/existing symlink cleanly without error
# export XDG_RUNTIME_DIR=/run/user/$(id -u)
# systemctl --user daemon-reload
# systemctl --user enable "{{ service_unit_name }}"
# systemctl --user restart "{{ service_unit_name }}"
- name: "[{{ target_service_name_lower }}] Enable and Restart Systemd Service"
ansible.builtin.systemd_service:
name: "{{ service_unit_name }}"
scope: user
daemon_reload: yes
enabled: yes
state: restarted
environment:
XDG_RUNTIME_DIR: "/run/user/{{ ansible_user_uid }}"
-8
View File
@@ -1,8 +0,0 @@
---
- name: Clone this repository
ansible.builtin.git:
repo: "git@gitea.psi.ch:sls/hla_framework_bd.git"
dest: "{{ workspace_dir }}"
accept_hostkey: true
version: "{{ branch_name }}"
force: true
-18
View File
@@ -1,18 +0,0 @@
---
- name: Read the service registry file
ansible.builtin.slurp:
src: "{{ workspace_dir }}/config/services_registry.yml"
register: remote_registry_file
- name: Parse the service registry YAML content into a fact
ansible.builtin.set_fact:
services_registry: "{{ remote_registry_file.content | b64decode | from_yaml }}"
- name: Extract the port from the services registry and save it as a persistent fact
ansible.builtin.set_fact:
ioc_port: "{{ services_registry.services | selectattr('name', 'equalto', target_service_name_lower) | map(attribute='ioc_port') | first | default(none) }}"
- name: Fail if the service or port wasn't found in the registry
ansible.builtin.fail:
msg: "Service '{{ target_service_name_lower }}' not found in services registry or port not set"
when: ioc_port | trim == "" or ioc_port is none
@@ -1,5 +0,0 @@
---
- name: Initialize service name
ansible.builtin.set_fact:
# Uses preferred_service_name_lower if defined in vars, otherwise falls back to the CLI extra-vars
target_service_name_lower: "{{ preferred_service_name_lower | default(service_name_lower) }}"
+5 -4
View File
@@ -4,12 +4,13 @@ UI_FILENAME=$1
AGEBD_ENV=$2 # 'dev' for dev environment, any other string launches prod.
REMAINING_ARGS=( "${@:3}" )
# The environment suffix is baked into the UI files when qt/ is rendered at
# deploy time, from config/environments.yml. Launching from
# /sls/bd/hla/${AGEBD_ENV}/qt therefore already targets the right devices, so
# no AGEBD_ENV_SUFFIX macro is passed here.
if [ "$AGEBD_ENV" = "dev" ]; then
AGEBD_ENV_SUFFIX="-DEV"
EPICS_CA_ADDR_LIST="$EPICS_CA_ADDR_LIST 129.129.146.255"
else
AGEBD_ENV_SUFFIX=""
fi
export EPICS_CA_ADDR_LIST
caqtdm -macro "AGEBD_ENV_SUFFIX=${AGEBD_ENV_SUFFIX}" "${REMAINING_ARGS[@]}" "${UI_FILENAME}"
caqtdm "${REMAINING_ARGS[@]}" "${UI_FILENAME}"
+4
View File
@@ -7,6 +7,10 @@ set --
# PSI_FACILITY=SLS
SERVICES_DIR=/sls/bd/hla/${AGEBD_ENV}/services
# These two derivations are the one place that deliberately does not use
# agebd.names.ServiceName: this runs on the deploy host before any Python
# environment for the service exists (the venv is built further down), so it
# cannot import agebd. Keep the rules here in step with agebd/names.py.
SVC_NAME_LOWER=${SVC_NAME,,}
SVC_NAME_LOWER_UNDERSCORES="${SVC_NAME_LOWER//-/_}"
SVC_DIR=${SERVICES_DIR}/${SVC_NAME_LOWER}
-2
View File
@@ -9,8 +9,6 @@ authors = [
dependencies = [
"agebd",
"ansible>=8.7.0",
"ansible-runner>=2.4.3",
"copier>=9.10.3",
"pydantic>=2.13.4",
"pydantic-settings>=2.14.2",
-40
View File
@@ -1,40 +0,0 @@
import os
import sys
import ansible_runner
import typer
from agebd.utils import get_git_root
from core.enums import IOC_ENV
ioc = typer.Typer(no_args_is_help=True)
REPO_ROOT = get_git_root(__file__)
def run_playbook(playbook: str, env: IOC_ENV, vars: list[str]):
env_str = str(env)
if env_str not in ["dev", "prod"]:
raise ValueError("env must be 'dev' or 'prod'")
current_env = os.environ.copy()
current_env["ANSIBLE_CONFIG"] = f"{REPO_ROOT}/ansible/ansible.cfg"
extra_vars = [f"--extra-vars={var}" for var in vars]
out, err, rc = ansible_runner.run_command(
executable_cmd=f"ansible-playbook",
cmdline_args=[
playbook,
"-i",
f"{REPO_ROOT}/ansible/inventories/{env_str}/hosts.yml",
*extra_vars,
"-v",
],
envvars=current_env,
input_fd=sys.stdin,
output_fd=sys.stdout,
error_fd=sys.stderr,
)
print("rc: {}".format(rc))
print("out: {}".format(out))
print("err: {}".format(err))
-8
View File
@@ -6,14 +6,6 @@ class ServiceStatus(str, Enum):
DISABLED = "disabled"
class IOC_ENV(str, Enum):
PROD = "prod"
DEV = "dev"
def __str__(self) -> str:
return self.value
class GuiOption(str, Enum):
NEW = "new"
EXISTING = "existing"
-112
View File
@@ -1,112 +0,0 @@
import typer
from agebd.utils import get_git_root
from config.paths import Paths
from core.ansible import run_playbook
from core.enums import IOC_ENV
from models import ServiceRegistry
ioc = typer.Typer(no_args_is_help=True)
REPO_ROOT = get_git_root(__file__)
ANSIBLE_PLAYBOOKS_DIR = REPO_ROOT / "ansible" / "playbooks"
IOC_PLAYBOOK_INSTALL = ANSIBLE_PLAYBOOKS_DIR / "ioc-install.yml"
IOC_PLAYBOOK_RESTART = ANSIBLE_PLAYBOOKS_DIR / "ioc-restart.yml"
IOC_PLAYBOOK_START = ANSIBLE_PLAYBOOKS_DIR / "ioc-start.yml"
SERVICE_NAME_HELP = "Service name in lower case"
def _resolve_branch_name(branch_name: str | None, service_name_lower: str) -> str:
return branch_name or f"feature/add-service-{service_name_lower}"
def _get_registry_services():
paths = Paths()
registry = ServiceRegistry.read_from_file(paths.service_registry_file)
return registry.get_services()
@ioc.command(no_args_is_help=True)
def install(
env: IOC_ENV = typer.Option(..., "--env"),
service_name_lower: str = typer.Option(..., "--service-name", "-s", help=SERVICE_NAME_HELP),
branch_name: str | None = typer.Option(
None, "--branch-name", "-b", help="Default is 'feature/add-service-{service-name}'"
),
):
branch_name = _resolve_branch_name(branch_name, service_name_lower)
run_playbook(
playbook=str(IOC_PLAYBOOK_INSTALL),
env=env,
vars=[f"branch_name={branch_name}", f"service_name_lower={service_name_lower}"],
)
@ioc.command(no_args_is_help=True)
def install_all(
env: IOC_ENV = typer.Option(..., "--env"),
):
for service in _get_registry_services():
run_playbook(
playbook=str(IOC_PLAYBOOK_INSTALL),
env=env,
vars=["branch_name=main", f"service_name_lower={service.name_lower}"],
)
@ioc.command(no_args_is_help=True)
def start(
env: IOC_ENV = typer.Option(..., "--env"),
service_name_lower: str = typer.Option(..., "--service-name", "-s", help=SERVICE_NAME_HELP),
branch_name: str | None = typer.Option(
None, "--branch-name", "-b", help="Default is 'feature/add-service-{service-name}'"
),
):
branch_name = _resolve_branch_name(branch_name, service_name_lower)
run_playbook(
playbook=str(IOC_PLAYBOOK_START),
env=env,
vars=[f"service_name_lower={service_name_lower}", f"branch_name={branch_name}"],
)
@ioc.command()
def start_all(
env: IOC_ENV = typer.Option(..., "--env"),
):
for service in _get_registry_services():
run_playbook(
playbook=str(IOC_PLAYBOOK_START),
env=env,
vars=[f"service_name_lower={service.name_lower}"],
)
@ioc.command(no_args_is_help=True)
def restart(
env: IOC_ENV = typer.Option(..., "--env"),
service_name_lower: str = typer.Option(..., "--service-name", "-s", help=SERVICE_NAME_HELP),
branch_name: str | None = typer.Option(
None, "--branch-name", "-b", help="Default is 'feature/add-service-{service-name}'"
),
):
branch_name = _resolve_branch_name(branch_name, service_name_lower)
run_playbook(
playbook=str(IOC_PLAYBOOK_RESTART),
env=env,
vars=[f"branch_name={branch_name}", f"service_name_lower={service_name_lower}"],
)
@ioc.command(no_args_is_help=True)
def restart_all(
env: IOC_ENV = typer.Option(..., "--env"),
):
for service in _get_registry_services():
run_playbook(
playbook=str(IOC_PLAYBOOK_RESTART),
env=env,
vars=["branch_name=main", f"service_name_lower={service.name_lower}"],
)
-2
View File
@@ -2,7 +2,6 @@ import logging
import typer
import ioc
import service
logger = logging.getLogger(__name__)
@@ -10,7 +9,6 @@ logger = logging.getLogger(__name__)
cli = typer.Typer(no_args_is_help=True, add_completion=False)
cli.add_typer(service.service, name="service")
cli.add_typer(ioc.ioc, name="ioc")
if __name__ == "__main__":
+1 -1
View File
@@ -24,7 +24,7 @@ class MasterIocSubs(BaseModel):
Parses the configuration text and appends a new row before the closing bracket.
"""
quoted_service = f'"{service_name}"'
new_row = f' {{ "{{{{ agebd_env_suffix_upper }}}}", {quoted_service:<22} , "{starton}", "{autooff}" }}'
new_row = f' {{ "@@agebd_env_suffix_upper@@", {quoted_service:<22} , "{starton}", "{autooff}" }}'
# Use regex to find the last closing curly brace of the configuration block
# This targets the line that contains only a lone closing brace, optional spaces, and maybe a comma/semicolon.
+22 -11
View File
@@ -1,34 +1,48 @@
import re
from agebd.names import ServiceName
from pydantic import BaseModel, field_validator
from core.enums import ServiceStatus
class Service(BaseModel):
"""
A service's registry entry.
Every spelling of the name is delegated to agebd.names.ServiceName, which
is also what the CI and deploy scripts use.
"""
name: str
ioc_port: int
status: ServiceStatus
@property
def service_name(self) -> ServiceName:
return ServiceName(self.name)
@property
def name_camel(self):
return self.name
return self.service_name.camel
@property
def name_upper(self):
return self.name.upper()
return self.service_name.upper
@property
def name_lower(self):
return self.name.lower()
return self.service_name.lower
@property
def name_lower_underscores(self):
return self.name.replace("-", "_").lower()
return self.service_name.lower_underscores
@property
def dir_name(self):
return self.name.lower()
return self.service_name.dir_name
@property
def ioc_name(self):
return self.service_name.ioc_name
def to_dict(self):
return {"name": self.name_camel, "ioc_port": self.ioc_port, "status": str(self.status)}
@@ -39,8 +53,5 @@ class Service(BaseModel):
@field_validator("name")
@classmethod
def validate_name_chars(cls, value: str) -> str:
if not re.match(r"^[a-zA-Z0-9-]+$", value):
raise ValueError(
"name can only contain uppercase and lowercase letters, numbers, and dashes"
)
ServiceName(value)
return value
+4 -1
View File
@@ -133,8 +133,11 @@ class _ServiceManagerUIMacroElement(BaseModel):
ui_filename: str
def to_string(self) -> str:
# The IOC macro is used as a PV prefix inside the included UI
# ($(IOC):STATUS, $(IOC):RESTART), so it carries the environment
# suffix token and is resolved when qt/ is rendered at deploy time.
return (
f"IOC=AGEBD-CPCL-{self.service_name_upper},"
f"IOC=AGEBD-CPCL-{self.service_name_upper}@@agebd_env_suffix_upper@@,"
f"service={self.service_name_upper},"
f"name={self.service_name_camel},"
f"panel={self.panel},"
+11 -6
View File
@@ -3,6 +3,8 @@ from pathlib import Path
import yaml
from pydantic import BaseModel
from agebd.subs import find_service_entry
from core.enums import ServiceStatus
from models.service import Service
@@ -26,12 +28,15 @@ class ServiceRegistry(BaseModel):
return [Service(**svc_data) for svc_data in self.services]
def assert_service_exists(self, name: str) -> Service:
for svc_data in self.services:
service = Service(**svc_data)
if name == service.name_camel:
return service
raise ValueError(f"Could not find service with name: {name}")
"""
Look a service up by name. Matching goes through
agebd.subs.find_service_entry so that the CLI, the CI scripts and the
deploy scripts all agree on what "the service named X" means.
"""
entry = find_service_entry(self.services, name)
if entry is None:
raise ValueError(f"Could not find service with name: {name}")
return Service(**entry)
def add_service(self, name: str) -> Service:
svc = Service(
+17 -17
View File
@@ -71,7 +71,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -106,7 +106,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">!A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
@@ -138,7 +138,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-DBPM3CURR,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX,service=TUNEFBX,name=Hor. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY,service=TUNEFBY,name=Ver. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TESTSERVICE99-X00,service=TESTSERVICE99-X00,name=TestService99-X00,panel=1,svc_exist=1,panelcmd=A_BD_TestService99-X00.ui</string>
<string>IOC=AGEBD-CPCL-DBPM3CURR@@agebd_env_suffix_upper@@,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM@@agebd_env_suffix_upper@@,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT@@agebd_env_suffix_upper@@,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING@@agebd_env_suffix_upper@@,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING@@agebd_env_suffix_upper@@,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD@@agebd_env_suffix_upper@@,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG@@agebd_env_suffix_upper@@,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP@@agebd_env_suffix_upper@@,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS@@agebd_env_suffix_upper@@,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP@@agebd_env_suffix_upper@@,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX@@agebd_env_suffix_upper@@,service=TUNEFBX,name=Hor. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY@@agebd_env_suffix_upper@@,service=TUNEFBY,name=Ver. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TESTSERVICE99-X00@@agebd_env_suffix_upper@@,service=TESTSERVICE99-X00,name=TestService99-X00,panel=1,svc_exist=1,panelcmd=A_BD_TestService99-X00.ui</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -246,7 +246,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-NTURNS,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
<string>IOC=AGEBD-CPCL-NTURNS@@agebd_env_suffix_upper@@,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL@@agebd_env_suffix_upper@@,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE@@agebd_env_suffix_upper@@,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -586,7 +586,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ALIVE</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ALIVE</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -602,7 +602,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STARTTIME</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STARTTIME</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -624,7 +624,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STATUS</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STATUS</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -646,7 +646,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-VERSION</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-VERSION</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -668,7 +668,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -717,7 +717,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF-RB</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF-RB</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -763,7 +763,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:STATUS</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:STATUS</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -792,7 +792,7 @@ caLabel[statusTip="Operation"]{
<string>/ioc/modules/qt/iocStats.ui</string>
</property>
<property name="args">
<string>IOC=AGEBD-CPCL-MASTER;</string>
<string>IOC=AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@;</string>
</property>
</widget>
<widget class="caLabel" name="calabel_42">
@@ -986,7 +986,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01 systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@ systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
</property>
</widget>
<widget class="caScriptButton" name="cascriptbutton_2">
@@ -1015,7 +1015,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01"</string>
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@"</string>
</property>
</widget>
</widget>
@@ -1040,7 +1040,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:MASTER-LOGS-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:MASTER-LOGS-REQ</string>
</property>
<property name="label">
<string notr="true">Logs</string>
@@ -1106,7 +1106,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="label">
<string notr="true">Reload</string>
@@ -1172,7 +1172,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:RESTART</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:RESTART</string>
</property>
<property name="label">
<string notr="true">↺</string>
@@ -30,7 +30,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TESTSERVICE99-X00{{ agebd_env_suffix_upper }}:AO</string>
<string>AGEBD-TESTSERVICE99-X00@@agebd_env_suffix_upper@@:AO</string>
</property>
<property name="maxValue">
<double>9.000000000000000</double>
@@ -49,10 +49,10 @@
</rect>
</property>
<property name="text">
<string>Toggle AGEBD-ALH{{ agebd_env_suffix_upper }}:TESTSERVICE99-X00-ONOFF</string>
<string>Toggle AGEBD-ALH@@agebd_env_suffix_upper@@:TESTSERVICE99-X00-ONOFF</string>
</property>
<property name="channel" stdset="0">
<string>AGEBD-ALH{{ agebd_env_suffix_upper }}:TESTSERVICE99-X00-ONOFF</string>
<string>AGEBD-ALH@@agebd_env_suffix_upper@@:TESTSERVICE99-X00-ONOFF</string>
</property>
</widget>
<widget class="QLabel" name="label">
@@ -70,7 +70,7 @@
</font>
</property>
<property name="text">
<string>Value of AGEBD-TESTSERVICE99-X00{{ agebd_env_suffix_upper }}:AO</string>
<string>Value of AGEBD-TESTSERVICE99-X00@@agebd_env_suffix_upper@@:AO</string>
</property>
</widget>
</widget>
@@ -1,5 +1,5 @@
file MASTER.template {
pattern { SUFFIX SERVICE STARTON AUTOOFF }
{ "{{ agebd_env_suffix_upper }}", "MASTER" , "0", "30" }
{ "{{ agebd_env_suffix_upper }}", "TESTSERVICE99-X00" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "MASTER" , "0", "30" }
{ "@@agebd_env_suffix_upper@@", "TESTSERVICE99-X00" , "0", "0" }
}
@@ -1,4 +1,4 @@
file TESTSERVICE99-X00.template {
pattern { DEVICE }
{ AGEBD-TESTSERVICE99-X00{{ agebd_env_suffix_upper }} }
{ AGEBD-TESTSERVICE99-X00@@agebd_env_suffix_upper@@ }
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -3,9 +3,9 @@ Description=AGEBD-SERVICE-TESTSERVICE99-X00
After=network.target
[Service]
Environment=AGEBD_ENV={{ agebd_env }}
Environment=AGEBD_ENV=@@agebd_env@@
Environment=PYTHONUNBUFFERED=1
ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh TESTSERVICE99-X00
ExecStart=/sls/bd/hla/@@agebd_env@@/bin/start_service.sh TESTSERVICE99-X00
Restart=no
[Install]
+17 -17
View File
@@ -71,7 +71,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -106,7 +106,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">!A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
@@ -138,7 +138,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-DBPM3CURR,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX,service=TUNEFBX,name=Hor. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY,service=TUNEFBY,name=Ver. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui</string>
<string>IOC=AGEBD-CPCL-DBPM3CURR@@agebd_env_suffix_upper@@,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM@@agebd_env_suffix_upper@@,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT@@agebd_env_suffix_upper@@,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING@@agebd_env_suffix_upper@@,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING@@agebd_env_suffix_upper@@,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD@@agebd_env_suffix_upper@@,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG@@agebd_env_suffix_upper@@,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP@@agebd_env_suffix_upper@@,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS@@agebd_env_suffix_upper@@,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP@@agebd_env_suffix_upper@@,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX@@agebd_env_suffix_upper@@,service=TUNEFBX,name=Hor. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY@@agebd_env_suffix_upper@@,service=TUNEFBY,name=Ver. Tune Feedback,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -246,7 +246,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-NTURNS,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
<string>IOC=AGEBD-CPCL-NTURNS@@agebd_env_suffix_upper@@,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL@@agebd_env_suffix_upper@@,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE@@agebd_env_suffix_upper@@,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -586,7 +586,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ALIVE</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ALIVE</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -602,7 +602,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STARTTIME</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STARTTIME</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -624,7 +624,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STATUS</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STATUS</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -646,7 +646,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-VERSION</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-VERSION</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -668,7 +668,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -717,7 +717,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF-RB</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF-RB</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -763,7 +763,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:STATUS</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:STATUS</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -792,7 +792,7 @@ caLabel[statusTip="Operation"]{
<string>/ioc/modules/qt/iocStats.ui</string>
</property>
<property name="args">
<string>IOC=AGEBD-CPCL-MASTER;</string>
<string>IOC=AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@;</string>
</property>
</widget>
<widget class="caLabel" name="calabel_42">
@@ -986,7 +986,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01 systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@ systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
</property>
</widget>
<widget class="caScriptButton" name="cascriptbutton_2">
@@ -1015,7 +1015,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01"</string>
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@"</string>
</property>
</widget>
</widget>
@@ -1040,7 +1040,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:MASTER-LOGS-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:MASTER-LOGS-REQ</string>
</property>
<property name="label">
<string notr="true">Logs</string>
@@ -1106,7 +1106,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="label">
<string notr="true">Reload</string>
@@ -1172,7 +1172,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:RESTART</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:RESTART</string>
</property>
<property name="label">
<string notr="true">↺</string>
@@ -1,4 +1,4 @@
file MASTER.template {
pattern { SUFFIX SERVICE STARTON AUTOOFF }
{ "{{ agebd_env_suffix_upper }}", "MASTER" , "0", "30" }
{ "@@agebd_env_suffix_upper@@", "MASTER" , "0", "30" }
}
Generated
+2 -147
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -37,8 +39,6 @@ version = "0.1.0"
source = { editable = "." }
dependencies = [
{ name = "agebd" },
{ name = "ansible" },
{ name = "ansible-runner" },
{ name = "copier" },
{ name = "pydantic" },
{ name = "pydantic-settings" },
@@ -60,8 +60,6 @@ dev = [
[package.metadata]
requires-dist = [
{ name = "agebd", editable = "../packages/agebd" },
{ name = "ansible", specifier = ">=8.7.0" },
{ name = "ansible-runner", specifier = ">=2.4.3" },
{ name = "copier", specifier = ">=9.10.3" },
{ name = "pydantic", specifier = ">=2.13.4" },
{ name = "pydantic-settings", specifier = ">=2.14.2" },
@@ -98,49 +96,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
]
[[package]]
name = "ansible"
version = "10.7.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ansible-core" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d4/64/29fdff6fe7682342adb54802c1cd90b2272d382e1743089af88f90a1d986/ansible-10.7.0.tar.gz", hash = "sha256:59d29e3de1080e740dfa974517d455217601b16d16880314d9be26145c68dc22", size = 41256974, upload-time = "2024-12-03T18:04:25.794Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f3/95/cb8944902a2cdd94b1e19ff73695548679a388b9c473dc63c8dc64ffea3a/ansible-10.7.0-py3-none-any.whl", hash = "sha256:0089f08e047ceb70edd011be009f5c6273add613fbe491e9697c0556c989d8ea", size = 51576038, upload-time = "2024-12-03T18:04:20.065Z" },
]
[[package]]
name = "ansible-core"
version = "2.17.14"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cryptography" },
{ name = "jinja2" },
{ name = "packaging" },
{ name = "pyyaml" },
{ name = "resolvelib" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ff/80/2925a0564f6f99a8002c3be3885b83c3a1dc5f57ebf00163f528889865f5/ansible_core-2.17.14.tar.gz", hash = "sha256:7c17fee39f8c29d70e3282a7e9c10bd70d5cd4fd13ddffc5dcaa52adbd142ff8", size = 3119687, upload-time = "2025-09-08T18:28:03.158Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/86/29/d694562f1a875b50aa74f691521fe493704f79cf1938cd58f28f7e2327d2/ansible_core-2.17.14-py3-none-any.whl", hash = "sha256:34a49582a57c2f2af17ede2cefd3b3602a2d55d22089f3928570d52030cafa35", size = 2189656, upload-time = "2025-09-08T18:28:00.375Z" },
]
[[package]]
name = "ansible-runner"
version = "2.4.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "packaging" },
{ name = "pexpect" },
{ name = "python-daemon" },
{ name = "pyyaml" },
]
sdist = { url = "https://files.pythonhosted.org/packages/68/4f/62222b42b52cc771db51ccc77ffac19cc5f0196ff61de7c93585845a819b/ansible_runner-2.4.3.tar.gz", hash = "sha256:5f3025529bb968fdc3b627457dd8d418dbf9d53bc73735d50e69c28544d53031", size = 154148, upload-time = "2026-03-16T18:42:14.861Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/e3/89/fa7f81db6134caa455c9351373ee934b5fdeed212eb939d6c42d80d683d7/ansible_runner-2.4.3-py3-none-any.whl", hash = "sha256:cdac6daa151a50084ffda710e769db23fa975fc0507796191d7708831b286e37", size = 80257, upload-time = "2026-03-16T18:42:13.72Z" },
]
[[package]]
name = "asttokens"
version = "3.0.2"
@@ -150,29 +105,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/d4/2b/04b8a15f3a1c77bc79ddf5c73875327f34b4fa75982df2b76e45e402d364/asttokens-3.0.2-py3-none-any.whl", hash = "sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933", size = 28702, upload-time = "2026-07-12T03:31:47.542Z" },
]
[[package]]
name = "cffi"
version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser", marker = "implementation_name != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c0/e9/6d7724983b3d5a0908dbf74f64038ade77c18646ff6636ec7894fd392ce1/cffi-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0", size = 183837, upload-time = "2026-07-06T21:32:09.655Z" },
{ url = "https://files.pythonhosted.org/packages/69/aa/24580a278de21fd7322635556334d9b535f1cbc00b0a3919447cdf464c65/cffi-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd", size = 184226, upload-time = "2026-07-06T21:32:11.196Z" },
{ url = "https://files.pythonhosted.org/packages/88/a9/02cae418ec4beb282ace11958d9d4737793439d561fadc7e6d56f2e2b354/cffi-2.1.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46", size = 211107, upload-time = "2026-07-06T21:32:12.328Z" },
{ url = "https://files.pythonhosted.org/packages/3b/30/c806937ed5e4c2c7ac30d9d6b76b5dc57ff8b75d83800d9bb11a8253cf2a/cffi-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2", size = 218733, upload-time = "2026-07-06T21:32:13.67Z" },
{ url = "https://files.pythonhosted.org/packages/f9/cf/398272b8bbfd58aa314fda5a7f1cdbb26d1d78ae324a11211521315dd1f0/cffi-2.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd", size = 205543, upload-time = "2026-07-06T21:32:15.148Z" },
{ url = "https://files.pythonhosted.org/packages/45/ca/f91641185cdd90c36d317a9dc7f85e88ef8682d8b300977baff5e23c35d8/cffi-2.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3", size = 205460, upload-time = "2026-07-06T21:32:16.479Z" },
{ url = "https://files.pythonhosted.org/packages/38/66/04781a77b411f0bb5b234d62c1814754ab75ebe455ccff1b08e8d7aae98f/cffi-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0", size = 218760, upload-time = "2026-07-06T21:32:17.98Z" },
{ url = "https://files.pythonhosted.org/packages/d0/9a/bb1d5ed9c3fcae158e9f6391bf309c95d98c2ac37ed56573228471d0af5e/cffi-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43", size = 221230, upload-time = "2026-07-06T21:32:19.407Z" },
{ url = "https://files.pythonhosted.org/packages/41/aa/3c1409cdd26094efacd1c36c66e0a6eb9d4296e4fd4f9901b8b2042f4323/cffi-2.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c", size = 213524, upload-time = "2026-07-06T21:32:20.828Z" },
{ url = "https://files.pythonhosted.org/packages/fa/75/74dfb7c3fc6ebbd408038476bd4c1d7e925c62614e7b9c534ecc34218288/cffi-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd", size = 220341, upload-time = "2026-07-06T21:32:21.9Z" },
{ url = "https://files.pythonhosted.org/packages/70/b6/9003c33a3e7d2c1306f5962e646457dcfe5a8cd8fce6bbe02d7af25db783/cffi-2.1.0-cp310-cp310-win32.whl", hash = "sha256:9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f", size = 174578, upload-time = "2026-07-06T21:32:23.073Z" },
{ url = "https://files.pythonhosted.org/packages/8a/26/710688310447531c7a22f857c7f79d9855ec18b03e04494ced723fb37e2f/cffi-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da", size = 185071, upload-time = "2026-07-06T21:32:24.671Z" },
]
[[package]]
name = "colorama"
version = "0.4.6"
@@ -207,44 +139,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/22/2c/68dec88ee26f96af2d4d8ee9d8567313a0826f4fd6bc5ae4527be670d354/copier-9.17.0-py3-none-any.whl", hash = "sha256:fe4e7b59faf4c0e1386eccbb79c6797e6df33ca20d5de49a8372571d8669f2ad", size = 65954, upload-time = "2026-07-13T14:33:03.301Z" },
]
[[package]]
name = "cryptography"
version = "49.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
{ name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" },
{ url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" },
{ url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" },
{ url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" },
{ url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" },
{ url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" },
{ url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" },
{ url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" },
{ url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" },
{ url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" },
{ url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" },
{ url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" },
{ url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" },
{ url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" },
{ url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" },
{ url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" },
{ url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" },
{ url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" },
{ url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" },
{ url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" },
{ url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" },
{ url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" },
{ url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" },
{ url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" },
{ url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" },
{ url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" },
]
[[package]]
name = "decorator"
version = "5.3.1"
@@ -406,15 +300,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/72/b9/313e8f2f2e9517ae050a692ae7b3e4b3f17cc5e6dfea0db51fe14e586580/jinja2_ansible_filters-1.3.2-py3-none-any.whl", hash = "sha256:e1082f5564917649c76fed239117820610516ec10f87735d0338688800a55b34", size = 18975, upload-time = "2022-06-30T14:08:49.571Z" },
]
[[package]]
name = "lockfile"
version = "0.12.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/17/47/72cb04a58a35ec495f96984dddb48232b551aafb95bde614605b754fe6f7/lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799", size = 20874, upload-time = "2015-11-25T18:29:58.279Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa", size = 13564, upload-time = "2015-11-25T18:29:51.462Z" },
]
[[package]]
name = "markdown-it-py"
version = "4.2.0"
@@ -597,15 +482,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
]
[[package]]
name = "pycparser"
version = "3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
]
[[package]]
name = "pydantic"
version = "2.13.4"
@@ -748,18 +624,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" },
]
[[package]]
name = "python-daemon"
version = "3.1.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "lockfile" },
]
sdist = { url = "https://files.pythonhosted.org/packages/3d/37/4f10e37bdabc058a32989da2daf29e57dc59dbc5395497f3d36d5f5e2694/python_daemon-3.1.2.tar.gz", hash = "sha256:f7b04335adc473de877f5117e26d5f1142f4c9f7cd765408f0877757be5afbf4", size = 71576, upload-time = "2024-12-03T08:41:07.843Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/45/3c/b88167e2d6785c0e781ee5d498b07472aeb9b6765da3b19e7cc9e0813841/python_daemon-3.1.2-py3-none-any.whl", hash = "sha256:b906833cef63502994ad48e2eab213259ed9bb18d54fa8774dcba2ff7864cec6", size = 30872, upload-time = "2024-12-03T08:41:03.322Z" },
]
[[package]]
name = "python-dotenv"
version = "1.2.2"
@@ -798,15 +662,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/3c/26/1062c7ec1b053db9e499b4d2d5bc231743201b74051c973dadeac80a8f43/questionary-2.1.1-py3-none-any.whl", hash = "sha256:a51af13f345f1cdea62347589fbb6df3b290306ab8930713bfae4d475a7d4a59", size = 36753, upload-time = "2025-08-28T19:00:19.56Z" },
]
[[package]]
name = "resolvelib"
version = "1.0.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/ce/10/f699366ce577423cbc3df3280063099054c23df70856465080798c6ebad6/resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309", size = 21065, upload-time = "2023-03-09T05:10:38.292Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d2/fc/e9ccf0521607bcd244aa0b3fbd574f71b65e9ce6a112c83af988bbbe2e23/resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf", size = 17194, upload-time = "2023-03-09T05:10:36.214Z" },
]
[[package]]
name = "rich"
version = "15.0.0"
+77
View File
@@ -0,0 +1,77 @@
# Single source of truth for every deploy-time substitution in this repo.
#
# There are two substitution stages, and they use different delimiters on
# purpose:
#
# {{ token }} creation-time. Resolved once by copier when a new service is
# created (cli/src/core/service_creator.py). Never survives
# into a committed file.
#
# @@token@@ deploy-time. Resolved on every deploy, per environment, by
# agebd.subs. Lives in committed files.
#
# This file declares the deploy-time stage only. scripts/ci/check_subs.py
# enforces that every @@token@@ in the repo is declared here, and that it
# only appears in a path that actually gets rendered.
#
# 'local' is deliberately absent: it is a runtime mode for tests without EPICS
# access (see agebd.enums.AGEBD_ENV), not a deploy target.
environments:
prod:
agebd_env: prod
agebd_env_suffix_upper: ""
agebd_env_suffix_lower: ""
dev:
agebd_env: dev
agebd_env_suffix_upper: "-DEV"
agebd_env_suffix_lower: "-dev"
# Every deploy-time token. Each environment above must define exactly the
# tokens with source 'environment' -- adding one here without adding it to
# every environment is a load-time error.
tokens:
agebd_env:
source: environment
description: >-
Deployment environment name. Used in deploy paths and systemd units,
e.g. /sls/bd/hla/dev/bin/start_service.sh.
agebd_env_suffix_upper:
source: environment
description: >-
Uppercase suffix appended to EPICS device names, e.g. AGEBD-TUNE-DEV.
Used in IOC substitution files and Qt UI files.
agebd_env_suffix_lower:
source: environment
description: >-
Lowercase suffix appended to host names, e.g. sls-vserv-bd-01-dev.
Used in IOC parameter files.
ioc_port:
source: registry
description: >-
IOC port for the service being deployed, read from
config/services_registry.yml.
# Where deploy-time tokens are allowed to live, as repo-root-relative globs.
locations:
# Rendered at deploy time by agebd.subs. A token here is resolved.
render:
- services/*/current/ioc
- services/*/current/systemd
- qt
# Carry deploy-time tokens verbatim, because the copy they produce lands in
# a render path. A token here is NOT resolved in place.
passthrough:
- templates
- cli/tests/fixtures
# The substitution machinery itself: code that renders, generates or
# documents tokens. Naming a token here is expected; nothing is resolved,
# and the leftover-delimiter check does not apply.
references:
- .gitea/scripts
- cli/src/models
- packages/agebd/src/agebd
- packages/agebd/tests
- scripts/ci
- scripts/tests
- config
-36
View File
@@ -1,36 +0,0 @@
# Ansible
## Running a playbook manually
Set vars on command line:
```
ansible-playbook ansible/playbooks/add-new-service.yml \
-i ansible/hosts.yml \
--extra-vars="repo_root=${{ github.workspace }} agebd_env=dev service_name_lower=<service dir name>" \
-v
```
### Install an IOC
```
ansible-playbook ansible/playbooks/ioc-install.yml \
-i ansible/hosts.yml \
--extra-vars="agebd_env=dev branch_name=feature/add-service-playground service_name_lower=playground ioc_port=50003" \
-v
```
### Start an IOC
```
ansible-playbook ansible/playbooks/ioc-start.yml \
-i ansible/hosts.yml \
--extra-vars="service_name_lower=playground ioc_port=50003" \
-v
```
### Restart an IOC
```
ansible-playbook ansible/playbooks/ioc-restart.yml \
-i ansible/hosts.yml \
--extra-vars="agebd_env=dev branch_name=feature/add-service-playground service_name_lower=playground" \
-v
```
+1
View File
@@ -9,6 +9,7 @@ dependencies = [
"pyepics>=3.5.10",
"typer>=0.23.2",
"gitpython>=3.1.50",
"pyyaml>=6.0.3",
]
# Dev dependencies
+113
View File
@@ -0,0 +1,113 @@
"""
The one definition of how a service name is spelled in each context.
A service has a single canonical CamelCase name, recorded in
config/services_registry.yml. Everything else is derived from it by a fixed
rule: the directory it lives in, its Python module, its EPICS IOC, its systemd
unit. Those rules live here so that the CLI, the CI scripts and the deploy
scripts cannot drift apart on them.
The environment suffix is deliberately not part of any name here. It is a
deploy-time token (see agebd.subs), applied to the base names below.
"""
import re
#: Prefix of every EPICS IOC in this framework.
IOC_PREFIX = "AGEBD-CPCL"
#: Prefix of every systemd unit in this framework.
SYSTEMD_UNIT_PREFIX = "AGEBD-SERVICE"
#: Prefix of every service's Python package.
PACKAGE_PREFIX = "agebd"
VALID_NAME = re.compile(r"^[a-zA-Z0-9-]+$")
class InvalidServiceName(ValueError):
"""The name is not a legal service name."""
class ServiceName:
"""
A service's canonical name and every form derived from it.
>>> name = ServiceName("TuneFBx")
>>> name.dir_name, name.module_name, name.ioc_name
('tunefbx', 'agebd_tunefbx', 'AGEBD-CPCL-TUNEFBX')
"""
def __init__(self, name: str) -> None:
if not isinstance(name, str) or not VALID_NAME.match(name):
raise InvalidServiceName(
f"Invalid service name {name!r}: a service name may only contain "
f"uppercase and lowercase letters, numbers, and dashes."
)
self._name = name
@property
def camel(self) -> str:
"""The canonical name, as written in the registry and shown in the GUI."""
return self._name
@property
def upper(self) -> str:
return self._name.upper()
@property
def lower(self) -> str:
return self._name.lower()
@property
def lower_underscores(self) -> str:
return self.lower.replace("-", "_")
@property
def dir_name(self) -> str:
"""The directory under services/ that holds this service."""
return self.lower
@property
def module_name(self) -> str:
"""The Python package implementing this service."""
return f"{PACKAGE_PREFIX}_{self.lower_underscores}"
@property
def ioc_name(self) -> str:
"""
The IOC's base name. Deployments append the environment suffix token.
"""
return f"{IOC_PREFIX}-{self.upper}"
@property
def systemd_unit_name(self) -> str:
"""
The systemd unit file name. Unit names carry no environment suffix:
dev and prod run on different hosts.
"""
return f"{SYSTEMD_UNIT_PREFIX}-{self.upper}.service"
def matches(self, other) -> bool:
"""
Whether ``other`` names this service. Comparison is case-insensitive,
because callers hold the name in whatever casing their context uses.
"""
try:
return ServiceName(str(other)).lower == self.lower
except InvalidServiceName:
return False
def __str__(self) -> str:
return self.camel
def __repr__(self) -> str:
return f"ServiceName({self.camel!r})"
def __eq__(self, other) -> bool:
if isinstance(other, ServiceName):
return self.lower == other.lower
return NotImplemented
def __hash__(self) -> int:
return hash(self.lower)
+384
View File
@@ -0,0 +1,384 @@
"""
Single source of truth for deploy-time substitutions.
Committed files carry deploy-time placeholders written as ``@@token@@``.
This module is the only place that knows what those tokens resolve to.
There are two substitution stages in this repo, and they use different
delimiters on purpose:
``{{ token }}`` creation-time. Resolved once by copier when a new
service is created (cli/src/core/service_creator.py).
Never survives into a committed file.
``@@token@@`` deploy-time. Resolved on every deploy, per environment,
by this module. Lives in committed files.
Token values come from two sources, both declared in config/environments.yml:
environment the per-environment table in config/environments.yml
registry config/services_registry.yml, per service
Rendering is a strict regex substitution rather than a template engine. The
rendered files are EPICS database/substitution files and Qt XML, which are
full of braces and other characters a template engine would try to interpret;
and a regex over declared token names gives an exact "unknown token in this
file" error instead of silently leaving the placeholder in place -- which is
the failure mode of the sed calls this module replaces.
"""
import os
import re
from dataclasses import dataclass, field
from fnmatch import fnmatch
from pathlib import Path
from typing import Iterable, Iterator, Optional, Union
import yaml
from agebd.names import InvalidServiceName, ServiceName
from agebd.utils import get_git_root
CONFIG_DIR_ENV_VAR = "AGEBD_CONFIG_DIR"
ENVIRONMENTS_FILENAME = "environments.yml"
SERVICES_REGISTRY_FILENAME = "services_registry.yml"
ENVIRONMENT_SOURCE = "environment"
REGISTRY_SOURCE = "registry"
#: Deploy-time placeholder, e.g. ``@@agebd_env@@`` or ``@@agebd_env@@``.
TOKEN_PATTERN = re.compile(r"@@\s*([a-z][a-z0-9_]*)\s*@@")
#: The pre-migration deploy-time delimiters. Kept here so that the CI lint can
#: spot files that were missed by the switch to ``@@token@@``.
LEGACY_TOKEN_PATTERN = re.compile(r"\{\{\s*([a-z][a-z0-9_]*)\s*\}\}")
class SubstitutionError(Exception):
"""Base class for every error raised by this module."""
class UnknownTokenError(SubstitutionError):
"""A ``@@token@@`` was found that is not declared in environments.yml."""
def resolve_config_dir(config_dir: Optional[Union[str, Path]] = None) -> Path:
"""
Locate the directory holding environments.yml.
Explicit argument wins, then $AGEBD_CONFIG_DIR, then the config directory
of the surrounding git checkout. The env var is what deployed hosts use:
the deployed tree is not a git checkout.
"""
if config_dir is not None:
return Path(config_dir)
from_env = os.environ.get(CONFIG_DIR_ENV_VAR)
if from_env:
return Path(from_env)
try:
return get_git_root(__file__) / "config"
except Exception as e:
raise SubstitutionError(
"Could not locate the config directory: agebd is not installed inside a git "
f"checkout. Set ${CONFIG_DIR_ENV_VAR} to the directory holding "
f"{ENVIRONMENTS_FILENAME}."
) from e
@dataclass(frozen=True)
class TokenSpec:
name: str
source: str
description: str = ""
@dataclass
class SubstitutionsConfig:
"""The parsed contents of config/environments.yml."""
config_dir: Path
environments: dict
tokens: dict
render_paths: tuple = ()
passthrough_paths: tuple = ()
reference_paths: tuple = ()
@property
def environments_file(self) -> Path:
return self.config_dir / ENVIRONMENTS_FILENAME
@property
def services_registry_file(self) -> Path:
return self.config_dir / SERVICES_REGISTRY_FILENAME
@classmethod
def load(cls, config_dir: Optional[Union[str, Path]] = None) -> "SubstitutionsConfig":
resolved_dir = resolve_config_dir(config_dir)
path = resolved_dir / ENVIRONMENTS_FILENAME
if not path.is_file():
raise SubstitutionError(f"No {ENVIRONMENTS_FILENAME} found at: {path}")
with open(path) as f:
raw = yaml.safe_load(f) or {}
tokens = {
name: TokenSpec(
name=name,
source=spec["source"],
description=spec.get("description", ""),
)
for name, spec in (raw.get("tokens") or {}).items()
}
locations = raw.get("locations") or {}
config = cls(
config_dir=resolved_dir,
environments=raw.get("environments") or {},
tokens=tokens,
render_paths=tuple(locations.get("render") or ()),
passthrough_paths=tuple(locations.get("passthrough") or ()),
reference_paths=tuple(locations.get("references") or ()),
)
config.assert_valid()
return config
def assert_valid(self) -> None:
"""
Every environment must define exactly the tokens sourced from the
environment table -- no more, no less. This is what stops a new token
from being added for dev but forgotten for prod.
"""
if not self.environments:
raise SubstitutionError(f"No environments declared in {self.environments_file}")
for name, spec in self.tokens.items():
if spec.source not in (ENVIRONMENT_SOURCE, REGISTRY_SOURCE):
raise SubstitutionError(
f"Token '{name}' in {self.environments_file} has unknown source "
f"'{spec.source}'. Expected '{ENVIRONMENT_SOURCE}' or '{REGISTRY_SOURCE}'."
)
expected = self.environment_token_names()
for env_name, values in self.environments.items():
declared = set(values)
missing = expected - declared
unexpected = declared - expected
if missing:
raise SubstitutionError(
f"Environment '{env_name}' in {self.environments_file} is missing "
f"token(s): {', '.join(sorted(missing))}"
)
if unexpected:
raise SubstitutionError(
f"Environment '{env_name}' in {self.environments_file} defines "
f"token(s) that are not declared under 'tokens': "
f"{', '.join(sorted(unexpected))}"
)
def environment_token_names(self) -> set:
return {n for n, spec in self.tokens.items() if spec.source == ENVIRONMENT_SOURCE}
def registry_token_names(self) -> set:
return {n for n, spec in self.tokens.items() if spec.source == REGISTRY_SOURCE}
def assert_environment_exists(self, env: str) -> dict:
try:
return self.environments[env]
except KeyError:
known = ", ".join(sorted(self.environments))
raise SubstitutionError(
f"Unknown environment '{env}'. Declared in {self.environments_file}: {known}"
) from None
def expand_render_paths(self, repo_root: Union[str, Path]) -> list:
"""
Resolve the 'render' globs against a checkout, keeping only what exists.
"""
root = Path(repo_root)
found = []
for pattern in self.render_paths:
found.extend(sorted(p for p in root.glob(pattern) if p.is_dir()))
return found
def is_render_path(self, rel_path: Union[str, Path]) -> bool:
return _is_under_any(Path(rel_path), self.render_paths)
def is_passthrough_path(self, rel_path: Union[str, Path]) -> bool:
return _is_under_any(Path(rel_path), self.passthrough_paths)
def is_reference_path(self, rel_path: Union[str, Path]) -> bool:
"""
True for the substitution machinery itself -- code that renders,
generates or documents tokens rather than carrying them.
"""
return _is_under_any(Path(rel_path), self.reference_paths)
@dataclass
class Substitutions:
"""
Resolved deploy-time token values for one environment, and optionally for
one service.
"""
values: dict = field(default_factory=dict)
config: Optional[SubstitutionsConfig] = None
@classmethod
def for_env(cls, env: str, config_dir: Optional[Union[str, Path]] = None) -> "Substitutions":
"""
Tokens that depend only on the environment. Rendering a file that also
needs a registry token (``ioc_port``) with this will raise -- use
:meth:`for_service`.
"""
config = SubstitutionsConfig.load(config_dir)
return cls(values=dict(config.assert_environment_exists(str(env))), config=config)
@classmethod
def for_service(
cls, env: str, service_name: str, config_dir: Optional[Union[str, Path]] = None
) -> "Substitutions":
"""
Every deploy-time token, for one service in one environment.
"""
subs = cls.for_env(env, config_dir=config_dir)
assert subs.config is not None
if "ioc_port" in subs.config.registry_token_names():
subs.values["ioc_port"] = str(
read_ioc_port(subs.config.services_registry_file, service_name)
)
return subs
def __getitem__(self, token: str) -> str:
try:
return self.values[token]
except KeyError:
raise UnknownTokenError(self._unknown_token_message(token)) from None
def __contains__(self, token: str) -> bool:
return token in self.values
def render_text(self, text: str, origin: Optional[Union[str, Path]] = None) -> str:
"""
Replace every ``@@token@@`` in ``text``. Raises on an undeclared or
misspelled token rather than leaving it in the output.
"""
def replace(match: "re.Match") -> str:
token = match.group(1)
if token not in self.values:
raise UnknownTokenError(self._unknown_token_message(token, origin=origin))
return self.values[token]
return TOKEN_PATTERN.sub(replace, text)
def render_file(self, path: Union[str, Path]) -> bool:
"""
Render one file in place. Returns True if the file changed.
"""
path = Path(path)
original = path.read_text()
rendered = self.render_text(original, origin=path)
if rendered == original:
return False
path.write_text(rendered)
return True
def render_tree(self, root: Union[str, Path]) -> list:
"""
Render every text file under ``root`` in place. Returns the files that
changed.
"""
return [path for path in iter_text_files(root) if self.render_file(path)]
def _unknown_token_message(self, token: str, origin: Optional[Union[str, Path]] = None) -> str:
where = f" in {origin}" if origin else ""
known = ", ".join(sorted(self.values)) or "(none)"
declared_in = self.config.environments_file if self.config else ENVIRONMENTS_FILENAME
return (
f"Unknown deploy-time token '@@{token}@@'{where}. "
f"Declare it in {declared_in}, or fix the spelling. "
f"Available here: {known}."
)
def read_ioc_port(registry_file: Union[str, Path], service_name: str) -> int:
"""
Look up a service's IOC port in the services registry.
"""
with open(registry_file) as f:
registry = yaml.safe_load(f) or {}
entry = find_service_entry(registry.get("services") or [], service_name)
if entry is None:
raise SubstitutionError(f"Service '{service_name}' not found in {registry_file}")
return entry["ioc_port"]
def find_service_entry(services: Iterable, service_name: str):
"""
Find a service's registry entry by name, or None.
Registry names are CamelCase; callers hold whatever casing their context
uses, so matching goes through agebd.names.ServiceName.
"""
try:
wanted = ServiceName(service_name)
except InvalidServiceName:
return None
for entry in services:
if wanted.matches(entry.get("name", "")):
return entry
return None
def find_tokens(text: str) -> set:
"""Every deploy-time token name appearing in ``text``."""
return set(TOKEN_PATTERN.findall(text))
def find_legacy_tokens(text: str) -> set:
"""Every pre-migration ``{{ token }}`` name appearing in ``text``."""
return set(LEGACY_TOKEN_PATTERN.findall(text))
SKIPPED_DIRS = frozenset(
{".git", ".venv", ".pixi", ".cache", ".pytest_cache", ".ruff_cache", "__pycache__"}
)
def iter_text_files(root: Union[str, Path]) -> Iterator[Path]:
"""
Yield readable text files under ``root``, skipping build/cache directories
and anything that is not valid UTF-8.
"""
for path in sorted(Path(root).rglob("*")):
if not path.is_file():
continue
if SKIPPED_DIRS.intersection(path.parts):
continue
try:
path.read_text()
except (UnicodeDecodeError, OSError):
continue
yield path
def _is_under_any(rel_path: Path, patterns: Iterable) -> bool:
"""
True if ``rel_path`` itself, or any of its parent directories, matches one
of the repo-root-relative directory globs in ``patterns``.
"""
candidates = [rel_path] + [p for p in rel_path.parents if str(p) != "."]
for pattern in patterns:
pattern_parts = Path(pattern).parts
for candidate in candidates:
parts = candidate.parts
if len(parts) == len(pattern_parts) and all(
fnmatch(part, pat) for part, pat in zip(parts, pattern_parts)
):
return True
return False
+66
View File
@@ -0,0 +1,66 @@
import pytest
from agebd.names import InvalidServiceName, ServiceName
@pytest.mark.parametrize(
"name, upper, lower, underscores",
[
("Tune", "TUNE", "tune", "tune"),
("TauBPM", "TAUBPM", "taubpm", "taubpm"),
("TuneFBx", "TUNEFBX", "tunefbx", "tunefbx"),
("OpticsFF-X02S", "OPTICSFF-X02S", "opticsff-x02s", "opticsff_x02s"),
],
)
def test_case_forms(name, upper, lower, underscores):
service = ServiceName(name)
assert service.camel == name
assert service.upper == upper
assert service.lower == lower
assert service.lower_underscores == underscores
def test_derived_names():
service = ServiceName("OpticsFF-X02S")
assert service.dir_name == "opticsff-x02s"
assert service.module_name == "agebd_opticsff_x02s"
assert service.ioc_name == "AGEBD-CPCL-OPTICSFF-X02S"
assert service.systemd_unit_name == "AGEBD-SERVICE-OPTICSFF-X02S.service"
def test_derived_names_carry_no_environment_suffix():
"""The suffix is a deploy-time token, applied to these base names."""
service = ServiceName("Tune")
assert "DEV" not in service.ioc_name
assert "DEV" not in service.systemd_unit_name
@pytest.mark.parametrize("name", ["Tune", "tune", "TUNE", "tUnE"])
def test_matches_is_case_insensitive(name):
assert ServiceName("Tune").matches(name)
def test_does_not_match_a_different_service():
assert not ServiceName("Tune").matches("TuneBump")
def test_does_not_match_an_invalid_name():
assert not ServiceName("Tune").matches("Tune!")
@pytest.mark.parametrize("name", ["", "Tune Bump", "Tune_Bump", "Tune!", "Tune/Bump"])
def test_invalid_names_are_rejected(name):
with pytest.raises(InvalidServiceName):
ServiceName(name)
def test_equality_and_hashing_ignore_case():
assert ServiceName("Tune") == ServiceName("TUNE")
assert len({ServiceName("Tune"), ServiceName("tune")}) == 1
def test_str_is_the_canonical_name():
assert str(ServiceName("TauBPM")) == "TauBPM"
+1 -1
View File
@@ -1,8 +1,8 @@
from unittest.mock import patch
from agebd.service.pvs import BasePVs
from agebd.runner import CallbackRunner, PeriodicRunner
from agebd.service.base import BaseService
from agebd.service.pvs import BasePVs
class DummyPV:
+1 -1
View File
@@ -1,5 +1,5 @@
from agebd.service.pvs import BasePVs
from agebd.service.base import BaseService
from agebd.service.pvs import BasePVs
class DummyPV:
+217
View File
@@ -0,0 +1,217 @@
import pytest
import yaml
from agebd.subs import (
SubstitutionError,
Substitutions,
SubstitutionsConfig,
UnknownTokenError,
find_legacy_tokens,
find_tokens,
read_ioc_port,
)
ENVIRONMENTS = {
"environments": {
"prod": {
"agebd_env": "prod",
"agebd_env_suffix_upper": "",
"agebd_env_suffix_lower": "",
},
"dev": {
"agebd_env": "dev",
"agebd_env_suffix_upper": "-DEV",
"agebd_env_suffix_lower": "-dev",
},
},
"tokens": {
"agebd_env": {"source": "environment", "description": "env name"},
"agebd_env_suffix_upper": {"source": "environment", "description": "upper suffix"},
"agebd_env_suffix_lower": {"source": "environment", "description": "lower suffix"},
"ioc_port": {"source": "registry", "description": "ioc port"},
},
"locations": {
"render": ["services/*/current/ioc", "qt"],
"passthrough": ["templates"],
},
}
REGISTRY = {
"next_available_ioc_port": 50002,
"services": [
{"name": "Master", "ioc_port": 50000, "status": "active"},
{"name": "TauBPM", "ioc_port": 50001, "status": "active"},
],
}
@pytest.fixture
def config_dir(tmp_path):
(tmp_path / "environments.yml").write_text(yaml.safe_dump(ENVIRONMENTS))
(tmp_path / "services_registry.yml").write_text(yaml.safe_dump(REGISTRY))
return tmp_path
def write_environments(config_dir, environments):
(config_dir / "environments.yml").write_text(yaml.safe_dump(environments))
def test_for_env_resolves_environment_tokens(config_dir):
subs = Substitutions.for_env("dev", config_dir=config_dir)
assert subs["agebd_env"] == "dev"
assert subs["agebd_env_suffix_upper"] == "-DEV"
assert subs["agebd_env_suffix_lower"] == "-dev"
def test_prod_suffixes_are_empty(config_dir):
subs = Substitutions.for_env("prod", config_dir=config_dir)
assert subs.render_text("AGEBD-TUNE@@agebd_env_suffix_upper@@:AO") == "AGEBD-TUNE:AO"
def test_for_service_adds_ioc_port(config_dir):
subs = Substitutions.for_service("dev", "taubpm", config_dir=config_dir)
assert subs["ioc_port"] == "50001"
def test_render_text_substitutes_every_occurrence(config_dir):
subs = Substitutions.for_env("dev", config_dir=config_dir)
text = "AGEBD-ALH@@agebd_env_suffix_upper@@:X\nsls-vserv-bd-01@@agebd_env_suffix_lower@@\n"
assert subs.render_text(text) == "AGEBD-ALH-DEV:X\nsls-vserv-bd-01-dev\n"
def test_render_text_raises_on_misspelled_token(config_dir):
subs = Substitutions.for_env("dev", config_dir=config_dir)
with pytest.raises(UnknownTokenError, match="agebd_env_sufix_upper"):
subs.render_text("AGEBD-TUNE@@agebd_env_sufix_upper@@:AO", origin="TUNE.subs")
def test_render_text_raises_when_registry_token_is_not_loaded(config_dir):
"""for_env() has no ioc_port, so a parameters file must fail loudly."""
subs = Substitutions.for_env("dev", config_dir=config_dir)
with pytest.raises(UnknownTokenError, match="ioc_port"):
subs.render_text("ioc_port: @@ioc_port@@")
def test_render_file_reports_whether_it_changed(config_dir, tmp_path):
subs = Substitutions.for_env("dev", config_dir=config_dir)
path = tmp_path / "AGEBD-CPCL-TUNE_main.subs"
path.write_text("{ AGEBD-TUNE@@agebd_env_suffix_upper@@ }\n")
assert subs.render_file(path) is True
assert path.read_text() == "{ AGEBD-TUNE-DEV }\n"
assert subs.render_file(path) is False
def test_render_tree_skips_cache_directories(config_dir, tmp_path):
subs = Substitutions.for_env("dev", config_dir=config_dir)
(tmp_path / "ioc").mkdir()
(tmp_path / "ioc" / "a.subs").write_text("AGEBD-A@@agebd_env_suffix_upper@@")
(tmp_path / "__pycache__").mkdir()
(tmp_path / "__pycache__" / "b.subs").write_text("AGEBD-B@@agebd_env_suffix_upper@@")
changed = subs.render_tree(tmp_path)
assert [p.name for p in changed] == ["a.subs"]
assert (tmp_path / "__pycache__" / "b.subs").read_text().endswith("@@agebd_env_suffix_upper@@")
def test_replacement_value_is_literal(config_dir):
"""A value containing regex backreference syntax must not be interpreted."""
environments = yaml.safe_load(yaml.safe_dump(ENVIRONMENTS))
environments["environments"]["dev"]["agebd_env_suffix_upper"] = r"-\1DEV"
write_environments(config_dir, environments)
subs = Substitutions.for_env("dev", config_dir=config_dir)
assert subs.render_text("AGEBD-A@@agebd_env_suffix_upper@@") == r"AGEBD-A-\1DEV"
def test_unknown_environment_lists_the_known_ones(config_dir):
with pytest.raises(SubstitutionError, match="dev, prod"):
Substitutions.for_env("staging", config_dir=config_dir)
def test_token_missing_from_one_environment_is_a_load_error(config_dir):
environments = yaml.safe_load(yaml.safe_dump(ENVIRONMENTS))
del environments["environments"]["prod"]["agebd_env_suffix_lower"]
write_environments(config_dir, environments)
with pytest.raises(SubstitutionError, match="missing token"):
SubstitutionsConfig.load(config_dir)
def test_undeclared_token_in_an_environment_is_a_load_error(config_dir):
environments = yaml.safe_load(yaml.safe_dump(ENVIRONMENTS))
environments["environments"]["dev"]["agebd_env_suffix_mixed"] = "-Dev"
write_environments(config_dir, environments)
with pytest.raises(SubstitutionError, match="not declared"):
SubstitutionsConfig.load(config_dir)
def test_unknown_token_source_is_a_load_error(config_dir):
environments = yaml.safe_load(yaml.safe_dump(ENVIRONMENTS))
environments["tokens"]["ioc_port"]["source"] = "somewhere"
write_environments(config_dir, environments)
with pytest.raises(SubstitutionError, match="unknown source"):
SubstitutionsConfig.load(config_dir)
def test_read_ioc_port_is_case_insensitive(config_dir):
registry_file = config_dir / "services_registry.yml"
assert read_ioc_port(registry_file, "taubpm") == 50001
assert read_ioc_port(registry_file, "TauBPM") == 50001
assert read_ioc_port(registry_file, "TAUBPM") == 50001
def test_read_ioc_port_raises_for_unknown_service(config_dir):
with pytest.raises(SubstitutionError, match="Nope"):
read_ioc_port(config_dir / "services_registry.yml", "Nope")
def test_path_classification(config_dir):
config = SubstitutionsConfig.load(config_dir)
assert config.is_render_path("services/tune/current/ioc/TUNE.template")
assert config.is_render_path("qt/A_BD_Tune.ui")
assert config.is_passthrough_path("templates/service/x/current/ioc/a.jinja")
assert not config.is_render_path("services/tune/current/app/src/main.py")
assert not config.is_passthrough_path("services/tune/current/app/src/main.py")
def test_expand_render_paths(config_dir, tmp_path):
config = SubstitutionsConfig.load(config_dir)
repo = tmp_path / "repo"
(repo / "services" / "tune" / "current" / "ioc").mkdir(parents=True)
(repo / "services" / "tune" / "current" / "app").mkdir(parents=True)
(repo / "qt").mkdir()
expanded = {p.relative_to(repo).as_posix() for p in config.expand_render_paths(repo)}
assert expanded == {"services/tune/current/ioc", "qt"}
def test_find_tokens_ignores_non_token_angle_brackets():
assert find_tokens("@@b@@ and @@agebd_env@@") == {"b", "agebd_env"}
assert find_tokens("user@@example.com") == set()
assert find_tokens("@@ NotAToken @@") == set()
def test_find_legacy_tokens_returns_both_stages():
"""
It cannot tell the two stages apart on syntax alone -- callers intersect
the result with the declared deploy-time tokens.
"""
assert find_legacy_tokens("{{ agebd_env_suffix_upper }} {{service_name_upper}}") == {
"agebd_env_suffix_upper",
"service_name_upper",
}
+19
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -28,6 +29,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -532,6 +534,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
]
[[package]]
name = "readme-renderer"
version = "45.0"
+15 -15
View File
@@ -43,7 +43,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:DBPM3CURR-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:DBPM3CURR-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -185,7 +185,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CHARGE-AVG</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CHARGE-AVG</string>
</property>
<property name="foreground">
<color>
@@ -245,7 +245,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CURRENT-AVG</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CURRENT-AVG</string>
</property>
<property name="foreground">
<color>
@@ -305,7 +305,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:ACCUMULATED-BEAM-DOSE</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:ACCUMULATED-BEAM-DOSE</string>
</property>
<property name="foreground">
<color>
@@ -521,7 +521,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CURRENT-AVG.EGU</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CURRENT-AVG.EGU</string>
</property>
<property name="foreground">
<color>
@@ -581,7 +581,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CHARGE-AVG.EGU</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CHARGE-AVG.EGU</string>
</property>
<property name="foreground">
<color>
@@ -641,7 +641,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:ACCUMULATED-BEAM-DOSE.EGU</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:ACCUMULATED-BEAM-DOSE.EGU</string>
</property>
<property name="foreground">
<color>
@@ -755,7 +755,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:DBPM3CURR-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:DBPM3CURR-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -796,7 +796,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CALIBRATION-DBPM3-2-PCT-NEW</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CALIBRATION-DBPM3-2-PCT-NEW</string>
</property>
<property name="foreground">
<color>
@@ -853,7 +853,7 @@
<string>Calculate New Calibration Factor</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CONTROL-RECALIBRATE</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CONTROL-RECALIBRATE</string>
</property>
<property name="label">
<string notr="true">Calculate New Calibration Factor</string>
@@ -872,7 +872,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CONTROL-RECALIBRATE-NPTS</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CONTROL-RECALIBRATE-NPTS</string>
</property>
<property name="precision">
<number>0</number>
@@ -894,7 +894,7 @@
<string>Apply New Calibration Factor</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CONTROL-RECALIBRATE-APPLY</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CONTROL-RECALIBRATE-APPLY</string>
</property>
<property name="label">
<string notr="true">Apply New Calibration Factor</string>
@@ -922,7 +922,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:CALIBRATION-DBPM3-2-PCT</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:CALIBRATION-DBPM3-2-PCT</string>
</property>
<property name="foreground">
<color>
@@ -1118,7 +1118,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:ACCUMULATED-BEAM-DOSE-PCT</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:ACCUMULATED-BEAM-DOSE-PCT</string>
</property>
<property name="foreground">
<color>
@@ -1194,7 +1194,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }}:ACCUMULATED-BEAM-DOSE-PCT.EGU</string>
<string notr="true">AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@:ACCUMULATED-BEAM-DOSE-PCT.EGU</string>
</property>
<property name="foreground">
<color>
+1 -1
View File
@@ -106,7 +106,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="macro">
<string>name=Orbit Feedback,alive=ARSGE-CECL-FOFB1:FOFB-OPERATE,panelcmd=A_DI_FOFB_CECL_USER.ui;name=Hor. Tune Feedback,onoff=AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBX-ONOFF,alive=AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBX-ALIVE,panelcmd=A_BD_TuneBump.ui;name=Ver. Tune Feedback,onoff=AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBY-ONOFF,alive=AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBY-ALIVE,panelcmd=A_BD_TuneBump.ui</string>
<string>name=Orbit Feedback,alive=ARSGE-CECL-FOFB1:FOFB-OPERATE,panelcmd=A_DI_FOFB_CECL_USER.ui;name=Hor. Tune Feedback,onoff=AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBX-ONOFF,alive=AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBX-ALIVE,panelcmd=A_BD_TuneBump.ui;name=Ver. Tune Feedback,onoff=AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBY-ONOFF,alive=AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBY-ALIVE,panelcmd=A_BD_TuneBump.ui</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_FeedBackOverview_inc.ui</string>
+11 -11
View File
@@ -66,7 +66,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:INJECTIONGUARD-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:INJECTIONGUARD-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -89,7 +89,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CONTROL-MODE</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CONTROL-MODE</string>
</property>
</widget>
<widget class="caLabel" name="calabel">
@@ -125,7 +125,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-SUM</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-SUM</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -405,7 +405,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>30</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:STATUS-SECRET-MASTER</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:STATUS-SECRET-MASTER</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -547,7 +547,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-SUM-OP</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-SUM-OP</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -617,7 +617,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-SUM-MD</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-SUM-MD</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -696,7 +696,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-SUM-LATCH</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-SUM-LATCH</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -724,7 +724,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:RESET-LATCHES</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:RESET-LATCHES</string>
</property>
<property name="label">
<string notr="true">Reset</string>
@@ -771,7 +771,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:LOG</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:LOG</string>
</property>
<property name="fontScaleMode" stdset="0">
<enum>caMultiLineString::None</enum>
@@ -790,7 +790,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string>Clear Logs</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:LOG-CLEAR</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:LOG-CLEAR</string>
</property>
<property name="label">
<string notr="true">Clear Logs</string>
@@ -819,7 +819,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:LOG-PAUSE</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:LOG-PAUSE</string>
</property>
<property name="background">
<color>
+6 -6
View File
@@ -30,7 +30,7 @@
</size>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CONTROL-BRIDGE-CHECK-$(checknr)</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CONTROL-BRIDGE-CHECK-$(checknr)</string>
</property>
<property name="background">
<color alpha="0">
@@ -62,7 +62,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-$(checknr)</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-$(checknr)</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -81,7 +81,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-$(checknr)-MD</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-$(checknr)-MD</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -110,7 +110,7 @@
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-$(checknr).DESC</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-$(checknr).DESC</string>
</property>
<property name="background">
<color alpha="0">
@@ -170,7 +170,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CHECK-$(checknr)-LATCH</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CHECK-$(checknr)-LATCH</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -199,7 +199,7 @@
<number>20</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:CONTROL-BRIDGE-CHECK-$(checknr)</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:CONTROL-BRIDGE-CHECK-$(checknr)</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
+4 -4
View File
@@ -43,7 +43,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -62,7 +62,7 @@
<string>Clear Logs</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:LOG-CLEAR</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:LOG-CLEAR</string>
</property>
<property name="label">
<string notr="true">Clear Logs</string>
@@ -94,7 +94,7 @@
<string>Get Systemd Status for each Service</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:GET-SYSTEMD-STATUS</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:GET-SYSTEMD-STATUS</string>
</property>
<property name="label">
<string notr="true">Get Systemd Status for each Service</string>
@@ -151,7 +151,7 @@
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:LOG</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:LOG</string>
</property>
<property name="limitsMode">
<enum>caLineEdit::User</enum>
+14 -14
View File
@@ -24,7 +24,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:NTURNS-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:NTURNS-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -62,7 +62,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:NTURNS-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:NTURNS-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -202,7 +202,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-80-NPOINTS</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-80-NPOINTS</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
@@ -218,7 +218,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-80-MINHEIGHT</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-80-MINHEIGHT</string>
</property>
</widget>
<widget class="caTextEntry" name="catextentry_3">
@@ -231,7 +231,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-80-MINSEP</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-80-MINSEP</string>
</property>
</widget>
<widget class="caLabel" name="calabel_6">
@@ -292,7 +292,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-2K-MINSEP</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-2K-MINSEP</string>
</property>
</widget>
<widget class="caTextEntry" name="catextentry_5">
@@ -305,7 +305,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-2K-MINHEIGHT</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-2K-MINHEIGHT</string>
</property>
</widget>
<widget class="caTextEntry" name="catextentry_6">
@@ -318,7 +318,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:CONTROL-2K-NPOINTS</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:CONTROL-2K-NPOINTS</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
@@ -388,7 +388,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-80TURNS</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-80TURNS</string>
</property>
<property name="foreground">
<color>
@@ -448,7 +448,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-2KTURNS</string>
<string notr="true">AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-2KTURNS</string>
</property>
<property name="foreground">
<color>
@@ -526,7 +526,7 @@
</rect>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-NTURNS{{ agebd_env_suffix_upper }}:BPM-WF-ENUMERATE;AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-80TURNS-WF</string>
<string>AGEBD-NTURNS@@agebd_env_suffix_upper@@:BPM-WF-ENUMERATE;AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-80TURNS-WF</string>
</property>
<property name="Style_1">
<enum>caCartesianPlot::Lines</enum>
@@ -542,7 +542,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-NTURNS{{ agebd_env_suffix_upper }}:BPM-WF-ENUMERATE;AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-80TURNS-PEAKS</string>
<string>AGEBD-NTURNS@@agebd_env_suffix_upper@@:BPM-WF-ENUMERATE;AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-80TURNS-PEAKS</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Sticks</enum>
@@ -582,7 +582,7 @@
</rect>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-NTURNS{{ agebd_env_suffix_upper }}:BPM-WF-ENUMERATE;AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-2KTURNS-WF</string>
<string>AGEBD-NTURNS@@agebd_env_suffix_upper@@:BPM-WF-ENUMERATE;AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-2KTURNS-WF</string>
</property>
<property name="Style_1">
<enum>caCartesianPlot::Lines</enum>
@@ -598,7 +598,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-NTURNS{{ agebd_env_suffix_upper }}:BPM-WF-ENUMERATE;AGEBD-NTURNS{{ agebd_env_suffix_upper }}:STAGE0-Q-80TURNS-PEAKS;</string>
<string>AGEBD-NTURNS@@agebd_env_suffix_upper@@:BPM-WF-ENUMERATE;AGEBD-NTURNS@@agebd_env_suffix_upper@@:STAGE0-Q-80TURNS-PEAKS;</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Sticks</enum>
+1 -1
View File
@@ -328,7 +328,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:ORBITBUMP-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:ORBITBUMP-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
+7 -7
View File
@@ -31,7 +31,7 @@
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINE-BEND</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINE-BEND</string>
</property>
</widget>
<widget class="caMenu" name="camenu_2">
@@ -51,7 +51,7 @@
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINE-ID</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINE-ID</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_87">
@@ -64,7 +64,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINECALC</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINECALC</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -86,7 +86,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINETYPE-BEND</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINETYPE-BEND</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -108,7 +108,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINETYPE</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINETYPE</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -130,7 +130,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINETYPE-ID</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINETYPE-ID</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -152,7 +152,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:BEAMLINE</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:BEAMLINE</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
+20 -20
View File
@@ -24,7 +24,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAX-BPM1</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAX-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_2">
@@ -37,7 +37,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAY-BPM1</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAY-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_3">
@@ -50,7 +50,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAX-BPM2</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAX-BPM2</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_4">
@@ -63,7 +63,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAY-BPM2</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAY-BPM2</string>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_2">
@@ -82,7 +82,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-X</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-X</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
@@ -116,7 +116,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-XP</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-XP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
@@ -150,7 +150,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-YP</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-YP</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
@@ -184,7 +184,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-Y</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-Y</string>
</property>
<property name="colorMode">
<enum>caSpinbox::Alarm</enum>
@@ -212,7 +212,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAX-BPM4</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAX-BPM4</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_6">
@@ -225,7 +225,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAY-BPM3</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAY-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_7">
@@ -238,7 +238,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAY-BPM4</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAY-BPM4</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_8">
@@ -251,7 +251,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-DELTAX-BPM3</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-DELTAX-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_9">
@@ -264,7 +264,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-BPM1</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-BPM1</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_10">
@@ -277,7 +277,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-BPM2</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-BPM2</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_11">
@@ -290,7 +290,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-BPM3</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-BPM3</string>
</property>
</widget>
<widget class="caLineEdit" name="calineedit_12">
@@ -303,7 +303,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-BPM4</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-BPM4</string>
</property>
</widget>
<widget class="caSpinbox" name="caspinbox_6">
@@ -475,7 +475,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-X-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-X-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -497,7 +497,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-Y-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-Y-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -516,7 +516,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-YP-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-YP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -535,7 +535,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-XP-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-XP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
+4 -4
View File
@@ -37,7 +37,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-X-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-X-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -59,7 +59,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-XP-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-XP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -78,7 +78,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-Y-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-Y-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -97,7 +97,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }}:$(sourcepoint)-OFFSET-YP-TOTAL</string>
<string notr="true">AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@:$(sourcepoint)-OFFSET-YP-TOTAL</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
+24 -24
View File
@@ -52,7 +52,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:POSTMORTEMLOG-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:POSTMORTEMLOG-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -74,7 +74,7 @@
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:LOG</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:LOG</string>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
@@ -106,7 +106,7 @@
<string notr="true">Horizontal Tune (nominal: Qx = 39.37)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-QX</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-QX</string>
</property>
<property name="color_1">
<color>
@@ -179,7 +179,7 @@
<string notr="true">Vertival Tune (nominal: Qy = 15.22)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-QY</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-QY</string>
</property>
<property name="color_1">
<color>
@@ -252,7 +252,7 @@
<string notr="true">Vertival Beam Size (nominal: Sig_y = 10)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X01DD-SIGY</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X01DD-SIGY</string>
</property>
<property name="color_1">
<color>
@@ -262,7 +262,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X08DB-SIGY</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X08DB-SIGY</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -332,7 +332,7 @@
<string notr="true">Horizontal Beam Size (nominal: Sig_x = 9)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X01DD-SIGX</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X01DD-SIGX</string>
</property>
<property name="color_1">
<color>
@@ -342,7 +342,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X08DB-SIGX</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X08DB-SIGX</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -412,7 +412,7 @@
<string notr="true">Stored Beam Current</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-CURRPCT</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-CURRPCT</string>
</property>
<property name="color_1">
<color>
@@ -422,7 +422,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-CURRBPM</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-CURRBPM</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -492,7 +492,7 @@
<string notr="true">Beam Lifetime</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TAUBPM</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TAUBPM</string>
</property>
<property name="Style_1">
<enum>caCartesianPlot::FatDots</enum>
@@ -505,7 +505,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TAUPCT</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TAUPCT</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::FatDots</enum>
@@ -580,7 +580,7 @@
<string notr="true">Vertival Beam Size (nominal: Sig_y = 10)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X01DD-SIGY-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X01DD-SIGY-LAST</string>
</property>
<property name="color_1">
<color>
@@ -590,7 +590,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X08DB-SIGY-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X08DB-SIGY-LAST</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -660,7 +660,7 @@
<string notr="true">Stored Beam Current</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-CURRPCT-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-CURRPCT-LAST</string>
</property>
<property name="color_1">
<color>
@@ -670,7 +670,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-CURRBPM-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-CURRBPM-LAST</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -740,7 +740,7 @@
<string notr="true">Horizontal Tune (nominal: Qx = 39.37)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-QX-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-QX-LAST</string>
</property>
<property name="color_1">
<color>
@@ -813,7 +813,7 @@
<string notr="true">Horizontal Beam Size (nominal: Sig_x = 9)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X01DD-SIGX-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X01DD-SIGX-LAST</string>
</property>
<property name="color_1">
<color>
@@ -823,7 +823,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-X08DB-SIGX-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-X08DB-SIGX-LAST</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Lines</enum>
@@ -893,7 +893,7 @@
<string notr="true">Vertival Tune (nominal: Qy = 15.22)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-QY-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-QY-LAST</string>
</property>
<property name="color_1">
<color>
@@ -966,7 +966,7 @@
<string notr="true">Beam Lifetime</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TAUBPM-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TAUBPM-LAST</string>
</property>
<property name="Style_1">
<enum>caCartesianPlot::FatDots</enum>
@@ -979,7 +979,7 @@
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TIME;AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:BUFFER-TAUPCT-LAST</string>
<string>AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TIME;AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:BUFFER-TAUPCT-LAST</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::FatDots</enum>
@@ -1072,7 +1072,7 @@
<string>Update Logs</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:POSTMORTEMLOG-LOGS-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:POSTMORTEMLOG-LOGS-REQ</string>
</property>
<property name="label">
<string notr="true">Update Logs</string>
@@ -1104,7 +1104,7 @@
<string>Test Trigger Post Mortem</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-POSTMORTEMLOG{{ agebd_env_suffix_upper }}:TEST</string>
<string notr="true">AGEBD-POSTMORTEMLOG@@agebd_env_suffix_upper@@:TEST</string>
</property>
<property name="label">
<string notr="true">Test Trigger Post Mortem</string>
+42 -42
View File
@@ -24,7 +24,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:SCRUBBING-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:SCRUBBING-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -59,7 +59,7 @@
<string notr="true"/>
</property>
<property name="channels" stdset="0">
<string>ARIVA-VMAVE:PRESS-MAX;ARIVA-VMAVE-FE:PRESS-MAX;ARIVA-VMAVE-ALL:PRESS-MAX;AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-MAX-PLOT;AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-MIN-PLOT;AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-PLOT</string>
<string>ARIVA-VMAVE:PRESS-MAX;ARIVA-VMAVE-FE:PRESS-MAX;ARIVA-VMAVE-ALL:PRESS-MAX;AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-MAX-PLOT;AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-MIN-PLOT;AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-DYN-PLOT</string>
</property>
<property name="units">
<enum>caStripPlot::Second</enum>
@@ -411,7 +411,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:SCRUBBING-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:SCRUBBING-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerOneToZero</enum>
@@ -427,7 +427,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:SCRUBBING-INFO</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:SCRUBBING-INFO</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -449,7 +449,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:TOPUP-DELTAT</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:TOPUP-DELTAT</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -474,7 +474,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:TOPUP-TAU</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:TOPUP-TAU</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -568,7 +568,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:TOPUP-DELTAI</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:TOPUP-DELTAI</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -1913,7 +1913,7 @@
<number>22</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:STATUS-SECRET-MASTER</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:STATUS-SECRET-MASTER</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -2937,7 +2937,7 @@ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOIN-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOIN-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2962,7 +2962,7 @@ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOMB-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOMB-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2987,7 +2987,7 @@ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOME-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOME-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3012,7 +3012,7 @@ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOEX-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOEX-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3037,7 +3037,7 @@ AGETI-CVME-MASTER-TMA:Evt-LI-Gun-EVRCount-I</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-SRIN-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-SRIN-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3099,7 +3099,7 @@ Setpoint</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOMB-RB.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOMB-RB.VAL</string>
</property>
<property name="background">
<color>
@@ -3141,7 +3141,7 @@ Setpoint</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOIN-RB.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOIN-RB.VAL</string>
</property>
<property name="background">
<color>
@@ -3183,7 +3183,7 @@ Setpoint</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOME-RB.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOME-RB.VAL</string>
</property>
<property name="background">
<color>
@@ -3225,7 +3225,7 @@ Setpoint</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-SRIN-RB.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-SRIN-RB.VAL</string>
</property>
<property name="background">
<color>
@@ -3267,7 +3267,7 @@ Setpoint</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:WARMUPCYCLES-BOEX-RB.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:WARMUPCYCLES-BOEX-RB.VAL</string>
</property>
<property name="background">
<color>
@@ -3394,7 +3394,7 @@ Remaining</string>
<string notr="true"/>
</property>
<property name="channels_1" stdset="0">
<string>;AGEBD-TIMING{{ agebd_env_suffix_upper }}:TARGET-BUCKET</string>
<string>;AGEBD-TIMING@@agebd_env_suffix_upper@@:TARGET-BUCKET</string>
</property>
<property name="Style_1">
<enum>caCartesianPlot::Sticks</enum>
@@ -3491,7 +3491,7 @@ Remaining</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:GO</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:GO</string>
</property>
<property name="trueColor">
<color>
@@ -3535,7 +3535,7 @@ Remaining</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FILLPATTERN-string.VAL</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FILLPATTERN-string.VAL</string>
</property>
<property name="precision">
<number>0</number>
@@ -3567,7 +3567,7 @@ Remaining</string>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:FPFB-MODE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:FPFB-MODE</string>
</property>
</widget>
<widget class="caMessageButton" name="camessagebutton_39">
@@ -3591,7 +3591,7 @@ Remaining</string>
<enum>EPushButton::WidthAndHeight</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:ZERO-TARGET-BUCKET</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:ZERO-TARGET-BUCKET</string>
</property>
<property name="label">
<string notr="true">Reset</string>
@@ -3639,7 +3639,7 @@ Remaining</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CURRENT-THRESHOLD</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CURRENT-THRESHOLD</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3690,7 +3690,7 @@ Remaining</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:FPFB-NTH</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:FPFB-NTH</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3754,7 +3754,7 @@ Remaining</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MIN</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3779,7 +3779,7 @@ Remaining</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3850,7 +3850,7 @@ Remaining</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-MIN</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-MIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3921,7 +3921,7 @@ Remaining</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-MAX</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3969,7 +3969,7 @@ Remaining</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-TIME-MAX</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-TIME-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3994,7 +3994,7 @@ Remaining</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-TIME-MIN</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-TIME-MIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4058,7 +4058,7 @@ Remaining</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-GUNGRID-FPFB</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-GUNGRID-FPFB</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4083,7 +4083,7 @@ Remaining</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-GUNGRID-ACCUM</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-GUNGRID-ACCUM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4171,7 +4171,7 @@ Remaining</string>
<string notr="true"/>
</property>
<property name="channels" stdset="0">
<string>ARS07-DPCT-0000:CURR;AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX;AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MIN</string>
<string>ARS07-DPCT-0000:CURR;AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX;AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MIN</string>
</property>
<property name="units">
<enum>caStripPlot::Second</enum>
@@ -4398,7 +4398,7 @@ Remaining</string>
<set>Qt::AlignBottom|Qt::AlignRight|Qt::AlignTrailing</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-PARAMS{{ agebd_env_suffix_upper }}:LIFETIME</string>
<string notr="true">AGEBD-PARAMS@@agebd_env_suffix_upper@@:LIFETIME</string>
</property>
<property name="foreground">
<color>
@@ -4448,7 +4448,7 @@ Remaining</string>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-PARAMS{{ agebd_env_suffix_upper }}:TRANSMISSION</string>
<string notr="true">AGEBD-PARAMS@@agebd_env_suffix_upper@@:TRANSMISSION</string>
</property>
<property name="foreground">
<color>
@@ -4521,7 +4521,7 @@ Remaining</string>
</property>
<property name="channel" stdset="0">
<string notr="true">
AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-FRAC</string>
AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-VACUUM-DYN-FRAC</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4559,7 +4559,7 @@ AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-FRAC</string>
</font>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-SCRUB</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-SCRUB</string>
</property>
</widget>
<widget class="caLabel" name="calabel_14">
@@ -4611,7 +4611,7 @@ AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-FRAC</string>
<string notr="true">A&gt;3</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-SCRUB</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-SCRUB</string>
</property>
<widget class="caLineEdit" name="calineedit_22">
<property name="geometry">
@@ -4674,7 +4674,7 @@ AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-FRAC</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:MBFBY-GAIN-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:MBFBY-GAIN-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4776,7 +4776,7 @@ AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-VACUUM-DYN-FRAC</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:MBFBX-GAIN-SP.VAL</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:MBFBX-GAIN-SP.VAL</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -5062,7 +5062,7 @@ ARSGE-MBFBT-AMP-02:SET-ON-OFF</string>
<string notr="true">A&lt;4 &amp; A&gt;0</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-SCRUBBING{{ agebd_env_suffix_upper }}:CONTROL-SCRUB</string>
<string notr="true">AGEBD-SCRUBBING@@agebd_env_suffix_upper@@:CONTROL-SCRUB</string>
</property>
<widget class="caSpinbox" name="caspinbox_21">
<property name="geometry">
+17 -17
View File
@@ -71,7 +71,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -106,7 +106,7 @@ caLabel[statusTip="Operation"]{
<string notr="true">!A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
</widget>
<widget class="QTabWidget" name="tabWidget">
@@ -138,7 +138,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-DBPM3CURR,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX,service=TUNEFBX,name=TuneFBx,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY,service=TUNEFBY,name=TuneFBy,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui</string>
<string>IOC=AGEBD-CPCL-DBPM3CURR@@agebd_env_suffix_upper@@,service=DBPM3CURR,name=DBPM3Curr,panel=1,svc_exist=1,panelcmd=A_BD_DBPM3Curr.ui;IOC=AGEBD-CPCL-TAUBPM@@agebd_env_suffix_upper@@,service=TAUBPM,name=TauBPM,panel=1,svc_exist=1,panelcmd=A_BD_TauBPM.ui;IOC=AGEBD-CPCL-TAUPCT@@agebd_env_suffix_upper@@,service=TAUPCT,name=TauPCT,panel=1,svc_exist=1,panelcmd=A_BD_TauPCT.ui;IOC=AGEBD-CPCL-TIMING@@agebd_env_suffix_upper@@,service=TIMING,name=Timing,panel=1,svc_exist=1,panelcmd=A_BD_Timing.ui;IOC=AGEBD-CPCL-SCRUBBING@@agebd_env_suffix_upper@@,service=SCRUBBING,name=Scrubbing,panel=1,svc_exist=1,panelcmd=A_BD_Scrubbing.ui;IOC=AGEBD-CPCL-INJECTIONGUARD@@agebd_env_suffix_upper@@,service=INJECTIONGUARD,name=InjectionGuard,panel=1,svc_exist=1,panelcmd=A_BD_InjectionGuard.ui;IOC=AGEBD-CPCL-POSTMORTEMLOG@@agebd_env_suffix_upper@@,service=POSTMORTEMLOG,name=PostMortemLog,panel=1,svc_exist=1,panelcmd=A_BD_PostMortemLog.ui;IOC=AGEBD-CPCL-TUNEBUMP@@agebd_env_suffix_upper@@,service=TUNEBUMP,name=TuneBump,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-PLOTS@@agebd_env_suffix_upper@@,service=PLOTS,name=Plots,panel=0,svc_exist=1,panelcmd=A_BD_Plots.ui;IOC=AGEBD-CPCL-ORBITBUMP@@agebd_env_suffix_upper@@,service=ORBITBUMP,name=OrbitBump,panel=1,svc_exist=0,panelcmd=A_BD_OrbitBump.ui;IOC=AGEBD-CPCL-TUNEFBX@@agebd_env_suffix_upper@@,service=TUNEFBX,name=TuneFBx,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui;IOC=AGEBD-CPCL-TUNEFBY@@agebd_env_suffix_upper@@,service=TUNEFBY,name=TuneFBy,panel=1,svc_exist=1,panelcmd=A_BD_TuneBump.ui</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -246,7 +246,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="macro">
<string>IOC=AGEBD-CPCL-NTURNS,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
<string>IOC=AGEBD-CPCL-NTURNS@@agebd_env_suffix_upper@@,service=NTURNS,name=NTurns,panel=1,svc_exist=1,panelcmd=A_BD_NTurns.ui;IOC=AGEBD-CPCL-TOPUPTOOL@@agebd_env_suffix_upper@@,service=TOPUPTOOL,name=TopUpTool,panel=1,svc_exist=1,panelcmd=A_BD_TopUpTool.ui;IOC=AGEBD-CPCL-TUNE@@agebd_env_suffix_upper@@,service=TUNE,name=Tune,panel=1,svc_exist=1,panelcmd=A_BD_Tune.ui;IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL,name=Shifttool,panel=1,svc_exist=1,panelcmd=A_OP_SchichtProtokollTool.ui,macro=FACILITY=SLS</string>
</property>
<property name="filename" stdset="0">
<string notr="true">A_BD_ServiceManager_inc.ui</string>
@@ -586,7 +586,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ALIVE</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ALIVE</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -602,7 +602,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STARTTIME</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STARTTIME</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -624,7 +624,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-STATUS</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-STATUS</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -646,7 +646,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-VERSION</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-VERSION</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -668,7 +668,7 @@ caLabel[statusTip="Operation"]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -717,7 +717,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-ONOFF-RB</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-ONOFF-RB</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -763,7 +763,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:STATUS</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:STATUS</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -792,7 +792,7 @@ caLabel[statusTip="Operation"]{
<string>/ioc/modules/qt/iocStats.ui</string>
</property>
<property name="args">
<string>IOC=AGEBD-CPCL-MASTER;</string>
<string>IOC=AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@;</string>
</property>
</widget>
<widget class="caLabel" name="calabel_42">
@@ -986,7 +986,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01 systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
<string notr="true">ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@ systemctl --user restart AGEBD-SERVICE-MASTER.service</string>
</property>
</widget>
<widget class="caScriptButton" name="cascriptbutton_2">
@@ -1015,7 +1015,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="scriptCommand">
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01"</string>
<string notr="true">terminator -e "ssh svcusr-sls2hla@sls-vserv-bd-hla01@@agebd_env_suffix_lower@@"</string>
</property>
</widget>
</widget>
@@ -1040,7 +1040,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:MASTER-LOGS-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:MASTER-LOGS-REQ</string>
</property>
<property name="label">
<string notr="true">Logs</string>
@@ -1106,7 +1106,7 @@ caLabel[statusTip="Operation"]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:MASTER-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:MASTER-GUIRELOAD</string>
</property>
<property name="label">
<string notr="true">Reload</string>
@@ -1172,7 +1172,7 @@ caLabel[statusTip="Operation"]{
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-CPCL-MASTER{{ agebd_env_suffix_upper }}:RESTART</string>
<string notr="true">AGEBD-CPCL-MASTER@@agebd_env_suffix_upper@@:RESTART</string>
</property>
<property name="label">
<string notr="true">↺</string>
+11 -11
View File
@@ -162,7 +162,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-STATUS</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-STATUS</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -195,7 +195,7 @@
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:$(service)-RESTART-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:$(service)-RESTART-REQ</string>
</property>
<property name="label">
<string notr="true">Restart</string>
@@ -227,7 +227,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-VERSION</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-VERSION</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -249,7 +249,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -268,7 +268,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-STARTTIME</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-STARTTIME</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -320,7 +320,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-ALIVE</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-ALIVE</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -347,7 +347,7 @@
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:$(service)-LOGS-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:$(service)-LOGS-REQ</string>
</property>
<property name="label">
<string notr="true">Logs</string>
@@ -409,7 +409,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-ONOFF-RB</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-ONOFF-RB</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -536,7 +536,7 @@
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:$(service)-START-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:$(service)-START-REQ</string>
</property>
<property name="label">
<string notr="true">Start</string>
@@ -579,7 +579,7 @@
<enum>EPushButton::None</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-MASTER{{ agebd_env_suffix_upper }}:$(service)-ABORT-REQ</string>
<string notr="true">AGEBD-MASTER@@agebd_env_suffix_upper@@:$(service)-ABORT-REQ</string>
</property>
<property name="label">
<string notr="true">KILL</string>
@@ -686,7 +686,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:$(service)-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:$(service)-GUIRELOAD</string>
</property>
<property name="label">
<string notr="true">Reload</string>
+9 -9
View File
@@ -78,7 +78,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:TAU</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:TAU</string>
</property>
<property name="foreground">
<color>
@@ -138,7 +138,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:TAU-ERR</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:TAU-ERR</string>
</property>
<property name="foreground">
<color>
@@ -214,7 +214,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:INJRATE</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:INJRATE</string>
</property>
<property name="foreground">
<color>
@@ -274,7 +274,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:INJRATE-ERR</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:INJRATE-ERR</string>
</property>
<property name="foreground">
<color>
@@ -363,7 +363,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:LIFETIME-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:LIFETIME-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -395,7 +395,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:CONTROL-NSAMPLES-FIT-TAU</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:CONTROL-NSAMPLES-FIT-TAU</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
@@ -411,7 +411,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:CONTROL-MIN-CURR</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:CONTROL-MIN-CURR</string>
</property>
<property name="precision">
<number>12</number>
@@ -430,7 +430,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TAUBPM-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TAUBPM-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -465,7 +465,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUBPM{{ agebd_env_suffix_upper }}:CONTROL-NSAMPLES-FIT-ROC</string>
<string notr="true">AGEBD-TAUBPM@@agebd_env_suffix_upper@@:CONTROL-NSAMPLES-FIT-ROC</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
+9 -9
View File
@@ -78,7 +78,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:TAU</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:TAU</string>
</property>
<property name="foreground">
<color>
@@ -138,7 +138,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:TAU-ERR</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:TAU-ERR</string>
</property>
<property name="foreground">
<color>
@@ -214,7 +214,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:INJRATE</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:INJRATE</string>
</property>
<property name="foreground">
<color>
@@ -274,7 +274,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:INJRATE-ERR</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:INJRATE-ERR</string>
</property>
<property name="foreground">
<color>
@@ -363,7 +363,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TAUPCT-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TAUPCT-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -395,7 +395,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:CONTROL-NSAMPLES-FIT-TAU</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:CONTROL-NSAMPLES-FIT-TAU</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
@@ -411,7 +411,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:CONTROL-MIN-CURR</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:CONTROL-MIN-CURR</string>
</property>
<property name="precision">
<number>12</number>
@@ -430,7 +430,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TAUPCT-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TAUPCT-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -449,7 +449,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TAUPCT{{ agebd_env_suffix_upper }}:CONTROL-NSAMPLES-FIT-ROC</string>
<string notr="true">AGEBD-TAUPCT@@agebd_env_suffix_upper@@:CONTROL-NSAMPLES-FIT-ROC</string>
</property>
<property name="precisionMode">
<enum>caLineEdit::User</enum>
+53 -53
View File
@@ -46,7 +46,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TIMING-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TIMING-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -154,7 +154,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-GUN</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-GUN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -185,7 +185,7 @@
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-llemast</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-llemast</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -240,7 +240,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-BOINKI</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-BOINKI</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -295,7 +295,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-BOINSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-BOINSE</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -326,7 +326,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-BOEXKI</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-BOEXKI</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -384,7 +384,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-BOEXSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-BOEXSE</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -442,7 +442,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-SRINSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-SRINSE</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -548,7 +548,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-BTRICT</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-BTRICT</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -798,7 +798,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-klystr2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-klystr2</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -829,7 +829,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-3GHzScp</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-3GHzScp</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -860,7 +860,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-500-PBU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-500-PBU</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -891,7 +891,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-Kly1PMU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-Kly1PMU</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -922,7 +922,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-klystr1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-klystr1</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -953,7 +953,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-preamp1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-preamp1</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -984,7 +984,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-3GHzQdm</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-3GHzQdm</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1015,7 +1015,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-preamp2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-preamp2</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1046,7 +1046,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lirf-Kly2PMU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lirf-Kly2PMU</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1173,7 +1173,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-SRINK1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-SRINK1</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1207,7 +1207,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-SRINK2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-SRINK2</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1241,7 +1241,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-SRINK3</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-SRINK3</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1275,7 +1275,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-SRINK4</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-SRINK4</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1333,7 +1333,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lindi-ictone</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lindi-ictone</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1364,7 +1364,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-ZERO-DELAY-lindi-icts23</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-ZERO-DELAY-lindi-icts23</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3472,7 +3472,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-GUN</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-GUN</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_3">
@@ -3497,7 +3497,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-llemast</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-llemast</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_6">
@@ -3522,7 +3522,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-BOINKI</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-BOINKI</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_7">
@@ -3547,7 +3547,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-BOINSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-BOINSE</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_10">
@@ -3572,7 +3572,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-BOEXKI</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-BOEXKI</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_12">
@@ -3597,7 +3597,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-BOEXSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-BOEXSE</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_15">
@@ -3622,7 +3622,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-BTRICT</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-BTRICT</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_16">
@@ -3647,7 +3647,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-SRINSE</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-SRINSE</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_19">
@@ -3672,7 +3672,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-SRINK4</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-SRINK4</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_21">
@@ -3697,7 +3697,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-preamp1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-preamp1</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_23">
@@ -3722,7 +3722,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-3GHzQdm</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-3GHzQdm</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_24">
@@ -3747,7 +3747,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-500-PBU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-500-PBU</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_28">
@@ -3772,7 +3772,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-preamp2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-preamp2</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_29">
@@ -3797,7 +3797,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-klystr2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-klystr2</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_32">
@@ -3822,7 +3822,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-3GHzScp</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-3GHzScp</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_33">
@@ -3847,7 +3847,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-Kly1PMU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-Kly1PMU</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_34">
@@ -3872,7 +3872,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-klystr1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-klystr1</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_37">
@@ -3897,7 +3897,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lirf-Kly2PMU</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lirf-Kly2PMU</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_2">
@@ -3922,7 +3922,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lindi-ictone</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lindi-ictone</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_5">
@@ -3947,7 +3947,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-lindi-icts23</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-lindi-icts23</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_20">
@@ -3972,7 +3972,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-SRINK3</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-SRINK3</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_22">
@@ -3997,7 +3997,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-SRINK2</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-SRINK2</string>
</property>
</widget>
<widget class="caToggleButton" name="catogglebutton_25">
@@ -4022,7 +4022,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FLW-BCKT-SRINK1</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FLW-BCKT-SRINK1</string>
</property>
</widget>
<zorder>catogglebutton_3</zorder>
@@ -4089,7 +4089,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:SETALL-DELAY</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:SETALL-DELAY</string>
</property>
<property name="foreground">
<color>
@@ -4149,7 +4149,7 @@
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:SETALL-ERROR</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:SETALL-ERROR</string>
</property>
<property name="foreground">
<color>
@@ -4230,7 +4230,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:CONTROL-FILLPATTERN-string.VAL</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:CONTROL-FILLPATTERN-string.VAL</string>
</property>
<property name="precision">
<number>0</number>
@@ -4266,7 +4266,7 @@
<enum>EPushButton::WidthAndHeight</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TIMING{{ agebd_env_suffix_upper }}:ZERO-TARGET-BUCKET</string>
<string notr="true">AGEBD-TIMING@@agebd_env_suffix_upper@@:ZERO-TARGET-BUCKET</string>
</property>
<property name="label">
<string notr="true">Reset</string>
@@ -4426,7 +4426,7 @@
<string notr="true">!A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TIMING-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TIMING-ONOFF</string>
</property>
</widget>
<widget class="caMessageButton" name="camessagebutton_40">
@@ -4470,7 +4470,7 @@
</color>
</property>
<property name="disableChannel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TIMING-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TIMING-ONOFF</string>
</property>
<property name="releaseMessage">
<string notr="true">0</string>
+26 -26
View File
@@ -24,7 +24,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TOPUPTOOL-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TOPUPTOOL-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -209,7 +209,7 @@
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-GUNGRID-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-GUNGRID-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -273,7 +273,7 @@
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:SCRUBBING-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:SCRUBBING-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerOneToZero</enum>
@@ -289,7 +289,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:SCRUBBING-INFO</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:SCRUBBING-INFO</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Alarm_Default</enum>
@@ -311,7 +311,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAT</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAT</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -336,7 +336,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-TAU</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-TAU</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -430,7 +430,7 @@
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAI</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAI</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -1989,7 +1989,7 @@
<number>22</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }}:STATUS-SECRET-MASTER</string>
<string notr="true">AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@:STATUS-SECRET-MASTER</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -2286,7 +2286,7 @@ AGETI-CVME-MASTER-TMA:Evt-SR-Inj-EVRCount-I</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2744,7 +2744,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2769,7 +2769,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2794,7 +2794,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2819,7 +2819,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2844,7 +2844,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2869,7 +2869,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2894,7 +2894,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3050,7 +3050,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3121,7 +3121,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-TIME-FREQ</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-TIME-FREQ</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3169,7 +3169,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-CURRENT-MIN</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-CURRENT-MIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3194,7 +3194,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-VAC-MAX</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-VAC-MAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3219,7 +3219,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:CONTROL-VAC-MIN</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:CONTROL-VAC-MIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3262,7 +3262,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAT</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAT</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -3287,7 +3287,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAI</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAI</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -3312,7 +3312,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-TAU</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-TAU</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -3337,7 +3337,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAI</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAI</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
@@ -3431,7 +3431,7 @@ AGETI-CVME-MASTER-TMA:Evt-14.VALA</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TOPUPTOOL{{ agebd_env_suffix_upper }}:TOPUP-DELTAT</string>
<string notr="true">AGEBD-TOPUPTOOL@@agebd_env_suffix_upper@@:TOPUP-DELTAT</string>
</property>
<property name="colorMode">
<enum>caLineEdit::Default</enum>
+25 -25
View File
@@ -55,7 +55,7 @@
<string notr="true">x [mm]</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE{{ agebd_env_suffix_upper }}:OSCILLATION-X-ALL</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE@@agebd_env_suffix_upper@@:OSCILLATION-X-ALL</string>
</property>
<property name="symbol_1">
<enum>caCartesianPlot::NoSymbol</enum>
@@ -102,7 +102,7 @@
<string notr="true">y [mm]</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE{{ agebd_env_suffix_upper }}:OSCILLATION-Y-ALL</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:OSCILLATION-SAMPLE-ALL;AGEBD-TUNE@@agebd_env_suffix_upper@@:OSCILLATION-Y-ALL</string>
</property>
<property name="symbol_1">
<enum>caCartesianPlot::NoSymbol</enum>
@@ -151,7 +151,7 @@
<string notr="true">Amplitude</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:SPEC-SAMPLE-ALL;AGEBD-TUNE{{ agebd_env_suffix_upper }}:HORIZONTAL-SPEC-ALL</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:SPEC-SAMPLE-ALL;AGEBD-TUNE@@agebd_env_suffix_upper@@:HORIZONTAL-SPEC-ALL</string>
</property>
<property name="symbol_1">
<enum>caCartesianPlot::NoSymbol</enum>
@@ -198,7 +198,7 @@
<string notr="true">Amplitude</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:SPEC-SAMPLE-ALL;AGEBD-TUNE{{ agebd_env_suffix_upper }}:VERTICAL-SPEC-ALL</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:SPEC-SAMPLE-ALL;AGEBD-TUNE@@agebd_env_suffix_upper@@:VERTICAL-SPEC-ALL</string>
</property>
<property name="symbol_1">
<enum>caCartesianPlot::NoSymbol</enum>
@@ -283,7 +283,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNE-ALIVE</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNE-ALIVE</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -323,7 +323,7 @@
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNE-ONOFF-RB</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNE-ONOFF-RB</string>
</property>
<property name="colorMode">
<enum>caLed::Alarm</enum>
@@ -358,7 +358,7 @@ measurement</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNE-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNE-ONOFF</string>
</property>
</widget>
</item>
@@ -405,7 +405,7 @@ measurement</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:MEAS-TIME</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:MEAS-TIME</string>
</property>
</widget>
<widget class="QWidget" name="gridLayoutWidget_2">
@@ -433,7 +433,7 @@ measurement</string>
<item row="2" column="1">
<widget class="caLineEdit" name="calineedit_Q2_FFT">
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:VERTICAL-PEAK1-FREQ</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:VERTICAL-PEAK1-FREQ</string>
</property>
<property name="precision">
<number>4</number>
@@ -467,7 +467,7 @@ measurement</string>
<item row="1" column="1">
<widget class="caLineEdit" name="calineedit_Q1_FFT">
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:HORIZONTAL-PEAK1-FREQ</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:HORIZONTAL-PEAK1-FREQ</string>
</property>
<property name="precision">
<number>4</number>
@@ -516,7 +516,7 @@ measurement</string>
<item row="1" column="2">
<widget class="caLineEdit" name="calineedit_Q1_NAFF">
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:Q1_NAFF</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:Q1_NAFF</string>
</property>
<property name="precision">
<number>4</number>
@@ -538,7 +538,7 @@ measurement</string>
<item row="2" column="2">
<widget class="caLineEdit" name="calineedit_Q2_NAFF">
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:Q2_NAFF</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:Q2_NAFF</string>
</property>
<property name="precision">
<number>4</number>
@@ -612,7 +612,7 @@ measurement</string>
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:SVD-CLEAN</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:SVD-CLEAN</string>
</property>
</widget>
<widget class="caNumeric" name="canumeric_2">
@@ -631,7 +631,7 @@ measurement</string>
<number>0</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:SVD-CLEAN-Neigenvalues</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:SVD-CLEAN-Neigenvalues</string>
</property>
<property name="fixedFormat">
<bool>false</bool>
@@ -705,7 +705,7 @@ values</string>
<number>2</number>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-ROI-Yi</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-ROI-Yi</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -756,7 +756,7 @@ values</string>
<double>0.000000000000000</double>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-ROI-Xf</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-ROI-Xf</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -789,7 +789,7 @@ values</string>
<number>2</number>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-ROI-Xi</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-ROI-Xi</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -870,7 +870,7 @@ values</string>
<double>0.000000000000000</double>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-ROI-Yf</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-ROI-Yf</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -934,7 +934,7 @@ values</string>
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-TbTLastIndex </string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-TbTLastIndex </string>
</property>
<property name="limitsMode">
<enum>caSpinbox::User</enum>
@@ -994,7 +994,7 @@ values</string>
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-TbTFirstIndex </string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-TbTFirstIndex </string>
</property>
<property name="fixedFormat">
<bool>false</bool>
@@ -1045,7 +1045,7 @@ values</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-NAveraging</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-NAveraging</string>
</property>
<property name="precisionMode">
<enum>caNumeric::Channel</enum>
@@ -1096,7 +1096,7 @@ values</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:CONTROL-NAFF</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:CONTROL-NAFF</string>
</property>
</widget>
</item>
@@ -1130,7 +1130,7 @@ harmonics</string>
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string>AGEBD-TUNE{{ agebd_env_suffix_upper }}:NAFF-HARMONICS</string>
<string>AGEBD-TUNE@@agebd_env_suffix_upper@@:NAFF-HARMONICS</string>
</property>
<property name="precisionMode">
<enum>caNumeric::Channel</enum>
@@ -1185,7 +1185,7 @@ ARS07-DBPM-0840</string>
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:BPM-SELECT-SINGLE</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:BPM-SELECT-SINGLE</string>
</property>
<item>
<property name="text">
@@ -1873,7 +1873,7 @@ ARS07-DBPM-0840</string>
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNE{{ agebd_env_suffix_upper }}:SINGLE-BPM</string>
<string notr="true">AGEBD-TUNE@@agebd_env_suffix_upper@@:SINGLE-BPM</string>
</property>
</widget>
</widget>
+88 -88
View File
@@ -81,7 +81,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEBUMP-GUIRELOAD</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEBUMP-GUIRELOAD</string>
</property>
<property name="eventSignal">
<enum>caCalc::TriggerZeroToOne</enum>
@@ -103,7 +103,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-STEPDOWN</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-STEPDOWN</string>
</property>
<property name="label">
<string notr="true">&lt;&lt;</string>
@@ -141,7 +141,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>4</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-STEPSIZE</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-STEPSIZE</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -175,7 +175,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>4</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-STEPSIZE</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-STEPSIZE</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -232,7 +232,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-STEPDOWN</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-STEPDOWN</string>
</property>
<property name="label">
<string notr="true">&lt;&lt;</string>
@@ -330,7 +330,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-STEPUP</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-STEPUP</string>
</property>
<property name="label">
<string notr="true">&gt;&gt;</string>
@@ -368,7 +368,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>false</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-STEPUP</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-STEPUP</string>
</property>
<property name="label">
<string notr="true">&gt;&gt;</string>
@@ -457,7 +457,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Vertical Tune (nominal: Qy = 15.22)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QY-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QY-AMP</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QY-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QY-AMP</string>
</property>
<property name="color_1">
<color>
@@ -467,7 +467,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-PEAKS-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-PEAKS</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-PEAKS-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-PEAKS</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Sticks</enum>
@@ -518,7 +518,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Synchrotron Tune (nominal: 0.0027)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QZ-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QZ-AMP</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QZ-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QZ-AMP</string>
</property>
<property name="color_1">
<color>
@@ -528,7 +528,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QZ-PEAKS</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QZ-PEAKS-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QZ-PEAKS</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Sticks</enum>
@@ -579,7 +579,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Horizontal Tune (nominal: Qx = 39.37)</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QX-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:NORM-QX-AMP</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QX-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:NORM-QX-AMP</string>
</property>
<property name="color_1">
<color>
@@ -589,7 +589,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</color>
</property>
<property name="channels_2" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-PEAKS-FREQ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-PEAKS</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-PEAKS-FREQ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-PEAKS</string>
</property>
<property name="Style_2">
<enum>caCartesianPlot::Sticks</enum>
@@ -657,7 +657,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Tune Z</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-FREQ-qZ;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-Z</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-FREQ-qZ;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-Z</string>
</property>
<property name="color_1">
<color>
@@ -702,7 +702,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Tune Y</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-FREQ-qY;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-Y</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-FREQ-qY;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-Y</string>
</property>
<property name="color_1">
<color>
@@ -747,7 +747,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Tune X</string>
</property>
<property name="channels_1" stdset="0">
<string>AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-FREQ-qX;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SPEC-X</string>
<string>AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-FREQ-qX;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SPEC-X</string>
</property>
<property name="color_1">
<color>
@@ -809,7 +809,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Vertical TbT data</string>
</property>
<property name="channels_1" stdset="0">
<string>;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-Y</string>
<string>;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-Y</string>
</property>
<property name="color_1">
<color>
@@ -857,7 +857,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Longitudinal Stage 1 Data</string>
</property>
<property name="channels_1" stdset="0">
<string>;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-Z</string>
<string>;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-Z</string>
</property>
<property name="color_1">
<color>
@@ -905,7 +905,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">Horizontal TbT data</string>
</property>
<property name="channels_1" stdset="0">
<string>;AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-X</string>
<string>;AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-X</string>
</property>
<property name="color_1">
<color>
@@ -1329,7 +1329,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-ULIM</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-ULIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1360,7 +1360,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-LLIM</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-LLIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1391,7 +1391,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-ULIM</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-ULIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1459,7 +1459,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-LLIM</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-LLIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -1758,7 +1758,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-Y.INP</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-Y.INP</string>
</property>
<property name="foreground">
<color>
@@ -1818,7 +1818,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-X.INP</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-X.INP</string>
</property>
<property name="foreground">
<color>
@@ -1878,7 +1878,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:SIGN-Z.INP</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:SIGN-Z.INP</string>
</property>
<property name="foreground">
<color>
@@ -2021,7 +2021,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-KP</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-KP</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2193,7 +2193,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-KI</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-KI</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2224,7 +2224,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-KD</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-KD</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2255,7 +2255,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-QX</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-QX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2323,7 +2323,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-QXMAX</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-QXMAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2391,7 +2391,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-QXMIN</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-QXMIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2496,7 +2496,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-MIN-CURR</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-MIN-CURR</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2567,7 +2567,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CONTROL-QX-OKRNG</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CONTROL-QX-OKRNG</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -2598,7 +2598,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:DELTAQ</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:DELTAQ</string>
</property>
<property name="foreground">
<color>
@@ -2705,7 +2705,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true"/>
</property>
<property name="channels" stdset="0">
<string>AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:QSTEPS</string>
<string>AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:QSTEPS</string>
</property>
<property name="units">
<enum>caStripPlot::Second</enum>
@@ -2866,7 +2866,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBX-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBX-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -2885,7 +2885,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK1</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK1</string>
</property>
<property name="falseColor">
<color>
@@ -2911,7 +2911,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK2</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK2</string>
</property>
<property name="falseColor">
<color>
@@ -2974,7 +2974,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK5</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK5</string>
</property>
<property name="falseColor">
<color>
@@ -3000,7 +3000,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK8</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK8</string>
</property>
<property name="falseColor">
<color>
@@ -3063,7 +3063,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK3</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK3</string>
</property>
<property name="falseColor">
<color>
@@ -3126,7 +3126,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK6</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK6</string>
</property>
<property name="falseColor">
<color>
@@ -3152,7 +3152,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK4</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK4</string>
</property>
<property name="falseColor">
<color>
@@ -3215,7 +3215,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECK7</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECK7</string>
</property>
<property name="falseColor">
<color>
@@ -3321,7 +3321,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:CHECKALL</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:CHECKALL</string>
</property>
<property name="falseColor">
<color>
@@ -3501,7 +3501,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:DELTAQ-ULIM</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:DELTAQ-ULIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3532,7 +3532,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBX{{ agebd_env_suffix_upper }}:DELTAQ-LLIM</string>
<string notr="true">AGEBD-TUNEFBX@@agebd_env_suffix_upper@@:DELTAQ-LLIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3635,7 +3635,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-QY</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-QY</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3706,7 +3706,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-QY-OKRNG</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-QY-OKRNG</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3774,7 +3774,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-KI</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-KI</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3873,7 +3873,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK4</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK4</string>
</property>
<property name="falseColor">
<color>
@@ -3905,7 +3905,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-KP</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-KP</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -3936,7 +3936,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-QYMAX</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-QYMAX</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4078,7 +4078,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-KD</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-KD</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4103,7 +4103,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK3</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK3</string>
</property>
<property name="falseColor">
<color>
@@ -4283,7 +4283,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:DELTAQ</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:DELTAQ</string>
</property>
<property name="foreground">
<color>
@@ -4386,7 +4386,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<bool>true</bool>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECKALL</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECKALL</string>
</property>
<property name="falseColor">
<color>
@@ -4412,7 +4412,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK5</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK5</string>
</property>
<property name="falseColor">
<color>
@@ -4438,7 +4438,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK2</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK2</string>
</property>
<property name="falseColor">
<color>
@@ -4507,7 +4507,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>2</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-QYMIN</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-QYMIN</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4532,7 +4532,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK1</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK1</string>
</property>
<property name="falseColor">
<color>
@@ -4595,7 +4595,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBY-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBY-ONOFF</string>
</property>
<property name="stackingMode" stdset="0">
<enum>caChoice::Column</enum>
@@ -4614,7 +4614,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK6</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK6</string>
</property>
<property name="falseColor">
<color>
@@ -4656,7 +4656,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true"/>
</property>
<property name="channels" stdset="0">
<string>AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:QSTEPS</string>
<string>AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:QSTEPS</string>
</property>
<property name="units">
<enum>caStripPlot::Second</enum>
@@ -4897,7 +4897,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>1</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CONTROL-MIN-CURR</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CONTROL-MIN-CURR</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -4959,7 +4959,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK7</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK7</string>
</property>
<property name="falseColor">
<color>
@@ -4985,7 +4985,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:CHECK8</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:CHECK8</string>
</property>
<property name="falseColor">
<color>
@@ -5091,7 +5091,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:DELTAQ-ULIM</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:DELTAQ-ULIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -5122,7 +5122,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<number>3</number>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEFBY{{ agebd_env_suffix_upper }}:DELTAQ-LLIM</string>
<string notr="true">AGEBD-TUNEFBY@@agebd_env_suffix_upper@@:DELTAQ-LLIM</string>
</property>
<property name="precisionMode">
<enum>caSpinbox::User</enum>
@@ -5189,7 +5189,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
</rect>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:WRITE2MAG</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:WRITE2MAG</string>
</property>
</widget>
<widget class="caLabel" name="calabel_36">
@@ -5241,7 +5241,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:CHANGELOG</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:CHANGELOG</string>
</property>
<property name="fontScaleMode" stdset="0">
<enum>caMultiLineString::None</enum>
@@ -5277,7 +5277,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX</string>
</property>
<property name="foreground">
<color>
@@ -5359,7 +5359,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY</string>
</property>
<property name="foreground">
<color>
@@ -5472,7 +5472,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-SB1</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-SB1</string>
</property>
<property name="foreground">
<color>
@@ -5532,7 +5532,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-SB1-DIFF</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-SB1-DIFF</string>
</property>
<property name="foreground">
<color>
@@ -5629,7 +5629,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-SB2</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-SB2</string>
</property>
<property name="foreground">
<color>
@@ -5689,7 +5689,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-SB2-DIFF</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-SB2-DIFF</string>
</property>
<property name="foreground">
<color>
@@ -5860,7 +5860,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-SB1</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-SB1</string>
</property>
<property name="foreground">
<color>
@@ -6031,7 +6031,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-SB2</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-SB2</string>
</property>
<property name="foreground">
<color>
@@ -6091,7 +6091,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-SB1-DIFF</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-SB1-DIFF</string>
</property>
<property name="foreground">
<color>
@@ -6151,7 +6151,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-SB2-DIFF</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-SB2-DIFF</string>
</property>
<property name="foreground">
<color>
@@ -6223,7 +6223,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QX-FREQ</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QX-FREQ</string>
</property>
<property name="foreground">
<color>
@@ -6311,7 +6311,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QY-FREQ</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QY-FREQ</string>
</property>
<property name="foreground">
<color>
@@ -6423,7 +6423,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QZ</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QZ</string>
</property>
<property name="foreground">
<color>
@@ -6508,7 +6508,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<set>Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-TUNEBUMP{{ agebd_env_suffix_upper }}:QZ-FREQ</string>
<string notr="true">AGEBD-TUNEBUMP@@agebd_env_suffix_upper@@:QZ-FREQ</string>
</property>
<property name="foreground">
<color>
@@ -6603,7 +6603,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBX-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBX-ONOFF</string>
</property>
</widget>
<widget class="caLabel" name="calabel_2">
@@ -6641,7 +6641,7 @@ caLabel[statusTip=&quot;Operation&quot;]{
<string notr="true">A</string>
</property>
<property name="channel" stdset="0">
<string notr="true">AGEBD-ALH{{ agebd_env_suffix_upper }}:TUNEFBY-ONOFF</string>
<string notr="true">AGEBD-ALH@@agebd_env_suffix_upper@@:TUNEFBY-ONOFF</string>
</property>
</widget>
<zorder>calabel_3</zorder>
+131
View File
@@ -0,0 +1,131 @@
"""
Guard the deploy-time substitution contract.
Every ``@@token@@`` in this repo must be declared in config/environments.yml,
and must live somewhere that actually gets rendered. Three things are checked:
1. Tokens inside a render path are declared.
Catches typos, which would otherwise ship the literal placeholder.
2. Declared tokens only appear in a render, passthrough or reference path.
Catches a placeholder added to a file nobody renders -- exactly the
regression that put a suffix token into qt/*.ui while the Qt deploy
step was a plain rsync.
3. No pre-migration ``{{ token }}`` form of a deploy-time token survives,
in the paths that carry tokens. Catches files missed by the switch to
the ``@@token@@`` delimiters. Reference paths are exempt: Ansible and
copier own ``{{ }}`` in their own files, and some of their variables
share a name with our tokens.
Files tracked by git plus new, non-ignored files are scanned, so build and
cache directories are skipped for free.
"""
import sys
import git
from agebd.subs import (
SubstitutionsConfig,
find_legacy_tokens,
find_tokens,
)
from agebd.utils import get_git_root
REPO_ROOT = get_git_root(__file__)
def iter_tracked_text_files(repo_root=REPO_ROOT):
"""
Yield (relative_path, contents) for every UTF-8 decodable file that is
tracked, or new and not gitignored. New files are included so that a bad
token is reported before it is committed rather than after.
"""
repo = git.Repo(repo_root)
listing = repo.git.ls_files("--cached", "--others", "--exclude-standard")
for rel_path in sorted(set(listing.splitlines())):
path = repo_root / rel_path
if not path.is_file():
continue
try:
yield rel_path, path.read_text()
except (UnicodeDecodeError, OSError):
continue
def check_declared(config, rel_path, contents):
"""1. Tokens inside a render path must be declared."""
if not config.is_render_path(rel_path):
return []
return [
f"{rel_path}: '@@{token}@@' is not declared under 'tokens' in "
f"{config.environments_file.name}"
for token in sorted(find_tokens(contents))
if token not in config.tokens
]
def carries_tokens(config, rel_path):
"""
True for paths whose files carry deploy-time tokens as data: they are
either rendered, or copied into something that is.
"""
return config.is_render_path(rel_path) or config.is_passthrough_path(rel_path)
def check_location(config, rel_path, contents):
"""2. Declared tokens must sit in a render, passthrough or reference path."""
if carries_tokens(config, rel_path) or config.is_reference_path(rel_path):
return []
return [
f"{rel_path}: '@@{token}@@' is in a path that is never rendered. In "
f"{config.environments_file.name}, add the path to 'locations.render' if it "
f"should be substituted at deploy time, or to 'locations.references' if it is "
f"part of the substitution machinery. Otherwise remove the token."
for token in sorted(find_tokens(contents) & set(config.tokens))
]
def check_no_legacy_delimiters(config, rel_path, contents):
"""
3. No deploy-time token may still use the creation-time delimiters, in the
paths that carry tokens. Elsewhere {{ }} belongs to whichever tool owns
the file.
"""
if not carries_tokens(config, rel_path):
return []
return [
f"{rel_path}: '{{{{ {token} }}}}' uses the creation-time delimiters for a "
f"deploy-time token. Write it as '@@{token}@@'."
for token in sorted(find_legacy_tokens(contents) & set(config.tokens))
]
CHECKS = (check_declared, check_location, check_no_legacy_delimiters)
def check_subs(repo_root=REPO_ROOT):
"""
Raise AssertionError listing every violation, or return silently.
"""
config = SubstitutionsConfig.load(repo_root / "config")
errors = []
for rel_path, contents in iter_tracked_text_files(repo_root):
for check in CHECKS:
errors.extend(check(config, rel_path, contents))
if errors:
raise AssertionError("Deploy-time substitution problems found:\n\n " + "\n ".join(errors))
if __name__ == "__main__":
try:
check_subs()
except AssertionError as e:
print(e, file=sys.stderr)
sys.exit(1)
print("All deploy-time tokens are declared and live in a rendered path.")
+81 -15
View File
@@ -1,25 +1,91 @@
import re
"""
Guard the environment suffix in Qt UI files.
qt/ is rendered at deploy time (see config/environments.yml), so every EPICS
device name in a .ui file must carry the suffix token. A name without it
resolves to the production device in every environment -- which is how the
dev Service Manager ended up driving prod IOCs.
The rule is: every AGEBD- name is immediately followed by the suffix token.
The one exception is systemd unit names, which genuinely have no environment
suffix (the unit file is AGEBD-SERVICE-<NAME>.service in both environments).
This replaces an earlier check for the caQtDM macro '$(AGEBD_ENV_SUFFIX)',
which was abandoned in favour of deploy-time rendering. That check had also
stopped matching anything once placeholders appeared in the names.
"""
import re
import sys
from agebd.subs import SubstitutionsConfig
from agebd.utils import get_git_root
REPO_ROOT = get_git_root(__file__)
QT_DIR = REPO_ROOT / "qt"
SUFFIX_TOKEN_NAME = "agebd_env_suffix_upper"
#: An EPICS device name belonging to us, e.g. AGEBD-ALH or AGEBD-CPCL-TUNE.
AGEBD_NAME = re.compile(r"AGEBD-[0-9A-Z][0-9A-Z-]*")
#: Systemd unit names are the same in every environment.
EXEMPT_PREFIXES = ("AGEBD-SERVICE-",)
def suffix_token(config):
"""
The token text these files must carry, taken from the central config so
that renaming the token cannot leave this check enforcing a stale name.
"""
if SUFFIX_TOKEN_NAME not in config.tokens:
raise AssertionError(
f"Token '{SUFFIX_TOKEN_NAME}' is not declared in "
f"{config.environments_file}, but qt/ is checked against it."
)
return f"@@{SUFFIX_TOKEN_NAME}@@"
def check_ui_file(text, token, filename):
"""
Report every AGEBD- device name in ``text`` that lacks ``token``.
"""
errors = []
for match in AGEBD_NAME.finditer(text):
name = match.group(0)
if name.startswith(EXEMPT_PREFIXES):
continue
if text[match.end() : match.end() + len(token)] == token:
continue
line = text.count("\n", 0, match.start()) + 1
errors.append(
f"{filename}:{line}: '{name}' is missing '{token}', so it resolves to the "
f"production device in every environment."
)
return errors
def check_ui_files():
"""
All 'AGEBD-' PVs need to contain the '$(AGEBD_ENV_SUFFIX)' macro,
which is:
'' in PROD
'-DEV' in DEV
Raise AssertionError listing every violation, or return silently.
"""
for filename in QT_DIR.glob("*"):
with open(filename, "r") as f:
for linenum, line in enumerate(f):
matches = re.findall("AGEBD-[0-9A-Z$()_]*:", line)
if matches:
for match in matches:
assert "$(AGEBD_ENV_SUFFIX)" in match, (
f"Missing $(AGEBD_ENV_SUFFIX) in {filename} in line number {linenum + 1}: {line} "
)
config = SubstitutionsConfig.load(REPO_ROOT / "config")
token = suffix_token(config)
errors = []
for path in sorted(QT_DIR.glob("*.ui")):
errors.extend(check_ui_file(path.read_text(), token, path.relative_to(REPO_ROOT)))
if errors:
raise AssertionError(
"Qt UI files missing the environment suffix:\n\n " + "\n ".join(errors)
)
if __name__ == "__main__":
try:
check_ui_files()
except AssertionError as e:
print(e, file=sys.stderr)
sys.exit(1)
print("All AGEBD- device names in qt/ carry the environment suffix.")
+22 -17
View File
@@ -1,24 +1,29 @@
"""
Print a service's IOC port.
get_ioc_port.py tune
The lookup itself lives in agebd.subs, which is also what render_subs.py and
the CLI use, so there is only one answer to "which port is this service on".
"""
import sys
import yaml
from agebd.utils import get_git_root
REPO_ROOT = get_git_root(".")
SERVICES_REGISTRY_FILE = REPO_ROOT / "config" / "services_registry.yml"
from agebd.subs import (
SERVICES_REGISTRY_FILENAME,
SubstitutionError,
read_ioc_port,
resolve_config_dir,
)
def get_ioc_port(service_name_lower: str):
with open(SERVICES_REGISTRY_FILE) as f:
d = yaml.safe_load(f)
for service_dict in d["services"]:
if service_dict["name"].lower() == service_name_lower:
return service_dict["ioc_port"]
raise ValueError(f"Service with lowercase name {service_name_lower} not found")
def get_ioc_port(service_name: str) -> int:
return read_ioc_port(resolve_config_dir() / SERVICES_REGISTRY_FILENAME, service_name)
if __name__ == "__main__":
service_name_lower = sys.argv[1]
port = get_ioc_port(service_name_lower)
print(port)
try:
print(get_ioc_port(sys.argv[1]))
except SubstitutionError as e:
print(f"error: {e}", file=sys.stderr)
sys.exit(1)
+71
View File
@@ -0,0 +1,71 @@
"""
Resolve deploy-time tokens in deployed files.
Values come from config/environments.yml and config/services_registry.yml --
the single source of truth. Nothing here knows what '-DEV' is.
render_subs.py --env dev --service tune /path/to/ioc /path/to/systemd
render_subs.py --env prod /sls/bd/hla/prod/qt
Without --service only the environment tokens are available, so a file that
needs a per-service token (ioc_port) fails loudly rather than shipping the
placeholder. A path that does not exist is reported and skipped, which is how
services without a systemd unit are handled.
"""
import argparse
import sys
from pathlib import Path
from agebd.subs import SubstitutionError, Substitutions
def render(subs, paths):
"""
Render every path in place. Returns the files that changed.
"""
changed = []
for path in paths:
if not path.exists():
print(f"skipped (does not exist): {path}")
continue
if path.is_dir():
changed.extend(subs.render_tree(path))
elif subs.render_file(path):
changed.append(path)
return changed
def main(argv=None):
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument("--env", required=True, help="Deployment environment, e.g. dev")
parser.add_argument(
"--service",
default=None,
help="Service name. Required for files holding per-service tokens.",
)
parser.add_argument("paths", nargs="+", type=Path, help="Files or directories to render")
args = parser.parse_args(argv)
if args.service:
subs = Substitutions.for_service(args.env, args.service)
else:
subs = Substitutions.for_env(args.env)
changed = render(subs, args.paths)
for path in changed:
print(f"rendered: {path}")
print(f"{len(changed)} file(s) rendered for env '{args.env}'")
return 0
if __name__ == "__main__":
try:
sys.exit(main())
except SubstitutionError as e:
print(f"error: {e}", file=sys.stderr)
sys.exit(1)
+45
View File
@@ -0,0 +1,45 @@
"""
Emit a service's derived names as shell assignments.
eval "$(service_names.py TauBPM)"
echo "$SYSTEMD_UNIT_NAME" # AGEBD-SERVICE-TAUBPM.service
Every form comes from agebd.names.ServiceName, so the deploy scripts carry no
copy of the naming conventions. Values are shell-quoted; an invalid service
name exits non-zero and emits nothing, so an unguarded eval cannot silently
leave the caller with empty variables.
"""
import shlex
import sys
from agebd.names import InvalidServiceName, ServiceName
#: Shell variable name -> ServiceName attribute.
EXPORTED = {
"SERVICE_NAME_CAMEL": "camel",
"SERVICE_NAME_UPPER": "upper",
"SERVICE_NAME_LOWER": "lower",
"SERVICE_DIR_NAME": "dir_name",
"SERVICE_MODULE_NAME": "module_name",
"IOC_NAME": "ioc_name",
"SYSTEMD_UNIT_NAME": "systemd_unit_name",
}
def shell_assignments(name: str) -> str:
service = ServiceName(name)
return "\n".join(
f"{var}={shlex.quote(getattr(service, attr))}" for var, attr in EXPORTED.items()
)
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"usage: {sys.argv[0]} <service-name>", file=sys.stderr)
sys.exit(2)
try:
print(shell_assignments(sys.argv[1]))
except InvalidServiceName as e:
print(f"error: {e}", file=sys.stderr)
sys.exit(1)
+73
View File
@@ -0,0 +1,73 @@
import pytest
from agebd.subs import SubstitutionsConfig
from agebd.utils import get_git_root
from ci.check_subs import (
check_declared,
check_location,
check_no_legacy_delimiters,
check_subs,
)
REPO_ROOT = get_git_root(__file__)
@pytest.fixture
def config():
return SubstitutionsConfig.load(REPO_ROOT / "config")
def test_repo_satisfies_the_substitution_contract():
check_subs()
def test_undeclared_token_in_a_render_path_is_reported(config):
errors = check_declared(config, "qt/A_BD_Tune.ui", "AGEBD-TUNE@@agebd_env_sufix_upper@@:AO")
assert len(errors) == 1
assert "agebd_env_sufix_upper" in errors[0]
def test_declared_token_in_a_render_path_is_accepted(config):
assert check_declared(config, "qt/A_BD_Tune.ui", "@@agebd_env_suffix_upper@@") == []
def test_token_outside_a_rendered_path_is_reported(config):
errors = check_location(config, "bin/start_service.sh", "SUFFIX=@@agebd_env_suffix_upper@@")
assert len(errors) == 1
assert "never rendered" in errors[0]
def test_token_in_a_render_path_is_accepted(config):
assert check_location(config, "qt/A_BD_Tune.ui", "@@agebd_env_suffix_upper@@") == []
def test_token_in_a_passthrough_path_is_accepted(config):
assert (
check_location(
config,
"templates/service/{{service_name_lower}}/current/ioc/x.jinja",
"@@agebd_env_suffix_upper@@",
)
== []
)
def test_legacy_delimiters_are_reported(config):
errors = check_no_legacy_delimiters(
config, "qt/A_BD_Tune.ui", "AGEBD-TUNE{{ agebd_env_suffix_upper }}:AO"
)
assert len(errors) == 1
assert "@@agebd_env_suffix_upper@@" in errors[0]
def test_creation_time_tokens_are_left_alone(config):
"""{{ service_name_upper }} is copier's, not ours."""
assert (
check_no_legacy_delimiters(
config, "templates/service/x/current/ioc/y.jinja", "{{ service_name_upper }}"
)
== []
)
+64 -2
View File
@@ -1,5 +1,67 @@
from ci.check_ui_files import check_ui_files
import pytest
from agebd.subs import SubstitutionsConfig
from agebd.utils import get_git_root
from ci.check_ui_files import check_ui_file, check_ui_files, suffix_token
REPO_ROOT = get_git_root(__file__)
TOKEN = "@@agebd_env_suffix_upper@@"
def test_check_ui_files():
@pytest.fixture
def token():
return suffix_token(SubstitutionsConfig.load(REPO_ROOT / "config"))
def test_repo_ui_files_all_carry_the_suffix():
check_ui_files()
def test_token_comes_from_the_central_config(token):
assert token == TOKEN
def test_pv_name_with_the_suffix_is_accepted(token):
text = f'<string notr="true">AGEBD-ALH{TOKEN}:NTURNS-ONOFF</string>'
assert check_ui_file(text, token, "A_BD_NTurns.ui") == []
def test_pv_name_without_the_suffix_is_reported(token):
text = '<string notr="true">AGEBD-ALH:NTURNS-ONOFF</string>'
errors = check_ui_file(text, token, "A_BD_NTurns.ui")
assert len(errors) == 1
assert "AGEBD-ALH" in errors[0]
assert "A_BD_NTurns.ui:1" in errors[0]
def test_ioc_macro_value_without_the_suffix_is_reported(token):
"""This is the bug that had the dev Service Manager driving prod IOCs."""
text = "<string>IOC=AGEBD-CPCL-NTURNS,service=NTURNS,name=NTurns</string>"
errors = check_ui_file(text, token, "A_BD_ServiceManager.ui")
assert len(errors) == 1
assert "AGEBD-CPCL-NTURNS" in errors[0]
def test_systemd_unit_name_is_exempt(token):
text = "<string>systemctl --user restart AGEBD-SERVICE-MASTER.service</string>"
assert check_ui_file(text, token, "A_BD_ServiceManager.ui") == []
def test_other_facilities_are_not_our_business(token):
text = "<string>IOC=AGEOP-CPCL-SHIFTTOOL,service=SHIFTTOOL</string>"
assert check_ui_file(text, token, "A_BD_ServiceManager.ui") == []
def test_reports_the_line_number(token):
text = "line one\nline two\n<string>AGEBD-TUNE:AO</string>\n"
errors = check_ui_file(text, token, "A_BD_Tune.ui")
assert "A_BD_Tune.ui:3" in errors[0]
+93
View File
@@ -0,0 +1,93 @@
import pytest
from agebd.subs import SubstitutionError, Substitutions, UnknownTokenError
from agebd.utils import get_git_root
from ci.render_subs import main, render
REPO_ROOT = get_git_root(__file__)
CONFIG_DIR = REPO_ROOT / "config"
@pytest.fixture
def service_tree(tmp_path):
ioc = tmp_path / "ioc"
ioc.mkdir()
(ioc / "AGEBD-CPCL-TUNE_main.subs").write_text("{ AGEBD-TUNE@@agebd_env_suffix_upper@@ }\n")
(ioc / "AGEBD-CPCL-TUNE_parameters.yaml").write_text(
"ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@\nioc_port: @@ioc_port@@\n"
)
systemd = tmp_path / "systemd"
systemd.mkdir()
(systemd / "AGEBD-SERVICE-TUNE.service").write_text("Environment=AGEBD_ENV=@@agebd_env@@\n")
return tmp_path
def test_renders_a_whole_service_for_dev(service_tree):
subs = Substitutions.for_service("dev", "tune", config_dir=CONFIG_DIR)
changed = render(subs, [service_tree / "ioc", service_tree / "systemd"])
assert len(changed) == 3
assert "AGEBD-TUNE-DEV" in (service_tree / "ioc/AGEBD-CPCL-TUNE_main.subs").read_text()
assert (service_tree / "ioc/AGEBD-CPCL-TUNE_parameters.yaml").read_text() == (
"ioc_host: sls-vserv-bd-01-dev\nioc_port: 50007\n"
)
assert (service_tree / "systemd/AGEBD-SERVICE-TUNE.service").read_text() == (
"Environment=AGEBD_ENV=dev\n"
)
def test_renders_a_whole_service_for_prod(service_tree):
subs = Substitutions.for_service("prod", "tune", config_dir=CONFIG_DIR)
render(subs, [service_tree / "ioc", service_tree / "systemd"])
assert "{ AGEBD-TUNE }" in (service_tree / "ioc/AGEBD-CPCL-TUNE_main.subs").read_text()
assert "sls-vserv-bd-01\n" in (service_tree / "ioc/AGEBD-CPCL-TUNE_parameters.yaml").read_text()
def test_missing_path_is_skipped_not_fatal(service_tree, capsys):
subs = Substitutions.for_service("dev", "tune", config_dir=CONFIG_DIR)
render(subs, [service_tree / "systemd", service_tree / "does-not-exist"])
assert "skipped (does not exist)" in capsys.readouterr().out
def test_leaves_nothing_unrendered(service_tree):
subs = Substitutions.for_service("dev", "tune", config_dir=CONFIG_DIR)
render(subs, [service_tree])
for path in service_tree.rglob("*"):
if path.is_file():
assert "@@" not in path.read_text(), path
def test_rendering_is_idempotent(service_tree):
subs = Substitutions.for_service("dev", "tune", config_dir=CONFIG_DIR)
assert len(render(subs, [service_tree])) == 3
assert render(subs, [service_tree]) == []
def test_per_service_token_without_service_fails_loudly(service_tree):
"""Without --service there is no ioc_port, and that must not pass silently."""
subs = Substitutions.for_env("dev", config_dir=CONFIG_DIR)
with pytest.raises(UnknownTokenError, match="ioc_port"):
render(subs, [service_tree / "ioc"])
def test_main_renders_via_the_command_line(service_tree):
exit_code = main(["--env", "dev", "--service", "tune", str(service_tree / "systemd")])
assert exit_code == 0
assert (service_tree / "systemd/AGEBD-SERVICE-TUNE.service").read_text() == (
"Environment=AGEBD_ENV=dev\n"
)
def test_main_rejects_an_undeclared_environment(service_tree):
with pytest.raises(SubstitutionError, match="staging"):
main(["--env", "staging", "--service", "tune", str(service_tree / "systemd")])
+72
View File
@@ -0,0 +1,72 @@
import subprocess
import sys
import pytest
from agebd.names import InvalidServiceName
from agebd.utils import get_git_root
from ci.service_names import EXPORTED, shell_assignments
SCRIPT = get_git_root(__file__) / "scripts" / "ci" / "service_names.py"
def run_in_shell(name):
"""Eval the output in a real shell and read the variables back."""
assignments = shell_assignments(name)
readback = "\n".join(f'printf "%s=%s\\n" {var} "${var}"' for var in EXPORTED)
out = subprocess.run(
["bash", "-c", f"{assignments}\n{readback}"],
capture_output=True,
text=True,
check=True,
).stdout
return dict(line.split("=", 1) for line in out.strip().splitlines())
def test_emits_every_derived_form():
values = run_in_shell("TauBPM")
assert values == {
"SERVICE_NAME_CAMEL": "TauBPM",
"SERVICE_NAME_UPPER": "TAUBPM",
"SERVICE_NAME_LOWER": "taubpm",
"SERVICE_DIR_NAME": "taubpm",
"SERVICE_MODULE_NAME": "agebd_taubpm",
"IOC_NAME": "AGEBD-CPCL-TAUBPM",
"SYSTEMD_UNIT_NAME": "AGEBD-SERVICE-TAUBPM.service",
}
def test_dashed_name_survives_the_shell():
values = run_in_shell("OpticsFF-X02S")
assert values["SERVICE_DIR_NAME"] == "opticsff-x02s"
assert values["SERVICE_MODULE_NAME"] == "agebd_opticsff_x02s"
assert values["IOC_NAME"] == "AGEBD-CPCL-OPTICSFF-X02S"
def test_invalid_name_raises():
with pytest.raises(InvalidServiceName):
shell_assignments("Tune; rm -rf /")
def test_cli_exits_non_zero_and_emits_nothing_on_a_bad_name():
result = subprocess.run(
[sys.executable, str(SCRIPT), "Tune Bump"],
capture_output=True,
text=True,
check=False,
)
assert result.returncode == 1
assert result.stdout == ""
assert "Invalid service name" in result.stderr
def test_cli_requires_exactly_one_argument():
result = subprocess.run(
[sys.executable, str(SCRIPT)], capture_output=True, text=True, check=False
)
assert result.returncode == 2
assert "usage:" in result.stderr
+2
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
+19
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -284,6 +286,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
]
[[package]]
name = "rich"
version = "15.0.0"
@@ -1,4 +1,4 @@
file DBPM3CURR.template {
pattern { DEVICE }
{ AGEBD-DBPM3CURR{{ agebd_env_suffix_upper }} }
{ AGEBD-DBPM3CURR@@agebd_env_suffix_upper@@ }
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -3,9 +3,9 @@ Description=AGEBD-SERVICE-DBPM3CURR
After=network.target
[Service]
Environment=AGEBD_ENV={{ agebd_env }}
Environment=AGEBD_ENV=@@agebd_env@@
Environment=PYTHONUNBUFFERED=1
ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh DBPM3CURR
ExecStart=/sls/bd/hla/@@agebd_env@@/bin/start_service.sh DBPM3CURR
Restart=no
[Install]
+19
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -284,6 +286,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
]
[[package]]
name = "rich"
version = "15.0.0"
@@ -1,31 +1,31 @@
file INJECTIONGUARD_individual.template {
pattern { DEVICE }
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} }
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ }
}
file INJECTIONGUARD_automated.template {
pattern { DEVICE NR Latch Description }
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 01 1 "Beam Dump Kicker"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 02 1 "Dump Valve"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 03 1 "MIS"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 04 1 "VCS"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 05 1 "Linac KV/BB/BY"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 06 1 "RF Linac"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 07 1 "RF Booster"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 08 1 "RF Ring"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 09 1 "Magnets Pulsed"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 10 1 "Magnets Booster"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 11 1 "Magnets Corrector"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 12 1 "Magnets Ring"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 13 1 "Current Limit"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 14 1 "IDs Ready"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 15 1 "Single Bunch Charge"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 16 1 "Injection Quality"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 17 1 "Dump Quality"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 18 1 "Lifetime"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 19 1 "Tune"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 20 0 "Pingers"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 21 1 "Vacuum Pressure"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 22 1 "Orbit Deviation"}
{ AGEBD-INJECTIONGUARD{{ agebd_env_suffix_upper }} 23 1 "Beam Dump Controller"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 01 1 "Beam Dump Kicker"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 02 1 "Dump Valve"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 03 1 "MIS"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 04 1 "VCS"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 05 1 "Linac KV/BB/BY"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 06 1 "RF Linac"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 07 1 "RF Booster"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 08 1 "RF Ring"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 09 1 "Magnets Pulsed"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 10 1 "Magnets Booster"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 11 1 "Magnets Corrector"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 12 1 "Magnets Ring"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 13 1 "Current Limit"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 14 1 "IDs Ready"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 15 1 "Single Bunch Charge"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 16 1 "Injection Quality"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 17 1 "Dump Quality"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 18 1 "Lifetime"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 19 1 "Tune"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 20 0 "Pingers"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 21 1 "Vacuum Pressure"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 22 1 "Orbit Deviation"}
{ AGEBD-INJECTIONGUARD@@agebd_env_suffix_upper@@ 23 1 "Beam Dump Controller"}
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -3,9 +3,9 @@ Description=AGEBD-SERVICE-INJECTIONGUARD
After=network.target
[Service]
Environment=AGEBD_ENV={{ agebd_env }}
Environment=AGEBD_ENV=@@agebd_env@@
Environment=PYTHONUNBUFFERED=1
ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh INJECTIONGUARD
ExecStart=/sls/bd/hla/@@agebd_env@@/bin/start_service.sh INJECTIONGUARD
Restart=no
[Install]
+2
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -1,32 +1,32 @@
file MASTER.template {
pattern { SUFFIX SERVICE STARTON AUTOOFF }
{ "{{ agebd_env_suffix_upper }}", "MASTER" , "0", "30" }
{ "{{ agebd_env_suffix_upper }}", "NTURNS" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "DBPM3CURR" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "TAUBPM" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "TAUPCT" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "SCRUBBING" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "TIMING" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "TUNE" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "INJECTIONGUARD" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "POSTMORTEMLOG" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "TUNEBUMP" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "PLOTS" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "ORBITBUMP" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "TOPUPTOOL" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "SHIFTTOOL" , "1", "0" }
{ "{{ agebd_env_suffix_upper }}", "BEAMTRANSFERCHECKS" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "TUNEFBX" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "TUNEFBY" , "0", "0" }
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X02S" , "0", "0" } # I-TOMCAT
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X03M" , "0", "0" } # ADRESS
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X04S" , "0", "0" } # ADDAMS
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X05L" , "0", "0" } # QUEST
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X06S" , "0", "0" } # PXI
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X07M" , "0", "0" } # PHOENIX/XTREME
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X08S" , "0", "0" } # MicroXAS
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X09L" , "0", "0" } # OPERA
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X10S" , "0", "0" } # PXII
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X11M" , "0", "0" } # SIM
{ "{{ agebd_env_suffix_upper }}", "OPTICSFF-X12S" , "0", "0" } # cSAXS
{ "@@agebd_env_suffix_upper@@", "MASTER" , "0", "30" }
{ "@@agebd_env_suffix_upper@@", "NTURNS" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "DBPM3CURR" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "TAUBPM" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "TAUPCT" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "SCRUBBING" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "TIMING" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "TUNE" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "INJECTIONGUARD" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "POSTMORTEMLOG" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "TUNEBUMP" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "PLOTS" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "ORBITBUMP" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "TOPUPTOOL" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "SHIFTTOOL" , "1", "0" }
{ "@@agebd_env_suffix_upper@@", "BEAMTRANSFERCHECKS" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "TUNEFBX" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "TUNEFBY" , "0", "0" }
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X02S" , "0", "0" } # I-TOMCAT
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X03M" , "0", "0" } # ADRESS
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X04S" , "0", "0" } # ADDAMS
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X05L" , "0", "0" } # QUEST
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X06S" , "0", "0" } # PXI
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X07M" , "0", "0" } # PHOENIX/XTREME
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X08S" , "0", "0" } # MicroXAS
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X09L" , "0", "0" } # OPERA
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X10S" , "0", "0" } # PXII
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X11M" , "0", "0" } # SIM
{ "@@agebd_env_suffix_upper@@", "OPTICSFF-X12S" , "0", "0" } # cSAXS
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -3,9 +3,9 @@ Description=AGEBD-SERVICE-MASTER
After=network.target
[Service]
Environment=AGEBD_ENV={{ agebd_env }}
Environment=AGEBD_ENV=@@agebd_env@@
Environment=PYTHONUNBUFFERED=1
ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh MASTER
ExecStart=/sls/bd/hla/@@agebd_env@@/bin/start_service.sh MASTER
Restart=no
[Install]
+19
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -286,6 +288,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
]
[[package]]
name = "rich"
version = "15.0.0"
@@ -1,4 +1,4 @@
file NTURNS.template {
pattern { DEVICE }
{ AGEBD-NTURNS{{ agebd_env_suffix_upper }} }
{ AGEBD-NTURNS@@agebd_env_suffix_upper@@ }
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -3,9 +3,9 @@ Description=AGEBD-SERVICE-NTURNS
After=network.target
[Service]
Environment=AGEBD_ENV={{ agebd_env }}
Environment=AGEBD_ENV=@@agebd_env@@
Environment=PYTHONUNBUFFERED=1
ExecStart=/sls/bd/hla/{{ agebd_env }}/bin/start_service.sh NTURNS
ExecStart=/sls/bd/hla/@@agebd_env@@/bin/start_service.sh NTURNS
Restart=no
[Install]
@@ -2,31 +2,31 @@ file ORBITBUMP_machine.template {
pattern
{DEVICE 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
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ 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}
}
@@ -34,29 +34,29 @@ file ORBITBUMP_beamline.template {
pattern
{DEVICE sourcepoint beamline DRVL DRVH X XP Y YP }
# Diagnostic dipole beamlines
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X01DD NEMO -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X08DB DISCO -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X10DG X11HEAT -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X01DD NEMO -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X08DB DISCO -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X10DG X11HEAT -10 10 0 0 0 0 }
# User dipole beamlines
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X01DA DEBYE -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X02DA S-TOMCAT -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X03DA PEARL -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X04DB VUV -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X05DA Optics -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X06DA PXIII -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X07DB nanoXAS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X07DA PolLux -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X10DA SuperXAS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X01DA DEBYE -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X02DA S-TOMCAT -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X03DA PEARL -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X04DB VUV -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X05DA Optics -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X06DA PXIII -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X07DB nanoXAS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X07DA PolLux -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X10DA SuperXAS -10 10 0 0 0 0 }
# ID beamlines
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X02SA I-TOMCAT -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X03MA ADRESS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X04SA ADDAMS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X05LA QUEST -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X06SA PXI -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X07MA Phoenix/XTreme -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X08SA micro-XAS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X09LA PEARL/XIL-II -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X10SA PXII -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X11MA SIM -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP{{ agebd_env_suffix_upper }} X12SA cSAXS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X02SA I-TOMCAT -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X03MA ADRESS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X04SA ADDAMS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X05LA QUEST -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X06SA PXI -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X07MA Phoenix/XTreme -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X08SA micro-XAS -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X09LA PEARL/XIL-II -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X10SA PXII -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X11MA SIM -10 10 0 0 0 0 }
{AGEBD-ORBITBUMP@@agebd_env_suffix_upper@@ X12SA cSAXS -10 10 0 0 0 0 }
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
@@ -1,4 +1,4 @@
file PARAMS.template {
pattern { DEVICE }
{ AGEBD-PARAMS{{ agebd_env_suffix_upper }} }
{ AGEBD-PARAMS@@agebd_env_suffix_upper@@ }
}
@@ -1,6 +1,6 @@
cpu_architecture: x86_64
epics_version: 7.0.8
ioc_host: sls-vserv-bd-01{{ agebd_env_suffix_lower }}
ioc_port: {{ ioc_port }}
ioc_host: sls-vserv-bd-01@@agebd_env_suffix_lower@@
ioc_port: @@ioc_port@@
os: RHEL8
os_id: rhel
+19
View File
@@ -10,6 +10,7 @@ dependencies = [
{ name = "gitpython" },
{ name = "h5py" },
{ name = "pyepics" },
{ name = "pyyaml" },
{ name = "typer" },
]
@@ -18,6 +19,7 @@ requires-dist = [
{ name = "gitpython", specifier = ">=3.1.50" },
{ name = "h5py", specifier = ">=3.16.0" },
{ name = "pyepics", specifier = ">=3.5.10" },
{ name = "pyyaml", specifier = ">=6.0.3" },
{ name = "typer", specifier = ">=0.23.2" },
]
@@ -510,6 +512,23 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
]
[[package]]
name = "pyyaml"
version = "6.0.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
{ url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
{ url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
{ url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
{ url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
{ url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
{ url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
{ url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
{ url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
]
[[package]]
name = "requests"
version = "2.34.2"

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