Read-Sensor-Resistances/toplevel.py

184 lines
6.3 KiB
Python
Raw Normal View History

2022-05-15 19:48:22 +00:00
"""
Top level script to prompt user for inputs, and then make those input as a .json file so that other modules can use it.
to run stuff. This module can have the frontend UI merged into, or can have separate one but should be the first things
to call from frontend before running other stuff.
"""
from datetime import datetime
from threading import *
import os, json, sys, subprocess
import serial.tools.list_ports
import numpy as np
import tkinter as tk
HEIGHT = 800
WIDTH = 800
def main():
#################### USER INPUTS ###########################
# TODO: if there is already a setting.json exist, loads all inputs from there as 'default'
# 9840
2022-05-19 06:19:37 +00:00
resistors = [int(text3.get()), int(text4.get()), 0, 0, 0] # resisters for each An port, where n is an integer from 0-3. Use 0 if none. in Ohms
2022-05-15 19:48:22 +00:00
input_voltage = 5
adjusted_volt = 5
port = get_devices()[0]
# typical window size: 480
window_size = 480
#################### END USER INPUTS ########################
# filename, disable customize name but should inform the user the current name of the data file on the front end
# alternatively, could be default input if no other input given. But if there is might have problem...
dat_folder = "RecordedData"
os.makedirs(dat_folder, exist_ok=True)
filename = os.path.join(os.getcwd(), dat_folder, f"{datetime.now().strftime('%Y-%m-%d_%H%M%S')}.csv")
resolution = 1023 # Arduino's analogRead()'s input resolution. We don't change this number usually.
delay = 1000 # millisec pe r data, defined in the firmware
if not (len(resistors) == 5):
raise ValueError(f"expecting 5 resistor values, but got {len(resistors)}!!!")
gen_settings(resistors, input_voltage, adjusted_volt, port, filename, resolution, window_size, delay)
return filename
def gen_settings(resistors, input_voltage, adjusted_volt, port, filename, resolution, window_size, delay):
name = "settings.json"
settings = {}
settings["refRes"] = resistors
settings["sensor_ports"] = np.where(np.array(resistors) > 0)[0].tolist()
settings["v_src"] = input_voltage
settings["v_in"] = adjusted_volt
settings["port"] = port
settings["resolution"] = resolution
settings["winSize"] = window_size
settings["file_name"] = filename
settings["delay"] = delay
open(name, 'w').write(json.dumps(settings, indent=4))
open(filename, "a", newline="", encoding="utf-8")
def get_devices():
ports = [comport.device for comport in serial.tools.list_ports.comports()] # get all available ports
if not ports:
raise ConnectionError("No devices detected!") # TODO: set to writerandomvalues.py thing instead raise error
return ports
# for scheduler maybe?
def task1():
print("run task 1")
# exec(open("read_arduino.py").read())
run_t1 = ["start", sys.executable, "read_arduino.pyw"]
out1 = subprocess.Popen(run_t1, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
running = True
init = 0
while running:
cline = out1.stdout.readline()
print(cline.decode())
if not cline and init > 0:
print(cline.decode())
running = False
init += 1
if out1.returncode:
print('Something went wrong:', out1.returncode)
def task2():
print("run task 2")
run_t2 = ["start", os.path.join(sys.exec_prefix, 'pythonw'), "serial_plot.pyw"]
out2 = subprocess.Popen(run_t2, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
running = True
init = 0
while running:
cline = out2.stdout.readline()
print(cline.decode())
if not cline and init > 0:
print(cline.decode())
running = False
init += 1
if out2.returncode:
print('Something went wrong:', out2.returncode)
def test_func():
file = main()
label['text'] = f"File has saved as {os.path.split(file)[1]} under {os.path.split(file)[0]} directory!\n"
t1 = Thread(target=task1, args=())
t1.setDaemon(True)
t1.start()
t2 = Thread(target=task2, args=())
t2.setDaemon(True)
t2.start()
if __name__ == '__main__':
# file = main()
# print(f"File has saved as {os.path.split(file)[1]} under {os.path.split(file)[0]} directory!")
# t1 = Thread(target=task1, args=())
# t1.setDaemon(True)
# t1.start()
#
# t2 = Thread(target=task2, args=())
# t2.setDaemon(True)
# t2.start()
# # while True:
# # pass
# t1.join()
# t2.join()
root = tk.Tk()
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
# backgroud_image = tk.PhotoImage(file='im1.gif')
backIm = tk.Label(root, bg='#80c1ff')
backIm.place(relwidth=1, relheight=1)
frame = tk.Frame(root, bg="#80c1ff", bd=5)
frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n')
button1 = tk.Button(frame, text="update", font=50, fg='green', bg='grey', command=lambda: test_func())
button1.place(relx=0.8, relheight=0.5, relwidth=0.2)
button2 = tk.Button(frame, text="clear", font=50, fg='red', bg='grey')
button2.place(relx=0.8, rely=0.5, relheight=0.5, relwidth=0.2)
lb1 = tk.Label(frame, text="filename")
lb1.place(relx=0.1, relheight=0.4, relwidth=0.2)
text1 = tk.StringVar()
box1 = tk.Entry(frame, textvariable=text1)
box1.place(relx=0.1, rely=0.5, relheight=0.5, relwidth=0.2)
lb2 = tk.Label(frame, text="num of sensor")
lb2.place(relx=0.3, relheight=0.4, relwidth=0.2)
text2 = tk.StringVar()
box2 = tk.Entry(frame, textvariable=text2)
box2.place(relx=0.3, rely=0.5, relheight=0.5, relwidth=0.2)
lb3 = tk.Label(frame, text="res1")
lb3.place(relx=0.5, relheight=0.4, relwidth=0.1)
text3 = tk.StringVar()
box3 = tk.Entry(frame, textvariable=text3)
box3.place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.1)
lb4 = tk.Label(frame, text="res2")
lb4.place(relx=0.6, relheight=0.4, relwidth=0.1)
text4 = tk.StringVar()
box4 = tk.Entry(frame, textvariable=text4)
box4.place(relx=0.6, rely=0.5, relheight=0.5, relwidth=0.1)
lower_frame = tk.Frame(root, bg="#80c1ff", bd=10)
lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n')
label = tk.Label(lower_frame, font=40)
label.place(relwidth=1, relheight=1)
root.mainloop()