diff --git a/config/control/#hush.json# b/config/control/#hush.json# new file mode 100755 index 0000000..57da2f1 --- /dev/null +++ b/config/control/#hush.json# @@ -0,0 +1,20 @@ +{ + + "Parameters":{ + "drawLine" : {"flag" : 0, "data":{ "widget": "QHLine", "text" : "None", "value" : "None"}}, + "delayRamp" : {"flag" : 1, "data":{ "widget": "QDoubleSpinBox", "text" : "Ramp delay (s):", + "value" : 0.1, "min": 0.00, "max": 0.20, "step": 0.01, + "tooltip":"Wait time between sending set point to each magnet in 'Restore'/'Standby' "}}, + "drawLine2" : {"flag" : 0, "data":{ "widget": "QHLine", "text" : "None", "value" : "None"}} + + }, + "Expert":{ + "debug": {"flag" : 0, "data":{ "widget": "None", "text" : "Debug", "value" : 0}}, + "simulation": {"flag" : 1, "data":{ "widget": "None", "text" : "Dry run", "value" : 0}} + }, + "IOC": { + "resultsTabTitle" : "IOC" + }, + "headerMagnetSector": ["B1B2","G1","SH","G2","O2","PIF", "G3"], + "Master": "Controlroom" +} diff --git a/help/hush_resources.py b/help/hush_resources.py index fe63827..4bdbebd 100644 --- a/help/hush_resources.py +++ b/help/hush_resources.py @@ -9,6 +9,229 @@ from PyQt5 import QtCore qt_resource_data = b"\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x31\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x32\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x0b\x58\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x48\x61\x6e\x64\x73\x6f\x6d\x65\x20\x50\x6f\x77\x65\x72\ +\x20\x55\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x69\x6e\ +\x67\x20\x48\x69\x65\x72\x61\x72\x63\x68\x79\x20\x61\x74\x20\x50\ +\x72\x6f\x73\x63\x61\x6e\x2c\x20\x48\x55\x53\x48\x21\x3c\x2f\x74\ +\x69\x74\x6c\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\ +\x64\x79\x3e\x0a\x0a\x3c\x68\x35\x20\x20\x73\x74\x79\x6c\x65\x3d\ +\x22\x63\x6f\x6c\x6f\x72\x3a\x67\x72\x61\x79\x3b\x22\x3e\x46\x65\ +\x62\x72\x75\x61\x72\x79\x20\x32\x30\x32\x34\x2c\x20\x4a\x61\x6e\ +\x20\x43\x68\x72\x69\x6e\x3c\x2f\x68\x35\x3e\x0a\x3c\x68\x34\x3e\ +\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\ +\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\x3c\x2f\x73\x70\ +\x61\x6e\x3e\x61\x6e\x64\x73\x6f\x6d\x65\x20\x3c\x73\x70\x61\x6e\ +\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\ +\x72\x61\x79\x3b\x22\x3e\x50\x6f\x77\x65\x72\x3c\x2f\x73\x70\x61\ +\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\ +\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x55\x3c\x2f\ +\x73\x70\x61\x6e\x3e\x73\x61\x67\x65\x20\x3c\x73\x70\x61\x6e\x20\ +\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ +\x61\x79\x3b\x22\x3e\x61\x6e\x64\x3c\x2f\x73\x70\x61\x6e\x3e\x20\ +\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\ +\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x53\x3c\x2f\x73\x70\x61\ +\x6e\x3e\x61\x76\x69\x6e\x67\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\ +\x22\x3e\x48\x3c\x2f\x73\x70\x61\x6e\x3e\x69\x65\x72\x61\x72\x63\ +\x68\x79\x3c\x2f\x73\x70\x61\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\ +\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ +\x61\x79\x3b\x22\x3e\x61\x74\x20\x50\x72\x6f\x73\x63\x61\x6e\x2c\ +\x3c\x2f\x73\x70\x61\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\ +\x22\x3e\x48\x55\x53\x48\x21\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x2f\ +\x68\x34\x3e\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\x41\x62\x6f\x75\ +\x74\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\x68\x65\x20\x48\ +\x55\x53\x48\x21\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\ +\x20\x69\x6e\x69\x74\x69\x61\x74\x65\x73\x20\x65\x6e\x65\x72\x67\ +\x79\x20\x73\x61\x76\x69\x6e\x67\x20\x70\x72\x6f\x63\x65\x64\x75\ +\x72\x65\x73\x20\x61\x6e\x64\x20\x72\x65\x63\x6f\x72\x64\x73\x20\ +\x74\x68\x65\x20\x70\x6f\x77\x65\x72\x20\x73\x61\x76\x65\x64\x2e\ +\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\ +\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x61\x63\x6b\x3b\ +\x20\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x69\x74\x61\x6c\ +\x69\x63\x3b\x22\x3e\x50\x6f\x77\x65\x72\x20\x53\x61\x76\x69\x6e\ +\x67\x20\x41\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\x20\x69\x73\x20\ +\x6f\x6e\x6c\x79\x20\x61\x63\x74\x69\x76\x61\x74\x65\x64\x20\x77\ +\x68\x65\x6e\x20\x50\x52\x4f\x53\x43\x41\x4e\x20\x69\x73\x20\x69\ +\x6e\x20\x22\x50\x72\x6f\x64\x75\x6b\x74\x69\x6f\x6e\x22\x20\x6d\ +\x6f\x64\x65\x2e\x3c\x2f\x73\x70\x61\x6e\x3e\x0a\x20\x20\x3c\x2f\ +\x70\x3e\x0a\x3c\x21\x2d\x2d\x61\x20\x68\x72\x65\x66\x3d\x22\x70\ +\x61\x67\x65\x31\x2e\x68\x74\x6d\x6c\x22\x3e\x68\x65\x72\x65\x3c\ +\x2f\x61\x3e\x3c\x2f\x70\x2d\x2d\x3e\x0a\x0a\x3c\x68\x32\x20\x73\ +\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\ +\x3b\x22\x3e\x54\x68\x65\x20\x52\x65\x70\x6f\x73\x69\x74\x6f\x72\ +\x79\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\x68\x65\x20\x61\ +\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x63\x6f\x6d\x70\x72\ +\x69\x73\x65\x73\x20\x74\x77\x6f\x20\x63\x6f\x6d\x70\x6f\x6e\x65\ +\x6e\x74\x73\x3a\x0a\x20\x20\x3c\x75\x6c\x3e\x0a\x3c\x6c\x69\x3e\ +\x0a\x20\x20\x41\x20\x53\x74\x61\x74\x65\x20\x4d\x61\x63\x68\x69\ +\x6e\x65\x20\x28\x53\x4d\x29\x20\x6f\x70\x65\x72\x61\x74\x69\x6e\ +\x67\x20\x61\x74\x20\x74\x68\x65\x20\x49\x4f\x43\x20\x6c\x65\x76\ +\x65\x6c\x20\x74\x68\x61\x74\x20\x69\x73\x20\x72\x65\x73\x70\x6f\ +\x6e\x73\x69\x62\x6c\x65\x20\x66\x6f\x72\x20\x74\x68\x65\x20\x70\ +\x6f\x77\x65\x72\x20\x73\x61\x76\x69\x6e\x67\x20\x61\x63\x63\x6f\ +\x75\x6e\x74\x69\x6e\x67\x2e\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\ +\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\ +\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x20\x68\x74\x74\x70\x73\x3a\ +\x2f\x2f\x67\x69\x74\x6c\x61\x62\x2e\x70\x73\x69\x2e\x63\x68\x2f\ +\x70\x72\x6f\x73\x63\x61\x6e\x5f\x61\x70\x70\x73\x34\x6f\x70\x73\ +\x2f\x48\x55\x53\x48\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\ +\x0a\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x20\x2f\x70\ +\x72\x6f\x73\x63\x61\x6e\x2f\x62\x64\x2f\x61\x70\x70\x6c\x69\x63\ +\x61\x74\x69\x6f\x6e\x73\x2f\x68\x75\x73\x68\x2f\x68\x6c\x61\x2f\ +\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x3c\x2f\x6c\x69\ +\x3e\x0a\x20\x20\x3c\x6c\x69\x3e\x0a\x20\x20\x20\x20\x41\x20\x48\ +\x69\x67\x68\x20\x4c\x65\x76\x65\x6c\x20\x41\x70\x70\x6c\x69\x63\ +\x61\x74\x69\x6f\x6e\x20\x28\x48\x4c\x41\x29\x20\x74\x68\x61\x74\ +\x20\x69\x73\x20\x61\x62\x6c\x65\x20\x74\x6f\x20\x69\x6e\x74\x65\ +\x72\x61\x63\x74\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x49\x4f\ +\x43\x20\x28\x66\x6f\x72\x20\x65\x78\x70\x65\x72\x74\x20\x75\x73\ +\x65\x29\x2c\x20\x64\x69\x73\x70\x6c\x61\x79\x73\x20\x61\x63\x63\ +\x6f\x75\x6e\x74\x69\x6e\x67\x0a\x20\x20\x20\x20\x66\x69\x67\x75\ +\x72\x65\x73\x2c\x20\x61\x6e\x64\x20\x70\x72\x6f\x76\x69\x64\x65\ +\x73\x20\x61\x20\x70\x61\x6e\x65\x6c\x20\x74\x6f\x20\x65\x6e\x61\ +\x62\x6c\x65\x20\x71\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x74\ +\x6f\x20\x62\x65\x20\x73\x65\x74\x20\x74\x6f\x20\x74\x68\x65\x69\ +\x72\x20\x73\x74\x61\x6e\x64\x62\x79\x2f\x72\x65\x73\x74\x6f\x72\ +\x65\x20\x76\x61\x6c\x75\x65\x73\x2e\x3c\x62\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x68\x74\x74\ +\x70\x73\x3a\x2f\x2f\x67\x69\x74\x2e\x70\x73\x69\x2e\x63\x68\x2f\ +\x65\x70\x69\x63\x73\x5f\x69\x6f\x63\x62\x6f\x6f\x74\x5f\x70\x72\ +\x6f\x73\x63\x61\x6e\x2f\x50\x52\x4f\x5f\x68\x75\x73\x68\x3c\x2f\ +\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x20\x20\x20\x20\x20\x3c\ +\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\ +\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x2f\x70\x72\x6f\x73\x63\ +\x61\x6e\x2f\x62\x64\x2f\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\ +\x6e\x73\x2f\x68\x75\x73\x68\x2f\x69\x6f\x63\x2f\x6c\x61\x74\x65\ +\x73\x74\x2f\x50\x52\x4f\x5f\x68\x75\x73\x68\x2f\x3c\x2f\x73\x70\ +\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\ +\x3e\x0a\x3c\x2f\x75\x6c\x3e\x0a\x20\x20\x3c\x68\x32\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\ +\x22\x3e\x54\x68\x65\x20\x47\x72\x61\x70\x68\x69\x63\x61\x6c\x20\ +\x55\x73\x65\x72\x20\x49\x6e\x74\x65\x72\x66\x61\x63\x65\x3c\x2f\ +\x68\x32\x3e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\x6c\x65\x3d\ +\x22\x63\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\x6c\x75\x65\ +\x3b\x22\x3e\x4f\x70\x65\x72\x61\x74\x6f\x72\x20\x50\x61\x6e\x65\ +\x6c\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x52\x61\x6d\x70\x20\x44\x65\ +\x6c\x61\x79\x3a\x20\x43\x61\x6e\x20\x74\x61\x6b\x65\x20\x6f\x6e\ +\x20\x76\x61\x6c\x75\x65\x73\x20\x66\x72\x6f\x6d\x20\x30\x2e\x30\ +\x73\x20\x74\x6f\x20\x30\x2e\x32\x73\x2e\x20\x3c\x62\x72\x3e\x0a\ +\x20\x20\x44\x65\x66\x69\x6e\x65\x73\x20\x74\x68\x65\x20\x64\x65\ +\x6c\x61\x79\x20\x62\x65\x74\x77\x65\x65\x6e\x20\x73\x65\x74\x74\ +\x69\x6e\x67\x20\x69\x6e\x64\x69\x76\x69\x64\x75\x61\x6c\x20\x71\ +\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x77\x68\x65\x6e\x20\x69\ +\x6e\x69\x74\x69\x61\x74\x69\x6e\x67\x20\x73\x74\x61\x6e\x64\x62\ +\x79\x2f\x72\x65\x73\x74\x6f\x72\x65\x2e\x0a\x20\x20\x41\x20\x76\ +\x61\x6c\x75\x65\x20\x6f\x66\x20\x30\x2e\x30\x73\x20\x6d\x65\x61\ +\x6e\x73\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x71\x75\x61\x64\ +\x72\x75\x70\x6c\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x73\x20\x61\ +\x72\x65\x20\x73\x65\x74\x20\x73\x69\x6d\x75\x6c\x74\x61\x6e\x65\ +\x6f\x75\x73\x6c\x79\x2e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\ +\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\ +\x6c\x75\x65\x3b\x22\x3e\x45\x78\x70\x65\x72\x74\x20\x50\x61\x6e\ +\x65\x6c\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x53\x65\x6c\x65\x63\x74\ +\x69\x6e\x67\x20\x74\x68\x65\x20\x44\x72\x79\x20\x52\x75\x6e\x20\ +\x6f\x70\x74\x69\x6f\x6e\x20\x64\x69\x73\x61\x62\x6c\x65\x73\x20\ +\x73\x65\x74\x74\x69\x6e\x67\x20\x76\x61\x6c\x75\x65\x73\x20\x74\ +\x6f\x20\x65\x70\x69\x63\x73\x20\x70\x72\x6f\x63\x65\x73\x73\x20\ +\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x2e\x20\x55\x73\x65\x64\x20\ +\x66\x6f\x72\x20\x74\x65\x73\x74\x69\x6e\x67\x2e\x20\x3c\x62\x72\ +\x3e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\x6c\x75\x65\x3b\x22\ +\x3e\x53\x61\x76\x69\x6e\x67\x20\x4f\x76\x65\x72\x76\x69\x65\x77\ +\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x44\x69\x73\x70\x6c\x61\x79\x73\ +\x20\x61\x20\x6e\x75\x6d\x62\x65\x72\x20\x6f\x66\x20\x70\x72\x6f\ +\x63\x65\x73\x73\x20\x76\x61\x72\x61\x69\x62\x6c\x65\x73\x20\x72\ +\x65\x6c\x61\x74\x65\x64\x20\x74\x6f\x20\x74\x68\x65\x20\x70\x6f\ +\x77\x65\x72\x20\x73\x61\x76\x69\x6e\x67\x20\x61\x63\x63\x6f\x75\ +\x6e\x74\x69\x6e\x67\x20\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\x70\ +\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\ +\x62\x6c\x61\x63\x6b\x3b\x20\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\ +\x65\x3a\x69\x74\x61\x6c\x69\x63\x3b\x22\x3e\x50\x6f\x77\x65\x72\ +\x20\x53\x61\x76\x69\x6e\x67\x20\x41\x63\x63\x6f\x75\x6e\x74\x69\ +\x6e\x67\x20\x69\x73\x20\x6f\x6e\x6c\x79\x20\x61\x63\x74\x69\x76\ +\x61\x74\x65\x64\x20\x77\x68\x65\x6e\x20\x50\x52\x4f\x53\x43\x41\ +\x4e\x20\x69\x73\x20\x69\x6e\x20\x22\x50\x72\x6f\x64\x75\x6b\x74\ +\x69\x6f\x6e\x22\x20\x6d\x6f\x64\x65\x2e\x3c\x2f\x73\x70\x61\x6e\ +\x3e\x0a\x20\x20\x3c\x74\x61\x62\x6c\x65\x3e\x0a\x20\x20\x20\x20\ +\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x49\x6e\x69\x74\x69\x61\x6c\x20\ +\x50\x6f\x77\x65\x72\x20\x28\x6b\x77\x29\x3a\x3c\x2f\x74\x64\x3e\ +\x20\x3c\x74\x64\x3e\x54\x68\x65\x20\x6e\x6f\x6d\x69\x6e\x61\x6c\ +\x20\x70\x6f\x77\x65\x72\x20\x76\x61\x6c\x75\x65\x20\x77\x68\x65\ +\x6e\x20\x71\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x61\x72\x65\ +\x20\x69\x6e\x20\x74\x68\x65\x20\x75\x73\x75\x61\x6c\x20\x70\x6f\ +\x77\x65\x72\x65\x64\x2d\x6f\x6e\x20\x73\x74\x61\x74\x65\x2e\x3c\ +\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\x20\x20\x3c\x74\ +\x72\x3e\x3c\x74\x64\x3e\x50\x6f\x77\x65\x72\x20\x28\x6b\x77\x29\ +\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\x3e\x54\x68\x65\x20\x63\ +\x75\x72\x72\x65\x6e\x74\x20\x70\x6f\x77\x65\x72\x20\x76\x61\x6c\ +\x75\x65\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x53\x61\x76\x69\x6e\x67\ +\x20\x28\x4d\x57\x68\x29\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\ +\x3e\x54\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x70\x6f\x77\ +\x65\x72\x20\x76\x61\x6c\x75\x65\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\ +\x74\x72\x3e\x0a\x20\x20\x20\x20\x3c\x74\x72\x3e\x3c\x74\x64\x3e\ +\x54\x69\x6d\x65\x20\x69\x6e\x20\x53\x61\x76\x69\x6e\x67\x20\x4d\ +\x6f\x64\x65\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\x3e\x54\x69\ +\x6d\x65\x20\x65\x6c\x61\x70\x73\x65\x64\x20\x69\x6e\x20\x63\x75\ +\x72\x72\x65\x6e\x74\x20\x73\x61\x76\x69\x6e\x67\x20\x70\x65\x72\ +\x69\x6f\x64\x20\x28\x64\x61\x79\x73\x20\x68\x6f\x75\x72\x73\x3a\ +\x6d\x69\x6e\x75\x74\x65\x73\x3a\x73\x65\x63\x6f\x6e\x64\x73\x29\ +\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\x20\x20\ +\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x54\x6f\x74\x20\x53\x61\x76\x65\ +\x64\x20\x28\x4d\x57\x68\x29\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\ +\x64\x3e\x54\x68\x65\x20\x61\x63\x63\x75\x6d\x75\x6c\x61\x74\x65\ +\x64\x20\x70\x6f\x77\x65\x72\x20\x73\x61\x76\x65\x64\x20\x69\x6e\ +\x20\x74\x68\x65\x20\x63\x61\x6c\x65\x6e\x64\x61\x72\x20\x79\x65\ +\x61\x72\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\ +\x3c\x2f\x74\x61\x62\x6c\x65\x3e\x20\x0a\x20\x20\x0a\x20\x20\x0a\ +\x20\x20\x0a\x0a\x0a\x0a\x0a\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\ +\x2f\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x33\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x34\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x32\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x33\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ \x00\x00\x00\x80\ \x3c\ \x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ @@ -32,118 +255,10 @@ qt_resource_data = b"\ \x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ \x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ \x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x32\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x33\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x33\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x34\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x31\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x32\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x03\x29\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x48\x61\x6e\x64\x73\x6f\x6d\x65\x20\x50\x6f\x77\x65\x72\ -\x20\x55\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x69\x6e\ -\x67\x20\x48\x69\x65\x72\x61\x72\x63\x68\x79\x20\x61\x74\x20\x50\ -\x72\x6f\x73\x63\x61\x6e\x2c\x20\x48\x55\x53\x48\x21\x3c\x2f\x74\ -\x69\x74\x6c\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\ -\x64\x79\x3e\x0a\x0a\x3c\x68\x35\x20\x20\x73\x74\x79\x6c\x65\x3d\ -\x22\x63\x6f\x6c\x6f\x72\x3a\x67\x72\x61\x79\x3b\x22\x3e\x4a\x61\ -\x6e\x75\x61\x72\x79\x20\x32\x30\x32\x34\x2c\x20\x4a\x61\x6e\x20\ -\x43\x68\x72\x69\x6e\x3c\x2f\x68\x35\x3e\x0a\x3c\x68\x34\x3e\x20\ -\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\ -\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\x3c\x2f\x73\x70\x61\ -\x6e\x3e\x61\x6e\x64\x73\x6f\x6d\x65\x20\x3c\x73\x70\x61\x6e\x20\ -\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ -\x61\x79\x3b\x22\x3e\x50\x6f\x77\x65\x72\x3c\x2f\x73\x70\x61\x6e\ -\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ -\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x55\x3c\x2f\x73\ -\x70\x61\x6e\x3e\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x3c\x73\x70\ -\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\ -\x20\x72\x65\x64\x3b\x22\x3e\x53\x3c\x2f\x73\x70\x61\x6e\x3e\x61\ -\x76\x69\x6e\x67\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\ -\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\ -\x3c\x2f\x73\x70\x61\x6e\x3e\x69\x65\x72\x61\x72\x63\x68\x79\x20\ -\x61\x74\x20\x50\x72\x6f\x73\x63\x61\x6e\x2c\x20\x3c\x73\x70\x61\ -\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\ -\x72\x65\x64\x3b\x22\x3e\x48\x55\x53\x48\x21\x3c\x2f\x73\x70\x61\ -\x6e\x3e\x3c\x2f\x68\x34\x3e\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\ -\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\ -\x41\x62\x6f\x75\x74\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\ -\x68\x69\x73\x20\x3c\x62\x3e\x48\x55\x53\x48\x21\x3c\x2f\x62\x3e\ -\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x69\x6e\x68\ -\x65\x72\x69\x74\x73\x20\x66\x72\x6f\x6d\x20\x74\x68\x65\x20\x57\ -\x69\x6e\x64\x6f\x77\x20\x62\x61\x73\x65\x20\x63\x6c\x61\x73\x73\ -\x2e\x3c\x62\x72\x3e\x20\x20\x0a\x3c\x70\x3e\x69\x6e\x66\x6f\x72\ -\x6d\x61\x74\x69\x6f\x6e\x20\x63\x6f\x6e\x63\x65\x72\x6e\x69\x6e\ -\x67\x20\x74\x68\x69\x73\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\ -\x6f\x6e\x2c\x20\x73\x75\x63\x68\x20\x61\x73\x20\x63\x6f\x6e\x66\ -\x69\x67\x75\x72\x61\x74\x69\x6f\x6e\x20\x70\x61\x72\x61\x6d\x65\ -\x74\x65\x72\x73\x20\x6f\x72\x20\x6f\x74\x68\x65\x72\x2c\x20\x6d\ -\x61\x79\x20\x62\x65\x20\x65\x6e\x74\x65\x72\x65\x64\x2c\x20\x65\ -\x2e\x67\x2e\x2c\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\x22\x70\x61\ -\x67\x65\x31\x2e\x68\x74\x6d\x6c\x22\x3e\x68\x65\x72\x65\x3c\x2f\ -\x61\x3e\x3c\x2f\x70\x3e\x0a\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\ -\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\ -\x54\x68\x65\x20\x50\x61\x6e\x65\x6c\x3c\x2f\x68\x32\x3e\x0a\x0a\ -\x3c\x70\x3e\x54\x68\x65\x73\x65\x20\x77\x65\x62\x20\x70\x61\x67\ -\x65\x73\x20\x61\x72\x65\x20\x74\x6f\x20\x62\x65\x20\x63\x6f\x6d\ -\x70\x6c\x65\x74\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x61\x70\ -\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x6f\x77\x6e\x65\x72\x2e\ -\x3c\x62\x72\x3e\x0a\x0a\x0a\x0a\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\ -\x3c\x2f\x68\x74\x6d\x6c\x3e\x0a\ " qt_resource_name = b"\ \x00\x0a\ -\x08\x8a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x35\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x7a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x34\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x5a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x32\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x6a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x33\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ \x08\x4a\x34\x9c\ \x00\x70\ \x00\x61\x00\x67\x00\x65\x00\x31\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ @@ -151,33 +266,49 @@ qt_resource_name = b"\ \x0c\xba\xf2\x7c\ \x00\x69\ \x00\x6e\x00\x64\x00\x65\x00\x78\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x6a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x33\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x5a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x32\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x8a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x35\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x7a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x34\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ " qt_resource_struct_v1 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\ -\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x02\x85\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x01\x2f\ -\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xda\ -\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x84\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x03\x30\ +\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xb2\ +\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x07\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe1\ +\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x5d\ +\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\xab\ " qt_resource_struct_v2 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x02\x85\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5b\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x01\x2f\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5c\ -\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xda\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5e\ -\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x84\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5f\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x61\ -\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x03\x30\ -\x00\x00\x01\x8d\xa7\xc7\x77\x2b\ +\x00\x00\x01\x8d\xc6\x98\xaa\x4d\ +\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xb2\ +\x00\x00\x01\x8d\xc6\x98\xaa\x50\ +\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x07\ +\x00\x00\x01\x8d\xc6\x98\xaa\x52\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe1\ +\x00\x00\x01\x8d\xc6\x98\xaa\x54\ +\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x5d\ +\x00\x00\x01\x8d\xc6\x98\xaa\x55\ +\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\xab\ +\x00\x00\x01\x8d\xd0\x41\x77\x24\ " qt_version = QtCore.qVersion().split('.') diff --git a/help/index.html b/help/index.html index c868595..d6dd583 100755 --- a/help/index.html +++ b/help/index.html @@ -1,16 +1,61 @@ Handsome Power Usage and Saving Hierarchy at Proscan, HUSH! -
January 2024, Jan Chrin
-

