Merge remote-tracking branch 'origin/master' into ICM20948_fix

# Conflicts:
#	esp32/src/main.cpp
#	esp32/src/peripherals/peripherals.cpp
This commit is contained in:
Niklas Jensen
2025-11-27 18:17:19 +01:00
9 changed files with 56 additions and 25 deletions
+18 -5
View File
@@ -1,5 +1,5 @@
import { writable } from 'svelte/store' import { writable } from 'svelte/store'
import type { IMU } from '$lib/types/models' import type { IMUMsg } from '$lib/types/models'
const maxIMUData = 100 const maxIMUData = 100
@@ -14,11 +14,24 @@ export const imu = (() => {
bmp_temp: [] as number[] bmp_temp: [] as number[]
}) })
const addData = (content: IMU) => { const addData = (content: IMUMsg) => {
update(data => { update(data => {
;(Object.keys(content) as (keyof IMU)[]).forEach(key => { if (content.imu && content.imu[3]) {
data[key] = [...data[key], content[key]].slice(-maxIMUData) data.x = [...data.x, content.imu[0]].slice(-maxIMUData)
}) data.y = [...data.y, content.imu[1]].slice(-maxIMUData)
data.z = [...data.z, content.imu[2]].slice(-maxIMUData)
}
if (content.mag && content.mag[4]) {
data.heading = [...data.heading, content.mag[3]].slice(-maxIMUData)
}
if (content.bmp && content.bmp[3]) {
data.pressure = [...data.pressure, content.bmp[0]].slice(-maxIMUData)
data.altitude = [...data.altitude, content.bmp[1]].slice(-maxIMUData)
data.bmp_temp = [...data.bmp_temp, content.bmp[2]].slice(-maxIMUData)
}
return data return data
}) })
} }
+6
View File
@@ -154,6 +154,12 @@ export type IMU = {
pressure: number pressure: number
} }
export type IMUMsg = {
imu: [number, number, number, boolean]
mag: [number, number, number, number, boolean]
bmp: [number, number, number, boolean]
}
export interface I2CDevice { export interface I2CDevice {
address: number address: number
part_number: string part_number: string
+2 -2
View File
@@ -6,7 +6,7 @@
import { slide } from 'svelte/transition' import { slide } from 'svelte/transition'
import { onDestroy, onMount } from 'svelte' import { onDestroy, onMount } from 'svelte'
import { socket } from '$lib/stores' import { socket } from '$lib/stores'
import { MessageTopic, type IMU } from '$lib/types/models' import { MessageTopic, type IMUMsg } from '$lib/types/models'
import { useFeatureFlags } from '$lib/stores/featureFlags' import { useFeatureFlags } from '$lib/stores/featureFlags'
import { Rotate3d } from '$lib/components/icons' import { Rotate3d } from '$lib/components/icons'
@@ -201,7 +201,7 @@
} }
onMount(() => { onMount(() => {
socket.on(MessageTopic.imu, (data: IMU) => { socket.on(MessageTopic.imu, (data: IMUMsg) => {
console.log(data) console.log(data)
imu.addData(data) imu.addData(data)
}) })
+4 -4
View File
@@ -38,16 +38,16 @@ class CommAdapterBase {
array.add(event); array.add(event);
array.add(payload); array.add(payload);
// TODO: Only send to subscribed
#if USE_MSGPACK #if USE_MSGPACK
std::string bin; std::string bin;
serializeMsgPack(doc, bin); serializeMsgPack(doc, bin);
send(reinterpret_cast<const uint8_t *>(bin.data()), bin.size(), -1); // TODO: Make CID dynamic xSemaphoreGive(mutex_);
send(reinterpret_cast<const uint8_t *>(bin.data()), bin.size(), -1);
#else #else
String out; String out;
serializeJson(doc, out); serializeJson(doc, out);
send(out.c_str(), cid); xSemaphoreGive(mutex_);
send(out.c_str(), -1);
#endif #endif
} }
@@ -10,7 +10,7 @@
#include <communication/comm_base.hpp> #include <communication/comm_base.hpp>
class Websocket : CommAdapterBase { class Websocket : public CommAdapterBase {
public: public:
Websocket(PsychicHttpServer &server, const char *route = "/api/ws"); Websocket(PsychicHttpServer &server, const char *route = "/api/ws");
+2 -2
View File
@@ -3,7 +3,7 @@
#include <ESPmDNS.h> #include <ESPmDNS.h>
#include <PsychicHttp.h> #include <PsychicHttp.h>
#include <WiFi.h> #include <WiFi.h>
// #include <communication/websocket_adapter.h> #include <communication/websocket_adapter.h>
#include <filesystem.h> #include <filesystem.h>
#include <global.h> #include <global.h>
#include "esp_timer.h" #include "esp_timer.h"
@@ -25,7 +25,7 @@ void sleep();
void status(JsonObject &root); void status(JsonObject &root);
void metrics(JsonObject &root); void metrics(JsonObject &root);
void emitMetrics(); void emitMetrics(Websocket &socket);
const char *resetReason(esp_reset_reason_t reason); const char *resetReason(esp_reset_reason_t reason);
} // namespace system_service } // namespace system_service
+9 -1
View File
@@ -132,6 +132,12 @@ void IRAM_ATTR SpotControlLoopEntry(void *) {
#if FT_ENABLED(USE_WS2812) #if FT_ENABLED(USE_WS2812)
ledService.loop(); ledService.loop();
#endif #endif
EXECUTE_EVERY_N_MS(250, [&]() {
JsonDocument doc;
JsonVariant results = doc.to<JsonVariant>();
peripherals.getIMUResult(results);
socket.emit(EVENT_IMU, results);
});
vTaskDelayUntil(&xLastWakeTime, xFrequency); vTaskDelayUntil(&xLastWakeTime, xFrequency);
} }
} }
@@ -144,7 +150,9 @@ void IRAM_ATTR serviceLoopEntry(void *) {
MDNS.setInstanceName(APP_NAME); MDNS.setInstanceName(APP_NAME);
apService.begin(); apService.begin();
#if FT_ENABLED(USE_CAMERA)
cameraService.begin(); cameraService.begin();
#endif
setupServer(); setupServer();
@@ -155,7 +163,7 @@ void IRAM_ATTR serviceLoopEntry(void *) {
for (;;) { for (;;) {
wifiService.loop(); wifiService.loop();
apService.loop(); apService.loop();
EXECUTE_EVERY_N_MS(2000, system_service::emitMetrics()); EXECUTE_EVERY_N_MS(2000, system_service::emitMetrics(socket));
vTaskDelay(100 / portTICK_PERIOD_MS); vTaskDelay(100 / portTICK_PERIOD_MS);
} }
+6 -3
View File
@@ -166,13 +166,16 @@ float Peripherals::rightDistance() { return _right_distance; }
void Peripherals::getIMUResult(JsonVariant &root) { void Peripherals::getIMUResult(JsonVariant &root) {
#if FT_ENABLED(USE_MPU6050 || USE_BNO055 || USE_ICM20948) #if FT_ENABLED(USE_MPU6050 || USE_BNO055 || USE_ICM20948)
_imu.getResults(root); JsonVariant imu = root["imu"].to<JsonVariant>();
_imu.getResults(imu);
#endif #endif
#if FT_ENABLED(USE_HMC5883 || USE_ICM20948) #if FT_ENABLED(USE_HMC5883 || USE_ICM20948)
_mag.getResults(root); JsonVariant mag = root["mag"].to<JsonVariant>();
_mag.getResults(mag);
#endif #endif
#if FT_ENABLED(USE_BMP180) #if FT_ENABLED(USE_BMP180)
_bmp.getResults(root); JsonVariant bmp = root["bmp"].to<JsonVariant>();
_bmp.getResults(bmp);
#endif #endif
} }
+8 -7
View File
@@ -121,13 +121,14 @@ void metrics(JsonObject &root) {
root["core_temp"] = temperatureRead(); root["core_temp"] = temperatureRead();
} }
void emitMetrics() { void emitMetrics(Websocket &socket) {
// if (!socket.hasSubscribers(EVENT_ANALYTICS)) return; if (!socket.hasSubscribers(EVENT_ANALYTICS)) return;
// analyticsDoc.clear();
// JsonObject root = analyticsDoc.to<JsonObject>(); JsonDocument doc;
// system_service::metrics(root); JsonObject root = doc.to<JsonObject>();
// JsonVariant data = analyticsDoc.as<JsonVariant>(); system_service::metrics(root);
// socket.emit(EVENT_ANALYTICS, data); JsonVariant data = doc.as<JsonVariant>();
socket.emit(EVENT_ANALYTICS, data);
} }
const char *resetReason(esp_reset_reason_t reason) { const char *resetReason(esp_reset_reason_t reason) {