Made imports more consistent

This commit is contained in:
2021-08-02 22:21:29 +02:00
parent 4827d07b6d
commit 11b5ea4e36
9 changed files with 76 additions and 71 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
from src.arduino import Arduino
import src.config_handling as config
from src.user_interface import ui_print
from src.utility import ui_print
import src.globals as g
+5 -5
View File
@@ -8,11 +8,11 @@ import traceback
from tkinter import messagebox
# import other project files
from user_interface import ui_print
from ps2000b import PS2000B
from arduino import Arduino
import config_handling as config
import globals as g
from src.utility import ui_print
from src.ps2000b import PS2000B
from src.arduino import Arduino
import src.config_handling as config
import src.globals as g
class Axis:
+11 -11
View File
@@ -6,10 +6,10 @@ from configparser import ConfigParser
from tkinter import messagebox
# import other project files:
import globals as g
import cage_func as func
# noinspection PyPep8Naming
import user_interface as ui
import src.globals as g
import src.cage_func as func
from src.utility import ui_print
from src.user_interface import HardwareConfiguration
global CONFIG_FILE # string storing the path of the used config file
global CONFIG_OBJECT # object of type ConfigParser(), storing all configuration information
@@ -34,7 +34,7 @@ def read_from_config(section, key, config_object): # read a specific value from
value = section_obj[key] # get relevant value in the section
return value
except KeyError as e: # a section or key was used, that does not exist
ui.ui_print("Error while reading config file:", e)
ui_print("Error while reading config file:", e)
raise KeyError("Could not find key", key, "in config file.")
@@ -71,22 +71,22 @@ def edit_config(section, key, value, override=False): # edit a specific value i
try:
section_obj = CONFIG_OBJECT[section] # get relevant section in the config
except KeyError: # there is no such section
ui.ui_print("Could not find section", section, "in config file, creating new.")
ui_print("Could not find section", section, "in config file, creating new.")
CONFIG_OBJECT.add_section(section) # create the missing section
section_obj = CONFIG_OBJECT[section] # get the object of the section
try:
section_obj[key] = str(value) # set value for correct entry in the section
except KeyError: # there is no entry with this key
ui.ui_print("Could not find key", key, "in config file, creating new.")
ui_print("Could not find key", key, "in config file, creating new.")
CONFIG_OBJECT.set(section, key, str(value)) # create the entry and set the value
except KeyError as e: # key for section or specific value does not exist in the dictionary for max/min values
ui.ui_print("Error while editing config file:", e)
ui_print("Error while editing config file:", e)
raise KeyError("Could not find key", key, "in config file.") # return an error
def check_config(config_object): # check all numeric values in the config and see if they are within safe limits
ui.ui_print("Checking config file for values exceeding limits:")
ui_print("Checking config file for values exceeding limits:")
concerns = {} # initialize dictionary for found problems
problem_counter = 0 # count the number of values that exceed limits
@@ -105,13 +105,13 @@ def check_config(config_object): # check all numeric values in the config and s
if len(concerns[axis]) == 0: # no problems were found for this axis
concerns[axis].append("No problems detected.")
ui.ui_print(axis, ":", *concerns[axis]) # print out results for this axis
ui_print(axis, ":", *concerns[axis]) # print out results for this axis
i += 1
if problem_counter > 0: # some values are not ok
# shop pup-up warning message:
messagebox.showwarning("Warning!", "Found %i value(s) exceeding limits in config file. Check values "
"to ensure correct operation and avoid equipment damage!" % problem_counter)
g.app.show_frame(ui.Configuration) # open configuration window so user can check values
g.app.show_frame(HardwareConfiguration) # open configuration window so user can check values
def reset_config_to_default(): # reset values in config object to defaults (set in globals.py)
+5 -5
View File
@@ -9,8 +9,8 @@ from tkinter import filedialog
from tkinter import messagebox
# import other project files
import globals as g
import user_interface as ui
import src.globals as g
from src.utility import ui_print
log_data = pd.DataFrame() # pandas data frame containing the logged data, in-program representation of csv/excel data
unsaved_data = False # Bool to indicate if there is unsaved data, set to True each time a datapoint is logged
@@ -71,7 +71,7 @@ def select_file(): # select a file to write logs to
defaultextension=[("Comma Separated Values", "*.csv*")])
if filepath == '': # this happens when file selection window is closed without selecting a file
ui.ui_print("No file selected, can't save logged data.")
ui_print("No file selected, can't save logged data.")
return None
else: # a valid file name was entered
return filepath
@@ -81,7 +81,7 @@ def write_to_file(dataframe, filepath):
# get global variables for use in this function:
global unsaved_data
if filepath is not None: # user has selected a file and no errors occurred
ui.ui_print("Writing logged data to file", filepath)
ui_print("Writing logged data to file", filepath)
try:
# write data collected in log_data DataFrame to csv file in german excel format:
dataframe.to_csv(filepath, index=False, sep=';', decimal=',')
@@ -93,7 +93,7 @@ def write_to_file(dataframe, filepath):
messagebox.showerror("Error!", message)
else: # no exceptions occurred
unsaved_data = False # tell everything that there is no unsaved data remaining
ui.ui_print("Log data saved to", filepath)
ui_print("Log data saved to", filepath)
def clear_logged_data(): # clears all logged data from data frame
+12 -12
View File
@@ -11,26 +11,28 @@ from tkinter import messagebox
import matplotlib.pyplot as plt
# import other project files:
import user_interface as ui
import cage_func as func
import globals as g
from src.utility import ui_print
import src.user_interface as ui
import src.cage_func as func
import src.globals as g
class ExecCSVThread(Thread):
# main class for executing a CSV sequence
# it inherits the threading.Thread class, enabling sequence execution in a separate thread
def __init__(self, array, parent, controller):
def __init__(self, array, parent, controller, logging_enabled):
Thread.__init__(self)
self.array = array # numpy array containing data from csv to be executed
self.parent = parent # object from which this class is called, here the ExecuteCSVMode object of the UI
self.controller = controller # object on which mainloop() is running, usually the main UI window
self.logging_enabled = logging_enabled
self.__stop_event = Event() # event which can be set to stop the thread execution if needed
def run(self): # called to start the execution of the thread
ui.ui_print("\nStarting Sequence Execution...")
ui_print("\nStarting Sequence Execution...")
self.execute_sequence(self.array, 0.1, self.parent, self.controller) # run sequence
# when the sequence has ended, reset buttons on the UI:
if not g.exitFlag: # main window is open
@@ -72,11 +74,9 @@ class ExecCSVThread(Thread):
parent.arduino_override.get())
if all_connected:
field_vec = array[i, 1:4] # extract desired field vector
ui.ui_print("%0.5f s: t = %0.2f s, target field vector ="
ui_print("%0.5f s: t = %0.2f s, target field vector ="
% (time.time() - t_zero, array[i, 0]), field_vec * 1e6, "\u03BCT")
func.set_field(field_vec) # send field vector to test bench
controller.StatusDisplay.update_labels() # update status display after change
# ToDo: display update takes a long time, remove for performance?
# log change to the log file if user has selected event logging in the Configure Logging window
logger = controller.pages[ui.ConfigureLogging] # get object of logging configurator
@@ -91,15 +91,15 @@ class ExecCSVThread(Thread):
time.sleep(delay) # sleep to give other threads time to run
if not self.stopped() and not g.exitFlag and all_connected: # sequence ended without interruption
ui.ui_print("Sequence executed, powering down channels.")
ui_print("Sequence executed, powering down channels.")
elif all_connected: # interrupted by user
ui.ui_print("Sequence cancelled, powering down channels.")
ui_print("Sequence cancelled, powering down channels.")
elif not all_connected: # interrupted by device error
ui.ui_print("Error with at least one device, sequence aborted.")
ui_print("Error with at least one device, sequence aborted.")
messagebox.showwarning("Device Error!", "Error with at least one device, sequence aborted.")
else: # if this happens there is a mistake in the logic above, it really should not
# tell the user something weird happened:
ui.ui_print("Encountered unexpected sequence end state:"
ui_print("Encountered unexpected sequence end state:"
"\nThread Stopped:", self.stopped(), ", Application Closed:", g.exitFlag,
", Devices connected:", all_connected)
messagebox.showwarning("Unexpected state",
+9 -10
View File
@@ -6,14 +6,13 @@ import traceback
from tkinter import messagebox
# import other project files:
import cage_func as func
from user_interface import HelmholtzGUI
from user_interface import ui_print
import user_interface as ui
import globals as g
import config_handling as config
import csv_logging as log
from socket_control import SocketInterfaceThread
import src.cage_func as func
import src.globals as g
import src.config_handling as config
import src.csv_logging as log
from src.user_interface import HelmholtzGUI, ExecuteCSVMode
from src.socket_control import SocketInterfaceThread
from src.utility import ui_print
def program_end(): # called on exception or when user closes application
@@ -21,8 +20,8 @@ def program_end(): # called on exception or when user closes application
g.exitFlag = True # tell everything else the application has been closed
if g.app is not None: # the main Tkinter app object has been initialized before
if g.app.pages[ui.ExecuteCSVMode].csv_thread is not None: # check if a thread for executing CSVs exists
g.app.pages[ui.ExecuteCSVMode].csv_thread.stop() # stop the thread
if g.app.pages[ExecuteCSVMode].csv_thread is not None: # check if a thread for executing CSVs exists
g.app.pages[ExecuteCSVMode].csv_thread.stop() # stop the thread
func.shut_down_all() # shut down devices
+4 -4
View File
@@ -1,11 +1,11 @@
import globals as g
from user_interface import ui_print
import cage_func as cage_controls
from threading import Thread
import socket
import numpy as np
import src.globals as g
from src.utility import ui_print
import src.cage_func as cage_controls
# --- Definition of TCP interface ---
#
# Clients should by default initialize a TCP connection to port 6677
+12 -23
View File
@@ -17,11 +17,12 @@ import threading
from datetime import datetime
# import other project files:
import globals as g
import cage_func as func
import csv_threading as csv
import config_handling as config
import csv_logging as log
import src.globals as g
import src.cage_func as func
import src.csv_threading as csv
import src.config_handling as config
import src.csv_logging as log
from src.utility import ui_print
# define font styles:
HEADER_FONT = ("Arial", 13, "bold")
@@ -55,7 +56,7 @@ class HelmholtzGUI(Tk):
# switching between pages is done with show_frame() method
self.pages = {} # dictionary for storing all pages (different modes, displayed in main area)
for P in [ManualMode, Configuration, ExecuteCSVMode, ConfigureLogging]: # do this for every mode page
for P in [ManualMode, HardwareConfiguration, ExecuteCSVMode, ConfigureLogging]: # do this for every mode page
page = P(mainArea, self) # initialize the page with the mainArea frame as the parent
self.pages[P] = page # add the page to the dictionary
page.grid(row=0, column=0, sticky="nsew") # place all pages in the same place in the GUI
@@ -102,7 +103,7 @@ class TopMenu:
@staticmethod
def configuration(window): # switch to the settings page
window.show_frame(Configuration)
window.show_frame(HardwareConfiguration)
@staticmethod
def execute_csv_mode(window): # switch to the CSV execution page
@@ -459,7 +460,8 @@ class ExecuteCSVMode(Frame):
# More info: https://www.tutorialspoint.com/python/python_multithreading.htm
g.threadLock = threading.Lock() # create thread locking object, used to ensure all devices switch at once later
# create thread object:
self.csv_thread = csv.ExecCSVThread(self.sequence_array, self, self.controller)
self.csv_thread = csv.ExecCSVThread(self.sequence_array, self, self.controller, logging_enabled)
self.csv_thread.start() # start thread
def stop_run(self): # called on stop button press, interrupts sequence execution
@@ -499,8 +501,8 @@ class ExecuteCSVMode(Frame):
plotCanvas.get_tk_widget().grid(row=0, column=0, sticky="nesw") # place canvas in the UI
class Configuration(Frame):
# generate settings window to set program constants
class HardwareConfiguration(Frame):
"""Settings window to set program constants"""
# noinspection PyUnusedLocal
def __init__(self, parent, controller):
@@ -1125,16 +1127,3 @@ class OutputConsole(Frame):
# link scrollbar to the console
scrollbar.config(command=self.console.yview)
self.console.config(yscrollcommand=scrollbar.set)
def ui_print(*content): # prints text to built-in console, use exactly like normal print()
output = "" # initialize output as empty string
for text in content: # go through all elements to be printed
output = " ".join((output, str(text))) # add element to the output string
if not g.exitFlag: # application is still running --> output window is visible
output = "".join(("\n", output)) # begin new line each time
g.app.OutputConsole.console.insert(END, output) # print to console
g.app.OutputConsole.console.see(END) # scroll console to bottom
else: # if window is not open, do normal print
print(output)
+17
View File
@@ -0,0 +1,17 @@
from tkinter import END
import src.globals as g
def ui_print(*content):
"""prints text to built-in console, use exactly like normal print(). Requires the ui to be initialized"""
output = "" # initialize output as empty string
for text in content: # go through all elements to be printed
output = " ".join((output, str(text))) # add element to the output string
if not g.exitFlag and g.app is not None: # application is still running --> output window is visible
output = "".join(("\n", output)) # begin new line each time
g.app.OutputConsole.console.insert(END, output) # print to console
g.app.OutputConsole.console.see(END) # scroll console to bottom
else: # if window is not open, do normal print
print(output)