import { BatteryMedium, Gamepad2, Power, Usb } from "lucide-react"; import { Badge } from "@/components/common/Badge"; import { Panel } from "@/components/common/Panel"; import { StatusDot } from "@/components/common/StatusDot"; import { PageShell } from "@/components/layout/PageShell"; import { Select } from "@/components/inputs/Select"; import { Toggle } from "@/components/inputs/Toggle"; import { StickPreview } from "@/components/visualizations/StickPreview"; import { TriggerPreview } from "@/components/visualizations/TriggerPreview"; import { useControllerStore } from "@/stores/controllerStore"; import { useProfileStore } from "@/stores/profileStore"; import { useSettingsStore } from "@/stores/settingsStore"; import { processStick, processTrigger } from "@/utils/deadzoneMath"; export function Dashboard() { const controllers = useControllerStore((s) => s.controllers); const activeController = useControllerStore((s) => s.activeController()); const liveState = useControllerStore((s) => s.liveState); const pollRateHz = useControllerStore((s) => s.pollRateHz); const connectionStatus = useControllerStore((s) => s.connectionStatus); const connectionMessage = useControllerStore((s) => s.connectionMessage); const draftProfile = useProfileStore((s) => s.draftProfile); const summaries = useProfileStore((s) => s.summaries); const selectProfile = useProfileStore((s) => s.selectProfile); const remappingEnabled = useSettingsStore((s) => s.remappingEnabled); const setRemappingEnabled = useSettingsStore((s) => s.setRemappingEnabled); const setControllerRemapping = useControllerStore((s) => s.setRemappingEnabled); const axes = liveState?.axes ?? {}; const leftStick = draftProfile ? processStick({ x: axes.left_stick_x ?? 0, y: axes.left_stick_y ?? 0 }, draftProfile.leftStick) : null; const rightStick = draftProfile ? processStick({ x: axes.right_stick_x ?? 0, y: axes.right_stick_y ?? 0 }, draftProfile.rightStick) : null; const leftTrigger = draftProfile ? processTrigger(axes.left_trigger ?? 0, draftProfile.leftTrigger) : null; const rightTrigger = draftProfile ? processTrigger(axes.right_trigger ?? 0, draftProfile.rightTrigger) : null; return (
{activeController ? (

{activeController.name}

{activeController.devicePath} · VID {activeController.vendorId.toString(16).padStart(4, "0")}{" "} PID {activeController.productId.toString(16).padStart(4, "0")}

Connected {activeController.mode.toUpperCase()} {activeController.batteryPercent !== null && ( {activeController.batteryPercent}% )} Virtual controller {activeController.virtualControllerActive ? "active" : "inactive"} {activeController.isSimulated && Simulated device}
) : (

{connectionStatus === "reconnecting" ? connectionMessage ?? "Reconnecting to controller…" : "No controller detected. Connect an 8BitDo Ultimate controller to get started."}

)}
{ setRemappingEnabled(enabled); void setControllerRemapping(enabled); }} label="Enable remapping" description="Route input through the virtual controller" />
Poll rate {pollRateHz ? `${pollRateHz} Hz` : "—"}