diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index c237cfe7..7f433614 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -143,6 +143,7 @@ DD4F23CC28779A3C001D37CB /* TelemetryLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TelemetryLog.swift; sourceTree = ""; }; DD5394FD276BA0EF00AD86B1 /* PositionEntityExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PositionEntityExtension.swift; sourceTree = ""; }; DD539501276DAA6A00AD86B1 /* MapLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapLocation.swift; sourceTree = ""; }; + DD5929A528C0F292003DB21D /* MeshtasticDataModel v 9.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModel v 9.xcdatamodel"; sourceTree = ""; }; DD619373285CC7D600E59241 /* MeshtasticDataModel v 4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModel v 4.xcdatamodel"; sourceTree = ""; }; DD6193742862F6E600E59241 /* ExternalNotificationConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalNotificationConfig.swift; sourceTree = ""; }; DD6193762862F90F00E59241 /* CannedMessagesConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CannedMessagesConfig.swift; sourceTree = ""; }; @@ -1140,6 +1141,7 @@ DD9D8F2D2764403B00080993 /* Meshtastic.xcdatamodeld */ = { isa = XCVersionGroup; children = ( + DD5929A528C0F292003DB21D /* MeshtasticDataModel v 9.xcdatamodel */, DD4033C328B405A60096A444 /* MeshtasticDataModel v 8.xcdatamodel */, DDB6ABD728AE8F5D00384BA1 /* MeshtasticDataModel v 7.xcdatamodel */, DD8ED9C9289EA77E00B3B0AB /* MeshtasticDataModel v 6.xcdatamodel */, @@ -1149,7 +1151,7 @@ DD45C77427BD4EF80011784F /* MeshtasticDataModel v2.xcdatamodel */, DD9D8F2E2764403B00080993 /* CoreDataSample.xcdatamodel */, ); - currentVersion = DD4033C328B405A60096A444 /* MeshtasticDataModel v 8.xcdatamodel */; + currentVersion = DD5929A528C0F292003DB21D /* MeshtasticDataModel v 9.xcdatamodel */; name = Meshtastic.xcdatamodeld; path = Meshtastic/Meshtastic.xcdatamodeld; sourceTree = ""; diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 332d1a1f..5e86774d 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -394,6 +394,7 @@ func localConfig (config: Config, meshlogging: Bool, context:NSManagedObjectCont newPositionConfig.gpsUpdateInterval = 0 newPositionConfig.gpsAttemptTime = 0 newPositionConfig.positionBroadcastSeconds = 0 + newPositionConfig.positionFlags = 3 } else { @@ -403,6 +404,7 @@ func localConfig (config: Config, meshlogging: Bool, context:NSManagedObjectCont newPositionConfig.gpsUpdateInterval = Int32(config.position.gpsUpdateInterval) newPositionConfig.gpsAttemptTime = Int32(config.position.gpsAttemptTime) newPositionConfig.positionBroadcastSeconds = Int32(config.position.positionBroadcastSecs) + newPositionConfig.positionFlags = Int32(config.position.positionFlags) } fetchedNode[0].positionConfig = newPositionConfig @@ -417,6 +419,7 @@ func localConfig (config: Config, meshlogging: Bool, context:NSManagedObjectCont fetchedNode[0].positionConfig?.gpsUpdateInterval = 0 fetchedNode[0].positionConfig?.gpsAttemptTime = 0 fetchedNode[0].positionConfig?.positionBroadcastSeconds = 0 + fetchedNode[0].positionConfig?.positionFlags = 3 } else { @@ -426,6 +429,7 @@ func localConfig (config: Config, meshlogging: Bool, context:NSManagedObjectCont fetchedNode[0].positionConfig?.gpsUpdateInterval = Int32(config.position.gpsUpdateInterval) fetchedNode[0].positionConfig?.gpsAttemptTime = Int32(config.position.gpsAttemptTime) fetchedNode[0].positionConfig?.positionBroadcastSeconds = Int32(config.position.positionBroadcastSecs) + fetchedNode[0].positionConfig?.positionFlags = Int32(config.position.positionFlags) } } @@ -1138,6 +1142,7 @@ func nodeInfoPacket (nodeInfo: NodeInfo, meshLogging: Bool, context: NSManagedOb position.latitudeI = nodeInfo.position.latitudeI position.longitudeI = nodeInfo.position.longitudeI position.altitude = nodeInfo.position.altitude + position.satsInView = Int32(nodeInfo.position.satsInView) position.time = Date(timeIntervalSince1970: TimeInterval(Int64(nodeInfo.position.time))) var newPostions = [PositionEntity]() @@ -1219,6 +1224,7 @@ func nodeInfoPacket (nodeInfo: NodeInfo, meshLogging: Bool, context: NSManagedOb position.latitudeI = nodeInfo.position.latitudeI position.longitudeI = nodeInfo.position.longitudeI position.altitude = nodeInfo.position.altitude + position.satsInView = Int32(nodeInfo.position.satsInView) position.time = Date(timeIntervalSince1970: TimeInterval(Int64(nodeInfo.position.time))) let mutablePositions = fetchedNode[0].positions!.mutableCopy() as! NSMutableOrderedSet @@ -1388,6 +1394,7 @@ func positionPacket (packet: MeshPacket, meshLogging: Bool, context: NSManagedOb position.latitudeI = positionMessage.latitudeI position.longitudeI = positionMessage.longitudeI position.altitude = positionMessage.altitude + position.satsInView = Int32(positionMessage.satsInView) position.time = Date(timeIntervalSince1970: TimeInterval(Int64(positionMessage.time))) let mutablePositions = fetchedNode[0].positions!.mutableCopy() as! NSMutableOrderedSet diff --git a/Meshtastic/Meshtastic.xcdatamodeld/.xccurrentversion b/Meshtastic/Meshtastic.xcdatamodeld/.xccurrentversion index 4a26e238..59abb4ee 100644 --- a/Meshtastic/Meshtastic.xcdatamodeld/.xccurrentversion +++ b/Meshtastic/Meshtastic.xcdatamodeld/.xccurrentversion @@ -3,6 +3,6 @@ _XCCurrentVersionName - MeshtasticDataModel v 8.xcdatamodel + MeshtasticDataModel v 9.xcdatamodel diff --git a/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 9.xcdatamodel/contents b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 9.xcdatamodel/contents new file mode 100644 index 00000000..d27139f5 --- /dev/null +++ b/Meshtastic/Meshtastic.xcdatamodeld/MeshtasticDataModel v 9.xcdatamodel/contents @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Meshtastic/Views/Nodes/NodeDetail.swift b/Meshtastic/Views/Nodes/NodeDetail.swift index 98dbab3f..fc73b616 100644 --- a/Meshtastic/Views/Nodes/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/NodeDetail.swift @@ -13,7 +13,7 @@ struct NodeDetail: View { @EnvironmentObject var bleManager: BLEManager @State var initialLoad: Bool = true - + @State var satsInView = 0 @State private var isPresentingShutdownConfirm: Bool = false @State private var isPresentingRebootConfirm: Bool = false @@ -67,6 +67,7 @@ struct NodeDetail: View { .frame(idealWidth: bounds.size.width, minHeight: bounds.size.height / 2) } } + //Text("\(mostRecent.satsInView)") } else { Image(node.user?.hwModel ?? "UNSET") diff --git a/Meshtastic/Views/Settings/Config/PositionConfig.swift b/Meshtastic/Views/Settings/Config/PositionConfig.swift index f575f451..351dc6e4 100644 --- a/Meshtastic/Views/Settings/Config/PositionConfig.swift +++ b/Meshtastic/Views/Settings/Config/PositionConfig.swift @@ -41,6 +41,22 @@ enum PositionBroadcastIntervals: Int, CaseIterable, Identifiable { } } +struct PositionFlags: OptionSet +{ + let rawValue: Int + + static let posAltitude = PositionFlags(rawValue: 1) + static let posAltMsl = PositionFlags(rawValue: 2) + static let posGeoSep = PositionFlags(rawValue: 4) + static let posDop = PositionFlags(rawValue: 8) + static let posHvdop = PositionFlags(rawValue: 16) + static let posSatsinview = PositionFlags(rawValue: 32) + static let posSeqNos = PositionFlags(rawValue: 64) + static let posTimestamp = PositionFlags(rawValue: 128) + static let posSpeed = PositionFlags(rawValue: 256) + static let posHeading = PositionFlags(rawValue: 512) +} + struct PositionConfig: View { @Environment(\.managedObjectContext) var context @@ -58,10 +74,11 @@ struct PositionConfig: View { @State var gpsUpdateInterval = 0 @State var gpsAttemptTime = 0 @State var positionBroadcastSeconds = 0 + @State var positionFlags = 3 /// Position Flags /// Altitude value - 1 - @State var includePosAltitude = true + @State var includePosAltitude = false /// Altitude value is MSL - 2 @State var includePosAltMsl = false /// Include geoidal separation - 4 @@ -75,7 +92,7 @@ struct PositionConfig: View { /// Include a sequence number incremented per packet - 64 @State var includePosSeqNos = false /// Include positional timestamp (from GPS solution) - 128 - @State var includePosTimestamp = true + @State var includePosTimestamp = false /// Include positional heading - 256 /// Intended for use with vehicle not walking speeds /// walking speeds are likely to be error prone like the compass @@ -158,7 +175,7 @@ struct PositionConfig: View { Text("We should send our position this often (but only if it has changed significantly)") .font(.caption) } - Section(header: Text("Position Flags - Non Functional")) { + Section(header: Text("Position Flags")) { Text("Optional fields to include when assembling position messages. the more fields are included, the larger the message will be - leading to longer airtime and a higher risk of packet loss") .font(.caption) @@ -200,7 +217,7 @@ struct PositionConfig: View { } .toggleStyle(SwitchToggleStyle(tint: .accentColor)) } - Section(header: Text("Advanced Position Flags - Non Functional")) { + Section(header: Text("Advanced Position Flags")) { Toggle(isOn: $includePosAltMsl) { @@ -258,6 +275,21 @@ struct PositionConfig: View { pc.gpsAttemptTime = UInt32(gpsAttemptTime) pc.positionBroadcastSecs = UInt32(positionBroadcastSeconds) + var pf : PositionFlags = [] + + if includePosAltitude { pf.insert(.posAltitude) } + if includePosAltMsl { pf.insert(.posAltMsl) } + if includePosGeoSep { pf.insert(.posGeoSep) } + if includePosDop { pf.insert(.posDop) } + if includePosHvdop { pf.insert(.posHvdop) } + if includePosSatsinview { pf.insert(.posSatsinview) } + if includePosSeqNos { pf.insert(.posSeqNos) } + if includePosTimestamp { pf.insert(.posTimestamp) } + if includePosSpeed { pf.insert(.posSpeed) } + if includePosHeading { pf.insert(.posHeading) } + + pc.positionFlags = UInt32(pf.rawValue) + let adminMessageId = bleManager.savePositionConfig(config: pc, fromUser: node!.user!, toUser: node!.user!) if adminMessageId > 0{ @@ -290,12 +322,24 @@ struct PositionConfig: View { self.gpsUpdateInterval = Int(node!.positionConfig?.gpsUpdateInterval ?? 0) self.gpsAttemptTime = Int(node!.positionConfig?.gpsAttemptTime ?? 0) self.positionBroadcastSeconds = Int(node!.positionConfig?.positionBroadcastSeconds ?? 0) + self.positionFlags = Int(node!.positionConfig?.positionFlags ?? 3) + + let pf = PositionFlags(rawValue: self.positionFlags) + + if pf.contains(.posAltitude) { self.includePosAltitude = true } else { self.includePosAltitude = false } + if pf.contains(.posAltMsl) { self.includePosAltMsl = true } else { self.includePosAltMsl = false } + if pf.contains(.posGeoSep) { self.includePosGeoSep = true } else { self.includePosGeoSep = false } + if pf.contains(.posDop) { self.includePosDop = true } else { self.includePosDop = false } + if pf.contains(.posHvdop) { self.includePosHvdop = true } else { self.includePosHvdop = false } + if pf.contains(.posSatsinview) { self.includePosSatsinview = true } else { self.includePosSatsinview = false } + if pf.contains(.posSeqNos) { self.includePosSeqNos = true } else { self.includePosSeqNos = false } + if pf.contains(.posTimestamp) { self.includePosTimestamp = true } else { self.includePosTimestamp = false } + if pf.contains(.posSpeed) { self.includePosSpeed = true } else { self.includePosSpeed = false } + if pf.contains(.posHeading) { self.includePosHeading = true } else { self.includePosHeading = false } + self.hasChanges = false self.initialLoad = false - - self.includePosAltitude = true - self.includePosTimestamp = true - self.includePosSatsinview = true + } } .onChange(of: smartPositionEnabled) { newSmartPosition in