Implemented epics read/write
This commit is contained in:
Executable
+81
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env bash
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# uopi test SoftIOC startup script
|
||||
#
|
||||
# Prerequisites:
|
||||
# • EPICS Base 3.15+ (for RNDM calc function)
|
||||
# • 'softIoc' binary in PATH (usually $EPICS_BASE/bin/$EPICS_HOST_ARCH/)
|
||||
# • Optional: caput (from EPICS tools) to pre-fill UOPI:WAVEFORM
|
||||
#
|
||||
# Usage:
|
||||
# cd workspace/softioc
|
||||
# ./st.cmd
|
||||
#
|
||||
# Or directly (no waveform pre-fill):
|
||||
# softIoc -s -d workspace/softioc/uopi_test.db
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# ── Locate softIoc ────────────────────────────────────────────────────────────
|
||||
if ! command -v softIoc &>/dev/null; then
|
||||
# Try common EPICS install paths
|
||||
for candidate in \
|
||||
"$EPICS_BASE/bin/$EPICS_HOST_ARCH/softIoc" \
|
||||
/usr/local/epics/base/bin/linux-x86_64/softIoc \
|
||||
/opt/epics/bin/linux-x86_64/softIoc; do
|
||||
if [ -x "$candidate" ]; then
|
||||
export PATH="$(dirname "$candidate"):$PATH"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if ! command -v softIoc &>/dev/null; then
|
||||
echo "ERROR: softIoc not found. Set EPICS_BASE or add softIoc to PATH."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Starting uopi test IOC…"
|
||||
echo " PV prefix : UOPI:"
|
||||
echo " Database : uopi_test.db"
|
||||
echo " softIoc : $(command -v softIoc)"
|
||||
echo ""
|
||||
|
||||
# ── Start IOC in background so we can run caput for waveform ─────────────────
|
||||
softIoc -s -d uopi_test.db &
|
||||
IOC_PID=$!
|
||||
|
||||
# ── Pre-fill UOPI:WAVEFORM with a sine+DC pattern (requires caput) ───────────
|
||||
if command -v caput &>/dev/null; then
|
||||
sleep 2 # wait for IOC to initialise Channel Access
|
||||
|
||||
python3 - <<'PYEOF'
|
||||
import subprocess, math
|
||||
|
||||
n = 64
|
||||
# Sine with 3 harmonics: models a realistic ADC capture
|
||||
vals = [
|
||||
0.5 + 0.4 * math.sin(2 * math.pi * i / n)
|
||||
+ 0.1 * math.sin(6 * math.pi * i / n)
|
||||
+ 0.05 * math.sin(10 * math.pi * i / n)
|
||||
for i in range(n)
|
||||
]
|
||||
args = ["caput", "-a", "UOPI:WAVEFORM", str(n)] + [f"{v:.6f}" for v in vals]
|
||||
result = subprocess.run(args, capture_output=True, text=True)
|
||||
if result.returncode == 0:
|
||||
print(f" UOPI:WAVEFORM filled with {n}-point multi-harmonic sine.")
|
||||
else:
|
||||
print(f" caput failed: {result.stderr.strip()}")
|
||||
PYEOF
|
||||
else
|
||||
echo " (caput not found — UOPI:WAVEFORM left empty; fill manually via caput)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "IOC running (PID $IOC_PID). Connect uopi with:"
|
||||
echo " UOPI_EPICS_CA_ADDR_LIST=127.0.0.1 ./dist/uopi -config workspace/uopi.toml"
|
||||
echo ""
|
||||
echo "Press Ctrl-C to stop."
|
||||
wait "$IOC_PID"
|
||||
Reference in New Issue
Block a user