diff --git a/lib/hardware_interface/test_interface.dart b/lib/hardware_interface/test_interface.dart index f9f28a4..954c150 100644 --- a/lib/hardware_interface/test_interface.dart +++ b/lib/hardware_interface/test_interface.dart @@ -18,5 +18,9 @@ class TestHardwareInterface extends BaseHardwareInterface { database.updateDatabase("test_3", sin(i / 50) + 6); database.updateDatabase("random_1", random.nextDouble()); + + database.updateDatabase("qr_code_lat", 50 * sin(i / 50) + 50); + database.updateDatabase("qr_code_lon", -71.0899931); + //database.updateDatabase("qr_code_lat", 42.338807462515526); } } diff --git a/lib/widgets/home_pages/desktop_home_page.dart b/lib/widgets/home_pages/desktop_home_page.dart index b5ad6c1..71048a3 100644 --- a/lib/widgets/home_pages/desktop_home_page.dart +++ b/lib/widgets/home_pages/desktop_home_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_groundstation/widgets/base_widget.dart'; +import 'package:flutter_groundstation/widgets/tabs/qr_code_tab.dart'; import '../../hardware_interface/test_interface.dart'; import '../../hardware_interface/serial_groundstation_interface.dart'; @@ -36,7 +37,7 @@ class _DesktopHomePageState extends BaseHomePageState { @override Widget build(BuildContext context) { return DefaultTabController( - length: 3, + length: 4, child: Scaffold( appBar: AppBar( bottom: const TabBar( @@ -44,6 +45,7 @@ class _DesktopHomePageState extends BaseHomePageState { Tab(text: "Test widget"), Tab(text: "Test tab"), Tab(text: "Graphs tab"), + Tab(text: "QR Code tab"), ], ), ), @@ -55,6 +57,7 @@ class _DesktopHomePageState extends BaseHomePageState { ), const TestTab(), const GraphTab(), + const QrCodeTab(), ], ), ), diff --git a/lib/widgets/qr_code_widget.dart b/lib/widgets/qr_code_widget.dart new file mode 100644 index 0000000..1e69633 --- /dev/null +++ b/lib/widgets/qr_code_widget.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import './base_widget.dart'; + +// https://pub.dev/packages/qr_flutter +// https://medium.com/podiihq/generating-qr-code-in-a-flutter-app-50de15e39830 + +class QRCodeImageWidget extends StatelessWidget { + const QRCodeImageWidget(this.type, this.lat, this.lon, {super.key}); + + final String type; + final double lat; + final double lon; + + String getData() { + if (type == "Google") { + return "https://www.google.com/maps/search/?api=1&query=$lat%2C$lon"; + } else if (type == "Apple") { + return "https://maps.apple.com/?ll=$lat,$lon&q=Dropped%20Pin"; + } else if (type == "Geo") { + return "geo:$lat,$lon"; + } else { + return "$lat,$lon"; + } + } + + @override + Widget build(BuildContext context) { + return Column(children: [ + Flexible( + child: QrImageView( + data: getData(), + )), + Text(getData()) + ]); + } +} + +class QRCodeWidget extends StatefulWidget { + const QRCodeWidget({super.key}); + @override + _QRCodeWidgetState createState() => _QRCodeWidgetState(); +} + +class _QRCodeWidgetState extends BaseWidgetState { + String mapType = 'Google'; + String boardType = 'FCB'; + bool frozen = false; + double curLat = 0.0; + double curLon = 0.0; + + String printFrozen(bool yes) { + return yes ? "frozen" : "not frozen"; + } + + double getLatNotFrozen() { + if (!frozen) { + curLat = getDatabaseValue("qr_code_lat", 0.0); + } + return curLat; + } + + double getLonNotFrozen() { + if (!frozen) { + curLon = getDatabaseValue("qr_code_lon", 0.0); + } + return curLon; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: const Text('Location QR Code Generator'), + ), + body: Center( + child: Container( + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Spacer(), + DropdownButton( + value: mapType, + onChanged: (String? newValue) { + setState(() { + mapType = newValue!; + }); + }, + items: ['Google', 'Apple', 'Geo', 'Raw'].map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ), + const Spacer(), + DropdownButton( + value: boardType, + onChanged: (String? newValue) { + setState(() { + boardType = newValue!; + }); + }, + items: ['FCB', 'EggFinder'].map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value), + ); + }).toList(), + ), + const Spacer(), + Text(printFrozen(frozen)), + Checkbox( + value: frozen, + onChanged: (bool? value) { + setState(() { + frozen = value!; + }); + }, + ), + const Spacer(), + ], + ), + Flexible( + child: QRCodeImageWidget( + mapType, + getLatNotFrozen(), + getLonNotFrozen(), + )), + ])), + )); + } +} diff --git a/lib/widgets/tabs/qr_code_tab.dart b/lib/widgets/tabs/qr_code_tab.dart new file mode 100644 index 0000000..908d683 --- /dev/null +++ b/lib/widgets/tabs/qr_code_tab.dart @@ -0,0 +1,22 @@ +import 'package:flutter/material.dart'; + +import '../qr_code_widget.dart'; + +class QrCodeTab extends StatelessWidget { + const QrCodeTab({super.key}); + + @override + Widget build(BuildContext context) { + // return GridView.count( + // primary: false, + // padding: const EdgeInsets.all(20), + // crossAxisSpacing: 10, + // mainAxisSpacing: 10, + // crossAxisCount: 3, + // children: [ + //const QRCodeWidget(), + return const QRCodeWidget(); + //], + //); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index a42a43d..dd85e37 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: sdk: flutter auto_size_text: 3.0.0 + qr_flutter: ^4.1.0 # The following adds the Cupertino Icons font to your application.