Files
blackroad-watch/watch-app/BlackRoadWatchApp.swift

116 lines
3.1 KiB
Swift

import SwiftUI
import WatchConnectivity
// MARK: - Watch App Entry Point
@main
struct BlackRoadWatchApp: App {
@StateObject private var dataStore = WatchDataStore.shared
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(dataStore)
}
}
}
// MARK: - Watch Data Store (receives from iPhone)
class WatchDataStore: NSObject, ObservableObject {
static let shared = WatchDataStore()
@Published var sensor: SensorData?
@Published var ai: AIStatus?
@Published var health: SystemHealth?
@Published var lastUpdate: Date?
@Published var isConnected = false
private var wcSession: WCSession?
override init() {
super.init()
guard WCSession.isSupported() else { return }
wcSession = WCSession.default
wcSession?.delegate = self
wcSession?.activate()
}
private func processContext(_ context: [String: Any]) {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if let sensorDict = context["sensor"],
let sensorData = try? JSONSerialization.data(withJSONObject: sensorDict),
let sensor = try? JSONDecoder().decode(SensorData.self, from: sensorData) {
self.sensor = sensor
}
if let aiDict = context["ai"],
let aiData = try? JSONSerialization.data(withJSONObject: aiDict),
let ai = try? JSONDecoder().decode(AIStatus.self, from: aiData) {
self.ai = ai
}
if let healthDict = context["health"],
let healthData = try? JSONSerialization.data(withJSONObject: healthDict),
let health = try? JSONDecoder().decode(SystemHealth.self, from: healthData) {
self.health = health
}
self.lastUpdate = Date()
self.isConnected = true
}
}
}
extension WatchDataStore: WCSessionDelegate {
func session(_ session: WCSession, activationDidCompleteWith state: WCSessionActivationState, error: Error?) {}
func session(_ session: WCSession, didReceiveMessage message: [String: Any]) {
processContext(message)
}
func session(_ session: WCSession, didReceiveApplicationContext context: [String: Any]) {
processContext(context)
}
}
// MARK: - Shared Data Models (same as iOS app)
struct SensorData: Codable {
var temperature: Double
var humidity: Double
var light: Int
var accelX: Double
var accelY: Double
var accelZ: Double
var batteryMV: Int
var uptimeSec: UInt32
}
struct AIStatus: Codable {
var modelID: Int
var confidence: Int
var inferenceMS: Int
var totalInferences: UInt32
var npuLoad: Int
var npuTemp: Int
var classID: Int
}
struct SystemHealth: Codable {
var fleetOnline: Int
var fleetTotal: Int
var agentsActive: Int
var trafficGreen: Int
var trafficYellow: Int
var trafficRed: Int
var tasksPending: Int
var tasksDone: Int
var memoryEntries: UInt32
var reposCount: Int
var cfProjects: Int
var cpuLoad: Double
}