adding documentation
CI / build-and-test (push) Failing after 12s

This commit is contained in:
2026-06-10 11:17:59 +02:00
parent 13accdec19
commit 2f98c009d3
5 changed files with 62 additions and 191 deletions
+1 -1
View File
@@ -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
+61 -13
View File
@@ -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)
- [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.
-22
View File
@@ -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)
-36
View File
@@ -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)
-119
View File
@@ -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")