diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 168ce045..130ca8de 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1156,6 +1156,7 @@ "repeater_noiseFloor": "Noise Floor", "repeater_txAirtime": "TX Airtime", "repeater_rxAirtime": "RX Airtime", + "repeater_chanUtil": "Channel Utilization", "repeater_packetStatistics": "Packet Statistics", "repeater_sent": "Sent", "repeater_received": "Received", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 326c3672..9eabc9b3 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -3891,6 +3891,12 @@ abstract class AppLocalizations { /// **'RX Airtime'** 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. /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 79fddd5e..81bbb0c0 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -2171,6 +2171,9 @@ class AppLocalizationsBg extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Статистика на пакетите'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 892187ad..0c194929 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -2167,6 +2167,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Paketstatistiken'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 4159b452..fb176744 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -2126,6 +2126,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Packet Statistics'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 18500de8..5816fd5f 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -2163,6 +2163,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Estadísticas del Paquete'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 0f23392b..f8c6954a 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -2177,6 +2177,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Statistiques des paquets'; diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index ddcdcfab..b9f6bdd8 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -2180,6 +2180,9 @@ class AppLocalizationsHu extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Csomagok statisztikája'; diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 36070477..1cb2b226 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -2166,6 +2166,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Statistiche del Pacchetto'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index e3052d9b..254eae74 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -2078,6 +2078,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get repeater_rxAirtime => 'RX 空き時間'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'パケット統計'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index e09ca109..000cbfe8 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -2075,6 +2075,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get repeater_rxAirtime => 'RX 에어타임'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => '패킷 통계'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 092ded51..51e02e1f 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -2152,6 +2152,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get repeater_rxAirtime => 'RX-zendtijd'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Pakketstatistieken'; diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index fc1e7051..aa941985 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -2181,6 +2181,9 @@ class AppLocalizationsPl extends AppLocalizations { @override String get repeater_rxAirtime => 'Czas odbioru RX'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Statystyki pakietów'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 36550f5a..5395b26f 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -2163,6 +2163,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Estatísticas de Pacote'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 9306a950..4568b24f 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -2168,6 +2168,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get repeater_rxAirtime => 'Время эфира (приём)'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Статистика пакетов'; diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 212dc5a3..f7e1a6a8 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -2153,6 +2153,9 @@ class AppLocalizationsSk extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Statistiky balíka'; diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 4546d5c4..68a16402 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -2150,6 +2150,9 @@ class AppLocalizationsSl extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Statistika paketa'; diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index e4d7232b..2160b3a8 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -2140,6 +2140,9 @@ class AppLocalizationsSv extends AppLocalizations { @override String get repeater_rxAirtime => 'RX Airtime'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Paketstatistik'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index e9606725..24936665 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -2164,6 +2164,9 @@ class AppLocalizationsUk extends AppLocalizations { @override String get repeater_rxAirtime => 'Ефірний час RX'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => 'Статистика пакетів'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index be71775c..b49ba5e9 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -2035,6 +2035,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get repeater_rxAirtime => '接收空中时间'; + @override + String get repeater_chanUtil => 'Channel Utilization'; + @override String get repeater_packetStatistics => '数据包统计'; diff --git a/lib/screens/repeater_status_screen.dart b/lib/screens/repeater_status_screen.dart index 4ffdbe32..9dbd8e31 100644 --- a/lib/screens/repeater_status_screen.dart +++ b/lib/screens/repeater_status_screen.dart @@ -55,6 +55,7 @@ class _RepeaterStatusScreenState extends State { int? _directRx; int? _dupFlood; int? _dupDirect; + double? _chanUtil; PathSelection? _pendingStatusSelection; @override @@ -195,6 +196,7 @@ class _RepeaterStatusScreenState extends State { _lastSnr = lastSnrRaw / 4.0; _dupDirect = directDups; _dupFlood = floodDups; + _chanUtil = ((txAirSecs + rxAirSecs) / uptimeSecs) * 100; }); final connector = Provider.of(context, listen: false); connector.updateRepeaterBatterySnapshot( @@ -285,6 +287,7 @@ class _RepeaterStatusScreenState extends State { _directRx = null; _dupFlood = null; _dupDirect = null; + _chanUtil = null; }); try { @@ -572,6 +575,7 @@ class _RepeaterStatusScreenState extends State { _buildInfoRow(l10n.repeater_sent, _packetTxText()), _buildInfoRow(l10n.repeater_received, _packetRxText()), _buildInfoRow(l10n.repeater_duplicates, _duplicateText()), + _buildInfoRow(l10n.repeater_chanUtil, _chanUtilText()), ], ), ), @@ -677,6 +681,11 @@ class _RepeaterStatusScreenState extends State { return l10n.repeater_packetRxTotal(_packetsRecv!, flood, direct); } + String _chanUtilText() { + if (_chanUtil == null) return '—'; + return _formatPercent(_chanUtil); + } + String _duplicateText() { final l10n = context.l10n; if (_dupFlood != null || _dupDirect != null) { @@ -697,6 +706,11 @@ class _RepeaterStatusScreenState extends State { return suffix == null ? value.toString() : '$value$suffix'; } + String _formatPercent(double? p) { + if (p == null) return '—'; + return '${p.toStringAsFixed(2)}%'; + } + String _formatSnr(double? snr) { if (snr == null) return '—'; return snr.toStringAsFixed(2); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 379e36fa..93e46829 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST flserial + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/untranslated.json b/untranslated.json index b0e87cba..88cbcd72 100644 --- a/untranslated.json +++ b/untranslated.json @@ -3,118 +3,135 @@ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "de": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "es": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "fr": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "hu": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "it": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "ja": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "ko": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "nl": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "pl": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "pt": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "ru": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "sk": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "sl": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "sv": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "uk": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ], "zh": [ "settings_companionDebugLog", "settings_companionDebugLogSubtitle", "chat_markAsUnread", - "chat_newMessages" + "chat_newMessages", + "repeater_chanUtil" ] } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index f02857f4..533a1712 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -11,6 +11,7 @@ list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST flserial flutter_local_notifications_windows + jni ) set(PLUGIN_BUNDLED_LIBRARIES)