diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 0a73ceda..b007418b 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ DD2553572855B02500E55709 /* LoRaConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2553562855B02500E55709 /* LoRaConfig.swift */; }; DD2553592855B52700E55709 /* PositionConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2553582855B52700E55709 /* PositionConfig.swift */; }; DD2AD8A8296D2DF9001FF0E7 /* MapViewSwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2AD8A7296D2DF9001FF0E7 /* MapViewSwiftUI.swift */; }; + DD2DC2C029BCD8AB003B383C /* HardwareModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */; }; DD2E65262767A01F00E45FC5 /* NodeDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD2E65252767A01F00E45FC5 /* NodeDetail.swift */; }; DD3501892852FC3B000FC853 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3501882852FC3B000FC853 /* Settings.swift */; }; DD35018B2852FC79000FC853 /* UserSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD35018A2852FC79000FC853 /* UserSettings.swift */; }; @@ -178,6 +179,7 @@ DD2553562855B02500E55709 /* LoRaConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoRaConfig.swift; sourceTree = ""; }; DD2553582855B52700E55709 /* PositionConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionConfig.swift; sourceTree = ""; }; DD2AD8A7296D2DF9001FF0E7 /* MapViewSwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewSwiftUI.swift; sourceTree = ""; }; + DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardwareModels.swift; sourceTree = ""; }; DD2E65252767A01F00E45FC5 /* NodeDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeDetail.swift; sourceTree = ""; }; DD3501882852FC3B000FC853 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; DD35018A2852FC79000FC853 /* UserSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSettings.swift; sourceTree = ""; }; @@ -486,6 +488,7 @@ DD1925B828CDA93900720036 /* SerialConfigEnums.swift */, DD994B68295F88B60013760A /* IntervalEnums.swift */, DD5E5239298EFA5300D21B61 /* TelemetryWeather.swift */, + DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */, ); path = Enums; sourceTree = ""; @@ -930,6 +933,7 @@ DD47E3D626F17ED900029299 /* CircleText.swift in Sources */, DDC2E18F26CE25FE0042C5E4 /* ContentView.swift in Sources */, DD2553572855B02500E55709 /* LoRaConfig.swift in Sources */, + DD2DC2C029BCD8AB003B383C /* HardwareModels.swift in Sources */, DDB6ABD928B0A4BA00384BA1 /* BluetoothModes.swift in Sources */, DDD9E4E4284B208E003777C5 /* UserEntityExtension.swift in Sources */, DD2553592855B52700E55709 /* PositionConfig.swift in Sources */, diff --git a/Meshtastic/Enums/HardwareModels.swift b/Meshtastic/Enums/HardwareModels.swift new file mode 100644 index 00000000..b9ddcf77 --- /dev/null +++ b/Meshtastic/Enums/HardwareModels.swift @@ -0,0 +1,186 @@ +// +// HardwareModels.swift +// Meshtastic +// +// Copyright(c) Garth Vander Houwen 3/11/23. +// + +import Foundation +// Default of 0 is Client +enum HardwareModels: Int, CaseIterable, Identifiable { + + case UNSET = 0 + case TLORA_V2 = 1 + case TLORA_V1 = 2 + case TLORA_V2_1_1P6 = 3 + case TBEAM = 4 + case HELTEC_V2_0 = 5 + case TBEAM_V0P7 = 6 + case T_ECHO = 7 + case TLORA_V1_1P3 = 8 + case RAK4631 = 9 + case HELTEC_V2_1 = 10 + case HELTEC_V1 = 11 + case LILYGO_TBEAM_S3_CORE = 12 + case RAK11200 = 13 + case NANO_G1 = 14 + case TLORA_V2_1_1P8 = 15 + case TLORA_T3_S3 = 16 + case NANO_G1_EXPLORER = 17 + case STATION_G1 = 25 + case M5STACK = 42 + case HELTEC_V3 = 43 + case HELTEC_WSL_V3 = 45 + + var id: Int { self.rawValue } + var description: String { + switch self { + + case .UNSET: + return NSLocalizedString("unset", comment: "UNSET") + case .TLORA_V2: + return "TLoRa V2" + case .TLORA_V1: + return "TLoRa V1" + case .TLORA_V2_1_1P6: + return "TLoRa V2.1.1.6" + case .TBEAM: + return "TBeam" + case .HELTEC_V2_0: + return "HELTEC V2.0" + case .TBEAM_V0P7: + return "TBeam 0.7" + case .T_ECHO: + return "TEcho" + case .TLORA_V1_1P3: + return "TLORA V1.1.3" + case .RAK4631: + return "RAK 4631 NRF" + case .HELTEC_V2_1: + return "HELTEC V2.1" + case .HELTEC_V1: + return "HELTEC V1" + case .LILYGO_TBEAM_S3_CORE: + return "TBEAM S3" + case .RAK11200: + return "RAK 11200 ESP32" + case .NANO_G1: + return "Nano G1" + case .TLORA_V2_1_1P8: + return "TLoRa V2.1.1.8" + case .TLORA_T3_S3: + return "TLoRa T3 S3" + case .NANO_G1_EXPLORER: + return "Nano G1 Explorer" + case .STATION_G1: + return "Station G1" + case .M5STACK: + return "M5 Stack" + case .HELTEC_V3: + return "Heltec V3" + case .HELTEC_WSL_V3: + return "Heltec wireless stick lite V3" + } + + } + var firmwareStrings: [String] { + switch self { + + case .UNSET: + return [] + case .TLORA_V2: + return ["firmware-tlora-v2-"] + case .TLORA_V1: + return ["firmware-tlora-v1-"] + case .TLORA_V2_1_1P6: + return ["firmware-tlora-v2-1-1.6-"] + case .TBEAM: + return ["firmware-tbeam-"] + case .HELTEC_V2_0: + return ["firmware-heltec-v2.0-"] + case .TBEAM_V0P7: + return ["firmware-tbeam0.7-"] + case .T_ECHO: + return ["firmware-t-echo-"] + case .TLORA_V1_1P3: + return ["firmware-tlora_v1_3-"] + case .RAK4631: + return ["firmware-rak4631-", "firmware-rak4631_eink-"] + case .HELTEC_V2_1: + return ["firmware-heltec-v2.1-"] + case .HELTEC_V1: + return ["firmware-heltec-v1-"] + case .LILYGO_TBEAM_S3_CORE: + return ["firmware-tbeam-s3-core-"] + case .RAK11200: + return ["firmware-rak11200-"] + case .NANO_G1: + return ["firmware-nano-g1-"] + case .TLORA_V2_1_1P8: + return ["firmware-tlora-v2-1-1.8-"] + case .TLORA_T3_S3: + return ["firmware-tlora-t3s3-v1-"] + case .NANO_G1_EXPLORER: + return ["firmware-nano-g1-explorer-"] + case .STATION_G1: + return ["firmware-station-g1-"] + case .M5STACK: + return ["firmware-m5stack-core-", "firmware-m5stack-coreink-"] + case .HELTEC_V3: + return ["firmware-heltec-v3-"] + case .HELTEC_WSL_V3: + return ["firmware-heltec-wsl-v3-"] + } + + } + func protoEnumValue() -> HardwareModel { + + switch self { + + case .UNSET: + return HardwareModel.unset + case .TLORA_V2: + return HardwareModel.tloraV2 + case .TLORA_V1: + return HardwareModel.tloraV1 + case .TLORA_V2_1_1P6: + return HardwareModel.tloraV211P6 + case .TBEAM: + return HardwareModel.tbeam + case .HELTEC_V2_0: + return HardwareModel.heltecV20 + case .TBEAM_V0P7: + return HardwareModel.tbeamV0P7 + case .T_ECHO: + return HardwareModel.tEcho + case .TLORA_V1_1P3: + return HardwareModel.tloraV11P3 + case .RAK4631: + return HardwareModel.rak4631 + case .HELTEC_V2_1: + return HardwareModel.heltecV21 + case .HELTEC_V1: + return HardwareModel.heltecV1 + case .LILYGO_TBEAM_S3_CORE: + return HardwareModel.lilygoTbeamS3Core + case .RAK11200: + return HardwareModel.rak11200 + case .NANO_G1: + return HardwareModel.nanoG1 + case .TLORA_V2_1_1P8: + return HardwareModel.tloraV211P8 + case .TLORA_T3_S3: + return HardwareModel.tloraT3S3 + case .NANO_G1_EXPLORER: + return HardwareModel.nanoG1Explorer + case .STATION_G1: + return HardwareModel.stationG1 + case .M5STACK: + return HardwareModel.m5Stack + case .HELTEC_V3: + return HardwareModel.heltecV3 + case .HELTEC_WSL_V3: + return HardwareModel.heltecWslV3 + } + } +} diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 4207560a..4233a2e0 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -428,6 +428,7 @@ func upsertLoRaConfigPacket(config: Meshtastic.Config.LoRaConfig, nodeNum: Int64 newLoRaConfig.txPower = Int32(config.txPower) newLoRaConfig.txEnabled = config.txEnabled newLoRaConfig.channelNum = Int32(config.channelNum) + newLoRaConfig.sx126xRxBoostedGain = config.sx126XRxBoostedGain fetchedNode[0].loRaConfig = newLoRaConfig } else { fetchedNode[0].loRaConfig?.regionCode = Int32(config.region.rawValue) @@ -443,6 +444,7 @@ func upsertLoRaConfigPacket(config: Meshtastic.Config.LoRaConfig, nodeNum: Int64 fetchedNode[0].loRaConfig?.txPower = Int32(config.txPower) fetchedNode[0].loRaConfig?.txEnabled = config.txEnabled fetchedNode[0].loRaConfig?.channelNum = Int32(config.channelNum) + fetchedNode[0].loRaConfig?.sx126xRxBoostedGain = config.sx126XRxBoostedGain } do { try context.save() diff --git a/Meshtastic/Views/Settings/Config/LoRaConfig.swift b/Meshtastic/Views/Settings/Config/LoRaConfig.swift index 4fb11c4d..51af0fb1 100644 --- a/Meshtastic/Views/Settings/Config/LoRaConfig.swift +++ b/Meshtastic/Views/Settings/Config/LoRaConfig.swift @@ -46,6 +46,24 @@ struct LoRaConfig: View { VStack { Form { + if node != nil && node?.num ?? 0 != bleManager.connectedPeripheral.num { + // Let users know what is going on if they are using remote admin and don't have the lora config yet + if node?.loRaConfig == nil { + Text("LoRa config data has been requested but has not yet returned from the remote node. You can check the status of admin message requests in the admin message log.") + .font(.callout) + .foregroundColor(.orange) + } else { + Text("Remote administration for: \(node?.user?.longName ?? "Unknown")") + .font(.title3) + } + } else if node != nil && node?.num ?? 0 == bleManager.connectedPeripheral.num { + Text("Configuration for: \(node?.user?.longName ?? "Unknown")") + .font(.title3) + } else { + Text("Please connect to a radio to configure settings.") + .font(.callout) + .foregroundColor(.orange) + } Section(header: Text("Options")) { Picker("Region", selection: $region ) { @@ -216,6 +234,7 @@ struct LoRaConfig: View { self.codingRate = Int(node?.loRaConfig?.codingRate ?? 0) self.spreadFactor = Int(node?.loRaConfig?.spreadFactor ?? 0) self.rxBoostedGain = node?.loRaConfig?.sx126xRxBoostedGain ?? false + print(rxBoostedGain) self.hasChanges = false // Need to request a LoRaConfig from the remote node before allowing changes diff --git a/Meshtastic/Views/Settings/Firmware.swift b/Meshtastic/Views/Settings/Firmware.swift index ffbd1bf2..55440604 100644 --- a/Meshtastic/Views/Settings/Firmware.swift +++ b/Meshtastic/Views/Settings/Firmware.swift @@ -66,7 +66,7 @@ struct Firmware: View { Spacer() } } - .padding([.leading, .trailing]) + .padding([.leading, .trailing, .bottom]) .padding(.bottom, 5) VStack (alignment: .leading) { Text("Firmware Releases") @@ -75,45 +75,39 @@ struct Firmware: View { List { Section(header: Text("Stable")) { ForEach(firmwareReleaseData.releases?.stable ?? [], id: \.id) { fr in - HStack() { - Link(fr.title ?? "Unknown", destination: URL(string: fr.pageUrl ?? "")!) - .font(.caption) - Spacer() - Link(destination: URL(string: fr.zipUrl ?? "")!) { - VStack { - Image(systemName: "square.and.arrow.down") - .font(.title3) - } + Link(destination: URL(string: fr.zipUrl ?? "")!) { + HStack() { + Text(fr.title ?? "Unknown") + .font(.caption) + Spacer() + Image(systemName: "square.and.arrow.down") + .font(.title3) } } } } Section("Alpha") { ForEach(firmwareReleaseData.releases?.alpha ?? [], id: \.id) { fr in - HStack() { - Link(fr.title ?? "Unknown", destination: URL(string: fr.pageUrl ?? "")!) - .font(.caption) - Spacer() - Link(destination: URL(string: fr.zipUrl ?? "")!) { - VStack { - Image(systemName: "square.and.arrow.down") - .font(.title3) - } + Link(destination: URL(string: fr.zipUrl ?? "")!) { + HStack() { + Text(fr.title ?? "Unknown") + .font(.caption) + Spacer() + Image(systemName: "square.and.arrow.down") + .font(.title3) } } } } Section("Pull Requests") { ForEach(firmwareReleaseData.pullRequests ?? [], id: \.id) { fr in - HStack() { - Link(fr.title ?? "Unknown", destination: URL(string: fr.pageUrl ?? "")!) - .font(.caption) - Spacer() - Link(destination: URL(string: fr.zipUrl ?? "")!) { - VStack { - Image(systemName: "square.and.arrow.down") - .font(.title3) - } + Link(destination: URL(string: fr.zipUrl ?? "")!) { + HStack() { + Text(fr.title ?? "Unknown") + .font(.caption) + Spacer() + Image(systemName: "square.and.arrow.down") + .font(.title3) } } } diff --git a/Meshtastic/Views/Settings/ShareChannels.swift b/Meshtastic/Views/Settings/ShareChannels.swift index 9a9eda8f..4a61fff7 100644 --- a/Meshtastic/Views/Settings/ShareChannels.swift +++ b/Meshtastic/Views/Settings/ShareChannels.swift @@ -287,6 +287,7 @@ struct ShareChannels: View { loRaConfig.txPower = node?.loRaConfig?.txPower ?? 0 loRaConfig.usePreset = node?.loRaConfig?.usePreset ?? true loRaConfig.channelNum = UInt32(node?.loRaConfig?.channelNum ?? 0) + loRaConfig.sx126XRxBoostedGain = node?.loRaConfig?.sx126xRxBoostedGain ?? false channelSet.loraConfig = loRaConfig if node?.myInfo?.channels != nil && node?.myInfo?.channels?.count ?? 0 > 0 { for ch in node!.myInfo!.channels!.array as! [ChannelEntity] {