mobile-ios/CovidSafe/Herald/Sensor/SensorArray.swift

60 lines
2.2 KiB
Swift
Raw Permalink Normal View History

2020-12-19 05:13:44 +00:00
//
// SensorArray.swift
//
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: MIT
//
import Foundation
import UIKit
/// Sensor array for combining multiple detection and tracking methods.
public class SensorArray : NSObject, Sensor {
private let logger = ConcreteSensorLogger(subsystem: "Sensor", category: "SensorArray")
private var sensorArray: [Sensor] = []
private var sensorDelegates: [SensorDelegate] = []
public let payloadData: PayloadData
public static let deviceDescription = "\(UIDevice.current.name) (iOS \(UIDevice.current.systemVersion))"
public init(_ payloadDataSupplier: PayloadDataSupplier) {
logger.debug("init")
// BLE sensor for detecting and tracking proximity
sensorArray.append(ConcreteBLESensor(payloadDataSupplier))
// Payload data at initiation time for identifying this device in the logs
payloadData = payloadDataSupplier.payload(PayloadTimestamp())
super.init()
// Loggers
#if DEBUG
add(delegate: ContactLog(filename: "contacts.csv"))
add(delegate: StatisticsLog(filename: "statistics.csv", payloadData: payloadData))
add(delegate: DetectionLog(filename: "detection.csv", payloadData: payloadData))
_ = BatteryLog(filename: "battery.csv")
#endif
logger.info("DEVICE (payloadPrefix=\(payloadData.shortName),description=\(SensorArray.deviceDescription))")
}
public func add(delegate: SensorDelegate) {
sensorDelegates.append(delegate)
sensorArray.forEach { $0.add(delegate: delegate) }
}
public func start() {
logger.debug("start")
sensorArray.forEach { $0.start() }
}
public func stop() {
logger.debug("stop")
sensorArray.forEach { $0.stop() }
}
public func startAwakeSensor() {
// Location sensor is necessary for enabling background BLE advert detection
let awakeSensor = ConcreteAwakeSensor(rangeForBeacon: UUID(uuidString: BLESensorConfiguration.serviceUUID.uuidString))
sensorDelegates.forEach { awakeSensor.add(delegate: $0) }
sensorArray.append(awakeSensor)
awakeSensor.start()
}
}