mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
initial swift data conversion
This commit is contained in:
parent
183924d4dc
commit
b2c72ae166
130 changed files with 2939 additions and 2269 deletions
26
Meshtastic/Model/ChannelEntity.swift
Normal file
26
Meshtastic/Model/ChannelEntity.swift
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
//
|
||||
// ChannelEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for channels.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class ChannelEntity {
|
||||
var downlinkEnabled: Bool = false
|
||||
var id: Int32 = 0
|
||||
var index: Int32 = 0
|
||||
var mute: Bool = false
|
||||
var name: String?
|
||||
var positionPrecision: Int32 = 32
|
||||
var psk: Data?
|
||||
var role: Int32 = 0
|
||||
var uplinkEnabled: Bool = false
|
||||
|
||||
var myInfoChannel: MyInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
320
Meshtastic/Model/ConfigModels.swift
Normal file
320
Meshtastic/Model/ConfigModels.swift
Normal file
|
|
@ -0,0 +1,320 @@
|
|||
//
|
||||
// ConfigModels.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData models for all device and module configuration entities.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class AmbientLightingConfigEntity {
|
||||
var blue: Int32 = 0
|
||||
var current: Int32 = 0
|
||||
var green: Int32 = 0
|
||||
var ledState: Bool = false
|
||||
var red: Int32 = 0
|
||||
var ambientLightingConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class BluetoothConfigEntity {
|
||||
var deviceLoggingEnabled: Bool = false
|
||||
var enabled: Bool = false
|
||||
var fixedPin: Int32 = 123456
|
||||
var mode: Int32 = 0
|
||||
var bluetoothConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class CannedMessageConfigEntity {
|
||||
var enabled: Bool = false
|
||||
var inputbrokerEventCcw: Int32 = 0
|
||||
var inputbrokerEventCw: Int32 = 0
|
||||
var inputbrokerEventPress: Int32 = 0
|
||||
var inputbrokerPinA: Int32 = 0
|
||||
var inputbrokerPinB: Int32 = 0
|
||||
var inputbrokerPinPress: Int32 = 0
|
||||
var messages: String?
|
||||
var rotary1Enabled: Bool = false
|
||||
var sendBell: Bool = false
|
||||
var updown1Enabled: Bool = false
|
||||
var cannedMessagesConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class DetectionSensorConfigEntity {
|
||||
var enabled: Bool = false
|
||||
var minimumBroadcastSecs: Int32 = 0
|
||||
var monitorPin: Int32 = 0
|
||||
var name: String?
|
||||
var sendBell: Bool = false
|
||||
var stateBroadcastSecs: Int32 = 0
|
||||
var triggerType: Int32 = 0
|
||||
var usePullup: Bool = false
|
||||
var detectionSensorConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class DeviceConfigEntity {
|
||||
var buttonGpio: Int32 = 0
|
||||
var buzzerGpio: Int32 = 0
|
||||
var debugLogEnabled: Bool = false
|
||||
var disableTripleClick: Bool = false
|
||||
var doubleTapAsButtonPress: Bool = false
|
||||
var isManaged: Bool = false
|
||||
var ledHeartbeatEnabled: Bool = true
|
||||
var nodeInfoBroadcastSecs: Int32 = 0
|
||||
var rebroadcastMode: Int32 = 0
|
||||
var role: Int32 = 0
|
||||
var serialEnabled: Bool = false
|
||||
var tripleClickAsAdHocPing: Bool = true
|
||||
var tzdef: String?
|
||||
var deviceConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class DisplayConfigEntity {
|
||||
var compassNorthTop: Bool = false
|
||||
var displayMode: Int32 = 0
|
||||
var flipScreen: Bool = false
|
||||
var headingBold: Bool = true
|
||||
var oledType: Int32 = 0
|
||||
var screenCarouselInterval: Int32 = 0
|
||||
var screenOnSeconds: Int32 = 0
|
||||
var units: Int32 = 0
|
||||
var use12HClock: Bool = false
|
||||
var wakeOnTapOrMotion: Bool = false
|
||||
var displayConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class ExternalNotificationConfigEntity {
|
||||
var active: Bool = false
|
||||
var alertBell: Bool = false
|
||||
var alertBellBuzzer: Bool = false
|
||||
var alertBellVibra: Bool = false
|
||||
var alertMessage: Bool = false
|
||||
var alertMessageBuzzer: Bool = false
|
||||
var alertMessageVibra: Bool = false
|
||||
var enabled: Bool = false
|
||||
var nagTimeout: Int32 = 0
|
||||
var output: Int32 = 0
|
||||
var outputBuzzer: Int32 = 0
|
||||
var outputMilliseconds: Int32 = 0
|
||||
var outputVibra: Int32 = 0
|
||||
var useI2SAsBuzzer: Bool = false
|
||||
var usePWM: Bool = true
|
||||
var externalNotificationConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class LoRaConfigEntity {
|
||||
var bandwidth: Int32 = 0
|
||||
var channelNum: Int32 = 0
|
||||
var codingRate: Int32 = 0
|
||||
var frequencyOffset: Float = 0
|
||||
var hopLimit: Int32 = 0
|
||||
var ignoreMqtt: Bool = false
|
||||
var modemPreset: Int32 = 0
|
||||
var okToMqtt: Bool = false
|
||||
var overrideDutyCycle: Bool = false
|
||||
var overrideFrequency: Float = 0.0
|
||||
var regionCode: Int32 = 0
|
||||
var spreadFactor: Int32 = 0
|
||||
var sx126xRxBoostedGain: Bool = false
|
||||
var txEnabled: Bool = true
|
||||
var txPower: Int32 = 0
|
||||
var usePreset: Bool = true
|
||||
var loRaConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class MQTTConfigEntity {
|
||||
var address: String?
|
||||
var enabled: Bool = false
|
||||
var encryptionEnabled: Bool = false
|
||||
var jsonEnabled: Bool = false
|
||||
var mapPositionPrecision: Int32 = 13
|
||||
var mapPublishIntervalSecs: Int32 = 0
|
||||
var mapReportingEnabled: Bool = false
|
||||
var mapReportingShouldReportLocation: Bool = false
|
||||
var password: String?
|
||||
var proxyToClientEnabled: Bool = false
|
||||
var root: String? = "msh"
|
||||
var tlsEnabled: Bool = false
|
||||
var username: String?
|
||||
var mqttConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class NetworkConfigEntity {
|
||||
var dns: Int32 = 0
|
||||
var enabledProtocols: Int32 = 0
|
||||
var ethEnabled: Bool = false
|
||||
var gateway: Int32 = 0
|
||||
var ip: Int32 = 0
|
||||
var ntpServer: String?
|
||||
var subnet: Int32 = 0
|
||||
var wifiEnabled: Bool = false
|
||||
var wifiMode: Int32 = 0
|
||||
var wifiPsk: String?
|
||||
var wifiSsid: String?
|
||||
var networkConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class PaxCounterConfigEntity {
|
||||
var bleThreshold: Int32 = 0
|
||||
var enabled: Bool = false
|
||||
var updateInterval: Int32 = 0
|
||||
var wifiThreshold: Int32 = -80
|
||||
var paxCounterConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class PositionConfigEntity {
|
||||
var broadcastSmartMinimumDistance: Int32 = 0
|
||||
var broadcastSmartMinimumIntervalSecs: Int32 = 0
|
||||
var deviceGpsEnabled: Bool = false
|
||||
var fixedPosition: Bool = false
|
||||
var gpsAttemptTime: Int32 = 0
|
||||
var gpsEnGpio: Int32 = 0
|
||||
var gpsMode: Int32 = 0
|
||||
var gpsUpdateInterval: Int32 = 0
|
||||
var positionBroadcastSeconds: Int32 = 0
|
||||
var positionFlags: Int32 = 0
|
||||
var rxGpio: Int32 = 0
|
||||
var smartPositionEnabled: Bool = false
|
||||
var txGpio: Int32 = 0
|
||||
var positionConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class PowerConfigEntity {
|
||||
var adcMultiplierOverride: Float = 0
|
||||
var deviceBatteryInaAddress: Int32 = 0
|
||||
var isPowerSaving: Bool = false
|
||||
var lsSecs: Int32 = 0
|
||||
var minWakeSecs: Int32 = 0
|
||||
var onBatteryShutdownAfterSecs: Int32 = 0
|
||||
var waitBluetoothSecs: Int32 = 0
|
||||
var powerConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class RangeTestConfigEntity {
|
||||
var enabled: Bool = false
|
||||
var save: Bool = false
|
||||
var sender: Int32 = 0
|
||||
var rangeTestConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class RTTTLConfigEntity {
|
||||
var ringtone: String?
|
||||
var rtttlConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class SecurityConfigEntity {
|
||||
var adminChannelEnabled: Bool = false
|
||||
var adminKey: Data?
|
||||
var adminKey2: Data?
|
||||
var adminKey3: Data?
|
||||
var bluetoothLoggingEnabled: Bool = false
|
||||
var debugLogApiEnabled: Bool = false
|
||||
var isManaged: Bool = false
|
||||
var privateKey: Data?
|
||||
var publicKey: Data?
|
||||
var serialEnabled: Bool = false
|
||||
var securityConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class SerialConfigEntity {
|
||||
var baudRate: Int32 = 0
|
||||
var echo: Bool = false
|
||||
var enabled: Bool = false
|
||||
var mode: Int32 = 0
|
||||
var overrideConsoleSerialPort: Bool = false
|
||||
var rxd: Int32 = 0
|
||||
var timeout: Int32 = 0
|
||||
var txd: Int32 = 0
|
||||
var serialConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class StoreForwardConfigEntity {
|
||||
var enabled: Bool = false
|
||||
var heartbeat: Bool = false
|
||||
var historyReturnMax: Int32 = 0
|
||||
var historyReturnWindow: Int32 = 0
|
||||
var isRouter: Bool = false
|
||||
var lastHeartbeat: Date?
|
||||
var lastRequest: Int32 = 0
|
||||
var records: Int32 = 0
|
||||
var storeForwardConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class TAKConfigEntity {
|
||||
var role: Int32 = 0
|
||||
var team: Int32 = 0
|
||||
var takConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class TelemetryConfigEntity {
|
||||
var deviceTelemetryEnabled: Bool = false
|
||||
var deviceUpdateInterval: Int32 = 0
|
||||
var environmentDisplayFahrenheit: Bool = false
|
||||
var environmentMeasurementEnabled: Bool = false
|
||||
var environmentScreenEnabled: Bool = false
|
||||
var environmentUpdateInterval: Int32 = 0
|
||||
var powerMeasurementEnabled: Bool = false
|
||||
var powerScreenEnabled: Bool = false
|
||||
var powerUpdateInterval: Int32 = 0
|
||||
var telemetryConfigNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
28
Meshtastic/Model/DeviceMetadataEntity.swift
Normal file
28
Meshtastic/Model/DeviceMetadataEntity.swift
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
//
|
||||
// DeviceMetadataEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for device metadata.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class DeviceMetadataEntity {
|
||||
var canShutdown: Bool = false
|
||||
var deviceStateVersion: Int32 = 0
|
||||
var excludedModules: Int32 = 0
|
||||
var firmwareVersion: String?
|
||||
var hasBluetooth: Bool = false
|
||||
var hasEthernet: Bool = false
|
||||
var hasWifi: Bool = false
|
||||
var hwModel: String?
|
||||
var positionFlags: Int32 = 0
|
||||
var role: Int32 = 0
|
||||
var time: Date?
|
||||
|
||||
var metadataNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
53
Meshtastic/Model/MeshtasticSchema.swift
Normal file
53
Meshtastic/Model/MeshtasticSchema.swift
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
//
|
||||
// MeshtasticSchema.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData schema definition and migration plan for migrating from Core Data.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
/// All model types in the Meshtastic schema
|
||||
enum MeshtasticSchema {
|
||||
static var allModels: [any PersistentModel.Type] {
|
||||
[
|
||||
// Core entities
|
||||
NodeInfoEntity.self,
|
||||
UserEntity.self,
|
||||
MyInfoEntity.self,
|
||||
MessageEntity.self,
|
||||
ChannelEntity.self,
|
||||
PositionEntity.self,
|
||||
WaypointEntity.self,
|
||||
DeviceMetadataEntity.self,
|
||||
TelemetryEntity.self,
|
||||
PaxCounterEntity.self,
|
||||
TraceRouteEntity.self,
|
||||
TraceRouteHopEntity.self,
|
||||
RouteEntity.self,
|
||||
LocationEntity.self,
|
||||
// Config entities
|
||||
AmbientLightingConfigEntity.self,
|
||||
BluetoothConfigEntity.self,
|
||||
CannedMessageConfigEntity.self,
|
||||
DetectionSensorConfigEntity.self,
|
||||
DeviceConfigEntity.self,
|
||||
DisplayConfigEntity.self,
|
||||
ExternalNotificationConfigEntity.self,
|
||||
LoRaConfigEntity.self,
|
||||
MQTTConfigEntity.self,
|
||||
NetworkConfigEntity.self,
|
||||
PaxCounterConfigEntity.self,
|
||||
PositionConfigEntity.self,
|
||||
PowerConfigEntity.self,
|
||||
RangeTestConfigEntity.self,
|
||||
RTTTLConfigEntity.self,
|
||||
SecurityConfigEntity.self,
|
||||
SerialConfigEntity.self,
|
||||
StoreForwardConfigEntity.self,
|
||||
TAKConfigEntity.self,
|
||||
TelemetryConfigEntity.self,
|
||||
]
|
||||
}
|
||||
}
|
||||
43
Meshtastic/Model/MessageEntity.swift
Normal file
43
Meshtastic/Model/MessageEntity.swift
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
//
|
||||
// MessageEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for messages.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class MessageEntity {
|
||||
var ackError: Int32 = 0
|
||||
var ackSNR: Float = 0.0
|
||||
var ackTimestamp: Int32 = 0
|
||||
var admin: Bool = false
|
||||
var adminDescription: String?
|
||||
var channel: Int32 = 0
|
||||
var isEmoji: Bool = false
|
||||
var messageId: Int64 = 0
|
||||
var messagePayload: String? = ""
|
||||
var messagePayloadMarkdown: String?
|
||||
var messagePayloadTranslated: String?
|
||||
var messagePayloadTranslatedMarkdown: String?
|
||||
var messageTimestamp: Int32 = 0
|
||||
var pkiEncrypted: Bool = false
|
||||
var portNum: Int32 = 0
|
||||
var publicKey: Data?
|
||||
var read: Bool = false
|
||||
var realACK: Bool = false
|
||||
var receivedACK: Bool = false
|
||||
var relayNode: Int64 = 0
|
||||
var relays: Int16 = 0
|
||||
var replyID: Int64 = 0
|
||||
var rssi: Int32 = 0
|
||||
var showTranslatedMessage: Bool = false
|
||||
var snr: Float = 0.0
|
||||
|
||||
var fromUser: UserEntity?
|
||||
var toUser: UserEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
|
@ -48,7 +48,7 @@ class MetricsTableColumn: ObservableObject {
|
|||
visible: Bool = true,
|
||||
@ViewBuilder tableBody: @escaping (MetricsTableColumn, Value) -> TableContent?
|
||||
) {
|
||||
// This works because TelemetryEntity is an NSManagedObject and derrived from NSObject
|
||||
// This works because TelemetryEntity is an @Model and conforms to PersistentModel
|
||||
self.id = id
|
||||
self.name = name
|
||||
self.abbreviatedName = abbreviatedName
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ class MetricsChartSeries: ObservableObject {
|
|||
@ChartContentBuilder chartBody: @escaping (MetricsChartSeries, ClosedRange<Float>?, Date, Value) -> ChartBody?
|
||||
) {
|
||||
|
||||
// This works because TelemetryEntity is an NSManagedObject and derrived from NSObject
|
||||
// This works because TelemetryEntity is an @Model and conforms to PersistentModel
|
||||
self.id = id
|
||||
self.name = name
|
||||
self.abbreviatedName = abbreviatedName
|
||||
|
|
|
|||
27
Meshtastic/Model/MyInfoEntity.swift
Normal file
27
Meshtastic/Model/MyInfoEntity.swift
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
//
|
||||
// MyInfoEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for connected device info.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class MyInfoEntity {
|
||||
var bleName: String?
|
||||
var deviceId: Data?
|
||||
var minAppVersion: Int32 = 0
|
||||
var myNodeNum: Int64 = 0
|
||||
var peripheralId: String?
|
||||
var rebootCount: Int32 = 0
|
||||
var registered: Bool = false
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \ChannelEntity.myInfoChannel)
|
||||
var channels: [ChannelEntity] = []
|
||||
|
||||
var myInfoNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
112
Meshtastic/Model/NodeInfoEntity.swift
Normal file
112
Meshtastic/Model/NodeInfoEntity.swift
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
//
|
||||
// NodeInfoEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for the central node information entity.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class NodeInfoEntity {
|
||||
var bleName: String?
|
||||
var channel: Int32 = 0
|
||||
var favorite: Bool = false
|
||||
var firstHeard: Date?
|
||||
var hopsAway: Int32 = 0
|
||||
var id: Int64 = 0
|
||||
var ignored: Bool = false
|
||||
var lastHeard: Date?
|
||||
var num: Int64 = 0
|
||||
var peripheralId: String?
|
||||
var rssi: Int32 = 0
|
||||
var sessionExpiration: Date?
|
||||
var sessionPasskey: Data?
|
||||
var snr: Float = 0.0
|
||||
var viaMqtt: Bool = false
|
||||
|
||||
// Config relationships (to-one, cascade)
|
||||
@Relationship(deleteRule: .cascade, inverse: \AmbientLightingConfigEntity.ambientLightingConfigNode)
|
||||
var ambientLightingConfig: AmbientLightingConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \BluetoothConfigEntity.bluetoothConfigNode)
|
||||
var bluetoothConfig: BluetoothConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \CannedMessageConfigEntity.cannedMessagesConfigNode)
|
||||
var cannedMessageConfig: CannedMessageConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \DetectionSensorConfigEntity.detectionSensorConfigNode)
|
||||
var detectionSensorConfig: DetectionSensorConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \DeviceConfigEntity.deviceConfigNode)
|
||||
var deviceConfig: DeviceConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \DisplayConfigEntity.displayConfigNode)
|
||||
var displayConfig: DisplayConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \ExternalNotificationConfigEntity.externalNotificationConfigNode)
|
||||
var externalNotificationConfig: ExternalNotificationConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \LoRaConfigEntity.loRaConfigNode)
|
||||
var loRaConfig: LoRaConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \DeviceMetadataEntity.metadataNode)
|
||||
var metadata: DeviceMetadataEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \MQTTConfigEntity.mqttConfigNode)
|
||||
var mqttConfig: MQTTConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \MyInfoEntity.myInfoNode)
|
||||
var myInfo: MyInfoEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \NetworkConfigEntity.networkConfigNode)
|
||||
var networkConfig: NetworkConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \PaxCounterEntity.paxNode)
|
||||
var pax: [PaxCounterEntity] = []
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \PaxCounterConfigEntity.paxCounterConfigNode)
|
||||
var paxCounterConfig: PaxCounterConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \PositionConfigEntity.positionConfigNode)
|
||||
var positionConfig: PositionConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \PositionEntity.nodePosition)
|
||||
var positions: [PositionEntity] = []
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \PowerConfigEntity.powerConfigNode)
|
||||
var powerConfig: PowerConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \RangeTestConfigEntity.rangeTestConfigNode)
|
||||
var rangeTestConfig: RangeTestConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \RTTTLConfigEntity.rtttlConfigNode)
|
||||
var rtttlConfig: RTTTLConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \SecurityConfigEntity.securityConfigNode)
|
||||
var securityConfig: SecurityConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \SerialConfigEntity.serialConfigNode)
|
||||
var serialConfig: SerialConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \StoreForwardConfigEntity.storeForwardConfigNode)
|
||||
var storeForwardConfig: StoreForwardConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \TAKConfigEntity.takConfigNode)
|
||||
var takConfig: TAKConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \TelemetryEntity.nodeTelemetry)
|
||||
var telemetries: [TelemetryEntity] = []
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \TelemetryConfigEntity.telemetryConfigNode)
|
||||
var telemetryConfig: TelemetryConfigEntity?
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \TraceRouteEntity.node)
|
||||
var traceRoutes: [TraceRouteEntity] = []
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \UserEntity.userNode)
|
||||
var user: UserEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
29
Meshtastic/Model/PositionEntity.swift
Normal file
29
Meshtastic/Model/PositionEntity.swift
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
//
|
||||
// PositionEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for node positions.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class PositionEntity {
|
||||
var altitude: Int32 = 0
|
||||
var heading: Int32 = 0
|
||||
var latest: Bool = false
|
||||
var latitudeI: Int32 = 0
|
||||
var longitudeI: Int32 = 0
|
||||
var precisionBits: Int32 = 32
|
||||
var rssi: Int32 = 0
|
||||
var satsInView: Int32 = 0
|
||||
var seqNo: Int32 = 0
|
||||
var snr: Float = 0.0
|
||||
var speed: Int32 = 0
|
||||
var time: Date?
|
||||
|
||||
var nodePosition: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
53
Meshtastic/Model/RouteModels.swift
Normal file
53
Meshtastic/Model/RouteModels.swift
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
//
|
||||
// RouteModels.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData models for routes and locations.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class RouteEntity {
|
||||
var color: Int64 = 0
|
||||
var date: Date?
|
||||
var distance: Double = 0
|
||||
var elevationGain: Double = 0
|
||||
var enabled: Bool = false
|
||||
var endDate: Date?
|
||||
var id: Int32 = 0
|
||||
var name: String?
|
||||
var notes: String?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \LocationEntity.routeLocation)
|
||||
var locations: [LocationEntity] = []
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class LocationEntity {
|
||||
var altitude: Int32 = 0
|
||||
var heading: Int32 = 0
|
||||
var id: Int32 = 0
|
||||
var latitudeI: Int32 = 0
|
||||
var longitudeI: Int32 = 0
|
||||
var speed: Int32 = 0
|
||||
|
||||
var routeLocation: RouteEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class PaxCounterEntity {
|
||||
var ble: Int32 = 0
|
||||
var time: Date?
|
||||
var uptime: Int32 = 0
|
||||
var wifi: Int32 = 0
|
||||
|
||||
var paxNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
74
Meshtastic/Model/TelemetryEntity.swift
Normal file
74
Meshtastic/Model/TelemetryEntity.swift
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
//
|
||||
// TelemetryEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for telemetry data.
|
||||
// Replaces the manual Core Data TelemetryEntity+CoreDataClass/Properties files.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class TelemetryEntity {
|
||||
// Non-optional scalars
|
||||
var metricsType: Int32 = 0
|
||||
var numOnlineNodes: Int32 = 0
|
||||
var numPacketsRx: Int32 = 0
|
||||
var numPacketsRxBad: Int32 = 0
|
||||
var numPacketsTx: Int32 = 0
|
||||
var numRxDupe: Int32 = 0
|
||||
var numTotalNodes: Int32 = 0
|
||||
var numTxRelay: Int32 = 0
|
||||
var numTxRelayCanceled: Int32 = 0
|
||||
var time: Date?
|
||||
|
||||
// Optional scalars (previously used @ManagedAttribute wrapper)
|
||||
var airUtilTx: Float?
|
||||
var barometricPressure: Float?
|
||||
var batteryLevel: Int32?
|
||||
var channelUtilization: Float?
|
||||
var current: Float?
|
||||
var distance: Float?
|
||||
var gasResistance: Float?
|
||||
var iaq: Int32?
|
||||
var irLux: Float?
|
||||
var lux: Float?
|
||||
var powerCh1Current: Float?
|
||||
var powerCh1Voltage: Float?
|
||||
var powerCh2Current: Float?
|
||||
var powerCh2Voltage: Float?
|
||||
var powerCh3Current: Float?
|
||||
var powerCh3Voltage: Float?
|
||||
var radiation: Float?
|
||||
var rainfall1H: Float?
|
||||
var rainfall24H: Float?
|
||||
var relativeHumidity: Float?
|
||||
var rssi: Int32?
|
||||
var snr: Float?
|
||||
var soilMoisture: UInt32?
|
||||
var soilTemperature: Float?
|
||||
var temperature: Float?
|
||||
var uptimeSeconds: Int32?
|
||||
var uvLux: Float?
|
||||
var voltage: Float?
|
||||
var weight: Float?
|
||||
var whiteLux: Float?
|
||||
var windDirection: Int32?
|
||||
var windGust: Float?
|
||||
var windLull: Float?
|
||||
var windSpeed: Float?
|
||||
|
||||
// Relationship
|
||||
var nodeTelemetry: NodeInfoEntity?
|
||||
|
||||
// Computed property
|
||||
var dewPoint: Float? {
|
||||
guard let temp = self.temperature, let rh = self.relativeHumidity else {
|
||||
return nil
|
||||
}
|
||||
return Float(calculateDewPoint(temp: temp, relativeHumidity: rh, convertToLocale: false))
|
||||
}
|
||||
|
||||
init() {}
|
||||
}
|
||||
46
Meshtastic/Model/TraceRouteModels.swift
Normal file
46
Meshtastic/Model/TraceRouteModels.swift
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
//
|
||||
// TraceRouteModels.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData models for trace routes and hops.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class TraceRouteEntity {
|
||||
var hasPositions: Bool = false
|
||||
var hopsBack: Int32 = 0
|
||||
var hopsTowards: Int32 = 0
|
||||
var id: Int64 = 0
|
||||
var response: Bool = false
|
||||
var routeBackText: String?
|
||||
var routeText: String?
|
||||
var sent: Bool = false
|
||||
var snr: Float = 0.0
|
||||
var time: Date?
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \TraceRouteHopEntity.traceRoute)
|
||||
var hops: [TraceRouteHopEntity] = []
|
||||
|
||||
var node: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
|
||||
@Model
|
||||
final class TraceRouteHopEntity {
|
||||
var altitude: Int32 = 0
|
||||
var back: Bool = false
|
||||
var latitudeI: Int32 = 0
|
||||
var longitudeI: Int32 = 0
|
||||
var name: String?
|
||||
var num: Int64 = 0
|
||||
var snr: Float = 0.0
|
||||
var time: Date?
|
||||
|
||||
var traceRoute: TraceRouteEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
40
Meshtastic/Model/UserEntity.swift
Normal file
40
Meshtastic/Model/UserEntity.swift
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
//
|
||||
// UserEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for user information.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class UserEntity {
|
||||
var hwDisplayName: String?
|
||||
var hwModel: String?
|
||||
var hwModelId: Int32 = 0
|
||||
var isLicensed: Bool = false
|
||||
var keyMatch: Bool = true
|
||||
var lastMessage: Date?
|
||||
var longName: String?
|
||||
var mute: Bool = false
|
||||
var newPublicKey: Data?
|
||||
var num: Int64 = 0
|
||||
var numString: String?
|
||||
var pkiEncrypted: Bool = false
|
||||
var publicKey: Data?
|
||||
var role: Int32 = 0
|
||||
var shortName: String?
|
||||
var unmessagable: Bool = false
|
||||
var userId: String?
|
||||
|
||||
@Relationship(inverse: \MessageEntity.fromUser)
|
||||
var sentMessages: [MessageEntity] = []
|
||||
|
||||
@Relationship(inverse: \MessageEntity.toUser)
|
||||
var receivedMessages: [MessageEntity] = []
|
||||
|
||||
var userNode: NodeInfoEntity?
|
||||
|
||||
init() {}
|
||||
}
|
||||
27
Meshtastic/Model/WaypointEntity.swift
Normal file
27
Meshtastic/Model/WaypointEntity.swift
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
//
|
||||
// WaypointEntity.swift
|
||||
// Meshtastic
|
||||
//
|
||||
// SwiftData model for waypoints.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import SwiftData
|
||||
|
||||
@Model
|
||||
final class WaypointEntity {
|
||||
var created: Date?
|
||||
var createdBy: Int64 = 0
|
||||
var expire: Date?
|
||||
var icon: Int64 = 0
|
||||
var id: Int64 = 0
|
||||
var lastUpdated: Date?
|
||||
var lastUpdatedBy: Int64 = 0
|
||||
var latitudeI: Int32 = 0
|
||||
var locked: Bool = false
|
||||
var longDescription: String?
|
||||
var longitudeI: Int32 = 0
|
||||
var name: String?
|
||||
|
||||
init() {}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue