feat: Merge SaltyTag BLE — GPS/IMU streaming to UWB tag, anchor display, UWB position authority #5

Open
sl-ios wants to merge 19 commits from sl-ios/saltytag-merge into main
2 changed files with 8 additions and 8 deletions
Showing only changes of commit 6fa2a1b03f - Show all commits

View File

@ -74,7 +74,7 @@ struct BLEStatusView: View {
Label {
VStack(alignment: .leading, spacing: 2) {
Text("GPS → Tag")
Text("5 Hz · 20 bytes/packet")
Text("1 Hz · 20 bytes/packet")
.font(.caption).foregroundStyle(.secondary)
}
} icon: {
@ -86,7 +86,7 @@ struct BLEStatusView: View {
Label {
VStack(alignment: .leading, spacing: 2) {
Text("IMU → Tag")
Text("10 Hz · 22 bytes/packet (accel + gyro + mag)")
Text("2 Hz · 22 bytes/packet (accel + gyro + mag)")
.font(.caption).foregroundStyle(.secondary)
}
} icon: {

View File

@ -116,8 +116,8 @@ final class SensorManager: NSObject, ObservableObject {
// MARK: - Timers
private var mqttGPSTimer: Timer? // 1 Hz MQTT publish
private var bleGPSTimer: Timer? // 5 Hz BLE GPS write
private var bleIMUTimer: Timer? // 10 Hz BLE IMU write
private var bleGPSTimer: Timer? // 1 Hz BLE GPS write
private var bleIMUTimer: Timer? // 2 Hz BLE IMU write
private var uwbStalenessTimer: Timer?
private var rateTimer: Timer?
@ -263,13 +263,13 @@ final class SensorManager: NSObject, ObservableObject {
private func startBLETimers() {
stopBLETimers()
// GPS tag at 5 Hz (200 ms)
bleGPSTimer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { [weak self] _ in
// GPS tag at 1 Hz (1000 ms) throttled to avoid flooding constrained ESP32
bleGPSTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
guard let self, let loc = self.lastKnownLocation else { return }
self.ble.sendGPS(BLEPackets.gpsPacket(from: loc))
}
// IMU tag at 10 Hz (100 ms)
bleIMUTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ in
// IMU tag at 2 Hz (500 ms) throttled to avoid flooding constrained ESP32
bleIMUTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { [weak self] _ in
guard let self, let motion = self.lastKnownMotion else { return }
self.ble.sendIMU(BLEPackets.imuPacket(from: motion))
}