83 lines
2.6 KiB
C++
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;
|
|
}
|