From d0649a1af50bc8bb1ecfa214290600a12b3fd5c9 Mon Sep 17 00:00:00 2001 From: Markus Koller Date: Thu, 23 Feb 2023 15:17:20 +0100 Subject: [PATCH] Added compensate field checkbox, minor adaptation --- src/csv_threading.py | 8 ++++++-- src/user_interface.py | 20 +++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/csv_threading.py b/src/csv_threading.py index bd3dd75..999da1a 100644 --- a/src/csv_threading.py +++ b/src/csv_threading.py @@ -71,6 +71,8 @@ class ExecCSVThread(Thread): all_connected = (parent.xy_override.get() or g.CAGE_DEVICE.psu1 is not None) and\ (parent.z_override.get() or g.CAGE_DEVICE.psu2 is not None) and\ (parent.arduino_override.get() or g.CAGE_DEVICE.arduino is not None) + compensate_field = parent.compensated_field_var.get() + # True or False depending on devices status, checks for some devices may be overridden by user if not all_connected: ui_print("Required devices are not present, sequence aborted.") @@ -96,8 +98,10 @@ class ExecCSVThread(Thread): field_vec[1] * 1e6, field_vec[2] * 1e6, target_t)) - self.cage_dev.set_field_compensated(field_vec) # send field vector to test bench - + if compensate_field: + self.cage_dev.set_field_compensated(field_vec) # send field vector to test bench + else: + self.cage_dev.set_field_raw(field_vec) # send field vector to test bench # 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 if logger.event_logging: # data should be logged when test bench is commanded diff --git a/src/user_interface.py b/src/user_interface.py index 92063e5..cbc4b5d 100644 --- a/src/user_interface.py +++ b/src/user_interface.py @@ -410,6 +410,7 @@ class ExecuteCSVMode(Frame): self.xy_override = BooleanVar(value=False) # True to disable connection check for XY PSU self.z_override = BooleanVar(value=False) # True to disable connection check for Z PSU self.arduino_override = BooleanVar(value=False) # True to disable connection check for arduino + self.compensated_field_var = BooleanVar(value=True) # Generate CSV sequence variables self.rot_vector_vars = [DoubleVar(value=1), DoubleVar(value=0), DoubleVar(value=0)] @@ -484,6 +485,9 @@ class ExecuteCSVMode(Frame): arduino_checkbox = Checkbutton(self.checkbox_frame, text="Arduino", variable=self.arduino_override, onvalue=True, offvalue=False) arduino_checkbox.grid(row=0, column=3, padx=3) + self.compensate_checkbox = Checkbutton(self.checkbox_frame, text="Compensate ambient field", + variable=self.compensated_field_var, onvalue=True, offvalue=False) + self.compensate_checkbox.grid(row=1, column=1, columnspan=3, pady=5, sticky="nw") row_counter += 1 @@ -688,6 +692,7 @@ class ExecuteCSVMode(Frame): self.plot_canvas = FigureCanvasTkAgg(figure, self.plot_frame) # create canvas to draw figure on self.plot_canvas.draw() # equivalent to matplotlib.show() self.plot_canvas.get_tk_widget().grid(row=0, column=0, sticky="nesw") # place canvas in the UI + def export_csv_sequence(self): # Generate and export csv sequence # Generate rotation data @@ -723,13 +728,13 @@ class ExecuteCSVMode(Frame): def generate_csv_sequence(self): ui_print("Generate CSV File: started generating csv file from user inputs.") + # Iteration limit for while loop trying to find rotation solution + interation_limit = 100 # Some fixed values rot_center_geom_mean_max = 100 # [µT] Maximum geometric mean rot_center_default = [0, 0, 0] # [µT] rot_mag_default = 100 # [µT] rot_mag_max = 180 # [µT] - rot_rate_default = 1 # [deg/s] - rot_rate_max = 360 # [deg/s] rot_time_step_default = 1 # [s] rot_time_step_min = 0.2 # [s] # Initialize and get vectors @@ -778,7 +783,7 @@ class ExecuteCSVMode(Frame): ui_print("Warning: Time step cannot be zero. Setting default automatically.") rot_time_step = rot_time_step_default elif rot_time_step < rot_time_step_min: - ui_print("Warning: Time step too small. Setting default automatically.") + ui_print("Warning: Time step too small (<{:.3f}). Setting default automatically.".format(rot_time_step_min)) rot_time_step = rot_time_step_default self.rot_time_step_vars.set("{:.3f}".format(rot_time_step)) # Check cycle number @@ -807,7 +812,7 @@ class ExecuteCSVMode(Frame): except RuntimeWarning as w: ui_print("Calculating the cycle time yielded: ", w) i = i + 1 - if i == 1000: + if i == interation_limit: ui_print( "Warning: the user inputs for a rotation rate yield no solution. Rate reset to last working input.") # Resetting to last working condition @@ -815,13 +820,6 @@ class ExecuteCSVMode(Frame): r[i] = float(self.rot_rate_last_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -] self.rot_rate_vars[i].set(self.rot_rate_last_vars[i].get()) if tau_solution >= 0 or abs(func_integral(tau_solution)) <= 0.5: - tmp = r - for i in range(len(r)): - tmp[i] = float(self.rot_rate_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -] - print(tmp) - for i in range(len(r)): - tmp[i] = float(self.rot_rate_last_vars[i].get()) # [deg/s, deg/s^2, deg/s^3, deg/s, 1/s, -] - print(tmp) # Storing last working inputs for i in range(len(r)): self.rot_rate_last_vars[i].set(self.rot_rate_vars[i].get())