Add a couple of GPIO pins, remove hardware models enum and use the API

This commit is contained in:
Garth Vander Houwen 2024-01-14 09:47:11 -08:00
parent 1792de5d4a
commit 9f7f59fa87
4 changed files with 51 additions and 372 deletions

View file

@ -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 = "<group>"; };
DD2AD8A7296D2DF9001FF0E7 /* MapViewSwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewSwiftUI.swift; sourceTree = "<group>"; };
DD2CC2E52ABFE04E00EDFDA7 /* MeshtasticDataModelV19.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MeshtasticDataModelV19.xcdatamodel; sourceTree = "<group>"; };
DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HardwareModels.swift; sourceTree = "<group>"; };
DD33DB602B3D1ECC003E1EA0 /* MeshtasticDataModelV 23.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 23.xcdatamodel"; sourceTree = "<group>"; };
DD33DB612B3D27C7003E1EA0 /* FirmwareApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirmwareApi.swift; sourceTree = "<group>"; };
DD3501882852FC3B000FC853 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
@ -667,7 +665,6 @@
DD1925B828CDA93900720036 /* SerialConfigEnums.swift */,
DD994B68295F88B60013760A /* IntervalEnums.swift */,
DD5E5239298EFA5300D21B61 /* TelemetryWeather.swift */,
DD2DC2BF29BCD8AB003B383C /* HardwareModels.swift */,
);
path = Enums;
sourceTree = "<group>";
@ -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 */,

View file

@ -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"
}
}
}

View file

@ -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
}
}
}

View file

@ -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)
}