import React from 'react'; import { AgvState, AgvError, AgvSignal, SystemFlag0, SystemFlag1 } from '../types'; import { CircleCheck, AlertOctagon, Cpu } from 'lucide-react'; interface AgvStatusPanelProps { agvState: AgvState; } const AgvStatusPanel: React.FC = ({ agvState }) => { const renderBit = (label: string, value: number, bitIndex: number, colorClass = 'bg-green-500') => { const isOn = (value & (1 << bitIndex)) !== 0; // 필터링에 의해 isOn이 true인 것만 전달되지만 스타일 유지를 위해 체크 로직 유지 return (
{label.replace(/_/g, ' ')}
); }; const getEnumKeys = (e: any) => { return Object.keys(e).filter(k => typeof e[k as any] === "number"); }; const getActiveKeys = (enumObj: any, value: number) => { return getEnumKeys(enumObj).filter(key => (value & (1 << (enumObj[key as any] as number))) !== 0); }; return (
AGV PROTOCOL FLAGS (ACTIVE)
{/* System 1 (Control State) */}

SYSTEM 1

{getActiveKeys(SystemFlag1, agvState.system1).length > 0 ? ( getActiveKeys(SystemFlag1, agvState.system1).map((key) => renderBit(key, agvState.system1, SystemFlag1[key as any] as unknown as number, 'bg-blue-500') ) ) : ( No active flags )}
{/* Signals */}

SIGNALS

{getActiveKeys(AgvSignal, agvState.signalFlags).length > 0 ? ( getActiveKeys(AgvSignal, agvState.signalFlags).map((key) => renderBit(key, agvState.signalFlags, AgvSignal[key as any] as unknown as number, 'bg-yellow-500') ) ) : ( No active signals )}
{/* Errors */}

ERRORS

{getActiveKeys(AgvError, agvState.errorFlags).length > 0 ? ( getActiveKeys(AgvError, agvState.errorFlags).map((key) => renderBit(key, agvState.errorFlags, AgvError[key as any] as unknown as number, 'bg-red-600 shadow-[0_0_5px_rgba(220,38,38,0.5)]') ) ) : ( None )}
{/* System 0 (Hardware) */}

SYSTEM 0

{getActiveKeys(SystemFlag0, agvState.system0).length > 0 ? ( getActiveKeys(SystemFlag0, agvState.system0).map((key) => renderBit(key, agvState.system0, SystemFlag0[key as any] as unknown as number, 'bg-cyan-500') ) ) : ( No active flags )}
); }; export default AgvStatusPanel;