// // AppDelegate.swift // USB Meter // // Created by Bogdan Timofte on 01/03/2020. // Copyright © 2020 Bogdan Timofte. All rights reserved. // import UIKit //let btSerial = BluetoothSerial(delegate: BSD()) let appData = AppData() enum Constants { static let chartUnderscan: CGFloat = 0.5 static let chartOverscan: CGFloat = 1 - chartUnderscan } // MARK: Clock // MARK: Debug public func track(_ message: String = "", file: String = #file, function: String = #function, line: Int = #line ) { guard shouldEmitTrackMessage(message, file: file, function: function) else { return } let date = Date() let calendar = Calendar.current let hour = calendar.component(.hour, from: date) let minutes = calendar.component(.minute, from: date) let seconds = calendar.component(.second, from: date) print("\(hour):\(minutes):\(seconds) - \(file):\(line) - \(function) \(message)") } private func shouldEmitTrackMessage(_ message: String, file: String, function: String) -> Bool { #if DEBUG if ProcessInfo.processInfo.environment["USB_METER_VERBOSE_LOGS"] == "1" { return true } #if targetEnvironment(macCatalyst) let importantMarkers = [ "Error", "error", "Failed", "failed", "timeout", "Timeout", "Missing", "missing", "overflow", "Disconnect", "disconnect", "Disconnected", "unauthorized", "not authorized", "not supported", "Unexpected", "Invalid Context", "ignored", "Guard:", "Skip data request", "Dropping unsolicited data", "This is not possible!", "Inferred", "Clearing", "Reconnecting" ] if importantMarkers.contains(where: { message.contains($0) }) { return true } let noisyFunctions: Set = [ "logRuntimeICloudDiagnostics()", "refreshCloudAvailability(reason:)", "start()", "centralManagerDidUpdateState(_:)", "discoveredMeter(peripheral:advertising:rssi:)", "connect()", "connectionEstablished()", "peripheral(_:didDiscoverServices:)", "peripheral(_:didDiscoverCharacteristicsFor:error:)", "refreshOperationalStateIfReady()", "peripheral(_:didUpdateNotificationStateFor:error:)", "scheduleDataDumpRequest(after:reason:)" ] if noisyFunctions.contains(function) { return false } let noisyMarkers = [ "Runtime iCloud diagnostics", "iCloud availability", "Starting Bluetooth manager", "Bluetooth is On... Start scanning...", "adding new USB Meter", "Connect called for", "Connection established for", "Optional([ Bool { logRuntimeICloudDiagnostics() return true } private func logRuntimeICloudDiagnostics() { #if DEBUG let hasUbiquityIdentityToken = FileManager.default.ubiquityIdentityToken != nil track("Runtime iCloud diagnostics: ubiquityIdentityTokenAvailable=\(hasUbiquityIdentityToken)") #endif } // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { // Called when a new scene session is being created. // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { // Called when the user discards a scene session. // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } }