From 5cb10f5f3a7326f80e0d577e2dc914f2d03dcfaf Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Sun, 15 Jun 2025 00:32:15 +0530 Subject: [PATCH 1/8] Initial implementation of barometer --- lib/constants.dart | 5 + lib/main.dart | 2 + lib/providers/barometer_state_provider.dart | 132 ++++++++++++ lib/view/barometer_screen.dart | 221 ++++++++++++++++++++ lib/view/instruments_screen.dart | 20 +- lib/view/widgets/barometer_card.dart | 77 +++++++ lib/view/widgets/instruments_stats.dart | 12 +- 7 files changed, 462 insertions(+), 7 deletions(-) create mode 100644 lib/providers/barometer_state_provider.dart create mode 100644 lib/view/barometer_screen.dart create mode 100644 lib/view/widgets/barometer_card.dart diff --git a/lib/constants.dart b/lib/constants.dart index b6d83c586..1675b9885 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -166,3 +166,8 @@ String lx = 'Lx'; String maxScaleError = 'Max Scale'; String lightSensorError = 'Light sensor error:'; String lightSensorInitialError = 'Failed to initialize light sensor:'; +const String barometerTitle = 'Barometer'; +const String atm = 'atm'; +const String barometerSensorError = 'Barometer sensor error:'; +const String barometerSensorInitialError = + 'Failed to initialize barometer sensor:'; diff --git a/lib/main.dart b/lib/main.dart index c5b0674d7..290d66045 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,6 +3,7 @@ import 'package:provider/provider.dart'; import 'package:pslab/providers/board_state_provider.dart'; import 'package:pslab/providers/locator.dart'; import 'package:pslab/view/accelerometer_screen.dart'; +import 'package:pslab/view/barometer_screen.dart'; import 'package:pslab/view/connect_device_screen.dart'; import 'package:pslab/view/faq_screen.dart'; import 'package:pslab/view/gyroscope_screen.dart'; @@ -53,6 +54,7 @@ class MyApp extends StatelessWidget { '/accelerometer': (context) => const AccelerometerScreen(), '/gyroscope': (context) => const GyroscopeScreen(), '/luxmeter': (context) => const LuxMeterScreen(), + '/barometer': (context) => const BarometerScreen(), }, ); } diff --git a/lib/providers/barometer_state_provider.dart b/lib/providers/barometer_state_provider.dart new file mode 100644 index 000000000..852eb2134 --- /dev/null +++ b/lib/providers/barometer_state_provider.dart @@ -0,0 +1,132 @@ +import 'dart:async'; +import 'dart:math'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:pslab/others/logger_service.dart'; +import 'package:sensors_plus/sensors_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:pslab/constants.dart'; + +class BarometerStateProvider extends ChangeNotifier { + double _currentPressure = 0.0; + StreamSubscription? _barometerSubscription; + Timer? _timeTimer; + final List _pressureData = []; + final List _timeData = []; + final List pressureChartData = []; + double _startTime = 0; + double _currentTime = 0; + final int _maxLength = 50; + double _pressureMin = 0; + double _pressureMax = 0; + double _pressureSum = 0; + int _dataCount = 0; + bool _sensorAvailable = true; + + Function(String)? onSensorError; + + void initializeSensors({Function(String)? onError}) { + onSensorError = onError; + + try { + _startTime = DateTime.now().millisecondsSinceEpoch / 1000.0; + _timeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + _currentTime = + (DateTime.now().millisecondsSinceEpoch / 1000.0) - _startTime; + if (_sensorAvailable) { + _updateData(); + } + notifyListeners(); + }); + + _barometerSubscription = barometerEventStream().listen( + (BarometerEvent event) { + _currentPressure = event.pressure / 1013.25; + _sensorAvailable = true; + notifyListeners(); + }, + onError: (error) { + logger.e("$barometerSensorError $error"); + _handleSensorError(error); + }, + cancelOnError: false, + ); + } catch (e) { + logger.e("$barometerSensorInitialError $e"); + _handleSensorError(e); + } + } + + void _handleSensorError(dynamic error) { + _sensorAvailable = false; + String errorString = error.toString().toLowerCase(); + if (errorString.contains('not available') || + errorString.contains('not supported') || + errorString.contains('sensor not found') || + errorString.contains('no sensor')) { + _handleSensorNotAvailable(); + } else { + onSensorError?.call('Barometer sensor error occurred'); + } + } + + void _handleSensorNotAvailable() { + _sensorAvailable = false; + onSensorError?.call('Barometer sensor not available on this device'); + } + + void disposeSensors() { + _barometerSubscription?.cancel(); + _timeTimer?.cancel(); + } + + @override + void dispose() { + disposeSensors(); + super.dispose(); + } + + void _updateData() { + if (!_sensorAvailable) return; + + final pressure = _currentPressure; + final time = _currentTime; + _pressureData.add(pressure); + _timeData.add(time); + _pressureSum += pressure; + _dataCount++; + if (_pressureData.length > _maxLength) { + final removedValue = _pressureData.removeAt(0); + _timeData.removeAt(0); + _pressureSum -= removedValue; + _dataCount--; + } + if (_pressureData.isNotEmpty) { + _pressureMin = _pressureData.reduce(min); + _pressureMax = _pressureData.reduce(max); + } + pressureChartData.clear(); + for (int i = 0; i < _pressureData.length; i++) { + pressureChartData.add(FlSpot(_timeData[i], _pressureData[i])); + } + notifyListeners(); + } + + double getCurrentPressure() => _currentPressure; + double getMinPressure() => _pressureMin; + double getMaxPressure() => _pressureMax; + double getAveragePressure() => + _dataCount > 0 ? _pressureSum / _dataCount : 0.0; + List getPressureChartData() => pressureChartData; + int getDataLength() => pressureChartData.length; + double getCurrentTime() => _currentTime; + double getMaxTime() => _timeData.isNotEmpty ? _timeData.last : 0; + double getMinTime() => _timeData.isNotEmpty ? _timeData.first : 0; + double getTimeInterval() { + if (_currentTime <= 10) return 2; + if (_currentTime <= 30) return 5; + return 10; + } + + bool get sensorAvailable => _sensorAvailable; +} diff --git a/lib/view/barometer_screen.dart b/lib/view/barometer_screen.dart new file mode 100644 index 000000000..e4fc94972 --- /dev/null +++ b/lib/view/barometer_screen.dart @@ -0,0 +1,221 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:pslab/constants.dart'; +import 'package:pslab/providers/barometer_state_provider.dart'; +import 'package:pslab/view/widgets/common_scaffold_widget.dart'; +import 'package:pslab/view/widgets/barometer_card.dart'; +import 'package:fl_chart/fl_chart.dart'; + +class BarometerScreen extends StatefulWidget { + const BarometerScreen({super.key}); + @override + State createState() => _BarometerScreenState(); +} + +class _BarometerScreenState extends State { + void _showSensorErrorSnackbar(String message) { + if (mounted) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + message, + style: const TextStyle(color: Colors.white), + ), + backgroundColor: Colors.grey, + duration: const Duration(seconds: 4), + behavior: SnackBarBehavior.floating, + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (_) => BarometerStateProvider() + ..initializeSensors(onError: _showSensorErrorSnackbar), + ), + ], + child: CommonScaffold( + title: barometerTitle, + body: SafeArea( + child: Column( + children: [ + const Expanded( + flex: 45, + child: BarometerCard(), + ), + Expanded( + flex: 55, + child: _buildChartSection(), + ), + ], + ), + ), + ), + ); + } + + Widget _buildChartSection() { + return Consumer( + builder: (context, provider, child) { + final screenWidth = MediaQuery.of(context).size.width; + final cardMargin = screenWidth < 400 ? 8.0 : 16.0; + List spots = provider.getPressureChartData(); + double maxPressure = provider.getMaxPressure(); + double maxTime = provider.getMaxTime(); + double minTime = provider.getMinTime(); + double timeInterval = provider.getTimeInterval(); + + return Container( + margin: EdgeInsets.fromLTRB(cardMargin, 0, cardMargin, cardMargin), + padding: EdgeInsets.all(cardMargin), + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(8), + ), + child: _buildChart(screenWidth, maxPressure, maxTime, minTime, + timeInterval, spots)); + }, + ); + } + + Widget sideTitleWidgets(double value, TitleMeta meta) { + final screenWidth = MediaQuery.of(context).size.width; + final fontSize = screenWidth < 400 + ? 7.0 + : screenWidth < 600 + ? 8.0 + : 9.0; + final style = TextStyle( + color: Colors.white, + fontSize: fontSize, + ); + String timeText; + if (value < 60) { + timeText = '${value.toInt()}s'; + } else if (value < 3600) { + int minutes = (value / 60).floor(); + int seconds = (value % 60).toInt(); + timeText = '${minutes}m${seconds}s'; + } else { + int hours = (value / 3600).floor(); + int minutes = ((value % 3600) / 60).floor(); + timeText = '${hours}h${minutes}m'; + } + return SideTitleWidget( + meta: meta, + child: Text( + maxLines: 1, + timeText, + style: style, + ), + ); + } + + Widget _buildChart(double screenWidth, double maxPressure, double maxTime, + double minTime, double timeInterval, List spots) { + final chartFontSize = screenWidth < 400 + ? 8.0 + : screenWidth < 600 + ? 9.0 + : 10.0; + final axisNameFontSize = screenWidth < 400 ? 9.0 : 10.0; + final reservedSizeBottom = screenWidth < 400 ? 25.0 : 30.0; + final reservedSizeLeft = screenWidth < 400 ? 20.0 : 25.0; + return LineChart( + LineChartData( + backgroundColor: Colors.black, + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Padding( + padding: EdgeInsets.only(left: screenWidth < 400 ? 15 : 25), + child: Text( + timeAxisLabel, + style: TextStyle( + fontSize: axisNameFontSize, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + axisNameSize: screenWidth < 400 ? 18 : 20, + ), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: reservedSizeBottom, + getTitlesWidget: sideTitleWidgets, + interval: timeInterval, + ), + ), + leftTitles: AxisTitles( + axisNameWidget: Text( + atm, + style: TextStyle( + fontSize: axisNameFontSize, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + sideTitles: SideTitles( + reservedSize: reservedSizeLeft, + showTitles: true, + getTitlesWidget: (value, meta) { + return SideTitleWidget( + meta: meta, + child: Text( + value.toStringAsFixed(2), + style: TextStyle( + color: Colors.white, + fontSize: chartFontSize, + ), + ), + ); + }, + interval: maxPressure > 0 ? (maxPressure / 5) : 0.2, + ), + ), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + ), + gridData: FlGridData( + show: true, + drawHorizontalLine: true, + drawVerticalLine: true, + horizontalInterval: maxPressure > 0 ? (maxPressure / 5) : 0.2, + verticalInterval: timeInterval, + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: Colors.white38), + left: BorderSide(color: Colors.white38), + top: BorderSide(color: Colors.white38), + right: BorderSide(color: Colors.white38), + ), + ), + minY: 0, + maxY: maxPressure > 0 ? (maxPressure * 1.1) : 2.0, + maxX: maxTime > 0 ? maxTime : 10, + minX: minTime, + clipData: const FlClipData.all(), + lineBarsData: [ + LineChartBarData( + spots: spots, + isCurved: true, + color: Colors.yellow, + barWidth: screenWidth < 400 ? 1.5 : 2.0, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData(show: false), + ), + ], + ), + ); + } +} diff --git a/lib/view/instruments_screen.dart b/lib/view/instruments_screen.dart index 70d40342c..c6caed455 100644 --- a/lib/view/instruments_screen.dart +++ b/lib/view/instruments_screen.dart @@ -25,6 +25,18 @@ class _InstrumentsScreenState extends State { (route) => route.isFirst, ); } + case 6: + if (Navigator.canPop(context) && + ModalRoute.of(context)?.settings.name == '/luxmeter') { + Navigator.popUntil(context, ModalRoute.withName('/luxmeter')); + } else { + Navigator.pushNamedAndRemoveUntil( + context, + '/luxmeter', + (route) => route.isFirst, + ); + } + break; case 7: if (Navigator.canPop(context) && ModalRoute.of(context)?.settings.name == '/accelerometer') { @@ -37,14 +49,14 @@ class _InstrumentsScreenState extends State { ); } break; - case 6: + case 8: if (Navigator.canPop(context) && - ModalRoute.of(context)?.settings.name == '/luxmeter') { - Navigator.popUntil(context, ModalRoute.withName('/luxmeter')); + ModalRoute.of(context)?.settings.name == '/barometer') { + Navigator.popUntil(context, ModalRoute.withName('/barometer')); } else { Navigator.pushNamedAndRemoveUntil( context, - '/luxmeter', + '/barometer', (route) => route.isFirst, ); } diff --git a/lib/view/widgets/barometer_card.dart b/lib/view/widgets/barometer_card.dart new file mode 100644 index 000000000..4708ca538 --- /dev/null +++ b/lib/view/widgets/barometer_card.dart @@ -0,0 +1,77 @@ +import 'package:pslab/view/widgets/gauge_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:pslab/providers/barometer_state_provider.dart'; +import 'package:provider/provider.dart'; +import 'package:pslab/view/widgets/instruments_stats.dart'; + +class BarometerCard extends StatefulWidget { + const BarometerCard({super.key}); + @override + State createState() => _BarometerCardState(); +} + +class _BarometerCardState extends State { + @override + Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + final isLargeScreen = screenWidth > 900; + BarometerStateProvider provider = + Provider.of(context); + double currentPressure = provider.getCurrentPressure(); + double minPressure = provider.getMinPressure(); + double maxPressure = provider.getMaxPressure(); + double avgPressure = provider.getAveragePressure(); + final cardMargin = screenWidth < 400 ? 8.0 : 16.0; + final cardPadding = screenWidth < 400 ? 12.0 : 20.0; + final gaugeSize = isLargeScreen ? 240.0 : screenWidth * 0.45; + final titleFontSize = isLargeScreen ? 25.0 : 20.0; + final statFontSize = isLargeScreen ? 20.0 : 15.0; + final pressureValueFontSize = isLargeScreen ? 20.0 : 16.0; + + return Card( + margin: EdgeInsets.all(cardMargin), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 1, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + ), + child: Container( + padding: EdgeInsets.all(cardPadding), + child: LayoutBuilder( + builder: (context, constraints) { + return Row( + children: [ + Expanded( + flex: screenWidth < 500 ? 40 : 35, + child: Instrumentstats( + titleFontSize: titleFontSize, + statFontSize: statFontSize, + maxValue: maxPressure, + minValue: minPressure, + avgValue: avgPressure, + unit: 'atm', + ), + ), + Expanded( + flex: screenWidth < 500 ? 60 : 65, + child: GaugeWidget( + gaugeSize: gaugeSize, + currentValue: currentPressure, + minValue: 0, + maxValue: 2, + unit: 'atm', + currentValueFontSize: pressureValueFontSize), + ), + ], + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/view/widgets/instruments_stats.dart b/lib/view/widgets/instruments_stats.dart index 4e2745b18..08e2b48af 100644 --- a/lib/view/widgets/instruments_stats.dart +++ b/lib/view/widgets/instruments_stats.dart @@ -40,11 +40,17 @@ class Instrumentstats extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ StatItem( - label: 'Max (Lx)', value: maxValue, fontSize: statFontSize), + label: 'Max ($unit)', + value: maxValue, + fontSize: statFontSize), StatItem( - label: 'Min (Lx)', value: minValue, fontSize: statFontSize), + label: 'Min ($unit)', + value: minValue, + fontSize: statFontSize), StatItem( - label: 'Avg (Lx)', value: avgValue, fontSize: statFontSize), + label: 'Avg ($unit)', + value: avgValue, + fontSize: statFontSize), ], ), ), From 07852d5e5dbd553c35eff562de50245d9b7f55d7 Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Mon, 16 Jun 2025 20:02:42 +0530 Subject: [PATCH 2/8] changes --- lib/providers/barometer_state_provider.dart | 35 ++++++++- lib/view/barometer_screen.dart | 82 ++++++++++++++++++--- lib/view/widgets/barometer_card.dart | 73 +++++++++++++++--- 3 files changed, 169 insertions(+), 21 deletions(-) diff --git a/lib/providers/barometer_state_provider.dart b/lib/providers/barometer_state_provider.dart index 852eb2134..332302065 100644 --- a/lib/providers/barometer_state_provider.dart +++ b/lib/providers/barometer_state_provider.dart @@ -40,7 +40,7 @@ class BarometerStateProvider extends ChangeNotifier { }); _barometerSubscription = barometerEventStream().listen( - (BarometerEvent event) { + (BarometerEvent event) { _currentPressure = event.pressure / 1013.25; _sensorAvailable = true; notifyListeners(); @@ -112,11 +112,42 @@ class BarometerStateProvider extends ChangeNotifier { notifyListeners(); } + // Convert pressure (atm) to altitude (meters) using barometric formula + double _pressureToAltitude(double pressureAtm) { + const double seaLevelPressureAtm = 1.0; // 1 atm + const double temperatureK = 288.15; // Standard temperature in Kelvin (15°C) + const double lapseRate = 0.0065; // Temperature lapse rate K/m + const double gasConstant = 287.05; // Gas constant J/(kg·K) + const double gravity = 9.80665; // Gravity m/s² + + if (pressureAtm <= 0) return 0.0; + + double altitude = (temperatureK / lapseRate) * + (1 - pow(pressureAtm / seaLevelPressureAtm, (gasConstant * lapseRate) / gravity)); + + return altitude; + } + double getCurrentPressure() => _currentPressure; double getMinPressure() => _pressureMin; double getMaxPressure() => _pressureMax; double getAveragePressure() => _dataCount > 0 ? _pressureSum / _dataCount : 0.0; + + // Altitude methods + double getCurrentAltitude() => _pressureToAltitude(_currentPressure); + double getMinAltitude() => _pressureMin > 0 ? _pressureToAltitude(_pressureMax) : 0.0; // Max pressure = Min altitude + double getMaxAltitude() => _pressureMax > 0 ? _pressureToAltitude(_pressureMin) : 0.0; // Min pressure = Max altitude + double getAverageAltitude() => _pressureToAltitude(getAveragePressure()); + + // Chart altitude conversion methods + double getMaxAltitudeForChart() => _pressureMax > 0 ? _pressureToAltitude(0) : 10000.0; + double getMinAltitudeForChart() => _pressureMin > 0 ? _pressureToAltitude(_pressureMax * 1.1) : 0.0; + double getAltitudeInterval() { + double maxAlt = getMaxAltitudeForChart(); + return maxAlt > 0 ? (maxAlt / 5) : 2000; + } + List getPressureChartData() => pressureChartData; int getDataLength() => pressureChartData.length; double getCurrentTime() => _currentTime; @@ -129,4 +160,4 @@ class BarometerStateProvider extends ChangeNotifier { } bool get sensorAvailable => _sensorAvailable; -} +} \ No newline at end of file diff --git a/lib/view/barometer_screen.dart b/lib/view/barometer_screen.dart index e4fc94972..e3819e9cf 100644 --- a/lib/view/barometer_screen.dart +++ b/lib/view/barometer_screen.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pslab/constants.dart'; @@ -68,6 +70,9 @@ class _BarometerScreenState extends State { double maxTime = provider.getMaxTime(); double minTime = provider.getMinTime(); double timeInterval = provider.getTimeInterval(); + double maxAltitude = provider.getMaxAltitudeForChart(); + double minAltitude = provider.getMinAltitudeForChart(); + double altitudeInterval = provider.getAltitudeInterval(); return Container( margin: EdgeInsets.fromLTRB(cardMargin, 0, cardMargin, cardMargin), @@ -77,7 +82,7 @@ class _BarometerScreenState extends State { borderRadius: BorderRadius.circular(8), ), child: _buildChart(screenWidth, maxPressure, maxTime, minTime, - timeInterval, spots)); + timeInterval, spots, maxAltitude, minAltitude, altitudeInterval)); }, ); } @@ -87,8 +92,8 @@ class _BarometerScreenState extends State { final fontSize = screenWidth < 400 ? 7.0 : screenWidth < 600 - ? 8.0 - : 9.0; + ? 8.0 + : 9.0; final style = TextStyle( color: Colors.white, fontSize: fontSize, @@ -115,16 +120,62 @@ class _BarometerScreenState extends State { ); } + Widget altitudeTitleWidgets(double value, TitleMeta meta, double maxPressure) { + final screenWidth = MediaQuery.of(context).size.width; + final fontSize = screenWidth < 400 + ? 7.0 + : screenWidth < 600 + ? 8.0 + : 9.0; + final style = TextStyle( + color: Colors.yellow, + fontSize: fontSize, + ); + + // Convert pressure value to altitude + const double seaLevelPressureAtm = 1.0; + const double temperatureK = 288.15; + const double lapseRate = 0.0065; + const double gasConstant = 287.05; + const double gravity = 9.80665; + + double pressureAtm = value; + double altitude = 0.0; + + if (pressureAtm > 0) { + altitude = (temperatureK / lapseRate) * + (1 - pow(pressureAtm / seaLevelPressureAtm, (gasConstant * lapseRate) / gravity)); + } + + String altitudeText; + if (altitude < 1000) { + altitudeText = '${altitude.round()}'; + } else { + altitudeText = '${(altitude / 1000).toStringAsFixed(1)}k'; + } + + return SideTitleWidget( + meta: meta, + child: Text( + altitudeText, + style: style, + ), + ); + } + Widget _buildChart(double screenWidth, double maxPressure, double maxTime, - double minTime, double timeInterval, List spots) { + double minTime, double timeInterval, List spots, + double maxAltitude, double minAltitude, double altitudeInterval) { final chartFontSize = screenWidth < 400 ? 8.0 : screenWidth < 600 - ? 9.0 - : 10.0; + ? 9.0 + : 10.0; final axisNameFontSize = screenWidth < 400 ? 9.0 : 10.0; final reservedSizeBottom = screenWidth < 400 ? 25.0 : 30.0; final reservedSizeLeft = screenWidth < 400 ? 20.0 : 25.0; + final reservedSizeRight = screenWidth < 400 ? 30.0 : 35.0; + return LineChart( LineChartData( backgroundColor: Colors.black, @@ -179,8 +230,21 @@ class _BarometerScreenState extends State { interval: maxPressure > 0 ? (maxPressure / 5) : 0.2, ), ), - rightTitles: const AxisTitles( - sideTitles: SideTitles(showTitles: false), + rightTitles: AxisTitles( + axisNameWidget: Text( + 'm', + style: TextStyle( + fontSize: axisNameFontSize, + color: Colors.yellow, + fontWeight: FontWeight.bold, + ), + ), + sideTitles: SideTitles( + reservedSize: reservedSizeRight, + showTitles: true, + getTitlesWidget: (value, meta) => altitudeTitleWidgets(value, meta, maxPressure), + interval: maxPressure > 0 ? (maxPressure / 5) : 0.2, + ), ), ), gridData: FlGridData( @@ -218,4 +282,4 @@ class _BarometerScreenState extends State { ), ); } -} +} \ No newline at end of file diff --git a/lib/view/widgets/barometer_card.dart b/lib/view/widgets/barometer_card.dart index 4708ca538..11bd02d20 100644 --- a/lib/view/widgets/barometer_card.dart +++ b/lib/view/widgets/barometer_card.dart @@ -16,16 +16,17 @@ class _BarometerCardState extends State { final screenWidth = MediaQuery.of(context).size.width; final isLargeScreen = screenWidth > 900; BarometerStateProvider provider = - Provider.of(context); + Provider.of(context); double currentPressure = provider.getCurrentPressure(); double minPressure = provider.getMinPressure(); double maxPressure = provider.getMaxPressure(); double avgPressure = provider.getAveragePressure(); + double currentAltitude = provider.getCurrentAltitude(); final cardMargin = screenWidth < 400 ? 8.0 : 16.0; final cardPadding = screenWidth < 400 ? 12.0 : 20.0; final gaugeSize = isLargeScreen ? 240.0 : screenWidth * 0.45; final titleFontSize = isLargeScreen ? 25.0 : 20.0; - final statFontSize = isLargeScreen ? 20.0 : 15.0; + final statFontSize = isLargeScreen ? 15.0 : 10.0; final pressureValueFontSize = isLargeScreen ? 20.0 : 16.0; return Card( @@ -47,13 +48,24 @@ class _BarometerCardState extends State { children: [ Expanded( flex: screenWidth < 500 ? 40 : 35, - child: Instrumentstats( - titleFontSize: titleFontSize, - statFontSize: statFontSize, - maxValue: maxPressure, - minValue: minPressure, - avgValue: avgPressure, - unit: 'atm', + child: Column( + children: [ + Expanded( + flex: 75, + child: Instrumentstats( + titleFontSize: titleFontSize, + statFontSize: statFontSize, + maxValue: maxPressure, + minValue: minPressure, + avgValue: avgPressure, + unit: 'atm', + ), + ), + Expanded( + flex: 25, + child: _buildAltitudeTile(currentAltitude, statFontSize), + ), + ], ), ), Expanded( @@ -74,4 +86,45 @@ class _BarometerCardState extends State { ), ); } -} + + Widget _buildAltitudeTile(double altitude, double fontSize) { + final screenWidth = MediaQuery.of(context).size.width; + final valueFontSize = screenWidth < 400 ? 14.0 : 16.0; + final padding = screenWidth < 400 ? 15.0 : 20.0; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Center( + child: Text( + 'Altitude (m)', + style: TextStyle( + color: Colors.black, + fontSize: fontSize, + fontWeight: FontWeight.w600, + ), + ), + ), + const SizedBox(height: 4), + Center( + child: Container( + padding: EdgeInsets.symmetric(horizontal: padding, vertical: 3), + decoration: BoxDecoration( + border: Border.all(color: Colors.pink.shade200), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + altitude.toStringAsFixed(2), + style: TextStyle( + color: Colors.black, + fontSize: valueFontSize, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], + ); + } +} \ No newline at end of file From 0241715c52e0136a61ff8b084cb4f5c4a0b5fb1b Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Tue, 17 Jun 2025 00:17:59 +0530 Subject: [PATCH 3/8] Final implementation of Barometer --- lib/constants.dart | 12 ++-- lib/providers/barometer_state_provider.dart | 37 ++++++------ lib/view/barometer_screen.dart | 67 +++++++++++++-------- lib/view/widgets/barometer_card.dart | 17 +++--- lib/view/widgets/instruments_stats.dart | 3 +- 5 files changed, 80 insertions(+), 56 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index 1675b9885..8baa10c5f 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -166,8 +166,10 @@ String lx = 'Lx'; String maxScaleError = 'Max Scale'; String lightSensorError = 'Light sensor error:'; String lightSensorInitialError = 'Failed to initialize light sensor:'; -const String barometerTitle = 'Barometer'; -const String atm = 'atm'; -const String barometerSensorError = 'Barometer sensor error:'; -const String barometerSensorInitialError = - 'Failed to initialize barometer sensor:'; +String barometerTitle = 'Barometer'; +String atm = 'atm'; +String barometerSensorInitialError = 'Failed to initialize barometer sensor:'; +String barometerSensorError = 'Barometer sensor error occurred'; +String barometerNotAvailable = 'Barometer sensor not available on this device'; +String meterUnit = 'm'; +String altitude = 'Altitude'; diff --git a/lib/providers/barometer_state_provider.dart b/lib/providers/barometer_state_provider.dart index 332302065..18c0dbe0e 100644 --- a/lib/providers/barometer_state_provider.dart +++ b/lib/providers/barometer_state_provider.dart @@ -40,7 +40,7 @@ class BarometerStateProvider extends ChangeNotifier { }); _barometerSubscription = barometerEventStream().listen( - (BarometerEvent event) { + (BarometerEvent event) { _currentPressure = event.pressure / 1013.25; _sensorAvailable = true; notifyListeners(); @@ -66,13 +66,13 @@ class BarometerStateProvider extends ChangeNotifier { errorString.contains('no sensor')) { _handleSensorNotAvailable(); } else { - onSensorError?.call('Barometer sensor error occurred'); + onSensorError?.call(barometerSensorError); } } void _handleSensorNotAvailable() { _sensorAvailable = false; - onSensorError?.call('Barometer sensor not available on this device'); + onSensorError?.call(barometerNotAvailable); } void disposeSensors() { @@ -112,18 +112,19 @@ class BarometerStateProvider extends ChangeNotifier { notifyListeners(); } - // Convert pressure (atm) to altitude (meters) using barometric formula double _pressureToAltitude(double pressureAtm) { - const double seaLevelPressureAtm = 1.0; // 1 atm - const double temperatureK = 288.15; // Standard temperature in Kelvin (15°C) - const double lapseRate = 0.0065; // Temperature lapse rate K/m - const double gasConstant = 287.05; // Gas constant J/(kg·K) - const double gravity = 9.80665; // Gravity m/s² + const double seaLevelPressureAtm = 1.0; + const double temperatureK = 288.15; + const double lapseRate = 0.0065; + const double gasConstant = 287.05; + const double gravity = 9.80665; if (pressureAtm <= 0) return 0.0; double altitude = (temperatureK / lapseRate) * - (1 - pow(pressureAtm / seaLevelPressureAtm, (gasConstant * lapseRate) / gravity)); + (1 - + pow(pressureAtm / seaLevelPressureAtm, + (gasConstant * lapseRate) / gravity)); return altitude; } @@ -134,15 +135,17 @@ class BarometerStateProvider extends ChangeNotifier { double getAveragePressure() => _dataCount > 0 ? _pressureSum / _dataCount : 0.0; - // Altitude methods double getCurrentAltitude() => _pressureToAltitude(_currentPressure); - double getMinAltitude() => _pressureMin > 0 ? _pressureToAltitude(_pressureMax) : 0.0; // Max pressure = Min altitude - double getMaxAltitude() => _pressureMax > 0 ? _pressureToAltitude(_pressureMin) : 0.0; // Min pressure = Max altitude + double getMinAltitude() => + _pressureMin > 0 ? _pressureToAltitude(_pressureMax) : 0.0; + double getMaxAltitude() => + _pressureMax > 0 ? _pressureToAltitude(_pressureMin) : 0.0; double getAverageAltitude() => _pressureToAltitude(getAveragePressure()); - // Chart altitude conversion methods - double getMaxAltitudeForChart() => _pressureMax > 0 ? _pressureToAltitude(0) : 10000.0; - double getMinAltitudeForChart() => _pressureMin > 0 ? _pressureToAltitude(_pressureMax * 1.1) : 0.0; + double getMaxAltitudeForChart() => + _pressureMax > 0 ? _pressureToAltitude(0) : 10000.0; + double getMinAltitudeForChart() => + _pressureMin > 0 ? _pressureToAltitude(_pressureMax * 1.1) : 0.0; double getAltitudeInterval() { double maxAlt = getMaxAltitudeForChart(); return maxAlt > 0 ? (maxAlt / 5) : 2000; @@ -160,4 +163,4 @@ class BarometerStateProvider extends ChangeNotifier { } bool get sensorAvailable => _sensorAvailable; -} \ No newline at end of file +} diff --git a/lib/view/barometer_screen.dart b/lib/view/barometer_screen.dart index e3819e9cf..3fcf66b5e 100644 --- a/lib/view/barometer_screen.dart +++ b/lib/view/barometer_screen.dart @@ -23,7 +23,7 @@ class _BarometerScreenState extends State { message, style: const TextStyle(color: Colors.white), ), - backgroundColor: Colors.grey, + backgroundColor: Colors.grey[700], duration: const Duration(seconds: 4), behavior: SnackBarBehavior.floating, ), @@ -65,6 +65,7 @@ class _BarometerScreenState extends State { builder: (context, provider, child) { final screenWidth = MediaQuery.of(context).size.width; final cardMargin = screenWidth < 400 ? 8.0 : 16.0; + final cardPadding = screenWidth < 400 ? 2.0 : 5.0; List spots = provider.getPressureChartData(); double maxPressure = provider.getMaxPressure(); double maxTime = provider.getMaxTime(); @@ -76,13 +77,21 @@ class _BarometerScreenState extends State { return Container( margin: EdgeInsets.fromLTRB(cardMargin, 0, cardMargin, cardMargin), - padding: EdgeInsets.all(cardMargin), + padding: EdgeInsets.all(cardPadding), decoration: BoxDecoration( color: Colors.black, borderRadius: BorderRadius.circular(8), ), - child: _buildChart(screenWidth, maxPressure, maxTime, minTime, - timeInterval, spots, maxAltitude, minAltitude, altitudeInterval)); + child: _buildChart( + screenWidth, + maxPressure, + maxTime, + minTime, + timeInterval, + spots, + maxAltitude, + minAltitude, + altitudeInterval)); }, ); } @@ -92,8 +101,8 @@ class _BarometerScreenState extends State { final fontSize = screenWidth < 400 ? 7.0 : screenWidth < 600 - ? 8.0 - : 9.0; + ? 8.0 + : 9.0; final style = TextStyle( color: Colors.white, fontSize: fontSize, @@ -120,19 +129,19 @@ class _BarometerScreenState extends State { ); } - Widget altitudeTitleWidgets(double value, TitleMeta meta, double maxPressure) { + Widget altitudeTitleWidgets( + double value, TitleMeta meta, double maxPressure) { final screenWidth = MediaQuery.of(context).size.width; final fontSize = screenWidth < 400 ? 7.0 : screenWidth < 600 - ? 8.0 - : 9.0; + ? 8.0 + : 9.0; final style = TextStyle( - color: Colors.yellow, + color: Colors.white, fontSize: fontSize, ); - // Convert pressure value to altitude const double seaLevelPressureAtm = 1.0; const double temperatureK = 288.15; const double lapseRate = 0.0065; @@ -144,14 +153,16 @@ class _BarometerScreenState extends State { if (pressureAtm > 0) { altitude = (temperatureK / lapseRate) * - (1 - pow(pressureAtm / seaLevelPressureAtm, (gasConstant * lapseRate) / gravity)); + (1 - + pow(pressureAtm / seaLevelPressureAtm, + (gasConstant * lapseRate) / gravity)); } String altitudeText; if (altitude < 1000) { altitudeText = '${altitude.round()}'; } else { - altitudeText = '${(altitude / 1000).toStringAsFixed(1)}k'; + altitudeText = altitude.toStringAsFixed(0); } return SideTitleWidget( @@ -163,18 +174,25 @@ class _BarometerScreenState extends State { ); } - Widget _buildChart(double screenWidth, double maxPressure, double maxTime, - double minTime, double timeInterval, List spots, - double maxAltitude, double minAltitude, double altitudeInterval) { + Widget _buildChart( + double screenWidth, + double maxPressure, + double maxTime, + double minTime, + double timeInterval, + List spots, + double maxAltitude, + double minAltitude, + double altitudeInterval) { final chartFontSize = screenWidth < 400 ? 8.0 : screenWidth < 600 - ? 9.0 - : 10.0; + ? 9.0 + : 10.0; final axisNameFontSize = screenWidth < 400 ? 9.0 : 10.0; final reservedSizeBottom = screenWidth < 400 ? 25.0 : 30.0; - final reservedSizeLeft = screenWidth < 400 ? 20.0 : 25.0; - final reservedSizeRight = screenWidth < 400 ? 30.0 : 35.0; + final reservedSizeLeft = screenWidth < 400 ? 29.0 : 32.0; + final reservedSizeRight = screenWidth < 400 ? 29.0 : 32.0; return LineChart( LineChartData( @@ -232,17 +250,18 @@ class _BarometerScreenState extends State { ), rightTitles: AxisTitles( axisNameWidget: Text( - 'm', + meterUnit, style: TextStyle( fontSize: axisNameFontSize, - color: Colors.yellow, + color: Colors.white, fontWeight: FontWeight.bold, ), ), sideTitles: SideTitles( reservedSize: reservedSizeRight, showTitles: true, - getTitlesWidget: (value, meta) => altitudeTitleWidgets(value, meta, maxPressure), + getTitlesWidget: (value, meta) => + altitudeTitleWidgets(value, meta, maxPressure), interval: maxPressure > 0 ? (maxPressure / 5) : 0.2, ), ), @@ -282,4 +301,4 @@ class _BarometerScreenState extends State { ), ); } -} \ No newline at end of file +} diff --git a/lib/view/widgets/barometer_card.dart b/lib/view/widgets/barometer_card.dart index 11bd02d20..66adef19c 100644 --- a/lib/view/widgets/barometer_card.dart +++ b/lib/view/widgets/barometer_card.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:pslab/providers/barometer_state_provider.dart'; import 'package:provider/provider.dart'; import 'package:pslab/view/widgets/instruments_stats.dart'; +import 'package:pslab/constants.dart'; class BarometerCard extends StatefulWidget { const BarometerCard({super.key}); @@ -16,7 +17,7 @@ class _BarometerCardState extends State { final screenWidth = MediaQuery.of(context).size.width; final isLargeScreen = screenWidth > 900; BarometerStateProvider provider = - Provider.of(context); + Provider.of(context); double currentPressure = provider.getCurrentPressure(); double minPressure = provider.getMinPressure(); double maxPressure = provider.getMaxPressure(); @@ -58,12 +59,13 @@ class _BarometerCardState extends State { maxValue: maxPressure, minValue: minPressure, avgValue: avgPressure, - unit: 'atm', + unit: atm, ), ), Expanded( flex: 25, - child: _buildAltitudeTile(currentAltitude, statFontSize), + child: + _buildAltitudeTile(currentAltitude, statFontSize), ), ], ), @@ -75,7 +77,7 @@ class _BarometerCardState extends State { currentValue: currentPressure, minValue: 0, maxValue: 2, - unit: 'atm', + unit: atm, currentValueFontSize: pressureValueFontSize), ), ], @@ -89,7 +91,6 @@ class _BarometerCardState extends State { Widget _buildAltitudeTile(double altitude, double fontSize) { final screenWidth = MediaQuery.of(context).size.width; - final valueFontSize = screenWidth < 400 ? 14.0 : 16.0; final padding = screenWidth < 400 ? 15.0 : 20.0; return Column( @@ -98,7 +99,7 @@ class _BarometerCardState extends State { children: [ Center( child: Text( - 'Altitude (m)', + '$altitude ($meterUnit)', style: TextStyle( color: Colors.black, fontSize: fontSize, @@ -118,7 +119,7 @@ class _BarometerCardState extends State { altitude.toStringAsFixed(2), style: TextStyle( color: Colors.black, - fontSize: valueFontSize, + fontSize: fontSize, fontWeight: FontWeight.bold, ), ), @@ -127,4 +128,4 @@ class _BarometerCardState extends State { ], ); } -} \ No newline at end of file +} diff --git a/lib/view/widgets/instruments_stats.dart b/lib/view/widgets/instruments_stats.dart index 08e2b48af..93df40c83 100644 --- a/lib/view/widgets/instruments_stats.dart +++ b/lib/view/widgets/instruments_stats.dart @@ -74,7 +74,6 @@ class StatItem extends StatelessWidget { @override Widget build(BuildContext context) { final screenWidth = MediaQuery.of(context).size.width; - final valueFontSize = screenWidth < 400 ? 14.0 : 16.0; final padding = screenWidth < 400 ? 15.0 : 20.0; return Flexible( child: Column( @@ -103,7 +102,7 @@ class StatItem extends StatelessWidget { value.toStringAsFixed(2), style: TextStyle( color: Colors.black, - fontSize: valueFontSize, + fontSize: fontSize, fontWeight: FontWeight.bold, ), ), From 884a9f797cd0f0e7ebb021465297322136fb0834 Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Tue, 17 Jun 2025 00:47:40 +0530 Subject: [PATCH 4/8] fixed variable name --- lib/constants.dart | 2 +- lib/view/widgets/barometer_card.dart | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/constants.dart b/lib/constants.dart index 8baa10c5f..b8c0a3856 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -172,4 +172,4 @@ String barometerSensorInitialError = 'Failed to initialize barometer sensor:'; String barometerSensorError = 'Barometer sensor error occurred'; String barometerNotAvailable = 'Barometer sensor not available on this device'; String meterUnit = 'm'; -String altitude = 'Altitude'; +String altitudeLabel = 'Altitude'; diff --git a/lib/view/widgets/barometer_card.dart b/lib/view/widgets/barometer_card.dart index 66adef19c..d53ca6c4f 100644 --- a/lib/view/widgets/barometer_card.dart +++ b/lib/view/widgets/barometer_card.dart @@ -89,7 +89,7 @@ class _BarometerCardState extends State { ); } - Widget _buildAltitudeTile(double altitude, double fontSize) { + Widget _buildAltitudeTile(double currentAltitude, double fontSize) { final screenWidth = MediaQuery.of(context).size.width; final padding = screenWidth < 400 ? 15.0 : 20.0; @@ -99,7 +99,7 @@ class _BarometerCardState extends State { children: [ Center( child: Text( - '$altitude ($meterUnit)', + '$altitudeLabel ($meterUnit)', style: TextStyle( color: Colors.black, fontSize: fontSize, @@ -116,7 +116,7 @@ class _BarometerCardState extends State { borderRadius: BorderRadius.circular(6), ), child: Text( - altitude.toStringAsFixed(2), + currentAltitude.toStringAsFixed(2), style: TextStyle( color: Colors.black, fontSize: fontSize, From 36dbdd0efa5d0b331bb81f6ef02b073b83c9b566 Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Wed, 18 Jun 2025 18:59:58 +0530 Subject: [PATCH 5/8] Sourcery changes --- lib/providers/barometer_state_provider.dart | 4 ++-- lib/view/barometer_screen.dart | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/providers/barometer_state_provider.dart b/lib/providers/barometer_state_provider.dart index 18c0dbe0e..6b9858f65 100644 --- a/lib/providers/barometer_state_provider.dart +++ b/lib/providers/barometer_state_provider.dart @@ -137,9 +137,9 @@ class BarometerStateProvider extends ChangeNotifier { double getCurrentAltitude() => _pressureToAltitude(_currentPressure); double getMinAltitude() => - _pressureMin > 0 ? _pressureToAltitude(_pressureMax) : 0.0; + _pressureMin > 0 ? _pressureToAltitude(_pressureMin) : 0.0; double getMaxAltitude() => - _pressureMax > 0 ? _pressureToAltitude(_pressureMin) : 0.0; + _pressureMax > 0 ? _pressureToAltitude(_pressureMax) : 0.0; double getAverageAltitude() => _pressureToAltitude(getAveragePressure()); double getMaxAltitudeForChart() => diff --git a/lib/view/barometer_screen.dart b/lib/view/barometer_screen.dart index 3fcf66b5e..e2d21c10d 100644 --- a/lib/view/barometer_screen.dart +++ b/lib/view/barometer_screen.dart @@ -129,8 +129,7 @@ class _BarometerScreenState extends State { ); } - Widget altitudeTitleWidgets( - double value, TitleMeta meta, double maxPressure) { + Widget altitudeTitleWidgets(double value, TitleMeta meta) { final screenWidth = MediaQuery.of(context).size.width; final fontSize = screenWidth < 400 ? 7.0 @@ -261,7 +260,7 @@ class _BarometerScreenState extends State { reservedSize: reservedSizeRight, showTitles: true, getTitlesWidget: (value, meta) => - altitudeTitleWidgets(value, meta, maxPressure), + altitudeTitleWidgets(value, meta), interval: maxPressure > 0 ? (maxPressure / 5) : 0.2, ), ), From e203e85d3533b8b548984ee90fcd3ab231cffab5 Mon Sep 17 00:00:00 2001 From: Marc Nause Date: Fri, 27 Jun 2025 23:12:15 +0200 Subject: [PATCH 6/8] fix: fix for last commit --- lib/view/widgets/instruments_stats.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/view/widgets/instruments_stats.dart b/lib/view/widgets/instruments_stats.dart index 956753e92..183e11e7c 100644 --- a/lib/view/widgets/instruments_stats.dart +++ b/lib/view/widgets/instruments_stats.dart @@ -103,7 +103,7 @@ class StatItem extends StatelessWidget { value.toStringAsFixed(2), style: TextStyle( color: cardContentColor, - fontSize: valueFontSize, + fontSize: fontSize, fontWeight: FontWeight.bold, ), ), From f2a89eb940265248115a82099e54d7fd27452d4d Mon Sep 17 00:00:00 2001 From: Yugesh-Kumar-S Date: Sat, 28 Jun 2025 21:37:48 +0530 Subject: [PATCH 7/8] refactoring and small fixes --- lib/providers/barometer_state_provider.dart | 28 ++++++++--------- lib/theme/colors.dart | 2 ++ lib/view/barometer_screen.dart | 35 +++++++++++---------- lib/view/widgets/barometer_card.dart | 10 +++--- 4 files changed, 39 insertions(+), 36 deletions(-) diff --git a/lib/providers/barometer_state_provider.dart b/lib/providers/barometer_state_provider.dart index 6b9858f65..66d98cd51 100644 --- a/lib/providers/barometer_state_provider.dart +++ b/lib/providers/barometer_state_provider.dart @@ -21,7 +21,7 @@ class BarometerStateProvider extends ChangeNotifier { double _pressureMax = 0; double _pressureSum = 0; int _dataCount = 0; - bool _sensorAvailable = true; + bool _sensorAvailable = false; Function(String)? onSensorError; @@ -39,14 +39,24 @@ class BarometerStateProvider extends ChangeNotifier { notifyListeners(); }); + Timer sensorTimeout = Timer(const Duration(seconds: 3), () { + if (!_sensorAvailable) { + _handleSensorError(barometerSensorError); + } + }); + _barometerSubscription = barometerEventStream().listen( (BarometerEvent event) { _currentPressure = event.pressure / 1013.25; - _sensorAvailable = true; + if (!_sensorAvailable) { + _sensorAvailable = true; + sensorTimeout.cancel(); + } notifyListeners(); }, onError: (error) { logger.e("$barometerSensorError $error"); + sensorTimeout.cancel(); _handleSensorError(error); }, cancelOnError: false, @@ -58,21 +68,9 @@ class BarometerStateProvider extends ChangeNotifier { } void _handleSensorError(dynamic error) { - _sensorAvailable = false; - String errorString = error.toString().toLowerCase(); - if (errorString.contains('not available') || - errorString.contains('not supported') || - errorString.contains('sensor not found') || - errorString.contains('no sensor')) { - _handleSensorNotAvailable(); - } else { - onSensorError?.call(barometerSensorError); - } - } - - void _handleSensorNotAvailable() { _sensorAvailable = false; onSensorError?.call(barometerNotAvailable); + logger.e("$barometerSensorError $error"); } void disposeSensors() { diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index d12969b32..c1c8360fc 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -40,3 +40,5 @@ Color selectedMenuColor = Colors.red; Color menuColor = Colors.grey; Color listTileFocusColor = Colors.grey[350]!; Color oscilloscopeOptionLabelColor = Colors.black; +Color snackBarBackgroundColor = Colors.grey[700]!; +Color snackBarContentColor = Colors.white; diff --git a/lib/view/barometer_screen.dart b/lib/view/barometer_screen.dart index e2d21c10d..47ba00693 100644 --- a/lib/view/barometer_screen.dart +++ b/lib/view/barometer_screen.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pslab/constants.dart'; import 'package:pslab/providers/barometer_state_provider.dart'; +import 'package:pslab/theme/colors.dart'; import 'package:pslab/view/widgets/common_scaffold_widget.dart'; import 'package:pslab/view/widgets/barometer_card.dart'; import 'package:fl_chart/fl_chart.dart'; @@ -21,9 +22,9 @@ class _BarometerScreenState extends State { SnackBar( content: Text( message, - style: const TextStyle(color: Colors.white), + style: TextStyle(color: snackBarContentColor), ), - backgroundColor: Colors.grey[700], + backgroundColor: snackBarBackgroundColor, duration: const Duration(seconds: 4), behavior: SnackBarBehavior.floating, ), @@ -79,8 +80,8 @@ class _BarometerScreenState extends State { margin: EdgeInsets.fromLTRB(cardMargin, 0, cardMargin, cardMargin), padding: EdgeInsets.all(cardPadding), decoration: BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(8), + color: chartBackgroundColor, + borderRadius: BorderRadius.zero, ), child: _buildChart( screenWidth, @@ -104,7 +105,7 @@ class _BarometerScreenState extends State { ? 8.0 : 9.0; final style = TextStyle( - color: Colors.white, + color: chartTextColor, fontSize: fontSize, ); String timeText; @@ -137,7 +138,7 @@ class _BarometerScreenState extends State { ? 8.0 : 9.0; final style = TextStyle( - color: Colors.white, + color: chartTextColor, fontSize: fontSize, ); @@ -195,7 +196,7 @@ class _BarometerScreenState extends State { return LineChart( LineChartData( - backgroundColor: Colors.black, + backgroundColor: chartBackgroundColor, titlesData: FlTitlesData( show: true, topTitles: AxisTitles( @@ -205,7 +206,7 @@ class _BarometerScreenState extends State { timeAxisLabel, style: TextStyle( fontSize: axisNameFontSize, - color: Colors.white, + color: chartTextColor, fontWeight: FontWeight.bold, ), ), @@ -225,7 +226,7 @@ class _BarometerScreenState extends State { atm, style: TextStyle( fontSize: axisNameFontSize, - color: Colors.white, + color: chartTextColor, fontWeight: FontWeight.bold, ), ), @@ -238,7 +239,7 @@ class _BarometerScreenState extends State { child: Text( value.toStringAsFixed(2), style: TextStyle( - color: Colors.white, + color: chartTextColor, fontSize: chartFontSize, ), ), @@ -252,7 +253,7 @@ class _BarometerScreenState extends State { meterUnit, style: TextStyle( fontSize: axisNameFontSize, - color: Colors.white, + color: chartTextColor, fontWeight: FontWeight.bold, ), ), @@ -274,11 +275,11 @@ class _BarometerScreenState extends State { ), borderData: FlBorderData( show: true, - border: const Border( - bottom: BorderSide(color: Colors.white38), - left: BorderSide(color: Colors.white38), - top: BorderSide(color: Colors.white38), - right: BorderSide(color: Colors.white38), + border: Border( + bottom: BorderSide(color: chartBorderColor), + left: BorderSide(color: chartBorderColor), + top: BorderSide(color: chartBorderColor), + right: BorderSide(color: chartBorderColor), ), ), minY: 0, @@ -290,7 +291,7 @@ class _BarometerScreenState extends State { LineChartBarData( spots: spots, isCurved: true, - color: Colors.yellow, + color: xOrientationChartLineColor, barWidth: screenWidth < 400 ? 1.5 : 2.0, isStrokeCapRound: true, dotData: const FlDotData(show: false), diff --git a/lib/view/widgets/barometer_card.dart b/lib/view/widgets/barometer_card.dart index d53ca6c4f..594becaa6 100644 --- a/lib/view/widgets/barometer_card.dart +++ b/lib/view/widgets/barometer_card.dart @@ -5,6 +5,8 @@ import 'package:provider/provider.dart'; import 'package:pslab/view/widgets/instruments_stats.dart'; import 'package:pslab/constants.dart'; +import '../../theme/colors.dart'; + class BarometerCard extends StatefulWidget { const BarometerCard({super.key}); @override @@ -38,7 +40,7 @@ class _BarometerCardState extends State { elevation: 1, child: Container( decoration: BoxDecoration( - color: Colors.white, + color: cardBackgroundColor, borderRadius: BorderRadius.circular(12), ), child: Container( @@ -101,7 +103,7 @@ class _BarometerCardState extends State { child: Text( '$altitudeLabel ($meterUnit)', style: TextStyle( - color: Colors.black, + color: cardContentColor, fontSize: fontSize, fontWeight: FontWeight.w600, ), @@ -112,13 +114,13 @@ class _BarometerCardState extends State { child: Container( padding: EdgeInsets.symmetric(horizontal: padding, vertical: 3), decoration: BoxDecoration( - border: Border.all(color: Colors.pink.shade200), + border: Border.all(color: instrumentStatBoxColor), borderRadius: BorderRadius.circular(6), ), child: Text( currentAltitude.toStringAsFixed(2), style: TextStyle( - color: Colors.black, + color: cardContentColor, fontSize: fontSize, fontWeight: FontWeight.bold, ), From 99f4ee7d3361a7dc19093a95973061c4680a515b Mon Sep 17 00:00:00 2001 From: Padmal Date: Fri, 4 Jul 2025 17:07:56 +0200 Subject: [PATCH 8/8] Update colors.dart --- lib/theme/colors.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index 2913352bc..f696f9c85 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -45,5 +45,3 @@ Color snackBarContentColor = Colors.white; Color guideDrawerBackgroundColor = Colors.white; Color guideDrawerHeadingColor = Colors.black87; Color guideDrawerHighlightColor = Colors.black54; -Color snackBarBackgroundColor = Colors.grey[700]!; -Color snackBarContentColor = Colors.white;