diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 8accf312..5dd30ab7 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -974,49 +974,65 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate var success = false let fromNodeNum = connectedPeripheral.num var positionPacket = Position() + + let fetchChannelRequest: NSFetchRequest = NSFetchRequest.init(entityName: "ChannelEntity") + fetchChannelRequest.predicate = NSPredicate(format: "index == %lld", channel) - if #available(iOS 17.0, macOS 14.0, *) { - - if let lastLocation = LocationsHandler.shared.locationsArray.last { + do { + guard let fetchedChannel = try context!.fetch(fetchChannelRequest) as? [ChannelEntity] else { + return false + } + if #available(iOS 17.0, macOS 14.0, *) { - positionPacket.latitudeI = Int32(lastLocation.coordinate.latitude * 1e7) - positionPacket.longitudeI = Int32(lastLocation.coordinate.longitude * 1e7) - let timestamp = lastLocation.timestamp + if let lastLocation = LocationsHandler.shared.locationsArray.last { + + positionPacket.latitudeI = Int32(lastLocation.coordinate.latitude * 1e7) + positionPacket.longitudeI = Int32(lastLocation.coordinate.longitude * 1e7) + let timestamp = lastLocation.timestamp + positionPacket.time = UInt32(timestamp.timeIntervalSince1970) + positionPacket.timestamp = UInt32(timestamp.timeIntervalSince1970) + positionPacket.altitude = Int32(lastLocation.altitude) + positionPacket.satsInView = UInt32(LocationsHandler.satsInView) + positionPacket.precisionBits = UInt32(fetchedChannel[0].positionPrecision) + let currentSpeed = lastLocation.speed + if currentSpeed > 0 && (!currentSpeed.isNaN || !currentSpeed.isInfinite) { + positionPacket.groundSpeed = UInt32(currentSpeed * 3.6) + } + let currentHeading = lastLocation.course + if currentHeading > 0 && (!currentHeading.isNaN || !currentHeading.isInfinite) { + positionPacket.groundTrack = UInt32(currentHeading) + } + + } + + } else { + if fromNodeNum <= 0 || LocationHelper.currentLocation.distance(from: LocationHelper.DefaultLocation) == 0.0 { + return false + } + positionPacket.latitudeI = Int32(LocationHelper.currentLocation.latitude * 1e7) + positionPacket.longitudeI = Int32(LocationHelper.currentLocation.longitude * 1e7) + let timestamp = LocationHelper.shared.locationManager.location?.timestamp ?? Date() positionPacket.time = UInt32(timestamp.timeIntervalSince1970) positionPacket.timestamp = UInt32(timestamp.timeIntervalSince1970) - positionPacket.altitude = Int32(lastLocation.altitude) - positionPacket.satsInView = UInt32(LocationsHandler.satsInView) - let currentSpeed = lastLocation.speed + positionPacket.altitude = Int32(LocationHelper.shared.locationManager.location?.altitude ?? 0) + positionPacket.satsInView = UInt32(LocationHelper.satsInView) + positionPacket.precisionBits = UInt32(fetchedChannel[0].positionPrecision) + let currentSpeed = LocationHelper.shared.locationManager.location?.speed ?? 0 if currentSpeed > 0 && (!currentSpeed.isNaN || !currentSpeed.isInfinite) { positionPacket.groundSpeed = UInt32(currentSpeed * 3.6) } - let currentHeading = lastLocation.course + let currentHeading = LocationHelper.shared.locationManager.location?.course ?? 0 if currentHeading > 0 && (!currentHeading.isNaN || !currentHeading.isInfinite) { positionPacket.groundTrack = UInt32(currentHeading) } - - } - - } else { - if fromNodeNum <= 0 || LocationHelper.currentLocation.distance(from: LocationHelper.DefaultLocation) == 0.0 { - return false - } - positionPacket.latitudeI = Int32(LocationHelper.currentLocation.latitude * 1e7) - positionPacket.longitudeI = Int32(LocationHelper.currentLocation.longitude * 1e7) - let timestamp = LocationHelper.shared.locationManager.location?.timestamp ?? Date() - positionPacket.time = UInt32(timestamp.timeIntervalSince1970) - positionPacket.timestamp = UInt32(timestamp.timeIntervalSince1970) - positionPacket.altitude = Int32(LocationHelper.shared.locationManager.location?.altitude ?? 0) - positionPacket.satsInView = UInt32(LocationHelper.satsInView) - let currentSpeed = LocationHelper.shared.locationManager.location?.speed ?? 0 - if currentSpeed > 0 && (!currentSpeed.isNaN || !currentSpeed.isInfinite) { - positionPacket.groundSpeed = UInt32(currentSpeed * 3.6) - } - let currentHeading = LocationHelper.shared.locationManager.location?.course ?? 0 - if currentHeading > 0 && (!currentHeading.isNaN || !currentHeading.isInfinite) { - positionPacket.groundTrack = UInt32(currentHeading) } + + } catch { + return false } + return false + + var meshPacket = MeshPacket() meshPacket.to = UInt32(destNum) diff --git a/de.lproj/Localizable.strings b/de.lproj/Localizable.strings index c9ca6fed..ada6bdc1 100644 --- a/de.lproj/Localizable.strings +++ b/de.lproj/Localizable.strings @@ -51,6 +51,28 @@ "clear.app.data"="App Daten löschen"; "clear.log"="Log löschen"; "close"="Schließen"; +"config.power.settings"="Power"; +"config.power.title"="Power Config"; +"config.power.section.battery"="Battery"; +"config.power.section.sleep"="Sleep"; +"config.power.adc.override"="ADC Override"; +"config.power.adc.multiplier"="Multiplier"; +"config.power.ls.secs"="Light Sleep Interval"; +"config.power.min.wake.secs"="Minimum Wake Interval"; +"config.power.saving"="Power Saving"; +"config.power.saving.description"="Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button."; +"config.power.shutdown.on.power.loss"="Shutdown on Power Loss"; +"config.power.shutdown.after.secs"="After"; +"config.power.wait.bluetooth.secs"="Bluetooth Off After"; +"config.ringtone"="RTTTL Ringtone"; +"config.ringtone.title"="Ringtone Config"; +"config.ringtone.label"="Ringtone Transfer Language"; +"config.ringtone.description"="Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications."; +"config.module.paxcounter.settings"="PAX Counter"; +"config.module.paxcounter.title"="PAX Counter Config"; +"config.module.paxcounter.enabled.description"="When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be enabled for PAX counter to work."; +"config.module.paxcounter.updateinterval"="Update Interval"; +"config.module.paxcounter.updateinterval.description"="How often we can send a message to the mesh when people are detected."; "config.save.confirm"="Nach dem ändern der Einstellungen wird das Gerät neu starten."; "connected.radio"="Verbundenes Gerät"; "communicating"="Verbinde mit Gerät..."; diff --git a/he.lproj/Localizable.strings b/he.lproj/Localizable.strings index d2698e18..c4418a90 100644 --- a/he.lproj/Localizable.strings +++ b/he.lproj/Localizable.strings @@ -51,6 +51,28 @@ "clear.app.data"="אפס הגדרות אפליקציה"; "clear.log"="נקה"; "close"="סגור"; +"config.power.settings"="Power"; +"config.power.title"="Power Config"; +"config.power.section.battery"="Battery"; +"config.power.section.sleep"="Sleep"; +"config.power.adc.override"="ADC Override"; +"config.power.adc.multiplier"="Multiplier"; +"config.power.ls.secs"="Light Sleep Interval"; +"config.power.min.wake.secs"="Minimum Wake Interval"; +"config.power.saving"="Power Saving"; +"config.power.saving.description"="Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button."; +"config.power.shutdown.on.power.loss"="Shutdown on Power Loss"; +"config.power.shutdown.after.secs"="After"; +"config.power.wait.bluetooth.secs"="Bluetooth Off After"; +"config.ringtone"="RTTTL Ringtone"; +"config.ringtone.title"="Ringtone Config"; +"config.ringtone.label"="Ringtone Transfer Language"; +"config.ringtone.description"="Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications."; +"config.module.paxcounter.settings"="PAX Counter"; +"config.module.paxcounter.title"="PAX Counter Config"; +"config.module.paxcounter.enabled.description"="When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be enabled for PAX counter to work."; +"config.module.paxcounter.updateinterval"="Update Interval"; +"config.module.paxcounter.updateinterval.description"="How often we can send a message to the mesh when people are detected."; "config.save.confirm"="לאחר שמירת הגדרות המכשיר יתחיל מחדש."; "communicating"="מתקשר עם מכשיר. ."; "connected.radio"="מכשיר מחובר"; diff --git a/pl.lproj/Localizable.strings b/pl.lproj/Localizable.strings index c823eaf6..b50eff01 100644 --- a/pl.lproj/Localizable.strings +++ b/pl.lproj/Localizable.strings @@ -53,6 +53,28 @@ "clear.app.data"="Wyczyść dane aplikacji"; "clear.log"="Wyczyść"; "close"="Zamknij"; +"config.power.settings"="Power"; +"config.power.title"="Power Config"; +"config.power.section.battery"="Battery"; +"config.power.section.sleep"="Sleep"; +"config.power.adc.override"="ADC Override"; +"config.power.adc.multiplier"="Multiplier"; +"config.power.ls.secs"="Light Sleep Interval"; +"config.power.min.wake.secs"="Minimum Wake Interval"; +"config.power.saving"="Power Saving"; +"config.power.saving.description"="Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button."; +"config.power.shutdown.on.power.loss"="Shutdown on Power Loss"; +"config.power.shutdown.after.secs"="After"; +"config.power.wait.bluetooth.secs"="Bluetooth Off After"; +"config.ringtone"="RTTTL Ringtone"; +"config.ringtone.title"="Ringtone Config"; +"config.ringtone.label"="Ringtone Transfer Language"; +"config.ringtone.description"="Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications."; +"config.module.paxcounter.settings"="PAX Counter"; +"config.module.paxcounter.title"="PAX Counter Config"; +"config.module.paxcounter.enabled.description"="When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be enabled for PAX counter to work."; +"config.module.paxcounter.updateinterval"="Update Interval"; +"config.module.paxcounter.updateinterval.description"="How often we can send a message to the mesh when people are detected."; "config.save.confirm"="Po zapisaniu wartości konfiguracji węzeł zostanie zrestartowany."; "communicating"="Komunikowanie z urządzeniem. ."; "connected.radio"="Podłączone radio"; diff --git a/zh-Hans.lproj/Localizable.strings b/zh-Hans.lproj/Localizable.strings index 0932962e..67c9ac65 100644 --- a/zh-Hans.lproj/Localizable.strings +++ b/zh-Hans.lproj/Localizable.strings @@ -51,6 +51,28 @@ "clear.app.data"="清除 App 数据"; "clear.log"="清除日志"; "close"="关闭"; +"config.power.settings"="Power"; +"config.power.title"="Power Config"; +"config.power.section.battery"="Battery"; +"config.power.section.sleep"="Sleep"; +"config.power.adc.override"="ADC Override"; +"config.power.adc.multiplier"="Multiplier"; +"config.power.ls.secs"="Light Sleep Interval"; +"config.power.min.wake.secs"="Minimum Wake Interval"; +"config.power.saving"="Power Saving"; +"config.power.saving.description"="Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button."; +"config.power.shutdown.on.power.loss"="Shutdown on Power Loss"; +"config.power.shutdown.after.secs"="After"; +"config.power.wait.bluetooth.secs"="Bluetooth Off After"; +"config.ringtone"="RTTTL Ringtone"; +"config.ringtone.title"="Ringtone Config"; +"config.ringtone.label"="Ringtone Transfer Language"; +"config.ringtone.description"="Ringtone Transfer Language(RTTTL) Ringtone String used by supported buzzers in external notifications."; +"config.module.paxcounter.settings"="PAX Counter"; +"config.module.paxcounter.title"="PAX Counter Config"; +"config.module.paxcounter.enabled.description"="When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be enabled for PAX counter to work."; +"config.module.paxcounter.updateinterval"="Update Interval"; +"config.module.paxcounter.updateinterval.description"="How often we can send a message to the mesh when people are detected."; "config.save.confirm"="电台将会在配置保存后重启。"; "connected.radio"="已连接的电台"; "communicating"="与电台进行通讯中...";