Files
AGVEmulator/components/AgvAutoRunControls.tsx

105 lines
4.7 KiB
TypeScript

import React from 'react';
import { Play, Square, ArrowLeft, ArrowRight, Radar } from 'lucide-react';
import { AgvState, AgvRunConfig } from '../types';
interface AgvAutoRunControlsProps {
agvState: AgvState;
updateRunConfig: (key: keyof AgvRunConfig, value: any) => void;
toggleRun: () => void;
isRunning: boolean;
isError: boolean;
setLidar: (isOn: boolean) => void;
}
const AgvAutoRunControls: React.FC<AgvAutoRunControlsProps> = ({
agvState,
updateRunConfig,
toggleRun,
isRunning,
isError,
setLidar,
}) => {
return (
<div className={`${isError ? 'opacity-50 pointer-events-none' : ''}`}>
<div className="flex items-center justify-between mb-2 px-1">
<h3 className="text-xs font-bold text-gray-400 uppercase tracking-wider">Auto Run</h3>
<span className={`text-[10px] font-bold uppercase px-2 py-0.5 rounded-full border ${isRunning ? 'bg-green-900/50 border-green-500 text-green-400' : 'bg-gray-800 border-gray-600 text-gray-500'}`}>
{isRunning ? 'Running' : 'Ready'}
</span>
</div>
<div className="bg-gray-800 rounded-lg p-3 border border-gray-700 shadow-inner space-y-3">
<div className="flex items-center justify-between">
<span className="text-xs text-gray-400 font-medium">Direction</span>
<div className="flex bg-gray-900 rounded p-1 gap-1">
{['FWD', 'BWD'].map(dir => (
<button
key={dir}
onClick={() => updateRunConfig('direction', dir)}
disabled={isRunning}
className={`text-xs px-3 py-1 rounded transition-colors ${agvState.runConfig.direction === dir ? 'bg-blue-600 text-white shadow-sm' : 'text-gray-500 hover:text-gray-300 hover:bg-gray-800'}`}
>
{dir}
</button>
))}
</div>
</div>
<div className="flex items-center justify-between">
<span className="text-xs text-gray-400 font-medium">Branch</span>
<div className="flex bg-gray-900 rounded p-1 gap-1">
<button onClick={() => updateRunConfig('branch', 'LEFT')} disabled={isRunning} className={`p-1.5 rounded ${agvState.runConfig.branch === 'LEFT' ? 'bg-blue-600 text-white' : 'text-gray-500 hover:bg-gray-800'}`}><ArrowLeft size={14}/></button>
<button onClick={() => updateRunConfig('branch', 'STRAIGHT')} disabled={isRunning} className={`px-2 py-1 text-xs rounded ${agvState.runConfig.branch === 'STRAIGHT' ? 'bg-blue-600 text-white' : 'text-gray-500 hover:bg-gray-800'}`}>STR</button>
<button onClick={() => updateRunConfig('branch', 'RIGHT')} disabled={isRunning} className={`p-1.5 rounded ${agvState.runConfig.branch === 'RIGHT' ? 'bg-blue-600 text-white' : 'text-gray-500 hover:bg-gray-800'}`}><ArrowRight size={14}/></button>
</div>
</div>
<div className="flex items-center justify-between">
<span className="text-xs text-gray-400 font-medium">Speed</span>
<div className="flex bg-gray-900 rounded p-1 gap-1">
{['L', 'M', 'H'].map(spd => (
<button
key={spd}
onClick={() => updateRunConfig('speedLevel', spd)}
disabled={isRunning}
className={`w-8 py-1 text-xs rounded ${agvState.runConfig.speedLevel === spd ? 'bg-blue-600 text-white shadow-sm' : 'text-gray-500 hover:text-gray-300 hover:bg-gray-800'}`}
>
{spd}
</button>
))}
</div>
</div>
<div className="flex items-center justify-between">
<span className="text-xs text-gray-400 font-medium">Lidar</span>
<button
onClick={() => setLidar(!agvState.lidarEnabled)}
className={`flex items-center gap-2 px-3 py-1 rounded text-xs transition-colors ${
agvState.lidarEnabled
? 'bg-cyan-600 text-white shadow-sm'
: 'bg-gray-700 text-gray-500 hover:bg-gray-600'
}`}
>
<Radar size={12} className={agvState.lidarEnabled ? "animate-pulse" : ""} />
{agvState.lidarEnabled ? 'ON' : 'OFF'}
</button>
</div>
<button
onClick={toggleRun}
className={`w-full py-2.5 rounded font-bold text-sm flex items-center justify-center gap-2 transition-all shadow-md ${
isRunning
? 'bg-red-600 hover:bg-red-500 text-white ring-2 ring-red-500/50'
: 'bg-green-600 hover:bg-green-500 text-white'
}`}
>
{isRunning ? <><Square size={16} fill="currentColor" /> STOP</> : <><Play size={16} fill="currentColor" /> START</>}
</button>
</div>
</div>
);
};
export default AgvAutoRunControls;