Adds imu calibration

This commit is contained in:
Rune Harlyk
2025-12-24 12:53:20 +01:00
parent e22ac69e9b
commit 3be08a31ed
6 changed files with 82 additions and 1 deletions
+5
View File
@@ -1,5 +1,6 @@
export enum MessageTopic {
imu = 'imu',
imuCalibrate = 'imuCalibrate',
mode = 'mode',
input = 'input',
analytics = 'analytics',
@@ -160,6 +161,10 @@ export type IMUMsg = {
bmp: [number, number, number, boolean]
}
export type IMUCalibrationResult = {
success: boolean
}
export interface I2CDevice {
address: number
part_number: string
+35 -1
View File
@@ -6,7 +6,7 @@
import { slide } from 'svelte/transition'
import { onDestroy, onMount } from 'svelte'
import { socket } from '$lib/stores'
import { MessageTopic, type IMUMsg } from '$lib/types/models'
import { MessageTopic, type IMUMsg, type IMUCalibrationResult } from '$lib/types/models'
import { useFeatureFlags } from '$lib/stores/featureFlags'
import { Rotate3d } from '$lib/components/icons'
@@ -14,6 +14,8 @@
const features = useFeatureFlags()
let intervalId: ReturnType<typeof setInterval> | number
let isCalibrating = $state(false)
let calibrationResult = $state<IMUCalibrationResult | null>(null)
let angleChartElement: HTMLCanvasElement
let tempChartElement: HTMLCanvasElement
@@ -206,14 +208,26 @@
imu.addData(data)
})
socket.on(MessageTopic.imuCalibrate, (data: IMUCalibrationResult) => {
isCalibrating = false
calibrationResult = data
})
initializeCharts()
intervalId = setInterval(updateData, 200)
})
onDestroy(() => {
socket.off(MessageTopic.imu)
socket.off(MessageTopic.imuCalibrate)
clearInterval(intervalId)
})
function startCalibration() {
isCalibrating = true
calibrationResult = null
socket.sendEvent(MessageTopic.imuCalibrate, {})
}
</script>
<SettingsCard collapsible={false}>
@@ -224,6 +238,26 @@
<span>IMU</span>
{/snippet}
<div class="flex items-center gap-2 mb-4">
<button
class="btn btn-sm btn-primary"
onclick={startCalibration}
disabled={isCalibrating || !$features.imu}
>
{#if isCalibrating}
<span class="loading loading-spinner loading-xs"></span>
Calibrating...
{:else}
Calibrate IMU
{/if}
</button>
{#if calibrationResult}
<span class="badge" class:badge-success={calibrationResult.success} class:badge-error={!calibrationResult.success}>
{calibrationResult.success ? 'Calibrated' : 'Failed'}
</span>
{/if}
</div>
{#if $features.imu}
<div class="w-full overflow-x-auto">
<div