more safe value checking

This commit is contained in:
Martin Zietz
2021-02-03 16:40:45 +01:00
parent 5cbd5bb69f
commit 1847df859c
3 changed files with 132 additions and 52 deletions
+56 -11
View File
@@ -1,5 +1,6 @@
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import globals as g
import cage_func as func
import numpy as np
@@ -264,7 +265,7 @@ class Configuration(Frame):
port_vars = [self.XY_port, self.Z_port]
row = 0
for text in entry_texts:
field = ttk.Entry(port_frame, textvariable=port_vars[row])
field = Entry(port_frame, textvariable=port_vars[row])
field.grid(row=row, column=1, sticky=W)
axis_label = Label(port_frame, text=text, padx=5, pady=10)
axis_label.grid(row=row, column=0, sticky=W)
@@ -293,7 +294,7 @@ class Configuration(Frame):
"Arduino Pins:": [[IntVar() for _ in range(3)], "-", "Should be 15, 16, 17", "relay_pin", 1]
}
self.update_fields() # set current values from config file
self.fields = {}
# Fill in header (axis names):
col = 1
@@ -304,9 +305,11 @@ class Configuration(Frame):
# generate table with entries, unit labels and descriptions:
row = 1
for key in self.entries.keys():
self.fields[key] = []
for axis in range(3): # generate entry fields
field = ttk.Entry(value_frame, textvariable=self.entries[key][0][axis], width=10)
field = Entry(value_frame, textvariable=self.entries[key][0][axis], width=10)
field.grid(row=row, column=axis+1, sticky=W, padx=2)
self.fields[key].append(field) # safe access to field for use elsewhere
axis_label = Label(value_frame, text=key, padx=5, pady=5)
axis_label.grid(row=row, column=0, sticky=W)
unit_label = Label(value_frame, text=self.entries[key][1])
@@ -317,6 +320,10 @@ class Configuration(Frame):
row_counter += 1
print(self.fields)
self.update_fields() # set current values from config file
Label(self, text="", pady=10).grid(row=row_counter, column=0) # add spacer
row_counter += 1
@@ -359,23 +366,61 @@ class Configuration(Frame):
factor = self.entries[key][4] # get unit conversion factor
self.entries[key][0][i].set(round(type_value * factor, 3)) # set value with correct unit conversion
def implement(self): # update config file with user inputs into entry fields and reinitialize
# ToDo: Warning messages if too high values are entered
value_check = func.value_in_limits(g.AXIS_NAMES[i], self.entries[key][3], value)
if value_check == 'OK':
self.fields[key][i].config(background="White")
else:
self.fields[key][i].config(background="Red")
def implement(self): # update config file with user inputs into entry fields and reinitialize
# set serial ports for PSUs:
func.edit_config("PORTS", "xy_port", self.XY_port.get())
func.edit_config("PORTS", "z_port", self.Z_port.get())
# set numeric values for all axes
for key in self.entries.keys(): # go through rows of entry table
for i in [0, 1, 2]: # go through columns of entry table
for i in [0, 1, 2]: # go through columns of entry table (axes)
try:
value = self.entries[key][0][i].get() # get value from field
factor = self.entries[key][4] # get unit conversion factor
if factor not in [0, 1]: # prevent conversion of int variables to float and div/0
value = value / factor # do unit conversion
func.edit_config(g.AXIS_NAMES[i], self.entries[key][3], value) # write new value to config file
except TclError as e:
except TclError as e: # wrong format entered, e.g. text in number fields
func.ui_print("Invalid entry for %s %s %s" % (g.AXIS_NAMES[i], key, e))
else: # format is ok
factor = self.entries[key][4] # get unit conversion factor
if factor not in [0, 1]: # prevent div/0 and conversion of int variables to float
value = value / factor # do unit conversion
# Check if value is within safe limits
config_key = self.entries[key][3] # handle by which value is indexed in config file
value_ok = func.value_in_limits(g.AXIS_NAMES[i], config_key, value)
unit = self.entries[key][1] # get unit string for error messages
if value_ok == 'OK':
func.edit_config(g.AXIS_NAMES[i], config_key, value) # write new value to config file
else: # value is not within limits
if value_ok == 'HIGH':
max_value = g.default_arrays[config_key][1][i] # get max value
message = "Attempted to set too high value for {s} {k}\n" \
"{v} {unit}, max. {mv} {unit} allowed. Excessive values may damage equipment!\n" \
"Do you really want to use this value?"\
.format(s=g.AXIS_NAMES[i], k=key, v=value*factor, mv=round(max_value*factor, 1), unit=unit)
elif value_ok == 'LOW':
min_value = g.default_arrays[config_key][2][i] # get min value
message = "Attempted to set too low value for {s} {k}\n" \
"{v} {unit}, min. {mv} {unit} allowed. Excessive values may damage equipment!\n" \
"Do you really want to use this value?"\
.format(s=g.AXIS_NAMES[i], k=key, v=value*factor, mv=round(min_value*factor, 1), unit=unit)
else: message = "Unknown case, this should not happen."
# display pop-up message to ask user if he really wants the value
answer = messagebox.askquestion("Value out of Bounds", message)
# becomes 'yes' or 'no' depending on user choice
if answer == 'yes': # user really wants the value
# call function to write new value to config file with override=True
func.edit_config(g.AXIS_NAMES[i], config_key, value, True)
# if user chooses 'no' nothing happens, old value is kept
func.setup_axes() # reinitialize devices and program with new values
self.update_fields() # update entry fields to show new values