Handsome Power Usage and Saving Hierarchy at Proscan, HUSH!

+
February 2024, Jan Chrin
+

Handsome Power Usage and Saving Hierarchy at Proscan, HUSH!

About

-

This HUSH! application inherits from the Window base class.
-

information concerning this application, such as configuration parameters or other, may be entered, e.g., here

+

The HUSH! application initiates energy saving procedures and records the power saved.
+ Power Saving Accounting is only activated when PROSCAN is in "Produktion" mode. +

+ -

The Panel

+

The Repository

+ +

The application comprises two components: +

+

The Graphical User Interface

+

Operator Panel

+ Ramp Delay: Can take on values from 0.0s to 0.2s.
+ Defines the delay between setting individual quadruples when initiating standby/restore. + A value of 0.0s means that the quadruple currents are set simultaneously. +

Expert Panel

+ Selecting the Dry Run option disables setting values to epics process variables. Used for testing. +

Saving Overview

+ Displays a number of process variables related to the power saving accounting.
+ Power Saving Accounting is only activated when PROSCAN is in "Produktion" mode. +
+ + + + + + +
Initial Power (kw): The nominal power value when quadruples are in the usual powered-on state.
Power (kw): The current power value.
Saving (MWh): The running power saved in the current saving period.
Time in Saving Mode: Time elapsed in current saving period (days hours:minutes:seconds).
Tot Saved (MWh): The accumulated power saved in the calendar year.
+

