basic repeater chan util

just repeater stats for now

total channel utilization over uptime i.e. util =
(rxsecs+txsecs) / upsecs
This commit is contained in:
Enot (ded) Skelly
2026-05-05 12:41:06 -07:00
parent f1d93bd5e8
commit c09af98bef
24 changed files with 111 additions and 17 deletions
+1
View File
@@ -1168,6 +1168,7 @@
"repeater_noiseFloor": "Noise Floor", "repeater_noiseFloor": "Noise Floor",
"repeater_txAirtime": "TX Airtime", "repeater_txAirtime": "TX Airtime",
"repeater_rxAirtime": "RX Airtime", "repeater_rxAirtime": "RX Airtime",
"repeater_chanUtil": "Channel Utilization",
"repeater_packetStatistics": "Packet Statistics", "repeater_packetStatistics": "Packet Statistics",
"repeater_sent": "Sent", "repeater_sent": "Sent",
"repeater_received": "Received", "repeater_received": "Received",
+6
View File
@@ -3909,6 +3909,12 @@ abstract class AppLocalizations {
/// **'RX Airtime'** /// **'RX Airtime'**
String get repeater_rxAirtime; String get repeater_rxAirtime;
/// No description provided for @repeater_chanUtil.
///
/// In en, this message translates to:
/// **'Channel Utilization'**
String get repeater_chanUtil;
/// No description provided for @repeater_packetStatistics. /// No description provided for @repeater_packetStatistics.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
+3
View File
@@ -2180,6 +2180,9 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Статистика на пакетите'; String get repeater_packetStatistics => 'Статистика на пакетите';
+3
View File
@@ -2176,6 +2176,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Paketstatistiken'; String get repeater_packetStatistics => 'Paketstatistiken';
+3
View File
@@ -2135,6 +2135,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Packet Statistics'; String get repeater_packetStatistics => 'Packet Statistics';
+3
View File
@@ -2172,6 +2172,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Estadísticas del Paquete'; String get repeater_packetStatistics => 'Estadísticas del Paquete';
+3
View File
@@ -2186,6 +2186,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Statistiques des paquets'; String get repeater_packetStatistics => 'Statistiques des paquets';
+3
View File
@@ -2189,6 +2189,9 @@ class AppLocalizationsHu extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Csomagok statisztikája'; String get repeater_packetStatistics => 'Csomagok statisztikája';
+3
View File
@@ -2175,6 +2175,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Statistiche del Pacchetto'; String get repeater_packetStatistics => 'Statistiche del Pacchetto';
+3
View File
@@ -2086,6 +2086,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX 空き時間'; String get repeater_rxAirtime => 'RX 空き時間';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'パケット統計'; String get repeater_packetStatistics => 'パケット統計';
+3
View File
@@ -2083,6 +2083,9 @@ class AppLocalizationsKo extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX 에어타임'; String get repeater_rxAirtime => 'RX 에어타임';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => '패킷 통계'; String get repeater_packetStatistics => '패킷 통계';
+3
View File
@@ -2161,6 +2161,9 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX-zendtijd'; String get repeater_rxAirtime => 'RX-zendtijd';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Pakketstatistieken'; String get repeater_packetStatistics => 'Pakketstatistieken';
+3
View File
@@ -2190,6 +2190,9 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'Czas odbioru RX'; String get repeater_rxAirtime => 'Czas odbioru RX';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Statystyki pakietów'; String get repeater_packetStatistics => 'Statystyki pakietów';
+3
View File
@@ -2172,6 +2172,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Estatísticas de Pacote'; String get repeater_packetStatistics => 'Estatísticas de Pacote';
+3
View File
@@ -2177,6 +2177,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'Время эфира (приём)'; String get repeater_rxAirtime => 'Время эфира (приём)';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Статистика пакетов'; String get repeater_packetStatistics => 'Статистика пакетов';
+3
View File
@@ -2162,6 +2162,9 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Statistiky balíka'; String get repeater_packetStatistics => 'Statistiky balíka';
+3
View File
@@ -2159,6 +2159,9 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Statistika paketa'; String get repeater_packetStatistics => 'Statistika paketa';
+3
View File
@@ -2148,6 +2148,9 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'RX Airtime'; String get repeater_rxAirtime => 'RX Airtime';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Paketstatistik'; String get repeater_packetStatistics => 'Paketstatistik';
+3
View File
@@ -2173,6 +2173,9 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get repeater_rxAirtime => 'Ефірний час RX'; String get repeater_rxAirtime => 'Ефірний час RX';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => 'Статистика пакетів'; String get repeater_packetStatistics => 'Статистика пакетів';
+3
View File
@@ -2043,6 +2043,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get repeater_rxAirtime => '接收空中时间'; String get repeater_rxAirtime => '接收空中时间';
@override
String get repeater_chanUtil => 'Channel Utilization';
@override @override
String get repeater_packetStatistics => '数据包统计'; String get repeater_packetStatistics => '数据包统计';
+14
View File
@@ -56,6 +56,7 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
int? _directRx; int? _directRx;
int? _dupFlood; int? _dupFlood;
int? _dupDirect; int? _dupDirect;
double? _chanUtil;
PathSelection? _pendingStatusSelection; PathSelection? _pendingStatusSelection;
@override @override
@@ -192,6 +193,7 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
_lastSnr = lastSnrRaw / 4.0; _lastSnr = lastSnrRaw / 4.0;
_dupDirect = directDups; _dupDirect = directDups;
_dupFlood = floodDups; _dupFlood = floodDups;
_chanUtil = ((txAirSecs + rxAirSecs) / uptimeSecs) * 100;
}); });
final connector = Provider.of<MeshCoreConnector>(context, listen: false); final connector = Provider.of<MeshCoreConnector>(context, listen: false);
connector.updateRepeaterBatterySnapshot( connector.updateRepeaterBatterySnapshot(
@@ -283,6 +285,7 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
_directRx = null; _directRx = null;
_dupFlood = null; _dupFlood = null;
_dupDirect = null; _dupDirect = null;
_chanUtil = null;
}); });
try { try {
@@ -570,6 +573,7 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
_buildInfoRow(l10n.repeater_sent, _packetTxText()), _buildInfoRow(l10n.repeater_sent, _packetTxText()),
_buildInfoRow(l10n.repeater_received, _packetRxText()), _buildInfoRow(l10n.repeater_received, _packetRxText()),
_buildInfoRow(l10n.repeater_duplicates, _duplicateText()), _buildInfoRow(l10n.repeater_duplicates, _duplicateText()),
_buildInfoRow(l10n.repeater_chanUtil, _chanUtilText()),
], ],
), ),
), ),
@@ -673,6 +677,11 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
return l10n.repeater_packetRxTotal(_packetsRecv!, flood, direct); return l10n.repeater_packetRxTotal(_packetsRecv!, flood, direct);
} }
String _chanUtilText() {
if (_chanUtil == null) return '';
return _formatPercent(_chanUtil);
}
String _duplicateText() { String _duplicateText() {
final l10n = context.l10n; final l10n = context.l10n;
if (_dupFlood != null || _dupDirect != null) { if (_dupFlood != null || _dupDirect != null) {
@@ -693,6 +702,11 @@ class _RepeaterStatusScreenState extends State<RepeaterStatusScreen> {
return suffix == null ? value.toString() : '$value$suffix'; return suffix == null ? value.toString() : '$value$suffix';
} }
String _formatPercent(double? p) {
if (p == null) return '';
return '${p.toStringAsFixed(2)}%';
}
String _formatSnr(double? snr) { String _formatSnr(double? snr) {
if (snr == null) return ''; if (snr == null) return '';
return snr.toStringAsFixed(2); return snr.toStringAsFixed(2);
+1
View File
@@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST
flserial flserial
jni
) )
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)
+34 -17
View File
@@ -1,86 +1,103 @@
{ {
"bg": [ "bg": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"de": [ "de": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"es": [ "es": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"fr": [ "fr": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"hu": [ "hu": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"it": [ "it": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"ja": [ "ja": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"ko": [ "ko": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"nl": [ "nl": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"pl": [ "pl": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"pt": [ "pt": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"ru": [ "ru": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"sk": [ "sk": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"sl": [ "sl": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"sv": [ "sv": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"uk": [ "uk": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
], ],
"zh": [ "zh": [
"chat_markAsUnread", "chat_markAsUnread",
"chat_newMessages" "chat_newMessages",
"repeater_chanUtil"
] ]
} }
+1
View File
@@ -11,6 +11,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST
flserial flserial
flutter_local_notifications_windows flutter_local_notifications_windows
jni
) )
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)