// // MeterCapabilities.swift // USB Meter // // Created by Codex on 23/03/2026. // import SwiftUI struct MeterCapabilities { let availableDataGroupIDs: [UInt8] let supportsDataGroupCommands: Bool let supportsScreenSettings: Bool let supportsRecordingThreshold: Bool let supportsFahrenheit: Bool let supportsChargerDetection: Bool let chargerTypeDescriptions: [UInt16: String] let screenDescriptions: [UInt16: String] func chargerTypeDescription(for index: UInt16) -> String { guard supportsChargerDetection else { return "-" } if let label = chargerTypeDescriptions[index] { return label } return index == 0 ? "Unknown" : "Unknown (\(index))" } func screenDescription(for index: UInt16) -> String? { screenDescriptions[index] } } extension MeterCapabilities { static let umFamily = MeterCapabilities( availableDataGroupIDs: Array(0...9), supportsDataGroupCommands: true, supportsScreenSettings: true, supportsRecordingThreshold: true, supportsFahrenheit: true, supportsChargerDetection: true, chargerTypeDescriptions: [ 1: "QC2", 2: "QC3", 3: "Apple 2.4A", 4: "Apple 2.1A", 5: "Apple 1.0A", 6: "Apple 0.5A", 7: "DCP 1.5A", 8: "Samsung" ], screenDescriptions: [ 0: "Main Measurement", 1: "Quick Charge", 2: "Charging Record", 3: "Cable Impedance", 4: "Graphing", 5: "System Settings" ] ) static let tc66c = MeterCapabilities( availableDataGroupIDs: [0, 1], supportsDataGroupCommands: false, supportsScreenSettings: false, supportsRecordingThreshold: false, supportsFahrenheit: false, supportsChargerDetection: false, chargerTypeDescriptions: [:], screenDescriptions: [:] ) } extension Model { static let byPeripheralName = Dictionary( uniqueKeysWithValues: allCases.flatMap { model in model.peripheralNames.map { ($0, model) } } ) var radio: BluetoothRadio { switch self { case .UM25C, .UM34C: return .BT18 case .TC66C: return .PW0316 } } var peripheralNames: [String] { switch self { case .UM25C: return ["UM25C"] case .UM34C: return ["UM34C"] case .TC66C: return ["TC66C", "PW0316"] } } var color: Color { switch self { case .UM25C: return .blue case .UM34C: return .yellow case .TC66C: return .black } } var capabilities: MeterCapabilities { switch self { case .UM25C, .UM34C: return .umFamily case .TC66C: return .tc66c } } }