feat: Enhance PropertyPanel, add RFID auto-gen, and fix node connections

This commit is contained in:
backuppc
2025-12-22 13:46:01 +09:00
parent df9be853ba
commit 4d1f131d3e
6 changed files with 1995 additions and 1515 deletions

29
App.tsx
View File

@@ -10,6 +10,7 @@ import AcsControls from './components/AcsControls';
import AgvStatusPanel from './components/AgvStatusPanel';
import AgvAutoRunControls from './components/AgvAutoRunControls';
import SystemLogPanel from './components/SystemLogPanel';
import PropertyPanel from './components/PropertyPanel';
import { SerialPortHandler } from './services/serialService';
// --- ACS CRC16 Table Generation (Matches C# Logic) ---
@@ -43,6 +44,7 @@ const calculateAcsCrc16 = (data: number[] | Uint8Array): number => {
const App: React.FC = () => {
// --- State ---
const [activeTool, setActiveTool] = useState<ToolType>(ToolType.SELECT);
const [selectedItemIds, setSelectedItemIds] = useState<Set<string>>(new Set());
// Map Data
const [mapData, setMapData] = useState<SimulationMap>(INITIAL_MAP);
@@ -123,6 +125,20 @@ const App: React.FC = () => {
const [bmsPortInfo, setBmsPortInfo] = useState<string | null>(null);
const [acsPortInfo, setAcsPortInfo] = useState<string | null>(null);
const handlePropertyUpdate = (type: 'NODE' | 'MAGNET' | 'MARK', id: string, data: any) => {
setMapData(prev => {
const next = { ...prev };
if (type === 'NODE') {
next.nodes = prev.nodes.map(n => n.id === id ? { ...n, ...data } : n);
} else if (type === 'MAGNET') {
next.magnets = prev.magnets.map(m => m.id === id ? { ...m, ...data } : m);
} else if (type === 'MARK') {
next.marks = prev.marks.map(m => m.id === id ? { ...m, ...data } : m);
}
return next;
});
};
// Serial Configuration
const [agvBaudRate, setAgvBaudRate] = useState(57600);
const [bmsBaudRate, setBmsBaudRate] = useState(9600);
@@ -443,6 +459,11 @@ const App: React.FC = () => {
barr[22] = s.sensorStatus.charCodeAt(0);
barr.set(encodeHex(s.signalFlags, 2), 23);
// Fill bytes 25-30 with '0' padding
for (let i = 25; i <= 30; i++) {
barr[i] = 0x30; // '0'
}
barr[31] = '*'.charCodeAt(0); barr[32] = '*'.charCodeAt(0); barr[33] = 0x03;
agvSerialRef.current.send(barr);
@@ -1206,6 +1227,13 @@ const App: React.FC = () => {
onDragOver={handleDragOver}
onDrop={handleDrop}
>
{/* Overlay: Property Panel (Floating) */}
<PropertyPanel
selectedItemIds={selectedItemIds}
mapData={mapData}
onUpdate={handlePropertyUpdate}
/>
{/* 1. Far Left: Toolbar */}
<div className="w-16 p-2 border-r border-gray-800 flex flex-col items-center shrink-0">
<EditorToolbar
@@ -1271,6 +1299,7 @@ const App: React.FC = () => {
agvState={agvState}
setAgvState={setAgvState}
onLog={(msg) => addLog('SYSTEM', 'INFO', msg)}
onSelectionChange={setSelectedItemIds}
/>
</div>