+
+ {rows.map(([label, value]) => (
+
+
- {label}
+ - {value}
+
+ ))}
+
+ {[...stats.perServo].map(([id, s]) => (
+
+ ID {id} fails {s.consecutiveFailures}
+ {s.probing ? " probing" : ""}
+
+ ))}
+
+ );
+}
diff --git a/src/components/calibration-card.tsx b/src/components/calibration-card.tsx
index b8b1a47..215f006 100644
--- a/src/components/calibration-card.tsx
+++ b/src/components/calibration-card.tsx
@@ -9,7 +9,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover
import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
import { CALIBRATION_REGISTERS, editReason, type CalibrationRegister } from "@/lib/calibration";
-import { decodeSpan, span } from "@/lib/card-poll";
+import { decodeSpan, span } from "@/lib/bus/spans";
import { hexAddr } from "@/lib/format";
import { useSession } from "@/lib/session";
import { calibrationFromTable, calibrationStatus, type Calibration } from "@/lib/units";
diff --git a/src/lib/bus/hooks.ts b/src/lib/bus/hooks.ts
new file mode 100644
index 0000000..d9ec8f8
--- /dev/null
+++ b/src/lib/bus/hooks.ts
@@ -0,0 +1,144 @@
+import type { OscClient, Value } from "@openservocore/client";
+import { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
+import { useSyncExternalStore } from "react";
+import type { BusManager, BusStats, Rate, Snapshot } from "./manager";
+import type { BusStore } from "./store";
+
+export interface BusHost {
+ manager: BusManager;
+ store: BusStore;
+}
+
+export const BusContext = createContext