mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
Add a couple of GPIO pins, remove hardware models enum and use the API
This commit is contained in:
parent
1792de5d4a
commit
9f7f59fa87
4 changed files with 51 additions and 372 deletions
|
|
@ -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 */,
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue