1 contributor
//
// 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<String> = [
"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([<CBService:",
"Optional([<CBCharacteristic:",
"Waiting for notifications on",
"Notification state updated for",
"Peripheral ready with notify",
"Schedule data request in",
"Operational state changed"
]
if noisyMarkers.contains(where: { message.contains($0) }) {
return false
}
#endif
return true
#else
_ = file
_ = function
return false
#endif
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> 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<UISceneSession>) {
// 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.
}
}