From d438dc20998f95ff6bd7e287ed77620660f33f55 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Fri, 28 Feb 2025 21:00:11 -0800 Subject: [PATCH] Get rid of the developer mesh log --- Localizable.xcstrings | 696 ++++---------------- Meshtastic.xcodeproj/project.pbxproj | 8 - Meshtastic/Helpers/BLEManager.swift | 101 ++- Meshtastic/Helpers/MeshLogger.swift | 42 -- Meshtastic/Helpers/MeshPackets.swift | 22 +- Meshtastic/Persistence/UpdateCoreData.swift | 42 +- Meshtastic/Router/NavigationState.swift | 1 - Meshtastic/Views/Settings/MeshLog.swift | 96 --- Meshtastic/Views/Settings/Settings.swift | 9 - 9 files changed, 209 insertions(+), 808 deletions(-) delete mode 100644 Meshtastic/Helpers/MeshLogger.swift delete mode 100644 Meshtastic/Views/Settings/MeshLog.swift diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 7ac6fa36..27a72083 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -2,7 +2,7 @@ "sourceLanguage" : "en", "strings" : { "" : { - "shouldTranslate" : false + }, "\t%@" : { "localizations" : { @@ -38,9 +38,6 @@ }, " %@%%" : { - }, - "--" : { - "shouldTranslate" : false }, ": %@" : { "localizations" : { @@ -73,9 +70,6 @@ } } } - }, - "?" : { - }, "(Re)define PIN_GPS_EN for your board." : { "localizations" : { @@ -311,8 +305,8 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", - "value" : "%@ може имати до %@ бајтова." + "state" : "needs_review", + "value" : "%1$@ може имати до %2$@ бајтова." } }, "zh-Hans" : { @@ -471,7 +465,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "%@ Апликација ће се аутоматски поново повезати са жељеним радиом ако се врати у домет." } }, @@ -530,8 +524,8 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", - "value" : "%@ Ова грешка обично не може да се поправи без заборављања уређаја под Подешавања > Блутут и поново повезивање са радиом." + "state" : "needs_review", + "value" : "%@ Ова грешка обично не може да се поправи без заборављања уређаја испод подешавања > Блутут и поново повезивање са радиом." } }, "zh-Hans" : { @@ -625,24 +619,10 @@ } }, "%@mA" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@mA" - } - } - } + }, "%@V" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@V" - } - } - } + }, "%d" : { "localizations" : { @@ -751,9 +731,6 @@ } } } - }, - "%f%%" : { - }, "%lf" : { "localizations" : { @@ -940,7 +917,7 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "2.4 GHz" } } @@ -1085,24 +1062,10 @@ } }, "About" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Детаљи" - } - } - } + }, "About Meshtastic" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "О Мештастику" - } - } - } + }, "Accuracy %@" : { "localizations" : { @@ -1416,7 +1379,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "пре" } }, @@ -1474,7 +1437,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Време емитовања" } }, @@ -1492,6 +1455,23 @@ } } }, + "Airtime %@%%" : { + "extractionState" : "stale", + "localizations" : { + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Време емитовања %@%%" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "translated", + "value" : "广播时间 %@%%" + } + } + } + }, "Alert" : { "localizations" : { "sr" : { @@ -1747,7 +1727,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Увек укључен" } }, @@ -1821,7 +1801,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Амбијентално осветљење" } }, @@ -1879,7 +1859,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Подешавања амбијенталног осветљења" } }, @@ -2093,7 +2073,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Да ли си сигуран?" } }, @@ -2116,7 +2096,7 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Аустралија / Нови Зеланд" } } @@ -2140,12 +2120,6 @@ }, "Available modem presets, default is Long Fast." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verfügbare Modemvoreinstellungen, Standard ist Hohe Reichweite - Schnell." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -2200,7 +2174,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Доступни радио уређаји" } }, @@ -2344,7 +2318,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Ниво батерије" } }, @@ -2434,7 +2408,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "BLE назив" } }, @@ -2492,7 +2466,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "BLE пин мора имати 6 цифара." } }, @@ -2640,7 +2614,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Блутут подешавања" } }, @@ -2698,7 +2672,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Блутут је искључен" } }, @@ -2821,7 +2795,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Бајтова" } }, @@ -2911,7 +2885,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Откажи" } }, @@ -2969,7 +2943,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Унапред припремљене поруке" } }, @@ -3027,7 +3001,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Подешавања унапред припремљених порука" } }, @@ -3273,64 +3247,22 @@ } }, "Ch1 Current" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch1 струја" - } - } - } + }, "Ch1 Voltage" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch1 напон" - } - } - } + }, "Ch2 Current" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch2 струја" - } - } - } + }, "Ch2 Voltage" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch2 напон" - } - } - } + }, "Ch3 Current" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch3 струја" - } - } - } + }, "Ch3 Voltage" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ch3 напон" - } - } - } + }, "Channel" : { "localizations" : { @@ -3372,7 +3304,7 @@ }, "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Канал" } }, @@ -3407,14 +3339,7 @@ } }, "Channel 1" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Канал 1" - } - } - } + }, "Channel 1 Included" : { "localizations" : { @@ -3433,14 +3358,7 @@ } }, "Channel 2" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Канал 2" - } - } - } + }, "Channel 2 Included" : { "localizations" : { @@ -3459,14 +3377,7 @@ } }, "Channel 3" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Канал 3" - } - } - } + }, "Channel 3 Included" : { "localizations" : { @@ -3613,16 +3524,13 @@ } }, "Channel URL" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "URL канала" - } - } - } + }, "Channel Utilization %@%%" : { + + }, + "Channel Utilization %@%% " : { + "extractionState" : "stale", "localizations" : { "sr" : { "stringUnit" : { @@ -4008,7 +3916,7 @@ "localizations" : { "sr" : { "stringUnit" : { - "state" : "translated", + "state" : "needs_review", "value" : "Кина" } } @@ -4031,14 +3939,7 @@ } }, "Clear Log" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Очисти логове" - } - } - } + }, "clear.app.data" : { "localizations" : { @@ -4287,14 +4188,7 @@ } }, "Communicating" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Комуницирање" - } - } - } + }, "Config" : { "localizations" : { @@ -6323,14 +6217,7 @@ } }, "Current" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Струја" - } - } - } + }, "Current Firmware Version: %@" : { "localizations" : { @@ -6729,14 +6616,7 @@ } }, "Delete Power metrics?" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обрисати метрику снаге?" - } - } - } + }, "Description" : { "localizations" : { @@ -7140,12 +7020,6 @@ }, "Device Role" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerät Rolle" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -7741,12 +7615,6 @@ "device.role.name.clientMute" : { "extractionState" : "manual", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Client (stumm)" - } - }, "en" : { "stringUnit" : { "state" : "translated", @@ -7897,12 +7765,6 @@ "state" : "translated", "value" : "Router Late" } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Рутер са кашњењем" - } } } }, @@ -8231,12 +8093,6 @@ "state" : "translated", "value" : "Infrastructure node that always rebroadcasts packets once but only after all other modes, ensuring additional coverage for local clusters. Visible in Nodes list." } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Инфраструктурни чвор који увек поново емитује пакете једном, али тек након свих осталих модова, обезбеђујући додатну покривеност за локалне кластере. Видљив у листи чворова." - } } } }, @@ -9069,12 +8925,6 @@ }, "Double Tap as Button" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Doppeltes Antippen als Taste" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -12032,12 +11882,6 @@ }, "Hourly Duty Cycle" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stündliche Sendebeschränkung" - } - } "sr" : { "stringUnit" : { "state" : "translated", @@ -12190,6 +12034,23 @@ } } }, + "HUMIDITY" : { + "extractionState" : "stale", + "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "LUFTFEUCHTIGKEIT" + } + }, + "sr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ВЛАЖНОСТ" + } + } + } + }, "hybrid" : { "extractionState" : "migrated", "localizations" : { @@ -12466,12 +12327,6 @@ }, "Ignore MQTT" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT ignorieren" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -15450,12 +15305,6 @@ }, "Limit all periodic broadcast intervals especially telemetry and position. If you need to increase hops, do it on nodes at the edges, not the ones in the middle. MQTT is not advised when you are duty cycle restricted because the gateway node is then doing all the work." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Begrenzen Sie alle regelmäßigen Sendeintervalle, insbesondere Telemetrie und Position. Wenn Sie die Anzahl der Zwischenstationen (Hops) erhöhen müssen, tun Sie dies bei den Knoten an den Randbereichen, nicht bei denen in der Mitte. MQTT ist nicht empfohlen, wenn eine Sendebeschränkung vorliegt, da der Gateway-Knoten dann die Hauptarbeit übernimmt." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -16087,12 +15936,6 @@ "long.range.fast" : { "extractionState" : "manual", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hohe Reichweite - Schnell" - } - }, "en" : { "stringUnit" : { "state" : "translated", @@ -16110,12 +15953,6 @@ "long.range.moderate" : { "extractionState" : "manual", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hohe Reichweite - Gemäßigt" - } - }, "en" : { "stringUnit" : { "state" : "translated", @@ -16133,12 +15970,6 @@ "long.range.slow" : { "extractionState" : "manual", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hohe Reichweite - Langsam" - } - }, "en" : { "stringUnit" : { "state" : "translated", @@ -16309,7 +16140,7 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Schwach" + "value" : "Schlechte Signalstärke" } }, "en" : { @@ -16332,7 +16163,7 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Ausreichend" + "value" : "Ordentliche Signalstärke" } }, "en" : { @@ -16355,7 +16186,7 @@ "de" : { "stringUnit" : { "state" : "translated", - "value" : "Stark" + "value" : "Gute Signalstärke" } }, "en" : { @@ -17206,6 +17037,7 @@ } }, "mesh.log" : { + "extractionState" : "stale", "localizations" : { "de" : { "stringUnit" : { @@ -20766,14 +20598,7 @@ } }, "Navigate to node" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пређите на чвор" - } - } - } + }, "Nearby Topics" : { "localizations" : { @@ -21211,14 +21036,7 @@ } }, "No Power Metrics" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Нема метрике снаге" - } - } - } + }, "no.nodes" : { "extractionState" : "manual", @@ -21357,12 +21175,6 @@ }, "Node Info Broadcast Interval" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Knoten Info Broadcast Intervall" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -21958,12 +21770,6 @@ }, "Ok to MQTT" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "MQTT ist in Ordnung" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -22998,12 +22804,6 @@ }, "Please connect to a radio to configure settings." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bitte verbinden Sie sich mit einem Endgerät, um die Einstellungen zu konfigurieren." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23021,12 +22821,6 @@ "Please set a region" : { "extractionState" : "manual", "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bitte legen Sie eine Region fest" - } - }, "en" : { "stringUnit" : { "state" : "translated", @@ -23323,14 +23117,7 @@ } }, "Power" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Снага" - } - } - } + }, "Power Metrics" : { "localizations" : { @@ -23343,24 +23130,10 @@ } }, "Power Metrics Log" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дневник метрика снаге" - } - } - } + }, "Power Metrics Log}" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дневник метрика снаге}" - } - } - } + }, "Power Off" : { "localizations" : { @@ -23400,12 +23173,6 @@ "state" : "translated", "value" : "Delete all power metrics?" } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Обрисати све метрике снаге?" - } } } }, @@ -23417,12 +23184,6 @@ "state" : "translated", "value" : "Power Metrics Log" } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Дневник метрика снаге" - } } } }, @@ -23525,12 +23286,6 @@ }, "Presets" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voreinstellungen" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -23556,17 +23311,21 @@ } }, "Pressure" : { + + }, + "PRESSURE" : { + "extractionState" : "stale", "localizations" : { "de" : { "stringUnit" : { "state" : "translated", - "value" : "Druck" + "value" : "DRUCK" } }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Притисак" + "value" : "ПРИТИСАК" } } } @@ -24194,12 +23953,6 @@ }, "Rebroadcast Mode" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rebroadcast Modus" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -25133,14 +24886,7 @@ } }, "Route Recorder" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Снимач рута" - } - } - } + }, "Route recording paused" : { "localizations" : { @@ -25189,14 +24935,7 @@ } }, "Routes" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Руте" - } - } - } + }, "routes.activitytype.biking" : { "extractionState" : "migrated", @@ -26754,14 +26493,7 @@ } }, "Save Channel Settings" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Сачувај подешавања канала" - } - } - } + }, "Save User Config to %@?" : { "localizations" : { @@ -27047,14 +26779,7 @@ } }, "Select Channel" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Одабери канал" - } - } - } + }, "select.contact" : { "extractionState" : "manual", @@ -27218,24 +26943,10 @@ } }, "Send ${messageContent} to ${nodeNumber}" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошаљи ${messageContent} на ${nodeNumber}" - } - } - } + }, "Send a Direct Message" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошаљи директну поруку" - } - } - } + }, "Send a Group Message" : { "localizations" : { @@ -27264,23 +26975,10 @@ } }, "Send a message to a certain meshtastic node" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Пошаљите поруку одређеном Meshtastic чвору" - } - } - } + }, "Send a position on the primary channel when the user button is triple clicked." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senden der Position auf dem Hauptkanal, wenn die Benutzer-Taste dreimal betätigt wird." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28094,12 +27792,6 @@ }, "Sets the maximum number of hops, default is 3. Increasing hops also increases congestion and should be used carefully. O hop broadcast messages will not get ACKs." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Legt die maximale Anzahl von Zwischenstationen (Hops) fest, Vorgabe ist 3. Eine Erhöhung der Hops vergrößert auch die Netzüberlastung und sollte mit Vorsicht verwendet werden. 0-Hop-Broadcast-Nachrichten erhalten keine ACKs." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -28977,12 +28669,6 @@ }, "Store & Forward" : { "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Чување и прослеђивање" - } - }, "zh-Hans" : { "stringUnit" : { "state" : "translated", @@ -28993,12 +28679,6 @@ }, "Store & Forward Config" : { "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Подешавања чувања и прослеђивања" - } - }, "zh-Hans" : { "stringUnit" : { "state" : "translated", @@ -29098,12 +28778,6 @@ "state" : "translated", "value" : "מחובר למש" } - }, - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Претплаћен" - } } } }, @@ -29167,14 +28841,7 @@ } }, "Takes a Meshtastic channel URL and saves the channel settings." : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Преузима URL Meshtastic канала и чува подешавања канала" - } - } - } + }, "Tapback" : { "localizations" : { @@ -30164,12 +29831,6 @@ }, "The last 4 of the device MAC address will be appended to the short name to set the device's BLE Name. Short name can be up to 4 bytes long." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Die letzten 4 Zeichen der MAC-Adresse des Geräts werden an den Kurznamen angehängt, um den BLE-Namen des Geräts festzulegen. Der Kurzname kann bis zu 4 Byte lang sein." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -30378,14 +30039,7 @@ } }, "The URL for the channel settings" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "\"URL за подешавања канала" - } - } - } + }, "There has been no response to a request for device metadata over the admin channel for this node." : { "localizations" : { @@ -30640,14 +30294,7 @@ } }, "timestamp" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "временска ознака" - } - } - } + }, "Timestamp" : { "localizations" : { @@ -31494,12 +31141,6 @@ }, "Transmit Enabled" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senden Aktiviert" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31516,12 +31157,6 @@ }, "Treat double tap on supported accelerometers as a user button press." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Doppeltes Antippen bei unterstützten Beschleunigungsmessern wird als Tastendruck behandelt." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31548,12 +31183,6 @@ }, "Triple Click Ad Hoc Ping" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dreifach-Klick für Ping" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -31725,14 +31354,7 @@ } }, "unknown" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "непознато" - } - } - } + }, "Unknown" : { "localizations" : { @@ -32167,14 +31789,7 @@ } }, "Uptime" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Време рада" - } - } - } + }, "Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead." : { "localizations" : { @@ -32204,12 +31819,6 @@ }, "Use Preset" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voreinstellung verwenden" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32241,18 +31850,7 @@ } }, "Used to create a shared key with a remote device." : { - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wird verwendet, um einen gemeinsamen Schlüssel mit einem Remote-Gerät zu erstellen." - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Користи се за креирање заједничког кључа са удаљеним уређајем" - } - } - } + }, "user" : { "localizations" : { @@ -32320,12 +31918,6 @@ }, "User Config" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzerkonfiguration" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32342,12 +31934,6 @@ }, "User Details" : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzerdetails" - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -32623,7 +32209,7 @@ } } }, - "Voltage" : { + "voltage" : { "localizations" : { "de" : { "stringUnit" : { @@ -32688,16 +32274,13 @@ } }, "Voltage" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Напон" - } - } - } + + }, + "Volts %@" : { + }, "Volts %@ " : { + "extractionState" : "stale", "localizations" : { "de" : { "stringUnit" : { @@ -32938,14 +32521,7 @@ } }, "Whether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin" : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Да ли користити INPUT_PULLUP мод за GPIO пин. Применљиво само ако плоча користи pull-up отпорнике на пину" - } - } - } + }, "WiFi Options" : { "localizations" : { @@ -32964,11 +32540,21 @@ } }, "Wind" : { + + }, + "WIND" : { + "extractionState" : "stale", "localizations" : { + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "WIND" + } + }, "sr" : { "stringUnit" : { "state" : "translated", - "value" : "Ветар" + "value" : "ВЕТАР" } } } @@ -33168,24 +32754,10 @@ } }, "Your MQTT Server must support TLS." : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ваш MQTT сервер мора подржавати TLS" - } - } - } + }, "Your node’s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name." : { - "localizations" : { - "sr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Радна фреквенција вашег чвора се израчунава на основу региона, поставки модема и овог поља. Када је вредност 0, слот се аутоматски израчунава на основу примарног имена канала." - } - } - } + }, "Your position has been sent with a request for a response with their position. You will receive a notification when a position is returned." : { "localizations" : { @@ -33221,12 +32793,6 @@ }, "Your region has a %lld%% hourly duty cycle, your radio will stop sending packets when it reaches the hourly limit." : { "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ihre Region hat eine stündliche Sendebeschränkung von %lld%%, Ihr Endgerät hört auf, Pakete zu senden, wenn es die stündliche Grenze erreicht." - } - }, "sr" : { "stringUnit" : { "state" : "translated", @@ -33247,4 +32813,4 @@ } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index 89b4c893..60c6e50b 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -129,8 +129,6 @@ DD77093D2AA1AFA3007A8BF0 /* ChannelTips.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD77093C2AA1AFA3007A8BF0 /* ChannelTips.swift */; }; DD77093F2AA1B146007A8BF0 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD77093E2AA1B146007A8BF0 /* UIColor.swift */; }; DD798B072915928D005217CD /* ChannelMessageList.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD798B062915928D005217CD /* ChannelMessageList.swift */; }; - DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8169F8271F1A6100F4AB02 /* MeshLogger.swift */; }; - DD8169FB271F1F3A00F4AB02 /* MeshLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8169FA271F1F3A00F4AB02 /* MeshLog.swift */; }; DD8169FF272476C700F4AB02 /* LogDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD8169FE272476C700F4AB02 /* LogDocument.swift */; }; DD836AE726F6B38600ABCC23 /* Connect.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD836AE626F6B38600ABCC23 /* Connect.swift */; }; DD86D40A287F04F100BAEB7A /* InvalidVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD86D409287F04F100BAEB7A /* InvalidVersion.swift */; }; @@ -417,8 +415,6 @@ DD798B062915928D005217CD /* ChannelMessageList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelMessageList.swift; sourceTree = ""; }; DD7CF8DA2C93663C008BD10E /* MeshtasticDataModelV 44.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 44.xcdatamodel"; sourceTree = ""; }; DD7E235F2C7AA3E50078ACDF /* MeshtasticDataModelV 43.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MeshtasticDataModelV 43.xcdatamodel"; sourceTree = ""; }; - DD8169F8271F1A6100F4AB02 /* MeshLogger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshLogger.swift; sourceTree = ""; }; - DD8169FA271F1F3A00F4AB02 /* MeshLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeshLog.swift; sourceTree = ""; }; DD8169FE272476C700F4AB02 /* LogDocument.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogDocument.swift; sourceTree = ""; }; DD836AE626F6B38600ABCC23 /* Connect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connect.swift; sourceTree = ""; }; DD86D409287F04F100BAEB7A /* InvalidVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvalidVersion.swift; sourceTree = ""; }; @@ -767,7 +763,6 @@ DDA0B6B1294CDC55001356EC /* Channels.swift */, DDD6EEAE29BC024700383354 /* Firmware.swift */, DD33DB612B3D27C7003E1EA0 /* FirmwareApi.swift */, - DD8169FA271F1F3A00F4AB02 /* MeshLog.swift */, DD86D40B287F401000BAEB7A /* SaveChannelQRCode.swift */, DD3501882852FC3B000FC853 /* Settings.swift */, DD3CC6B428E33FD100FA9159 /* ShareChannels.swift */, @@ -1070,7 +1065,6 @@ DDAF8C5226EB1DF10058C060 /* BLEManager.swift */, DDC2E1A626CEB3400042C5E4 /* LocationHelper.swift */, DD913638270DFF4C00D7ACF3 /* LocalNotificationManager.swift */, - DD8169F8271F1A6100F4AB02 /* MeshLogger.swift */, DDA6B2E828419CF2003E8C16 /* MeshPackets.swift */, DD964FBC296E6B01007C176F /* EmojiOnlyTextField.swift */, DD3619142B1EF9F900C41C8C /* LocationsHandler.swift */, @@ -1510,7 +1504,6 @@ DD964FC62975DBFD007C176F /* QueryCoreData.swift in Sources */, DDB75A112A059258006ED576 /* Url.swift in Sources */, DDAD49ED2AFB39DC00B4425D /* MeshMap.swift in Sources */, - DD8169FB271F1F3A00F4AB02 /* MeshLog.swift in Sources */, DD3CC24C2C498D6C001BD3A2 /* BatteryCompact.swift in Sources */, BCB613812C67290800485544 /* SendWaypointIntent.swift in Sources */, DD1B8F402B35E2F10022AABC /* GPSStatus.swift in Sources */, @@ -1574,7 +1567,6 @@ DD77093F2AA1B146007A8BF0 /* UIColor.swift in Sources */, DDF6B2482A9AEBF500BA6931 /* StoreForwardConfig.swift in Sources */, BCE2D3C92C7C377F008E6199 /* FactoryResetNodeIntent.swift in Sources */, - DD8169F9271F1A6100F4AB02 /* MeshLogger.swift in Sources */, DD93800B2BA3F968008BEC06 /* NodeMapContent.swift in Sources */, DD41582A28585C32009B0E59 /* RangeTestConfig.swift in Sources */, DD1925B728CDA5A400720036 /* CannedMessagesConfigEnums.swift in Sources */, diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 10b48ffd..47db7ebd 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -119,7 +119,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate self.isConnected = false self.isConnecting = false self.lastConnectionError = "🚨 " + String.localizedStringWithFormat("Connection failed after %d attempts to connect to %@. You may need to forget your device under Settings > Bluetooth.".localized, timeoutTimerCount, name) - MeshLogger.log(lastConnectionError) + Logger.services.error("\(self.lastConnectionError)") self.timeoutTimerCount = 0 self.startScanning() } else { @@ -485,7 +485,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } let logString = String.localizedStringWithFormat("mesh.log.traceroute.sent %@".localized, destNum.toHex()) - MeshLogger.log("🪧 \(logString)") + Logger.mesh.info("🪧 \(logString)") } catch { @@ -498,14 +498,14 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate guard connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected else { return } if FROMRADIO_characteristic == nil { - MeshLogger.log("🚨 \("firmware.version.unsupported".localized)") + Logger.mesh.error("🚨 \("firmware.version.unsupported".localized)") invalidVersion = true return } else { let nodeName = connectedPeripheral?.peripheral.name ?? "unknown".localized let logString = String.localizedStringWithFormat("mesh.log.wantconfig %@".localized, nodeName) - MeshLogger.log("🛎️ \(logString)") + Logger.mesh.info("🛎️ \(logString)") // BLE Characteristics discovered, issue wantConfig var toRadio: ToRadio = ToRadio() configNonce += 1 @@ -767,7 +767,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } } // Log any other unknownApp calls - if !nowKnown { MeshLogger.log("🕸️ MESH PACKET received for Unknown App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") } + if !nowKnown { Logger.mesh.info("🕸️ MESH PACKET received for Unknown App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") } case .textMessageApp, .detectionSensorApp: textMessageAppPacket( packet: decodedInfo.packet, @@ -786,7 +786,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate appState: appState ) case .remoteHardwareApp: - MeshLogger.log("🕸️ MESH PACKET received for Remote Hardware App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.info("🕸️ MESH PACKET received for Remote Hardware App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") case .positionApp: upsertPositionPacket(packet: decodedInfo.packet, context: context) case .waypointApp: @@ -798,7 +798,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate case .adminApp: adminAppPacket(packet: decodedInfo.packet, context: context) case .replyApp: - MeshLogger.log("🕸️ MESH PACKET received for Reply App handling as a text message") + Logger.mesh.info("🕸️ MESH PACKET received for Reply App handling as a text message") textMessageAppPacket( packet: decodedInfo.packet, wantRangeTestPackets: wantRangeTestPackets, @@ -807,16 +807,14 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate appState: appState ) case .ipTunnelApp: - // MeshLogger.log("🕸️ MESH PACKET received for IP Tunnel App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for IP Tunnel App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for IP Tunnel App UNHANDLED UNHANDLED") case .serialApp: - // MeshLogger.log("🕸️ MESH PACKET received for Serial App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Serial App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Serial App UNHANDLED UNHANDLED") case .storeForwardApp: if wantStoreAndForwardPackets { storeAndForwardPacket(packet: decodedInfo.packet, connectedNodeNum: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), context: context) } else { - MeshLogger.log("🕸️ MESH PACKET received for Store and Forward App - Store and Forward is disabled.") + Logger.mesh.info("🕸️ MESH PACKET received for Store and Forward App - Store and Forward is disabled.") } case .rangeTestApp: if wantRangeTestPackets { @@ -828,28 +826,22 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate appState: appState ) } else { - MeshLogger.log("🕸️ MESH PACKET received for Range Test App Range testing is disabled.") + Logger.mesh.info("🕸️ MESH PACKET received for Range Test App Range testing is disabled.") } case .telemetryApp: if !invalidVersion { telemetryPacket(packet: decodedInfo.packet, connectedNode: (self.connectedPeripheral != nil ? connectedPeripheral.num : 0), context: context) } case .textMessageCompressedApp: - // MeshLogger.log("🕸️ MESH PACKET received for Text Message Compressed App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Text Message Compressed App UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Text Message Compressed App UNHANDLED") case .zpsApp: - // MeshLogger.log("🕸️ MESH PACKET received for Zero Positioning System App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Zero Positioning System App UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Zero Positioning System App UNHANDLED") case .privateApp: - // MeshLogger.log("🕸️ MESH PACKET received for Private App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Private App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Private App UNHANDLED UNHANDLED") case .atakForwarder: - // MeshLogger.log("🕸️ MESH PACKET received for ATAK Forwarder App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for ATAK Forwarder App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for ATAK Forwarder App UNHANDLED UNHANDLED") case .simulatorApp: - // MeshLogger.log("🕸️ MESH PACKET received for Simulator App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Simulator App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Simulator App UNHANDLED UNHANDLED") case .audioApp: - // MeshLogger.log("🕸️ MESH PACKET received for Audio App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") - MeshLogger.log("🕸️ MESH PACKET received for Audio App UNHANDLED UNHANDLED") + Logger.mesh.info("🕸️ MESH PACKET received for Audio App UNHANDLED UNHANDLED") case .tracerouteApp: if let routingMessage = try? RouteDiscovery(serializedBytes: decodedInfo.packet.decoded.payload) { let traceRoute = getTraceRoute(id: Int64(decodedInfo.packet.decoded.requestID), context: context) @@ -996,25 +988,24 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Logger.data.error("Error Updating Core Data TraceRouteHop: \(nsError, privacy: .public)") } let logString = String.localizedStringWithFormat("mesh.log.traceroute.received.route %@".localized, routeString) - MeshLogger.log("🪧 \(logString)") + Logger.mesh.info("🪧 \(logString)") } case .neighborinfoApp: if let neighborInfo = try? NeighborInfo(serializedBytes: decodedInfo.packet.decoded.payload) { - // MeshLogger.log("🕸️ MESH PACKET received for Neighbor Info App UNHANDLED") - MeshLogger.log("🕸️ MESH PACKET received for Neighbor Info App UNHANDLED \(neighborInfo)") + Logger.mesh.info("🕸️ MESH PACKET received for Neighbor Info App UNHANDLED \((try? neighborInfo.jsonString()) ?? "JSON Decode Failure")") } case .paxcounterApp: paxCounterPacket(packet: decodedInfo.packet, context: context) case .mapReportApp: - MeshLogger.log("🕸️ MESH PACKET received Map Report App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.info("🕸️ MESH PACKET received Map Report App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") case .UNRECOGNIZED: - MeshLogger.log("🕸️ MESH PACKET received UNRECOGNIZED App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.info("🕸️ MESH PACKET received UNRECOGNIZED App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") case .max: Logger.services.info("MAX PORT NUM OF 511") case .atakPlugin: - MeshLogger.log("🕸️ MESH PACKET received for ATAK Plugin App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.info("🕸️ MESH PACKET received for ATAK Plugin App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") case .powerstressApp: - MeshLogger.log("🕸️ MESH PACKET received for Power Stress App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.info("🕸️ MESH PACKET received for Power Stress App UNHANDLED \((try? decodedInfo.packet.jsonString()) ?? "JSON Decode Failure")") } if decodedInfo.configCompleteID != 0 && decodedInfo.configCompleteID == configNonce { @@ -1099,7 +1090,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate } let nodeName = connectedPeripheral?.peripheral.name ?? "unknown".localized let logString = String.localizedStringWithFormat("mesh.log.textmessage.send.failed %@".localized, nodeName) - MeshLogger.log("🚫 \(logString)") + Logger.mesh.info("🚫 \(logString)") success = false } else if message.count < 1 { @@ -1186,7 +1177,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) let logString = String.localizedStringWithFormat("mesh.log.textmessage.sent %@ %@ %@".localized, String(newMessage.messageId), fromUserNum.toHex(), toUserNum.toHex()) - MeshLogger.log("💬 \(logString)") + Logger.mesh.info("💬 \(logString)") do { try context.save() Logger.data.info("💾 Saved a new sent message from \(self.connectedPeripheral.num.toHex(), privacy: .public) to \(toUserNum.toHex(), privacy: .public)") @@ -1233,7 +1224,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate return false } let logString = String.localizedStringWithFormat("mesh.log.waypoint.sent %@".localized, String(fromNodeNum)) - MeshLogger.log("📍 \(logString)") + Logger.mesh.info("📍 \(logString)") if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) success = true @@ -1752,7 +1743,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { self.connectedPeripheral.peripheral.writeValue(binaryData, for: self.TORADIO_characteristic, type: .withResponse) let logString = String.localizedStringWithFormat("mesh.log.channel.sent %@ %d".localized, String(connectedPeripheral.num), chan.index) - MeshLogger.log("🎛️ \(logString)") + Logger.mesh.info("🎛️ \(logString)") } } // Save the LoRa Config and the device will reboot @@ -1781,7 +1772,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { self.connectedPeripheral.peripheral.writeValue(binaryData, for: self.TORADIO_characteristic, type: .withResponse) let logString = String.localizedStringWithFormat("mesh.log.lora.config.sent %@".localized, String(connectedPeripheral.num)) - MeshLogger.log("📻 \(logString)") + Logger.mesh.info("📻 \(logString)") } if self.connectedPeripheral != nil { @@ -2701,7 +2692,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate if connectedPeripheral?.peripheral.state ?? CBPeripheralState.disconnected == CBPeripheralState.connected { connectedPeripheral.peripheral.writeValue(binaryData, for: TORADIO_characteristic, type: .withResponse) let logString = String.localizedStringWithFormat("mesh.log.cannedmessages.messages.get %@".localized, String(connectedPeripheral.num)) - MeshLogger.log("🥫 \(logString)") + Logger.mesh.info("🥫 \(logString)") return true } @@ -3328,9 +3319,9 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate // Handle each of the store and forward request / response messages switch storeAndForwardMessage.rr { case .unset: - MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📮 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerError: - MeshLogger.log("☠️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("☠️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerHeartbeat: /// When we get a router heartbeat we know there is a store and forward node on the network /// Check if it is the primary S&F Router and save the timestamp of the last heartbeat so that we can show the request message history menu item on node long press if the router has been seen recently @@ -3358,13 +3349,13 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate Logger.data.error("Save Store and Forward Router Error") } } - MeshLogger.log("💓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("💓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerPing: - MeshLogger.log("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerPong: - MeshLogger.log("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerBusy: - MeshLogger.log("🐝 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🐝 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerHistory: /// Set the Router History Last Request Value guard let routerNode = getNodeInfo(id: Int64(packet.from), context: context) else { @@ -3384,25 +3375,25 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate context.rollback() Logger.data.error("Save Store and Forward Router Error") } - MeshLogger.log("📜 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📜 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerStats: - MeshLogger.log("📊 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📊 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientError: - MeshLogger.log("☠️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("☠️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientHistory: - MeshLogger.log("📜 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📜 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientStats: - MeshLogger.log("📊 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📊 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientPing: - MeshLogger.log("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientPong: - MeshLogger.log("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🏓 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .clientAbort: - MeshLogger.log("🛑 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("🛑 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .UNRECOGNIZED: - MeshLogger.log("📮 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("📮 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") case .routerTextDirect: - MeshLogger.log("💬 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("💬 Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") textMessageAppPacket( packet: packet, wantRangeTestPackets: false, @@ -3412,7 +3403,7 @@ class BLEManager: NSObject, CBPeripheralDelegate, MqttClientProxyManagerDelegate appState: appState ) case .routerTextBroadcast: - MeshLogger.log("✉️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())") + Logger.mesh.info("\("✉️ Store and Forward \(storeAndForwardMessage.rr) message received from \(packet.from.toHex())")") textMessageAppPacket( packet: packet, wantRangeTestPackets: false, diff --git a/Meshtastic/Helpers/MeshLogger.swift b/Meshtastic/Helpers/MeshLogger.swift deleted file mode 100644 index fe579191..00000000 --- a/Meshtastic/Helpers/MeshLogger.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation -import OSLog - -class MeshLogger { - - static var logFile: URL? { - guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil } - let fileName = "mesh.log" - return documentsDirectory.appendingPathComponent(fileName) - } - - static func log(_ message: String) { - guard let logFile = logFile else { - return - } - let localeDateFormat = DateFormatter.dateFormat(fromTemplate: "yyMMddjmmssSSa", options: 0, locale: Locale.current) - let dateFormatString = (localeDateFormat ?? "MM/dd/YY j:mm:ss.SS a") - - let formatter = DateFormatter() - formatter.dateFormat = dateFormatString - let timestamp = formatter.string(from: Date()) - guard let data = (message + " - " + timestamp + "\n").data(using: String.Encoding.utf8) else { - Logger.mesh.error("Unable to create mesh log data") - return - } - - do { - if FileManager.default.fileExists(atPath: logFile.path) { - let fileHandle = try FileHandle(forWritingTo: logFile) - fileHandle.seekToEndOfFile() - fileHandle.write(data) - fileHandle.closeFile() - } else { - try data.write(to: logFile, options: .atomicWrite) - let log = String(data: data, encoding: .utf8) ?? "unknown".localized - Logger.mesh.notice("\(log, privacy: .public)") - } - } catch { - Logger.mesh.error("Error writing mesh log data: \(error.localizedDescription, privacy: .public)") - } - } -} diff --git a/Meshtastic/Helpers/MeshPackets.swift b/Meshtastic/Helpers/MeshPackets.swift index 8ab6dc97..093066ef 100644 --- a/Meshtastic/Helpers/MeshPackets.swift +++ b/Meshtastic/Helpers/MeshPackets.swift @@ -104,7 +104,7 @@ func moduleConfig (config: ModuleConfig, context: NSManagedObjectContext, nodeNu func myInfoPacket (myInfo: MyNodeInfo, peripheralId: String, context: NSManagedObjectContext) -> MyInfoEntity? { let logString = String.localizedStringWithFormat("mesh.log.myinfo %@".localized, String(myInfo.myNodeNum)) - MeshLogger.log("ℹ️ \(logString)") + Logger.mesh.info("ℹ️ \(logString)") let fetchMyInfoRequest = MyInfoEntity.fetchRequest() fetchMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", Int64(myInfo.myNodeNum)) @@ -155,7 +155,7 @@ func channelPacket (channel: Channel, fromNum: Int64, context: NSManagedObjectCo if channel.isInitialized && channel.hasSettings && channel.role != Channel.Role.disabled { let logString = String.localizedStringWithFormat("mesh.log.channel.received %d %@".localized, channel.index, String(fromNum)) - MeshLogger.log("🎛️ \(logString)") + Logger.mesh.info("🎛️ \(logString)") let fetchedMyInfoRequest = MyInfoEntity.fetchRequest() fetchedMyInfoRequest.predicate = NSPredicate(format: "myNodeNum == %lld", fromNum) @@ -210,7 +210,7 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, sessionPass if metadata.isInitialized { let logString = String.localizedStringWithFormat("mesh.log.device.metadata.received %@".localized, fromNum.toHex()) - MeshLogger.log("🏷️ \(logString)") + Logger.mesh.info("🏷️ \(logString)") let fetchedNodeRequest = NodeInfoEntity.fetchRequest() fetchedNodeRequest.predicate = NSPredicate(format: "num == %lld", fromNum) @@ -261,7 +261,7 @@ func deviceMetadataPacket (metadata: DeviceMetadata, fromNum: Int64, sessionPass func nodeInfoPacket (nodeInfo: NodeInfo, channel: UInt32, context: NSManagedObjectContext) -> NodeInfoEntity? { let logString = String.localizedStringWithFormat("mesh.log.nodeinfo.received %@".localized, String(nodeInfo.num)) - MeshLogger.log("📟 \(logString)") + Logger.mesh.info("📟 \(logString)") guard nodeInfo.num > 0 else { return nil } @@ -472,7 +472,7 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { if !cmmc.messages.isEmpty { let logString = String.localizedStringWithFormat("mesh.log.cannedmessages.messages.received %@".localized, packet.from.toHex()) - MeshLogger.log("🥫 \(logString)") + Logger.mesh.info("🥫 \(logString)") let fetchNodeRequest = NodeInfoEntity.fetchRequest() fetchNodeRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) @@ -547,7 +547,7 @@ func adminAppPacket (packet: MeshPacket, context: NSManagedObjectContext) { let ringtone = adminMessage.getRingtoneResponse upsertRtttlConfigPacket(ringtone: ringtone, nodeNum: Int64(packet.from), context: context) } else { - MeshLogger.log("🕸️ MESH PACKET received Admin App UNHANDLED \((try? packet.decoded.jsonString()) ?? "JSON Decode Failure")") + Logger.mesh.error("🕸️ MESH PACKET received Admin App UNHANDLED \((try? packet.decoded.jsonString()) ?? "JSON Decode Failure")") } // Save an ack for the admin message log for each admin message response received as we stopped sending acks if there is also a response to reduce airtime. adminResponseAck(packet: packet, context: context) @@ -582,7 +582,7 @@ func adminResponseAck (packet: MeshPacket, context: NSManagedObjectContext) { func paxCounterPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.paxcounter %@".localized, String(packet.from)) - MeshLogger.log("🧑‍🤝‍🧑 \(logString)") + Logger.mesh.info("🧑‍🤝‍🧑 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) @@ -626,7 +626,7 @@ func routingPacket (packet: MeshPacket, connectedNodeNum: Int64, context: NSMana let routingErrorString = routingError?.display ?? "unknown".localized let logString = String.localizedStringWithFormat("mesh.log.routing.message %@ %@".localized, String(packet.decoded.requestID), routingErrorString) - MeshLogger.log("🕸️ \(logString)") + Logger.mesh.info("🕸️ \(logString)") let fetchMessageRequest = MessageEntity.fetchRequest() fetchMessageRequest.predicate = NSPredicate(format: "messageId == %lld", Int64(packet.decoded.requestID)) @@ -687,7 +687,7 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage if let telemetryMessage = try? Telemetry(serializedBytes: packet.decoded.payload) { let logString = String.localizedStringWithFormat("mesh.log.telemetry.received %@".localized, String(packet.from)) - MeshLogger.log("📈 \(logString)") + Logger.mesh.info("📈 \(logString)") if telemetryMessage.variant != Telemetry.OneOf_Variant.deviceMetrics(telemetryMessage.deviceMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.environmentMetrics(telemetryMessage.environmentMetrics) && telemetryMessage.variant != Telemetry.OneOf_Variant.localStats(telemetryMessage.localStats) && telemetryMessage.variant != Telemetry.OneOf_Variant.powerMetrics(telemetryMessage.powerMetrics) { /// Other unhandled telemetry packets @@ -872,7 +872,7 @@ func textMessageAppPacket( } if messageText?.count ?? 0 > 0 { - MeshLogger.log("💬 \("mesh.log.textmessage.received".localized)") + Logger.mesh.info("💬 \("mesh.log.textmessage.received".localized)") let messageUsers = UserEntity.fetchRequest() messageUsers.predicate = NSPredicate(format: "num IN %@", [packet.to, packet.from]) do { @@ -1033,7 +1033,7 @@ func textMessageAppPacket( func waypointPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.waypoint.received %@".localized, String(packet.from)) - MeshLogger.log("📍 \(logString)") + Logger.mesh.info("📍 \(logString)") let fetchWaypointRequest = WaypointEntity.fetchRequest() fetchWaypointRequest.predicate = NSPredicate(format: "id == %lld", Int64(packet.id)) diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 15c0d89b..0c367968 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -130,7 +130,7 @@ public func clearCoreDataDatabase(context: NSManagedObjectContext, includeRoutes func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.nodeinfo.received %@".localized, packet.from.toHex()) - MeshLogger.log("📟 \(logString)") + Logger.mesh.info("📟 \(logString)") guard packet.from > 0 else { return } @@ -313,7 +313,7 @@ func upsertNodeInfoPacket (packet: MeshPacket, context: NSManagedObjectContext) func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.position.received %@".localized, String(packet.from)) - MeshLogger.log("📍 \(logString)") + Logger.mesh.info("📍 \(logString)") let fetchNodePositionRequest = NodeInfoEntity.fetchRequest() fetchNodePositionRequest.predicate = NSPredicate(format: "num == %lld", Int64(packet.from)) @@ -407,7 +407,7 @@ func upsertPositionPacket (packet: MeshPacket, context: NSManagedObjectContext) func upsertBluetoothConfigPacket(config: Config.BluetoothConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.bluetooth.config %@".localized, String(nodeNum)) - MeshLogger.log("📶 \(logString)") + Logger.mesh.info("📶 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -451,7 +451,7 @@ func upsertBluetoothConfigPacket(config: Config.BluetoothConfig, nodeNum: Int64, func upsertDeviceConfigPacket(config: Config.DeviceConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.device.config %@".localized, String(nodeNum)) - MeshLogger.log("📟 \(logString)") + Logger.mesh.info("📟 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -506,7 +506,7 @@ func upsertDeviceConfigPacket(config: Config.DeviceConfig, nodeNum: Int64, sessi func upsertDisplayConfigPacket(config: Config.DisplayConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.display.config %@".localized, nodeNum.toHex()) - MeshLogger.log("🖥️ \(logString)") + Logger.data.info("🖥️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -572,7 +572,7 @@ func upsertDisplayConfigPacket(config: Config.DisplayConfig, nodeNum: Int64, ses func upsertLoRaConfigPacket(config: Config.LoRaConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.lora.config %@".localized, nodeNum.toHex()) - MeshLogger.log("📻 \(logString)") + Logger.data.info("📻 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", nodeNum) @@ -643,7 +643,7 @@ func upsertLoRaConfigPacket(config: Config.LoRaConfig, nodeNum: Int64, sessionPa func upsertNetworkConfigPacket(config: Config.NetworkConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.network.config %@".localized, String(nodeNum)) - MeshLogger.log("🌐 \(logString)") + Logger.data.info("🌐 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -690,7 +690,7 @@ func upsertNetworkConfigPacket(config: Config.NetworkConfig, nodeNum: Int64, ses func upsertPositionConfigPacket(config: Config.PositionConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.position.config %@".localized, String(nodeNum)) - MeshLogger.log("🗺️ \(logString)") + Logger.data.info("🗺️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -753,7 +753,7 @@ func upsertPositionConfigPacket(config: Config.PositionConfig, nodeNum: Int64, s func upsertPowerConfigPacket(config: Config.PowerConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.power.config %@".localized, String(nodeNum)) - MeshLogger.log("🗺️ \(logString)") + Logger.data.info("🗺️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -805,7 +805,7 @@ func upsertPowerConfigPacket(config: Config.PowerConfig, nodeNum: Int64, session func upsertSecurityConfigPacket(config: Config.SecurityConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.security.config %@".localized, String(nodeNum)) - MeshLogger.log("🛡️ \(logString)") + Logger.data.info("🛡️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -866,7 +866,7 @@ func upsertSecurityConfigPacket(config: Config.SecurityConfig, nodeNum: Int64, s func upsertAmbientLightingModuleConfigPacket(config: ModuleConfig.AmbientLightingConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.ambientlighting.config %@".localized, String(nodeNum)) - MeshLogger.log("🏮 \(logString)") + Logger.data.info("🏮 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -919,7 +919,7 @@ func upsertAmbientLightingModuleConfigPacket(config: ModuleConfig.AmbientLightin func upsertCannedMessagesModuleConfigPacket(config: ModuleConfig.CannedMessageConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.cannedmessage.config %@".localized, String(nodeNum)) - MeshLogger.log("🥫 \(logString)") + Logger.data.info("🥫 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -978,7 +978,7 @@ func upsertCannedMessagesModuleConfigPacket(config: ModuleConfig.CannedMessageCo func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSensorConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.detectionsensor.config %@".localized, String(nodeNum)) - MeshLogger.log("🕵️ \(logString)") + Logger.data.info("🕵️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1035,7 +1035,7 @@ func upsertDetectionSensorModuleConfigPacket(config: ModuleConfig.DetectionSenso func upsertExternalNotificationModuleConfigPacket(config: ModuleConfig.ExternalNotificationConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.externalnotification.config %@".localized, String(nodeNum)) - MeshLogger.log("📣 \(logString)") + Logger.data.info("📣 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1104,7 +1104,7 @@ func upsertExternalNotificationModuleConfigPacket(config: ModuleConfig.ExternalN func upsertPaxCounterModuleConfigPacket(config: ModuleConfig.PaxcounterConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.paxcounter.config %@".localized, String(nodeNum)) - MeshLogger.log("🧑‍🤝‍🧑 \(logString)") + Logger.data.info("🧑‍🤝‍🧑 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1146,7 +1146,7 @@ func upsertPaxCounterModuleConfigPacket(config: ModuleConfig.PaxcounterConfig, n func upsertRtttlConfigPacket(ringtone: String, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.ringtone.config %@".localized, String(nodeNum)) - MeshLogger.log("⛰️ \(logString)") + Logger.data.info("⛰️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1186,7 +1186,7 @@ func upsertRtttlConfigPacket(ringtone: String, nodeNum: Int64, sessionPasskey: D func upsertMqttModuleConfigPacket(config: ModuleConfig.MQTTConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.mqtt.config %@".localized, String(nodeNum)) - MeshLogger.log("🌉 \(logString)") + Logger.data.info("🌉 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1248,7 +1248,7 @@ func upsertMqttModuleConfigPacket(config: ModuleConfig.MQTTConfig, nodeNum: Int6 func upsertRangeTestModuleConfigPacket(config: ModuleConfig.RangeTestConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.rangetest.config %@".localized, String(nodeNum)) - MeshLogger.log("⛰️ \(logString)") + Logger.data.info("⛰️ \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1292,7 +1292,7 @@ func upsertRangeTestModuleConfigPacket(config: ModuleConfig.RangeTestConfig, nod func upsertSerialModuleConfigPacket(config: ModuleConfig.SerialConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.serial.config %@".localized, String(nodeNum)) - MeshLogger.log("🤖 \(logString)") + Logger.data.info("🤖 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1347,7 +1347,7 @@ func upsertSerialModuleConfigPacket(config: ModuleConfig.SerialConfig, nodeNum: func upsertStoreForwardModuleConfigPacket(config: ModuleConfig.StoreForwardConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.storeforward.config %@".localized, String(nodeNum)) - MeshLogger.log("📬 \(logString)") + Logger.data.info("📬 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) @@ -1395,7 +1395,7 @@ func upsertStoreForwardModuleConfigPacket(config: ModuleConfig.StoreForwardConfi func upsertTelemetryModuleConfigPacket(config: ModuleConfig.TelemetryConfig, nodeNum: Int64, sessionPasskey: Data? = Data(), context: NSManagedObjectContext) { let logString = String.localizedStringWithFormat("mesh.log.telemetry.config %@".localized, String(nodeNum)) - MeshLogger.log("📈 \(logString)") + Logger.data.info("📈 \(logString)") let fetchNodeInfoRequest = NodeInfoEntity.fetchRequest() fetchNodeInfoRequest.predicate = NSPredicate(format: "num == %lld", Int64(nodeNum)) diff --git a/Meshtastic/Router/NavigationState.swift b/Meshtastic/Router/NavigationState.swift index 0a85f4ab..d74d2a3f 100644 --- a/Meshtastic/Router/NavigationState.swift +++ b/Meshtastic/Router/NavigationState.swift @@ -49,7 +49,6 @@ enum SettingsNavigationState: String { case security case storeAndForward case telemetry - case meshLog case debugLogs case appFiles case firmwareUpdates diff --git a/Meshtastic/Views/Settings/MeshLog.swift b/Meshtastic/Views/Settings/MeshLog.swift deleted file mode 100644 index e63c2f34..00000000 --- a/Meshtastic/Views/Settings/MeshLog.swift +++ /dev/null @@ -1,96 +0,0 @@ -import SwiftUI -import Foundation -import UniformTypeIdentifiers -import OSLog - -struct MeshLog: View { - let logFile = MeshLogger.logFile - var text = "" - @State private var logs = [String]() - @State private var isExporting: Bool = false - @State private var document: LogDocument = LogDocument(logFile: "MESHTASTIC MESH ACTIVITY LOG\n") - - var body: some View { - - List(logs, id: \.self, rowContent: Text.init) - .task { - do { - let url = logFile! - logs.removeAll() - var lineCount = 0 - let lineLimit = 10000 - // Get the number of lines - for try await _ in url.lines { - lineCount += 1 - } - // Set the record to start with if we have more lines than the limit - var startingLog = 0 - if lineCount > lineLimit { - startingLog = lineCount - lineLimit - } - var lineNumber = 0 - for try await log in url.lines { - if lineNumber >= startingLog { - logs.append(log) - document.logFile.append("\(log) \n") - } - lineNumber += 1 - } - logs.reverse() - } catch { - // Stop adding logs when an error is thrown - } - } - .listStyle(.plain) - .fileExporter( - isPresented: $isExporting, - document: document, - contentType: UTType.plainText, - defaultFilename: "mesh-activity-log", - onCompletion: { result in - switch result { - case .success: - Logger.services.info("Mesh activity log download: success") - case .failure(let error): - Logger.services.error("Mesh activity log download: \(error.localizedDescription)") - } - } - ) - .textSelection(.enabled) - .font(.caption) - - HStack(alignment: .center) { - Spacer() - Button(role: .destructive) { - let text = "" - do { - try text.write(to: logFile!, atomically: false, encoding: .utf8) - logs.removeAll() - } catch { - Logger.services.error("\(error.localizedDescription)") - } - } label: { - Label("Clear", systemImage: "trash.fill") - } - .buttonStyle(.bordered) - .buttonBorderShape(.capsule) - .controlSize(.large) - .padding(.bottom) - .padding(.leading) - - Button { - isExporting = true - } label: { - Label("Save", systemImage: "square.and.arrow.down") - } - .buttonStyle(.bordered) - .buttonBorderShape(.capsule) - .controlSize(.large) - .padding(.bottom) - .padding(.trailing) - Spacer() - } - .padding(.bottom, 10) - .navigationTitle("mesh.log") - } -} diff --git a/Meshtastic/Views/Settings/Settings.swift b/Meshtastic/Views/Settings/Settings.swift index 36809f17..abf8a0ec 100644 --- a/Meshtastic/Views/Settings/Settings.swift +++ b/Meshtastic/Views/Settings/Settings.swift @@ -261,13 +261,6 @@ struct Settings: View { var developersSection: some View { Section(header: Text("Developers")) { - NavigationLink(value: SettingsNavigationState.meshLog) { - Label { - Text("mesh.log") - } icon: { - Image(systemName: "list.bullet.rectangle") - } - } NavigationLink(value: SettingsNavigationState.appFiles) { Label { Text("App Files") @@ -472,8 +465,6 @@ struct Settings: View { StoreForwardConfig(node: nodes.first(where: { $0.num == selectedNode })) case .telemetry: TelemetryConfig(node: nodes.first(where: { $0.num == selectedNode })) - case .meshLog: - MeshLog() case .debugLogs: AppLog() case .appFiles: