35 lines
1.8 KiB
C++
35 lines
1.8 KiB
C++
#include <ArduinoJson.h>
|
|
#include "rs485_transport.h"
|
|
#include "sensor_node_config.h"
|
|
|
|
void initRs485(HardwareSerial& serial) {
|
|
pinMode(RS485_DE_PIN, OUTPUT); digitalWrite(RS485_DE_PIN, LOW);
|
|
serial.begin(RS485_BAUD, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN);
|
|
}
|
|
|
|
void publishSensorStatus(HardwareSerial& serial, const ImuState& imu, const GpsState& gps) {
|
|
StaticJsonDocument<1024> doc;
|
|
doc["type"] = "sensor_status"; doc["schema_version"] = SENSOR_NODE_SCHEMA_VERSION;
|
|
doc["node_id"] = SENSOR_NODE_NAME; doc["firmware_version"] = SENSOR_NODE_FIRMWARE_VERSION;
|
|
doc["uptime_ms"] = millis();
|
|
JsonObject i = doc.createNestedObject("imu");
|
|
i["online"] = imu.online; i["valid"] = imu.valid && millis() - imu.lastUpdateMs <= SENSOR_STALE_MS;
|
|
i["accuracy"] = imu.accuracy;
|
|
JsonObject q = i.createNestedObject("quaternion"); q["i"] = imu.i; q["j"] = imu.j; q["k"] = imu.k; q["real"] = imu.real;
|
|
i["yaw_degrees"] = imu.yawDegrees; i["pitch_degrees"] = imu.pitchDegrees; i["roll_degrees"] = imu.rollDegrees;
|
|
JsonObject g = doc.createNestedObject("gps");
|
|
g["online"] = gps.online; g["fix"] = gps.fix; g["satellites"] = gps.satellites;
|
|
g["latitude"] = gps.latitude; g["longitude"] = gps.longitude; g["altitude_meters"] = gps.altitudeMeters;
|
|
g["speed_kph"] = gps.speedKph; g["course_degrees"] = gps.courseDegrees;
|
|
JsonObject utc = g.createNestedObject("utc"); utc["year"] = gps.year; utc["month"] = gps.month; utc["day"] = gps.day;
|
|
utc["hour"] = gps.hour; utc["minute"] = gps.minute; utc["second"] = gps.second;
|
|
digitalWrite(RS485_DE_PIN, HIGH); delayMicroseconds(20);
|
|
serializeJson(doc, serial); serial.write('\n'); serial.flush();
|
|
digitalWrite(RS485_DE_PIN, LOW);
|
|
|
|
#if USB_TELEMETRY_ENABLED
|
|
serializeJson(doc, Serial);
|
|
Serial.println();
|
|
#endif
|
|
}
|