diff --git a/access_control_python/__pycache__/access_control_mqtt.cpython-311.pyc b/access_control_python/__pycache__/access_control_mqtt.cpython-311.pyc index afb72a4..9f2311e 100644 Binary files a/access_control_python/__pycache__/access_control_mqtt.cpython-311.pyc and b/access_control_python/__pycache__/access_control_mqtt.cpython-311.pyc differ diff --git a/access_control_python/__pycache__/stm32.cpython-311.pyc b/access_control_python/__pycache__/stm32.cpython-311.pyc new file mode 100644 index 0000000..e76ffaf Binary files /dev/null and b/access_control_python/__pycache__/stm32.cpython-311.pyc differ diff --git a/access_control_python/main copy.py b/access_control_python/main copy.py index b79c007..2ef4c96 100644 --- a/access_control_python/main copy.py +++ b/access_control_python/main copy.py @@ -6,6 +6,7 @@ import face_processing as fp from access_control_mqtt import access_control from database import Database, Student, Parent from display import Display +from stm32 import stm32_distance SERIAL_PORT_DISPLAY = "COM11" CAMERA_INDEX = 0 @@ -69,137 +70,162 @@ def door_open(): #display.set_page("scan") +SD = stm32_distance("COM13") +#start_time = time.perf_counter() +flag: bool = False + +""" +while True: + state = round((perf_counter())%1) + if(flag!=state): + flag = state + print(f"change to : {state}") + print(state) + delay(0.05) +""" while True: + while not frame_ready: time.sleep(1) should_restart = True - - - while should_restart: - #Try to identify face - should_restart = False - #if actrl.get_scan_state(): - if(True): - #print("SCAN ACTIVE!") + distance = SD.get_distance() + print(distance) + state = distance < 800 + if state!= flag: + flag = state + if(state): display.set_string("msg.txt","Scanning") - faces = fp.identify_face(img, target_condidence=0.6) ## Scan student face - if(len(faces)==1): - #print("faces == 1") - facefile = faces[0]['name'] ## File name - print(facefile) - student_info = db.get_student_info(facefile)## Check is it student? - parent_info = db.get_parent_info(facefile) - if(student_info!=None): #is student, request another scan for parent - print("Find student info") - #db.log_access_student_file() - parent_info = None - display.set_page("student") - #display.set_string("msg.txt",f'Scan parent face ({10-i})') - display.set_string("name_std.txt", f'Name: {student_info.name}') - display.set_string("surname_std.txt",f'Surname: {student_info.surname}') - display.set_string("id_std.txt", f'ID: {str(student_info.id)}') - """ - parent_face = fp.identify_face(img, target_condidence=0.6) - parent_info = db.get_parent_info(parent_face)""" - #DONE TODO Fill in student info Resolve - - print(student_info) - - i = 0 - start_time = time.perf_counter() - while(time.perf_counter()-start_time < 10): - parent_face = fp.identify_face(img, target_condidence=0.6) - - if (len(parent_face)!= 0): - parent_facefile = parent_face[0]['name'] - parent_info = db.get_parent_info(parent_facefile) - if(parent_info != None): # Identified parent - if(db.check_relationship(student_info,parent_info)): # Check if the detected parent is right for the detected student. - print("Relation is OKAY") - #DONE TODO Log Access STDw/P - db.log_access_student_with_parent(student_info, student_info) - #DONE TODO write parrent info to display - - display.set_string("name_pt.txt", f'Name: {parent_info.name}') - display.set_string("surname_pt.txt", f'Surname: {parent_info.surname}') - display.set_string("id_pt.txt", f'ID: {parent_info.id}') - actrl.unlock_door() # Door open - display.set_string("msg.txt","Get your kid") - #DONE TODO Send timer to display - door_open() - """ - for i in range(10): - display.set_string("msg.txt",f'Door will close in {10-i}') - time.sleep(1) - - i = 5 - #TODO Check if door close, lock - alarm_active: bool = False - while(i>=0): - if (not actrl.get_door_state() and not alarm_active): # False door is left open - display.set_string("msg.txt","Door is left open, Alram in {} sec".format(i)) - time.sleep(1) - i -= 1 - if i == 0: - actrl.activate_LED_alarm() - alarm_active = True - - elif(actrl.get_door_state()): - actrl.lock_door() - display.set_page("scan") - should_restart = True - break - display.set_page("scan") - - """ - - - else: - display.set_page("scan") - display.set_string("msg.txt","Wrong parent. \t Try Again") - time.sleep(1) - should_restart = True - break - #TODO Try again does not try again - - elif(len(parent_face) == 0): - time.sleep(1) - display.set_string("msg.txt",f'Scan parent face ({10-i})') - i += 1 - - else: - pass - display.set_page("scan") - - elif(parent_info!=None): #is parent, open door - #parent_facefile = faces[0]['name'] - #parent_info = db.get_parent_info(parent_facefile) - #if(parent_info!= None): - display.set_page("prt_wo_stu") - display.set_string("name_pt.txt", f'Name: {parent_info.name}') - display.set_string("surname_pt.txt", f'Surname: {parent_info.surname}') - display.set_string("id_pt.txt", f'ID: {parent_info.id}') - - door_open() - pass - - elif (len(faces)>1): - #More than one people, error. - print("more than one people. \t try again") - display.set_string("msg.txt","More than one people. \t try again") - time.sleep(2) - pass - #print("DONE") - else: - display.set_string("msg.txt","Move your face closer to the scanner") - print("Scan inactivate!!") + display.set_page("scan") + + if (state): # Scan state + while should_restart: + #Try to identify face + should_restart = False + #if actrl.get_scan_state(): + if(True): + #print("SCAN ACTIVE!") + #display.set_string("msg.txt","Scanning") + faces = fp.identify_face(img, target_condidence=0.6) ## Scan student face + if(len(faces)==1): + #print("faces == 1") + facefile = faces[0]['name'] ## File name + print(facefile) + student_info = db.get_student_info(facefile)## Check is it student? + parent_info = db.get_parent_info(facefile) + if(student_info!=None): #is student, request another scan for parent + print("Find student info") + #db.log_access_student_file() + parent_info = None + display.set_page("student") + #display.set_string("msg.txt",f'Scan parent face ({10-i})') + display.set_string("name_std.txt", f'Name: {student_info.name}') + display.set_string("surname_std.txt",f'Surname: {student_info.surname}') + display.set_string("id_std.txt", f'ID: {str(student_info.id)}') + """ + parent_face = fp.identify_face(img, target_condidence=0.6) + parent_info = db.get_parent_info(parent_face)""" + #DONE TODO Fill in student info Resolve + + print(student_info) + + i = 0 + start_time = time.perf_counter() + while(time.perf_counter()-start_time < 10): + parent_face = fp.identify_face(img, target_condidence=0.6) + + if (len(parent_face)!= 0): + parent_facefile = parent_face[0]['name'] + parent_info = db.get_parent_info(parent_facefile) + if(parent_info != None): # Identified parent + if(db.check_relationship(student_info,parent_info)): # Check if the detected parent is right for the detected student. + print("Relation is OKAY") + #DONE TODO Log Access STDw/P + db.log_access_student_with_parent(student_info, student_info) + #DONE TODO write parrent info to display + + display.set_string("name_pt.txt", f'Name: {parent_info.name}') + display.set_string("surname_pt.txt", f'Surname: {parent_info.surname}') + display.set_string("id_pt.txt", f'ID: {parent_info.id}') + actrl.unlock_door() # Door open + display.set_string("msg.txt","Get your kid") + #DONE TODO Send timer to display + door_open() + """ + for i in range(10): + display.set_string("msg.txt",f'Door will close in {10-i}') + time.sleep(1) + + i = 5 + #TODO Check if door close, lock + alarm_active: bool = False + while(i>=0): + if (not actrl.get_door_state() and not alarm_active): # False door is left open + display.set_string("msg.txt","Door is left open, Alram in {} sec".format(i)) + time.sleep(1) + i -= 1 + if i == 0: + actrl.activate_LED_alarm() + alarm_active = True + + elif(actrl.get_door_state()): + actrl.lock_door() + display.set_page("scan") + should_restart = True + break + display.set_page("scan") + + """ + + + else: + display.set_page("scan") + display.set_string("msg.txt","Wrong parent. \t Try Again") + time.sleep(1) + should_restart = True + break + #TODO Try again does not try again + + elif(len(parent_face) == 0): + time.sleep(1) + display.set_string("msg.txt",f'Scan parent face ({10-i})') + i += 1 + + else: + pass + display.set_page("scan") + + elif(parent_info!=None): #is parent, open door + #parent_facefile = faces[0]['name'] + #parent_info = db.get_parent_info(parent_facefile) + #if(parent_info!= None): + print("Find parent info") + display.set_page("prt_wo_stu") + display.set_string("name_pt.txt", f'Name: {parent_info.name}') + display.set_string("surname_pt.txt", f'Surname: {parent_info.surname}') + display.set_string("id_pt.txt", f'ID: {parent_info.id}') + + door_open() + pass + + elif (len(faces)>1): + #More than one people, error. + print("more than one people. \t try again") + display.set_string("msg.txt","More than one people. \t try again") + time.sleep(2) + pass + #print("DONE") + + else: + display.set_string("msg.txt","Move your face closer to the scanner") + print("Scan inactivate!!") -''' + + ''' #is student, request another scan for parent parent_face = fp.identify_face(img, target_condidence=0.6) if(len(faces)==1): diff --git a/access_control_python/main.py b/access_control_python/main.py index d806d1a..92c80ed 100644 --- a/access_control_python/main.py +++ b/access_control_python/main.py @@ -85,12 +85,12 @@ while True: i = 10 #TODO Check if door close, lock while(i>=0): - if (not actrl.get_door_state()): # False door is left open display.set_string("msg.txt","Door is left open, Alram in {} sec".format(i)) time.sleep(1) i -= 1 if i == 0: + display.set_string("msg.txt", "Alarm Active!! Please close the door"") actrl.activate_alarm() else: actrl.lock_door() diff --git a/access_control_python/stm32.py b/access_control_python/stm32.py index 55aa517..0e9e242 100644 --- a/access_control_python/stm32.py +++ b/access_control_python/stm32.py @@ -1,13 +1,30 @@ import serial +import threading + +class stm32_distance(): + data: int = 0 + def __init__(self, serial_port: str) -> None: + self.serial_port = serial_port + self.ser = serial.Serial(self.serial_port, 115200) + self.thread = threading.Thread(target=self.__read_data) + self.thread.start() + + def __read_data(self): + while True: + data = b'' + while True: + byte = self.ser.read() + if byte == b'\x03': + break + data += byte + data_str = data.decode('utf-8') + try: + self.data = int(data_str) + except: + pass + + def get_distance(self): + return self.data + -ser = serial.Serial('COM13', 115200) -while True: - data = b'' - while True: - byte = ser.read() - if byte == b'\x03': - break - data += byte - data_str = data.decode('utf-8') - print(data_str) diff --git a/access_control_python/test.py b/access_control_python/test.py index 22b2c18..c40e8d0 100644 --- a/access_control_python/test.py +++ b/access_control_python/test.py @@ -1,5 +1,6 @@ +from stm32 import stm32_distance -from espmega.espmega_r3 import ESPMega_standalone as ESPMega -plc = ESPMega("/facescan","192.168.0.239",1883) +SD = stm32_distance("COM13") -plc.digital_write(2,0)`` \ No newline at end of file +while True: + print(SD.get_distance()) \ No newline at end of file diff --git a/access_control_python/test2.py b/access_control_python/test2.py new file mode 100644 index 0000000..37dd2a4 --- /dev/null +++ b/access_control_python/test2.py @@ -0,0 +1,13 @@ +import serial +ser = serial.Serial('COM13', 115200) + +data = b'' + +while True: + byte = ser.read() + if byte == b'\x03': + break + data += byte + +data_str = data.decode('utf-8') +print(data_str) \ No newline at end of file diff --git a/access_control_python/test3.py b/access_control_python/test3.py new file mode 100644 index 0000000..9d4c86b --- /dev/null +++ b/access_control_python/test3.py @@ -0,0 +1,11 @@ +from time import perf_counter +from time import sleep as delay + +flag: bool = False +while True: + state = round((perf_counter())%1) + if(flag!=state): + flag = state + print(f"change to : {state}") + print(state) + delay(0.05) \ No newline at end of file