Magnet Panel

+ Table of current and power values for quadruples within each section. + Quadruples may be set to their standby values or restored to their initial values. + These action buttons are only enabled if certan conditions are met, i.e, the corresponding + beam disrupter is closed, "Geschlossen" and the corresponding access writes are granted as + controlled by either the global Mastership or the relevant section Submastership +

+ +

+ + -

These web pages are to be completed by the application owner.
diff --git a/hush.py b/hush.py index b4ca6b4..d024dbe 100644 --- a/hush.py +++ b/hush.py @@ -21,7 +21,7 @@ from src.gui import AppGui _pymodule = os.path.basename(__file__) _appname, _appext = _pymodule.split(".") -_appversion = "1.0.0" +_appversion = "2.0.0" # _title = """Power Usage & Saving Hierarchy""" #, HUSH!""" _title = """HUSH!""" @@ -57,8 +57,7 @@ class StartMain(BaseWindow): self.gui = AppGui(self) def prepare_elog_message(self): - - + self.system_idx = self.elog_enum.system.NONE self.eintrag_idx = self.elog_enum.eintrag.INFO self.effekt_idx = self.elog_enum.effekt.NO @@ -177,12 +176,10 @@ class StartMain(BaseWindow): """{0} v {1}

Copyright © Paul Scherrer Institut (PSI). All rights reserved.

-

Author: J. Chrin, Spring 2023

-

(EPICS db adapted from A. Kovach, 2016)

+

Author: J. Chrin, February 2024

+

(EPICS db adapted from A. Kovach, 2016)

IOC Administrator: H. Lutz

-

1st Responsible: J. Chrin - or 3301 (Control Room)

- +

1st Responsible: J. Chrin

Initiates energy saving procedures and records power saved

