From 2f98c009d38faa00f7c83051b66204757180d352 Mon Sep 17 00:00:00 2001 From: Hugo Jean Ponsin Date: Wed, 10 Jun 2026 11:17:59 +0200 Subject: [PATCH] adding documentation --- .gitea/workflows/action.yaml | 2 +- README.md | 74 ++++++++++++++++++---- tests/caproto_wrapper.py | 22 ------- tests/test.py | 36 ----------- tests/test_main8.py | 119 ----------------------------------- 5 files changed, 62 insertions(+), 191 deletions(-) delete mode 100644 tests/caproto_wrapper.py delete mode 100644 tests/test.py delete mode 100644 tests/test_main8.py diff --git a/.gitea/workflows/action.yaml b/.gitea/workflows/action.yaml index 36b6d02..78bafa2 100644 --- a/.gitea/workflows/action.yaml +++ b/.gitea/workflows/action.yaml @@ -25,5 +25,5 @@ jobs: export EPICS_CAS_INTF_ADDR_LIST="127.0.0.1 localhost"; export EPICS_CA_ADDR_LIST="127.0.0.1 localhost"; export EPICS_CA_SERVER_PORT=5064; - source testenv/bin/activate && python3 tests/test.py + source testenv/bin/activate && python3 test/test.py \ No newline at end of file diff --git a/README.md b/README.md index be55ee4..cd7320b 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,17 @@ An EPICS driver based on StreamDevice allowing to control remotely both ePowerSwitch 4 IEC and 8M+ -# How to use - -Before any execution, look at startioc.sh. - -It will show you any environment variables you need to see. - -After setting up environment variables, you can start by executing +# How to install ```bash -$ startioc.sh +git clone https://gitea.psi.ch/lin-epics-modules/ePowerSwitch && make install +``` + +# How to use + +To start the IOCSH, +```bash +$ ./startioc.sh ``` # Documentation @@ -27,8 +28,8 @@ By default, it should be called ``` ePowerSwitch_set_outlet_1 ePowerSwitch_set_outlet_2 -ePowerSwitch_set_outlet_3 -ePowerSwitch_set_outlet_4 +... +ePowerSwitch_set_outlet_n ``` ## Getters @@ -42,8 +43,8 @@ By default, it should be called ``` ePowerSwitch_get_outlet_1 ePowerSwitch_get_outlet_2 -ePowerSwitch_get_outlet_3 -ePowerSwitch_get_outlet_4 +... +ePowerSwitch_get_outlet_n ``` Furthermore, a record exposes the number of sockets of this device: @@ -58,12 +59,59 @@ By default, it should be called ePowerSwitch_config_maxOutlet ``` +# Simulator + +the subfolder 'sim' containt a simulator of the real device + +To start it: + +```bash +sh maketestenv.sh && source testenv/bin/activate && python3 sim/ePowerSwitch8_sim.py +``` + # Test +A CI pipeline is setup +To manually start tests + +```bash +sh maketestenv.sh && source testenv/bin/activate && python3 test/test.py +``` # User guide - [ePowerSwitch 4 IEC](https://www.kvm-concepts.de/wp-content/uploads/neol_epowerswitch_4iec_manual.pdf) -- [ePowerSwitch 8M+](https://www.neol.com/fileadmin/downloads/en/ePowerSwitch-8M-Plus-EN.pdf) \ No newline at end of file +- [ePowerSwitch 8M+](https://www.neol.com/fileadmin/downloads/en/ePowerSwitch-8M-Plus-EN.pdf) + +# Preview + +This is the setup of all epics records for a 4 outlet device + +![alt text](.img/powerSwitch.png) + +## outlet_init + +This record initially attempts to fetch the current state of all outlets to initialize each `set_outlet_x` record with its current value. + +## init_x + +These records overwrite the current value of all `set_outlet_x` records to match the actual initial state of the outlets. + +## set_outlet_x + +These records allow commands to be sent to the device by writing to them. +Acceptable states are: `{ OFF, ON, RESTART }` + +## outlet_getter + +This record fetches the state of the device's outlets and stores these values into its own fields. + +## get_outlet_x + +This record can be read to retrieve the current state of a specific outlet. + +## config_maxOutlet + +This record allows users to easily determine how many outlets are present on the device. \ No newline at end of file diff --git a/tests/caproto_wrapper.py b/tests/caproto_wrapper.py deleted file mode 100644 index 05fed30..0000000 --- a/tests/caproto_wrapper.py +++ /dev/null @@ -1,22 +0,0 @@ -from caproto.sync.client import read, write -from time import sleep - -class CaprotoWrapper: - def raw_read(pvname): - return read(pvname, timeout=5).data[0].decode('utf-8') - - def get_pv_value(pvname, expected_value): - timeout = 10 - while(expected_value != CaprotoWrapper.raw_read(pvname) and timeout > 0): - timeout -=1 - sleep(0.5) - - return CaprotoWrapper.raw_read(pvname) - - def set_pv_value(pvname, value): - write(pvname, value, notify=True) - timeout = 10 - while(value != CaprotoWrapper.raw_read(pvname) and timeout > 0): - timeout -= 1 - sleep(0.5) - \ No newline at end of file diff --git a/tests/test.py b/tests/test.py deleted file mode 100644 index ef45b50..0000000 --- a/tests/test.py +++ /dev/null @@ -1,36 +0,0 @@ -import subprocess -import sys -import signal - -from caproto_wrapper import CaprotoWrapper - -def is_ioc_running(): - return "" != CaprotoWrapper.raw_read("ePowerSwitch_set_outlet_1") - -def start_iocshell(): - res = subprocess.Popen(["./startioc.sh"]) - while not is_ioc_running(): - pass - return res - -def start_sim(): - return subprocess.Popen(["python", "./sim/ePowerSwitch8_sim.py"]) - -def start_pytest(): - return subprocess.Popen(["pytest","tests"]) - -sim_process = start_sim() -iocsh_process = start_iocshell() -pytest_process = start_pytest() -exit_code = 0 - -try: - - exit_code = pytest_process.wait() - -finally: - sim_process.send_signal(sig=signal.SIGTERM) - iocsh_process.send_signal(sig=signal.SIGTERM) - pytest_process.send_signal(sig=signal.SIGTERM) - -sys.exit(exit_code) \ No newline at end of file diff --git a/tests/test_main8.py b/tests/test_main8.py deleted file mode 100644 index 857d778..0000000 --- a/tests/test_main8.py +++ /dev/null @@ -1,119 +0,0 @@ -from caproto_wrapper import CaprotoWrapper - -delay = 1 - -def test_turn_on(): - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_1", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_2", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_3", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_4", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_5", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_6", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_7", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "On") == "On") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "On") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_8", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "On") == "On") - - - -def test_turn_off(): - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_1", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_2", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "Off") == "Off") - - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_3", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_4", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_5", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_6", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_7", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "Off") == "Off") - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "Off") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_set_outlet_8", "Off") == "Off") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "Off") == "Off") - - - -def test_restart(): - - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_1", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_2", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_3", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_4", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_5", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_6", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_7", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "Rst") == "Rst") - CaprotoWrapper.set_pv_value("ePowerSwitch_set_outlet_8", "Restart") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "Rst") == "Rst") - - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_1", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_2", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_3", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_4", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_5", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_6", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_7", "On") == "On") - assert(CaprotoWrapper.get_pv_value("ePowerSwitch_get_outlet_8", "On") == "On") -