From 9f7f59fa8771c9f3c6ef07fa08abec0aca7e9130 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Sun, 14 Jan 2024 09:47:11 -0800 Subject: [PATCH] Add a couple of GPIO pins, remove hardware models enum and use the API --- Meshtastic.xcodeproj/project.pbxproj | 4 - Meshtastic/Enums/HardwareModels.swift | 334 -------------------- Meshtastic/Views/Settings/Firmware.swift | 57 ++-- Meshtastic/Views/Settings/FirmwareApi.swift | 28 +- 4 files changed, 51 insertions(+), 372 deletions(-) delete mode 100644 Meshtastic/Enums/HardwareModels.swift diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 0052e112..5ad009b7 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -28,7 +28,6 @@ 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 */; }; DD33DB622B3D27C7003E1EA0 /* FirmwareApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD33DB612B3D27C7003E1EA0 /* FirmwareApi.swift */; }; DD3501892852FC3B000FC853 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3501882852FC3B000FC853 /* Settings.swift */; }; DD3619152B1EF9F900C41C8C /* LocationsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3619142B1EF9F900C41C8C /* LocationsHandler.swift */; }; @@ -247,7 +246,6 @@ DD295CE92B323ED9002CC4AC /* MeshtasticDataModelV22.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV22.xcdatamodel; sourceTree = ""; }; DD2AD8A7296D2DF9001FF0E7 /* MapViewSwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewSwiftUI.swift; sourceTree = ""; }; DD2CC2E52ABFE04E00EDFDA7 /* MeshtasticDataModelV19.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV19.xcdatamodel; sourceTree = ""; }; - DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardwareModels.swift; sourceTree = ""; }; DD33DB602B3D1ECC003E1EA0 /* MeshtasticDataModelV 23.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 23.xcdatamodel"; sourceTree = ""; }; DD33DB612B3D27C7003E1EA0 /* FirmwareApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirmwareApi.swift; sourceTree = ""; }; DD3501882852FC3B000FC853 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; @@ -667,7 +665,6 @@ DD1925B828CDA93900720036 /* SerialConfigEnums.swift */, DD994B68295F88B60013760A /* IntervalEnums.swift */, DD5E5239298EFA5300D21B61 /* TelemetryWeather.swift */, - DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */, ); path = Enums; sourceTree = ""; @@ -1218,7 +1215,6 @@ 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 deleted file mode 100644 index e14cadfd..00000000 --- a/Meshtastic/Enums/HardwareModels.swift +++ /dev/null @@ -1,334 +0,0 @@ -// -// HardwareModels.swift -// Meshtastic -// -// Copyright(c) Garth Vander Houwen 3/11/23. -// - -import Foundation - -enum HardwareModels: String, CaseIterable, Identifiable { - - case UNSET - case TLORAV2 - case TLORAV1 - case TLORAV211P6 - case TBEAM - case HELTECV20 - case TBEAMV0P7 - case TECHO - case TLORAV11P3 - case RAK4631 - case HELTECV21 - case HELTECV1 - case DIYV1 - case LILYGOTBEAMS3CORE - case RAK11200 - case NANOG1 - case TLORAV211P8 - case TLORAT3S3 - case NANOG1EXPLORER - case STATIONG1 - case M5STACK - case HELTECV3 - case HELTECWSLV3 - case NANOG2ULTRA - case RAK11310 - case RPIPICO - case HELTECWIRELESSTRACKER - case HELTECWIRELESSPAPER - case TDECK - case TWATCHS3 - - var id: String { self.rawValue } - var description: String { - switch self { - - case .UNSET: - return "unset".localized - case .TLORAV2: - return "TLoRa V2" - case .TLORAV1: - return "TLoRa V1" - case .TLORAV211P6: - return "TLoRa V2.1.1.6" - case .TBEAM: - return "TBeam" - case .HELTECV20: - return "HELTEC V2.0" - case .TBEAMV0P7: - return "TBeam 0.7" - case .TECHO: - return "TEcho" - case .TLORAV11P3: - return "TLORA V1.1.3" - case .RAK4631: - return "RAK 4631 NRF" - case .HELTECV21: - return "HELTEC V2.1" - case .HELTECV1: - return "HELTEC V1" - case .DIYV1: - return "Hydra 1W DIY" - case .LILYGOTBEAMS3CORE: - return "TBEAM S3" - case .RAK11200: - return "RAK 11200 ESP32" - case .NANOG1: - return "Nano G1" - case .TLORAV211P8: - return "TLoRa V2.1.1.8" - case .TLORAT3S3: - return "TLoRa T3 S3" - case .NANOG1EXPLORER: - return "Nano G1 Explorer" - case .STATIONG1: - return "Station G1" - case .M5STACK: - return "M5 Stack" - case .HELTECV3: - return "Heltec V3" - case .HELTECWSLV3: - return "Heltec wireless stick lite V3" - case .NANOG2ULTRA: - return "Nano G2 Ultra" - case .RAK11310: - return "RAK 11310 Pi Pico" - case .RPIPICO: - return "Pi Pico" - case .HELTECWIRELESSTRACKER: - return "Heltec Wireless Tracker" - case .HELTECWIRELESSPAPER: - return "Heltec Wireless Paper" - case .TDECK: - return "T-Deck" - case .TWATCHS3: - return "T-Watch S3" - } - - } - var firmwareStrings: [String] { - switch self { - - case .UNSET: - return [] - case .TLORAV2: - return ["firmware-tlora-v2-"] - case .TLORAV1: - return ["firmware-tlora-v1-"] - case .TLORAV211P6: - return ["firmware-tlora-v2-1-1.6-"] - case .TBEAM: - return ["firmware-tbeam-"] - case .HELTECV20: - return ["firmware-heltec-v2.0-"] - case .TBEAMV0P7: - return ["firmware-tbeam0.7-"] - case .TECHO: - return ["firmware-t-echo-"] - case .TLORAV11P3: - return ["firmware-tlora_v1_3-"] - case .RAK4631: - return ["firmware-rak4631-", "firmware-rak4631_eink-"] - case .HELTECV21: - return ["firmware-heltec-v2.1-"] - case .HELTECV1: - return ["firmware-heltec-v1-"] - case .DIYV1: - return ["firmware-meshtastic-diy-v1"] - case .LILYGOTBEAMS3CORE: - return ["firmware-tbeam-s3-core-"] - case .RAK11200: - return ["firmware-rak11200-"] - case .NANOG1: - return ["firmware-nano-g1-"] - case .TLORAV211P8: - return ["firmware-tlora-v2-1-1.8-"] - case .TLORAT3S3: - return ["firmware-tlora-t3s3-v1-"] - case .NANOG1EXPLORER: - return ["firmware-nano-g1-explorer-"] - case .STATIONG1: - return ["firmware-station-g1-"] - case .M5STACK: - return ["firmware-m5stack-core-", "firmware-m5stack-coreink-"] - case .HELTECV3: - return ["firmware-heltec-v3-"] - case .HELTECWSLV3: - return ["firmware-heltec-wsl-v3-"] - case .NANOG2ULTRA: - return ["firmware-nano-g2-ultra-"] - case .RAK11310: - return ["firmware-rak11310-"] - case .RPIPICO: - return ["firmware-pico-"] - case .HELTECWIRELESSTRACKER: - return ["firmware-heltec-wireless-tracker-"] - case .HELTECWIRELESSPAPER: - return ["firmware-heltec-wireless-paper-"] - case .TDECK: - return ["firmware-t-echo-"] - case .TWATCHS3: - return ["firmware-t-watch-s3-"] - } - - } - func platform() -> HardwarePlatforms { - - switch self { - - case .UNSET: - return HardwarePlatforms.none - case .TLORAV2: - return HardwarePlatforms.esp32 - case .TLORAV1: - return HardwarePlatforms.esp32 - case .TLORAV211P6: - return HardwarePlatforms.esp32 - case .TBEAM: - return HardwarePlatforms.esp32 - case .HELTECV20: - return HardwarePlatforms.esp32 - case .TBEAMV0P7: - return HardwarePlatforms.esp32 - case .TECHO: - return HardwarePlatforms.nrf52 - case .TLORAV11P3: - return HardwarePlatforms.esp32 - case .RAK4631: - return HardwarePlatforms.nrf52 - case .HELTECV21: - return HardwarePlatforms.esp32 - case .HELTECV1: - return HardwarePlatforms.esp32 - case .DIYV1: - return HardwarePlatforms.esp32 - case .LILYGOTBEAMS3CORE: - return HardwarePlatforms.esp32 - case .RAK11200: - return HardwarePlatforms.esp32 - case .NANOG1: - return HardwarePlatforms.esp32 - case .TLORAV211P8: - return HardwarePlatforms.esp32 - case .TLORAT3S3: - return HardwarePlatforms.esp32 - case .NANOG1EXPLORER: - return HardwarePlatforms.esp32 - case .STATIONG1: - return HardwarePlatforms.esp32 - case .M5STACK: - return HardwarePlatforms.esp32 - case .HELTECV3: - return HardwarePlatforms.esp32 - case .HELTECWSLV3: - return HardwarePlatforms.esp32 - case .NANOG2ULTRA: - return HardwarePlatforms.nrf52 - case .RAK11310: - return HardwarePlatforms.piPico - case .RPIPICO: - return HardwarePlatforms.piPico - case .HELTECWIRELESSTRACKER: - return HardwarePlatforms.esp32 - case .HELTECWIRELESSPAPER: - return HardwarePlatforms.esp32 - case .TDECK: - return HardwarePlatforms.esp32 - case .TWATCHS3: - return HardwarePlatforms.esp32 - } - } - func protoEnumValue() -> HardwareModel { - - switch self { - - case .UNSET: - return HardwareModel.unset - case .TLORAV2: - return HardwareModel.tloraV2 - case .TLORAV1: - return HardwareModel.tloraV1 - case .TLORAV211P6: - return HardwareModel.tloraV211P6 - case .TBEAM: - return HardwareModel.tbeam - case .HELTECV20: - return HardwareModel.heltecV20 - case .TBEAMV0P7: - return HardwareModel.tbeamV0P7 - case .TECHO: - return HardwareModel.tEcho - case .TLORAV11P3: - return HardwareModel.tloraV11P3 - case .RAK4631: - return HardwareModel.rak4631 - case .HELTECV21: - return HardwareModel.heltecV21 - case .HELTECV1: - return HardwareModel.heltecV1 - case .DIYV1: - return HardwareModel.diyV1 - case .LILYGOTBEAMS3CORE: - return HardwareModel.lilygoTbeamS3Core - case .RAK11200: - return HardwareModel.rak11200 - case .NANOG1: - return HardwareModel.nanoG1 - case .TLORAV211P8: - return HardwareModel.tloraV211P8 - case .TLORAT3S3: - return HardwareModel.tloraT3S3 - case .NANOG1EXPLORER: - return HardwareModel.nanoG1Explorer - case .STATIONG1: - return HardwareModel.stationG1 - case .M5STACK: - return HardwareModel.m5Stack - case .HELTECV3: - return HardwareModel.heltecV3 - case .HELTECWSLV3: - return HardwareModel.heltecWslV3 - case .NANOG2ULTRA: - return HardwareModel.nanoG2Ultra - case .RAK11310: - return HardwareModel.rak11310 - case .RPIPICO: - return HardwareModel.rpiPico - case .HELTECWIRELESSTRACKER: - return HardwareModel.heltecWirelessTracker - case .HELTECWIRELESSPAPER: - return HardwareModel.heltecWirelessPaper - case .TDECK: - return HardwareModel.tDeck - case .TWATCHS3: - return HardwareModel.tWatchS3 - } - } -} - -enum HardwarePlatforms: String, CaseIterable, Identifiable { - case none - case esp32 - case nrf52 - case stm32 - case piPico - case linux - var id: String { self.rawValue } - var description: String { - switch self { - case .none: - return "None" - case .esp32: - return "Expressif ESP 32" - case .nrf52: - return "Nordic NRF52" - case .stm32: - return "ARM STM 32" - case .piPico: - return "Raspberrry Pi Pico" - case .linux: - return "Linux" - } - } -} diff --git a/Meshtastic/Views/Settings/Firmware.swift b/Meshtastic/Views/Settings/Firmware.swift index 55ec03ce..8878b0d9 100644 --- a/Meshtastic/Views/Settings/Firmware.swift +++ b/Meshtastic/Views/Settings/Firmware.swift @@ -2,15 +2,9 @@ // Firmware.swift // Meshtastic // -// Created by Garth Vander Houwen on 3/10/23. +// Copyright(c) by Garth Vander Houwen on 3/10/23. // -// -// About.swift -// Meshtastic -// -// Copyright(c) Garth Vander Houwen 10/6/22. -// import SwiftUI import StoreKit @@ -20,27 +14,30 @@ struct Firmware: View { var node: NodeInfoEntity? @State var minimumVersion = "2.2.16" @State var version = "" - //var currentDevice: DeviceHardware + @State private var currentDevice: DeviceHardware? var body: some View { - // NavigationSplitView { VStack { - let hwModel: HardwareModels = HardwareModels.allCases.first(where: { $0.rawValue == node?.user?.hwModel ?? "UNSET" }) ?? HardwareModels.UNSET VStack(alignment: .leading) { - Text("Current Version: \(bleManager.connectedVersion)") - .font(.largeTitle) - Text("Your device supports the following firmware: ") - .font(.callout) - HStack { - ForEach(hwModel.firmwareStrings, id: \.self) { fs in - Text(fs).font(.callout) - } - } - .padding(.bottom) + let deviceString = currentDevice?.hwModelSlug.replacingOccurrences(of: "_", with: "") - if hwModel.platform() == HardwarePlatforms.nrf52 { + Text("Your Device Model: \(currentDevice?.displayName ?? "Unknown")") + .font(.largeTitle) + + VStack { + Image(deviceString ?? "UNSET") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 200, height: 200) + .cornerRadius(5) + } + Text("Current Firmware Version: \(bleManager.connectedVersion)") + .font(.title) + + if currentDevice?.architecture == Meshtastic.Architecture.nrf52840 { VStack(alignment: .leading) { - if hwModel == HardwareModels.RAK4631 { + /// RAK 4631 + if currentDevice?.hwModel == 9 { Text("nRF OTA Device Firmware Update App") .font(.title3) Text("You can update your Meshtastic device over bluetooth using the Nordic DFU app. This currently works for RAK NRF devices.") @@ -54,13 +51,13 @@ struct Firmware: View { .font(.callout) } } - } else if hwModel.platform() == HardwarePlatforms.esp32 { + } else if currentDevice?.architecture == Meshtastic.Architecture.esp32 { VStack(alignment: .leading) { Text("ESP32 Device Firmware Update") .font(.title3) Text("Currently the reccomended way to update ESP32 devices is using the web flasher from a chrome based browser. It does not work on mobile devices or over BLE.") .font(.caption) - Link("Web Flasher", destination: URL(string: "https://flasher.meshtastic.org")!) + Link("Web Flasher", destination: URL(string: "https://flash.meshtastic.org")!) .font(.callout) .padding(.bottom) Text("ESP 32 OTA update is a work in progress, click the button below to sent your device a reboot into ota admin message.") @@ -89,11 +86,11 @@ struct Firmware: View { .font(.title3) Text(node?.user?.hwModel ?? "UNSET") .font(.title3) - Text(hwModel.platform().description) - .font(.title3) + // Text(hwModel.platform().description) + // .font(.title3) } } - Spacer() + .padding() VStack(alignment: .leading) { Text("Firmware Releases") .font(.title3) @@ -144,8 +141,12 @@ struct Firmware: View { .onAppear() { Api().loadDeviceHardwareData { (hw) in for device in hw { - if device.hwModelSlug == node?.user?.hwModel ?? "UNSET" { + print(device) + let currentHardware = node?.user?.hwModel ?? "UNSET" + let deviceString = device.hwModelSlug.replacingOccurrences(of: "_", with: "") + if deviceString == currentHardware { print("Selected: \(device)") + currentDevice = device } } } diff --git a/Meshtastic/Views/Settings/FirmwareApi.swift b/Meshtastic/Views/Settings/FirmwareApi.swift index bc075ce7..5eb2f488 100644 --- a/Meshtastic/Views/Settings/FirmwareApi.swift +++ b/Meshtastic/Views/Settings/FirmwareApi.swift @@ -7,12 +7,28 @@ import Foundation +//struct DeviceHardware: Codable { +// var hwModel: Int +// var hwModelSlug: String +// var platformioTarget: String +// var activelySupported: Bool +// var displayName: String +//} + struct DeviceHardware: Codable { - var hwModel: Int - var hwModelSlug: String - var platformioTarget: String - var activelySupported: Bool - var displayName: String + let hwModel: Int + let hwModelSlug, platformioTarget: String + let architecture: Architecture + let activelySupported: Bool + let displayName: String +} + +enum Architecture: String, Codable { + case esp32 = "esp32" + case esp32C3 = "esp32-c3" + case esp32S3 = "esp32-s3" + case nrf52840 = "nrf52840" + case rp2040 = "rp2040" } class Api : ObservableObject{ @@ -25,7 +41,7 @@ class Api : ObservableObject{ } URLSession.shared.dataTask(with: url) { data, response, error in let deviceHardware = try! JSONDecoder().decode([DeviceHardware].self, from: data!) - print(deviceHardware) + //print(deviceHardware) DispatchQueue.main.async { completion(deviceHardware) }