Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Meshtastic.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@
C54AC9F4DA920A4F718CE21A /* DiscoveryScanEngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD14FA280F0A130730DEB93 /* DiscoveryScanEngineTests.swift */; };
DDBEAC0010000000000000D1 /* DiscoveredBeaconEntityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDBEAC0010000000000000C1 /* DiscoveredBeaconEntityTests.swift */; };
DDBEAC001000000000000131 /* ModemPresetFrequencySlotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDBEAC001000000000000121 /* ModemPresetFrequencySlotTests.swift */; };
DDBEAC001000000000000133 /* LoRaSignalStrengthRatingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDBEAC001000000000000123 /* LoRaSignalStrengthRatingTests.swift */; };
DDBEAC001000000000000151 /* BeaconAddVsSwitchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDBEAC001000000000000141 /* BeaconAddVsSwitchTests.swift */; };
C79BFC99EDCC89DD45082753 /* DiscoveryScanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5CA8BAC814CF82E127EEABF /* DiscoveryScanView.swift */; };
D02589957BD040969FCB8663 /* PositionEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A97241903A924144A3EEB679 /* PositionEntity.swift */; };
Expand Down Expand Up @@ -827,6 +828,7 @@
AAD14FA280F0A130730DEB93 /* DiscoveryScanEngineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryScanEngineTests.swift; sourceTree = "<group>"; };
DDBEAC0010000000000000C1 /* DiscoveredBeaconEntityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveredBeaconEntityTests.swift; sourceTree = "<group>"; };
DDBEAC001000000000000121 /* ModemPresetFrequencySlotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModemPresetFrequencySlotTests.swift; sourceTree = "<group>"; };
DDBEAC001000000000000123 /* LoRaSignalStrengthRatingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoRaSignalStrengthRatingTests.swift; sourceTree = "<group>"; };
DDBEAC001000000000000141 /* BeaconAddVsSwitchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BeaconAddVsSwitchTests.swift; sourceTree = "<group>"; };
AAFF00000000000000000001 /* OfflineMapRegion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = OfflineMapRegion.swift; path = Meshtastic/Helpers/Map/OfflineMapRegion.swift; sourceTree = SOURCE_ROOT; };
AAFF00000000000000000002 /* OfflineMapManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = OfflineMapManager.swift; path = Meshtastic/Helpers/Map/OfflineMapManager.swift; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -1642,6 +1644,7 @@
AAD14FA280F0A130730DEB93 /* DiscoveryScanEngineTests.swift */,
DDBEAC0010000000000000C1 /* DiscoveredBeaconEntityTests.swift */,
DDBEAC001000000000000121 /* ModemPresetFrequencySlotTests.swift */,
DDBEAC001000000000000123 /* LoRaSignalStrengthRatingTests.swift */,
DDBEAC001000000000000141 /* BeaconAddVsSwitchTests.swift */,
DDBEAC001000000000000201 /* MeshBeaconConfigEditorTests.swift */,
18295AFE686247778632C6DE /* NetworkConfigIPConversionTests.swift */,
Expand Down Expand Up @@ -2769,6 +2772,7 @@
C54AC9F4DA920A4F718CE21A /* DiscoveryScanEngineTests.swift in Sources */,
DDBEAC0010000000000000D1 /* DiscoveredBeaconEntityTests.swift in Sources */,
DDBEAC001000000000000131 /* ModemPresetFrequencySlotTests.swift in Sources */,
DDBEAC001000000000000133 /* LoRaSignalStrengthRatingTests.swift in Sources */,
DDBEAC001000000000000151 /* BeaconAddVsSwitchTests.swift in Sources */,
DDBEAC001000000000000211 /* MeshBeaconConfigEditorTests.swift in Sources */,
FDAF8808342245C4817C93EC /* NetworkConfigIPConversionTests.swift in Sources */,
Expand Down
15 changes: 15 additions & 0 deletions Meshtastic/Extensions/SwiftData/NodeInfoEntityExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,21 @@ extension NodeInfoEntity {
return try? ctx.fetch(descriptor).first
}

/// The receiving radio's most recent noise floor (dBm) from Local Stats telemetry
/// (`DeviceMetrics.noise_floor`), or nil when it's absent, zero, or older than the
/// online threshold (2 h). Used to compute a real link margin (`rssi - noiseFloor`)
/// for signal-quality rating instead of guessed fixed RSSI thresholds.
var recentNoiseFloor: Int32? {
guard let stats = latestLocalStats,
let time = stats.time,
let noiseFloor = stats.noiseFloor,
noiseFloor != 0,
let twoHoursAgo = Calendar.current.date(byAdding: .minute, value: -120, to: Date()),
time.compare(twoHoursAgo) == .orderedDescending
else { return nil }
return noiseFloor
}

var hasLocalStats: Bool {
guard let ctx = modelContext else { return false }
let nodeNum = self.num
Expand Down
102 changes: 51 additions & 51 deletions Meshtastic/Resources/docs/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@
"section": "user",
"navOrder": 14,
"keywords": [
"quot",
"messages",
"carplay",
"siri",
Expand Down Expand Up @@ -73,7 +72,8 @@
"heard",
"device",
"contact",
"channels"
"channels",
"automatically"
],
"charCount": 3378
},
Expand Down Expand Up @@ -185,12 +185,12 @@
"location",
"ios",
"first",
"amp",
"within",
"tip",
"time",
"tapping",
"started"
"started",
"setup"
],
"charCount": 2899
},
Expand Down Expand Up @@ -372,22 +372,22 @@
"hardware",
"broadcasts",
"row",
"radio",
"public",
"location",
"firmware",
"direct",
"detail",
"client",
"supported",
"mesh",
"long",
"local",
"links",
"hops",
"heard",
"filter",
"display"
"heard"
],
"charCount": 8333
"charCount": 8630
},
{
"id": "settings",
Expand Down Expand Up @@ -434,38 +434,38 @@
"section": "user",
"navOrder": 12,
"keywords": [
"signal",
"quot",
"snr",
"rssi",
"signal",
"noise",
"meter",
"rssi",
"radio",
"limit",
"meshtastic",
"than",
"floor",
"static",
"radio",
"background",
"dbm",
"bars",
"bad",
"understand",
"than",
"preset",
"loud",
"lora",
"bars",
"using",
"uses",
"them",
"specific",
"understand",
"still",
"lora",
"local",
"clarity",
"below",
"bad",
"app",
"above",
"two",
"see",
"out",
"message",
"means",
"limit",
"like",
"good",
"friend"
"relative",
"rating",
"power"
],
"charCount": 3992
"charCount": 4810
},
{
"id": "tak",
Expand Down Expand Up @@ -499,10 +499,10 @@
"zip",
"tip",
"read",
"quot",
"primary",
"position",
"pickers"
"pickers",
"over"
],
"charCount": 6073
},
Expand Down Expand Up @@ -561,7 +561,6 @@
"localizer",
"local",
"translate",
"amp",
"translation",
"review",
"open",
Expand All @@ -580,7 +579,8 @@
"english",
"directly",
"bin",
"automatically"
"automatically",
"version"
],
"charCount": 4753
},
Expand All @@ -602,7 +602,6 @@
"distances",
"distance",
"date",
"amp",
"telemetry",
"meshtastic",
"device",
Expand All @@ -619,7 +618,8 @@
"change",
"altitude",
"uses",
"time"
"time",
"settings"
],
"charCount": 4753
},
Expand Down Expand Up @@ -688,16 +688,16 @@
"app",
"signed",
"radios",
"quot",
"per",
"only",
"message",
"docs",
"amp",
"waypoints",
"watch",
"verified",
"translation"
"translation",
"translate",
"snr"
],
"charCount": 6314
},
Expand All @@ -707,7 +707,6 @@
"section": "developer",
"navOrder": 3,
"keywords": [
"quot",
"settings",
"view",
"settingsnavigationstate",
Expand Down Expand Up @@ -736,7 +735,8 @@
"create",
"adding",
"url",
"tests"
"tests",
"testing"
],
"charCount": 2664
},
Expand Down Expand Up @@ -830,7 +830,6 @@
"accessorymanager",
"logger",
"root",
"quot",
"packet",
"extensions",
"ble",
Expand All @@ -853,7 +852,8 @@
"transport",
"tips",
"tcp",
"swiftdata"
"swiftdata",
"subsystems"
],
"charCount": 3538
},
Expand Down Expand Up @@ -915,7 +915,6 @@
"nodes",
"nodenum",
"deep",
"amp",
"tak",
"lora",
"links",
Expand All @@ -931,7 +930,8 @@
"swift",
"serial",
"security",
"routes"
"routes",
"route"
],
"charCount": 3040
},
Expand Down Expand Up @@ -980,7 +980,6 @@
"section": "developer",
"navOrder": 7,
"keywords": [
"quot",
"locale",
"unit",
"measurement",
Expand All @@ -1004,12 +1003,13 @@
"format",
"device",
"date",
"amp",
"universal",
"unitspeed",
"unitlength",
"text",
"string"
"string",
"nodes",
"measurementformatter"
],
"charCount": 6352
},
Expand Down Expand Up @@ -1065,7 +1065,6 @@
"swift",
"xml",
"route",
"quot",
"atak",
"wire",
"try",
Expand All @@ -1087,7 +1086,8 @@
"zstd",
"via",
"supportstakv2",
"routes"
"routes",
"protobuf"
],
"charCount": 7653
},
Expand All @@ -1098,7 +1098,6 @@
"navOrder": 6,
"keywords": [
"test",
"quot",
"tests",
"snapshots",
"run",
Expand Down Expand Up @@ -1126,7 +1125,8 @@
"using",
"try",
"suite",
"screenshots"
"screenshots",
"scale"
],
"charCount": 3697
},
Expand Down
2 changes: 2 additions & 0 deletions Meshtastic/Resources/docs/markdown/user/nodes.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ Each node is configured with a role that determines how it behaves on the mesh.

The full node row shows the circle avatar, battery level, encryption status, last-heard time, device role, signal strength, and log indicators all at once.

The signal meter shown here (and on a node's detail screen) rates link quality from SNR relative to your radio preset — using your radio's reported noise floor when it's available — and the strength bar and the SNR text color always reflect the same rating. See [Signal Meter](signal-meter.md) for how it works.

<picture>
<source media="(prefers-color-scheme: dark)" srcset="../assets/screenshots/standard_directConnected_dark.png" />
<img src="../assets/screenshots/standard_directConnected.png" alt="Directly connected node, favorite, with signal meter" />
Expand Down
Loading
Loading