diff --git a/Meshtastic Client.xcodeproj/project.pbxproj b/Meshtastic Client.xcodeproj/project.pbxproj index 2dfd51ca..259d3e23 100644 --- a/Meshtastic Client.xcodeproj/project.pbxproj +++ b/Meshtastic Client.xcodeproj/project.pbxproj @@ -672,7 +672,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.26.10; + MARKETING_VERSION = 1.27.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; @@ -699,7 +699,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.26.10; + MARKETING_VERSION = 1.27.1; PRODUCT_BUNDLE_IDENTIFIER = gvh.MeshtasticClient; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; diff --git a/MeshtasticClient/Assets.xcassets/AccentColor.colorset/Contents.json b/MeshtasticClient/Assets.xcassets/AccentColor.colorset/Contents.json index eb878970..274babba 100644 --- a/MeshtasticClient/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/MeshtasticClient/Assets.xcassets/AccentColor.colorset/Contents.json @@ -2,6 +2,15 @@ "colors" : [ { "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal" } ], "info" : { diff --git a/MeshtasticClient/Assets.xcassets/Color.colorset/Contents.json b/MeshtasticClient/Assets.xcassets/Color.colorset/Contents.json new file mode 100644 index 00000000..22c4bb0a --- /dev/null +++ b/MeshtasticClient/Assets.xcassets/Color.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MeshtasticClient/Helpers/BLEManager.swift b/MeshtasticClient/Helpers/BLEManager.swift index d6e29d8e..642e322a 100644 --- a/MeshtasticClient/Helpers/BLEManager.swift +++ b/MeshtasticClient/Helpers/BLEManager.swift @@ -10,17 +10,18 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph private static var documentsFolder: URL { do { - return try FileManager.default.url(for: .documentDirectory, - in: .userDomainMask, - appropriateFor: nil, - create: true) + return try FileManager.default.url( + for: .documentDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true) } catch { fatalError("Can't find documents directory.") } } - @ObservedObject private var meshData : MeshData - @ObservedObject private var messageData : MessageData + @ObservedObject var meshData : MeshData + @ObservedObject var messageData : MessageData private var centralManager: CBCentralManager! @@ -539,7 +540,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph meshData.nodes.remove(at: nodeIndex!) meshData.nodes.append(updatedNode!) meshData.save() - if meshLoggingEnabled { Logger.log("Updated NodeInfo SNR and Time from Node Info App Packet For: \(updatedNode!.user.longName)") } + if meshLoggingEnabled { Logger.log("MESH PACKET Updated NodeInfo SNR and Time from Node Info App Packet For: \(updatedNode!.user.longName)") } print("Updated NodeInfo SNR and Time from Packet For: \(updatedNode!.user.longName)") } } @@ -556,7 +557,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph meshData.nodes.append(updatedNode!) meshData.save() - if meshLoggingEnabled { Logger.log("Updated NodeInfo SNR and Time from Position App Packet For: \(updatedNode!.user.longName)") } + if meshLoggingEnabled { Logger.log("MESH PACKET Updated NodeInfo SNR and Time from Position App Packet For: \(updatedNode!.user.longName)") } print("Updated Position SNR and Time from Packet For: \(updatedNode!.user.longName)") } print("Postion Payload") @@ -564,19 +565,19 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } else if decodedInfo.packet.decoded.portnum == PortNum.adminApp { - if meshLoggingEnabled { Logger.log("BLE FROMRADIO received for Admin App UNHANDLED \(try decodedInfo.packet.jsonString())") } + if meshLoggingEnabled { Logger.log("MESH PACKET received for Admin App UNHANDLED \(try decodedInfo.packet.jsonString())") } print("Admin App Packet") print(try decodedInfo.packet.jsonString()) } else if decodedInfo.packet.decoded.portnum == PortNum.routingApp { - if meshLoggingEnabled { Logger.log("BLE FROMRADIO received for Routing App UNHANDLED \(try decodedInfo.packet.jsonString())") } + if meshLoggingEnabled { Logger.log("MESH PACKET received for Routing App UNHANDLED \(try decodedInfo.packet.jsonString())") } print("Routing App Packet") print(try decodedInfo.packet.jsonString()) } else { - if meshLoggingEnabled { Logger.log("BLE FROMRADIO received for Other App UNHANDLED \(try decodedInfo.packet.jsonString())") } + if meshLoggingEnabled { Logger.log("MESH PACKET received for Other App UNHANDLED \(try decodedInfo.packet.jsonString())") } print("Other App Packet") print(try decodedInfo.packet.jsonString()) } @@ -588,7 +589,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } if decodedInfo.configCompleteID != 0 { - if meshLoggingEnabled { Logger.log("Config Complete: \(decodedInfo.configCompleteID)") } + if meshLoggingEnabled { Logger.log("BLE Config Complete Packet Id: \(decodedInfo.configCompleteID)") } print("BLE Config Complete Packet Id: \(decodedInfo.configCompleteID)") } diff --git a/MeshtasticClient/MeshtasticClientApp.swift b/MeshtasticClient/MeshtasticClientApp.swift index 23310165..eaddba34 100644 --- a/MeshtasticClient/MeshtasticClientApp.swift +++ b/MeshtasticClient/MeshtasticClientApp.swift @@ -17,16 +17,15 @@ struct MeshtasticClientApp: App { var body: some Scene { WindowGroup { - ContentView() - .environmentObject(meshData) - .environmentObject(messageData) - .environmentObject(bleManager) - .environmentObject(userSettings) - .onAppear{ - meshData.load() - messageData.load() - } - - } + ContentView() + .environmentObject(meshData) + .environmentObject(messageData) + .environmentObject(bleManager) + .environmentObject(userSettings) + .onAppear{ + meshData.load() + messageData.load() + } + } } } diff --git a/MeshtasticClient/Model/MeshData.swift b/MeshtasticClient/Model/MeshData.swift index 25c65bc6..f2ba5a2d 100644 --- a/MeshtasticClient/Model/MeshData.swift +++ b/MeshtasticClient/Model/MeshData.swift @@ -3,10 +3,11 @@ import Foundation class MeshData: ObservableObject { private static var documentsFolder: URL { do { - return try FileManager.default.url(for: .documentDirectory, - in: .userDomainMask, - appropriateFor: nil, - create: true) + return try FileManager.default.url( + for: .documentDirectory, + in: .userDomainMask, + appropriateFor: nil, + create: true) } catch { fatalError("Can't find documents directory.") } diff --git a/MeshtasticClient/Views/Messages/Messages.swift b/MeshtasticClient/Views/Messages/Messages.swift index ce45a231..1fe9612e 100644 --- a/MeshtasticClient/Views/Messages/Messages.swift +++ b/MeshtasticClient/Views/Messages/Messages.swift @@ -43,8 +43,6 @@ struct Messages: View { let currentUser: Bool = (bleManager.connectedNode != nil) && ((bleManager.connectedNode.id) == message.fromUserId) - //MessageBubble(contentMessage: message.messagePayload, isCurrentUser: currentUser, time: Int32(message.messageTimestamp), shortName: message.fromUserShortName, id: message.messageId) - HStack (alignment: .top) { CircleText(text: message.fromUserShortName, color: currentUser ? .accentColor : Color(.darkGray)).padding(.all, 5) @@ -189,7 +187,7 @@ struct Messages: View { .navigationBarItems(trailing: ZStack { - ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedNode != nil) ? bleManager.connectedNode.user.shortName : ((bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.name : "Unknown") ) + //ConnectedDevice(bluetoothOn: bleManager.isSwitchedOn, deviceConnected: bleManager.connectedPeripheral != nil, name: (bleManager.connectedNode != nil) ? bleManager.connectedNode.user.shortName : ((bleManager.connectedPeripheral != nil) ? bleManager.connectedPeripheral.name : "Unknown") ) }) .onAppear { diff --git a/MeshtasticClient/Views/Settings/AppSettings.swift b/MeshtasticClient/Views/Settings/AppSettings.swift index 9d349af8..c33f35a2 100644 --- a/MeshtasticClient/Views/Settings/AppSettings.swift +++ b/MeshtasticClient/Views/Settings/AppSettings.swift @@ -31,11 +31,11 @@ enum KeyboardType: Int, CaseIterable, Identifiable { } class UserSettings: ObservableObject { - @Published var username: String { - didSet { - UserDefaults.standard.set(username, forKey: "username") - } - } + //@Published var meshtasticUsername: String { + // didSet { + // UserDefaults.standard.set(meshtasticUsername, forKey: "meshtasticusername") + // } + //} @Published var preferredPeripheralName: String { didSet { UserDefaults.standard.set(preferredPeripheralName, forKey: "preferredPeripheralName") @@ -63,7 +63,7 @@ class UserSettings: ObservableObject { } init() { - self.username = UserDefaults.standard.object(forKey: "username") as? String ?? "" + //self.meshtasticUsername = UserDefaults.standard.object(forKey: "meshtasticusername") as? String ?? "" self.preferredPeripheralName = UserDefaults.standard.object(forKey: "preferredPeripheralName") as? String ?? "" self.preferredPeripheralId = UserDefaults.standard.object(forKey: "preferredPeripheralId") as? String ?? "" self.provideLocation = UserDefaults.standard.object(forKey: "provideLocation") as? Bool ?? false @@ -75,7 +75,7 @@ class UserSettings: ObservableObject { struct AppSettings: View { @EnvironmentObject var bleManager: BLEManager - @EnvironmentObject var userSettings: UserSettings + @ObservedObject var userSettings: UserSettings = UserSettings() @State private var preferredDeviceConnected = false @@ -92,13 +92,12 @@ struct AppSettings: View { List { Section(header: Text("USER DETAILS")) { - HStack { - - Label("Name", systemImage: "person.crop.rectangle.fill") - TextField("Username", text: $userSettings.username) - .foregroundColor(.gray) - } - .listRowSeparator(.visible) + //HStack { + //Label("Name", systemImage: "person.crop.rectangle.fill") + //TextField("Username", text: $userSettings.meshtasticUsername) + //.foregroundColor(.gray) + //} + //.listRowSeparator(.visible) Toggle(isOn: $userSettings.provideLocation) { Label("Provide location to mesh", systemImage: "location.circle.fill") @@ -138,7 +137,6 @@ struct AppSettings: View { } .listRowSeparator(.visible) } - } } } diff --git a/MeshtasticClient/Views/Settings/MeshLog.swift b/MeshtasticClient/Views/Settings/MeshLog.swift index 8fcf1cd5..95ecaff9 100644 --- a/MeshtasticClient/Views/Settings/MeshLog.swift +++ b/MeshtasticClient/Views/Settings/MeshLog.swift @@ -7,7 +7,7 @@ struct MeshLog: View { var text = "" @State private var logs = [String]() @State private var isExporting: Bool = false - @State private var document: LogDocument = LogDocument(logFile: "") + @State private var document: LogDocument = LogDocument(logFile: "MESHTASTIC MESH ACTIVITY LOG\n") var body: some View { @@ -19,27 +19,29 @@ struct MeshLog: View { logs.removeAll() for try await log in url.lines { logs.append(log) - document.logFile.append(log) + document.logFile.append("\(log) \n") } logs.reverse() } catch { // Stop adding logs when an error is thrown } } - .fileExporter(isPresented: $isExporting, - document: document, - contentType: UTType.plainText, - defaultFilename: "mesh-activity-log" + .fileExporter( + isPresented: $isExporting, + document: document, + contentType: UTType.plainText, + defaultFilename: "mesh-activity-log", + onCompletion: { + + result in + + if case .success = result { + print("Mesh activity log download: success.") + } else { + print("Mesh activity log download \(result).") + } + } ) - { - result in - if case .success = result { - print("Upload was ok") - } - else{ - print("Something went wrong") - } - } .textSelection(.enabled)