Files
invyone/frontend/public/scada-demo/js/main.js
T
gbpark 7635412b7b feat: SCADA 시연용 모바일 알람 동반 화면 + Spring WebSocket
- 작업자 폰(/mobile)을 SCADA 데모와 ws 로 연결, 알람 발생 시 풀스크린 푸시
  · v5 솔리드+글로우 톤, 진동/Web Audio 비프/Wake Lock/auto reconnect
  · 시연 안전망: ?test=1 자동 발동, 우상단 hidden 트리거
- backend: com.erp.alarm 신규 패키지 (WebSocketConfig + Handshake + Handler + Controller)
  · JWT 토큰 핸드셰이크 검증, userId 기반 채널 매핑 (멀티 디바이스 지원)
  · spring-boot-starter-websocket 의존성 추가
  · path 를 /api/demo/* 안에 두어 Traefik 라우트 추가 불필요 + 정식 알람과 분리
- SCADA scenario.js 의 emergency 시퀀스(2700ms)에 fetch('/api/demo/alarm/trigger') 배선
  · /scada?worker=<user_id> query 로 target user 지정 (iframe src 로 전달)
- 운영 시연 URL: siflex.invyone.com/mobile (siflex_user) ↔ /scada?worker=siflex_user

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 01:18:12 +09:00

45 lines
1.7 KiB
JavaScript

// INVYONE Stage-2 — Bootstrap
// 1) 토폴로지에서 SVG 씬 생성 2) 엔진 초기화 3) UI 와이어업 4) tick 시작
(function () {
function boot() {
const sceneEl = document.getElementById('scene-content');
if (!sceneEl) {
console.error('#scene-content 노드를 찾을 수 없음');
return;
}
sceneEl.innerHTML = window.INVYONE_TOPO.buildScene();
window.INVYONE_ENGINE.init();
window.INVYONE_UI.init();
window.INVYONE_ENGINE.start();
// expose for browser console
window.INVYONE = {
engine: window.INVYONE_ENGINE,
topo: window.INVYONE_TOPO,
ui: window.INVYONE_UI,
scenario: window.INVYONE_SCENARIO,
// 빠른 콘솔 데모 헬퍼
help() {
console.log('%cINVYONE Stage-2 Demo', 'color:#5af9ff;font-size:14px');
console.log('console 사용법:');
console.log(' INVYONE.engine.applyMode("NORMAL"|"BACKWASH"|"CIP"|"STOP"|"CHEM-DOSE")');
console.log(' INVYONE.engine.togglePump("uf-pump-a")');
console.log(' INVYONE.engine.toggleValve("v-uf-in")');
console.log(' INVYONE.engine.setTankLevel("raw", 90)');
console.log(' INVYONE.engine.setSensor("ph", 9.5)');
console.log(' INVYONE.engine.triggerDemoAlarm()');
console.log(' INVYONE.engine.reset()');
console.log(' INVYONE.scenario.play("bw-a1-overpressure") — 경고시스템 시연');
console.log(' INVYONE.scenario.stop()');
console.log(' INVYONE.engine.state — 전체 상태 객체');
}
};
console.log('%cINVYONE Stage-2 Ready — INVYONE.help() 입력', 'color:#7cff3a');
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);
else boot();
})();