202 lines
7.4 KiB
Python
Executable File
202 lines
7.4 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import IsegLibrary as iseg
|
|
import os
|
|
import datetime
|
|
import csv
|
|
import socket
|
|
|
|
#assign a port, to prevent the script run mulitple time
|
|
s = socket.socket()
|
|
host = socket.gethostname()
|
|
port = 4305
|
|
s.bind((host,port))
|
|
|
|
#===================== GUI
|
|
import PySimpleGUI as sg
|
|
|
|
#gui.theme('DarkAmber')
|
|
|
|
header = ["name", "HV [V]", "Current [mA]"]
|
|
|
|
chList = iseg.GetChList()
|
|
hvList = iseg.GetAllHV() # get all V
|
|
iList = iseg.GetAllCurrent() # get all current
|
|
outVList = iseg.GetAllOutputHV()
|
|
outIList = iseg.GetAllLC()
|
|
onOffList = iseg.GetAllOnOff()
|
|
|
|
modChList = iseg.SplitChList(chList)
|
|
|
|
nMod = len(modChList)
|
|
nChannel = len(chList)
|
|
updateTime = 60 #sec
|
|
|
|
fileName = ''
|
|
|
|
layoutTab = []
|
|
for k in range(0, nMod):
|
|
layoutTab.append([])
|
|
|
|
for k in range(0, nMod):
|
|
|
|
baseI = 0
|
|
for kk in range(0, k):
|
|
baseI += len(modChList[kk])
|
|
|
|
## i know it is stupid to have this every time, but pysimplegui request a non-used array
|
|
layoutTab[k].append([
|
|
sg.Text("Name", size = 8, justification = "center" ),
|
|
sg.Text("CH", size = 4, justification = "center" ),
|
|
sg.Text("On/Off", size = 6, justification = "center"),
|
|
sg.Text("Set V [V]", size = 8, justification = "center" ),
|
|
sg.Text("Set I [mA]", size = 9, justification = "center" ),
|
|
sg.Text("Out V [V]", size = 8, justification = "center" ),
|
|
sg.Text("Out I [uA]", size = 10, justification = "center" )
|
|
])
|
|
|
|
for j in range(0, len(modChList[k])) :
|
|
|
|
i = baseI + j
|
|
|
|
layoutTab[k].append(
|
|
[
|
|
sg.Input(default_text='', size = 8, justification = "left", key=("n%d" % chList[i])),
|
|
sg.Text("u"+str(chList[i]), size = 4, justification = "center" ),
|
|
sg.Checkbox('', default = onOffList[i], size = 3, enable_events = True, key=("c%d" % chList[i])),
|
|
sg.Input(default_text=("%.3f" % hvList[i]), size = 8, justification = "right", enable_events=True, key=("v%d" % chList[i]) ),
|
|
sg.Input(default_text=("%.3f" % (iList[i]*1000)), size = 9, justification = "right", enable_events=True, key=("i%d" % chList[i]) ),
|
|
sg.Input(default_text=("%.3f" % outVList[i]), size = 8, justification = "right", enable_events=True, key=("a%d" % chList[i]), readonly = True ),
|
|
sg.Input(default_text=("%.3f" % (outIList[i]*1e6)), size = 10, justification = "right", enable_events=True, key=("b%d" % chList[i]), readonly = True )
|
|
]
|
|
)
|
|
|
|
layoutTabGroup = []
|
|
layoutTabGroup.append([])
|
|
for k in range(0, nMod):
|
|
layoutTabGroup[0].append(sg.Tab("Mod-%0d" % k, layoutTab[k]))
|
|
|
|
layout = [
|
|
[
|
|
sg.Text("refresh period [sec] :", size = 27, justification = "right"),
|
|
sg.Input(updateTime, size = 8, justification = "right", enable_events=True, key=("-Refresh-"))
|
|
]
|
|
,
|
|
[
|
|
sg.TabGroup(layoutTabGroup)
|
|
]
|
|
]
|
|
|
|
layout.append([sg.FileSaveAs('Save As', target = '-Save-', initial_folder='~', file_types = (('csv file','*.csv'),)),
|
|
sg.FileBrowse('Load', target = '-Load-', initial_folder='~', file_types = (('csv file','*.csv'),)),
|
|
sg.Input(default_text=fileName, expand_x = True, justification = "left", readonly = True, enable_events=True, key="-Save-" ),
|
|
sg.Input('', visible = False, enable_events=True, key="-Load-" )
|
|
])
|
|
|
|
comboList = ["Get Rise Rate [V/s]", "Get Fall Rate [V/s]", "Set Rise Rate [V/s]", "Set Fall Rate [V/s]"]
|
|
layout.append([sg.Combo(comboList, default_value = comboList[0], size = 20, enable_events=True, key="-VRateCombo-"),
|
|
sg.Text("Ch:", size = 3),
|
|
sg.Combo(chList, default_value = chList[0], size = 4, enable_events=True, key="-VRateCh-"),
|
|
sg.Input('', size = 6, justification = "right", enable_events=True, key="-VRate-")
|
|
])
|
|
|
|
window = sg.Window('Iseg HV Control & Monitor', layout, finalize = True, keep_on_top = True)
|
|
|
|
#for i in range(0, nChannel):
|
|
# window[("v%d" % chList[i])].bind("<Return>", "_Enter")
|
|
# window[("i%d" % chList[i])].bind("<Return>", "_Enter")
|
|
# window[("v%d" % chList[i])].bind("<KP_Enter>", "_Enter")
|
|
# window[("i%d" % chList[i])].bind("<KP_Enter>", "_Enter")
|
|
|
|
# Event Loop to process "events" and get the "values" of the inputs
|
|
while True:
|
|
event, values = window.read(timeout = updateTime * 1000, timeout_key = "_TIMEOUT_") ## this pause for 20 sec and wait for event
|
|
#print(event)
|
|
#print(values)
|
|
#print(datetime.datetime.now())
|
|
|
|
if event == "-Refresh-" :
|
|
updateTime = int(window[event].get());
|
|
|
|
if event in (None, 'Exit'):
|
|
break
|
|
|
|
if event[0:1] == 'c' :
|
|
ID = event[1:]
|
|
iseg.SwitchOnHV(int(ID), int(window[event].get()))
|
|
|
|
if event == '-Save-' :
|
|
fileName = values["Save As"]
|
|
outfile = open(fileName, "w")
|
|
csv_writer = csv.writer(outfile)
|
|
for i in range(0, nChannel):
|
|
papap = [window[("n%d" % chList[i])].get(), "u"+str(chList[i]), window[("v%d" % chList[i])].get(), window[("i%d" % chList[i])].get()]
|
|
csv_writer.writerow( papap )
|
|
outfile.close();
|
|
|
|
if event == "-Load-" :
|
|
fileName = window["-Load-"].get()
|
|
window['-Save-'].update(fileName)
|
|
infile = open(fileName, "r")
|
|
csv_reader = csv.reader(infile)
|
|
i = 0
|
|
for row in csv_reader:
|
|
window[("n%d" % chList[i])].update(row[0])
|
|
window[("v%d" % chList[i])].update(row[2])
|
|
window[("i%d" % chList[i])].update(row[3])
|
|
iseg.SetHV(chList[i], float(row[2]))
|
|
iseg.SetCurrent(chList[i], float(row[3])/1000)
|
|
i += 1
|
|
|
|
if event in ["-VRateCombo-", "-VRateCh-", "-VRate-"]:
|
|
item = window["-VRateCombo-"].get()
|
|
ch = window["-VRateCh-"].get()
|
|
val = window["-VRate-"].get()
|
|
if item == comboList[0]:
|
|
window["-VRate-"].update("%.3f" % float(iseg.GetHVRiseRate(int(ch))))
|
|
if item == comboList[1]:
|
|
window["-VRate-"].update("%.3f" % float(iseg.GetHVFallRate(int(ch))))
|
|
if item == comboList[2]:
|
|
iseg.SetHVRiseRate(ch, val)
|
|
window["-VRate-"].update("%.3f" % float(iseg.GetHVRiseRate(int(ch))))
|
|
if item == comboList[3]:
|
|
iseg.SetHVFallRate(ch, val)
|
|
window["-VRate-"].update("%.3f" % float(iseg.GetHVFallRate(int(ch))))
|
|
|
|
haha = event.find('_Enter')
|
|
if haha > 0 :
|
|
ID = event[:haha]
|
|
ch = int(ID[1:])
|
|
if event[0:1] == 'v' :
|
|
iseg.SetHV(ch, float(window[ID].get()))
|
|
window[ID].update("%.3f" % iseg.GetHV(ch))
|
|
if event[0:1] == 'i' :
|
|
iseg.SetCurrent(ch, float(window[ID].get())/1000.)
|
|
window[ID].update("%.3f" % (iseg.GetCurrent(ch)*1000))
|
|
|
|
|
|
if event == "_TIMEOUT_" :
|
|
#hvList = GetAllHV() # get all V
|
|
#iList = GetAllCurrent() # get all current
|
|
outVList = iseg.GetAllOutputHV()
|
|
outIList = iseg.GetAllLC()
|
|
|
|
tempFile = open("temp.dat", "w")
|
|
|
|
for i in range(0, nChannel):
|
|
#window[("v%d" % chList[i])].update("%.3f" % hvList[i])
|
|
#window[("i%d" % chList[i])].update("%.3f" % (iList[i]*1000))
|
|
window[("a%d" % chList[i])].update("%.3f" % outVList[i])
|
|
window[("b%d" % chList[i])].update("%.3f" % (outIList[i]*1e6))
|
|
#==== To DataBase
|
|
tempFile.write("Voltage,Ch=%d value=%f\n" % (chList[i], outVList[i]))
|
|
tempFile.write("LeakageCurrent,Ch=%d value=%f\n" % (chList[i], outIList[i]*1e6))
|
|
|
|
tempFile.close()
|
|
|
|
os.system("curl -XPOST http://128.186.111.107:8086/write?db=testing --data-binary @temp.dat")
|
|
|
|
|
|
window.close()
|
|
|