Meshtastic-Apple/Meshtastic/Views/Settings/Config/Module/AmbientLightingConfig.swift

130 lines
4.6 KiB
Swift
Raw Normal View History

//
// AmbientLightingConfig.swift
// Meshtastic
//
// Copyright(c) Garth Vander Houwen 11/26/23
//
import MeshtasticProtobufs
import SwiftUI
import OSLog
struct AmbientLightingConfig: View {
@Environment(\.self) var environment
@Environment(\.managedObjectContext) var context
@EnvironmentObject var bleManager: BLEManager
@Environment(\.dismiss) private var goBack
var node: NodeInfoEntity?
@State private var isPresentingSaveConfirm: Bool = false
@State var hasChanges = false
@State var ledState: Bool = false
@State var current = 10
@State var red = 0
@State var green = 0
@State var blue = 0
@State private var color = Color(red: 51, green: 199, blue: 88) // Color(.sRGB, red: 0.98, green: 0.9, blue: 0.2)
@State private var components: Color.Resolved?
var body: some View {
VStack {
Form {
ConfigHeader(title: "Ambient Lighting", config: \.ambientLightingConfig, node: node, onAppear: setAmbientLightingConfigValue)
2025-04-26 16:05:09 -07:00
Section(header: Text("Options")) {
2023-12-01 16:33:17 -08:00
Toggle(isOn: $ledState) {
Label("LED State", systemImage: ledState ? "lightbulb.led.fill" : "lightbulb.led")
Text("The state of the LED (on/off)")
2023-12-01 16:33:17 -08:00
}
.toggleStyle(SwitchToggleStyle(tint: .accentColor))
2023-12-01 16:33:17 -08:00
HStack {
Image(systemName: "eyedropper")
.foregroundColor(.accentColor)
ColorPicker("Color", selection: $color, supportsOpacity: false)
.padding(5)
}
HStack {
Image(systemName: "directcurrent")
.foregroundColor(.accentColor)
Stepper("Current: \(current)", value: $current, in: 0...31, step: 1)
.padding(5)
}
}
}
2023-12-01 16:33:17 -08:00
.disabled(self.bleManager.connectedPeripheral == nil || node?.ambientLightingConfig == nil)
SaveConfigButton(node: node, hasChanges: $hasChanges) {
let connectedNode = getNodeInfo(id: bleManager.connectedPeripheral.num, context: context)
if connectedNode != nil {
var al = ModuleConfig.AmbientLightingConfig()
al.ledState = ledState
al.current = UInt32(current)
if let components {
al.red = UInt32(components.red * 255)
al.green = UInt32(components.green * 255)
al.blue = UInt32(components.blue * 255)
}
let adminMessageId = bleManager.saveAmbientLightingModuleConfig(config: al, fromUser: connectedNode!.user!, toUser: node!.user!)
if adminMessageId > 0 {
// Should show a saved successfully alert once I know that to be true
// for now just disable the button after a successful save
hasChanges = false
goBack()
}
}
}
2025-02-15 11:28:28 -08:00
.navigationTitle("Ambient Lighting Config")
.navigationBarItems(
trailing: ZStack {
ConnectedDevice(
bluetoothOn: bleManager.isSwitchedOn,
deviceConnected: bleManager.connectedPeripheral != nil,
name: bleManager.connectedPeripheral?.shortName ?? "?"
)
}
)
.onFirstAppear {
// Need to request a Ambient Lighting Config from the remote node before allowing changes
if let connectedPeripheral = bleManager.connectedPeripheral, let node {
let connectedNode = getNodeInfo(id: connectedPeripheral.num, context: context)
if let connectedNode {
if node.num != connectedNode.num {
if UserDefaults.enableAdministration {
/// 2.5 Administration with session passkey
let expiration = node.sessionExpiration ?? Date()
if expiration < Date() || node.ambientLightingConfig == nil {
Logger.mesh.info("⚙️ Empty or expired ambient lighting module config requesting via PKI admin")
_ = bleManager.requestAmbientLightingConfig(fromUser: connectedNode.user!, toUser: node.user!)
}
} else {
/// Legacy Administration
2025-05-13 06:19:27 -07:00
Logger.mesh.info("☠️ Using insecure legacy admin that is no longer supported, please upgrade your firmware.")
}
}
}
}
}
2024-10-06 08:50:12 -07:00
.onChange(of: ledState) { _, newLedState in
if newLedState != node?.ambientLightingConfig?.ledState { hasChanges = true }
2024-08-11 17:31:27 -07:00
}
2024-10-06 08:50:12 -07:00
.onChange(of: current) { _, newCurrent in
if newCurrent != node?.ambientLightingConfig?.current ?? 10 { hasChanges = true }
2024-08-11 17:31:27 -07:00
}
2024-10-06 08:50:12 -07:00
.onChange(of: color) { oldColor, newColor in
if oldColor != newColor { hasChanges = true }
}
}
}
func setAmbientLightingConfigValue() {
self.ledState = node?.ambientLightingConfig?.ledState ?? false
self.current = Int(node?.ambientLightingConfig?.current ?? 10)
2023-11-28 21:18:59 -08:00
let red = Double(node?.ambientLightingConfig?.red ?? 255)
let green = Double(node?.ambientLightingConfig?.green ?? 255)
let blue = Double(node?.ambientLightingConfig?.blue ?? 255)
color = Color(red: red / 255.0, green: green / 255.0, blue: blue / 255.0)
self.hasChanges = false
}
}