Files
esp32s3-ld2453/ZoneManager.cpp
T
2026-09-11 12:20:25 +07:00

83 lines
2.6 KiB
C++

// =====================================================================
// ZoneManager.cpp
// =====================================================================
#include "ZoneManager.h"
#include <ArduinoJson.h>
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 {
JsonDocument doc;
JsonArray arr = doc.to<JsonArray>();
for (uint8_t i = 0; i < MAX_ZONES; i++) {
JsonObject z = arr.add<JsonObject>();
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) {
JsonDocument 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;
}