fix detection 1 id only

This commit is contained in:
admin committed 2026-09-11 15:19:14 +07:00
1 parent 1702d68979
commit 37b551c0ed
2 files changed
+64 -8

No files matched your search

+56 -7
View File
@@ -153,6 +153,21 @@ bool LD2453Parser::tryParseFrame() {
// Frame hợp lệ! Parse data // Frame hợp lệ! Parse data
uint8_t *data = _ringBuffer + headerPos + HEADER_SIZE; uint8_t *data = _ringBuffer + headerPos + HEADER_SIZE;
// Debug: dump toàn bộ data section nếu có byte nào khác 0
bool hasData = false;
for (size_t i = 0; i < DATA_SIZE; i++) {
if (data[i] != 0) { hasData = true; break; }
}
if (hasData && _rawDebug) {
Serial.print(F("[DATA SECTION] "));
for (size_t i = 0; i < DATA_SIZE; i++) {
if (data[i] < 0x10) Serial.print('0');
Serial.print(data[i], HEX);
Serial.print(' ');
}
Serial.println();
}
// Reset frame // Reset frame
_lastFrame.timestamp_ms = millis(); _lastFrame.timestamp_ms = millis();
_lastFrame.sequence_number = ++_sequenceCounter; _lastFrame.sequence_number = ++_sequenceCounter;
@@ -163,18 +178,37 @@ bool LD2453Parser::tryParseFrame() {
for (uint8_t t = 0; t < MAX_TARGETS; t++) { for (uint8_t t = 0; t < MAX_TARGETS; t++) {
uint8_t *targetData = data + (t * TARGET_RECORD_SIZE); uint8_t *targetData = data + (t * TARGET_RECORD_SIZE);
// Byte layout (giả định, cần verify với manual): if (hasData && _rawDebug) {
Serial.print(F("[SLOT "));
Serial.print(t + 1);
Serial.print(F("] "));
for (size_t i = 0; i < TARGET_RECORD_SIZE; i++) {
if (targetData[i] < 0x10) Serial.print('0');
Serial.print(targetData[i], HEX);
Serial.print(' ');
}
Serial.println();
}
// Byte layout (v1 - giả định LD2450 style):
// [0-1]: X (little endian, signed 16-bit, mm) // [0-1]: X (little endian, signed 16-bit, mm)
// [2-3]: Y (little endian, signed 16-bit, mm) // [2-3]: Y (little endian, signed 16-bit, mm)
// [4-5]: Speed (little endian, signed 16-bit, cm/s) // [4-5]: Speed (little endian, signed 16-bit, cm/s)
// [6-7]: Reserved hoặc distance // [6]: Valid flag / target ID
// [7]: Reserved
uint8_t validByte = targetData[6];
int16_t x = (int16_t)(targetData[0] | (targetData[1] << 8)); int16_t x = (int16_t)(targetData[0] | (targetData[1] << 8));
int16_t y = (int16_t)(targetData[2] | (targetData[3] << 8)); int16_t y = (int16_t)(targetData[2] | (targetData[3] << 8));
int16_t speed = (int16_t)(targetData[4] | (targetData[5] << 8)); int16_t speed = (int16_t)(targetData[4] | (targetData[5] << 8));
// Target valid nếu không phải tất cả đều 0 // Target valid: có valid byte != 0 HOẶC có tọa độ/speed != 0
bool valid = (x != 0 || y != 0 || speed != 0); bool valid = (validByte != 0) || (x != 0 || y != 0 || speed != 0);
// Nếu valid byte khác 0 nhưng tọa độ 0 thì vẫn valid (target đứng yên)
if (validByte != 0 && (x == 0 && y == 0 && speed == 0)) {
valid = false; // Không valid nếu có flag nhưng tọa độ 0
}
_lastFrame.targets[t].valid = valid; _lastFrame.targets[t].valid = valid;
_lastFrame.targets[t].x_mm = x; _lastFrame.targets[t].x_mm = x;
@@ -182,10 +216,25 @@ bool LD2453Parser::tryParseFrame() {
_lastFrame.targets[t].speed = speed; _lastFrame.targets[t].speed = speed;
if (valid) { if (valid) {
// Tính distance và angle từ x, y if (x != 0 || y != 0) {
_lastFrame.targets[t].distance_mm = sqrt(x*x + y*y); _lastFrame.targets[t].distance_mm = sqrt((float)x*x + (float)y*y);
_lastFrame.targets[t].angle_deg = atan2(x, y) * 180.0 / PI; _lastFrame.targets[t].angle_deg = atan2((float)x, (float)y) * 180.0 / PI;
} else {
_lastFrame.targets[t].distance_mm = 0;
_lastFrame.targets[t].angle_deg = 0;
}
_lastFrame.targetCount++; _lastFrame.targetCount++;
if (_rawDebug) {
Serial.print(F(" -> Valid! X="));
Serial.print(x);
Serial.print(F(" Y="));
Serial.print(y);
Serial.print(F(" Speed="));
Serial.print(speed);
Serial.print(F(" ValidByte=0x"));
Serial.println(validByte, HEX);
}
} else { } else {
_lastFrame.targets[t].distance_mm = 0; _lastFrame.targets[t].distance_mm = 0;
_lastFrame.targets[t].angle_deg = 0; _lastFrame.targets[t].angle_deg = 0;
+8 -1
View File
@@ -101,9 +101,12 @@ void WebServerManager::broadcastFrame(const RadarFrame &frame) {
doc["node_id"] = frame.node_id; doc["node_id"] = frame.node_id;
doc["sequence"] = frame.sequence_number; doc["sequence"] = frame.sequence_number;
doc["timestamp"] = frame.timestamp_ms; doc["timestamp"] = frame.timestamp_ms;
doc["target_count"] = frame.targetCount;
JsonArray targets = doc["targets"].to<JsonArray>(); JsonArray targets = doc["targets"].to<JsonArray>();
for (uint8_t i = 0; i < frame.targetCount && i < 3; i++) { // Loop qua TẤT CẢ 3 slot, không chỉ dựa vào targetCount
// Đảm bảo target ở slot 2 vẫn được gửi ngay cả khi slot 1 trống
for (uint8_t i = 0; i < 3; i++) {
const RadarTarget &t = frame.targets[i]; const RadarTarget &t = frame.targets[i];
JsonObject jt = targets.add<JsonObject>(); JsonObject jt = targets.add<JsonObject>();
jt["id"] = i + 1; // radar slot index, NOT a persistent person ID jt["id"] = i + 1; // radar slot index, NOT a persistent person ID
@@ -111,6 +114,10 @@ void WebServerManager::broadcastFrame(const RadarFrame &frame) {
jt["x"] = t.x_mm; jt["x"] = t.x_mm;
jt["y"] = t.y_mm; jt["y"] = t.y_mm;
jt["speed"] = t.speed; jt["speed"] = t.speed;
if (t.valid) {
jt["distance"] = (int)t.distance_mm;
jt["angle"] = (int)t.angle_deg;
}
} }
String out; String out;