Show connected node hardware and firmware in device info

This commit is contained in:
Hacuchino-hash
2026-08-06 08:32:52 -05:00
parent 98f6cf3745
commit 3a9c14e946
22 changed files with 152 additions and 0 deletions
+18
View File
@@ -271,6 +271,8 @@ class MeshCoreConnector extends ChangeNotifier {
bool _batteryRequested = false; bool _batteryRequested = false;
bool _awaitingSelfInfo = false; bool _awaitingSelfInfo = false;
bool _hasReceivedDeviceInfo = false; bool _hasReceivedDeviceInfo = false;
String? _manufacturerName;
String? _firmwareVersionString;
// Initial sync is serialized for predictable progress. Firmware exposes one // Initial sync is serialized for predictable progress. Firmware exposes one
// FIFO queued-message stream, so direct/room frames are buffered until after // FIFO queued-message stream, so direct/room frames are buffered until after
// contacts are known. // contacts are known.
@@ -459,6 +461,8 @@ class MeshCoreConnector extends ChangeNotifier {
Uint8List? get selfPublicKey => _selfPublicKey; Uint8List? get selfPublicKey => _selfPublicKey;
String get selfPublicKeyHex => pubKeyToHex(_selfPublicKey ?? Uint8List(0)); String get selfPublicKeyHex => pubKeyToHex(_selfPublicKey ?? Uint8List(0));
String? get selfName => _selfName; String? get selfName => _selfName;
String? get manufacturerName => _manufacturerName;
String? get firmwareVersionString => _firmwareVersionString;
double? get selfLatitude => _selfLatitude; double? get selfLatitude => _selfLatitude;
double? get selfLongitude => _selfLongitude; double? get selfLongitude => _selfLongitude;
List<DirectRepeater> get directRepeaters => _directRepeaters; List<DirectRepeater> get directRepeaters => _directRepeaters;
@@ -4460,6 +4464,20 @@ class MeshCoreConnector extends ChangeNotifier {
} }
_firmwareVerCode = frame[1]; _firmwareVerCode = frame[1];
// Manufacturer/model name (bytes 20..59) and firmware version (60..79)
String? readCString(int start, int maxLen) {
if (frame.length < start + maxLen) return null;
final bytes = frame.sublist(start, start + maxLen);
final end = bytes.indexOf(0);
final s = String.fromCharCodes(
end >= 0 ? bytes.sublist(0, end) : bytes,
).trim();
return s.isEmpty ? null : s;
}
_manufacturerName = readCString(20, 40);
_firmwareVersionString = readCString(60, 20);
// Parse client_repeat from firmware v9+ (byte 80) // Parse client_repeat from firmware v9+ (byte 80)
if (frame.length >= 81) { if (frame.length >= 81) {
_clientRepeat = frame[80] != 0; _clientRepeat = frame[80] != 0;
+2
View File
@@ -248,6 +248,8 @@
"settings_infoPublicKey": "Public Key", "settings_infoPublicKey": "Public Key",
"settings_infoContactsCount": "Contacts Count", "settings_infoContactsCount": "Contacts Count",
"settings_infoChannelCount": "Channel Count", "settings_infoChannelCount": "Channel Count",
"settings_infoHardware": "Hardware",
"settings_infoFirmware": "Firmware",
"settings_presets": "Presets", "settings_presets": "Presets",
"settings_frequency": "Frequency (MHz)", "settings_frequency": "Frequency (MHz)",
"settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyHelper": "300.0 - 2500.0",
+12
View File
@@ -1240,6 +1240,18 @@ abstract class AppLocalizations {
/// **'Channel Count'** /// **'Channel Count'**
String get settings_infoChannelCount; String get settings_infoChannelCount;
/// No description provided for @settings_infoHardware.
///
/// In en, this message translates to:
/// **'Hardware'**
String get settings_infoHardware;
/// No description provided for @settings_infoFirmware.
///
/// In en, this message translates to:
/// **'Firmware'**
String get settings_infoFirmware;
/// No description provided for @settings_presets. /// No description provided for @settings_presets.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
+6
View File
@@ -626,6 +626,12 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Брой канали'; String get settings_infoChannelCount => 'Брой канали';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Предварителни настройки'; String get settings_presets => 'Предварителни настройки';
+6
View File
@@ -623,6 +623,12 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Kanäle'; String get settings_infoChannelCount => 'Kanäle';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Voreinstellungen'; String get settings_presets => 'Voreinstellungen';
+6
View File
@@ -611,6 +611,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Channel Count'; String get settings_infoChannelCount => 'Channel Count';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Presets'; String get settings_presets => 'Presets';
+6
View File
@@ -622,6 +622,12 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Número de canales'; String get settings_infoChannelCount => 'Número de canales';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Preajustes'; String get settings_presets => 'Preajustes';
+6
View File
@@ -626,6 +626,12 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Nombre de canaux'; String get settings_infoChannelCount => 'Nombre de canaux';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Préréglages'; String get settings_presets => 'Préréglages';
+6
View File
@@ -619,6 +619,12 @@ class AppLocalizationsHu extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Csatornaszám'; String get settings_infoChannelCount => 'Csatornaszám';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Előbeállítások'; String get settings_presets => 'Előbeállítások';
+6
View File
@@ -624,6 +624,12 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Numero di canali'; String get settings_infoChannelCount => 'Numero di canali';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Preset'; String get settings_presets => 'Preset';
+6
View File
@@ -594,6 +594,12 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'チャンネル数'; String get settings_infoChannelCount => 'チャンネル数';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'プリセット'; String get settings_presets => 'プリセット';
+6
View File
@@ -595,6 +595,12 @@ class AppLocalizationsKo extends AppLocalizations {
@override @override
String get settings_infoChannelCount => '채널 수'; String get settings_infoChannelCount => '채널 수';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => '프리셋'; String get settings_presets => '프리셋';
+6
View File
@@ -618,6 +618,12 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Aantal Kanalen'; String get settings_infoChannelCount => 'Aantal Kanalen';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Voorgeprogrammeerde instellingen'; String get settings_presets => 'Voorgeprogrammeerde instellingen';
+6
View File
@@ -626,6 +626,12 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Liczba kanałów'; String get settings_infoChannelCount => 'Liczba kanałów';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Presety'; String get settings_presets => 'Presety';
+6
View File
@@ -624,6 +624,12 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Número do Canal'; String get settings_infoChannelCount => 'Número do Canal';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Configurações pré-definidas'; String get settings_presets => 'Configurações pré-definidas';
+6
View File
@@ -623,6 +623,12 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Количество каналов'; String get settings_infoChannelCount => 'Количество каналов';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Пресеты'; String get settings_presets => 'Пресеты';
+6
View File
@@ -618,6 +618,12 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Počet kanálov'; String get settings_infoChannelCount => 'Počet kanálov';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Prednastavenia'; String get settings_presets => 'Prednastavenia';
+6
View File
@@ -616,6 +616,12 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Število kanalov'; String get settings_infoChannelCount => 'Število kanalov';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Prednastavitve'; String get settings_presets => 'Prednastavitve';
+6
View File
@@ -613,6 +613,12 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Kanalantal'; String get settings_infoChannelCount => 'Kanalantal';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Fördefinierade inställningar'; String get settings_presets => 'Fördefinierade inställningar';
+6
View File
@@ -621,6 +621,12 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get settings_infoChannelCount => 'Кількість каналів'; String get settings_infoChannelCount => 'Кількість каналів';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => 'Попередні налаштування'; String get settings_presets => 'Попередні налаштування';
+6
View File
@@ -587,6 +587,12 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get settings_infoChannelCount => '频道数量'; String get settings_infoChannelCount => '频道数量';
@override
String get settings_infoHardware => 'Hardware';
@override
String get settings_infoFirmware => 'Firmware';
@override @override
String get settings_presets => '预设'; String get settings_presets => '预设';
+12
View File
@@ -280,6 +280,18 @@ class _SettingsScreenState extends State<SettingsScreen> {
value: connector.deviceIdLabel, value: connector.deviceIdLabel,
), ),
_buildBatteryInfoRow(context, connector), _buildBatteryInfoRow(context, connector),
if (connector.manufacturerName != null)
_infoRow(
context,
label: l10n.settings_infoHardware,
value: connector.manufacturerName!,
),
if (connector.firmwareVersionString != null)
_infoRow(
context,
label: l10n.settings_infoFirmware,
value: connector.firmwareVersionString!,
),
if (connector.selfName != null) if (connector.selfName != null)
_infoRow( _infoRow(
context, context,