MMCL/SOURCE/backend/16. 경광등 하드웨어 실시간 상태 동기화.txt
2026-09-04 11:27:31 +09:00

31 lines
2.5 KiB
Plaintext

# 경광등 하드웨어 실시간 상태 동기화 계획
말씀하신 증상은 **"하드웨어(경광등)는 물리적으로 꺼졌지만, DB에는 마지막으로 제어했던 켜짐 상태가 그대로 남아있어서"** 발생하는 문제입니다. 파이썬 서버는 DB의 값만 보고 "이미 켜져 있네?" 하고 제어를 생략해 버리는 것이죠.
이를 근본적으로 해결하기 위해 델파이 에이전트(LEDAgent)가 단순히 '쓰기(제어)'만 하는 것이 아니라, 주기적으로 경광등의 **'실제 물리적 상태를 읽어와서(Read)' DB에 최신화** 시키는 양방향 동기화 로직을 추가합니다.
## ⚠️ User Review Required
> [!IMPORTANT]
> 1. 델파이 에이전트 소스코드(`uMain.pas`)를 대폭 수정하여 새로운 백그라운드 타이머를 추가하려고 합니다.
> 2. 이 타이머는 **5초에 한 번씩** 모든 경광등에 READ 신호를 보내서 현재 진짜 상태를 가져온 뒤, DB의 값과 다르면 DB를 몰래 갱신해 둡니다.
> 3. 따라서 누군가 강제로 전원을 끄더라도 최대 5초 뒤면 DB가 실시간으로 "꺼짐" 상태로 동기화되고, 파이썬 서버도 이를 정상적으로 인지하게 됩니다.
>
> 이 방식대로 델파이 코드를 수정해도 될지 승인 부탁드립니다!
## 🛠️ Proposed Changes
### `agents/delphi_led_agent/uMain.pas` 수정
* **[NEW] `FStatusSyncTimer` 추가**:
* 1초마다 제어 명령을 감시하는 기존 폴링 타이머와 별개로, 5초 주기로 동작하는 **상태 동기화 전용 타이머**를 생성합니다.
* **[NEW] `OnStatusSyncTimer` 이벤트 구현**:
* `sensor_info` 테이블에서 모든 경광등 IP와 포트를 가져옵니다.
* 기존 제공된 DLL(`Qtvc_dll.dll`)의 READ 기능(`c_pIdata[0] := 0`)을 호출하여 해당 IP의 실제 하드웨어 R, Y, G 상태를 읽어옵니다.
* 읽어온 하드웨어 상태값(PhysR, PhysY, PhysG)이 현재 DB에 저장된 값과 다르다면, 즉시 DB의 `value_chX_statusID`를 덮어씌웁니다.
## ✅ Verification Plan
* 델파이 에이전트를 재컴파일 후 실행합니다.
* 하드웨어 경광등을 강제로 껐다 켜서 물리적으로 초기화시킵니다.
* 에이전트 화면이나 DB에서 약 5초 뒤에 상태값이 꺼짐(0)으로 자동 동기화되는지 확인합니다.
* 챗봇(파이썬)에게 켜달라고 했을 때 "이미 요청한 상태"라는 거절 없이 정상적으로 켜지는지 확인합니다.