iobroker.roborock
Version:
66 lines (53 loc) • 2.16 kB
text/typescript
import type { B01MapHeader } from "../b01/types";
import type { Q10SourceArea, Q10SourceData } from "./types";
function isFiniteNumber(value: number | undefined): value is number {
return typeof value === "number" && Number.isFinite(value);
}
function hasStructurallyValidPoints(area: Q10SourceArea): boolean {
if (!area?.points?.length) return false;
return area.points.every((point) => isFiniteNumber(point?.x) && isFiniteNumber(point?.y));
}
function isStructurallyValidArea(area: Q10SourceArea): boolean {
if (!hasStructurallyValidPoints(area)) return false;
if (area.type === "virtualWall") {
return area.points.length === 2;
}
return area.points.length >= 3;
}
function filterOverlayAreas(areas: Q10SourceArea[]): Q10SourceArea[] {
return areas.filter((area) => isStructurallyValidArea(area));
}
/**
* The original Q10 app stores parsed overlay geometry directly on the live map
* model. It does not apply map-bounds plausibility heuristics here.
*
* This sanitizer is intentionally minimal and only strips structurally invalid
* data that would break later processing (missing / non-finite points, wrong
* point count for line-vs-area geometry).
*/
export function sanitizeQ10SourceOverlayAreas(header: B01MapHeader, source: Q10SourceData): Q10SourceData {
void header;
const virtualWalls = filterOverlayAreas(source.virtualWalls);
const forbidAreas = filterOverlayAreas(source.forbidAreas);
const mopAreas = filterOverlayAreas(source.mopAreas);
const thresholdAreas = filterOverlayAreas(source.thresholdAreas);
const eraseAreas = filterOverlayAreas(source.eraseAreas);
const carpetAreas = filterOverlayAreas(source.carpetAreas);
const changed =
virtualWalls.length !== source.virtualWalls.length ||
forbidAreas.length !== source.forbidAreas.length ||
mopAreas.length !== source.mopAreas.length ||
thresholdAreas.length !== source.thresholdAreas.length ||
eraseAreas.length !== source.eraseAreas.length ||
carpetAreas.length !== source.carpetAreas.length;
if (!changed) return source;
return {
...source,
virtualWalls,
forbidAreas,
mopAreas,
thresholdAreas,
eraseAreas,
carpetAreas
};
}