Python {2} - Qt {3} - PyQt {4}
cafe {5} - epics {6} on {7}""".format( diff --git a/hush.sh b/hush.sh index d18fb7e..606d90b 100755 --- a/hush.sh +++ b/hush.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.2.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -20,15 +20,29 @@ else echo "Interactive/sourced script" fi -# Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +# Select Python Version here. Currently one of 3.5, 3.7, 3.8, 3.10 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" @@ -42,13 +56,13 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #_EPICS_HOST_ARCH=${EPICS_HOST_ARCH} . /opt/gfa/python $PYTHON_VERSION -#/sf/bd/applications/OnlineModel/current/PythonModule:/sf/bd/applications/OnlineModel/current -#/sf/bd/applications/OnlineModel/default/scripts/VA: - -#C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.9.0 +#C_EXT version +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH STDOUT_DIR="/tmp" diff --git a/hush_g1.sh b/hush_g1.sh index 674799c..b34a078 100755 --- a/hush_g1.sh +++ b/hush_g1.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.1.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -20,20 +20,34 @@ else echo "Interactive/sourced script" fi -# Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +# Select Python Version here. Currently one of 3.5, 3.7, 3,8, 3,10 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then - echo "Using default version $PYTHON_VERSION" + echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" fi - + fi echo "PYTHON_VERSION $PYTHON_VERSION" @@ -46,8 +60,11 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.8.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH diff --git a/hush_g2.sh b/hush_g2.sh index dc594e0..1e31929 100755 --- a/hush_g2.sh +++ b/hush_g2.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.1.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -21,14 +21,28 @@ else fi # Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" @@ -46,8 +60,11 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.8.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH diff --git a/hush_g3.sh b/hush_g3.sh index 8e87ba7..bfb784c 100755 --- a/hush_g3.sh +++ b/hush_g3.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.1.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -20,19 +20,33 @@ else echo "Interactive/sourced script" fi -# Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +# Select Python Version here. Currently one of 3.5, 3.7, 3.8, 3.10 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" - fi + fi fi @@ -46,9 +60,11 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.8.0 - +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH STDOUT_DIR="/tmp" diff --git a/hush_o2.sh b/hush_o2.sh index 6ac82df..62e060b 100755 --- a/hush_o2.sh +++ b/hush_o2.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.1.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -21,14 +21,28 @@ else fi # Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" @@ -36,6 +50,7 @@ if [ "$1" ]; then fi + echo "PYTHON_VERSION $PYTHON_VERSION" _EPICS_HOST_ARCH=${RHREL}-x86_64 @@ -46,9 +61,12 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.8.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH STDOUT_DIR="/tmp" diff --git a/hush_pif.sh b/hush_pif.sh index 486c78b..8c4ebcc 100755 --- a/hush_pif.sh +++ b/hush_pif.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.1.0 +cd /proscan/bd/applications/hush/hla/1.3.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -21,14 +21,28 @@ else fi # Select Python Version here. Currently one of 3.5, 3.7 -PYTHON_VERSION=3.7 +PYTHON_VERSION=3.10 + +# Only neede for verison-specific packages, e.g., bigtree- +# Not required for elog. +PYTHON_VERSION_DIR=310 +EXTRA_PYTHON_PATH_FLAG=0 if [ "$1" ]; then if [ "$1" == "3.5" -o "$1" == "35" ]; then echo "Using default version $PYTHON_VERSION" elif [ "$1" == "3.7" -o "$1" == "37" ]; then - PYTHON_VERSION=3.7 + PYTHON_VERSION=3.7 + PYTHON_VERSION_DIR=37 + elif [ "$1" == "3.8" -o "$1" == "38" ]; then + PYTHON_VERSION=3.8 + PYTHON_VERSION_DIR=38 + #EXTRA_PYTHON_PATH_FLAG=1 + elif [ "$1" == "3.10" -o "$1" == "310" ]; then + PYTHON_VERSION=3.10 + PYTHON_VERSION_DIR=310 + #EXTRA_PYTHON_PATH_FLAG=1 else echo "Requested Python version is not supported" echo "Using default version $PYTHON_VERSION" @@ -36,6 +50,8 @@ if [ "$1" ]; then fi + + echo "PYTHON_VERSION $PYTHON_VERSION" _EPICS_HOST_ARCH=${RHREL}-x86_64 @@ -46,9 +62,12 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64 #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.8.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} +fi echo $PYTHONPATH STDOUT_DIR="/tmp" diff --git a/pyrcc5/hush_resources.py b/pyrcc5/hush_resources.py index fe63827..4bdbebd 100644 --- a/pyrcc5/hush_resources.py +++ b/pyrcc5/hush_resources.py @@ -9,6 +9,229 @@ from PyQt5 import QtCore qt_resource_data = b"\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x31\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x32\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x0b\x58\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x48\x61\x6e\x64\x73\x6f\x6d\x65\x20\x50\x6f\x77\x65\x72\ +\x20\x55\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x69\x6e\ +\x67\x20\x48\x69\x65\x72\x61\x72\x63\x68\x79\x20\x61\x74\x20\x50\ +\x72\x6f\x73\x63\x61\x6e\x2c\x20\x48\x55\x53\x48\x21\x3c\x2f\x74\ +\x69\x74\x6c\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\ +\x64\x79\x3e\x0a\x0a\x3c\x68\x35\x20\x20\x73\x74\x79\x6c\x65\x3d\ +\x22\x63\x6f\x6c\x6f\x72\x3a\x67\x72\x61\x79\x3b\x22\x3e\x46\x65\ +\x62\x72\x75\x61\x72\x79\x20\x32\x30\x32\x34\x2c\x20\x4a\x61\x6e\ +\x20\x43\x68\x72\x69\x6e\x3c\x2f\x68\x35\x3e\x0a\x3c\x68\x34\x3e\ +\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\ +\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\x3c\x2f\x73\x70\ +\x61\x6e\x3e\x61\x6e\x64\x73\x6f\x6d\x65\x20\x3c\x73\x70\x61\x6e\ +\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\ +\x72\x61\x79\x3b\x22\x3e\x50\x6f\x77\x65\x72\x3c\x2f\x73\x70\x61\ +\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\ +\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x55\x3c\x2f\ +\x73\x70\x61\x6e\x3e\x73\x61\x67\x65\x20\x3c\x73\x70\x61\x6e\x20\ +\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ +\x61\x79\x3b\x22\x3e\x61\x6e\x64\x3c\x2f\x73\x70\x61\x6e\x3e\x20\ +\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\ +\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x53\x3c\x2f\x73\x70\x61\ +\x6e\x3e\x61\x76\x69\x6e\x67\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\ +\x22\x3e\x48\x3c\x2f\x73\x70\x61\x6e\x3e\x69\x65\x72\x61\x72\x63\ +\x68\x79\x3c\x2f\x73\x70\x61\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\ +\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ +\x61\x79\x3b\x22\x3e\x61\x74\x20\x50\x72\x6f\x73\x63\x61\x6e\x2c\ +\x3c\x2f\x73\x70\x61\x6e\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\ +\x22\x3e\x48\x55\x53\x48\x21\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x2f\ +\x68\x34\x3e\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\x41\x62\x6f\x75\ +\x74\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\x68\x65\x20\x48\ +\x55\x53\x48\x21\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\ +\x20\x69\x6e\x69\x74\x69\x61\x74\x65\x73\x20\x65\x6e\x65\x72\x67\ +\x79\x20\x73\x61\x76\x69\x6e\x67\x20\x70\x72\x6f\x63\x65\x64\x75\ +\x72\x65\x73\x20\x61\x6e\x64\x20\x72\x65\x63\x6f\x72\x64\x73\x20\ +\x74\x68\x65\x20\x70\x6f\x77\x65\x72\x20\x73\x61\x76\x65\x64\x2e\ +\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\ +\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x61\x63\x6b\x3b\ +\x20\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\x65\x3a\x69\x74\x61\x6c\ +\x69\x63\x3b\x22\x3e\x50\x6f\x77\x65\x72\x20\x53\x61\x76\x69\x6e\ +\x67\x20\x41\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\x20\x69\x73\x20\ +\x6f\x6e\x6c\x79\x20\x61\x63\x74\x69\x76\x61\x74\x65\x64\x20\x77\ +\x68\x65\x6e\x20\x50\x52\x4f\x53\x43\x41\x4e\x20\x69\x73\x20\x69\ +\x6e\x20\x22\x50\x72\x6f\x64\x75\x6b\x74\x69\x6f\x6e\x22\x20\x6d\ +\x6f\x64\x65\x2e\x3c\x2f\x73\x70\x61\x6e\x3e\x0a\x20\x20\x3c\x2f\ +\x70\x3e\x0a\x3c\x21\x2d\x2d\x61\x20\x68\x72\x65\x66\x3d\x22\x70\ +\x61\x67\x65\x31\x2e\x68\x74\x6d\x6c\x22\x3e\x68\x65\x72\x65\x3c\ +\x2f\x61\x3e\x3c\x2f\x70\x2d\x2d\x3e\x0a\x0a\x3c\x68\x32\x20\x73\ +\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\ +\x3b\x22\x3e\x54\x68\x65\x20\x52\x65\x70\x6f\x73\x69\x74\x6f\x72\ +\x79\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\x68\x65\x20\x61\ +\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x63\x6f\x6d\x70\x72\ +\x69\x73\x65\x73\x20\x74\x77\x6f\x20\x63\x6f\x6d\x70\x6f\x6e\x65\ +\x6e\x74\x73\x3a\x0a\x20\x20\x3c\x75\x6c\x3e\x0a\x3c\x6c\x69\x3e\ +\x0a\x20\x20\x41\x20\x53\x74\x61\x74\x65\x20\x4d\x61\x63\x68\x69\ +\x6e\x65\x20\x28\x53\x4d\x29\x20\x6f\x70\x65\x72\x61\x74\x69\x6e\ +\x67\x20\x61\x74\x20\x74\x68\x65\x20\x49\x4f\x43\x20\x6c\x65\x76\ +\x65\x6c\x20\x74\x68\x61\x74\x20\x69\x73\x20\x72\x65\x73\x70\x6f\ +\x6e\x73\x69\x62\x6c\x65\x20\x66\x6f\x72\x20\x74\x68\x65\x20\x70\ +\x6f\x77\x65\x72\x20\x73\x61\x76\x69\x6e\x67\x20\x61\x63\x63\x6f\ +\x75\x6e\x74\x69\x6e\x67\x2e\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\ +\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\ +\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x20\x68\x74\x74\x70\x73\x3a\ +\x2f\x2f\x67\x69\x74\x6c\x61\x62\x2e\x70\x73\x69\x2e\x63\x68\x2f\ +\x70\x72\x6f\x73\x63\x61\x6e\x5f\x61\x70\x70\x73\x34\x6f\x70\x73\ +\x2f\x48\x55\x53\x48\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\ +\x0a\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x20\x2f\x70\ +\x72\x6f\x73\x63\x61\x6e\x2f\x62\x64\x2f\x61\x70\x70\x6c\x69\x63\ +\x61\x74\x69\x6f\x6e\x73\x2f\x68\x75\x73\x68\x2f\x68\x6c\x61\x2f\ +\x3c\x2f\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x3c\x2f\x6c\x69\ +\x3e\x0a\x20\x20\x3c\x6c\x69\x3e\x0a\x20\x20\x20\x20\x41\x20\x48\ +\x69\x67\x68\x20\x4c\x65\x76\x65\x6c\x20\x41\x70\x70\x6c\x69\x63\ +\x61\x74\x69\x6f\x6e\x20\x28\x48\x4c\x41\x29\x20\x74\x68\x61\x74\ +\x20\x69\x73\x20\x61\x62\x6c\x65\x20\x74\x6f\x20\x69\x6e\x74\x65\ +\x72\x61\x63\x74\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x49\x4f\ +\x43\x20\x28\x66\x6f\x72\x20\x65\x78\x70\x65\x72\x74\x20\x75\x73\ +\x65\x29\x2c\x20\x64\x69\x73\x70\x6c\x61\x79\x73\x20\x61\x63\x63\ +\x6f\x75\x6e\x74\x69\x6e\x67\x0a\x20\x20\x20\x20\x66\x69\x67\x75\ +\x72\x65\x73\x2c\x20\x61\x6e\x64\x20\x70\x72\x6f\x76\x69\x64\x65\ +\x73\x20\x61\x20\x70\x61\x6e\x65\x6c\x20\x74\x6f\x20\x65\x6e\x61\ +\x62\x6c\x65\x20\x71\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x74\ +\x6f\x20\x62\x65\x20\x73\x65\x74\x20\x74\x6f\x20\x74\x68\x65\x69\ +\x72\x20\x73\x74\x61\x6e\x64\x62\x79\x2f\x72\x65\x73\x74\x6f\x72\ +\x65\x20\x76\x61\x6c\x75\x65\x73\x2e\x3c\x62\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x68\x74\x74\ +\x70\x73\x3a\x2f\x2f\x67\x69\x74\x2e\x70\x73\x69\x2e\x63\x68\x2f\ +\x65\x70\x69\x63\x73\x5f\x69\x6f\x63\x62\x6f\x6f\x74\x5f\x70\x72\ +\x6f\x73\x63\x61\x6e\x2f\x50\x52\x4f\x5f\x68\x75\x73\x68\x3c\x2f\ +\x73\x70\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x20\x20\x20\x20\x20\x3c\ +\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\ +\x72\x3a\x20\x67\x72\x61\x79\x3b\x22\x3e\x2f\x70\x72\x6f\x73\x63\ +\x61\x6e\x2f\x62\x64\x2f\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\ +\x6e\x73\x2f\x68\x75\x73\x68\x2f\x69\x6f\x63\x2f\x6c\x61\x74\x65\ +\x73\x74\x2f\x50\x52\x4f\x5f\x68\x75\x73\x68\x2f\x3c\x2f\x73\x70\ +\x61\x6e\x3e\x3c\x62\x72\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x6c\x69\ +\x3e\x0a\x3c\x2f\x75\x6c\x3e\x0a\x20\x20\x3c\x68\x32\x20\x73\x74\ +\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\ +\x22\x3e\x54\x68\x65\x20\x47\x72\x61\x70\x68\x69\x63\x61\x6c\x20\ +\x55\x73\x65\x72\x20\x49\x6e\x74\x65\x72\x66\x61\x63\x65\x3c\x2f\ +\x68\x32\x3e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\x6c\x65\x3d\ +\x22\x63\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\x6c\x75\x65\ +\x3b\x22\x3e\x4f\x70\x65\x72\x61\x74\x6f\x72\x20\x50\x61\x6e\x65\ +\x6c\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x52\x61\x6d\x70\x20\x44\x65\ +\x6c\x61\x79\x3a\x20\x43\x61\x6e\x20\x74\x61\x6b\x65\x20\x6f\x6e\ +\x20\x76\x61\x6c\x75\x65\x73\x20\x66\x72\x6f\x6d\x20\x30\x2e\x30\ +\x73\x20\x74\x6f\x20\x30\x2e\x32\x73\x2e\x20\x3c\x62\x72\x3e\x0a\ +\x20\x20\x44\x65\x66\x69\x6e\x65\x73\x20\x74\x68\x65\x20\x64\x65\ +\x6c\x61\x79\x20\x62\x65\x74\x77\x65\x65\x6e\x20\x73\x65\x74\x74\ +\x69\x6e\x67\x20\x69\x6e\x64\x69\x76\x69\x64\x75\x61\x6c\x20\x71\ +\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x77\x68\x65\x6e\x20\x69\ +\x6e\x69\x74\x69\x61\x74\x69\x6e\x67\x20\x73\x74\x61\x6e\x64\x62\ +\x79\x2f\x72\x65\x73\x74\x6f\x72\x65\x2e\x0a\x20\x20\x41\x20\x76\ +\x61\x6c\x75\x65\x20\x6f\x66\x20\x30\x2e\x30\x73\x20\x6d\x65\x61\ +\x6e\x73\x20\x74\x68\x61\x74\x20\x74\x68\x65\x20\x71\x75\x61\x64\ +\x72\x75\x70\x6c\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x73\x20\x61\ +\x72\x65\x20\x73\x65\x74\x20\x73\x69\x6d\x75\x6c\x74\x61\x6e\x65\ +\x6f\x75\x73\x6c\x79\x2e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\ +\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\ +\x6c\x75\x65\x3b\x22\x3e\x45\x78\x70\x65\x72\x74\x20\x50\x61\x6e\ +\x65\x6c\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x53\x65\x6c\x65\x63\x74\ +\x69\x6e\x67\x20\x74\x68\x65\x20\x44\x72\x79\x20\x52\x75\x6e\x20\ +\x6f\x70\x74\x69\x6f\x6e\x20\x64\x69\x73\x61\x62\x6c\x65\x73\x20\ +\x73\x65\x74\x74\x69\x6e\x67\x20\x76\x61\x6c\x75\x65\x73\x20\x74\ +\x6f\x20\x65\x70\x69\x63\x73\x20\x70\x72\x6f\x63\x65\x73\x73\x20\ +\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x2e\x20\x55\x73\x65\x64\x20\ +\x66\x6f\x72\x20\x74\x65\x73\x74\x69\x6e\x67\x2e\x20\x3c\x62\x72\ +\x3e\x0a\x20\x20\x3c\x68\x33\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ +\x6f\x6c\x6f\x72\x3a\x6c\x69\x67\x68\x74\x62\x6c\x75\x65\x3b\x22\ +\x3e\x53\x61\x76\x69\x6e\x67\x20\x4f\x76\x65\x72\x76\x69\x65\x77\ +\x3c\x2f\x68\x33\x3e\x0a\x20\x20\x44\x69\x73\x70\x6c\x61\x79\x73\ +\x20\x61\x20\x6e\x75\x6d\x62\x65\x72\x20\x6f\x66\x20\x70\x72\x6f\ +\x63\x65\x73\x73\x20\x76\x61\x72\x61\x69\x62\x6c\x65\x73\x20\x72\ +\x65\x6c\x61\x74\x65\x64\x20\x74\x6f\x20\x74\x68\x65\x20\x70\x6f\ +\x77\x65\x72\x20\x73\x61\x76\x69\x6e\x67\x20\x61\x63\x63\x6f\x75\ +\x6e\x74\x69\x6e\x67\x20\x3c\x62\x72\x3e\x0a\x20\x20\x3c\x73\x70\ +\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\ +\x62\x6c\x61\x63\x6b\x3b\x20\x66\x6f\x6e\x74\x2d\x73\x74\x79\x6c\ +\x65\x3a\x69\x74\x61\x6c\x69\x63\x3b\x22\x3e\x50\x6f\x77\x65\x72\ +\x20\x53\x61\x76\x69\x6e\x67\x20\x41\x63\x63\x6f\x75\x6e\x74\x69\ +\x6e\x67\x20\x69\x73\x20\x6f\x6e\x6c\x79\x20\x61\x63\x74\x69\x76\ +\x61\x74\x65\x64\x20\x77\x68\x65\x6e\x20\x50\x52\x4f\x53\x43\x41\ +\x4e\x20\x69\x73\x20\x69\x6e\x20\x22\x50\x72\x6f\x64\x75\x6b\x74\ +\x69\x6f\x6e\x22\x20\x6d\x6f\x64\x65\x2e\x3c\x2f\x73\x70\x61\x6e\ +\x3e\x0a\x20\x20\x3c\x74\x61\x62\x6c\x65\x3e\x0a\x20\x20\x20\x20\ +\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x49\x6e\x69\x74\x69\x61\x6c\x20\ +\x50\x6f\x77\x65\x72\x20\x28\x6b\x77\x29\x3a\x3c\x2f\x74\x64\x3e\ +\x20\x3c\x74\x64\x3e\x54\x68\x65\x20\x6e\x6f\x6d\x69\x6e\x61\x6c\ +\x20\x70\x6f\x77\x65\x72\x20\x76\x61\x6c\x75\x65\x20\x77\x68\x65\ +\x6e\x20\x71\x75\x61\x64\x72\x75\x70\x6c\x65\x73\x20\x61\x72\x65\ +\x20\x69\x6e\x20\x74\x68\x65\x20\x75\x73\x75\x61\x6c\x20\x70\x6f\ +\x77\x65\x72\x65\x64\x2d\x6f\x6e\x20\x73\x74\x61\x74\x65\x2e\x3c\ +\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\x20\x20\x3c\x74\ +\x72\x3e\x3c\x74\x64\x3e\x50\x6f\x77\x65\x72\x20\x28\x6b\x77\x29\ +\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\x3e\x54\x68\x65\x20\x63\ +\x75\x72\x72\x65\x6e\x74\x20\x70\x6f\x77\x65\x72\x20\x76\x61\x6c\ +\x75\x65\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x53\x61\x76\x69\x6e\x67\ +\x20\x28\x4d\x57\x68\x29\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\ +\x3e\x54\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x70\x6f\x77\ +\x65\x72\x20\x76\x61\x6c\x75\x65\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\ +\x74\x72\x3e\x0a\x20\x20\x20\x20\x3c\x74\x72\x3e\x3c\x74\x64\x3e\ +\x54\x69\x6d\x65\x20\x69\x6e\x20\x53\x61\x76\x69\x6e\x67\x20\x4d\ +\x6f\x64\x65\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\x64\x3e\x54\x69\ +\x6d\x65\x20\x65\x6c\x61\x70\x73\x65\x64\x20\x69\x6e\x20\x63\x75\ +\x72\x72\x65\x6e\x74\x20\x73\x61\x76\x69\x6e\x67\x20\x70\x65\x72\ +\x69\x6f\x64\x20\x28\x64\x61\x79\x73\x20\x68\x6f\x75\x72\x73\x3a\ +\x6d\x69\x6e\x75\x74\x65\x73\x3a\x73\x65\x63\x6f\x6e\x64\x73\x29\ +\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\x20\x20\ +\x3c\x74\x72\x3e\x3c\x74\x64\x3e\x54\x6f\x74\x20\x53\x61\x76\x65\ +\x64\x20\x28\x4d\x57\x68\x29\x3a\x3c\x2f\x74\x64\x3e\x20\x3c\x74\ +\x64\x3e\x54\x68\x65\x20\x61\x63\x63\x75\x6d\x75\x6c\x61\x74\x65\ +\x64\x20\x70\x6f\x77\x65\x72\x20\x73\x61\x76\x65\x64\x20\x69\x6e\ +\x20\x74\x68\x65\x20\x63\x61\x6c\x65\x6e\x64\x61\x72\x20\x79\x65\ +\x61\x72\x2e\x3c\x2f\x74\x64\x3e\x3c\x2f\x74\x72\x3e\x0a\x20\x20\ +\x3c\x2f\x74\x61\x62\x6c\x65\x3e\x20\x0a\x20\x20\x0a\x20\x20\x0a\ +\x20\x20\x0a\x0a\x0a\x0a\x0a\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\ +\x2f\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x33\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x34\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ +\x00\x00\x00\xa7\ +\x3c\ +\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ +\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ +\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ +\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x32\x20\x6f\ +\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ +\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ +\x22\x70\x61\x67\x65\x33\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ +\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ +\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ +\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ +\x68\x74\x6d\x6c\x3e\x0a\ \x00\x00\x00\x80\ \x3c\ \x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ @@ -32,118 +255,10 @@ qt_resource_data = b"\ \x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ \x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ \x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x32\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x33\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x33\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x34\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x00\xa7\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x57\x65\x62\x20\x48\x65\x6c\x70\x3c\x2f\x74\x69\x74\x6c\ -\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\x64\x79\x3e\ -\x0a\x0a\x3c\x70\x3e\x3c\x62\x3e\x50\x61\x67\x65\x20\x31\x20\x6f\ -\x66\x20\x77\x65\x62\x20\x68\x65\x6c\x70\x3c\x2f\x62\x3e\x3c\x2f\ -\x70\x3e\x0a\x3c\x70\x3e\x20\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\ -\x22\x70\x61\x67\x65\x32\x2e\x68\x74\x6d\x6c\x22\x3e\x20\x4e\x65\ -\x78\x74\x3c\x2f\x61\x3e\x3c\x2f\x70\x3e\x0a\x3c\x70\x3e\x3c\x62\ -\x3e\x65\x74\x63\x2e\x2e\x2e\x3c\x2f\x62\x3e\x20\x65\x74\x63\x2e\ -\x2e\x2e\x3c\x2f\x70\x3e\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\x3c\x2f\ -\x68\x74\x6d\x6c\x3e\x0a\ -\x00\x00\x03\x29\ -\x3c\ -\x68\x74\x6d\x6c\x3e\x3c\x68\x65\x61\x64\x3e\x3c\x74\x69\x74\x6c\ -\x65\x3e\x48\x61\x6e\x64\x73\x6f\x6d\x65\x20\x50\x6f\x77\x65\x72\ -\x20\x55\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x69\x6e\ -\x67\x20\x48\x69\x65\x72\x61\x72\x63\x68\x79\x20\x61\x74\x20\x50\ -\x72\x6f\x73\x63\x61\x6e\x2c\x20\x48\x55\x53\x48\x21\x3c\x2f\x74\ -\x69\x74\x6c\x65\x3e\x3c\x2f\x68\x65\x61\x64\x3e\x0a\x3c\x62\x6f\ -\x64\x79\x3e\x0a\x0a\x3c\x68\x35\x20\x20\x73\x74\x79\x6c\x65\x3d\ -\x22\x63\x6f\x6c\x6f\x72\x3a\x67\x72\x61\x79\x3b\x22\x3e\x4a\x61\ -\x6e\x75\x61\x72\x79\x20\x32\x30\x32\x34\x2c\x20\x4a\x61\x6e\x20\ -\x43\x68\x72\x69\x6e\x3c\x2f\x68\x35\x3e\x0a\x3c\x68\x34\x3e\x20\ -\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\ -\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\x3c\x2f\x73\x70\x61\ -\x6e\x3e\x61\x6e\x64\x73\x6f\x6d\x65\x20\x3c\x73\x70\x61\x6e\x20\ -\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x67\x72\ -\x61\x79\x3b\x22\x3e\x50\x6f\x77\x65\x72\x3c\x2f\x73\x70\x61\x6e\ -\x3e\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\ -\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x55\x3c\x2f\x73\ -\x70\x61\x6e\x3e\x73\x61\x67\x65\x20\x61\x6e\x64\x20\x3c\x73\x70\ -\x61\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\ -\x20\x72\x65\x64\x3b\x22\x3e\x53\x3c\x2f\x73\x70\x61\x6e\x3e\x61\ -\x76\x69\x6e\x67\x20\x3c\x73\x70\x61\x6e\x20\x73\x74\x79\x6c\x65\ -\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\x72\x65\x64\x3b\x22\x3e\x48\ -\x3c\x2f\x73\x70\x61\x6e\x3e\x69\x65\x72\x61\x72\x63\x68\x79\x20\ -\x61\x74\x20\x50\x72\x6f\x73\x63\x61\x6e\x2c\x20\x3c\x73\x70\x61\ -\x6e\x20\x73\x74\x79\x6c\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x20\ -\x72\x65\x64\x3b\x22\x3e\x48\x55\x53\x48\x21\x3c\x2f\x73\x70\x61\ -\x6e\x3e\x3c\x2f\x68\x34\x3e\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\ -\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\ -\x41\x62\x6f\x75\x74\x3c\x2f\x68\x32\x3e\x0a\x0a\x3c\x70\x3e\x54\ -\x68\x69\x73\x20\x3c\x62\x3e\x48\x55\x53\x48\x21\x3c\x2f\x62\x3e\ -\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x69\x6e\x68\ -\x65\x72\x69\x74\x73\x20\x66\x72\x6f\x6d\x20\x74\x68\x65\x20\x57\ -\x69\x6e\x64\x6f\x77\x20\x62\x61\x73\x65\x20\x63\x6c\x61\x73\x73\ -\x2e\x3c\x62\x72\x3e\x20\x20\x0a\x3c\x70\x3e\x69\x6e\x66\x6f\x72\ -\x6d\x61\x74\x69\x6f\x6e\x20\x63\x6f\x6e\x63\x65\x72\x6e\x69\x6e\ -\x67\x20\x74\x68\x69\x73\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\ -\x6f\x6e\x2c\x20\x73\x75\x63\x68\x20\x61\x73\x20\x63\x6f\x6e\x66\ -\x69\x67\x75\x72\x61\x74\x69\x6f\x6e\x20\x70\x61\x72\x61\x6d\x65\ -\x74\x65\x72\x73\x20\x6f\x72\x20\x6f\x74\x68\x65\x72\x2c\x20\x6d\ -\x61\x79\x20\x62\x65\x20\x65\x6e\x74\x65\x72\x65\x64\x2c\x20\x65\ -\x2e\x67\x2e\x2c\x20\x3c\x61\x20\x68\x72\x65\x66\x3d\x22\x70\x61\ -\x67\x65\x31\x2e\x68\x74\x6d\x6c\x22\x3e\x68\x65\x72\x65\x3c\x2f\ -\x61\x3e\x3c\x2f\x70\x3e\x0a\x0a\x3c\x68\x32\x20\x73\x74\x79\x6c\ -\x65\x3d\x22\x63\x6f\x6c\x6f\x72\x3a\x62\x6c\x75\x65\x3b\x22\x3e\ -\x54\x68\x65\x20\x50\x61\x6e\x65\x6c\x3c\x2f\x68\x32\x3e\x0a\x0a\ -\x3c\x70\x3e\x54\x68\x65\x73\x65\x20\x77\x65\x62\x20\x70\x61\x67\ -\x65\x73\x20\x61\x72\x65\x20\x74\x6f\x20\x62\x65\x20\x63\x6f\x6d\ -\x70\x6c\x65\x74\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x61\x70\ -\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x20\x6f\x77\x6e\x65\x72\x2e\ -\x3c\x62\x72\x3e\x0a\x0a\x0a\x0a\x0a\x3c\x2f\x62\x6f\x64\x79\x3e\ -\x3c\x2f\x68\x74\x6d\x6c\x3e\x0a\ " qt_resource_name = b"\ \x00\x0a\ -\x08\x8a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x35\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x7a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x34\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x5a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x32\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ -\x08\x6a\x34\x9c\ -\x00\x70\ -\x00\x61\x00\x67\x00\x65\x00\x33\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ -\x00\x0a\ \x08\x4a\x34\x9c\ \x00\x70\ \x00\x61\x00\x67\x00\x65\x00\x31\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ @@ -151,33 +266,49 @@ qt_resource_name = b"\ \x0c\xba\xf2\x7c\ \x00\x69\ \x00\x6e\x00\x64\x00\x65\x00\x78\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x6a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x33\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x5a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x32\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x8a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x35\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ +\x00\x0a\ +\x08\x7a\x34\x9c\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x34\x00\x2e\x00\x68\x00\x74\x00\x6d\x00\x6c\ " qt_resource_struct_v1 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\ -\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x02\x85\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x01\x2f\ -\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xda\ -\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x84\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x03\x30\ +\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xb2\ +\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x07\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe1\ +\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x5d\ +\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\xab\ " qt_resource_struct_v2 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x02\x85\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5b\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x01\x2f\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5c\ -\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x01\xda\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5e\ -\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x84\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x5f\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x8d\x9c\xeb\xd9\x61\ -\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x03\x30\ -\x00\x00\x01\x8d\xa7\xc7\x77\x2b\ +\x00\x00\x01\x8d\xc6\x98\xaa\x4d\ +\x00\x00\x00\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xb2\ +\x00\x00\x01\x8d\xc6\x98\xaa\x50\ +\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x07\ +\x00\x00\x01\x8d\xc6\x98\xaa\x52\ +\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xe1\ +\x00\x00\x01\x8d\xc6\x98\xaa\x54\ +\x00\x00\x00\x68\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x5d\ +\x00\x00\x01\x8d\xc6\x98\xaa\x55\ +\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\xab\ +\x00\x00\x01\x8d\xd0\x41\x77\x24\ " qt_version = QtCore.qVersion().split('.') diff --git a/src/gui.py b/src/gui.py index dc6d803..fe93188 100644 --- a/src/gui.py +++ b/src/gui.py @@ -1,5 +1,6 @@ '''The GUI module for Savings Overview and magnet control ''' +import decimal import getpass import os import random @@ -14,15 +15,21 @@ from qtpy.QtWidgets import ( QMessageBox, QPushButton, QTabBar, QTabWidget, QTableWidgetItem, QTextEdit, QWidget) -import elog +from common.packages import elog from apps4ops.bdbase.utils import _line from apps4ops.bdbase.enumkind import MsgSeverity from caqtwidgets.pvwidgets import ( - CAQLabel, CAQLineEdit, CAQMenu, CAQMessageButton, CAQTableWidget, QHLine) + CAQLabel, CAQLineEdit, CAQMenu, CAQMessageButton, CAQTableWidget, + CAQTextEntry, QHLine) _pymodule = os.path.basename(__file__) +file_path = elog.__file__ + +# storing the directory in dir variable +dir = os.path.dirname(file_path) +print(dir) class AppGui(QWidget): '''The GUI class @@ -36,7 +43,7 @@ class AppGui(QWidget): self.check_status = self.parent.check_status self.check_status_list = self.parent.check_status_list self.elog_enum = self.parent.elog_enum - + self.input_parameters = self.parent.input_parameters # Required for caqtwidgets self.settings = self.parent.settings self.show_log_message = self.parent.show_log_message @@ -50,12 +57,12 @@ class AppGui(QWidget): self.gui_frame.expert_parameters_group.setFixedWidth(260) self.gui_frame.expert_parameters_group.setFixedHeight(130) self.gui_frame.operator_parameters_group.setFixedWidth(260) - if "Controlroom" in self.settings.data["Master"]: - self.gui_frame.operator_parameters_group.setFixedHeight(160) - else: - self.gui_frame.operator_parameters_group.setFixedHeight(130) + #if "Controlroom" in self.settings.data["Master"]: + # self.gui_frame.operator_parameters_group.setFixedHeight(160) + #else: + self.gui_frame.operator_parameters_group.setFixedHeight(130) self.gui_frame.measurement_tab_wgt.setFixedWidth(440) - self.gui_frame.measurement_tab_wgt.setFixedHeight(240) + self.gui_frame.measurement_tab_wgt.setFixedHeight(200) # self.gui_frame.operator_wgt.setFixedHeight(240) # self.gui_frame.expert_wgt.setFixedHeight(240) @@ -69,22 +76,21 @@ class AppGui(QWidget): self.gui_frame.central_tab_widget.tabBar().setTabText(0, "Control") #self.gui_frame.central_tab_widget.tabBar().setTabText(1, "IOC") - #wgt = self.gui_frame.central_tab_widget.widget(1) - #lay = self.gui_frame.central_tab_widget.widget(1).layout() - + if "Controlroom" in self.assigned_master: + ''' shift_type = CAQMenu(self, pv_name="PRO-HUSH:SHIFT-TYPE") self.gui_frame.operator_parameters_group.layout().insertWidget( 0, QLabel(" Shift Type:")) self.gui_frame.operator_parameters_group.layout().insertWidget( 1, shift_type) - + ''' self.gui_frame.results_wgt.setFixedWidth(1400) - self.gui_frame.results_wgt.setFixedHeight(400) + self.gui_frame.results_wgt.setFixedHeight(860) self.gui_frame.results_wgt.setLayout(self.gui_frame.results_layout) - self.gui_frame.results_layout.addWidget( self.reset_ioc_sm(), 0, 0, 1, 1) + sec_prefix_list = [ sub[0: sub.index("-")] for sub in self.sec_state_list] @@ -101,8 +107,14 @@ class AppGui(QWidget): label.setScaledContents(True) self.gui_frame.results_layout.addWidget(label, 0, 2, 1, 1, Qt.AlignTop) - self.gui_frame.results_layout.setContentsMargins(15, 15, 15, 15) + self.gui_frame.results_layout.setVerticalSpacing(20) + self.gui_frame.results_layout.setHorizontalSpacing(10) + + self.gui_frame.results_layout.addWidget( + self.reset_lastpwr(), 1, 0, 1, 1, + Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignCenter)) + self.expert_labels = self.parent.expert_labels self.settings = self.parent.settings @@ -113,8 +125,6 @@ class AppGui(QWidget): self.table_pwr_dict = {} self.offtime_dict = {} - # self.I_min = 0.002 HIPA - self.cafe.openPrepare() self.cafe.open(["PRO-HUSH:LASTPWR", "PRO-HUSH:TOTPWR", "PRO:LASTSAVE", "PPO-HUSH:TOTSAVE"]) @@ -122,39 +132,51 @@ class AppGui(QWidget): self.cafe.openNowAndWait(0.1) self.magnet_tab_wgt = self.group_sector_qtabwidget() + self.magnet_tab_wgt.setFixedHeight(380) self.gui_frame.measurement_layout.addWidget( - self.magnet_tab_wgt, 0, 2, 6, 20, alignment=Qt.AlignTop) + self.magnet_tab_wgt, 0, 2, 3, 2, alignment=Qt.AlignTop) - idx = self.magnet_tab_wgt.count() - 1 + self.submastership_dict = { + "G1": None, "G2": None, "O2": None, "PIF": None, "G3": None} + + _row = self.gui_frame.measurement_layout.rowCount() + self.gui_frame.measurement_layout.addWidget( + self.group_submaster_status(), _row, 2, 2, 2, + Qt.AlignTop|Qt.AlignHCenter) + + self.sh_idx = self.magnet_tab_wgt.count() - 1 for i in range(0, self.magnet_tab_wgt.count()): tabtext = self.magnet_tab_wgt.tabText(i) if tabtext == "SH": - idx = i + self.sh_idx = i break - self.magnet_tab_wgt.setCurrentIndex(idx) + self.magnet_tab_wgt.setCurrentIndex(self.sh_idx) status_wgt = self.group_sector_status() status_wgt.setFixedHeight(340) + + #qf = QFrame() + #qf.setFixedHeight(15) + #self.gui_frame.measurement_layout.addWidget(qf, 2, 0, 1, 1) self.gui_frame.measurement_layout.addWidget( - status_wgt, 3, 0, 2, 1, alignment=Qt.AlignTop) # | Qt.AlignHCenter) + status_wgt, 1, 0, 4, 1, alignment=Qt.AlignTop) # | Qt.AlignHCenter) - qf = QFrame() - qf.setFixedHeight(5) - self.gui_frame.measurement_layout.addWidget( - qf, 2, 0, 1, 1, alignment=Qt.AlignTop) + #qf = QFrame() + #qf.setFixedHeight(1) + #self.gui_frame.measurement_layout.addWidget(qf, 5, 0, 1, 1) qf1 = QFrame() - qf1.setFixedWidth(10) + qf1.setFixedWidth(1) self.gui_frame.measurement_layout.addWidget( - qf1, 4, 1, 2, 1, alignment=Qt.AlignTop) + qf1, 5, 1, 1, 1, alignment=Qt.AlignTop) - #qf2 = QFrame() - #qf2.setFixedWidth(1) - #self.gui_frame.measurement_layout.addWidget( - # qf2, 0, 22, 1, 1, alignment=Qt.AlignTop) + qf2 = QFrame() + qf2.setFixedWidth(1) + self.gui_frame.measurement_layout.addWidget( + qf2, 0, 7, 1, 1, alignment=Qt.AlignTop) # Overload from guiheader.py self.sector_disruptor_dict = {} @@ -166,12 +188,20 @@ class AppGui(QWidget): self.sector_disruptor_dict["G3"] = "Geschlossen" def enable_disable_beamline(sect, sector_line, value): - + def is_submaster(local_sector): + if local_sector in self.submastership_dict: + return bool( + "MASTERSHIP" in self.submastership_dict[local_sector]) + #"UNDEF" in self.submastership_dict[local_sector]) + #"Geschlossen" in self.submastership_dict[local_sector]) + else: + return self.gui_header.is_master() + self.sector_disruptor_dict[sect] = value #print("sect/value", sect, value) for sector in sector_line: if "Geschlossen" not in self.sector_disruptor_dict[ - sector] or not self.gui_header.is_master(): + sector] or not is_submaster(sector): #not self.gui_header.is_master(): #print("sector/value", sector, value) #print("isMaster", self.gui_header.is_master()) #print("master", self.gui_header.mastership) @@ -185,7 +215,6 @@ class AppGui(QWidget): sector].restore_value_button.isEnabled(): self.table_sol_dict[ sector].restore_value_button.setEnabled(False) - else: print("Geschlossen? sector/value/ismaster", sector, value, self.gui_header.mastership) @@ -291,27 +320,56 @@ class AppGui(QWidget): "B1B2"].restore_value_button.isEnabled(): self.table_sol_dict[ "B1B2"].restore_value_button.setEnabled(True) - + + ''' if "B1B2" in self.settings.data["headerMagnetSector"]: self.gui_header.shift_type.trigger_monitor_str.connect( receive_b1b2_update) #holds shifttype pvd = self.cafe.getPVCache( self.settings.data["B1B2"]["status"], dt="str") - receive_b1b2_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + receive_b1b2_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + ''' # end overload from guiheader.py - @Slot() + + @Slot() + def receive_master_update(value, status, alarm_severity): + idx = self.sh_idx + for key, wgt_val in self.gui_header.master_to_wgt.items(): + #master = self.gui_header.beam_current_wgt_group[wgt_val] + if value in key: + for i in range(0, self.magnet_tab_wgt.count()): + tabtext = self.magnet_tab_wgt.tabText(i) + if tabtext == wgt_val: + idx = i + break + self.magnet_tab_wgt.setCurrentIndex(idx) + + self.gui_header.beam_current_wgt_dict[ + "MASTER"].trigger_monitor_str.connect(receive_master_update) + pvd = self.cafe.getPVCache( + self.settings.data["MASTER"]["status"], dt="str") + try: + self.gui_header.beam_current_wgt_dict[ + "MASTER"].trigger_monitor_str.emit(pvd.value[0], pvd.status, + pvd.alarmSeverity) + except Exception as ex: + print("EMIT FAILED", str(ex)) + #print("EMIT SUCCEEDED ===========>") + #receive_master_update(pvd.value[0], pvd.status, pvd.alarmSeverity) + + @Slot(int) def simulation_update(state): if bool(state): color = self.gui_header.sim_color else: color = self.gui_header.op_color - print("SIM STATE CHANGED", state, color, flush=True) + self.gui_header.pf_off_color = color - ###JC CHANGE BACK# + ###JC COMMENT OUT TO MAKE VISIBLE WHEN TESTING# self.gui_header.color_pframe(color) - print("SIM STATE CHANGED//", state, color, flush=True) + #print("SIMULATION IS TRUE??", self.input_parameters["simulation"]) self.gui_frame.simulation_checkbox.stateChanged.connect( simulation_update) @@ -373,6 +431,77 @@ class AppGui(QWidget): print("MONITOR======>", sector, state) break + ''' + @Slot(str, int, int) + def receive_submaster_update(self, value, status, alarm_severity): + print("VALUE=========================", value, flush=True) + sender = self.sender() + print("sender, value", sender, value, flush=True) + print("sender.sector", sender.sector, flush=True) + self.submastership_dict[sender.sector] = value + print("VALUE ===============================", self.submastership_dict[sender.sector], flush=True) + ''' + + def group_submaster_status(self): + @Slot(str, int, int) + def receive_submaster_update(value, status, alarm_severity): + print("VALUE=========================", value, flush=True) + sender = self.sender() + print("sender, value", sender, value, flush=True) + print("sender.sector", sender.sector, flush=True) + self.submastership_dict[sender.sector] = value + print("VALUE ===============================", self.submastership_dict[sender.sector], flush=True) + + pv_id = "mastershipStatus" + qgrid = QGridLayout() + qgb = QGroupBox("Mastership Status") + no_beamlines = 0 + for i, sector in enumerate(self.settings.data["headerMagnetSector"]): + if "mastershipStatus" in self.settings.data[sector]: + no_beamlines += 1 + qgb_inner = QGroupBox(sector) + #qgb_inner.setFixedHeight(80) + qgb_inner.setObjectName("INNER") + text_color = self.settings.data[sector]["color"] + #print("text color", text_color) + sss = ("QGroupBox {" + "color: {0};".format(text_color) + + " font-weight: bold;}") + qgb_inner.setStyleSheet(sss) + #ql = QLabel(sector) + pv_name = self.settings.data[sector][pv_id] + print(type(pv_name)) + #pv_name = u"{0}".format(pv_name) + print("pv_name", pv_name, "in sector", sector) + pv_name = pv_name.encode('utf-8') + print(type(pv_name)) + pv_name = pv_name.decode('ascii') + qw = CAQLabel(self, pv_name=str(pv_name)) + qw.sector = sector + #self.submastership_dict[sector] = None + qw.trigger_monitor_str.connect(receive_submaster_update) + print(i, sector) + + value = self.cafe.getCache( + self.settings.data[sector][pv_id], dt='str') + qw.trigger_monitor_str.emit(value, 1, 0) + print("emitted", flush=True) + qw.setFixedWidth(120) + qw.setText("submastership") + qw_layout = QHBoxLayout() + qw_layout.addWidget(qw) + qgb_inner.setLayout(qw_layout) + #qgrid.addWidget(ql, 0, i, 1, 1, Qt.AlignBottom) + qgrid.addWidget(qgb_inner, 0, i, 1, 1, + Qt.AlignTop|Qt.AlignHCenter) + + + + qgb.setContentsMargins(9, 9, 9, 9) + qgb.setObjectName("OUTER") + qgb.setLayout(qgrid) + qgb.setFixedWidth((150 * no_beamlines) + 20) + return qgb + def group_sector_status(self): qgrid = QGridLayout() @@ -755,8 +884,9 @@ class AppGui(QWidget): sum_pwr = sum(list(row_pwr_dict.values())) pv_last_pwr = "P" + target.sector + "-HUSH:LASTPWR" - stat = self.cafe.set(pv_last_pwr, sum_pwr) - self.check_status(_pymodule, "set", pv_last_pwr, stat, _line()) + if not self.input_parameters["simulation"]: + stat = self.cafe.set(pv_last_pwr, sum_pwr) + self.check_status(_pymodule, "set", pv_last_pwr, stat, _line()) def ca_table_sector_widget(self, sector: str = ""): device_list = self.settings.data[sector]["device"] @@ -783,24 +913,43 @@ class AppGui(QWidget): #print(pv_dict['SOL:2'], flush=True) #print(_standby_values, flush=True) - table_sol = CAQTableWidget( - self, pv_list=pv_dict["SOL:2"], show_units=True, notify_freq_hz=0, - notify_unison=False, scale_factor=1, show_timestamp=False, - init_column=True, pv_list_show=device_list, standby_column=True, - standby_values=standby_values, set_delay=delay) - table_sol.restore_value_button.setToolTip( - ("Restore devices to their pre-standby values")) - table_sol.init_value_button.setToolTip( - ("Shows initial, pre-standby values. Update is also " + - "executed automatically before the standby procedure.")) - table_sol.standby_value_button.sector = sector - table_sol.standby_value_button.clicked.disconnect() - table_sol.standby_value_button.clicked.connect(self.on_sector_standby) - table_sol.restore_value_button.sector = sector - table_sol.restore_value_button.clicked.disconnect() - table_sol.restore_value_button.clicked.connect(self.on_sector_restore) + init_column = True + standby_column = True + if "B1B2" in sector: + init_column = False + standby_column = False + standby_values = None + + + table_sol = CAQTableWidget( + self, pv_list=pv_dict["SOL:2"], show_units=True, notify_freq_hz=1, + notify_unison=True, scale_factor=1, show_timestamp=False, + init_column=False) + else: + + table_sol = CAQTableWidget( + self, pv_list=pv_dict["SOL:2"], show_units=True, notify_freq_hz=0, + notify_unison=False, scale_factor=1, show_timestamp=False, + init_column=init_column, pv_list_show=device_list, + standby_column=standby_column, standby_values=standby_values, + set_delay=delay) + + if init_column: + table_sol.restore_value_button.setToolTip( + ("Restore devices to their pre-standby values")) + table_sol.init_value_button.setToolTip( + ("Shows initial, pre-standby values. Update is also " + + "executed automatically before the standby procedure.")) + + if standby_column: + table_sol.standby_value_button.sector = sector + table_sol.standby_value_button.clicked.disconnect() + table_sol.standby_value_button.clicked.connect(self.on_sector_standby) + table_sol.restore_value_button.sector = sector + table_sol.restore_value_button.clicked.disconnect() + table_sol.restore_value_button.clicked.connect(self.on_sector_restore) self.table_sol_dict[sector] = table_sol @@ -813,11 +962,13 @@ class AppGui(QWidget): self, pv_list=pv_dict["PWR"], show_units=False, notify_freq_hz=1, suffix="kW", notify_unison=True, scale_factor=0.001, show_timestamp=False, - init_column=True, init_list=pv_dict["PWR"], pv_list_show=[False]) + init_column=init_column, init_list=pv_dict["PWR"], + pv_list_show=[False]) - table_pwr.init_value_button.setToolTip( - ("Shows initial, pre-standby values. Update is also " + - "executed automatically before the standby procedure.")) + if init_column: + table_pwr.init_value_button.setToolTip( + ("Shows initial, pre-standby values. Update is also " + + "executed automatically before the standby procedure.")) self.table_pwr_dict[sector] = table_pwr @@ -828,7 +979,11 @@ class AppGui(QWidget): f = header_value.font() f.setPixelSize(13) header_item.setFont(f) - header_item.setText("Device") + if init_column: + header_item.setText("Device") + else: + header_item.setText("PV") + header_init.setFont(f) header_init.setText("Init. Value") header_standby.setFont(f) @@ -837,14 +992,20 @@ class AppGui(QWidget): header_value.setText("SOL:2") table_sol.setContentsMargins(15, 0, 15, 10) table_sol.setHorizontalHeaderItem(0, header_item) - table_sol.setHorizontalHeaderItem(1, header_init) - table_sol.setHorizontalHeaderItem(2, header_standby) - table_sol.setHorizontalHeaderItem(3, header_value) + if init_column: + table_sol.setHorizontalHeaderItem(1, header_init) + table_sol.setColumnWidth(1, 88) + if standby_column: + table_sol.setHorizontalHeaderItem(2, header_standby) + table_sol.setHorizontalHeaderItem(3, header_value) + table_sol.setColumnWidth(2, 80) + table_sol.setColumnWidth(3, 88) table_sol.setColumnWidth(0, 80) - table_sol.setColumnWidth(1, 88) - table_sol.setColumnWidth(2, 80) - table_sol.setColumnWidth(3, 88) - table_sol.setFixedWidth(386) + + if init_column: + table_sol.setFixedWidth(386) + else: + table_sol.setFixedWidth(220) ioc_magnets = [] for i, device in enumerate(device_list): @@ -871,11 +1032,16 @@ class AppGui(QWidget): header_value.setFont(f) header_value.setText("PWR") table_pwr.setContentsMargins(15, 0, 15, 10) - table_pwr.setHorizontalHeaderItem(0, header_init) - table_pwr.setHorizontalHeaderItem(1, header_value) - table_pwr.setColumnWidth(0, 88) - table_pwr.setColumnWidth(1, 88) - table_pwr.setFixedWidth(226) + if init_column: + table_pwr.setHorizontalHeaderItem(0, header_init) + table_pwr.setHorizontalHeaderItem(1, header_value) + table_pwr.setColumnWidth(0, 88) + table_pwr.setColumnWidth(1, 88) + table_pwr.setFixedWidth(226) + else: + header_value.setText("PWR:2") + table_pwr.setHorizontalHeaderItem(0, header_value) + table_pwr.setFixedWidth(140) if "Controlroom" in self.assigned_master and "B1B2" not in sector: for i in ioc_magnets: @@ -886,7 +1052,7 @@ class AppGui(QWidget): pv_status = self.settings.data[sector]["status"] beamline_status = self.cafe.getCache(pv_status) - if beamline_status is not None: + if beamline_status is not None and init_column: # in HIPA this was I < self.I_min: if "Geschlossen" in beamline_status: try: @@ -911,8 +1077,9 @@ class AppGui(QWidget): #B1B2 is not is not in state machine if "B1B2" in table_pwr.init_value_button.sector: retrun - stat = self.cafe.set(pv, init_sum) - self.check_status(_pymodule, "set", pv, stat, _line()) + if not self.input_parameters["simulation"]: + stat = self.cafe.set(pv, init_sum) + self.check_status(_pymodule, "set", pv, stat, _line()) def on_init_update(): table_pwr.init_value_button.setEnabled(False) @@ -920,10 +1087,11 @@ class AppGui(QWidget): time.sleep(0.1) table_pwr.init_value_button.setEnabled(True) - table_sol.init_value_button.sector = sector - table_sol.init_value_button.clicked.connect(on_sol_update) - table_pwr.init_value_button.sector = sector - table_pwr.init_value_button.clicked.connect(on_init_update) + if init_column: + table_sol.init_value_button.sector = sector + table_sol.init_value_button.clicked.connect(on_sol_update) + table_pwr.init_value_button.sector = sector + table_pwr.init_value_button.clicked.connect(on_init_update) hbox = QHBoxLayout() hbox.addWidget(table_sol) @@ -1006,8 +1174,9 @@ class AppGui(QWidget): if not sector_prefix: return pv1 = sector_prefix + "-HUSH:SEQ-ONOFF" - stat = self.cafe.set(pv1, 0) - self.check_status(_pymodule, "set", pv1, stat, _line()) + if not self.input_parameters["simulation"]: + stat = self.cafe.set(pv1, 0) + self.check_status(_pymodule, "set", pv1, stat, _line()) time.sleep(0.05) QApplication.processEvents() return @@ -1018,10 +1187,11 @@ class AppGui(QWidget): pv1 = sector_prefix + "-HUSH:SEQ-ONOFF" pv2 = sector_prefix + "-HUSH:TOTSAVE" pv3 = sector_prefix + "-HUSH:OFFTIME" - stat = self.cafe.set(pv1, 0) - self.check_status(_pymodule, "set", pv1, stat, _line()) - off_time = self.cafe.get(pv3) - self.check_status(_pymodule, "get", pv3, None, _line()) + if not self.input_parameters["simulation"]: + stat = self.cafe.set(pv1, 0) + self.check_status(_pymodule, "set", pv1, stat, _line()) + off_time = self.cafe.get(pv3) + self.check_status(_pymodule, "get", pv3, None, _line()) iloop = 0 if off_time is not None: @@ -1033,11 +1203,13 @@ class AppGui(QWidget): QApplication.processEvents() else: time.sleep(0.1) + print("SECTOR ILOOP", sector_prefix, iloop) - stat = self.cafe.set(pv1, 1) - self.check_status(_pymodule, "set", pv1, stat, _line()) - stat = self.cafe.set(pv2, 0) - self.check_status(_pymodule, "set", pv2, stat, _line()) + if not self.input_parameters["simulation"]: + stat = self.cafe.set(pv1, 1) + self.check_status(_pymodule, "set", pv1, stat, _line()) + stat = self.cafe.set(pv2, 0) + self.check_status(_pymodule, "set", pv2, stat, _line()) return def reset_ioc_saving(self, sector_prefix_list: list = None): @@ -1050,10 +1222,11 @@ class AppGui(QWidget): qpb.setFixedWidth(160) qtext = QTextEdit() - qtext.setText("""
  The Reset Account Button resets Total Power Saved (MWh) to zero.
