USB-Meter / USB Meter / AppDelegate.swift
1 contributor
149 lines | 4.762kb
//
//  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.
    }
}