diff --git a/script/tests/devices/PO2DV-NCS-LS/.config b/script/tests/devices/PO2DV-NCS-LS/.config
new file mode 100644
index 0000000..24fb82e
--- /dev/null
+++ b/script/tests/devices/PO2DV-NCS-LS/.config
@@ -0,0 +1,4 @@
+name=PO2DV-NCS-LS
+description=Optis 2 Linear Slide in test office setup
+#tests=Collimator Tests
+tests=Linear Slide Tests
\ No newline at end of file
diff --git a/script/tests/devices/PO2DV-NCS-VHQ1/.config b/script/tests/devices/PO2DV-NCS-VHQ1/.config
new file mode 100644
index 0000000..efd82e9
--- /dev/null
+++ b/script/tests/devices/PO2DV-NCS-VHQ1/.config
@@ -0,0 +1,3 @@
+name=PO2DV-NCS-VHQ1
+description=Optis 2 Linear Slide in test office setup
+tests=PS Tests
diff --git a/script/tests/devices/PO2TC-NCS-RS/.config b/script/tests/devices/PO2TC-NCS-RS/.config
new file mode 100644
index 0000000..48567a5
--- /dev/null
+++ b/script/tests/devices/PO2TC-NCS-RS/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-RS
+description=RS& Range Shifter
+tests=Range Shifter Tests
diff --git a/script/tests/devices/Production/DMAF1/.config b/script/tests/devices/Production/DMAF1/.config
new file mode 100644
index 0000000..b134802
--- /dev/null
+++ b/script/tests/devices/Production/DMAF1/.config
@@ -0,0 +1,3 @@
+name=PROF02&DMAF1
+description=Collimators
+tests=Collimator Tests pro
diff --git a/script/tests/devices/Production/PO2DV-NCS-VHQ1/.config b/script/tests/devices/Production/PO2DV-NCS-VHQ1/.config
new file mode 100644
index 0000000..efd82e9
--- /dev/null
+++ b/script/tests/devices/Production/PO2DV-NCS-VHQ1/.config
@@ -0,0 +1,3 @@
+name=PO2DV-NCS-VHQ1
+description=Optis 2 Linear Slide in test office setup
+tests=PS Tests
diff --git a/script/tests/devices/Production/PO2TC-NCS-FIXL/.config b/script/tests/devices/Production/PO2TC-NCS-FIXL/.config
new file mode 100644
index 0000000..3058e57
--- /dev/null
+++ b/script/tests/devices/Production/PO2TC-NCS-FIXL/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-FIXL
+description=FIXL& Fixation Light
+tests=Display Tests
diff --git a/script/tests/devices/Production/PO2TC-NCS-MWD/.config b/script/tests/devices/Production/PO2TC-NCS-MWD/.config
new file mode 100644
index 0000000..ba69bed
--- /dev/null
+++ b/script/tests/devices/Production/PO2TC-NCS-MWD/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-MWD
+description=MWD& Modulator Wheel Display
+tests=Display Tests
diff --git a/script/tests/devices/Production/PO2TC-NCS-SC21/.config b/script/tests/devices/Production/PO2TC-NCS-SC21/.config
new file mode 100644
index 0000000..0f00694
--- /dev/null
+++ b/script/tests/devices/Production/PO2TC-NCS-SC21/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-SC21
+description=SC21& Scatter Foil 2.1
+tests=Linear Slide Tests
diff --git a/script/tests/devices/Production/PO2TC-NCS-SC22/.config b/script/tests/devices/Production/PO2TC-NCS-SC22/.config
new file mode 100644
index 0000000..4e36bf8
--- /dev/null
+++ b/script/tests/devices/Production/PO2TC-NCS-SC22/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-SC22
+description=SC21& Scatter Foil 2.2
+tests=Linear Slide Tests
diff --git a/script/tests/devices/Production/PO2TC-NCS-SC23/.config b/script/tests/devices/Production/PO2TC-NCS-SC23/.config
new file mode 100644
index 0000000..e80429e
--- /dev/null
+++ b/script/tests/devices/Production/PO2TC-NCS-SC23/.config
@@ -0,0 +1,3 @@
+name=PO2TC-NCS-SC23
+description=SC23& Scatter Foil 2.3
+tests=Linear Slide Tests
diff --git a/script/tests/devices/bx84/.config b/script/tests/devices/bx84/.config
new file mode 100644
index 0000000..715eae5
--- /dev/null
+++ b/script/tests/devices/bx84/.config
@@ -0,0 +1,5 @@
+#Tue Oct 03 13&56&43 CEST 2017
+name=bx84
+tests=sad
+description=simulation device in playground
+parameters=delay&".2"&"delay between 2 steps";bla&"234"&"bla bla";setVal&"11"&"value to set";expectedVal&"18.1"&"expected returned value";mask&"2"&"bit mask";
diff --git a/script/tests/devices/bx84_2/.config b/script/tests/devices/bx84_2/.config
new file mode 100644
index 0000000..406d46e
--- /dev/null
+++ b/script/tests/devices/bx84_2/.config
@@ -0,0 +1,5 @@
+#Fri Oct 13 10:59:28 CEST 2017
+name=bx84_2
+tests=sad
+parameters=a&IQCOM,$GNT3,1,DIA\:22&23;delay&.2&delay between 2 steps;bla&234&bla bla;setVal&21&value to set;expectedVal&18.1&expected returned value;mask&2&bit mask;
+description=simulation device in playground
diff --git a/script/tests/devices/oldDev1/.config b/script/tests/devices/oldDev1/.config
new file mode 100644
index 0000000..59fc0b3
--- /dev/null
+++ b/script/tests/devices/oldDev1/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:51:16 CET 2018
+name=oldDev1
+tests=Old struct tests
+description=o
diff --git a/script/tests/devices/oldDev2/.config b/script/tests/devices/oldDev2/.config
new file mode 100644
index 0000000..83c459e
--- /dev/null
+++ b/script/tests/devices/oldDev2/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:51:21 CET 2018
+name=oldDev2
+tests=Old struct tests
+description=o
diff --git a/script/tests/new-structure-tests-devices/devices/AMA1/.config b/script/tests/new-structure-tests-devices/devices/AMA1/.config
new file mode 100644
index 0000000..fc7fe9d
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/AMA1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 15:07:43 CEST 2017
+name=AMA1
+tests=RPS Tests Interlocklilmits
+parameters=ilkInExpectedValS&"0x91DD"&"[hex] Interlock Input expected value for small values of magnet";magnetCh&"AMA1\:SOL\:1"&"Magnet epics channel";ilkInCh&"J102025\:REG\:R\:6"&"Interlock Input epics channel";ilkInExpectedValIni&"0x1DDD"&"[hex] Interlock Input expected initial value";ilkOutExpectedValL&"0x0000"&"[hex] Interlock Output expected value for large values of magnet";magnetEndVal&"50000"&"[int] magnet final value for scan sequence";ilkOutCh&"J102025\:REG\:R\:3"&"Interlock Output epics channel";ilkOutExpectedValIni&"0x0000"&"[hex] Interlock Output expected initial value";ilkOutExpectedValS&"0x000C"&"[hex] Interlock Output expected value for small values of magnet";magnetInitVal&"0"&"[int] magnet initial value for scan sequence";setGetDelay&"1"&"[s] delay between set and get";mode&"2,IQCOM,$GNT2,1,DIA"&"operating mode";
+description=Ablenkungsmagnet AMA1
diff --git a/script/tests/new-structure-tests-devices/devices/Gantry1/.config b/script/tests/new-structure-tests-devices/devices/Gantry1/.config
new file mode 100644
index 0000000..53a0996
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/Gantry1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=Gantry1
+tests=RPS Tests Betriebsmode
+description=rps section till Gantry 1
+parameters=mode&"2,IQCOM,$GNT1,1,DIA"&"betriebsmode";expectedVal14&"0x0040"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/Gantry2/.config b/script/tests/new-structure-tests-devices/devices/Gantry2/.config
new file mode 100644
index 0000000..e1a8365
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/Gantry2/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=Gantry2
+tests=RPS Tests Betriebsmode
+description=rps section till Gantry 2
+parameters=mode&"2,IQCOM,$GNT2,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0004"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/Gantry3/.config b/script/tests/new-structure-tests-devices/devices/Gantry3/.config
new file mode 100644
index 0000000..7c2fa77
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/Gantry3/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=Gantry3
+tests=RPS Tests Betriebsmode
+description=rps section till Gantry 3
+parameters=mode&"2,IQCOM,$GNT3,1,DIA"&"betriebsmode";expectedVal14&"0x0400"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/Optis/.config b/script/tests/new-structure-tests-devices/devices/Optis/.config
new file mode 100644
index 0000000..99ea97c
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/Optis/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=Optis
+tests=RPS Tests Betriebsmode
+description=rps section till Optis
+parameters=mode&"2,IQCOM,$OPT,1,DIA"&"betriebsmode";expectedVal14&"0x4000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/PIF/.config b/script/tests/new-structure-tests-devices/devices/PIF/.config
new file mode 100644
index 0000000..8c21914
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/PIF/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=PIF
+tests=RPS Tests Betriebsmode
+description=rps section till PIF
+parameters=mode&"2,IQCOM,$PIF,1,DIA"&"betriebsmode";expectedVal14&"0x0400"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/XMA0310/.config b/script/tests/new-structure-tests-devices/devices/XMA0310/.config
new file mode 100644
index 0000000..60eb5e9
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA0310/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:57:25 CEST 2017
+name=XMA0310
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J101030"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA0311/.config b/script/tests/new-structure-tests-devices/devices/XMA0311/.config
new file mode 100644
index 0000000..24c2268
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA0311/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:58:05 CEST 2017
+name=XMA0311
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J101030"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA0410/.config b/script/tests/new-structure-tests-devices/devices/XMA0410/.config
new file mode 100644
index 0000000..c07e7dd
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA0410/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:58:37 CEST 2017
+name=XMA0410
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:7"&"RPS EPICS attribute";rpsModule&"J101046"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA1115/.config b/script/tests/new-structure-tests-devices/devices/XMA1115/.config
new file mode 100644
index 0000000..958b3d6
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA1115/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:53:14 CEST 2017
+name=XMA1115
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA1116/.config b/script/tests/new-structure-tests-devices/devices/XMA1116/.config
new file mode 100644
index 0000000..1f8c70d
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA1116/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:41:43 CEST 2017
+name=XMA1116
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA1117/.config b/script/tests/new-structure-tests-devices/devices/XMA1117/.config
new file mode 100644
index 0000000..1454885
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA1117/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:53:44 CEST 2017
+name=XMA1117
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x1000"&"[hex] expected value 2";expectedValue1&"0xD000"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA1118/.config b/script/tests/new-structure-tests-devices/devices/XMA1118/.config
new file mode 100644
index 0000000..04bc1ae
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA1118/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:40:33 CEST 2017
+name=XMA1118
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:7"&"RPS EPICS attribute";rpsModule&"J102025"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMA1119/.config b/script/tests/new-structure-tests-devices/devices/XMA1119/.config
new file mode 100644
index 0000000..49addfb
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMA1119/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:41:13 CEST 2017
+name=XMA1119
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J102007"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMB0510/.config b/script/tests/new-structure-tests-devices/devices/XMB0510/.config
new file mode 100644
index 0000000..fdc4185
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMB0510/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 14:02:17 CEST 2017
+name=XMB0510
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J108053"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMC0610/.config b/script/tests/new-structure-tests-devices/devices/XMC0610/.config
new file mode 100644
index 0000000..bf9394b
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMC0610/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 14:00:49 CEST 2017
+name=XMC0610
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J110060"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMC2010/.config b/script/tests/new-structure-tests-devices/devices/XMC2010/.config
new file mode 100644
index 0000000..2753f2e
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMC2010/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 14:01:23 CEST 2017
+name=XMC2010
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J117065"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMC2011/.config b/script/tests/new-structure-tests-devices/devices/XMC2011/.config
new file mode 100644
index 0000000..3dc2824
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMC2011/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 14:01:52 CEST 2017
+name=XMC2011
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J117065"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMD0710/.config b/script/tests/new-structure-tests-devices/devices/XMD0710/.config
new file mode 100644
index 0000000..14e1a37
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMD0710/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:59:03 CEST 2017
+name=XMD0710
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J124081"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMD0711/.config b/script/tests/new-structure-tests-devices/devices/XMD0711/.config
new file mode 100644
index 0000000..c262689
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMD0711/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:59:41 CEST 2017
+name=XMD0711
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J124081"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XMD0717/.config b/script/tests/new-structure-tests-devices/devices/XMD0717/.config
new file mode 100644
index 0000000..2c935f5
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XMD0717/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 14:00:11 CEST 2017
+name=XMD0717
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J124092"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XME1310/.config b/script/tests/new-structure-tests-devices/devices/XME1310/.config
new file mode 100644
index 0000000..a66d3fc
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XME1310/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:54:46 CEST 2017
+name=XME1310
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:6"&"RPS EPICS attribute";rpsModule&"J112009"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XME1311/.config b/script/tests/new-structure-tests-devices/devices/XME1311/.config
new file mode 100644
index 0000000..c42d1e2
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XME1311/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:55:53 CEST 2017
+name=XME1311
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:4"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0100"&"[hex] expected value 2";expectedValue1&"0x0D00"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XME1410/.config b/script/tests/new-structure-tests-devices/devices/XME1410/.config
new file mode 100644
index 0000000..1d114f8
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XME1410/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:56:25 CEST 2017
+name=XME1410
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0001"&"[hex] expected value 2";expectedValue1&"0x000D"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/XME1411/.config b/script/tests/new-structure-tests-devices/devices/XME1411/.config
new file mode 100644
index 0000000..f874918
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/XME1411/.config
@@ -0,0 +1,5 @@
+#Fri Oct 20 13:56:53 CEST 2017
+name=XME1411
+tests=RPS Tests Diagnostic
+parameters=rpsAttribute&"REG\:R\:5"&"RPS EPICS attribute";rpsModule&"J112023"&"RPS module EPICS channel name";expectedValue2&"0x0010"&"[hex] expected value 2";expectedValue1&"0x00D0"&"[hex] expected value 1";
+description=Diagnostic module
diff --git a/script/tests/new-structure-tests-devices/devices/bis-BMA1/.config b/script/tests/new-structure-tests-devices/devices/bis-BMA1/.config
new file mode 100644
index 0000000..9fbf4a2
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/bis-BMA1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:10 CEST 2017
+name=bis-BMA1
+tests=RPS Tests Betriebsmode
+parameters=mode&"2,IQCOM,$BMA1,1,DIAG"&"operating mode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
+description=rps section till BMA1
diff --git a/script/tests/new-structure-tests-devices/devices/bis-BMC1/.config b/script/tests/new-structure-tests-devices/devices/bis-BMC1/.config
new file mode 100644
index 0000000..dd62c9f
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/bis-BMC1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:10 CEST 2017
+name=bis-BMC1
+tests=RPS Tests Betriebsmode
+parameters=mode&"2,IQCOM,$BMC1,1,DIAG"&"operating mode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
+description=rps section till BMC1
diff --git a/script/tests/new-structure-tests-devices/devices/bis-BMD1/.config b/script/tests/new-structure-tests-devices/devices/bis-BMD1/.config
new file mode 100644
index 0000000..163d7d8
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/bis-BMD1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=bis-BMD1
+tests=RPS Tests Betriebsmode
+description=rps section till BMD1
+parameters=mode&"2,IQCOM,$BMD1,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/bis-BME1/.config b/script/tests/new-structure-tests-devices/devices/bis-BME1/.config
new file mode 100644
index 0000000..6ae20bb
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/bis-BME1/.config
@@ -0,0 +1,5 @@
+#Wed Oct 18 10:54:16 CEST 2017
+name=bis-BME1
+tests=RPS Tests Betriebsmode
+description=rps section till BME1
+parameters=mode&"2,IQCOM,$BME1,1,DIA"&"betriebsmode";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";
diff --git a/script/tests/new-structure-tests-devices/devices/newbx84/.config b/script/tests/new-structure-tests-devices/devices/newbx84/.config
new file mode 100644
index 0000000..927ba6b
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/newbx84/.config
@@ -0,0 +1,5 @@
+#Tue Mar 20 09:48:39 CET 2018
+name=newbx84
+tests=New Structure Tests
+parameters=par1&"1"&"override param 1";par3&"p3"&"device specific param";
+description=bx84 device for new testing list structure
diff --git a/script/tests/new-structure-tests-devices/devices/oldDev1/.config b/script/tests/new-structure-tests-devices/devices/oldDev1/.config
new file mode 100644
index 0000000..89800c9
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/oldDev1/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:51:16 CET 2018
+name=oldDev1
+tests=Olt struct tests
+description=o
diff --git a/script/tests/new-structure-tests-devices/devices/oldDev2/.config b/script/tests/new-structure-tests-devices/devices/oldDev2/.config
new file mode 100644
index 0000000..01a943a
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/devices/oldDev2/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:51:21 CET 2018
+name=oldDev2
+tests=Olt struct tests
+description=o
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/.config b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/.config
new file mode 100644
index 0000000..d88084e
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:40:52 CET 2018
+name=new bx84 2
+parameters=
+description=bla
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/help.html b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/help.html
new file mode 100644
index 0000000..9b5aa70
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/help.html
@@ -0,0 +1,15 @@
+
+
+
+Description
+bla
+Parameters
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/new bx84 2.py b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/new bx84 2.py
new file mode 100644
index 0000000..e1adb8b
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new bx84 2/new bx84 2.py
@@ -0,0 +1,174 @@
+# Test name: new bx84 2
+# bla
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Example - Test name: " + test.getName())
+ test.log("Example - Device name: " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # If present, use the parameters here below for your test script.
+ # These parameters were automatically generated: you might need to change the casting.
+
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 2 plots: pass here the axis names:
+ scan = ManualScan(['sample'], ['Status (MSTA)', 'Position (VAL)'])
+ # set plot name(tab title):
+ scan.setPlotTitle(test.getPlotName())
+ # start plots. See further below how to add points to the plots (scan):
+ scan.start()
+
+ # inject a sinus into the plot, as example
+ from math import sin
+ motor_msta = 0
+ # take 100 samples of a sinus and a jigsaw plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = motor_msta + +1
+ if motor_msta > 50:
+ motor_msta = 0
+ # get value:
+ motor_val = sin(float(sample)/10.0)*10.0-10.0
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ pv_motor_msta = Channel(test.getDeviceName() + ':IST:2' , type='d')
+ pv_motor_val = Channel(test.getDeviceName() + ':IST:1' , type='d')
+ pv_motor_com = Channel(test.getDeviceName() + ':COM:2' , type='d')
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # send a command to a channel (it is translated to a caput): uncomment this line below to try it
+ #pv_motor_com.put(1.0, timeout=None) # optionally, a timeout can be given.
+ # take 100 samples of the channels and plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = pv_motor_msta.get()
+ # get value:
+ motor_val = pv_motor_val.get()
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ pv_motor_msta.close()
+ pv_motor_val.close()
+ pv_motor_com.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Test successful, here some detail: ..."
+ success = True
+ test.sendFeedback(ret, success)
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/.config b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/.config
new file mode 100644
index 0000000..455814d
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 09:47:18 CET 2018
+name=new structure monitor
+parameters=par1&"1"&"param 1";par2&"p2"&"param 2";
+description=Buld new tests with new testing list structure
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/help.html b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/help.html
new file mode 100644
index 0000000..bf018dc
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/help.html
@@ -0,0 +1,17 @@
+
+
+
+Description
+Buld new tests with new testing list structure
+Parameters
+
+par1 | param 1 |
+par2 | param 2 |
+
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/new structure monitor.py b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/new structure monitor.py
new file mode 100644
index 0000000..4c160f1
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/New Structure Tests/new structure monitor/new structure monitor.py
@@ -0,0 +1,174 @@
+# Test name: new structure monitor
+# Buld new tests with new testing list structure
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Example - Test name: " + test.getName())
+ test.log("Example - Device name: " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # If present, use the parameters here below for your test script.
+ # These parameters were automatically generated: you might need to change the casting.
+ par1 = float(test.getParam('par1')) ; par2 = float(test.getParam('par2')) ;
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 2 plots: pass here the axis names:
+ scan = ManualScan(['sample'], ['Status (MSTA)', 'Position (VAL)'])
+ # set plot name(tab title):
+ scan.setPlotTitle(test.getPlotName())
+ # start plots. See further below how to add points to the plots (scan):
+ scan.start()
+
+ # inject a sinus into the plot, as example
+ from math import sin
+ motor_msta = 0
+ # take 100 samples of a sinus and a jigsaw plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = motor_msta + +1
+ if motor_msta > 50:
+ motor_msta = 0
+ # get value:
+ motor_val = sin(float(sample)/10.0)*10.0-10.0
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ pv_motor_msta = Channel(test.getDeviceName() + ':IST:2' , type='d')
+ pv_motor_val = Channel(test.getDeviceName() + ':IST:1' , type='d')
+ pv_motor_com = Channel(test.getDeviceName() + ':COM:2' , type='d')
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # send a command to a channel (it is translated to a caput): uncomment this line below to try it
+ #pv_motor_com.put(1.0, timeout=None) # optionally, a timeout can be given.
+ # take 100 samples of the channels and plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = pv_motor_msta.get()
+ # get value:
+ motor_val = pv_motor_val.get()
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ pv_motor_msta.close()
+ pv_motor_val.close()
+ pv_motor_com.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Test successful, here some detail: ..."
+ success = True
+ test.sendFeedback(ret, success)
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/.config b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/.config
new file mode 100644
index 0000000..30b4d87
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:50:42 CET 2018
+name=oldtest
+parameters=examplePar1\:2\:This is the parameter n.1 with unit [unit];examplePar2\:4.5\:This is the parameter n.2 with unit [unit];
+description=o
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/help.html b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/help.html
new file mode 100644
index 0000000..df78fc5
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/help.html
@@ -0,0 +1,17 @@
+
+
+
+Description
+o
+Parameters
+
+examplePar1 | This is the parameter n.1 with unit [unit] |
+examplePar2 | This is the parameter n.2 with unit [unit] |
+
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/oldtest.py b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/oldtest.py
new file mode 100644
index 0000000..65b047c
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest/oldtest.py
@@ -0,0 +1,174 @@
+# Test name: oldtest
+# o
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Example - Test name: " + test.getName())
+ test.log("Example - Device name: " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # If present, use the parameters here below for your test script.
+ # These parameters were automatically generated: you might need to change the casting.
+ examplePar1 = float(test.getParam('examplePar1')) ; examplePar2 = float(test.getParam('examplePar2')) ;
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 2 plots: pass here the axis names:
+ scan = ManualScan(['sample'], ['Status (MSTA)', 'Position (VAL)'])
+ # set plot name(tab title):
+ scan.setPlotTitle(test.getPlotName())
+ # start plots. See further below how to add points to the plots (scan):
+ scan.start()
+
+ # inject a sinus into the plot, as example
+ from math import sin
+ motor_msta = 0
+ # take 100 samples of a sinus and a jigsaw plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = motor_msta + +1
+ if motor_msta > 50:
+ motor_msta = 0
+ # get value:
+ motor_val = sin(float(sample)/10.0)*10.0-10.0
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ pv_motor_msta = Channel(test.getDeviceName() + ':IST:2' , type='d')
+ pv_motor_val = Channel(test.getDeviceName() + ':IST:1' , type='d')
+ pv_motor_com = Channel(test.getDeviceName() + ':COM:2' , type='d')
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # send a command to a channel (it is translated to a caput): uncomment this line below to try it
+ #pv_motor_com.put(1.0, timeout=None) # optionally, a timeout can be given.
+ # take 100 samples of the channels and plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = pv_motor_msta.get()
+ # get value:
+ motor_val = pv_motor_val.get()
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ pv_motor_msta.close()
+ pv_motor_val.close()
+ pv_motor_com.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Test successful, here some detail: ..."
+ success = True
+ test.sendFeedback(ret, success)
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/.config b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/.config
new file mode 100644
index 0000000..fc7a908
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/.config
@@ -0,0 +1,4 @@
+#Tue Mar 20 13:50:48 CET 2018
+name=oldtest2
+parameters=examplePar1\:2\:This is the parameter n.1 with unit [unit];examplePar2\:4.5\:This is the parameter n.2 with unit [unit];
+description=o
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/help.html b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/help.html
new file mode 100644
index 0000000..df78fc5
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/help.html
@@ -0,0 +1,17 @@
+
+
+
+Description
+o
+Parameters
+
+examplePar1 | This is the parameter n.1 with unit [unit] |
+examplePar2 | This is the parameter n.2 with unit [unit] |
+
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/oldtest2.py b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/oldtest2.py
new file mode 100644
index 0000000..00c0784
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/Olt struct tests/oldtest2/oldtest2.py
@@ -0,0 +1,174 @@
+# Test name: oldtest2
+# o
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Example - Test name: " + test.getName())
+ test.log("Example - Device name: " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # If present, use the parameters here below for your test script.
+ # These parameters were automatically generated: you might need to change the casting.
+ examplePar1 = float(test.getParam('examplePar1')) ; examplePar2 = float(test.getParam('examplePar2')) ;
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 2 plots: pass here the axis names:
+ scan = ManualScan(['sample'], ['Status (MSTA)', 'Position (VAL)'])
+ # set plot name(tab title):
+ scan.setPlotTitle(test.getPlotName())
+ # start plots. See further below how to add points to the plots (scan):
+ scan.start()
+
+ # inject a sinus into the plot, as example
+ from math import sin
+ motor_msta = 0
+ # take 100 samples of a sinus and a jigsaw plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = motor_msta + +1
+ if motor_msta > 50:
+ motor_msta = 0
+ # get value:
+ motor_val = sin(float(sample)/10.0)*10.0-10.0
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ pv_motor_msta = Channel(test.getDeviceName() + ':IST:2' , type='d')
+ pv_motor_val = Channel(test.getDeviceName() + ':IST:1' , type='d')
+ pv_motor_com = Channel(test.getDeviceName() + ':COM:2' , type='d')
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # send a command to a channel (it is translated to a caput): uncomment this line below to try it
+ #pv_motor_com.put(1.0, timeout=None) # optionally, a timeout can be given.
+ # take 100 samples of the channels and plot them:
+ for sample in range(0, 100):
+ readback1 = sample #the x axis.
+ sleep(0.1) # settling time.
+ # get value (it is translated to a caget):
+ motor_msta = pv_motor_msta.get()
+ # get value:
+ motor_val = pv_motor_val.get()
+ # add values to plot:
+ scan.append([readback1], [readback1], [motor_msta, motor_val])
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ pv_motor_msta.close()
+ pv_motor_val.close()
+ pv_motor_com.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Test successful, here some detail: ..."
+ success = True
+ test.sendFeedback(ret, success)
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/.config b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/.config
new file mode 100644
index 0000000..390438b
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/.config
@@ -0,0 +1,4 @@
+#Mon Oct 16 14:28:18 CEST 2017
+name=Betriebsmode
+description=Verify that the different RPS Modes give correct Outputs on the RPS modules
+parameters=mode&"2,IQCOM,$BMA1,1,DIA"&"vla";rpsCh14&"J102003:REG:R:3"&"rps channel 1-4";rpsCh58&"J102003:REG:R:34"&"rps channel 5-8";expectedVal14&"0x0000"&"[hex] Expected value for channels 1-4";expectedVal58&"0x0000"&"[hex] Expected value for channels 5-8";setGetDelay&"1"&"[s] delay between set and get";
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/Betriebsmode.py b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/Betriebsmode.py
new file mode 100644
index 0000000..c950c51
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/Betriebsmode.py
@@ -0,0 +1,171 @@
+# Test name: Betriebsmode (old caRPSTest test #1)
+# betriebsmode
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Test " + test.getName() + " for " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # fetch paramenters
+ rpsChName14 = (test.getParam('rpsCh14'))
+ rpsChName58 = (test.getParam('rpsCh58'))
+ expectedVal14 = (test.getParam('expectedVal14'))
+ expectedVal58 = (test.getParam('expectedVal58'))
+ mode = (test.getParam('mode'))
+ setGetDelay = float(test.getParam('setGetDelay')) ;
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ rpsMask14 = 0x4440 # mask for outputs 2-4
+ rpsMask58 = 0x0004 # mask for output 5
+ ilk = Interlock()
+ ilk.setInterlockMode(mode)
+ sleep(setGetDelay)
+ ilk.masterReset()
+ sleep(setGetDelay)
+ modeRead = ilk.getInterlockMode();
+ if not modeRead:
+ ret = 'No mode received'
+ success = False
+ test.sendFeedback(ret, success)
+ return
+ try:
+ modePresent = modeRead.index(mode)
+ except:
+ modePresent = -1
+ ret = 'Could not set mode ' + mode
+ success = False
+ test.sendFeedback(ret, success)
+ return
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ # outputs 1-4
+ rpsCh14 = Channel(rpsChName14, type='d')
+ # outputs 5-8
+ rpsCh58 = Channel(rpsChName58, type='d')
+
+ rpsVal14 = rpsCh14.get()
+ rpsVal58 = rpsCh58.get()
+
+ success = True
+ if ((rpsVal14 & rpsMask14) == expectedVal14):
+ ret = 'Interlocks outputs (1-4) of ' + rpsChName14 + ': ' + rpsVal14 + ' as expected'
+ else:
+ ret = 'Interlocks outputs (1-4) of ' + rpsChName14 + ': ' + rpsVal14 + ' was expected: ' + expectedVal14
+ success = False
+
+ if ((rpsVal58 & rpsMask58) == expectedVal58):
+ ret = ret + '\nInterlocks outputs (5-8) of ' + rpsChName58 + ': ' + rpsVal58 + ' as expected'
+ else:
+ ret = ret + '\nInterlocks outputs (5-8) of ' + rpsChName58 + ': ' + rpsVal58 + ' was expected: ' + expectedVal58
+ success = False
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to connect to channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ rpsCh14.close()
+ rpsCh58.close()
+
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/help.html b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/help.html
new file mode 100644
index 0000000..adb0ce7
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Betriebsmode/Betriebsmode/help.html
@@ -0,0 +1,19 @@
+
+
+
+Description
+Verify that the different RPS Modes give correct Outputs on the RPS modules (Test n. 1 in old caRPS_Tests)
+Parameters
+
+mode | [string] Betriebs mode |
+expectedVal14 | [hex] Expected value for channels 1-4 |
+expectedVal58 | [hex] Expected value for channels 5-8 |
+setGetDelay | [ms] delay between set and get |
+
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/.config b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/.config
new file mode 100644
index 0000000..8460d43
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/.config
@@ -0,0 +1,4 @@
+#Fri Oct 20 13:31:23 CEST 2017
+name=Diagnostic
+parameters=setGetDelay&"1"&"[s] delay between set and get";
+description=Test interlocks of diagnostic modules by generating a pulse
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/Diagnostic.py b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/Diagnostic.py
new file mode 100644
index 0000000..8abf082
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/Diagnostic.py
@@ -0,0 +1,143 @@
+# Test name: Diagnostic
+# Test interlocks of diagnostic modules by generating a pulse
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Example - Test name: " + test.getName())
+ test.log("Example - Device name: " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ # If present, use the parameters here below for your test script.
+ # These parameters were automatically generated: you might need to change the casting.
+ setGetDelay = float(test.getParam('setGetDelay'))
+ rpsAttribute = test.getParam('rpsAttribute')
+ rpsModule = test.getParam('rpsModule')
+ expectedValue2 = test.getParam('expectedValue2')
+ expectedValue1 = test.getParam('expectedValue1')
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ #rpsCh = Channel(test.getDeviceName() + ':' + rpsAttribute , type='d')
+ test.log('doing nothing here...')
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # send a command to a channel (it is translated to a caput): uncomment this line below to try it
+ #pv_motor_com.put(1.0, timeout=None) # optionally, a timeout can be given.
+ # take 100 samples of the channels and plot them:
+ # get value (it is translated to a caget):
+ # motor_msta = pv_motor_msta.get()
+
+ # Closing channels: all channels that were opened with Channel() must be closed before exit:
+ #rpsCh.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Success, nothing was done :-)"
+ success = True
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/help.html b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/help.html
new file mode 100644
index 0000000..c2f029f
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Diagnostic/Diagnostic/help.html
@@ -0,0 +1,19 @@
+
+
+
+Description
+Test interlocks of diagnostic modules by generating a pulse (Test n. 5 in old caRPS_Tests)
+Parameters
+
+setGetDelay | [s] delay between set and get |
+rpsAttribute | RPS EPICS attribute |
+rpsModule | RPS module EPICS channel name |
+expectedValue2 | [hex] expected value 2 |
+expectedValue1 | [hex] expected value 1 |
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/.config b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/.config
new file mode 100644
index 0000000..cb621ab
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/.config
@@ -0,0 +1,4 @@
+#Wed Oct 18 14:59:58 CEST 2017
+name=RPSlimits
+parameters=
+description=Verify that for different modes, the RPS behaves correctly when scanning the current settings of the Ablenkungsmagnet
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/RPSlimits.py b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/RPSlimits.py
new file mode 100644
index 0000000..317e2cb
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/RPSlimits.py
@@ -0,0 +1,191 @@
+# Test name: Interlocklimits
+# Interlock Limits for Ablenksmagnet
+# Copyright (c) 2015 Paul Scherrer Institute. All rights reserved.
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ """
+ Main method running the test
+ """
+ # by default, assume the test failed:
+ ret = 'Test failed'
+ status = False
+ # put the whole custom code under try/catch.
+ try:
+ # get the path of this script:
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+################ END OF Init #####################
+######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section # WRITE YOUR CODE HERE BELOW # is just an example and can be modified/deleted.
+ It must be indented to the same level as this comment.
+ -----------------------------------
+ GETTING INPUTS:
+ -----------------------------------
+ If needed, the following methods are available:
+
+ test.getPath() string, path of this test file
+ test.getName() string, name of this test
+ test.getDeviceName() string, device for which the test must run (typically it is the beginning of a process variable name)
+ test.getPlotName() string, name to be given to the plot when using setPlotTitle(). Example: scan.setPlotTitle(test.getPlotName())
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ -----------------------------------
+ if you need to get parameters for the test, use:
+
+ myParamValue = test.getParam('myParamName')
+
+ the calls to getParam are added to the code automatically, one per parameter, when creating the new test.
+ NOTE: Casting may be necessary.
+ See the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ -----------------------------------
+ When the test has ended (error or success), this method must be called in order to return to pshell:
+
+ test.sendFeedback(ret,success)
+
+ ret string, a text summarizing the result of the test.
+ success bool, True = test successful. False = test failed.
+ -----------------------------------
+ LOG INFO:
+ -----------------------------------
+ when some information must be shown on the log on pshell, use the following line:
+ test.log('text to log')
+ """
+
+ ########## Example (can be removed) ######
+
+ # print the list of parameters passed. If any error, stop and send feedback.
+ test.log("Test " + test.getName() + " for " + test.getDeviceName() )
+ try:
+ test.log("Running test with the following parameters:")
+ test.printParams()
+ ret = 'Success, nothing was done :-)'
+ success = True
+ test.sendFeedback(ret, success)
+ return
+ # fetch parameters
+ mode = (test.getParam('mode'))
+ ilkInExpectedValS = (test.getParam('ilkInExpectedValS'))
+ magnetChName = (test.getParam('magnetCh'))
+ ilkInChName = (test.getParam('ilkInCh'))
+ ilkInExpectedValIni = (test.getParam('ilkInExpectedValIni'))
+ ilkOutExpectedValL = (test.getParam('ilkOutExpectedValL'))
+ magnetEndVal = int(test.getParam('magnetEndVal'))
+ ilkOutChName = (test.getParam('ilkOutCh'))
+ ilkOutExpectedValIni = (test.getParam('ilkOutExpectedValIni'))
+ ilkOutExpectedValS = (test.getParam('ilkOutExpectedValS'))
+ magnetInitVal = int(test.getParam('magnetInitVal'))
+ setGetDelay = float(test.getParam('setGetDelay'))
+ except:
+ import traceback
+ # test failed, write the report into the variables ret and success and send feedback:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ rpsMask14 = 0x4440 # mask for outputs 2-4
+ rpsMask58 = 0x0004 # mask for output 5
+ ilk = Interlock()
+ ilk.setInterlockMode(mode)
+ sleep(setGetDelay)
+ ilk.masterReset()
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 3 plots:
+ scan = ManualScan(['units'], ['Magnet', 'Interlock-In', 'Interlock-Out'])
+ # set plot name(tab title):
+ scan.setPlotTitle(test.getPlotName())
+ # start plots. See further below how to add points to the plots (scan):
+ scan.start()
+ # now try with data from real device: this part will most probably fail: correct the PV names with existing ones.
+ try:
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long).
+ #magnetCh = Channel(magnetChName , type='d')
+ #ilkInCh = Channel(ilkInChName , type='d')
+ #ilkOutCh = Channel(ilkOutChName , type='d')
+ print magnetChName
+ except:
+ import traceback
+ # prepare return information: return text:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success:
+ success = False
+ # send return information:
+ test.sendFeedback(ret, success)
+ return
+ # check RPS status
+ #ilkInVal = ilkInCh.get()
+ #ilkOutVal = ilkOutCh.get()
+ ilkInVal = ilkInExpectedValIni #delete!!
+ ilkOutVal = ilkOutExpectedValIni #delete!!
+ if (ilkInVal == ilkInExpectedValIni):
+ test.log(ilkInChName + ' ok')
+ else:
+ ret = ilkInChName + ' wrong - expected: ' + ilkInExpectedValIni + ' got: ' + ilkInVal
+ success = False
+ return
+ if ((ilkOutVal & 0x000C) == ilkOutExpectedValIni):
+ test.log(ilkOutChName + ' ok')
+ else:
+ ret = ilkOutChName + ' wrong - expected: ' + ilkOutExpectedValIni + ' got: ' + (ilkOutVal & 0x000C)
+ success = False
+ return
+
+ # start scan of magnet
+ # inject a sinus into the plot, as example
+ from math import sin
+ for sample in range(magnetInitVal, magnetEndVal, 10):
+ readback1 = sample #the x axis.
+ sleep(0.01) # settling time.
+ # get value (it is translated to a caget):
+ magnetVal = sample
+ # get value:
+ ilkInVal = sin(float(sample)/10.0)*10.0-10.0
+ ilkOutVal = ilkInVal*0.5+10
+ # add values to plot:
+ scan.append([readback1], [readback1], [magnetVal, ilkInVal, ilkOutVal])
+
+ #magnetCh.close()
+ #ilkInCh.close()
+ #ilkOutCh.close()
+
+ ret = "Success, because..."
+ success = True
+ ################ End of Example ##########
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten.
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler.
+ import traceback
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler.
+ import traceback
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test.
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# Indent to end left
+# def yourCustomFunction:
diff --git a/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/help.html b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/help.html
new file mode 100644
index 0000000..7a07635
--- /dev/null
+++ b/script/tests/new-structure-tests-devices/tests/RPS Tests Interlocklilmits/RPSlimits/help.html
@@ -0,0 +1,26 @@
+
+
+
+Description
+Interlock Limits for Ablenksmagnet (Test n. 2 in old caRPS_Tests)
+Parameters
+
+ilkInExpectedValS | [hex] Interlock Input expected value for small values of magnet |
+magnetCh | Magnet epics channel |
+ilkInCh | Interlock Input epics channel |
+ilkInExpectedValIni | [hex] Interlock Input expected initial value |
+ilkOutExpectedValL | [hex] Interlock Output expected value for large values of magnet |
+magnetEndVal | [int] magnet final value for scan sequence |
+ilkOutCh | Interlock Output epics channel |
+ilkOutExpectedValIni | [hex] Interlock Output expected initial value |
+ilkOutExpectedValS | [hex] Interlock Output expected value for small values of magnet |
+magnetInitVal | [int] magnet initial value for scan sequence |
+setGetDelay | [s] delay between set and get |
+
+
+Contact
+Marco Boccioli
+Tel. 3078
+
+
+
diff --git a/script/tests/tests.properties b/script/tests/tests.properties
index fff372e..9a05b9a 100644
--- a/script/tests/tests.properties
+++ b/script/tests/tests.properties
@@ -1,5 +1,5 @@
#TestingList for pshell: configuration properties
-#Tue Mar 20 14:04:44 CET 2018
+#Tue Mar 20 14:07:19 CET 2018
customPanel=
showEnabledTestsOnly=
listFilter=rps-test
diff --git a/script/tests/tests/Collimator Tests pro/Calibrate/.config b/script/tests/tests/Collimator Tests pro/Calibrate/.config
new file mode 100644
index 0000000..5e59d3d
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Calibrate/.config
@@ -0,0 +1,12 @@
+name=Calibrate
+description=Calibrates the device
+filename=Calibrate.xml
+help = \
+This test sends a command to the low level firmware which controls the collimators \n\
+requesting that it calibrates itself. \n\n\
+Calibration involves moving to the R1 and R2 reference positions and measuring the \n\
+number of steps required to do so. At the end of the sequence the default collimator \n\
+will be selected. \n\n\
+During the course of the expected calibration period (45-70 seconds) the test \n\
+procedure will plot the values of all critical system variables. \n\n\
+For further information please consult Valery Ovinnikov.
\
diff --git a/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.py b/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.py
new file mode 100644
index 0000000..344762f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.py
@@ -0,0 +1,139 @@
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+ samplePeriod = 0.1
+
+######### WRITE YOUR CODE HERE BELOW #############
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Logical Position (IST:2)',
+ 'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+
+ #Pre-actions: 1 = calibrate
+ caput(DEVICE+':COM:2', 1)
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ countDeviceInModeIdle = 0
+ for setpoint1 in range(0, 10000):
+ sleep( samplePeriod ) # Settling time
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ MotorPositionRaw = idMotorPositionRaw.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosFromBeam = idPotiPosFromBeam.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ scan.append([setpoint1], [setpoint1],
+ [MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
+ MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ if (int(MotorStatus) & int('1',2))==0: #device finished calibration (bit#1)
+ #give the device some time before stating that it has really finished
+ countDeviceInModeIdle = countDeviceInModeIdle +1
+ if countDeviceInModeIdle == 10:
+ break
+ else:
+ countDeviceInModeIdle = 0
+
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ #Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idMotorPositionRaw.close()
+ idMotorPosition.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ scan.end()
+
+ ret = 'Calibration done'
+ success = True
+ scan.end()
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.xml b/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.xml
new file mode 100644
index 0000000..7e5028f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Calibrate/Calibrate.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Drive Out/.config b/script/tests/tests/Collimator Tests pro/Drive Out/.config
new file mode 100644
index 0000000..3589d0d
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Drive Out/.config
@@ -0,0 +1,3 @@
+name=Drive Out
+description=Drives the Collimator to the Out Position
+filename=Drive Out.xml
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out - Copy.py b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out - Copy.py
new file mode 100644
index 0000000..704a950
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out - Copy.py
@@ -0,0 +1,82 @@
+#Script imported from: Drive Out.xml
+import traceback
+
+#by default, failed
+ret = 'Test failed'
+success = False
+
+try:
+ #Pre-actions: 2 = drive out
+ caput(DEVICE+':COM:2', 2)
+ #Creating channels: dimension 1
+ #PseudoPositioner id000000
+ #ScalarDetector id000001
+ id000001 = Channel(DEVICE+':STA:1', type = 'd')
+ #ScalarDetector id000003
+ id000003 = Channel(DEVICE+':IST:2', type = 'd')
+ #ScalarDetector id000004
+ id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
+ #ScalarDetector id000005
+ id000005 = Channel(DEVICE+':IST1:1', type = 'd')
+ #ScalarDetector id000006
+ id000006 = Channel(DEVICE+':IST1:2', type = 'd')
+ #ScalarDetector id000007
+ id000007 = Channel(DEVICE+':IST2:1', type = 'd')
+ #ScalarDetector id000008
+ id000008 = Channel(DEVICE+':IST2:2', type = 'd')
+ #ScalarDetector id000009
+ id000009 = Channel(DEVICE+':IST3:1', type = 'd')
+ #ScalarDetector id000010
+ id000010 = Channel(DEVICE+':IST3:2', type = 'd')
+except:
+ print "Unexpected error:", sys.exc_info()[0]
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ raise Exception('Unable to create channel - ' + traceback.format_exc())
+ sys.exit()
+
+#TODO: Set the diplay names of positioners and detectors
+scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [3000.0], [3000])
+scan.start()
+
+#Dimension 1
+#PseudoPositioner id000000
+for setpoint1 in range(0, 3000):
+ readback1 = setpoint1
+ sleep( 0.1 ) # Settling time
+ #Detector id000001
+ detector1 = id000001.get()
+ #Detector id000003
+ detector2 = id000003.get()
+ #Detector id000004
+ detector3 = id000004.get()
+ #Detector id000005
+ detector4 = id000005.get()
+ #Detector id000006
+ detector5 = id000006.get()
+ #Detector id000007
+ detector6 = id000007.get()
+ #Detector id000008
+ detector7 = id000008.get()
+ #Detector id000009
+ detector8 = id000009.get()
+ #Detector id000010
+ detector9 = id000010.get()
+ scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
+
+#Closing channels
+id000001.close()
+id000003.close()
+id000004.close()
+id000005.close()
+id000006.close()
+id000007.close()
+id000008.close()
+id000009.close()
+id000010.close()
+
+scan.end()
+
+#return ok
+ret = 'Slides moved out'
+success = True
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.py b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.py
new file mode 100644
index 0000000..53b0594
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.py
@@ -0,0 +1,144 @@
+# Drive Out
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+ samplePeriod = 0.1
+
+######### WRITE YOUR CODE HERE BELOW #############
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
+ 'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+
+ #Pre-actions: 2 = drive out
+ caput(DEVICE+':COM:2', 2)
+ sleep( samplePeriod ) # Settling time
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ for setpoint1 in range(0, 10000):
+ sleep( samplePeriod ) # Settling time
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ MotorPositionRaw = idMotorPositionRaw.get()
+ Com = idCom.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosFromBeam = idPotiPosFromBeam.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+
+ scan.append([setpoint2], [setpoint2],
+ [MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
+ MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
+ #give the device some time before stating that it has really finished
+ countDeviceInModeIdle = countDeviceInModeIdle +1
+ if countDeviceInModeIdle == 10:
+ break
+ else:
+ countDeviceInModeIdle = 0
+
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ #Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idMotorPositionRaw.close()
+ idCom.close()
+ idMotorPosition.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ scan.end()
+
+ ret = 'Drive Out done'
+ success = True
+ scan.end()
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.xml b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.xml
new file mode 100644
index 0000000..5a1c925
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Drive Out/Drive Out.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Monitor Movement/.config b/script/tests/tests/Collimator Tests pro/Monitor Movement/.config
new file mode 100644
index 0000000..916f437
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Monitor Movement/.config
@@ -0,0 +1,4 @@
+#Fri Jun 09 14&14&06 CEST 2017
+name=Monitor Movement
+description=Monitor the movements during the specified time interval. No commands are sent.
+parameters=monitorTime&20&How long the monitoring is performed [s];samplingDelay&0.1&Delay between each sample is taken [s];
diff --git a/script/tests/tests/Collimator Tests pro/Monitor Movement/Monitor Movement.py b/script/tests/tests/Collimator Tests pro/Monitor Movement/Monitor Movement.py
new file mode 100644
index 0000000..5a4b63f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Monitor Movement/Monitor Movement.py
@@ -0,0 +1,98 @@
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+def startTest(testName, DEVICE, params):
+ #by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ #put the whole custom code under try/catch
+ try:
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+ #get parameters from the calling interface
+ try:
+ #test.log( "with the following parameters:\n" + str(params))
+ #test.log( 'testpath: ' + testPath )
+ #test.log( 'parameters:' + str( params) )
+ #test.log( 'device: ' + DEVICE )
+ monitorTime = float(test.getParam("monitorTime"))
+ samplePeriod = 0.05 #seconds
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ #get parameters from the calling interface
+ scan = ManualScan(['time [s]'],
+ ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)', 'Motor Pos - Poti Pos'] )
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ #Creating channels: dimension 1
+ try:
+ idCom = Channel(DEVICE+':COM:2' , type = 'd') #current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE+':IST3:2', type = 'd') #current position as from motor step counter [mm]
+ #idPotiPosFromBeam = Channel(DEVICE+':IST1:2', type = 'd') #current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE+':IST2:1', type = 'd') #current position as from potentiometer [mm]
+ #idPotiRef1Position = Channel(DEVICE+':REF1:1', type = 'd') #R1 position as from potentiometer [mm]
+ #idPotiRef2Position = Channel(DEVICE+':REF2:1', type = 'd') #R2 position as from potentiometer [mm]
+
+ except:
+ test.sendFeedback( 'Unable to create channel - ' + traceback.format_exc(), False)
+ return
+
+ r1 = tscan((idMotorPosition, idPotiPosition), int(monitorTime/0.02), 0.02)
+
+
+ test.log( 'Monitoring movement for ' + str(monitorTime) + 's')
+ #scan quickly the output during some seconds
+ timeElapsed=0
+ startTime=float(java.lang.System.currentTimeMillis())
+ currentTime = float(java.lang.System.currentTimeMillis())
+ timeElapsed=currentTime-startTime
+ while timeElapsed<(monitorTime*1000):
+ #Detector time
+ currentTime = float(java.lang.System.currentTimeMillis())
+ timeElapsed=currentTime-startTime
+ motorPosition = idMotorPosition.get()
+ #potiPosFromBeam = idPotiPosFromBeam.get()
+ potiPosition = idPotiPosition.get()
+ #potiRef1Position = idPotiRef1Position.get()
+ #potiRef2Position = idPotiRef2Position.get()
+ diff1 = motorPosition-potiPosition
+ scan.append ([timeElapsed/1000], [timeElapsed/1000], [motorPosition, potiPosition, diff1])
+ sleep( samplePeriod ) # Settling time
+ #timeElapsed=timeElapsed+1
+
+ #Closing channels
+ idCom.close()
+ idMotorPosition.close()
+ #idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ #idPotiRef1Position.close()
+ #idPotiRef2Position.close()
+ ret = 'End of Monitoring'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ #just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ #generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+#launch the test
+startTest(test, device, parameters)
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Monitor Movement/help.html b/script/tests/tests/Collimator Tests pro/Monitor Movement/help.html
new file mode 100644
index 0000000..7d4e3ca
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Monitor Movement/help.html
@@ -0,0 +1,12 @@
+
+
+Description
+Monitor the movements during the specified time interval. No commands are sent.
+Parameters
+monitorTime Monitoring time interval [s]
+samplingDelay Delay between each sample is taken [s]
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 1/.config b/script/tests/tests/Collimator Tests pro/Motor Test 1/.config
new file mode 100644
index 0000000..82f7ba0
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 1/.config
@@ -0,0 +1,7 @@
+name=Motor Test 1
+description=Moves to CW switch then CCW switch N times.
+
+
+#optional parameters. Description is compulsory. Syntax&
+#parameters=&&[;&&]
+parameters=repeatTimes&1&Repeat N times;delayS&5&Pause delay [s]
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1 - Copy.py b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1 - Copy.py
new file mode 100644
index 0000000..f14d7ef
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1 - Copy.py
@@ -0,0 +1,154 @@
+#Script Motor Test 1
+#Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
+
+import traceback
+
+#by default, failed
+ret = 'Test failed'
+status = False
+DEVICE = device
+params = parameters
+#DEVICE = 'PO2DV-NCS-LS'
+#get parameters from the calling interface
+try:
+ print "Running test Motor Test 1 with the following parameters:"
+ print params
+ loopTimes = int(params["repeatTimes"]["value"])
+ delaySeconds = int(params["delayS"]["value"])
+except:
+ print "Could not retrieve testing parameters: ", sys.exc_info()[0]
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ raise Exception('Could not retrieve testing parameters - ' + traceback.format_exc())
+
+#TODO: Set the diplay names of positioners and detectors
+#scan = ManualScan(['idX', 'idInkr'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idPotiProc', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [-0.5, 0.0], [4.0, 3000.0], [3000, 20])
+scan = ManualScan(['idX'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idPotiProc', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [ 0.0], [ 3000.0], [20])
+scan.start()
+#Creating channels: dimension 1
+try:
+ #RegionPositioner idInkr
+ #idInkr = Channel(DEVICE+':INKR:2', type = 'd')
+ idInkr = Channel(DEVICE+':MOTOR.VAL', type = 'd')
+ #ScalarDetector idMotorStatus
+ #idMotorStatus = Channel(DEVICE+':STA:1', type = 'd')
+ idMotorStatus = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
+ #ScalarDetector idLogicalPosition
+ #idLogicalPosition = Channel(DEVICE+':IST:2', type = 'd')
+ idLogicalPosition = Channel(DEVICE+':MOTOR.RVAL', type = 'd')
+ #ScalarDetector idDiameter
+ #idDiameter = Channel(DEVICE+':DIAM:2', type = 'd')
+ idDiameter = Channel(DEVICE+':ENCODERoff', type = 'd')
+ #ScalarDetector idMotorPosition
+ #idMotorPosition = Channel(DEVICE+':IST1:2', type = 'd')
+ idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
+ #ScalarDetector idPotiRaw
+ #idPotiRaw = Channel(DEVICE+':POSA:1', type = 'd')
+ idPotiRaw = Channel(DEVICE+':ENCODERraw', type = 'd')
+ #ScalarDetector idPotiProc
+ #idPotiProc = Channel(DEVICE+':POSA:2', type = 'd')
+ idPotiProc = Channel(DEVICE+':ENCODER', type = 'd')
+ #ScalarDetector idBtvsRaw
+ #idBtvsRaw = Channel(DEVICE+':IST3:1', type = 'd')
+ idBtvsRaw = Channel(DEVICE+':MOTOR.LLS', type = 'd')
+ #ScalarDetector idBtvsProc
+ #idBtvsProc = Channel(DEVICE+':IST3:2', type = 'd')
+ idBtvsProc = Channel(DEVICE+':MOTOR.HLS', type = 'd')
+ #ScalarDetector idEndSwitchL
+ #idBtvsRaw = Channel(DEVICE+':IST3:1', type = 'd')
+ idEndSwitchL = Channel(DEVICE+':MOTOR.LLS', type = 'd')
+ #ScalarDetector idEndSwitchH
+ #idBtvsProc = Channel(DEVICE+':IST3:2', type = 'd')
+ idEndSwitchH = Channel(DEVICE+':MOTOR.HLS', type = 'd')
+ #high position limit
+ idLimitH = Channel(DEVICE+':MOTOR.HLM', type = 'd')
+ #low position limit
+ idLimitL = Channel(DEVICE+':MOTOR.LLM', type = 'd')
+except:
+ print "Unexpected error:", sys.exc_info()[0]
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ raise Exception('Unable to create channel - ' + traceback.format_exc())
+ sys.exit()
+
+#remove limits
+idLimitH.put(999999.9, timeout=None)
+idLimitL.put(-999999.9, timeout=None)
+#Dimension 1
+direction = 1.0;
+startDefault = -100.0
+endDefault = 1000.0
+end = endDefault
+#find position at Low end switch: it will be the starting point of the test
+print 'Homing'
+idInkr.put(-100.0, timeout=None) # TODO: Set appropriate timeout
+start = startDefault #idInkr.get()+direction
+setpoint2 = end
+count = 0
+print 'Starting test sequence'
+for setpoint1 in range(0, loopTimes*2):
+ sleep( delaySeconds ) # Settling time
+ #RegionPositioner idInkr
+ idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
+ readback2 = idInkr.get()
+ #if abs(readback2 - setpoint2) > 1 : # TODO: Check accuracy
+ # ret = 'Actor idInkr could not be set to the value ' + str(setpoint2) + ' (current value: ' + str(readback2) + ')'
+ # success = False
+ # raise Exception(ret)
+ #Detector idMotorStatus
+ detector1 = idMotorStatus.get()
+ #Detector idLogicalPosition
+ detector2 = idLogicalPosition.get()
+ #Detector idDiameter
+ detector3 = idDiameter.get()
+ #Detector idMotorPosition
+ detector4 = idMotorPosition.get()
+ #Detector idPotiRaw
+ detector5 = idPotiRaw.get()
+ #Detector idPotiProc
+ detector6 = idPotiProc.get()
+ #Detector idBtvsRaw
+ detector7 = idBtvsRaw.get()
+ #Detector idBtvsProc
+ detector8 = idBtvsProc.get()
+ #end switches
+ endH = idEndSwitchH.get()
+ endL = idEndSwitchL.get()
+ #Manipulation idDiff02
+ #Variable Mappings
+ a = detector4
+ b = detector8
+ idDiff02 = a-b
+ #Manipulation idDiff01
+ #Variable Mappings
+ a = detector4
+ b = detector6
+ count = count + 1
+ idDiff01 = a-b
+ if endH>0.0 :
+ #invert direction and swap start with end of translation
+ setpoint2 = start
+ print 'End H switch, changing target to ' + str(setpoint2)
+ scan.append ([setpoint2], [readback2], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, idDiff02, idDiff01])
+ if endL>0.0 :
+ #invert direction and swap start with end of translation
+ setpoint2 = end
+ print 'End L switch, changing target to ' + str(setpoint2)
+ scan.append ([setpoint2], [readback2], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, idDiff02, idDiff01])
+
+#set limits back
+idLimitH.put(145.0, timeout=None)
+idLimitL.put(0.0, timeout=None)
+#Closing channels
+idInkr.close()
+idMotorStatus.close()
+idLogicalPosition.close()
+idDiameter.close()
+idMotorPosition.close()
+idPotiRaw.close()
+idPotiProc.close()
+idBtvsRaw.close()
+idBtvsProc.close()
+scan.end()
+ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+status = True
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py
new file mode 100644
index 0000000..e449c36
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py
@@ -0,0 +1,187 @@
+# Script Motor Test 1
+# Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
+
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+
+ # DEVICE = 'PO2DV-NCS-LS'
+ # get parameters from the calling interface
+ try:
+ test.log("Running test with the following parameters:")
+ test.log(params)
+ loopTimes = int(test.getParam("repeatTimes"))
+ delaySeconds = int(test.getParam("delayS"))
+ samplePeriod = 0.05 #seconds
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], [
+ 'Btvs Poti Position (IST3:2)',
+ 'Mcs Poti Position (IST2:1)',
+ 'Motor Status (STA:1)',
+ 'Inkr (INKR:2)',
+ 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)',
+ 'Logical Position (IST:2)',
+ 'Btvs Raw (IST3:1)',
+ 'Motor Position (IST1:2)',
+ 'Poti Raw (POSA:1)',
+ 'Poti Ref1 Position (REF1:1)',
+ 'Poti Ref2 Position (REF2:1)'])
+
+ p1 = plot(None, name = "Motor Position - Btvs Poti Position", context = plotName + " pos difference")[0]
+ scan.setPlotTitle(plotName)
+ scan.start()
+ # Creating channels: dimension 1
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
+ idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ end = 4.0 #go to R2
+ start = 3.0 #go to R1
+ setpoint2 = end
+ count = 0
+ test.log('Starting test sequence')
+ for setpoint1 in range(0, (loopTimes * 2)):
+ p1.addSeries(LinePlotSeries("Run"+str(count)))
+ sleep(delaySeconds) # Settling time between runs
+ # RegionPositioner idInkr
+ idCom.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
+ count = count + 1
+ # scan for changes
+ for scanTimes in range(0, 100000):
+ sleep(samplePeriod)
+ currentTime = float(java.lang.System.currentTimeMillis())
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ BtvsRaw = idBtvsRaw.get()
+ Btvs = idBtvs.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ idDiff01 = MotorPosition - Btvs
+
+ scan.append([currentTime], [currentTime],
+ [Btvs, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
+ BtvsRaw, MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ p1.getSeries(count).appendData(currentTime, idDiff01)
+
+ #extract Status bits
+ endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
+ endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
+
+ #check if arrived to R1 or R2
+ if endH:
+ # invert direction and swap start with end of translation
+ setpoint2 = start
+ test.log('Reached R2 switch, changing target to R1')
+ break
+ elif endL:
+ # invert direction and swap start with end of translation
+ setpoint2 = end
+ test.log('Reached R1 switch, changing target to R2')
+ break
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ # Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idBtvsRaw.close()
+ idBtvs.close()
+ idMotorPosition.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idCom.close()
+ idInkr.close()
+ idInkrRb.close()
+
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py.bak b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py.bak
new file mode 100644
index 0000000..0d66c9a
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 1/Motor Test 1.py.bak
@@ -0,0 +1,178 @@
+# Script Motor Test 1
+# Moves to CCW switch; then for M times moves N times to CW switch then CCW switch; between each M pauses for delay; log at CCW and CW
+
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+
+ # DEVICE = 'PO2DV-NCS-LS'
+ # get parameters from the calling interface
+ try:
+ test.log("Running test with the following parameters:")
+ test.log(params)
+ loopTimes = int(test.getParam("repeatTimes"))
+ delaySeconds = int(test.getParam("delayS"))
+ samplePeriod = 0.05 #seconds
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Btvs (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Logical Position (IST:2)',
+ 'Btvs Raw (IST3:1)','Motor Position (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ p1 = plot(None, name = "Poti Pos From Beam - Motor Position", context = plotName + " pos difference")[0]
+ scan.setPlotTitle(plotName)
+ scan.start()
+ # Creating channels: dimension 1
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
+ idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ end = 4.0 #go to R2
+ start = 3.0 #go to R1
+ setpoint2 = end
+ count = 0
+ test.log('Starting test sequence')
+ for setpoint1 in range(0, (loopTimes * 2)):
+ p1.addSeries(LinePlotSeries("Run"+str(count)))
+ sleep(delaySeconds) # Settling time between runs
+ # RegionPositioner idInkr
+ idCom.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
+ count = count + 1
+ # scan for changes
+ for scanTimes in range(0, 100000):
+ sleep(samplePeriod)
+ currentTime = float(java.lang.System.currentTimeMillis())
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ BtvsRaw = idBtvsRaw.get()
+ Btvs = idBtvs.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ idDiff01 = PotiPosition - Btvs
+
+ scan.append([currentTime], [currentTime],
+ [Btvs , PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
+ BtvsRaw , MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ p1.getSeries(count).appendData(currentTime, idDiff01)
+
+ #extract Status bits
+ endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
+ endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
+
+ #check if arrived to R1 or R2
+ if endH:
+ # invert direction and swap start with end of translation
+ setpoint2 = start
+ test.log('Reached R2 switch, changing target to R1')
+ break
+ elif endL:
+ # invert direction and swap start with end of translation
+ setpoint2 = end
+ test.log('Reached R1 switch, changing target to R2')
+ break
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ # Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idBtvsRaw .close()
+ idBtvs.close()
+ idMotorPosition.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idCom.close()
+ idInkr.close()
+ idInkrRb.close()
+
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 1/help.html b/script/tests/tests/Collimator Tests pro/Motor Test 1/help.html
new file mode 100644
index 0000000..87b5e83
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 1/help.html
@@ -0,0 +1,14 @@
+
+
+Short Description
+Moves to CW switch then CCW switch N times.
+Details
+Moves to CW switch then CCW switch N times.
+Parameters
+repeatTimes Repeat the moving N times
+delayS Pause delay between each repetition [s]
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 2/.config b/script/tests/tests/Collimator Tests pro/Motor Test 2/.config
new file mode 100644
index 0000000..01f6773
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 2/.config
@@ -0,0 +1,7 @@
+name=Motor Test 2
+description=Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+
+
+#optional parameters. Description is compulsory. Syntax&
+#parameters=&&[;&&]
+parameters=repeatTimes&1&Repeat N times;midPoint&41.0&Middle point A [mm];spanFromMidPoint&2.0&B steps around middle point A [integer];translationStep&5.0&Step lenght [mm]
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py b/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py
new file mode 100644
index 0000000..5cb7aa4
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py
@@ -0,0 +1,206 @@
+# Script Motor Test 2 for production system
+# Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+
+ # get parameters from the calling interface
+ try:
+ test.log("Running test with the following parameters:")
+ test.log(params)
+ middle = float(test.getParam("midPoint"))
+ loopTimes = int(test.getParam("repeatTimes"))
+ span = float(test.getParam("spanFromMidPoint"))
+ translationStep = float(test.getParam("translationStep")) # each translation will be this amount of mm
+ settlingTime = 0.2 # seconds
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ scan = ManualScan(['time [1/'+ str(1/settlingTime) + ' s]'], ['Btvs Poti Position (IST3:2)', 'Mcs Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Logical Position (IST:2)',
+ 'Btvs Raw (IST3:1)','Motor Position (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+ # coloured plot (one colour per scan)
+ p1 = plot(None, name="Motor Position - Btvs Poti Position", context=plotName + " difference")[0]
+
+ # Creating channels: dimension 1
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+
+ # find position: it will be the middle point of the test
+ test.log('Moving to initial position R1')
+ idCom.put(2, timeout=None) # go to R1 start limit
+ test.log('Moving to middle point ' + str(middle))
+ idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
+ if abs(readback2 - middle) > 5: # TODO: Check accuracy
+ ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(readback2) + ')'
+ success = False
+ test.sendFeedback(ret, success)
+ return
+ direction = 1.0
+ count = 0
+ test.log('Moving around middle point (+-' + str(span) + ')')
+ for setpoint1 in range(0, (loopTimes * 2)):
+ count = count + 1
+ sleep(5) # Settling time
+ p1.addSeries(LinePlotSeries("Run" + str(count)))
+ # RegionPositioner idInkr
+ for setpoint2 in range(0, span+1):
+ idInkr.put(translationStep*direction, timeout=None)
+ sleep(settlingTime) # Settling time
+ currentTime = float(java.lang.System.currentTimeMillis())
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ BtvsRaw = idBtvsRaw.get()
+ Btvs = idBtvs.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ idDiff01 = MotorPosition - Btvs
+
+ # plots
+ scan.append([currentTime], [currentTime],
+ [Btvs, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
+ BtvsRaw, MotorPosition, PotiRaw, PotiRef1Position, PotiRef2Position])
+ # plot error against position
+ p1.getSeries(count).appendData(MotorPosition, idDiff01)
+
+ # end of loop: invert direction
+ if setpoint2 == span:
+ direction = direction*(-1.0)
+ break
+
+ # check if reached end of span before the end of loop; if so, invert direction
+ if (direction > 0.0 and MotorPosition >= middle+span):
+ # invert direction and swap start with end of translation
+ direction = -1.0
+ test.log('End of span (' + str(MotorPosition) + '), changing direction to towards R1')
+ break
+ if (direction < 0.0 and MotorPosition <= middle-span):
+ # invert direction and swap start with end of translation
+ direction = 1.0
+ test.log('End of span (' + str(MotorPosition) + '), changing direction to towards R2')
+ break
+
+ # extract Status bits
+ endH = bool(int(MotorStatus) & 8) # Ref2 (high limit)
+ endL = bool(int(MotorStatus) & 4) # Ref1 (low limit)
+ # check if arrived to R1 or R2; if so, invert direction
+ if endH:
+ # invert direction and swap start with end of translation
+ direction = -1.0
+ test.log('Reached R2, changing direction to ' + str(direction))
+ break
+ elif endL:
+ # invert direction and swap start with end of translation
+ direction = 1.0
+ test.log('Reached R1, changing direction to ' + str(direction))
+ break
+
+ # check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): # error: abort test
+ test.sendFeedback('Motor switched off (bit# 4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): # error: abort test
+ test.sendFeedback('No motor link (bit# 5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): # error: abort test
+ test.sendFeedback('No poti link (bit# 6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): # error: abort test
+ test.sendFeedback('Calibration error (bit# 7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): # error: abort test
+ test.sendFeedback('Cannot get to R1 (bit# 8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): # error: abort test
+ test.sendFeedback('Cannot get to R2 (bit# 9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): # error: abort test
+ test.sendFeedback('Position measurement mismatch (bit# 10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): # error: abort test
+ test.sendFeedback('Movement timeout (bit# 11)', False)
+ return
+
+ # Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idBtvsRaw.close()
+ idBtvs.close()
+ idMotorPosition.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ idCom.close()
+
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py.bak b/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py.bak
new file mode 100644
index 0000000..0ef89b0
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 2/Motor Test 2.py.bak
@@ -0,0 +1,209 @@
+# Script Motor Test 2 for production system
+# Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+
+ # get parameters from the calling interface
+ try:
+ test.log("Running test with the following parameters:")
+ test.log(params)
+ middle = float(test.getParam("midPoint"))
+ loopTimes = int(test.getParam("repeatTimes"))
+ span = float(test.getParam("spanFromMidPoint"))
+ settlingTime = 0.2 #seconds
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ scan = ManualScan(['time [1/'+ str(1/settlingTime) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Logical Position (IST:2)',
+ 'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+ # coloured plot (one colour per scan)
+ p1 = plot(None, name="Poti-Increment difference", context=plotName + " difference")[0]
+ p2 = plot(None, name="Poti-MotorPosition difference", context=plotName + " difference")[0]
+
+ # Creating channels: dimension 1
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ direction = 1.0
+ startDefault = middle - span
+ endDefault = middle + span
+ end = endDefault + 1
+ # find position: it will be the middle point of the test
+ test.log('Moving to middle point ' + str(middle))
+ idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
+ readback2 = idInkr.get()
+ if abs(readback2 - middle) > 5: # TODO: Check accuracy
+ ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(
+ readback2) + ')'
+ success = False
+ test.sendFeedback(ret, success)
+ return
+ start = readback2 + direction
+ countSteps = 0
+ count = 0
+ test.log('Moving around middle point (+-' + str(span) + ')')
+ for setpoint1 in range(0, (loopTimes * 2)):
+ count = count + 1
+ sleep(5) # Settling time
+ p1.addSeries(LinePlotSeries("Run" + str(count)))
+ # RegionPositioner idInkr
+ for setpoint2 in frange(start, end, direction):
+ readback1 = setpoint1
+ idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
+ sleep(settlingTime) # Settling time
+ readback2 = idInkr.get()
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ MotorPositionRaw = idMotorPositionRaw.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosFromBeam = idPotiPosFromBeam.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ idDiff01 = PotiPosition - MotorPosition
+ countSteps = countSteps + 1
+ scan.append([setpoint2], [setpoint2],
+ [MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, LogicalPosition,
+ MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
+ p1.getSeries(count).appendData(setpoint2, idDiff01)
+ if (direction > 0.0 and setpoint2 >= end - 1):
+ # invert direction and swap start with end of translation
+ end = startDefault - 1
+ start = setpoint2 - direction
+ direction = -1.0
+ test.log('End of span (' + str(setpoint2) + '), changing direction to ' + str(direction))
+ break
+ if (direction < 0.0 and setpoint2 <= end + 1):
+ # invert direction and swap start with end of translation
+ end = endDefault + 1
+ start = setpoint2 - direction
+ direction = 1.0
+ test.log('End of span (' + str(setpoint2) + '), changing direction to ' + str(direction))
+ break
+
+
+ #extract Status bits
+ endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
+ endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
+
+ #check if arrived to R1 or R2; if so, invert direction
+ if endH:
+ # invert direction and swap start with end of translation
+ end = startDefault - 1
+ start = setpoint2 - direction
+ direction = -1.0
+ test.log('Reached R2 switch, changing direction to ' + str(direction))
+ break
+ elif endL:
+ # invert direction and swap start with end of translation
+ end = endDefault + 1
+ start = setpoint2 - direction
+ direction = 1.0
+ test.log('Reached R1 switch, changing direction to ' + str(direction))
+ break
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ # Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idMotorPositionRaw.close()
+ idMotorPosition.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 2/help.html b/script/tests/tests/Collimator Tests pro/Motor Test 2/help.html
new file mode 100644
index 0000000..1fa73d6
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 2/help.html
@@ -0,0 +1,16 @@
+
+
+Short Description
+Oscillate around a specified position
+Details
+Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+Parameters
+repeatTimes Repeat N times
+midPoint Position A [mm]
+spanFromMidPoint The B steps [integer]
+translationStep Length of the movement per each traslation step [mm]
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 3/.config b/script/tests/tests/Collimator Tests pro/Motor Test 3/.config
new file mode 100644
index 0000000..79d889a
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 3/.config
@@ -0,0 +1,7 @@
+name=Motor Test 3
+description=Moves from CCW to CW as a series of discrete translations (C times) logs after each translation. When end switch is encountered change direction. Repeat N times
+
+
+#optional parameters. Description is compulsory. Syntax&
+#parameters=&&[;&&]
+parameters=repeatTimes&1&Repeat N times;translation&2&Translation C steps
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 3/Motor Test 3.py b/script/tests/tests/Collimator Tests pro/Motor Test 3/Motor Test 3.py
new file mode 100644
index 0000000..1a8d2b1
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 3/Motor Test 3.py
@@ -0,0 +1,212 @@
+#Script Motor Test 3
+#Moves from CCW to CW as a series of discrete translations (C times) logs after each translation. When end switch is encountered change direction. Repeat N times
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+def startTest(testName, DEVICE, params):
+ #by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ #put the whole custom code under try/catch
+ try:
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+######### WRITE YOUR CODE HERE BELOW #############
+ #get parameters from the calling interface
+ try:
+ test.log("Running test Motor Test 3 with the following parameters:")
+ test.log(params)
+ loopTimes = int(test.getParam("repeatTimes")) # C times
+ translation = int(test.getParam("translation")) # Increment mm
+ samplePeriod = 0.2 #seconds
+ except:
+ test.log("Could not retrieve testing parameters: ", sys.exc_info()[0])
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], [
+ 'Btvs Poti Position (IST3:2)',
+ 'Mcs Poti Position (IST2:1)',
+ 'Motor Status (STA:1)',
+ 'Inkr (INKR:2)',
+ 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)',
+ 'Logical Position (IST:2)',
+ 'Btvs Raw (IST3:1)',
+ 'Motor Position (IST1:2)',
+ 'Poti Raw (POSA:1)',
+ 'Poti Ref1 Position (REF1:1)',
+ 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+ p1 = plot(None, name = "Motor Position - Btvs Poti Position", context = plotName + " Motor-Poti difference")[0]
+ # Creating channels
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idBtvsRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idBtvs = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # motor commands [0=Stop; 1=Calibrate; 2=gotoR1; 3=gotoR2]
+
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+
+ #go to position at Low end switch: it will be the starting point of the test
+ test.log('Homing')
+ idCom.put(2, timeout=10) # go to R1
+ # wait for motor to get to Ref1
+ for setpoint1 in range(0, 100):
+ sleep( 2 ) # Settling time
+ MotorStatus = idMotorStatus.get()
+ if bool(int(MotorStatus) & 4): # arrived at Ref1 (low limit)
+ break
+ if not bool(int(MotorStatus) & 4): # not arrived at Ref1 (low limit)
+ ret = 'Could not reach Ref1'
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ direction = 1
+ countSteps = 0
+ test.log('Starting testing sequence')
+ count = 0
+ for setpoint1 in range(0, (loopTimes*2)):
+ count = count + 1
+ sleep( 2 ) # Settling time
+ # add multi cuve plot
+ p1.addSeries(LinePlotSeries("Run"+str(count)))
+
+ for setpoint2 in frange(0, 1000000):
+
+ idInkr.put(translation*direction, timeout=10)
+ sleep(samplePeriod) # Settling time
+ currentTime = float(java.lang.System.currentTimeMillis())
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ BtvsRaw = idBtvsRaw.get()
+ Btvs = idBtvs.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+ idDiff01 = MotorPosition-Btvs
+ countSteps = countSteps + (translation*direction)
+
+ # multi plot
+ scan.append([currentTime], [currentTime],[
+ Btvs,
+ PotiPosition,
+ MotorStatus,
+ Inkr,
+ InkrRb,
+ Diameter,
+ LogicalPosition,
+ BtvsRaw,
+ MotorPosition,
+ PotiRaw,
+ PotiRef1Position,
+ PotiRef2Position])
+ # draw diff against steps
+ p1.getSeries(count).appendData(countSteps, idDiff01)
+
+ #extract Status bits
+ endH = bool(int(MotorStatus) & 8) #Ref2 (high limit)
+ endL = bool(int(MotorStatus) & 4) #Ref1 (low limit)
+
+ #check if arrived to R1 or R2
+ if endH:
+ #invert direction and swap start with end of translation
+ direction = -1
+ test.log('Reached R2 switch, changing target to R1')
+ break
+ elif endL:
+ #invert direction and swap start with end of translation
+ direction = 1
+ test.log('Reached R1 switch, changing target to R2')
+ break
+
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ #Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idBtvsRaw.close()
+ idBtvs.close()
+ idMotorPosition.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ idCom.close()
+
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ #just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ #generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+#launch the test
+startTest(test, device, parameters)
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Motor Test 3/help.html b/script/tests/tests/Collimator Tests pro/Motor Test 3/help.html
new file mode 100644
index 0000000..6fef1db
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Motor Test 3/help.html
@@ -0,0 +1,13 @@
+
+
+Description
+Moves from CCW to CW as a series of discrete translations (C steps) logs after each translation. When end switch is encountered change direction. Repeat N times
+Parameters
+repeatTimes How many N times the test is repeated
+translation How many C steps are done for one translation
+
+Contact
+boccioli_m
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 1/.config b/script/tests/tests/Collimator Tests pro/Move Ref 1/.config
new file mode 100644
index 0000000..895fbd5
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 1/.config
@@ -0,0 +1,3 @@
+name=Move Ref 1
+description=Moves to the Reference 1 Position
+filename=Move Ref 1.xml
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1 - Copy.py b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1 - Copy.py
new file mode 100644
index 0000000..ebcd9cb
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1 - Copy.py
@@ -0,0 +1,90 @@
+
+###### DO NOT MODIFY THE CODE BELOW ######
+def startTest(testName, DEVICE, params):
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #by default, failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+###### WRITE YOUR CODE HERE BELOW #######
+ #get parameters from the calling interface
+ print_log(testName, DEVICE, 'testpath: ' + testPath )
+ print_log(testName, DEVICE, 'parameters:' + str( params) )
+ print_log(testName, DEVICE, 'device: ' + DEVICE )
+ scan = ManualScan(['time'], ['idMotorStep', 'idPotiPosition', 'idPotiRef1Position','idMotorStep-idPotiPosition'] , [0.0], [30.0], [20])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ #Creating channels: dimension 1
+ try:
+ idCom = Channel(DEVICE+':COM:2', type = 'd') #current position as from motor step counter [mm]
+ idMotorStep = Channel(DEVICE+':IST3:2', type = 'd') #current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE+':IST1:2', type = 'd') #current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE+':IST2:1', type = 'd') #current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE+':REF1:1', type = 'd') #R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE+':REF2:1', type = 'd') #R2 position as from potentiometer [mm]
+
+ except:
+ sendFeedback(testPath, testName, DEVICE, 'Unable to create channel - ' + traceback.format_exc(), False)
+ #raise Exception('Unable to create channel - ' + traceback.format_exc())
+ return
+
+ idCom.put('3', timeout=None) # go to R1
+ print_log(testName, DEVICE, 'Moving to reference point')
+ #scan quickly the output during some seconds
+ detector4 = idPotiPosition.get()
+ detector6 = idPotiRef2Position.get()
+ timeElapsed=0
+ while detector4>detector6 and timeElapsed<600:
+ #Detector time
+ detector1 = float(java.lang.System.currentTimeMillis())
+
+ detector2 = idMotorStep.get()
+ detector3 = idPotiPosFromBeam.get()
+ detector4 = idPotiPosition.get()
+ detector5 = idPotiRef1Position.get()
+ detector6 = idPotiRef2Position.get()
+ diff1 = detector2-detector4
+ scan.append ([detector1], [detector1], [detector2, detector4, detector5, diff1])
+ sleep( 0.1 ) # Settling time
+ timeElapsed=timeElapsed+1
+
+ #Closing channels
+ idCom.close()
+ idMotorStep.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ print_log(testName, DEVICE, ' Reference point reached')
+
+########## END OF YOUR CODE ###########
+
+###### DO NOT MODIFY THE CODE BELOW ######
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+
+#prepare and send feedback to calling tool
+def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
+ print_log(testName, DEVICE, 'End of test. Result:')
+ print_log(testName, DEVICE, 'Test path: ' + testPath)
+ print_log(testName, DEVICE, 'Test name: ' + testName )
+ print_log(testName, DEVICE, 'Device: ' + DEVICE)
+ print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
+ print_log(testName, DEVICE, 'Return string: ' + returnString)
+ ret = [testPath, DEVICE, returnString, testPassed]
+ set_return(ret)
+
+def print_log(testName, DEVICE, text):
+ time.ctime()
+ now = time.strftime('%Y.%m.%d %H:%M:%S')
+ print now + ' ' + DEVICE + ' - ' + testName + ': ' + text
+
+import sys, inspect, os, traceback
+#get test arguments
+DEVICE = device
+testName = test
+params = parameters
+#launch the test
+startTest(testName, DEVICE, params)
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.py b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.py
new file mode 100644
index 0000000..0a631ac
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.py
@@ -0,0 +1,144 @@
+
+# Drive to R1
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+ samplePeriod = 0.1
+
+######### WRITE YOUR CODE HERE BELOW #############
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
+ 'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+
+ idCom.put('3', timeout=None) # go to R1
+ sleep( samplePeriod ) # Settling time
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ #scan for a while to collect data
+ for setpoint1 in range(0, 10000):
+ sleep( samplePeriod ) # Settling time
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ MotorPositionRaw = idMotorPositionRaw.get()
+ Com = idCom.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosFromBeam = idPotiPosFromBeam.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+
+ scan.append([setpoint2], [setpoint2],
+ [MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
+ MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
+ #give the device some time before stating that it has really finished
+ countDeviceInModeIdle = countDeviceInModeIdle +1
+ if countDeviceInModeIdle == 10:
+ break
+ else:
+ countDeviceInModeIdle = 0
+
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ #Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idMotorPositionRaw.close()
+ idCom.close()
+ idMotorPosition.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ scan.end()
+
+ ret = 'Moved to R1'
+ success = True
+ scan.end()
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.xml b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.xml
new file mode 100644
index 0000000..5b81083
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 1/Move Ref 1.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 1/help.html b/script/tests/tests/Collimator Tests pro/Move Ref 1/help.html
new file mode 100644
index 0000000..627f6dd
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 1/help.html
@@ -0,0 +1,13 @@
+
+
+Short Description
+Go to reference position R1
+Details
+Go to reference position R1 (command '3').
+Parameters
+none
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 2/.config b/script/tests/tests/Collimator Tests pro/Move Ref 2/.config
new file mode 100644
index 0000000..0d83dba
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 2/.config
@@ -0,0 +1,3 @@
+name=Move Ref 2
+description=Moves to the Reference 2 Position
+filename=Move Ref 2.xml
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.py b/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.py
new file mode 100644
index 0000000..ea100da
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.py
@@ -0,0 +1,144 @@
+
+# Drive to R2
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+ samplePeriod = 0.1
+
+######### WRITE YOUR CODE HERE BELOW #############
+ scan = ManualScan(['time [1/'+ str(1/samplePeriod) + ' s]'], ['Motor Pos (IST3:2)', 'Poti Position (IST2:1)',
+ 'Motor Status (STA:1)', 'Inkr (INKR:2)', 'InkrRb (INKRRB:2)',
+ 'Diameter (DIAM:2)', 'Com (COM:2)', 'Logical Position (IST:2)',
+ 'Motor Pos Raw (IST3:1)','Poti Pos From Beam (IST1:2)',
+ 'Poti Raw (POSA:1)', 'Poti Ref1 Position (REF1:1)', 'Poti Ref2 Position (REF2:1)'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ try:
+ idMotorStatus = Channel(DEVICE + ':STA:1' , type = 'd') # DSP device_status reg
+ idLogicalPosition = Channel(DEVICE + ':IST:2' , type = 'd') # Shows current position in logical units as calculated from motor step counter [1..n]
+ idPotiRaw = Channel(DEVICE + ':POSA:1' , type = 'd') # poti raw data [ADC units]
+ idMotorPositionRaw = Channel(DEVICE + ':IST3:1' , type = 'd') # shows current position in steps as as obtained from motor step counter [steps]
+ idInkr = Channel(DEVICE + ':INKR:2' , type = 'd') # move relative distance (positive means towards R2) [mm]
+ idInkrRb = Channel(DEVICE + ':INKRRB:2' , type = 'd') # readback of move relative distance (positive means towards R2) [mm]
+ idDiameter = Channel(DEVICE + ':DIAM:2' , type = 'd') # collimator diameter [mm]
+ idCom = Channel(DEVICE + ':COM:2' , type = 'd') # current position as from motor step counter [mm]
+ idMotorPosition = Channel(DEVICE + ':IST3:2' , type = 'd') # current position as from motor step counter [mm]
+ idPotiPosFromBeam = Channel(DEVICE + ':IST1:2' , type = 'd') # current position from beam as from potentiometer [mm]
+ idPotiPosition = Channel(DEVICE + ':IST2:1' , type = 'd') # current position as from potentiometer [mm]
+ idPotiRef1Position = Channel(DEVICE + ':REF1:1' , type = 'd') # R1 position as from potentiometer [mm]
+ idPotiRef2Position = Channel(DEVICE + ':REF2:1' , type = 'd') # R2 position as from potentiometer [mm]
+
+ idCom.put('4', timeout=None) # go to R2
+ sleep( samplePeriod ) # Settling time
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback( ret, success)
+ return
+
+ #scan for a while to collect data
+ for setpoint1 in range(0, 10000):
+ sleep( samplePeriod ) # Settling time
+
+ MotorStatus = idMotorStatus.get()
+ LogicalPosition = idLogicalPosition.get()
+ PotiRaw = idPotiRaw.get()
+ MotorPositionRaw = idMotorPositionRaw.get()
+ Com = idCom.get()
+ MotorPosition = idMotorPosition.get()
+ PotiPosFromBeam = idPotiPosFromBeam.get()
+ PotiPosition = idPotiPosition.get()
+ PotiRef1Position = idPotiRef1Position.get()
+ PotiRef2Position = idPotiRef2Position.get()
+ Diameter = idDiameter.get()
+ Inkr = idInkr.get()
+ InkrRb = idInkrRb.get()
+
+
+ scan.append([setpoint2], [setpoint2],
+ [MotorPosition, PotiPosition, MotorStatus, Inkr, InkrRb, Diameter, Com, LogicalPosition,
+ MotorPositionRaw, PotiPosFromBeam, PotiRaw, PotiRef1Position, PotiRef2Position])
+
+ if (MotorStatus & int('1',2))==0: #device finished calibration (bit#1)
+ #give the device some time before stating that it has really finished
+ countDeviceInModeIdle = countDeviceInModeIdle +1
+ if countDeviceInModeIdle == 10:
+ break
+ else:
+ countDeviceInModeIdle = 0
+
+ #check if any error bit is raised
+ if bool(int(MotorStatus) & int('10000',2)): #error: abort test
+ test.sendFeedback('Motor switched off (bit#4)', False)
+ return
+ if bool(int(MotorStatus) & int('100000',2)): #error: abort test
+ test.sendFeedback('No motor link (bit#5)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000',2)): #error: abort test
+ test.sendFeedback('No poti link (bit#6)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000',2)): #error: abort test
+ test.sendFeedback('Calibration error (bit#7)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R1 (bit#8)', False)
+ return
+ if bool(int(MotorStatus) & int('1000000000',2)): #error: abort test
+ test.sendFeedback('Cannot get to R2 (bit#9)', False)
+ return
+ if bool(int(MotorStatus) & int('10000000000',2)): #error: abort test
+ test.sendFeedback('Position measurement mismatch (bit#10)', False)
+ return
+ if bool(int(MotorStatus) & int('100000000000',2)): #error: abort test
+ test.sendFeedback('Movement timeout (bit#11)', False)
+ return
+
+ #Closing channels
+ idMotorStatus.close()
+ idLogicalPosition.close()
+ idPotiRaw.close()
+ idMotorPositionRaw.close()
+ idCom.close()
+ idMotorPosition.close()
+ idPotiPosFromBeam.close()
+ idPotiPosition.close()
+ idPotiRef1Position.close()
+ idPotiRef2Position.close()
+ idDiameter.close()
+ idInkr.close()
+ idInkrRb.close()
+ scan.end()
+
+ ret = 'Moved to R2'
+ success = True
+ scan.end()
+
+################ END OF YOUR CODE ################
+###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+# launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.xml b/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.xml
new file mode 100644
index 0000000..2cf0a0a
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 2/Move Ref 2.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Move Ref 2/help.html b/script/tests/tests/Collimator Tests pro/Move Ref 2/help.html
new file mode 100644
index 0000000..91f86e9
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Move Ref 2/help.html
@@ -0,0 +1,13 @@
+
+
+Short Description
+Go to reference position R2
+Details
+Go to reference position R2 (command '4').
+Parameters
+none
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/Stop/.config b/script/tests/tests/Collimator Tests pro/Stop/.config
new file mode 100644
index 0000000..89d5a5f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Stop/.config
@@ -0,0 +1,3 @@
+name=Stop
+description=Sends the STOP command
+filename=Stop.xml
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests pro/Stop/Stop.xml b/script/tests/tests/Collimator Tests pro/Stop/Stop.xml
new file mode 100644
index 0000000..27228d3
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/Stop/Stop.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/monitorAllParams/.config b/script/tests/tests/Collimator Tests pro/monitorAllParams/.config
new file mode 100644
index 0000000..2f1d86a
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/monitorAllParams/.config
@@ -0,0 +1,4 @@
+#Fri Sep 11 13&31&33 CEST 2015
+name=monitorAllParams
+parameters=monitorTime&0.1&This is the parameter n.1 with unit [unit];samplingDelay&30&This is the parameter n.2 with unit [unit];
+description=d
diff --git a/script/tests/tests/Collimator Tests pro/monitorAllParams/help.html b/script/tests/tests/Collimator Tests pro/monitorAllParams/help.html
new file mode 100644
index 0000000..0d6eb66
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/monitorAllParams/help.html
@@ -0,0 +1,13 @@
+
+
+Description
+d
+Parameters
+monitorTime This is the parameter n.1 with unit [unit]
+samplingDelay This is the parameter n.2 with unit [unit]
+
+Contact
+boccioli_m
+
+
+
diff --git a/script/tests/tests/Collimator Tests pro/monitorAllParams/monitorAllParams.py b/script/tests/tests/Collimator Tests pro/monitorAllParams/monitorAllParams.py
new file mode 100644
index 0000000..529764f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/monitorAllParams/monitorAllParams.py
@@ -0,0 +1,145 @@
+# Test name: monitorAllParams
+# d
+
+###### Init - DO NOT MODIFY THE CODE BELOW ######
+global sys, inspect, os, traceback
+import sys, inspect, os, traceback
+
+
+def startTest(testName, DEVICE, params):
+ # by default, assume the test failed
+ ret = 'Test failed'
+ success = False
+ # plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+ # put the whole custom code under try/catch
+ try:
+ # get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ # init the testing tool class. It can be sued in the following ways:
+ test = TestingTool(testName, testPath, DEVICE, params)
+
+ ################ END OF Init #####################
+ ######### WRITE YOUR CODE HERE BELOW #############
+
+ """
+ All the code in this section ###..YOUR CODE..### can be modified/deleted.
+ It must be indented to the same level as this comment
+ -----------------------------------
+ GETTING INPUTS:
+ If needed, the following variables are available:
+ testPath string, path of this test file
+ testName string, name of this test
+ DEVICE string, device for which the test must run (typically it is the beginning of a process variable name)
+ -----------------------------------
+ GETTING TEST PARAMETERS:
+ if you need to get parameters for the test, use (casting may be necessary):
+ myParamValue = test.getParam('myParamName')
+ see the test config for the list of parameters specific to the test.
+ -----------------------------------
+ SETTING OUTPUTS:
+ ret string, a text summarizing the result of the test. It must be set before the end of your code.
+ success bool, True = test successful. It must be set before the end of your code.
+ test.sendFeedback(ret,success) method that ends the testing script and gives the report to the calling application.
+ Examples:
+
+ whenever the code must quit (i.e. after an error), you must end with:
+ ret = 'here is some info on what failed on the test'
+ success = false
+ test.sendFeedback(ret, success)
+
+ whenever the code is finished successfully, you must end with:
+ ret = 'here is some info on the success of the test'
+ success = true
+ test.sendFeedback(ret, success)
+ -----------------------------------
+ LOG INFO:
+ when some information must be shown on the log, use:
+ test.log('test to log')
+ """
+
+ ########## Example (can be removed) ######
+ # print the list of parameters passed. If any error, stop and send feedback
+ test.log("Example - Test name: " + testName)
+ test.log("Example - Device name: " + DEVICE)
+ try:
+ test.log("Running test Initialise with the following parameters:")
+ test.log(params)
+ # If present, use the parameters here below for your test script. You might need to change the casting
+ monitorTime = float(test.getParam('monitorTime')) ; samplingDelay = float(test.getParam('samplingDelay')) ;
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+ return
+
+ # loop to read channels for a while and plot the channels values.
+ # initialise plot tab with 2 plots
+ scan = ManualScan(['sample'], ['Motor Status (MSTA)', 'Motor Position (VAL)'])
+ # set plot name(tab title)
+ scan.setPlotTitle(plotName)
+ # start plots. See further below how to add points to the plots
+ scan.start()
+
+ # IMPORTANT: if the test failed, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Error, the test failed because...."
+ success = False
+ # set up connection to channels. "type" of data can be "d" (= double), "l" (= long)
+ try:
+ pv_motor_msta = Channel(DEVICE + ':MOTOR.MSTA', type='d')
+ pv_motor_val = Channel(DEVICE + ':MOTOR.VAL', type='d')
+ except:
+ # prepare return information: return text
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ # prepare return information: return success
+ success = False
+ # send return information
+ test.sendFeedback(ret, success)
+ return
+ # take 100 samples of the channels
+ for sample in range(0, 100):
+ readback1 = sample
+ sleep(0.1) # Settling time
+ # get value
+ motor_msta = pv_motor_msta.get()
+ # get value
+ motor_val = pv_motor_val.get()
+ # add values to plot
+ scan.append([sample], [readback1], [motor_msta, motor_val])
+
+ # Closing channels
+ pv_motor_msta.close()
+ pv_motor_val.close()
+
+ # IMPORTANT: if the test was successful, write the report into the variables ret and success.
+ # for example, write the following:
+ ret = "Example - Test successful, here some detail: ..."
+ success = True
+ test.sendFeedback(ret, success)
+ # once the test is finished, no need to do anything. The code below yours will do the rest.
+ ################ End of Example ##########
+
+ ################ END OF YOUR CODE ################
+ ###### Final - DO NOT MODIFY THE CODE BELOW ######
+
+ # just in case the feedback was forgotten
+ test.sendFeedback(ret, success)
+ except (KeyboardInterrupt):
+ # user stop error handler
+ ret = 'Test stopped by user.'
+ success = False
+ test.sendFeedback(ret, success)
+ except:
+ # generic error handler
+ ret = traceback.format_exc()
+ success = False
+ test.sendFeedback(ret, success)
+
+
+# launch the test
+startTest(test, device, parameters)
+
+################ END OF Final ####################
+#### IF NEEDED, ADD YOUR FUNCTIONS HERE BELOW ####
+# def yourCustomFunction:
diff --git a/script/tests/tests/Collimator Tests pro/what is on damir test tool.txt b/script/tests/tests/Collimator Tests pro/what is on damir test tool.txt
new file mode 100644
index 0000000..e69ec71
--- /dev/null
+++ b/script/tests/tests/Collimator Tests pro/what is on damir test tool.txt
@@ -0,0 +1,8 @@
+Test 1 plotted curves
+
+CCWsteps
+CCWpoti
+CWsteps
+CWpoti
+
+
diff --git a/script/tests/tests/Collimator Tests/Calibrate test vme/.config b/script/tests/tests/Collimator Tests/Calibrate test vme/.config
new file mode 100644
index 0000000..7ec0790
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Calibrate test vme/.config
@@ -0,0 +1,12 @@
+name=Calibrate test vme
+description=Calibrates the device
+filename=Calibrate.xml
+help = \
+This test sends a command to the low level firmware which controls the collimators \n\
+requesting that it calibrates itself. \n\n\
+Calibration involves moving to the R1 and R2 reference positions and measuring the \n\
+number of steps required to do so. At the end of the sequence the default collimator \n\
+will be selected. \n\n\
+During the course of the expected calibration period (45-70 seconds) the test \n\
+procedure will plot the values of all critical system variables. \n\n\
+For further information please consult Valery Ovinnikov.
\
diff --git a/script/tests/tests/Collimator Tests/Calibrate test vme/Calibrate test vme.py b/script/tests/tests/Collimator Tests/Calibrate test vme/Calibrate test vme.py
new file mode 100644
index 0000000..d47c358
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Calibrate test vme/Calibrate test vme.py
@@ -0,0 +1,136 @@
+#Script imported from: Calibrate.xml
+
+###### DO NOT MODIFY THE CODE BELOW ######
+import sys, inspect, os, traceback, time
+global print_log, sendFeedback
+def startTest(testName, DEVICE, params):
+ try:
+ import traceback
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #by default, failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+####### WRITE YOUR CODE HERE BELOW #######
+
+ #Pre-actions
+ try:
+ caput(DEVICE+':INIT.PROC', '1')
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+ #TODO: Set the diplay names of positioners and detectors
+ scan = ManualScan(['id000000'], ['id000001', 'id000002', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010', 'idResult'] , [0.0], [1000.0], [1000])
+ scan.start()
+
+ #Creating channels: dimension 1
+ #PseudoPositioner id000000
+ #ScalarDetector id000001
+ id000001 = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
+ #ScalarDetector id000002
+ id000002 = Channel(DEVICE+':MOTOR.RVAL', type = 'd')
+ #ScalarDetector id000003
+ id000003 = Channel(DEVICE+':MOTOR.VAL', type = 'd')
+ #ScalarDetector id000004
+ id000004 = Channel(DEVICE+':MOTOR.ATHM', type = 'd')
+ #ScalarDetector id000005
+ id000005 = Channel(DEVICE+':MOTOR.LLS', type = 'd')
+ #ScalarDetector id000006
+ id000006 = Channel(DEVICE+':MOTOR.HLS', type = 'd')
+ #ScalarDetector id000007
+ id000007 = Channel(DEVICE+':ENCODERraw', type = 'd')
+ #ScalarDetector id000008
+ id000008 = Channel(DEVICE+':ENCODER', type = 'd')
+ #ScalarDetector id000009
+ id000009 = Channel(DEVICE+':RDY', type = 'd')
+ #ScalarDetector id000010
+ id000010 = Channel(DEVICE+':ILK', type = 'd')
+
+ #Dimension 1
+ #PseudoPositioner id000000
+ for setpoint1 in range(0, 1000):
+ readback1 = setpoint1
+ sleep( 0.05 ) # Settling time
+ #Detector id000001
+ detector1 = id000001.get()
+ #Detector id000002
+ detector2 = id000002.get()
+ #Detector id000003
+ detector3 = id000003.get()
+ #Detector id000004
+ detector4 = id000004.get()
+ #Detector id000005
+ detector5 = id000005.get()
+ #Detector id000006
+ detector6 = id000006.get()
+ #Detector id000007
+ detector7 = id000007.get()
+ #Detector id000008
+ detector8 = id000008.get()
+ #Detector id000009
+ detector9 = id000009.get()
+ #Detector id000010
+ detector10 = id000010.get()
+ #Manipulation idResult
+ #Variable Mappings
+ ready = detector9
+ interlock = detector10
+ count = setpoint1
+ if count < 800:
+ idResult = (0, "Note: the "+DEVICE+" calibration procedure did not complete.")
+ if ready == 1 and interlock == 1:
+ #print "The "+DEVICE+" drive was successfully initialised. The RDY and ILK signals indicate the drive is ready."
+ ret = 'Drive successfully initialised'
+ success = True
+ else:
+ #print "The RS calibration procedure failed. The RDY and ILK signals indicate the drive was NOT ready at the expected time (after 40s)."
+ ret = 'The RDY and ILK signals indicate the drive was NOT ready at the expected time (after 40s).'
+ success = False
+ scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9, detector10, idResult])
+
+ #Closing channels
+ id000001.close()
+ id000002.close()
+ id000003.close()
+ id000004.close()
+ id000005.close()
+ id000006.close()
+ id000007.close()
+ id000008.close()
+ id000009.close()
+ id000010.close()
+
+ scan.end()
+############# END OF YOUR CODE ###########
+###### DO NOT MODIFY THE CODE BELOW ######
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ except:
+ ret = traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+#prepare and send feedback to calling tool
+def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
+ print_log(testName, DEVICE, 'End of test. Result:')
+ print_log(testName, DEVICE, 'Test path: ' + testPath)
+ print_log(testName, DEVICE, 'Test name: ' + testName)
+ print_log(testName, DEVICE, 'Device: ' + DEVICE)
+ print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
+ print_log(testName, DEVICE, 'Return string: ' + returnString)
+ ret = [testPath, DEVICE, returnString, testPassed]
+ set_return(ret)
+
+def print_log(testName, DEVICE, text):
+ time.ctime()
+ now = time.strftime('%Y.%m.%d %H:%M:%S')
+ print now + ' ' + DEVICE + ' - ' + testName + ': ' + text
+
+#launch the test
+startTest(test, device, parameters)
+
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests/Calibrate/.config b/script/tests/tests/Collimator Tests/Calibrate/.config
new file mode 100644
index 0000000..5e59d3d
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Calibrate/.config
@@ -0,0 +1,12 @@
+name=Calibrate
+description=Calibrates the device
+filename=Calibrate.xml
+help = \
+This test sends a command to the low level firmware which controls the collimators \n\
+requesting that it calibrates itself. \n\n\
+Calibration involves moving to the R1 and R2 reference positions and measuring the \n\
+number of steps required to do so. At the end of the sequence the default collimator \n\
+will be selected. \n\n\
+During the course of the expected calibration period (45-70 seconds) the test \n\
+procedure will plot the values of all critical system variables. \n\n\
+For further information please consult Valery Ovinnikov.
\
diff --git a/script/tests/tests/Collimator Tests/Calibrate/Calibrate.py b/script/tests/tests/Collimator Tests/Calibrate/Calibrate.py
new file mode 100644
index 0000000..8bb4faa
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Calibrate/Calibrate.py
@@ -0,0 +1,79 @@
+#Script imported from: Calibrate.xml
+
+ret = 'Calibration failed'
+success = False
+
+try:
+ #Pre-actions: 1 = calibrate
+ caput(DEVICE+':COM:2', 1)
+ #Creating channels: dimension 1
+ #PseudoPositioner id000000
+ #ScalarDetector id000001
+ id000001 = Channel(DEVICE+':STA:1', type = 'd')
+ #ScalarDetector id000003
+ id000003 = Channel(DEVICE+':IST:2', type = 'd')
+ #ScalarDetector id000004
+ id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
+ #ScalarDetector id000005
+ id000005 = Channel(DEVICE+':IST1:1', type = 'd')
+ #ScalarDetector id000006
+ id000006 = Channel(DEVICE+':IST1:2', type = 'd')
+ #ScalarDetector id000007
+ id000007 = Channel(DEVICE+':IST2:1', type = 'd')
+ #ScalarDetector id000008
+ id000008 = Channel(DEVICE+':IST2:2', type = 'd')
+ #ScalarDetector id000009
+ id000009 = Channel(DEVICE+':IST3:1', type = 'd')
+ #ScalarDetector id000010
+ id000010 = Channel(DEVICE+':IST3:2', type = 'd')
+except:
+ print "Unexpected error:", sys.exc_info()[0]
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ raise Exception('Unable to create channel - ' + traceback.format_exc())
+ sys.exit()
+
+#TODO: Set the diplay names of positioners and detectors
+scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [900.0], [900])
+scan.start()
+
+#Dimension 1
+#PseudoPositioner id000000
+for setpoint1 in range(0, 900):
+ readback1 = setpoint1
+ sleep( 0.1 ) # Settling time
+ #Detector id000001
+ detector1 = id000001.get()
+ #Detector id000003
+ detector2 = id000003.get()
+ #Detector id000004
+ detector3 = id000004.get()
+ #Detector id000005
+ detector4 = id000005.get()
+ #Detector id000006
+ detector5 = id000006.get()
+ #Detector id000007
+ detector6 = id000007.get()
+ #Detector id000008
+ detector7 = id000008.get()
+ #Detector id000009
+ detector8 = id000009.get()
+ #Detector id000010
+ detector9 = id000010.get()
+ scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
+
+#Closing channels
+id000001.close()
+id000003.close()
+id000004.close()
+id000005.close()
+id000006.close()
+id000007.close()
+id000008.close()
+id000009.close()
+id000010.close()
+
+scan.end()
+
+ret = 'Calibration done'
+success = True
diff --git a/script/tests/tests/Collimator Tests/Calibrate/Calibrate.xml b/script/tests/tests/Collimator Tests/Calibrate/Calibrate.xml
new file mode 100644
index 0000000..7e5028f
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Calibrate/Calibrate.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 900
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests/Check Status/.config b/script/tests/tests/Collimator Tests/Check Status/.config
new file mode 100644
index 0000000..15def22
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Check Status/.config
@@ -0,0 +1,5 @@
+name=Check Status
+description=Monitors the success of the device
+filename=Check Status.xml
+help= \
+This test plots the success of all relevant drive signals for a period of 15 seconds.
diff --git a/script/tests/tests/Collimator Tests/Check Status/Check Status.xml b/script/tests/tests/Collimator Tests/Check Status/Check Status.xml
new file mode 100644
index 0000000..b9371fe
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Check Status/Check Status.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests/Drive Out/.config b/script/tests/tests/Collimator Tests/Drive Out/.config
new file mode 100644
index 0000000..3589d0d
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Drive Out/.config
@@ -0,0 +1,3 @@
+name=Drive Out
+description=Drives the Collimator to the Out Position
+filename=Drive Out.xml
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests/Drive Out/Drive Out.py b/script/tests/tests/Collimator Tests/Drive Out/Drive Out.py
new file mode 100644
index 0000000..704a950
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Drive Out/Drive Out.py
@@ -0,0 +1,82 @@
+#Script imported from: Drive Out.xml
+import traceback
+
+#by default, failed
+ret = 'Test failed'
+success = False
+
+try:
+ #Pre-actions: 2 = drive out
+ caput(DEVICE+':COM:2', 2)
+ #Creating channels: dimension 1
+ #PseudoPositioner id000000
+ #ScalarDetector id000001
+ id000001 = Channel(DEVICE+':STA:1', type = 'd')
+ #ScalarDetector id000003
+ id000003 = Channel(DEVICE+':IST:2', type = 'd')
+ #ScalarDetector id000004
+ id000004 = Channel(DEVICE+':DIAM:2', type = 'd')
+ #ScalarDetector id000005
+ id000005 = Channel(DEVICE+':IST1:1', type = 'd')
+ #ScalarDetector id000006
+ id000006 = Channel(DEVICE+':IST1:2', type = 'd')
+ #ScalarDetector id000007
+ id000007 = Channel(DEVICE+':IST2:1', type = 'd')
+ #ScalarDetector id000008
+ id000008 = Channel(DEVICE+':IST2:2', type = 'd')
+ #ScalarDetector id000009
+ id000009 = Channel(DEVICE+':IST3:1', type = 'd')
+ #ScalarDetector id000010
+ id000010 = Channel(DEVICE+':IST3:2', type = 'd')
+except:
+ print "Unexpected error:", sys.exc_info()[0]
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ raise Exception('Unable to create channel - ' + traceback.format_exc())
+ sys.exit()
+
+#TODO: Set the diplay names of positioners and detectors
+scan = ManualScan(['id000000'], ['id000001', 'id000003', 'id000004', 'id000005', 'id000006', 'id000007', 'id000008', 'id000009', 'id000010'] , [0.0], [3000.0], [3000])
+scan.start()
+
+#Dimension 1
+#PseudoPositioner id000000
+for setpoint1 in range(0, 3000):
+ readback1 = setpoint1
+ sleep( 0.1 ) # Settling time
+ #Detector id000001
+ detector1 = id000001.get()
+ #Detector id000003
+ detector2 = id000003.get()
+ #Detector id000004
+ detector3 = id000004.get()
+ #Detector id000005
+ detector4 = id000005.get()
+ #Detector id000006
+ detector5 = id000006.get()
+ #Detector id000007
+ detector6 = id000007.get()
+ #Detector id000008
+ detector7 = id000008.get()
+ #Detector id000009
+ detector8 = id000009.get()
+ #Detector id000010
+ detector9 = id000010.get()
+ scan.append ([setpoint1], [readback1], [detector1, detector2, detector3, detector4, detector5, detector6, detector7, detector8, detector9])
+
+#Closing channels
+id000001.close()
+id000003.close()
+id000004.close()
+id000005.close()
+id000006.close()
+id000007.close()
+id000008.close()
+id000009.close()
+id000010.close()
+
+scan.end()
+
+#return ok
+ret = 'Slides moved out'
+success = True
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests/Drive Out/Drive Out.xml b/script/tests/tests/Collimator Tests/Drive Out/Drive Out.xml
new file mode 100644
index 0000000..5a1c925
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Drive Out/Drive Out.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ 3000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/tests/tests/Collimator Tests/Go to specific position/.config b/script/tests/tests/Collimator Tests/Go to specific position/.config
new file mode 100644
index 0000000..59cbf88
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Go to specific position/.config
@@ -0,0 +1,7 @@
+name=Go to specific position
+description=Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+
+
+#optional parameters. Description is compulsory. Syntax&
+#parameters=&&[;&&]
+parameters=repeatTimes&2&Repeat N times;midPoint&41.0&Middle point A;spanFromMidPoint&3.0&B steps around middle point A;delayS&0&Delay between each oscillation [s]
diff --git a/script/tests/tests/Collimator Tests/Go to specific position/Go to specific position.py b/script/tests/tests/Collimator Tests/Go to specific position/Go to specific position.py
new file mode 100644
index 0000000..18616d1
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Go to specific position/Go to specific position.py
@@ -0,0 +1,162 @@
+
+#Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+
+
+###### DO NOT MODIFY THE CODE BELOW ######
+global print_log, sendFeedback, inspect
+import sys, inspect, os, traceback
+
+def print_log(testName, DEVICE, text):
+ time.ctime()
+ now = time.strftime('%Y.%m.%d %H:%M:%S')
+ print now + ' ' + DEVICE + ' - ' + testName + ': ' + str(text)
+
+#prepare and send feedback to calling tool
+def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
+ print_log(testName, DEVICE, 'End of test. Result:')
+ print_log(testName, DEVICE, 'Device: ' + DEVICE)
+ print_log(testName, DEVICE, 'Test name: ' + testName)
+ print_log(testName, DEVICE, 'Test path: ' + testPath)
+ print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
+ print_log(testName, DEVICE, 'Return string: ' + returnString)
+ ret = [testPath, DEVICE, returnString, testPassed]
+ set_return(ret)
+
+def startTest(testName, DEVICE, params):
+ try:
+ import traceback
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #by default, failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+
+###### WRITE YOUR CODE HERE BELOW #######
+
+ #get parameters from the calling interface
+ try:
+ print_log(testName, DEVICE, "Running test Motor Test 2 for device " + DEVICE + " with the following parameters:\n" + str(params))
+ middle = float(params["midPoint"]["value"])
+ loopTimes = int(params["repeatTimes"]["value"])
+ delayS = int(params["delayS"]["value"])
+ if(delayS<1): delayS=1
+ span = float(params["spanFromMidPoint"]["value"])
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+ #scan = ManualScan(['idX'], ['idMotorStatus', 'idLogicalPosition', 'idDiameter', 'idMotorPosition', 'idPotiRaw', 'idEncoderPosition', 'idBtvsRaw', 'idBtvsProc', 'idDiff01', 'idDiff02'] , [ 0.0], [ 3000.0], [20])
+ scan = ManualScan(['idX'], ['idMotorStatus', 'idMotorPosition', 'idEncoderPosition', 'idError'])
+ scan.setPlotTitle(plotName)
+ scan.start()
+
+ #Creating channels: dimension 1
+ try:
+ idInkr = Channel(DEVICE+':MOTOR.VAL', type = 'd')
+ idMotorStatus = Channel(DEVICE+':MOTOR.MSTA', type = 'd')
+ idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
+ idEncoderPosition = Channel(DEVICE+':ENCODER', type = 'd')
+ idEndSwitchL = Channel(DEVICE+':MOTOR.LLS', type = 'd')
+ idEndSwitchH = Channel(DEVICE+':MOTOR.HLS', type = 'd')
+ idLimitH = Channel(DEVICE+':MOTOR.HLM', type = 'd')
+ idLimitL = Channel(DEVICE+':MOTOR.LLM', type = 'd')
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+ #remove limits
+ idLimitH.put(999999.9, timeout=None)
+ idLimitL.put(-999999.9, timeout=None)
+
+ direction = 1.0
+ startDefault = middle - span
+ endDefault = middle + span
+ end = endDefault+1
+ #find position: it will be the middle point of the test
+ print_log(testName, DEVICE, 'Moving to middle point ' + str(middle) )
+ idInkr.put(middle, timeout=None) # TODO: Set appropriate timeout
+ readback2 = idInkr.get()
+ if abs(readback2 - middle) > 1 : # TODO: Check accuracy
+ ret = 'Actor idInkr could not be set to the value ' + str(middle) + ' (current value: ' + str(readback2) + ')'
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+ start = readback2+direction
+ countSteps = 0
+ count = 0
+ print_log(testName, DEVICE, 'Moving around middle point (+-' + str(span) + ')' )
+ for setpoint1 in range(0, loopTimes*2):
+ count = count + 1
+ print_log(testName, DEVICE, 'Pausing ' + str(delayS) + 's' )
+ sleep( delayS ) # Settling time
+ #RegionPositioner idInkr
+ for setpoint2 in frange(start, end, direction):
+ readback1 = setpoint1
+ idInkr.put(setpoint2, timeout=None) # TODO: Set appropriate timeout
+ sleep( 0.2 ) # Settling time
+ readback2 = idInkr.get()
+ if abs(readback2 - setpoint2) > 1 : # TODO: Check accuracy
+ ret = 'Actor idInkr could not be set to the value ' + str(setpoint2) + ' (current value: ' + str(readback2) + ')'
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+ #Detector idMotorStatus
+ detector1 = idMotorStatus.get()
+ detector4 = idMotorPosition.get()
+ detector6 = idEncoderPosition.get()
+ endH = idEndSwitchH.get()
+ endL = idEndSwitchL.get()
+ #Manipulation idDiff01
+ #Variable Mappings
+ a = detector4
+ b = detector6
+ idDiff01 = a-b
+ countSteps = countSteps + 1
+ scan.append ([countSteps], [countSteps], [detector1, detector4, detector6, idDiff01])
+ if endH>0.0 or (direction > 0.0 and setpoint2 >= end -1):
+ #invert direction and swap start with end of translation
+ end = startDefault-1
+ start = setpoint2 - direction
+ direction = -1.0
+ print_log(testName, DEVICE, 'End of span (' + str(setpoint2) + '), changing direction to ' + str(direction) )
+ break
+ if endL>0.0 or ( direction < 0.0 and setpoint2 <= end +1):
+ #invert direction and swap start with end of translation
+ end = endDefault+1
+ start = setpoint2 - direction
+ direction = 1.0
+ print_log(testName, DEVICE, 'End of span (' + str(setpoint2) + '), changing direction to ' + str(direction) )
+ break
+
+ #set limits back
+ idLimitH.put(145.0, timeout=None)
+ idLimitL.put(0.0, timeout=None)
+
+ #Closing channels
+ idInkr.close()
+ idMotorStatus.close()
+ idMotorPosition.close()
+ idEncoderPosition.close()
+ idLimitH.close()
+ idLimitL.close()
+ scan.end()
+ ret = 'Slide moved back and forth (' + str(count) + ' runs)'
+ success = True
+
+############# END OF YOUR CODE ###########
+###### DO NOT MODIFY THE CODE BELOW ######
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ except:
+ ret = traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+#launch the test
+startTest(test, device, parameters)
diff --git a/script/tests/tests/Collimator Tests/Go to specific position/help.html b/script/tests/tests/Collimator Tests/Go to specific position/help.html
new file mode 100644
index 0000000..8aac8f3
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Go to specific position/help.html
@@ -0,0 +1,16 @@
+
+
+Short Description
+Oscillate around a specific position
+Details
+Go to absolute position A, then move +B steps, then -2B steps, then +2Bsteps (ie oscillate round centre position, logging after each movement); repeat N times
+Parameters
+midPoint Middle point A around which it will oscillate
+spanFromMidPoint B stepst to oscillate around A
+repeatTimes Repeat the moving N times
+delayS Pause delay (>0s) between each oscillation [s]
+Contact
+Marco Boccioli
+
+
+
diff --git a/script/tests/tests/Collimator Tests/Initialise/.config b/script/tests/tests/Collimator Tests/Initialise/.config
new file mode 100644
index 0000000..2f02383
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Initialise/.config
@@ -0,0 +1,8 @@
+name=Initialise
+description=Initialises the motor
+help = \
+This test sends a INIT command to the device, as many times as configured with the parameter RepeatTimes.
+
+#optional parameters. Description is compulsory. Syntax&
+#parameters=&&[;&&]
+parameters=repeatTimes&2&Repeat N times;delayS&4&Delay between each initialisation [s]
\ No newline at end of file
diff --git a/script/tests/tests/Collimator Tests/Initialise/Initialise.py b/script/tests/tests/Collimator Tests/Initialise/Initialise.py
new file mode 100644
index 0000000..b5dfa0b
--- /dev/null
+++ b/script/tests/tests/Collimator Tests/Initialise/Initialise.py
@@ -0,0 +1,129 @@
+
+
+
+###### DO NOT MODIFY THE CODE BELOW ######
+global print_log, sendFeedback, inspect
+import sys, inspect, os, traceback
+
+def print_log(testName, DEVICE, text):
+ time.ctime()
+ now = time.strftime('%Y.%m.%d %H:%M:%S')
+ print now + ' ' + DEVICE + ' - ' + testName + ': ' + str(text)
+
+#prepare and send feedback to calling tool
+def sendFeedback(testPath, testName, DEVICE, returnString, testPassed):
+ print_log(testName, DEVICE, 'End of test. Result:')
+ print_log(testName, DEVICE, 'Device: ' + DEVICE)
+ print_log(testName, DEVICE, 'Test name: ' + testName)
+ print_log(testName, DEVICE, 'Test path: ' + testPath)
+ print_log(testName, DEVICE, 'Test passed: ' + str(testPassed))
+ print_log(testName, DEVICE, 'Return string: ' + returnString)
+ ret = [testPath, DEVICE, returnString, testPassed]
+ set_return(ret)
+
+def startTest(testName, DEVICE, params):
+ try:
+ import traceback
+ #get the path of this script
+ testPath = inspect.getfile(inspect.currentframe())
+ #by default, failed
+ ret = 'Test failed'
+ success = False
+ #plot name to be given to the scan. Use: scan.setPlotTitle(plotName)
+ plotName = DEVICE + ' - ' + testName
+
+###### WRITE YOUR CODE HERE BELOW #######
+
+ #Pre-actions
+ # try:
+ # caput(DEVICE+':INIT.PROC', '1')
+ # except:
+ # ret = 'Unable to create channel - ' + traceback.format_exc()
+ # success = False
+ # sendFeedback(testPath, testName, DEVICE, ret, success)
+ # return
+
+
+ #get parameters from the calling interface
+ try:
+ print_log(testName, DEVICE, "Running test Initialise with the following parameters:")
+ print_log(testName, DEVICE, params )
+ loopTimes = int(params["repeatTimes"]["value"])
+ delaySeconds = int(params["delayS"]["value"])
+ except:
+ ret = 'Could not retrieve testing parameters - ' + traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+ scan = ManualScan(['idX'], ['idMotorPosition', 'idEncoderPosition', 'idError'] )
+ scan.setPlotTitle(plotName)
+ scan.start()
+ #Creating channels: dimension 1
+ try:
+ idInit = Channel(DEVICE+':INIT.PROC', type = 'l')
+ idReady = Channel(DEVICE+':RDY', type = 'l')
+ idInterlock = Channel(DEVICE+':ILK', type = 'l')
+ idMotorPosition = Channel(DEVICE+':MOTOR.RBV', type = 'd')
+ idEncoderPosition = Channel(DEVICE+':ENCODER', type = 'd')
+ except:
+ ret = 'Unable to create channel - ' + traceback.format_exc()
+ success = False
+ sendFeedback(testPath, testName, DEVICE, ret, success)
+ return
+
+ count = 0
+ timeout = 90000 #timeout in ms
+ for count in range(1, loopTimes+1):
+ print_log(testName, DEVICE, 'Initialisation #' + str(count) + '/' + str(loopTimes))
+ idInit.put(1, timeout=None) # TODO: Set appropriate timeout
+ timeStampStart = float(java.lang.System.currentTimeMillis())
+ sleep(0.1)
+ ready = 0
+ interlock = idInterlock.get()
+ timeElapsed = 0 #in ms
+ while (ready == 0) and timeElapsed
+
+Short Description
+Initialise N times.
+Details
+This test sends a INIT command to the device, as many times as configured with the parameter repeatTimes.
+Parameters
+repeatTimes Repeat the Initialisation N times
+delayS Pause delay between each Initialisation [s]
+Contact
+Marco Boccioli
+
+