diff --git a/.gitignore b/.gitignore
index 6654d52..e31d2ae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,4 +44,6 @@ app.*.map.json
/android/app/profile
/android/app/release
*.zip
-*.ipa
\ No newline at end of file
+*.ipa
+ios/Runner.app.dSYM.zip
+ios/Runner.ipa
diff --git a/ios/Runner.app.dSYM.zip b/ios/Runner.app.dSYM.zip
index 4f2e12b..331bfa4 100644
Binary files a/ios/Runner.app.dSYM.zip and b/ios/Runner.app.dSYM.zip differ
diff --git a/ios/Runner.ipa b/ios/Runner.ipa
index 31fcc7a..0fbcb7d 100644
Binary files a/ios/Runner.ipa and b/ios/Runner.ipa differ
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 76682c2..e48f170 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -489,7 +489,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -511,7 +511,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests;
@@ -529,7 +529,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests;
@@ -545,7 +545,7 @@
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.meshcore.sar.meshcoreSarApp.RunnerTests;
@@ -676,7 +676,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -699,7 +699,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 9;
+ CURRENT_PROJECT_VERSION = 11;
DEVELOPMENT_TEAM = JND55328G8;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 0000d90..7f6e54b 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -21,7 +21,7 @@
CFBundleSignature
????
CFBundleVersion
- 9
+ 11
LSRequiresIPhoneOS
UILaunchStoryboardName
diff --git a/ios/fastlane/report.xml b/ios/fastlane/report.xml
index a317f2a..0c7e961 100644
--- a/ios/fastlane/report.xml
+++ b/ios/fastlane/report.xml
@@ -5,22 +5,17 @@
-
+
-
+
-
-
-
-
-
-
+
diff --git a/lib/models/ble_packet_log.dart b/lib/models/ble_packet_log.dart
index d4bde04..6b3760a 100644
--- a/lib/models/ble_packet_log.dart
+++ b/lib/models/ble_packet_log.dart
@@ -9,6 +9,8 @@ class LogRxDataInfo {
final List embeddedStrings;
final double entropy;
final bool isLikelyEncrypted;
+ final double? snrDb; // Signal-to-Noise Ratio in dB
+ final int? rssiDbm; // Received Signal Strength Indicator in dBm
LogRxDataInfo({
this.airtimeMs,
@@ -17,6 +19,8 @@ class LogRxDataInfo {
this.embeddedStrings = const [],
required this.entropy,
required this.isLikelyEncrypted,
+ this.snrDb,
+ this.rssiDbm,
});
/// Get sender public key as hex string (short)
@@ -30,6 +34,9 @@ class LogRxDataInfo {
String get summary {
final parts = [];
+ if (rssiDbm != null) parts.add('RSSI:${rssiDbm}dBm');
+ final snr = snrDb;
+ if (snr != null) parts.add('SNR:${snr.toStringAsFixed(1)}dB');
if (airtimeMs != null) parts.add('airtime:${airtimeMs}ms');
if (ackCode != null) parts.add('ACK:$ackCode');
if (senderKeyShort != null) parts.add('from:$senderKeyShort');
diff --git a/lib/screens/home_screen.dart b/lib/screens/home_screen.dart
index a4086b3..890d436 100644
--- a/lib/screens/home_screen.dart
+++ b/lib/screens/home_screen.dart
@@ -587,7 +587,7 @@ class _HomeScreenState extends State
Text(
'${deviceInfo.signalRssi}dBm',
style: TextStyle(
- fontSize: 12,
+ fontSize: 14,
color: _getSignalColor(deviceInfo.signalRssi!),
fontWeight: FontWeight.w500,
),
diff --git a/lib/screens/packet_log_screen.dart b/lib/screens/packet_log_screen.dart
index 22c7823..14b3b30 100644
--- a/lib/screens/packet_log_screen.dart
+++ b/lib/screens/packet_log_screen.dart
@@ -515,6 +515,17 @@ class _PacketLogCard extends StatelessWidget {
icon: Icons.tag,
label: log.opcodeDescription,
),
+ // Show RSSI and SNR for LOG_RX_DATA packets
+ if (log.logRxDataInfo?.rssiDbm != null)
+ _InfoChip(
+ icon: Icons.signal_cellular_alt,
+ label: 'RSSI: ${log.logRxDataInfo!.rssiDbm} dBm',
+ ),
+ if (log.logRxDataInfo?.snrDb != null)
+ _InfoChip(
+ icon: Icons.waves,
+ label: 'SNR: ${log.logRxDataInfo!.snrDb!.toStringAsFixed(1)} dB',
+ ),
],
),
],
diff --git a/lib/services/ble/ble_response_handler.dart b/lib/services/ble/ble_response_handler.dart
index d1d28e3..d936ced 100644
--- a/lib/services/ble/ble_response_handler.dart
+++ b/lib/services/ble/ble_response_handler.dart
@@ -392,10 +392,12 @@ class BleResponseHandler {
final entropy = uniqueBytes / rawPacketData.length;
final isLikelyEncrypted = entropy > 0.7;
- // Create decoded info for packet log
+ // Create decoded info for packet log (includes SNR and RSSI)
final logRxDataInfo = LogRxDataInfo(
entropy: entropy,
isLikelyEncrypted: isLikelyEncrypted,
+ snrDb: snrDb,
+ rssiDbm: rssiDbm,
);
// Update the most recent packet log entry