feat: Enhance PropertyPanel, add RFID auto-gen, and fix node connections
This commit is contained in:
29
App.tsx
29
App.tsx
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user