-   This is typically executed at the end of the calendar year.
-   The present energy saving figures will be entered into the elogbook.
-   The button prompts the user for confirmation before proceeding.
+ qtext.setText("""
  The Reset Account Button resets Total + Power Saved (MWh) to zero.
  This is typically executed + at the end of the calendar year.
  The present energy + saving figures will be entered into the elogbook.
  The + button prompts the user for confirmation before proceeding.
""") qtext.setReadOnly(True) qtext.setStyleSheet("background-color: QColor(0, 0, 50, 10);") @@ -1127,3 +1300,78 @@ class AppGui(QWidget): qw.setFixedHeight(280) return qw + + + + def reset_lastpwr(self): + sector_label = [None] * len(self.sec_state_list) + pv_initpwr = [None] * len(self.sec_state_list) + pv_lastpwr = [None] * len(self.sec_state_list) + + + + qgrid = QGridLayout() + qsection = QLabel("Section") + qsection.setAlignment(Qt.AlignmentFlag(Qt.AlignBottom|Qt.AlignHCenter)) + qnominal = QLabel("Nominal \n Value (kW)") + qnominal.setAlignment(Qt.AlignmentFlag(Qt.AlignBottom|Qt.AlignHCenter)) + qset = QLabel("Set Value (kW)") + qset.setAlignment(Qt.AlignmentFlag(Qt.AlignBottom|Qt.AlignHCenter)) + #f = qsection.font() + #f.setPixelSize(16) + #qsection.setFont(f) + #qnominal.setFont(f) + #qset.setFont(f) + + qgrid.addWidget(qsection, 0, 0, 1, 1) + qgrid.addWidget(qnominal, 0, 1, 1, 1) + qgrid.addWidget(qset, 0, 2, 1, 1) + + for i, pv in enumerate(self.sec_state_list): + pvsplit = pv.split("-") + sector = pvsplit[0][1:] + sum_pwr = round(sum(self.settings.data[sector]["pwrref"]), 3) + pv_initpwr_value = decimal.Decimal(format(sum_pwr, '.3f')) + pv_lastpwr_name = pv.replace("STATE", "LASTPWR") + + qsector = QLabel(sector + ":") + f = qsector.font() + f.setPixelSize(14) + qsector.setFont(f) + color = "black" + try: + color = self.settings.data[sector]["color"] + except KeyError as ex: + print(ex, self.settings.data[sector]) + + weight = "bold" if sector in self.settings.data[ + "headerMagnetSector"] else "medium" + color_str = "color : {0}; font-weight:{1};".format(color, weight) + incolor = "QLabel {" + color_str + "}" + + qsector.setStyleSheet(incolor) + + sector_label[i] = qsector + ql = QLabel(str(pv_initpwr_value)) + ql.setFont(f) + pv_initpwr[i] = ql + pv_lastpwr[i] = CAQTextEntry(self, pv_name=pv_lastpwr_name) + + qgrid.addWidget(sector_label[i], i + 1, 0, 1, 1, Qt.AlignCenter) + qgrid.addWidget(pv_initpwr[i], i + 1, 1, 1, 1, Qt.AlignRight) + qgrid.addWidget(pv_lastpwr[i], i + 1, 2, 1, 1, Qt.AlignLeft) + + + qgrid.setContentsMargins(9, 9, 9, 9) + qgrid.setSpacing(10) + + qw = QGroupBox("Last Power") + qw.setContentsMargins(5, 10, 5, 0) + qw.setAlignment(Qt.AlignTop) + qw.setObjectName("OUTER") + qw.setLayout(qgrid) + qw.setFixedWidth(250) + qw.setFixedHeight(280) + + return qw +