|
Bogdan Timofte
authored
2 weeks ago
|
1
|
//
|
|
|
2
|
// DataStore.swift
|
|
|
3
|
// USB Meter
|
|
|
4
|
//
|
|
|
5
|
// Created by Bogdan Timofte on 03/03/2020.
|
|
|
6
|
// Copyright © 2020 Bogdan Timofte. All rights reserved.
|
|
|
7
|
//
|
|
|
8
|
|
|
|
9
|
import SwiftUI
|
|
|
10
|
import Combine
|
|
|
11
|
import CoreBluetooth
|
|
|
12
|
|
|
|
13
|
final class AppData : ObservableObject {
|
|
Bogdan Timofte
authored
2 weeks ago
|
14
|
private var bluetoothManagerNotification: AnyCancellable?
|
|
Bogdan Timofte
authored
a week ago
|
15
|
private var meterStoreObserver: AnyCancellable?
|
|
|
16
|
private var meterStoreCloudObserver: AnyCancellable?
|
|
|
17
|
private let meterStore = MeterNameStore.shared
|
|
Bogdan Timofte
authored
2 weeks ago
|
18
|
|
|
Bogdan Timofte
authored
2 weeks ago
|
19
|
init() {
|
|
Bogdan Timofte
authored
2 weeks ago
|
20
|
bluetoothManagerNotification = bluetoothManager.objectWillChange.sink { [weak self] _ in
|
|
Bogdan Timofte
authored
2 weeks ago
|
21
|
self?.scheduleObjectWillChange()
|
|
Bogdan Timofte
authored
2 weeks ago
|
22
|
}
|
|
Bogdan Timofte
authored
a week ago
|
23
|
meterStoreObserver = NotificationCenter.default.publisher(for: .meterNameStoreDidChange)
|
|
|
24
|
.receive(on: DispatchQueue.main)
|
|
|
25
|
.sink { [weak self] _ in
|
|
|
26
|
self?.refreshMeterMetadata()
|
|
|
27
|
}
|
|
|
28
|
meterStoreCloudObserver = NotificationCenter.default.publisher(for: .meterNameStoreCloudStatusDidChange)
|
|
|
29
|
.receive(on: DispatchQueue.main)
|
|
|
30
|
.sink { [weak self] _ in
|
|
|
31
|
self?.scheduleObjectWillChange()
|
|
|
32
|
}
|
|
Bogdan Timofte
authored
2 weeks ago
|
33
|
}
|
|
Bogdan Timofte
authored
a week ago
|
34
|
|
|
Bogdan Timofte
authored
2 weeks ago
|
35
|
let bluetoothManager = BluetoothManager()
|
|
Bogdan Timofte
authored
a week ago
|
36
|
|
|
Bogdan Timofte
authored
2 weeks ago
|
37
|
@Published var enableRecordFeature: Bool = true
|
|
Bogdan Timofte
authored
a week ago
|
38
|
|
|
Bogdan Timofte
authored
2 weeks ago
|
39
|
@Published var meters: [UUID:Meter] = [UUID:Meter]()
|
|
Bogdan Timofte
authored
a week ago
|
40
|
|
|
|
41
|
var cloudAvailability: MeterNameStore.CloudAvailability {
|
|
|
42
|
meterStore.currentCloudAvailability
|
|
|
43
|
}
|
|
|
44
|
|
|
|
45
|
func meterName(for macAddress: String) -> String? {
|
|
|
46
|
meterStore.name(for: macAddress)
|
|
|
47
|
}
|
|
|
48
|
|
|
|
49
|
func setMeterName(_ name: String, for macAddress: String) {
|
|
|
50
|
meterStore.upsert(macAddress: macAddress, name: name, temperatureUnitRawValue: nil)
|
|
|
51
|
}
|
|
|
52
|
|
|
|
53
|
func temperatureUnitPreference(for macAddress: String) -> TemperatureUnitPreference {
|
|
|
54
|
let rawValue = meterStore.temperatureUnitRawValue(for: macAddress) ?? TemperatureUnitPreference.celsius.rawValue
|
|
|
55
|
return TemperatureUnitPreference(rawValue: rawValue) ?? .celsius
|
|
|
56
|
}
|
|
|
57
|
|
|
|
58
|
func setTemperatureUnitPreference(_ preference: TemperatureUnitPreference, for macAddress: String) {
|
|
|
59
|
meterStore.upsert(macAddress: macAddress, name: nil, temperatureUnitRawValue: preference.rawValue)
|
|
Bogdan Timofte
authored
2 weeks ago
|
60
|
}
|
|
Bogdan Timofte
authored
2 weeks ago
|
61
|
|
|
|
62
|
private func scheduleObjectWillChange() {
|
|
|
63
|
DispatchQueue.main.async { [weak self] in
|
|
|
64
|
self?.objectWillChange.send()
|
|
|
65
|
}
|
|
|
66
|
}
|
|
Bogdan Timofte
authored
a week ago
|
67
|
|
|
|
68
|
private func refreshMeterMetadata() {
|
|
|
69
|
DispatchQueue.main.async { [weak self] in
|
|
|
70
|
guard let self else { return }
|
|
|
71
|
var didUpdateAnyMeter = false
|
|
|
72
|
for meter in self.meters.values {
|
|
|
73
|
let mac = meter.btSerial.macAddress.description
|
|
|
74
|
let displayName = self.meterName(for: mac) ?? mac
|
|
|
75
|
if meter.name != displayName {
|
|
|
76
|
meter.updateNameFromStore(displayName)
|
|
|
77
|
didUpdateAnyMeter = true
|
|
|
78
|
}
|
|
|
79
|
|
|
|
80
|
let previousTemperaturePreference = meter.tc66TemperatureUnitPreference
|
|
|
81
|
meter.reloadTemperatureUnitPreference()
|
|
|
82
|
if meter.tc66TemperatureUnitPreference != previousTemperaturePreference {
|
|
|
83
|
didUpdateAnyMeter = true
|
|
|
84
|
}
|
|
|
85
|
}
|
|
|
86
|
|
|
|
87
|
if didUpdateAnyMeter {
|
|
|
88
|
self.scheduleObjectWillChange()
|
|
|
89
|
}
|
|
|
90
|
}
|
|
|
91
|
}
|
|
Bogdan Timofte
authored
2 weeks ago
|
92
|
}
|