7635412b7b
- 작업자 폰(/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>
45 lines
1.7 KiB
JavaScript
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();
|
|
})();
|