diff --git a/integration/Window.py b/integration/Window.py index 5f2ff0199cdafb0d9718021ee2a4eb98aabea3b8..fd9b1a27ef676159e91e1c41fb86961f31049a09 100644 --- a/integration/Window.py +++ b/integration/Window.py @@ -47,23 +47,27 @@ class Window: label4 = tk.Label(self.frame4, text="Section 4") label4.place(relx=0.5, rely=0.5, anchor='center') - #self.imu_thread = threading.Thread(target=self.initial_IMU) - #self.emg_thread = threading.Thread(target=self._initialise_EMG_graph) - #self.emg_thread.start() - #self.imu_thread.start() + self.imu_thread = threading.Thread(target=self.initial_IMU) + self.emg_thread = threading.Thread(target=self._initialise_EMG_graph) + self.emg_thread.start() + self.imu_thread.start() + + self.emg_data_1 = [-1] * 41 self.emg_data_2 = [-1] * 41 - self.initial_IMU() - self._initialise_EMG_graph() + #self.initial_IMU() + #self._initialise_EMG_graph() + self.display_IMU_thread=threading.Thread(target=self.update_display) + self.display_EMG_thread=threading.Thread(target=self.EMG_Display) def initial_IMU(self): # Serial Port Setup if'COM6' in self.ports:#port maybe different on different laptop - self.arduino = serial.Serial('COM6', 115200) + self.label2 = tk.Label(self.frame2, text="Port: COM6 ") self.label2.place(relx=0.35, rely=0.8, anchor='center') self.label1 = tk.Label(self.frame2, @@ -89,6 +93,7 @@ class Window: sleep(1) # Conversions + self.transmitting = False self.toRad = 2 * np.pi / 360 self.toDeg = 1 / self.toRad @@ -160,16 +165,23 @@ class Window: # self.emg_label = tk.Label(self.frame1, text="Average EMG: 0", font=("Arial", 14)) # self.emg_label.pack(pady=10) + self.roll_label = tk.Label(self.frame2, text="roll is : " ) + self.roll_label.config(font=("Arial", 12)) + self.roll_label.place(relx=0.2, rely=0.3, anchor='w') + self.pitch_label = tk.Label(self.frame2, text="pitch is : " ) + self.pitch_label.config(font=("Arial", 12)) + self.pitch_label.place(relx=0.2, rely=0.4, anchor='w') + self.yaw_label = tk.Label(self.frame2, text="yaw is : " ) + self.yaw_label.config(font=("Arial", 12)) + self.yaw_label.place(relx=0.2, rely=0.5, anchor='w') - # Initialize the data transmission flag - self.transmitting = False def _initialise_EMG_graph(self): if 'COM5' in self.ports:#port maybe different on different laptop - self.arduino_EMG = serial.Serial('COM5', 9600,timeout=1) + self.label2 = tk.Label(self.frame3, text="Port: COM5 ") self.label2.place(relx=0.23, rely=0.8, anchor='center') self.label1 = tk.Label(self.frame3, @@ -193,6 +205,7 @@ class Window: self.label1.place(relx=0.5, rely=0.9, anchor='center') # Create a figure and axis + self.EMG_transmitting = False fig = Figure(figsize=((self.width / 200), (self.height / 200))) # Adjusting figsize based on frame size self.ax1 = fig.add_subplot(111) @@ -228,32 +241,61 @@ class Window: self.canvas1 = FigureCanvasTkAgg(fig, master=self.frame4) self.canvas1.draw() self.canvas1.get_tk_widget().pack(fill=tk.BOTH, expand=True) + self.EMG_Display() + + self.outer_EMG_label = tk.Label(self.frame3, text=f"EMG for Extensor Carpi Ulnaris is :") + self.outer_EMG_label.config(font=("Arial", 12)) + self.outer_EMG_label.place(relx=0.1, rely=0.2, anchor='w') + self.outer_EMG_Number = tk.Label(self.frame3, text="",fg="red") + self.outer_EMG_Number.config(font=("Arial", 12)) + self.outer_EMG_Number.place(relx=0.2, rely=0.3, anchor='w') + self.inner_EMG_label = tk.Label(self.frame3, text=f"EMG for Flexor Carpi Radialis is :") + self.inner_EMG_label.config(font=("Arial", 12)) + self.inner_EMG_label.place(relx=0.1, rely=0.4, anchor='w') + self.inner_EMG_Number = tk.Label(self.frame3, text="",fg="blue") + self.inner_EMG_Number.config(font=("Arial", 12)) + self.inner_EMG_Number.place(relx=0.2, rely=0.5, anchor='w') + self.gesture_label = tk.Label(self.frame3, text=f"Gesture is :") + self.gesture_label.config(font=("Arial", 12)) + self.gesture_label.place(relx=0.1, rely=0.6, anchor='w') + + - self.EMG_transmitting = False def start_data_transmission(self): # Set the transmitting flag to True and start the update loop + self.arduino = serial.Serial('COM6', 115200) self.transmitting = True self.update_display() def start_EMG_data_transmission(self): # Set the transmitting flag to True and start the update loop + self.arduino_EMG = serial.Serial('COM5', 9600, timeout=1) self.EMG_transmitting = True self.EMG_Display() def disconnect(self): self.transmitting = False + self.root.after_cancel(self.update_display_id) + if self.arduino is not None: + self.arduino.close() + self.arduino = None def EMG_disconnect(self): self.EMG_transmitting = False + self.root.after_cancel(self.EMG_display_id) + if self.arduino_EMG is not None: + self.arduino_EMG.close() + self.arduino_EMG = None def update_display(self): if self.transmitting: try: - while self.arduino.inWaiting() > 0: + while ((self.arduino.inWaiting() > 0)and + (self.transmitting==True)): dataPacket = self.arduino.readline() dataPacket = dataPacket.decode() cleandata = dataPacket.replace("\r\n", "") @@ -273,15 +315,9 @@ class Window: pitch = -math.asin(2 * (q0 * q2 - q3 * q1)) yaw = -math.atan2(2 * (q0 * q3 + q1 * q2), 1 - 2 * (q2 * q2 + q3 * q3)) - roll_label=tk.Label(self.frame2, text="roll is : "+str(roll)) - roll_label.config(font=("Arial", 12)) - roll_label.place(relx=0.2, rely=0.3, anchor='w') - pitch_label=tk.Label(self.frame2, text="pitch is : "+str(pitch)) - pitch_label.config(font=("Arial", 12)) - pitch_label.place(relx=0.2, rely=0.4, anchor='w') - yaw_label=tk.Label(self.frame2, text="yaw is : "+str(yaw)) - yaw_label.config(font=("Arial", 12)) - yaw_label.place(relx=0.2, rely=0.5, anchor='w') + self.roll_label.config( text="roll is : "+str(roll)) + self.pitch_label.config(text="pitch is : "+str(pitch)) + self.yaw_label.config(text="yaw is : "+str(yaw)) # Rotation matrices Rz = np.array([ @@ -374,16 +410,24 @@ class Window: print(f"An error occurred: {e}") # Call update_display() again after 50 milliseconds - self.root.after(50, self.update_display) + self.update_display_id =self.root.after(50, self.update_display) def EMG_Display(self): if self.EMG_transmitting: try: + while ((self.arduino_EMG.inWaiting() > 0) and + (self.EMG_transmitting == True)): data = self.arduino_EMG.readline() emg_data = self._decode(data) if emg_data is not None: print(f"EMG 1: {emg_data[0]} , EMG 2: {emg_data[1]}") + + self.outer_EMG_Number.config(text=f"{emg_data[0]}") + self.inner_EMG_Number.config(text=f"{emg_data[1]}") + + + # Append the new data to the lists self.emg_data_1.append(emg_data[0]) @@ -403,7 +447,7 @@ class Window: # Call update_display() again after 50 milliseconds - self.root.after(50, self.EMG_Display) + self.EMG_display_id=self.root.after(50, self.EMG_Display) def _decode(self, serial_data): serial_string = serial_data.decode(errors="ignore")