55import sqlite3
66import threading
77import time
8-
8+ from threading import Event
99# 프로젝트 루트 디렉터리를 sys.path에 추가
1010sys .path .append (os .path .abspath (os .path .join (os .path .dirname (__file__ ), ".." )))
1111
@@ -76,37 +76,26 @@ def load_from_db():
7676 return {"devices" : [dict (zip (["count" , "interval" , "equip_id" , "zone_id" , "simulator" , "sensor_num" ], row )) for row in rows ]}
7777
7878# Function to run simulation with stop functionality
79- def run_simulation_with_stop (simulator_type , count , interval , sensor_num , zone_id , equip_id , stop_event ):
80- # RealSensor와 가상 시뮬레이터를 구분하여 처리
81- if simulator_type == "real_sensor" :
82- # RealSensor 모드: 쓰레드를 실행하고 포트 해제를 위해 join() 사용
83- threads = run_simulator_from_streamlit (
84- simulator_type , count , interval ,
85- sensor_num , zone_id , equip_id ,
86- stop_event # stop_event 전달 중요!
87- )
88-
89- # join() 호출 제거 - 쓰레드가 백그라운드에서 실행되도록 함
90- print (f"RealSensor threads started in background. Count: { len (threads or [])} " )
79+ def run_simulation_with_stop (simulator_type , count , interval , sensor_num , zone_id , equip_id , stop_event : Event ):
80+ # for _ in range(count):
81+ # if stop_event.is_set(): # Stop 이벤트가 설정되었는지 확인
82+ # print(f"Stopping simulation for {simulator_type}")
83+ # break
84+ # # run_simulator_from_streamlit(simulator_type, count, interval, sensor_num, zone_id, equip_id)
85+ # time.sleep(interval) # 시뮬레이션 간격
9186
92- # 선택사항: 쓰레드 정리를 위한 참조 저장
93- # 현재의 코드에서는 이미 simulation_threads에 참조가 저장되므로 추가 작업 필요 없음
94- else :
95- # 가상 시뮬레이터 모드: 기존에 잘 작동하던 방식 사용
96- for _ in range (count ):
97- if stop_event .is_set (): # Stop 이벤트가 설정되었는지 확인
98- print (f"Stopping simulation for { simulator_type } " )
99- break
100-
101- # 시뮬레이터 한 번 실행
102- run_simulator_from_streamlit (
103- simulator_type , 1 , interval , # count=1로 한 번만 실행
104- sensor_num , zone_id , equip_id ,
105- stop_event
106- )
107-
108- time .sleep (interval ) # 시뮬레이션 간격
109-
87+
88+ # ① 시뮬레이터(혹은 RealSensor) 실행 → 쓰레드 리스트 반환
89+ threads = run_simulator_from_streamlit (
90+ simulator_type , count , interval ,
91+ sensor_num , zone_id , equip_id ,stop_event )
92+
93+ # ② 반환된 쓰레드가 있으면 모두 종료될 때까지 기다렸다가 포트 해제
94+ for th in threads or []: # None 방어
95+ if th is not None :
96+ th .join () # ← 여기서 blocking, ser.close() 까지 완료
97+
98+
11099# Streamlit app
111100def main ():
112101 st .title ("Simulation Configuration Manager" )
@@ -135,7 +124,19 @@ def main():
135124 device ["interval" ] = st .number_input (f"Interval (Device { i + 1 } )" , value = device ["interval" ], key = f"interval_{ i } " )
136125 device ["equip_id" ] = st .text_input (f"Manufacture ID (Device { i + 1 } )" , value = device ["equip_id" ], key = f"equip_id_{ i } " )
137126 device ["zone_id" ] = st .text_input (f"Space ID (Device { i + 1 } )" , value = device ["zone_id" ], key = f"zone_id_{ i } " )
138- device ["simulator" ] = st .text_input (f"Simulator (Device { i + 1 } )" , value = device ["simulator" ], key = f"simulator_{ i } " )
127+ # device["simulator"] = st.text_input(f"Simulator (Device {i + 1})", value=device["simulator"], key=f"simulator_{i}")
128+ #드랍다운 선택 형식으로 시뮬레이터 적용
129+ simulator_options = ["temp" , "humidity" , "vibration" , "current" , "dust" , "voc" , "real_sensor" ]
130+ device ["simulator" ] = st .selectbox (
131+ f"Simulator (Device { i + 1 } )" ,
132+ options = simulator_options ,
133+ index = simulator_options .index (device ["simulator" ]) if device ["simulator" ] in simulator_options else 0 ,
134+ key = f"simulator_{ i } "
135+ )
136+ # real_sensor가 선택된 경우 경고 메시지 표시
137+ if device ["simulator" ] == "real_sensor" :
138+ st .warning ("⚠️ 'real_sensor'는 로컬 환경에서만 사용 가능하며, 센서를 USB 포트(COM3)에 연결해야 합니다." )
139+ # 센서 갯수 입력
139140 device ["sensor_num" ] = st .number_input (f"Sensor Num (Device { i + 1 } )" , value = device ["sensor_num" ], key = f"sensor_num_{ i } " )
140141
141142 # Run Simulation Button
@@ -198,7 +199,6 @@ def main():
198199 save_to_db (st .session_state .data )
199200 st .success ("Saved data to SQLite." )
200201
201-
202202if __name__ == "__main__" :
203203 init_db ()
204204 main ()
0 commit comments