diff --git a/ui/social-bot/src/App.jsx b/ui/social-bot/src/App.jsx
index 358955a..9b8596c 100644
--- a/ui/social-bot/src/App.jsx
+++ b/ui/social-bot/src/App.jsx
@@ -76,6 +76,9 @@ import { TempGauge } from './components/TempGauge.jsx';
// Node list viewer
import { NodeList } from './components/NodeList.jsx';
+// Gamepad teleoperation (issue #319)
+import { Teleop } from './components/Teleop.jsx';
+
const TAB_GROUPS = [
{
label: 'SOCIAL',
@@ -269,16 +272,7 @@ export default function App() {
{activeTab === 'motor-current-graph' && }
{activeTab === 'thermal' && }
{activeTab === 'map' && }
- {activeTab === 'control' && (
-
+ {/* Status bar */}
+
+
+
+ {isEstopped ? '🛑 E-STOP ACTIVE' : '⚡ TELEOP READY'}
+
+
+
+
+ {/* Velocity display */}
+
+
+
LINEAR
+
+ {linearVel.toFixed(2)} m/s
+
+
+
+
ANGULAR
+
+ {angularVel.toFixed(2)} rad/s
+
+
+
+
+
+ {/* Gamepad area */}
+
+
+
+
+
+ {/* Speed limiter */}
+
+
+
+ SPEED LIMITER
+
+
+ {(speedLimit * 100).toFixed(0)}%
+
+
+
setSpeedLimit(parseFloat(e.target.value))}
+ disabled={isEstopped}
+ className="w-full cursor-pointer"
+ style={{
+ accentColor: isEstopped ? '#6b7280' : '#06b6d4',
+ }}
+ />
+
+
+
+ {/* Control info */}
+
+
KEYBOARD FALLBACK
+
+
+ W/S: Forward/Back
+
+
+ A/D: Turn Left/Right
+
+
+
+
+ {/* Topic info */}
+
+
+ Topic:
+ /cmd_vel (geometry_msgs/Twist)
+
+
+ Max Linear:
+ {MAX_LINEAR_VELOCITY} m/s
+
+
+ Max Angular:
+ {MAX_ANGULAR_VELOCITY} rad/s
+
+
+ Deadzone:
+ {(DEADZONE * 100).toFixed(0)}%
+
+
+
+ );
+}