import sys import os import tkinter as tk from tkinter import ttk import RPi.GPIO as GPIO # Add the parent directory to the module search path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from interface_board_pins import * # Import pin assignments def create_control_tab(notebook, adc, shift_reg, pwm1, pwm2): frame = ttk.Frame(notebook) notebook.add(frame, text="Controls") digital_input_states = [tk.StringVar(value="LOW") for _ in range(8)] digital_output_states = [tk.BooleanVar(value=False) for _ in range(8)] adc_values = [tk.StringVar(value="0.00V") for _ in range(8)] pwm_values = [tk.IntVar(value=0), tk.IntVar(value=0)] def update_inputs(): for i, pin in enumerate(GPIO_DIGITAL_INPUTS.values()): digital_input_states[i].set("HIGH" if GPIO.input(pin) else "LOW") frame.after(500, update_inputs) def update_adc(): for i, adc_channel in enumerate(ADC_CHANNELS.values()): value = adc.read(adc_channel) adc_values[i].set(f"{round(value * 12 / 4095, 2)}V") frame.after(1000, update_adc) def toggle_output(index): shift_reg.set_pin(index, digital_output_states[index].get()) def update_pwm(channel, value): duty_cycle = int(float(value)) if channel == 0: pwm1.ChangeDutyCycle(duty_cycle) else: pwm2.ChangeDutyCycle(duty_cycle) # UI Layout style = ttk.Style() style.configure("TScale", thickness=30) # Increases slider thickness control_frame = ttk.Frame(frame, padding=30) control_frame.pack(expand=True, fill="both") for i in range(8): ttk.Label(control_frame, text=f"ADC {i+1}:", font=("Arial", 14)).grid(row=i, column=0, sticky="e") ttk.Label(control_frame, textvariable=adc_values[i], width=10, font=("Arial", 14)).grid(row=i, column=1, sticky="w") ttk.Label(control_frame, text=f"IN {i+1}:", font=("Arial", 14)).grid(row=i, column=2, sticky="e") ttk.Label(control_frame, textvariable=digital_input_states[i], width=6, font=("Arial", 14)).grid(row=i, column=3, sticky="w") btn = ttk.Checkbutton(control_frame, text=f"OUT {i+1}", variable=digital_output_states[i], command=lambda i=i: toggle_output(i)) btn.grid(row=i, column=4, sticky="w") for i in range(2): ttk.Label(control_frame, text=f"PWM{i+1}:", font=("Arial", 14)).grid(row=i, column=5, sticky="e") slider = ttk.Scale(control_frame, from_=0, to=100, orient="horizontal", length=400, variable=pwm_values[i], command=lambda val, i=i: update_pwm(i, val), style="TScale") slider.grid(row=i, column=6, sticky="w", pady=10) # Added spacing with `pady=10` update_inputs() update_adc()