Advertisement
rajath_pai

BackgroundCollectedPage

Aug 4th, 2021
979
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 5.61 KB | None | 0 0
  1. import 'package:flutter/material.dart';
  2.  
  3. import './BackgroundCollectingTask.dart';
  4. import './helpers/LineChart.dart';
  5. import './helpers/PaintStyle.dart';
  6.  
  7. class BackgroundCollectedPage extends StatelessWidget {
  8.   @override
  9.   Widget build(BuildContext context) {
  10.     final BackgroundCollectingTask task =
  11.         BackgroundCollectingTask.of(context, rebuildOnChange: true);
  12.  
  13.     // Arguments shift is needed for timestamps as miliseconds in double could loose precision.
  14.     final int argumentsShift =
  15.         task.samples.first.timestamp.millisecondsSinceEpoch;
  16.  
  17.     final Duration showDuration =
  18.         Duration(hours: 2); // @TODO . show duration should be configurable
  19.     final Iterable<DataSample> lastSamples = task.getLastOf(showDuration);
  20.  
  21.     final Iterable<double> arguments = lastSamples.map((sample) {
  22.       return (sample.timestamp.millisecondsSinceEpoch - argumentsShift)
  23.           .toDouble();
  24.     });
  25.  
  26.     // Step for argument labels
  27.     final Duration argumentsStep =
  28.         Duration(minutes: 15); // @TODO . step duration should be configurable
  29.  
  30.     // Find first timestamp floored to step before
  31.     final DateTime beginningArguments = lastSamples.first.timestamp;
  32.     DateTime beginningArgumentsStep = DateTime(beginningArguments.year,
  33.         beginningArguments.month, beginningArguments.day);
  34.     while (beginningArgumentsStep.isBefore(beginningArguments)) {
  35.       beginningArgumentsStep = beginningArgumentsStep.add(argumentsStep);
  36.     }
  37.     beginningArgumentsStep = beginningArgumentsStep.subtract(argumentsStep);
  38.     final DateTime endingArguments = lastSamples.last.timestamp;
  39.  
  40.     // Generate list of timestamps of labels
  41.     final Iterable<DateTime> argumentsLabelsTimestamps = () sync* {
  42.       DateTime timestamp = beginningArgumentsStep;
  43.       yield timestamp;
  44.       while (timestamp.isBefore(endingArguments)) {
  45.         timestamp = timestamp.add(argumentsStep);
  46.         yield timestamp;
  47.       }
  48.     }();
  49.  
  50.     // Map strings for labels
  51.     final Iterable<LabelEntry> argumentsLabels =
  52.         argumentsLabelsTimestamps.map((timestamp) {
  53.       return LabelEntry(
  54.           (timestamp.millisecondsSinceEpoch - argumentsShift).toDouble(),
  55.           ((timestamp.hour <= 9 ? '0' : '') +
  56.               timestamp.hour.toString() +
  57.               ':' +
  58.               (timestamp.minute <= 9 ? '0' : '') +
  59.               timestamp.minute.toString()));
  60.     });
  61.  
  62.     return Scaffold(
  63.         appBar: AppBar(
  64.           title: Text('Collected data'),
  65.           actions: <Widget>[
  66.             // Progress circle
  67.             (task.inProgress
  68.                 ? FittedBox(
  69.                     child: Container(
  70.                         margin: new EdgeInsets.all(16.0),
  71.                         child: CircularProgressIndicator(
  72.                             valueColor:
  73.                                 AlwaysStoppedAnimation<Color>(Colors.white))))
  74.                 : Container(/* Dummy */)),
  75.             // Start/stop buttons
  76.             (task.inProgress
  77.                 ? IconButton(icon: Icon(Icons.pause), onPressed: task.pause)
  78.                 : IconButton(
  79.                     icon: Icon(Icons.play_arrow), onPressed: task.reasume)),
  80.           ],
  81.         ),
  82.         body: ListView(
  83.           children: <Widget>[
  84.             Divider(),
  85.             ListTile(
  86.               leading: const Icon(Icons.brightness_7),
  87.               title: const Text('Temperatures'),
  88.               subtitle: const Text('In Celsius'),
  89.             ),
  90.             LineChart(
  91.               constraints: const BoxConstraints.expand(height: 350),
  92.               arguments: arguments,
  93.               argumentsLabels: argumentsLabels,
  94.               values: [
  95.                 lastSamples.map((sample) => sample.temperature1),
  96.                 lastSamples.map((sample) => sample.temperature2),
  97.               ],
  98.               verticalLinesStyle: const PaintStyle(color: Colors.grey),
  99.               additionalMinimalHorizontalLabelsInterval: 0,
  100.               additionalMinimalVerticalLablesInterval: 0,
  101.               seriesPointsStyles: [
  102.                 null,
  103.                 null,
  104.                 //const PaintStyle(style: PaintingStyle.stroke, strokeWidth: 1.7*3, color: Colors.indigo, strokeCap: StrokeCap.round),
  105.               ],
  106.               seriesLinesStyles: [
  107.                 const PaintStyle(
  108.                     style: PaintingStyle.stroke,
  109.                     strokeWidth: 1.7,
  110.                     color: Colors.indigoAccent),
  111.                 const PaintStyle(
  112.                     style: PaintingStyle.stroke,
  113.                     strokeWidth: 1.7,
  114.                     color: Colors.redAccent),
  115.               ],
  116.             ),
  117.             Divider(),
  118.             ListTile(
  119.               leading: const Icon(Icons.filter_vintage),
  120.               title: const Text('Water pH level'),
  121.             ),
  122.             LineChart(
  123.               constraints: const BoxConstraints.expand(height: 200),
  124.               arguments: arguments,
  125.               argumentsLabels: argumentsLabels,
  126.               values: [
  127.                 lastSamples.map((sample) => sample.waterpHlevel),
  128.               ],
  129.               verticalLinesStyle: const PaintStyle(color: Colors.grey),
  130.               additionalMinimalHorizontalLabelsInterval: 0,
  131.               additionalMinimalVerticalLablesInterval: 0,
  132.               seriesPointsStyles: [
  133.                 null,
  134.               ],
  135.               seriesLinesStyles: [
  136.                 const PaintStyle(
  137.                     style: PaintingStyle.stroke,
  138.                     strokeWidth: 1.7,
  139.                     color: Colors.greenAccent),
  140.               ],
  141.             ),
  142.           ],
  143.         ));
  144.   }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement