diff --git a/.vscode/settings.json b/.vscode/settings.json index 4859212..36c4024 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,7 @@ { "java.configuration.updateBuildConfiguration": "interactive", - "cmake.sourceDirectory": "${workspaceFolder}/linux/flutter" + "cmake.sourceDirectory": "${workspaceFolder}/linux/flutter", + "editor.wordBasedSuggestions": "off", + "editor.tabCompletion": "onlySnippets", + "editor.selectionHighlight": false } \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index ce5983a..4cfadd7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -38,7 +38,7 @@ android { versionCode flutter.versionCode versionName flutter.versionName - archivesBaseName = "terepi_seged-${versionName}-${new Date().format('yyyyMMdd-HHmm')}" + // archivesBaseName = "terepi_seged-${versionName}-${new Date().format('yyyyMMdd-HHmm')}" // multiDexEnabled true } diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/main.dart b/lib/main.dart index 440bfb4..4375bd3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,7 +11,7 @@ Future main() async { await Supabase.initialize( url: 'https://supa.app-dev.hu', anonKey: - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJyb2xlIjogImFub24iLAogICJpc3MiOiAic3VwYWJhc2UiLAogICJpYXQiOiAxNzExMDYyMDAwLAogICJleHAiOiAxODY4ODI4NDAwCn0.XWtP3eEysZDxXjaHHUZyyhw0n4YZo_xWUMWS5ajBcbI'); + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJyb2xlIjogImFub24iLAogICJpc3MiOiAic3VwYWJhc2UiLAogICJpYXQiOiAxNzQwMjY1MjAwLAogICJleHAiOiAxODk4MDMxNjAwCn0.4cMVfAnBLxne1lq0fm94rgtXLBJdRx-0f-E4Jd_jFwI'); runApp(const MyApp()); } diff --git a/lib/pages/map/presentation/controllers/map_controller.dart b/lib/pages/map/presentation/controllers/map_controller.dart index 67ab4b8..dfbd0cf 100644 --- a/lib/pages/map/presentation/controllers/map_controller.dart +++ b/lib/pages/map/presentation/controllers/map_controller.dart @@ -19,6 +19,7 @@ import 'package:nmea/nmea.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart' as permission_handler; +import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:terepi_seged/eov/convert_coordinate.dart'; import 'package:terepi_seged/eov/eov.dart'; import 'package:terepi_seged/gnss_sentences/gngga.dart'; @@ -27,12 +28,13 @@ import 'package:terepi_seged/gnss_sentences/gnrmc.dart'; import 'package:terepi_seged/models/point_to_measure.dart'; import 'package:terepi_seged/models/point_with_description_model.dart'; import 'package:proj4dart/proj4dart.dart' as proj4; +import 'package:shared_preferences/shared_preferences.dart'; class MapViewController extends GetxController { // String gpsAddress = "E8:31:CD:14:8B:B2"; // String gpsAddress = "98:CD:AC:62:FF:4E"; RxString gpsAddress = "98:CD:AC:62:FF:36".obs; - String gpsName = "TiGNSS Rover-FF4E"; + RxString gpsName = "TiGNSS Rover-FF4E".obs; // String gpsName = "TiGNSS Rover-8BB2"; static const double maxZoomValue = 25.0; Rx gpsIsConnected = false.obs; @@ -65,6 +67,7 @@ class MapViewController extends GetxController { RxDouble gpsLongitude = 0.0.obs; RxString gpsLongitudeDirection = "".obs; RxDouble gpsAltitude = 0.0.obs; + RxDouble gpsGeoidSeparation = 0.0.obs; RxInt gpsQuality = 0.obs; RxDouble gpsLatitudeError = 0.0.obs; RxDouble gpsLongitudeError = 0.0.obs; @@ -103,8 +106,8 @@ class MapViewController extends GetxController { int pointId = 1; String pointIdPrefix = ""; String pointIdPostfix = ""; - String ntripUserName = ""; - String ntripPassword = ""; + RxString ntripUserName = "".obs; + RxString ntripPassword = "".obs; Rx pointMeasuringDirectionForward = true.obs; @@ -115,7 +118,8 @@ class MapViewController extends GetxController { late proj4.Projection eovProj, wgsProj; RxBool mapIsInitialized = false.obs; - GeoJsonParser parser = GeoJsonParser(defaultMarkerColor: Colors.yellow); + GeoJsonParser parser = + GeoJsonParser(defaultMarkerColor: const Color.fromARGB(255, 85, 34, 49)); final CollectionReference _measuredPoints = FirebaseFirestore.instance.collection('measuredPoints'); @@ -123,6 +127,12 @@ class MapViewController extends GetxController { // late SMIBool gpsTrigger; // late StateMachineController riveGpsIconController; + late SharedPreferences prefs; + + late AuthResponse authResponse; + late Session? session; + late User? user; + @override void onInit() async { super.onInit(); @@ -144,6 +154,26 @@ class MapViewController extends GetxController { ..registerTalkerSentence("RMC", (line) => Gnrmc(raw: line)) ..registerTalkerSentence("GST", (line) => Gngst(raw: line)); + prefs = await SharedPreferences.getInstance(); + + authResponse = await Supabase.instance.client.auth + .signInWithPassword(email: 'test.elek.1@email.hu', password: 'demo'); + session = authResponse.session; + user = authResponse.user; + + Supabase.instance.client + .channel('public:TerepiSeged_Receiver') + .onPostgresChanges( + event: PostgresChangeEvent.update, + schema: 'public', + table: 'TerepiSeged_Receiver', + callback: (playload) { + var id = playload.newRecord['pointNumber'] as int; + print('Change received: ${id}'); + updatePointStatus(id); + }) + .subscribe(); + mapController = MapController(); // riveGpsIconController = RiveUtils.getRiveController(Artboard(), @@ -154,7 +184,7 @@ class MapViewController extends GetxController { } @override - void onClose() { + void onClose() async { super.onClose(); FlutterBluetoothSerial.instance.setPairingRequestHandler(null); if (gpsIsConnected.value) { @@ -169,6 +199,10 @@ class MapViewController extends GetxController { pointPostfixController.dispose(); ntripUsernameController.dispose(); ntripPasswordController.dispose(); + + await Supabase.instance.client + .channel('public:TerepiSeged_Receiver') + .unsubscribe(); } @override @@ -200,6 +234,30 @@ class MapViewController extends GetxController { } else { print("No external storage permission"); } + if (prefs.containsKey('gpsAddress')) { + var address = prefs.getString('gpsAddress'); + if (address != null) { + gpsAddress.value = address; + } + } + if (prefs.containsKey('gpsName')) { + var name = prefs.getString('gpsName'); + if (name != null) { + gpsName.value = name; + } + } + if (prefs.containsKey('ntripUserName')) { + var userName = prefs.getString('ntripUserName'); + if (userName != null) { + ntripUserName.value = userName; + } + } + if (prefs.containsKey('ntripPassword')) { + var password = prefs.getString('ntripPassword'); + if (password != null) { + ntripPassword.value = password; + } + } } directory = await getExternalStorageDirectory(); @@ -228,7 +286,7 @@ class MapViewController extends GetxController { } } - gpsHeightController.text = '1.7'; + gpsHeightController.text = '1.8'; } void _getInitialLocation() async { @@ -302,7 +360,9 @@ class MapViewController extends GetxController { header += "User-Agent: SharpGps iter.dk\r\n"; header += "Accept: */*\r\nConnection: close\r\n"; // header += "Authorization: Basic ${_toBase64("info@mail.app-dev.hu:")}\r\n"; - header += "Authorization: Basic ${_toBase64("elgi08:Laszl0stef1")}\r\n"; + //header += "Authorization: Basic ${_toBase64("elgi08:Laszl0stef1")}\r\n"; + header += + "Authorization: Basic ${_toBase64("${ntripUserName.value}:${ntripPassword.value}")}\r\n"; // header += "Host:rtk2go.com:2101\r\n"; header += "Host:gnssnet.hu:2101\r\n"; header += "Ntrip-Vesrsion:Ntrip/2.0\r\n"; @@ -412,6 +472,7 @@ class MapViewController extends GetxController { gpsLongitude.value = sentence.longitude; gpsLongitudeDirection.value = sentence.longitudeDirection; gpsAltitude.value = sentence.altitudeAboveMeanSeaLevel; + gpsGeoidSeparation.value = sentence.geoidSeparation; gpsQuality.value = sentence.gpsQualityIndicator; eov.value = ConvertCoordinate.ConvertWgsToEov( gpsLatitude.value, gpsLongitude.value); @@ -441,7 +502,7 @@ class MapViewController extends GetxController { (DateTime.now() .difference(lastSendTimeGgaMessage) .inSeconds >= - 30)) { + 5)) { sendGgaMessage(lastGgaMessage); print("Send GGA message: $lastGgaMessage"); ggaSenDataPacketNumber.value++; @@ -723,6 +784,29 @@ class MapViewController extends GetxController { "gpsHeight": gpsHeightController.text }); + await Supabase.instance.client + .from('TerepiSeged_MeasuredPoints') + .insert({ + 'pointNumber': pointId, + 'gnssNumber': gpsName.value, + 'latitude': gpsLatitude.value, + 'longitude': gpsLongitude.value, + 'altitude': gpsAltitude.value, + 'heightOfGeoid': gpsGeoidSeparation.value, + 'eovX': eov.value.X, + 'eovY': eov.value.Y, + 'poleHeight': double.tryParse(gpsHeightController.text), + 'horizontalError': + max(gpsLatitudeError.value, gpsLongitudeError.value), + 'verticalError': gpsAltitudeError.value, + 'description': pointDescriptionController.text + }); + + await Supabase.instance.client + .from('TerepiSeged_Receiver') + .update({'isMeasured': true}).eq( + 'pointNumber', pointId); + if (pointMeasuringDirectionForward.isTrue) { if (pointsToMeasureSelectedValue.value < pointsToMeasure.length - 1) { @@ -853,6 +937,79 @@ class MapViewController extends GetxController { } } + void readPointsFromSupa() async { + // final AuthResponse res = await Supabase.instance.client.auth + // .signInWithPassword(email: 'test.elek.1@email.hu', password: 'demo'); + // final Session? session = res.session; + // final User? user = res.user; + + final data = + await Supabase.instance.client.from('TerepiSeged_Receiver').select(); + print('supa count ->${data.length}'); + + for (int i = 0; i < data.length; i++) { + var items = data[i]; + if (items.length >= 3) { + var id = items['pointNumber']; + num numEovX = items['eovX']; + var coordX = numEovX.toDouble(); + num numEovY = items['eovY']; + var coordY = numEovY.toDouble(); + + if (id != null && coordX != null && coordY != null) { + pointsToMeasure + .add(PointToMeasure(id: id, coordX: coordX, coordY: coordY)); + + var eovCoord = proj4.Point(x: coordX, y: coordY); + var wgsCoord = eovProj.transform(wgsProj, eovCoord); + + print("Lat -> ${wgsCoord.x}, Long -> ${wgsCoord.y}"); + + pointsToMeasureMarker.add(Marker( + point: LatLng(wgsCoord.y, wgsCoord.x), + width: 15.0, + height: 15.0, + child: Container( + width: 15.0, + height: 15.0, + decoration: BoxDecoration( + color: Colors.purple, + shape: BoxShape.circle, + border: Border.all(width: 1.0, color: Colors.black)), + ))); + + pointsToMeasureLabel.add(PolyWidget( + center: LatLng(wgsCoord.y + 0.0000075, wgsCoord.x + 0.0000075), + widthInMeters: 3, + heightInMeters: 3, + // constraints: const BoxConstraints( + // minWidth: 250, + // maxWidth: 350, + // ), + child: FittedBox( + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + ' $id ', + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.yellow, + fontSize: 12.0), + ), + ), + ))); + + pointsToMeasureDropDownMenuItem.add(DropdownMenuItem( + value: i, + child: Text('$id'), + )); + } + } + } + pointsToMeasureSelectedValue.value = 0; + print('Converted points number -> ${pointsToMeasure.length}'); + } + void pointsToMeasureSelectedValueChanged(int value) { pointsToMeasureSelectedValue.value = value; print('Selected point -> ${pointsToMeasureSelectedValue.value}'); @@ -887,4 +1044,22 @@ class MapViewController extends GetxController { void showAddPointDialog() { onBottomNavigationBarTap(0); } + + void saveGpsAddress(String address) { + prefs.setString('gpsAddress', address); + } + + void saveGpsName(String name) { + prefs.setString('gpsName', name); + } + + void saveNtripUserName(String username) { + prefs.setString('ntripUserName', username); + } + + void saveNtripPassword(String password) { + prefs.setString('ntripPassword', password); + } + + void updatePointStatus(int pointId) {} } diff --git a/lib/pages/map/presentation/views/map_view.dart b/lib/pages/map/presentation/views/map_view.dart index ef46753..ced0159 100644 --- a/lib/pages/map/presentation/views/map_view.dart +++ b/lib/pages/map/presentation/views/map_view.dart @@ -30,7 +30,7 @@ class MapView extends GetView { children: [ Text('Térkép'), Text( - "Budapest", + "Zalaegerszeg", style: TextStyle(fontSize: 12.0), ) ], @@ -89,8 +89,27 @@ class MapView extends GetView { Padding( padding: const EdgeInsets.only(right: 20.0), child: GestureDetector( - onTap: () => Get.to(() => SettingsDialog(), - transition: Transition.downToUp), + onTap: () { + controller.readPointsFromSupa(); + }, + child: const Icon(Icons.cloud_download, + size: 26.0, color: Colors.blue), + ), + ), + Padding( + padding: const EdgeInsets.only(right: 20.0), + child: GestureDetector( + onTap: () { + if (controller.ntripUserName.value.isNotEmpty) { + controller.ntripUsernameController.text = + controller.ntripUserName.value; + } + if (controller.ntripPassword.value.isNotEmpty) { + controller.ntripPasswordController.text = + controller.ntripPassword.value; + } + Get.to(() => SettingsDialog(), transition: Transition.downToUp); + }, child: const Icon( Icons.more_vert, size: 26.0, diff --git a/lib/pages/map/presentation/views/settings_dialog.dart b/lib/pages/map/presentation/views/settings_dialog.dart index 0e07f78..47128d1 100644 --- a/lib/pages/map/presentation/views/settings_dialog.dart +++ b/lib/pages/map/presentation/views/settings_dialog.dart @@ -6,7 +6,6 @@ class SettingsDialog extends StatelessWidget { final controller = Get.find(); SettingsDialog({super.key}); - @override Widget build(BuildContext context) { return Scaffold( body: ListView( @@ -18,6 +17,19 @@ class SettingsDialog extends StatelessWidget { children: [ IconButton( onPressed: () { + if (controller.ntripUsernameController.text.isNotEmpty) { + controller.ntripUserName.value = + controller.ntripUsernameController.text; + controller.saveNtripUserName( + controller.ntripUsernameController.text); + if (controller + .ntripPasswordController.text.isNotEmpty) { + controller.ntripPassword.value = + controller.ntripPasswordController.text; + controller.saveNtripPassword( + controller.ntripPasswordController.text); + } + } Get.back(); }, icon: const Icon(Icons.close)), @@ -25,7 +37,22 @@ class SettingsDialog extends StatelessWidget { style: ButtonStyle( overlayColor: MaterialStateProperty.all(Colors.transparent)), - onPressed: () {}, + onPressed: () { + if (controller.ntripUsernameController.text.isNotEmpty) { + controller.ntripUserName.value = + controller.ntripUsernameController.text; + controller.saveNtripUserName( + controller.ntripUsernameController.text); + if (controller + .ntripPasswordController.text.isNotEmpty) { + controller.ntripPassword.value = + controller.ntripPasswordController.text; + controller.saveNtripPassword( + controller.ntripPasswordController.text); + } + } + Get.back(); + }, child: const Text( 'Bezár', style: TextStyle(color: Colors.blue, fontSize: 14.0), @@ -48,12 +75,95 @@ class SettingsDialog extends StatelessWidget { ), ), Obx(() => Column(children: [ + RadioListTile( + title: Text('TiGNSS Rover-BE6A'), + value: '10:06:1C:97:BE:6A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-BE6A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-BE6A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-1DC6'), + value: 'E8:31:CD:16:1D:C6', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-1DC6'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-1DC6'); + }), + RadioListTile( + title: Text('TiGNSS Rover-9C3A'), + value: '08:3A:8D:14:9C:3A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-9C3A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-9C3A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-72C2'), + value: '10:06:1C:97:72:C2', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-72C2'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-72C2'); + }), + RadioListTile( + title: Text('TiGNSS Rover-FE16'), + value: '10:06:1C:9F:FE:16', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FE16'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FE16'); + }), + RadioListTile( + title: Text('TiGNSS Rover-3B0A'), + value: '10:C6:1C:9E:3B:0A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-3B0A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-3B0A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-7FEA'), + value: '10:06:1C:9C:7F:EA', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-7FEA'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-7FEA'); + }), + RadioListTile( + title: Text('TiGNSS Rover-A39E'), + value: '10:06:1C:97:A3:9E', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-A39E'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-A39E'); + }), RadioListTile( title: Text('TiGNSS Rover-FF4E'), value: '98:CD:AC:62:FF:4E', groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FF4E'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FF4E'); }), RadioListTile( title: Text('TiGNSS Rover-8BB2'), @@ -61,7 +171,9 @@ class SettingsDialog extends StatelessWidget { groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; - ; + controller.gpsName.value = 'TiGNSS Rover-8BB2'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-8BB2'); }), RadioListTile( title: Text('TiGNSS Rover-FF36'), @@ -69,6 +181,9 @@ class SettingsDialog extends StatelessWidget { groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FF36'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FF36'); }) ])), const Padding( diff --git a/lib/pages/navigation/presentation/controllers/navigation_controller.dart b/lib/pages/navigation/presentation/controllers/navigation_controller.dart index 68865d2..b5a5e9b 100644 --- a/lib/pages/navigation/presentation/controllers/navigation_controller.dart +++ b/lib/pages/navigation/presentation/controllers/navigation_controller.dart @@ -12,6 +12,7 @@ import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_geojson/flutter_map_geojson.dart'; import 'package:flutter_map_polywidget/flutter_map_polywidget.dart'; import 'package:get/get.dart'; +import 'package:get/get_connect/http/src/utils/utils.dart'; import 'package:intl/date_time_patterns.dart'; import 'package:intl/intl.dart'; import 'package:location/location.dart'; @@ -20,6 +21,7 @@ import 'package:nmea/nmea.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart' as permission_handler; +import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:terepi_seged/eov/convert_coordinate.dart'; import 'package:terepi_seged/eov/eov.dart'; import 'package:terepi_seged/gnss_sentences/gngga.dart'; @@ -28,12 +30,13 @@ import 'package:terepi_seged/gnss_sentences/gnrmc.dart'; import 'package:terepi_seged/models/point_to_measure.dart'; import 'package:terepi_seged/models/point_with_description_model.dart'; import 'package:proj4dart/proj4dart.dart' as proj4; +import 'package:shared_preferences/shared_preferences.dart'; class NavigationViewController extends GetxController { // String gpsAddress = "E8:31:CD:14:8B:B2"; // String gpsAddress = "98:CD:AC:62:FF:4E"; RxString gpsAddress = "98:CD:AC:62:FF:36".obs; - String gpsName = "TiGNSS Rover-FF4E"; + RxString gpsName = "TiGNSS Rover-FF4E".obs; // String gpsName = "TiGNSS Rover-8BB2"; static const double maxZoomValue = 25.0; Rx gpsIsConnected = false.obs; @@ -118,11 +121,21 @@ class NavigationViewController extends GetxController { final CollectionReference _vibratorTracker = FirebaseFirestore.instance.collection('vibratorTracker'); DateTime lastGpsDataSaveTime = DateTime(2000, 1, 1, 0, 0, 0); - int vehicleNumber = 2; + RxInt vehicleNumber = 5.obs; late Location internalGpsLogger; Location internalGpsLocation = Location(); late StreamSubscription internalGpsLocationSubscription; + late List> pathLayer = []; + + RxString ntripUserName = "".obs; + RxString ntripPassword = "".obs; + late SharedPreferences prefs; + + late AuthResponse authResponse; + late Session? session; + late User? user; + // late SMIBool gpsTrigger; // late StateMachineController riveGpsIconController; @@ -146,13 +159,18 @@ class NavigationViewController extends GetxController { ..registerTalkerSentence("GST", (line) => Gngst(raw: line)); mapController = MapController(); + prefs = await SharedPreferences.getInstance(); + + authResponse = await Supabase.instance.client.auth + .signInWithPassword(email: 'test.elek.1@email.hu', password: 'demo'); + session = authResponse.session; + user = authResponse.user; // riveGpsIconController = RiveUtils.getRiveController(Artboard(), // stateMachineName: "gps_Interactivity"); // gpsTrigger = riveGpsIconController.findSMI("active"); mapIsInitialized.value = true; - vehicleNumberController.text = vehicleNumber.toString(); } @override @@ -207,6 +225,37 @@ class NavigationViewController extends GetxController { } else { print("No external storage permission"); } + if (prefs.containsKey('gpsAddress')) { + var address = prefs.getString('gpsAddress'); + if (address != null) { + gpsAddress.value = address; + } + } + if (prefs.containsKey('gpsName')) { + var name = prefs.getString('gpsName'); + if (name != null) { + gpsName.value = name; + } + } + if (prefs.containsKey('ntripUserName')) { + var userName = prefs.getString('ntripUserName'); + if (userName != null) { + ntripUserName.value = userName; + } + } + if (prefs.containsKey('ntripPassword')) { + var password = prefs.getString('ntripPassword'); + if (password != null) { + ntripPassword.value = password; + } + } + if (prefs.containsKey('vehicleNumber')) { + var vehicleNum = prefs.getInt('vehicleNumber'); + if (vehicleNum != null) { + vehicleNumber.value = vehicleNum; + } + } + vehicleNumberController.text = vehicleNumber.toString(); } directory = await getExternalStorageDirectory(); @@ -276,16 +325,27 @@ class NavigationViewController extends GetxController { internalGpsFile.writeAsString( "$vehicleNumber;$time;$latitude;$longitude;$altitude;$accuracy\r\n"); - _vibratorTracker.add({ - "gpsType": 0, - "vibratorNumber": vehicleNumber, - "gpsDateTime": time, - "latitude": latitude, - "longitude": longitude, - "altitude": altitude, - "horizontalError": accuracy, - "speed": speed, - "createdAt": DateTime.timestamp() + // _vibratorTracker.add({ + // "gpsType": 0, + // "vibratorNumber": vehicleNumber.value, + // "gpsDateTime": time, + // "latitude": latitude, + // "longitude": longitude, + // "altitude": altitude, + // "horizontalError": accuracy, + // "speed": speed, + // "createdAt": DateTime.timestamp() + // }); + + Supabase.instance.client.from('TerepiSeged_VibratorTracker').insert({ + 'gpsType': 0, + 'vibratorNumber': vehicleNumber.value, + 'gpsDateTime': time.toIso8601String(), + 'latitude': gpsLatitude.value, + 'longitude': gpsLongitude.value, + 'altitude': gpsAltitude.value, + 'horizontalError': accuracy, + 'speed': speed }); }); @@ -588,7 +648,7 @@ class NavigationViewController extends GetxController { void _savePositionToDatabase() { _vibratorTracker.add({ "gpsType": 1, - "vibratorNumber": vehicleNumber, + "vibratorNumber": vehicleNumber.value, "gpsQuality": gpsQuality.value, "gpsDateTime": gpsDateTime.value, "latitude": gpsLatitude.value, @@ -601,6 +661,24 @@ class NavigationViewController extends GetxController { "antennaHeight": double.parse(gpsHeightController.text), "createdAt": DateTime.timestamp() }); + + final res = + Supabase.instance.client.from('TerepiSeged_VibratorTracker').insert({ + "gpsType": 1, + "vibratorNumber": vehicleNumber.value, + "gpsQuality": gpsQuality.value, + "gpsDateTime": gpsDateTime.value.toIso8601String(), + "latitude": gpsLatitude.value, + "longitude": gpsLongitude.value, + "altitude": gpsAltitude.value, + "eovY": eov.value.Y, + "eovX": eov.value.X, + "horizontalError": max(gpsLatitudeError.value, gpsLongitudeError.value), + "verticalError": gpsAltitudeError.value, + "poleHeight": double.parse(gpsHeightController.text) + }).select(); + print(res); + lastGpsDataSaveTime = DateTime.now(); } @@ -896,15 +974,15 @@ class NavigationViewController extends GetxController { width: 15.0, height: 15.0, decoration: BoxDecoration( - color: Colors.purple, + color: Colors.yellow, shape: BoxShape.circle, border: Border.all(width: 1.0, color: Colors.black)), ))); pointsToMeasureLabel.add(PolyWidget( - center: LatLng(wgsCoord.y + 0.0000075, wgsCoord.x + 0.0000075), - widthInMeters: 3, - heightInMeters: 3, + center: LatLng(wgsCoord.y + 0.0000275, wgsCoord.x + 0.0000275), + widthInMeters: 28, + heightInMeters: 28, // constraints: const BoxConstraints( // minWidth: 250, // maxWidth: 350, @@ -934,6 +1012,24 @@ class NavigationViewController extends GetxController { } } + void ReadPathFromFile() async { + File? file; + FilePickerResult? result = await FilePicker.platform.pickFiles(); + + if (result != null) { + file = File(result.files.single.path!); + } else { + print("No file selected"); + } + if (await file!.exists()) { + String data = await file.readAsString(); + parser.defaultPolylineColor = Colors.orangeAccent; + parser.defaultPolylineStroke = 5.0; + parser.parseGeoJsonAsString(data); + pathLayer = parser.polylines; + } + } + void pointsToMeasureSelectedValueChanged(int value) { pointsToMeasureSelectedValue.value = value; print('Selected point -> ${pointsToMeasureSelectedValue.value}'); @@ -964,4 +1060,23 @@ class NavigationViewController extends GetxController { void addMeasuredPoint() { // _measuredPoints.add({"id": 4001, "latitude": 46.3455, "longitude": 19.652}); } + void saveGpsAddress(String address) { + prefs.setString('gpsAddress', address); + } + + void saveGpsName(String name) { + prefs.setString('gpsName', name); + } + + void saveNtripUserName(String username) { + prefs.setString('ntripUserName', username); + } + + void saveNtripPassword(String password) { + prefs.setString('ntripPassword', password); + } + + void saveVehicleNumber(int vehicleNumber) { + prefs.setInt('vehicleNumber', vehicleNumber); + } } diff --git a/lib/pages/navigation/presentation/views/navigation_view.dart b/lib/pages/navigation/presentation/views/navigation_view.dart index dd737e0..e44f8c2 100644 --- a/lib/pages/navigation/presentation/views/navigation_view.dart +++ b/lib/pages/navigation/presentation/views/navigation_view.dart @@ -28,7 +28,7 @@ class NavigationView extends GetView { children: [ Text('Navigáció'), Text( - "Mérés: Budapest-4", + "Mérés: Zalaegerszeg", style: TextStyle(fontSize: 12.0), ) ], @@ -84,6 +84,16 @@ class NavigationView extends GetView { const Icon(Icons.file_open, size: 26.0, color: Colors.blue), ), ), + Padding( + padding: const EdgeInsets.only(right: 20.0), + child: GestureDetector( + onTap: () { + controller.ReadPathFromFile(); + }, + child: const Icon(Icons.line_weight_rounded, + size: 26.0, color: Colors.blue), + ), + ), Padding( padding: const EdgeInsets.only(right: 20.0), child: GestureDetector( @@ -243,12 +253,13 @@ class NavigationView extends GetView { MarkerLayer( markers: controller.currentLocationMarker), MarkerLayer(markers: controller.parser.markers), + PolylineLayer(polylines: controller.pathLayer), MarkerLayer( markers: controller.pointsToMeasureMarker), // PolylineLayer( // polylines: controller.parser.polylines), PolyWidgetLayer( - polyWidgets: controller.pointsToMeasureLabel) + polyWidgets: controller.pointsToMeasureLabel), ], ) : const Center(child: CircularProgressIndicator()), diff --git a/lib/pages/navigation/presentation/views/settings_dialog.dart b/lib/pages/navigation/presentation/views/settings_dialog.dart index 0f51c9a..effaca0 100644 --- a/lib/pages/navigation/presentation/views/settings_dialog.dart +++ b/lib/pages/navigation/presentation/views/settings_dialog.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; +import 'package:terepi_seged/pages/map/presentation/controllers/map_controller.dart'; import 'package:terepi_seged/pages/navigation/presentation/controllers/navigation_controller.dart'; class SettingsDialog extends StatelessWidget { final controller = Get.find(); SettingsDialog({super.key}); - @override Widget build(BuildContext context) { return Scaffold( body: ListView( @@ -19,8 +19,26 @@ class SettingsDialog extends StatelessWidget { children: [ IconButton( onPressed: () { - controller.vehicleNumber = - int.parse(controller.vehicleNumberController.text); + if (controller.ntripUsernameController.text.isNotEmpty) { + controller.ntripUserName.value = + controller.ntripUsernameController.text; + controller.saveNtripUserName( + controller.ntripUsernameController.text); + if (controller + .ntripPasswordController.text.isNotEmpty) { + controller.ntripPassword.value = + controller.ntripPasswordController.text; + controller.saveNtripPassword( + controller.ntripPasswordController.text); + } + if (controller + .vehicleNumberController.text.isNotEmpty) { + controller.vehicleNumber.value = int.parse( + controller.vehicleNumberController.text); + controller.saveVehicleNumber(int.parse( + controller.vehicleNumberController.text)); + } + } Get.back(); }, icon: const Icon(Icons.close)), @@ -28,7 +46,29 @@ class SettingsDialog extends StatelessWidget { style: ButtonStyle( overlayColor: MaterialStateProperty.all(Colors.transparent)), - onPressed: () {}, + onPressed: () { + if (controller.ntripUsernameController.text.isNotEmpty) { + controller.ntripUserName.value = + controller.ntripUsernameController.text; + controller.saveNtripUserName( + controller.ntripUsernameController.text); + if (controller + .ntripPasswordController.text.isNotEmpty) { + controller.ntripPassword.value = + controller.ntripPasswordController.text; + controller.saveNtripPassword( + controller.ntripPasswordController.text); + } + if (controller + .vehicleNumberController.text.isNotEmpty) { + controller.vehicleNumber.value = int.parse( + controller.vehicleNumberController.text); + controller.saveVehicleNumber(int.parse( + controller.vehicleNumberController.text)); + } + } + Get.back(); + }, child: const Text( 'Bezár', style: TextStyle(color: Colors.blue, fontSize: 14.0), @@ -51,12 +91,95 @@ class SettingsDialog extends StatelessWidget { ), ), Obx(() => Column(children: [ + RadioListTile( + title: Text('TiGNSS Rover-BE6A'), + value: '10:06:1C:97:BE:6A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-BE6A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-BE6A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-1DC6'), + value: 'E8:31:CD:16:1D:C6', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-1DC6'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-1DC6'); + }), + RadioListTile( + title: Text('TiGNSS Rover-9C3A'), + value: '08:3A:8D:14:9C:3A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-9C3A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-9C3A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-72C2'), + value: '10:06:1C:97:72:C2', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-72C2'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-72C2'); + }), + RadioListTile( + title: Text('TiGNSS Rover-FE16'), + value: '10:06:1C:9F:FE:16', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FE16'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FE16'); + }), + RadioListTile( + title: Text('TiGNSS Rover-3B0A'), + value: '10:C6:1C:9E:3B:0A', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-3B0A'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-3B0A'); + }), + RadioListTile( + title: Text('TiGNSS Rover-7FEA'), + value: '10:06:1C:9C:7F:EA', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-7FEA'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-7FEA'); + }), + RadioListTile( + title: Text('TiGNSS Rover-A39E'), + value: '10:06:1C:97:A3:9E', + groupValue: controller.gpsAddress.value, + onChanged: (value) { + controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-A39E'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-A39E'); + }), RadioListTile( title: Text('TiGNSS Rover-FF4E'), value: '98:CD:AC:62:FF:4E', groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FF4E'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FF4E'); }), RadioListTile( title: Text('TiGNSS Rover-8BB2'), @@ -64,7 +187,9 @@ class SettingsDialog extends StatelessWidget { groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; - ; + controller.gpsName.value = 'TiGNSS Rover-8BB2'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-8BB2'); }), RadioListTile( title: Text('TiGNSS Rover-FF36'), @@ -72,6 +197,9 @@ class SettingsDialog extends StatelessWidget { groupValue: controller.gpsAddress.value, onChanged: (value) { controller.gpsAddress.value = value!; + controller.gpsName.value = 'TiGNSS Rover-FF36'; + controller.saveGpsAddress(value); + controller.saveGpsName('TiGNSS Rover-FF36'); }) ])), const Padding( @@ -173,15 +301,7 @@ class SettingsDialog extends StatelessWidget { )), ), ), - const SizedBox(height: 5), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 20), - child: Divider( - height: 5, - ), - ), - const SizedBox(height: 4), const Padding( padding: EdgeInsets.symmetric(horizontal: 20.0), child: Text( diff --git a/pubspec.yaml b/pubspec.yaml index da1f2ff..0e26843 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,7 +63,8 @@ dependencies: connectivity_plus: ^6.1.3 photo_view: ^0.15.0 widget_zoom: ^0.0.4 - supabase_flutter: ^2.8.3 + supabase_flutter: ^2.8.4 + appwrite: ^14.0.0 flutter: sdk: flutter @@ -80,6 +81,9 @@ dev_dependencies: flutter_test: sdk: flutter +dependency_overrides: + flutter_web_auth_2: 4.1.0 + flutter_native_splash: android: true ios: true