112 lines
2.8 KiB
Swift
112 lines
2.8 KiB
Swift
import Foundation
|
|
import CoreUnitTypes
|
|
|
|
public struct State: Equatable {
|
|
|
|
public var sensors: Sensors
|
|
|
|
public init(sensors: Sensors = .init()) {
|
|
self.sensors = sensors
|
|
}
|
|
|
|
public struct Sensors: Equatable {
|
|
|
|
public var mixedSensor: TemperatureHumiditySensor<Mixed>
|
|
public var postCoilSensor: TemperatureHumiditySensor<PostCoil>
|
|
public var returnSensor: TemperatureHumiditySensor<Return>
|
|
public var supplySensor: TemperatureHumiditySensor<Supply>
|
|
|
|
public init(
|
|
mixedSensor: TemperatureHumiditySensor<Mixed> = .init(),
|
|
postCoilSensor: TemperatureHumiditySensor<PostCoil> = .init(),
|
|
returnSensor: TemperatureHumiditySensor<Return> = .init(),
|
|
supplySensor: TemperatureHumiditySensor<Supply> = .init()
|
|
) {
|
|
self.mixedSensor = mixedSensor
|
|
self.postCoilSensor = postCoilSensor
|
|
self.returnSensor = returnSensor
|
|
self.supplySensor = supplySensor
|
|
}
|
|
|
|
public var needsProcessed: Bool {
|
|
mixedSensor.needsProcessed
|
|
|| postCoilSensor.needsProcessed
|
|
|| returnSensor.needsProcessed
|
|
|| supplySensor.needsProcessed
|
|
}
|
|
}
|
|
}
|
|
|
|
extension State.Sensors {
|
|
public struct TemperatureHumiditySensor<Location>: Equatable {
|
|
@TrackedChanges
|
|
public var temperature: Temperature?
|
|
|
|
@TrackedChanges
|
|
public var humidity: RelativeHumidity?
|
|
|
|
public var needsProcessed: Bool {
|
|
$temperature.needsProcessed || $humidity.needsProcessed
|
|
}
|
|
|
|
public init(
|
|
temperature: Temperature? = nil,
|
|
humidity: RelativeHumidity? = nil,
|
|
needsProcessed: Bool = false
|
|
) {
|
|
self._temperature = .init(wrappedValue: temperature, needsProcessed: needsProcessed)
|
|
self._humidity = .init(wrappedValue: humidity, needsProcessed: needsProcessed)
|
|
}
|
|
}
|
|
|
|
// MARK: - Temperature / Humidity Sensor Locations
|
|
public enum Mixed { }
|
|
public enum PostCoil { }
|
|
public enum Return { }
|
|
public enum Supply { }
|
|
}
|
|
|
|
// MARK: - Tracked Changes
|
|
@propertyWrapper
|
|
public struct TrackedChanges<Value> {
|
|
|
|
private var tracking: TrackingState
|
|
private var value: Value
|
|
|
|
public var wrappedValue: Value {
|
|
get { value }
|
|
set {
|
|
// fix
|
|
value = newValue
|
|
}
|
|
}
|
|
|
|
public init(wrappedValue: Value, needsProcessed: Bool = false) {
|
|
self.value = wrappedValue
|
|
self.tracking = needsProcessed ? .needsProcessed : .hasProcessed
|
|
}
|
|
|
|
enum TrackingState {
|
|
case hasProcessed
|
|
case needsProcessed
|
|
}
|
|
|
|
public var needsProcessed: Bool {
|
|
get { tracking == .needsProcessed }
|
|
set {
|
|
if newValue {
|
|
tracking = .needsProcessed
|
|
} else {
|
|
tracking = .hasProcessed
|
|
}
|
|
}
|
|
}
|
|
|
|
public var projectedValue: Self {
|
|
get { self }
|
|
set { self = newValue }
|
|
}
|
|
}
|
|
|
|
extension TrackedChanges: Equatable where Value: Equatable { }
|