From 893572868e6b02337fab5d085199154ec9c7d680 Mon Sep 17 00:00:00 2001 From: Pritimay Sarkar Date: Thu, 29 Feb 2024 22:23:04 +0530 Subject: [PATCH] add QC for led script --- scripts/quality_control_leds.py | 230 ++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 scripts/quality_control_leds.py diff --git a/scripts/quality_control_leds.py b/scripts/quality_control_leds.py new file mode 100644 index 0000000..120eed6 --- /dev/null +++ b/scripts/quality_control_leds.py @@ -0,0 +1,230 @@ +import serial +import pandas as pd +import os.path +from datetime import datetime +import math +from tqdm import tqdm +import re +import sys +import time + +class Device: + def __init__(self, accuracy, precision, port, baud_rate): + self.accuracy = accuracy + self.precision = precision + self.port = port + self.baud_rate = 9600 + +def perform_hpos_test(repeat_no, solution, df): + try: + port = sys.argv[1] + baud_rate = 9600 + deviceId = 'QC' + data = "" + data_list = [] + + if not os.path.exists(port): + raise FileNotFoundError(f"Port {port} not found.") + + with serial.Serial(port, baud_rate, timeout=1, parity=serial.PARITY_NONE) as ser: + x = ser.read() + s = ser.read(10) + line = ser.readline() + + ser.write(b'B') + while True: + data += ser.readline().decode("utf-8") + # print(data.split('\r')) + # if 'SNE' in data: + # ser.write(b'B') + if 'BC' in data: + ser.write(b'P') + if 'REND' in data: + # print(data) + pattern = re.compile(r'(LB[1-4])\s+([\d.]+)') + + matches = pattern.findall(data) + + if matches: + lb1_value = matches[0][1] + lb2_value = matches[1][1] + lb3_value = matches[2][1] + lb4_value = matches[3][1] + + # print("LB1:", lb1_value) + # print("LB2:", lb2_value) + # print("LB3:", lb3_value) + # print("LB4:", lb4_value) + else: + print("Pattern not found.") + + data_list.append({"sol": solution + '-' + str(repeat_no), + "led1Buffer": lb1_value, + "led2Buffer": lb2_value, + "led3Buffer": lb3_value, + "led4Buffer": lb4_value, + "deviceId": deviceId, + "time": datetime.today().strftime('%d-%m-%y %H:%M:%S')}) + break + return data_list + + except serial.serialutil.SerialException: + print("Device is not connected or resource busy!") + raise + except FileNotFoundError as e: + print(e) + raise + except Exception as err: + print("Error:", err) + raise + finally: + if ser is not None: + # print("con close") + ser.close() + +def perform_auto_dac(df): + try: + port = sys.argv[1] + baud_rate = 9600 + deviceId = 'QC' + data = "" + data_list = [] + + if not os.path.exists(port): + raise FileNotFoundError(f"Port {port} not found.") + + with serial.Serial(port, baud_rate, timeout=1, parity=serial.PARITY_NONE) as ser: + x = ser.read() + s = ser.read(10) + line = ser.readline() + + ser.write(b'C') + while True: + data += ser.readline().decode("utf-8") + # print(data.split('\r')) + if 'CC' in data: + # print(data) + pattern = re.compile(r'LED(\d+)_DAC: (\d+)') + + matches = pattern.findall(data) + + if matches: + lb1_value = matches[0][1] + lb2_value = matches[1][1] + lb3_value = matches[2][1] + lb4_value = matches[3][1] + + print("LED1_DAC:", lb1_value) + print("LED2_DAC:", lb2_value) + print("LED3_DAC:", lb3_value) + print("LED4_DAC:", lb4_value) + else: + print("Pattern not found.") + + data_list.append({"LED1_DAC": lb1_value, + "LED2_DAC": lb2_value, + "LED3_DAC": lb3_value, + "LED4_DAC": lb4_value, + "deviceId": deviceId, + "time": datetime.today().strftime('%d-%m-%y %H:%M:%S')}) + break + return data_list + + except serial.serialutil.SerialException: + print("Device is not connected or resource busy!") + raise + except FileNotFoundError as e: + print(e) + raise + except Exception as err: + print("Error:", err) + raise + finally: + if ser is not None: + # print("con close") + ser.close() + + +def autodac_process(): + data_file = 'quality_control_leds.xlsx' + sheet_name = 'auto_dac' + + if os.path.exists(data_file): + xls = pd.ExcelFile(data_file) + if sheet_name in xls.sheet_names: + df = pd.read_excel(data_file, sheet_name=sheet_name) + else: + print(f"Sheet '{sheet_name}' does not exist in the Excel file.") + df = pd.DataFrame(columns=["LED1_DAC", "LED2_DAC", "LED3_DAC", "LED4_DAC", "deviceId", "time"]) + else: + df = pd.DataFrame(columns=["LED1_DAC", "LED2_DAC", "LED3_DAC", "LED4_DAC", "deviceId", "time"]) + + buffer_sheet_name = 'buffer' + if os.path.exists(data_file): + xls = pd.ExcelFile(data_file) + if buffer_sheet_name in xls.sheet_names: + df_buffer = pd.read_excel(data_file, sheet_name=buffer_sheet_name) + else: + print(f"Sheet '{buffer_sheet_name}' does not exist in the Excel file.") + df_buffer = pd.DataFrame(columns=["LED1_DAC", "LED2_DAC", "LED3_DAC", "LED4_DAC", "deviceId", "time"]) + else: + df_buffer = pd.DataFrame(columns=["sol", "led1Buffer", "led2Buffer", "led3Buffer", "led4Buffer", "deviceId", "time"]) + + data_list = perform_auto_dac(df) + + df = pd.concat([df, pd.DataFrame(data_list)], ignore_index=True) + + writer = pd.ExcelWriter(data_file, engine = 'openpyxl') + df.to_excel(writer, sheet_name = sheet_name, index=False) + df_buffer.to_excel(writer, sheet_name = buffer_sheet_name, index=False) + writer.close() + time.sleep(1) + +def buffer_process(): + data_file = 'quality_control_leds.xlsx' + sheet_name = 'buffer' + autodac_sheet_name = 'auto_dac' + + if os.path.exists(data_file): + xls = pd.ExcelFile(data_file) + if sheet_name in xls.sheet_names: + df = pd.read_excel(data_file, sheet_name=sheet_name) + else: + print(f"Sheet '{sheet_name}' does not exist in the Excel file.") + df = pd.DataFrame(columns=["sol", "led1Buffer", "led2Buffer", "led3Buffer", "led4Buffer", "deviceId", "time"]) + else: + df = pd.DataFrame(columns=["sol", "led1Buffer", "led2Buffer", "led3Buffer", "led4Buffer", "deviceId", "time"]) + + if os.path.exists(data_file): + xls = pd.ExcelFile(data_file) + if autodac_sheet_name in xls.sheet_names: + df_autodac = pd.read_excel(data_file, sheet_name=autodac_sheet_name) + else: + print(f"Sheet '{autodac_sheet_name}' does not exist in the Excel file.") + df_autodac = pd.DataFrame(columns=["LED1_DAC", "LED2_DAC", "LED3_DAC", "LED4_DAC", "deviceId", "time"]) + else: + df_autodac = pd.DataFrame(columns=["LED1_DAC", "LED2_DAC", "LED3_DAC", "LED4_DAC", "deviceId", "time"]) + + print(df_autodac) + solution = "buffer" #input("solution name: ") + repeats = 5 #int(input("number of repeats: ")) + for repeat in tqdm(range(0, repeats)): + data_list = perform_hpos_test(repeat, solution, df) + df = pd.concat([df, pd.DataFrame(data_list)], ignore_index=True) + + writer = pd.ExcelWriter(data_file, engine = 'openpyxl') + df.to_excel(writer, sheet_name = sheet_name, index=False) + df_autodac.to_excel(writer, sheet_name = autodac_sheet_name, index=False) + writer.close() + +def analysis_process(): + df = df.tail(5) + +if __name__ == "__main__": + # device = Device(0.01, 0.001, '/dev/cu.usbserial-23APB124', 9600) + + autodac_process() + + buffer_process() + + analysis_process() \ No newline at end of file