// ===================================================================== // ZoneManager.cpp // ===================================================================== #include "ZoneManager.h" #include ZoneManager::ZoneManager() { // Same default layout as the original ESP32-LD2450 project // (three thirds of the room, roughly), in millimeters. Adjust to // taste or override via POST /updateZones once the web UI is up. _zones[0] = { -4000, 1, -1, 4000 }; _zones[1] = { 1, 1, 4000, 4000 }; _zones[2] = { -4001, 4001, 4001, 6000 }; for (uint8_t i = 0; i < MAX_ZONES; i++) _occupied[i] = false; } bool ZoneManager::pointInZone(int x, int y, const Zone &z) { return x >= z.x1 && x <= z.x2 && y >= z.y1 && y <= z.y2; } void ZoneManager::update(const RadarFrame &frame) { bool temp[MAX_ZONES] = { false, false, false }; for (uint8_t t = 0; t < frame.targetCount && t < 3; t++) { const RadarTarget &target = frame.targets[t]; if (!target.valid) continue; for (uint8_t z = 0; z < MAX_ZONES; z++) { if (pointInZone(target.x_mm, target.y_mm, _zones[z])) { temp[z] = true; } } } for (uint8_t z = 0; z < MAX_ZONES; z++) _occupied[z] = temp[z]; } bool ZoneManager::isZoneOccupied(uint8_t zoneIndex) const { if (zoneIndex >= MAX_ZONES) return false; return _occupied[zoneIndex]; } Zone ZoneManager::getZone(uint8_t zoneIndex) const { if (zoneIndex >= MAX_ZONES) return Zone{0, 0, 0, 0}; return _zones[zoneIndex]; } void ZoneManager::setZone(uint8_t zoneIndex, const Zone &zone) { if (zoneIndex >= MAX_ZONES) return; _zones[zoneIndex] = zone; } String ZoneManager::zonesToJson() const { StaticJsonDocument<512> doc; JsonArray arr = doc.to(); for (uint8_t i = 0; i < MAX_ZONES; i++) { JsonObject z = arr.createNestedObject(); z["id"] = i + 1; z["x1"] = _zones[i].x1; z["y1"] = _zones[i].y1; z["x2"] = _zones[i].x2; z["y2"] = _zones[i].y2; z["occupied"] = _occupied[i]; } String out; serializeJson(doc, out); return out; } bool ZoneManager::zonesFromJson(const uint8_t *data, size_t len) { StaticJsonDocument<512> doc; DeserializationError err = deserializeJson(doc, data, len); if (err) return false; for (uint8_t i = 0; i < MAX_ZONES; i++) { _zones[i].x1 = doc[i]["x1"] | _zones[i].x1; _zones[i].y1 = doc[i]["y1"] | _zones[i].y1; _zones[i].x2 = doc[i]["x2"] | _zones[i].x2; _zones[i].y2 = doc[i]["y2"] | _zones[i].y2; } return true; }