import Foundation import CoreLocation import CoreMotion /** * QUIXZOOM Capture Session * * Representerar en inspelningssession med all metadata. * Varje session får ett unikt uppdrags-ID. */ struct CaptureSession: Codable, Identifiable { let id: String let missionId: String let startTime: Date var endTime: Date? var mode: CaptureMode var status: SessionStatus // Konfiguration var config: SessionConfig // Insamlad data var frames: [FrameMetadata] var telemetry: [TelemetryData] var path: [GPSPoint] var instructions: [AIInstruction] // Kvalitet var qualityScore: Double var reliabilityScore: Double enum CaptureMode: String, Codable { case recording // Nivå 1: Basinsamling case guided // Nivå 2: AI-guidad case mission // Nivå 3: Uppdragsbaserad case adaptive // Nivå 4: Adaptiv intelligens } enum SessionStatus: String, Codable { case preparing case recording case paused case uploading case completed case failed } } struct SessionConfig: Codable { var videoQuality: VideoQuality var telemetryRate: Double // Hz var uploadMode: UploadMode var missionType: String? // "crosswalks", "streetlights", etc. var area: AreaConfig? enum VideoQuality: String, Codable { case p720 = "720p" case p1080 = "1080p" case p4K = "4K" } enum UploadMode: String, Codable { case realtime // Direktuppladdning case buffered // Buffra lokalt, ladda upp vid wifi case manual // Manuell uppladdning } } struct AreaConfig: Codable { var name: String var bounds: GeoBounds var targetObjects: [String]? } struct GeoBounds: Codable { var minLat: Double var maxLat: Double var minLng: Double var maxLng: Double } struct FrameMetadata: Codable { let timestamp: Date let frameId: String let gps: GPSPoint let quality: Double let fileSize: Int } struct TelemetryData: Codable { let timestamp: Date let gps: GPSPoint let imu: IMUData let compass: Double let altitude: Double } struct GPSPoint: Codable { let latitude: Double let longitude: Double let accuracy: Double let altitude: Double let timestamp: Date } struct IMUData: Codable { let accelerometer: XYZ let gyroscope: XYZ let magnetometer: XYZ? } struct XYZ: Codable { let x: Double let y: Double let z: Double } struct AIInstruction: Codable { let timestamp: Date let text: String let priority: String let reason: String var completed: Bool var completedAt: Date? }