mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-17 10:00:46 -04:00
?ploooooo
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -11,7 +11,7 @@
|
|||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||||
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
|
<meta name="apple-mobile-web-app-title" content="Multi Roomba Rover" />
|
||||||
<title>Multi Roomba Rover</title>
|
<title>Multi Roomba Rover</title>
|
||||||
<script type="module" crossorigin src="/assets/index-ZItnCUqh.js"></script>
|
<script type="module" crossorigin src="/assets/index-BGRb2uIp.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-BBEWYgmH.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-BBEWYgmH.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export default function OvercurrentLimiterPanel() {
|
|||||||
) : (
|
) : (
|
||||||
<div className="space-y-0.5">
|
<div className="space-y-0.5">
|
||||||
{groups.map((key) => {
|
{groups.map((key) => {
|
||||||
const cap = overcurrentLimiter?.caps?.[key] ?? 0;
|
const cap = overcurrentLimiter?.caps?.[key]?.cap ?? 0;
|
||||||
const over = overcurrentLimiter?.overcurrent?.groups?.[key] ?? false;
|
const over = overcurrentLimiter?.overcurrent?.groups?.[key] ?? false;
|
||||||
const scale = overcurrentLimiter?.scales?.perGroup?.[key] ?? 1;
|
const scale = overcurrentLimiter?.scales?.perGroup?.[key] ?? 1;
|
||||||
return (
|
return (
|
||||||
@@ -66,6 +66,7 @@ export default function OvercurrentLimiterPanel() {
|
|||||||
})}
|
})}
|
||||||
<div className="surface text-[0.7rem] text-slate-400">
|
<div className="surface text-[0.7rem] text-slate-400">
|
||||||
<div>{`Down rate ${overcurrentLimiter?.config?.downRatePerSec}/s · Up rate ${overcurrentLimiter?.config?.upRatePerSec}/s`}</div>
|
<div>{`Down rate ${overcurrentLimiter?.config?.downRatePerSec}/s · Up rate ${overcurrentLimiter?.config?.upRatePerSec}/s`}</div>
|
||||||
|
<div>{`Release delay ${overcurrentLimiter?.config?.releaseDelaySec}s`}</div>
|
||||||
<div>{`Output rate ${overcurrentLimiter?.config?.outputRateMs}ms`}</div>
|
<div>{`Output rate ${overcurrentLimiter?.config?.outputRateMs}ms`}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -10,12 +10,13 @@ export const OVERCURRENT_GROUPS = [
|
|||||||
export const DEFAULT_OVERCURRENT_LIMITS = {
|
export const DEFAULT_OVERCURRENT_LIMITS = {
|
||||||
downRatePerSec: 0.25,
|
downRatePerSec: 0.25,
|
||||||
upRatePerSec: 0.1,
|
upRatePerSec: 0.1,
|
||||||
|
releaseDelaySec: 1.5,
|
||||||
outputRateMs: 250,
|
outputRateMs: 250,
|
||||||
};
|
};
|
||||||
|
|
||||||
function createInitialCaps() {
|
function createInitialCaps() {
|
||||||
return OVERCURRENT_GROUPS.reduce((acc, group) => {
|
return OVERCURRENT_GROUPS.reduce((acc, group) => {
|
||||||
acc[group.key] = 1;
|
acc[group.key] = { cap: 1, clearSec: 0 };
|
||||||
return acc;
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
@@ -58,26 +59,32 @@ export function useOvercurrentLimiter(roverId, options = {}) {
|
|||||||
const next = {};
|
const next = {};
|
||||||
const downRate = Number.isFinite(config.downRatePerSec) ? Math.max(0, config.downRatePerSec) : 0;
|
const downRate = Number.isFinite(config.downRatePerSec) ? Math.max(0, config.downRatePerSec) : 0;
|
||||||
const upRate = Number.isFinite(config.upRatePerSec) ? Math.max(0, config.upRatePerSec) : 0;
|
const upRate = Number.isFinite(config.upRatePerSec) ? Math.max(0, config.upRatePerSec) : 0;
|
||||||
|
const releaseDelay = Number.isFinite(config.releaseDelaySec) ? Math.max(0, config.releaseDelaySec) : 0;
|
||||||
OVERCURRENT_GROUPS.forEach((group) => {
|
OVERCURRENT_GROUPS.forEach((group) => {
|
||||||
const prevEntry = Number.isFinite(prev[group.key]) ? prev[group.key] : 1;
|
const prevEntry = prev[group.key] || { cap: 1, clearSec: 0 };
|
||||||
|
const prevCap = Number.isFinite(prevEntry.cap) ? prevEntry.cap : 1;
|
||||||
|
const prevClear = Number.isFinite(prevEntry.clearSec) ? prevEntry.clearSec : 0;
|
||||||
const over = group.motors.some((motor) => Boolean(flagsRef.current?.[motor]));
|
const over = group.motors.some((motor) => Boolean(flagsRef.current?.[motor]));
|
||||||
|
const nextClear = over ? 0 : prevClear + deltaSec;
|
||||||
|
const allowRecover = !over && nextClear >= releaseDelay;
|
||||||
const nextCap = clampUnit(
|
const nextCap = clampUnit(
|
||||||
over ? prevEntry - downRate * deltaSec : prevEntry + upRate * deltaSec,
|
over ? prevCap - downRate * deltaSec : allowRecover ? prevCap + upRate * deltaSec : prevCap,
|
||||||
);
|
);
|
||||||
if (Math.abs(nextCap - prevEntry) > 0.0001) {
|
if (Math.abs(nextCap - prevCap) > 0.0001 || Math.abs(nextClear - prevClear) > 0.0001) {
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
next[group.key] = nextCap;
|
next[group.key] = { cap: nextCap, clearSec: nextClear };
|
||||||
});
|
});
|
||||||
return changed ? next : prev;
|
return changed ? next : prev;
|
||||||
});
|
});
|
||||||
}, 100);
|
}, 100);
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
}, [config.downRatePerSec, config.upRatePerSec]);
|
}, [config.downRatePerSec, config.releaseDelaySec, config.upRatePerSec]);
|
||||||
|
|
||||||
const scales = useMemo(() => {
|
const scales = useMemo(() => {
|
||||||
const perGroup = OVERCURRENT_GROUPS.reduce((acc, group) => {
|
const perGroup = OVERCURRENT_GROUPS.reduce((acc, group) => {
|
||||||
const cap = Number.isFinite(caps?.[group.key]) ? caps[group.key] : 1;
|
const entry = caps?.[group.key];
|
||||||
|
const cap = Number.isFinite(entry?.cap) ? entry.cap : 1;
|
||||||
acc[group.key] = clampUnit(cap);
|
acc[group.key] = clampUnit(cap);
|
||||||
return acc;
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
|
|||||||
Reference in New Issue
Block a user