Navigációs fejlesztések, kitűzési fejlesztések

This commit is contained in:
Török István 2025-03-10 13:33:21 +01:00
parent a46674844c
commit 6c7ceac1a6
11 changed files with 616 additions and 51 deletions

View File

@ -1,4 +1,7 @@
{ {
"java.configuration.updateBuildConfiguration": "interactive", "java.configuration.updateBuildConfiguration": "interactive",
"cmake.sourceDirectory": "${workspaceFolder}/linux/flutter" "cmake.sourceDirectory": "${workspaceFolder}/linux/flutter",
"editor.wordBasedSuggestions": "off",
"editor.tabCompletion": "onlySnippets",
"editor.selectionHighlight": false
} }

View File

@ -38,7 +38,7 @@ android {
versionCode flutter.versionCode versionCode flutter.versionCode
versionName flutter.versionName versionName flutter.versionName
archivesBaseName = "terepi_seged-${versionName}-${new Date().format('yyyyMMdd-HHmm')}" // archivesBaseName = "terepi_seged-${versionName}-${new Date().format('yyyyMMdd-HHmm')}"
// multiDexEnabled true // multiDexEnabled true
} }

3
devtools_options.yaml Normal file
View File

@ -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:

View File

@ -11,7 +11,7 @@ Future<void> main() async {
await Supabase.initialize( await Supabase.initialize(
url: 'https://supa.app-dev.hu', url: 'https://supa.app-dev.hu',
anonKey: anonKey:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJyb2xlIjogImFub24iLAogICJpc3MiOiAic3VwYWJhc2UiLAogICJpYXQiOiAxNzExMDYyMDAwLAogICJleHAiOiAxODY4ODI4NDAwCn0.XWtP3eEysZDxXjaHHUZyyhw0n4YZo_xWUMWS5ajBcbI'); 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.ewogICJyb2xlIjogImFub24iLAogICJpc3MiOiAic3VwYWJhc2UiLAogICJpYXQiOiAxNzQwMjY1MjAwLAogICJleHAiOiAxODk4MDMxNjAwCn0.4cMVfAnBLxne1lq0fm94rgtXLBJdRx-0f-E4Jd_jFwI');
runApp(const MyApp()); runApp(const MyApp());
} }

View File

@ -19,6 +19,7 @@ import 'package:nmea/nmea.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart' import 'package:permission_handler/permission_handler.dart'
as permission_handler; as permission_handler;
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:terepi_seged/eov/convert_coordinate.dart'; import 'package:terepi_seged/eov/convert_coordinate.dart';
import 'package:terepi_seged/eov/eov.dart'; import 'package:terepi_seged/eov/eov.dart';
import 'package:terepi_seged/gnss_sentences/gngga.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_to_measure.dart';
import 'package:terepi_seged/models/point_with_description_model.dart'; import 'package:terepi_seged/models/point_with_description_model.dart';
import 'package:proj4dart/proj4dart.dart' as proj4; import 'package:proj4dart/proj4dart.dart' as proj4;
import 'package:shared_preferences/shared_preferences.dart';
class MapViewController extends GetxController { class MapViewController extends GetxController {
// String gpsAddress = "E8:31:CD:14:8B:B2"; // String gpsAddress = "E8:31:CD:14:8B:B2";
// String gpsAddress = "98:CD:AC:62:FF:4E"; // String gpsAddress = "98:CD:AC:62:FF:4E";
RxString gpsAddress = "98:CD:AC:62:FF:36".obs; 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"; // String gpsName = "TiGNSS Rover-8BB2";
static const double maxZoomValue = 25.0; static const double maxZoomValue = 25.0;
Rx<bool> gpsIsConnected = false.obs; Rx<bool> gpsIsConnected = false.obs;
@ -65,6 +67,7 @@ class MapViewController extends GetxController {
RxDouble gpsLongitude = 0.0.obs; RxDouble gpsLongitude = 0.0.obs;
RxString gpsLongitudeDirection = "".obs; RxString gpsLongitudeDirection = "".obs;
RxDouble gpsAltitude = 0.0.obs; RxDouble gpsAltitude = 0.0.obs;
RxDouble gpsGeoidSeparation = 0.0.obs;
RxInt gpsQuality = 0.obs; RxInt gpsQuality = 0.obs;
RxDouble gpsLatitudeError = 0.0.obs; RxDouble gpsLatitudeError = 0.0.obs;
RxDouble gpsLongitudeError = 0.0.obs; RxDouble gpsLongitudeError = 0.0.obs;
@ -103,8 +106,8 @@ class MapViewController extends GetxController {
int pointId = 1; int pointId = 1;
String pointIdPrefix = ""; String pointIdPrefix = "";
String pointIdPostfix = ""; String pointIdPostfix = "";
String ntripUserName = ""; RxString ntripUserName = "".obs;
String ntripPassword = ""; RxString ntripPassword = "".obs;
Rx<bool> pointMeasuringDirectionForward = true.obs; Rx<bool> pointMeasuringDirectionForward = true.obs;
@ -115,7 +118,8 @@ class MapViewController extends GetxController {
late proj4.Projection eovProj, wgsProj; late proj4.Projection eovProj, wgsProj;
RxBool mapIsInitialized = false.obs; RxBool mapIsInitialized = false.obs;
GeoJsonParser parser = GeoJsonParser(defaultMarkerColor: Colors.yellow); GeoJsonParser parser =
GeoJsonParser(defaultMarkerColor: const Color.fromARGB(255, 85, 34, 49));
final CollectionReference _measuredPoints = final CollectionReference _measuredPoints =
FirebaseFirestore.instance.collection('measuredPoints'); FirebaseFirestore.instance.collection('measuredPoints');
@ -123,6 +127,12 @@ class MapViewController extends GetxController {
// late SMIBool gpsTrigger; // late SMIBool gpsTrigger;
// late StateMachineController riveGpsIconController; // late StateMachineController riveGpsIconController;
late SharedPreferences prefs;
late AuthResponse authResponse;
late Session? session;
late User? user;
@override @override
void onInit() async { void onInit() async {
super.onInit(); super.onInit();
@ -144,6 +154,26 @@ class MapViewController extends GetxController {
..registerTalkerSentence("RMC", (line) => Gnrmc(raw: line)) ..registerTalkerSentence("RMC", (line) => Gnrmc(raw: line))
..registerTalkerSentence("GST", (line) => Gngst(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(); mapController = MapController();
// riveGpsIconController = RiveUtils.getRiveController(Artboard(), // riveGpsIconController = RiveUtils.getRiveController(Artboard(),
@ -154,7 +184,7 @@ class MapViewController extends GetxController {
} }
@override @override
void onClose() { void onClose() async {
super.onClose(); super.onClose();
FlutterBluetoothSerial.instance.setPairingRequestHandler(null); FlutterBluetoothSerial.instance.setPairingRequestHandler(null);
if (gpsIsConnected.value) { if (gpsIsConnected.value) {
@ -169,6 +199,10 @@ class MapViewController extends GetxController {
pointPostfixController.dispose(); pointPostfixController.dispose();
ntripUsernameController.dispose(); ntripUsernameController.dispose();
ntripPasswordController.dispose(); ntripPasswordController.dispose();
await Supabase.instance.client
.channel('public:TerepiSeged_Receiver')
.unsubscribe();
} }
@override @override
@ -200,6 +234,30 @@ class MapViewController extends GetxController {
} else { } else {
print("No external storage permission"); 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(); directory = await getExternalStorageDirectory();
@ -228,7 +286,7 @@ class MapViewController extends GetxController {
} }
} }
gpsHeightController.text = '1.7'; gpsHeightController.text = '1.8';
} }
void _getInitialLocation() async { void _getInitialLocation() async {
@ -302,7 +360,9 @@ class MapViewController extends GetxController {
header += "User-Agent: SharpGps iter.dk\r\n"; header += "User-Agent: SharpGps iter.dk\r\n";
header += "Accept: */*\r\nConnection: close\r\n"; header += "Accept: */*\r\nConnection: close\r\n";
// header += "Authorization: Basic ${_toBase64("info@mail.app-dev.hu:")}\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:rtk2go.com:2101\r\n";
header += "Host:gnssnet.hu:2101\r\n"; header += "Host:gnssnet.hu:2101\r\n";
header += "Ntrip-Vesrsion:Ntrip/2.0\r\n"; header += "Ntrip-Vesrsion:Ntrip/2.0\r\n";
@ -412,6 +472,7 @@ class MapViewController extends GetxController {
gpsLongitude.value = sentence.longitude; gpsLongitude.value = sentence.longitude;
gpsLongitudeDirection.value = sentence.longitudeDirection; gpsLongitudeDirection.value = sentence.longitudeDirection;
gpsAltitude.value = sentence.altitudeAboveMeanSeaLevel; gpsAltitude.value = sentence.altitudeAboveMeanSeaLevel;
gpsGeoidSeparation.value = sentence.geoidSeparation;
gpsQuality.value = sentence.gpsQualityIndicator; gpsQuality.value = sentence.gpsQualityIndicator;
eov.value = ConvertCoordinate.ConvertWgsToEov( eov.value = ConvertCoordinate.ConvertWgsToEov(
gpsLatitude.value, gpsLongitude.value); gpsLatitude.value, gpsLongitude.value);
@ -441,7 +502,7 @@ class MapViewController extends GetxController {
(DateTime.now() (DateTime.now()
.difference(lastSendTimeGgaMessage) .difference(lastSendTimeGgaMessage)
.inSeconds >= .inSeconds >=
30)) { 5)) {
sendGgaMessage(lastGgaMessage); sendGgaMessage(lastGgaMessage);
print("Send GGA message: $lastGgaMessage"); print("Send GGA message: $lastGgaMessage");
ggaSenDataPacketNumber.value++; ggaSenDataPacketNumber.value++;
@ -723,6 +784,29 @@ class MapViewController extends GetxController {
"gpsHeight": gpsHeightController.text "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 (pointMeasuringDirectionForward.isTrue) {
if (pointsToMeasureSelectedValue.value < if (pointsToMeasureSelectedValue.value <
pointsToMeasure.length - 1) { 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<int>(
value: i,
child: Text('$id'),
));
}
}
}
pointsToMeasureSelectedValue.value = 0;
print('Converted points number -> ${pointsToMeasure.length}');
}
void pointsToMeasureSelectedValueChanged(int value) { void pointsToMeasureSelectedValueChanged(int value) {
pointsToMeasureSelectedValue.value = value; pointsToMeasureSelectedValue.value = value;
print('Selected point -> ${pointsToMeasureSelectedValue.value}'); print('Selected point -> ${pointsToMeasureSelectedValue.value}');
@ -887,4 +1044,22 @@ class MapViewController extends GetxController {
void showAddPointDialog() { void showAddPointDialog() {
onBottomNavigationBarTap(0); 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) {}
} }

View File

@ -30,7 +30,7 @@ class MapView extends GetView<MapViewController> {
children: [ children: [
Text('Térkép'), Text('Térkép'),
Text( Text(
"Budapest", "Zalaegerszeg",
style: TextStyle(fontSize: 12.0), style: TextStyle(fontSize: 12.0),
) )
], ],
@ -89,8 +89,27 @@ class MapView extends GetView<MapViewController> {
Padding( Padding(
padding: const EdgeInsets.only(right: 20.0), padding: const EdgeInsets.only(right: 20.0),
child: GestureDetector( child: GestureDetector(
onTap: () => Get.to(() => SettingsDialog(), onTap: () {
transition: Transition.downToUp), 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( child: const Icon(
Icons.more_vert, Icons.more_vert,
size: 26.0, size: 26.0,

View File

@ -6,7 +6,6 @@ class SettingsDialog extends StatelessWidget {
final controller = Get.find<MapViewController>(); final controller = Get.find<MapViewController>();
SettingsDialog({super.key}); SettingsDialog({super.key});
@override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: ListView( body: ListView(
@ -18,6 +17,19 @@ class SettingsDialog extends StatelessWidget {
children: [ children: [
IconButton( IconButton(
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(); Get.back();
}, },
icon: const Icon(Icons.close)), icon: const Icon(Icons.close)),
@ -25,7 +37,22 @@ class SettingsDialog extends StatelessWidget {
style: ButtonStyle( style: ButtonStyle(
overlayColor: overlayColor:
MaterialStateProperty.all(Colors.transparent)), 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( child: const Text(
'Bezár', 'Bezár',
style: TextStyle(color: Colors.blue, fontSize: 14.0), style: TextStyle(color: Colors.blue, fontSize: 14.0),
@ -48,12 +75,95 @@ class SettingsDialog extends StatelessWidget {
), ),
), ),
Obx(() => Column(children: [ 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( RadioListTile(
title: Text('TiGNSS Rover-FF4E'), title: Text('TiGNSS Rover-FF4E'),
value: '98:CD:AC:62:FF:4E', value: '98:CD:AC:62:FF:4E',
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
controller.gpsName.value = 'TiGNSS Rover-FF4E';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-FF4E');
}), }),
RadioListTile( RadioListTile(
title: Text('TiGNSS Rover-8BB2'), title: Text('TiGNSS Rover-8BB2'),
@ -61,7 +171,9 @@ class SettingsDialog extends StatelessWidget {
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
; controller.gpsName.value = 'TiGNSS Rover-8BB2';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-8BB2');
}), }),
RadioListTile( RadioListTile(
title: Text('TiGNSS Rover-FF36'), title: Text('TiGNSS Rover-FF36'),
@ -69,6 +181,9 @@ class SettingsDialog extends StatelessWidget {
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
controller.gpsName.value = 'TiGNSS Rover-FF36';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-FF36');
}) })
])), ])),
const Padding( const Padding(

View File

@ -12,6 +12,7 @@ import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_map_geojson/flutter_map_geojson.dart'; import 'package:flutter_map_geojson/flutter_map_geojson.dart';
import 'package:flutter_map_polywidget/flutter_map_polywidget.dart'; import 'package:flutter_map_polywidget/flutter_map_polywidget.dart';
import 'package:get/get.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/date_time_patterns.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:location/location.dart'; import 'package:location/location.dart';
@ -20,6 +21,7 @@ import 'package:nmea/nmea.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart' import 'package:permission_handler/permission_handler.dart'
as permission_handler; as permission_handler;
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:terepi_seged/eov/convert_coordinate.dart'; import 'package:terepi_seged/eov/convert_coordinate.dart';
import 'package:terepi_seged/eov/eov.dart'; import 'package:terepi_seged/eov/eov.dart';
import 'package:terepi_seged/gnss_sentences/gngga.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_to_measure.dart';
import 'package:terepi_seged/models/point_with_description_model.dart'; import 'package:terepi_seged/models/point_with_description_model.dart';
import 'package:proj4dart/proj4dart.dart' as proj4; import 'package:proj4dart/proj4dart.dart' as proj4;
import 'package:shared_preferences/shared_preferences.dart';
class NavigationViewController extends GetxController { class NavigationViewController extends GetxController {
// String gpsAddress = "E8:31:CD:14:8B:B2"; // String gpsAddress = "E8:31:CD:14:8B:B2";
// String gpsAddress = "98:CD:AC:62:FF:4E"; // String gpsAddress = "98:CD:AC:62:FF:4E";
RxString gpsAddress = "98:CD:AC:62:FF:36".obs; 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"; // String gpsName = "TiGNSS Rover-8BB2";
static const double maxZoomValue = 25.0; static const double maxZoomValue = 25.0;
Rx<bool> gpsIsConnected = false.obs; Rx<bool> gpsIsConnected = false.obs;
@ -118,11 +121,21 @@ class NavigationViewController extends GetxController {
final CollectionReference _vibratorTracker = final CollectionReference _vibratorTracker =
FirebaseFirestore.instance.collection('vibratorTracker'); FirebaseFirestore.instance.collection('vibratorTracker');
DateTime lastGpsDataSaveTime = DateTime(2000, 1, 1, 0, 0, 0); DateTime lastGpsDataSaveTime = DateTime(2000, 1, 1, 0, 0, 0);
int vehicleNumber = 2; RxInt vehicleNumber = 5.obs;
late Location internalGpsLogger; late Location internalGpsLogger;
Location internalGpsLocation = Location(); Location internalGpsLocation = Location();
late StreamSubscription<LocationData> internalGpsLocationSubscription; late StreamSubscription<LocationData> internalGpsLocationSubscription;
late List<Polyline<Object>> pathLayer = [];
RxString ntripUserName = "".obs;
RxString ntripPassword = "".obs;
late SharedPreferences prefs;
late AuthResponse authResponse;
late Session? session;
late User? user;
// late SMIBool gpsTrigger; // late SMIBool gpsTrigger;
// late StateMachineController riveGpsIconController; // late StateMachineController riveGpsIconController;
@ -146,13 +159,18 @@ class NavigationViewController extends GetxController {
..registerTalkerSentence("GST", (line) => Gngst(raw: line)); ..registerTalkerSentence("GST", (line) => Gngst(raw: line));
mapController = MapController(); 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(), // riveGpsIconController = RiveUtils.getRiveController(Artboard(),
// stateMachineName: "gps_Interactivity"); // stateMachineName: "gps_Interactivity");
// gpsTrigger = riveGpsIconController.findSMI("active"); // gpsTrigger = riveGpsIconController.findSMI("active");
mapIsInitialized.value = true; mapIsInitialized.value = true;
vehicleNumberController.text = vehicleNumber.toString();
} }
@override @override
@ -207,6 +225,37 @@ class NavigationViewController extends GetxController {
} else { } else {
print("No external storage permission"); 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(); directory = await getExternalStorageDirectory();
@ -276,16 +325,27 @@ class NavigationViewController extends GetxController {
internalGpsFile.writeAsString( internalGpsFile.writeAsString(
"$vehicleNumber;$time;$latitude;$longitude;$altitude;$accuracy\r\n"); "$vehicleNumber;$time;$latitude;$longitude;$altitude;$accuracy\r\n");
_vibratorTracker.add({ // _vibratorTracker.add({
"gpsType": 0, // "gpsType": 0,
"vibratorNumber": vehicleNumber, // "vibratorNumber": vehicleNumber.value,
"gpsDateTime": time, // "gpsDateTime": time,
"latitude": latitude, // "latitude": latitude,
"longitude": longitude, // "longitude": longitude,
"altitude": altitude, // "altitude": altitude,
"horizontalError": accuracy, // "horizontalError": accuracy,
"speed": speed, // "speed": speed,
"createdAt": DateTime.timestamp() // "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() { void _savePositionToDatabase() {
_vibratorTracker.add({ _vibratorTracker.add({
"gpsType": 1, "gpsType": 1,
"vibratorNumber": vehicleNumber, "vibratorNumber": vehicleNumber.value,
"gpsQuality": gpsQuality.value, "gpsQuality": gpsQuality.value,
"gpsDateTime": gpsDateTime.value, "gpsDateTime": gpsDateTime.value,
"latitude": gpsLatitude.value, "latitude": gpsLatitude.value,
@ -601,6 +661,24 @@ class NavigationViewController extends GetxController {
"antennaHeight": double.parse(gpsHeightController.text), "antennaHeight": double.parse(gpsHeightController.text),
"createdAt": DateTime.timestamp() "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(); lastGpsDataSaveTime = DateTime.now();
} }
@ -896,15 +974,15 @@ class NavigationViewController extends GetxController {
width: 15.0, width: 15.0,
height: 15.0, height: 15.0,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.purple, color: Colors.yellow,
shape: BoxShape.circle, shape: BoxShape.circle,
border: Border.all(width: 1.0, color: Colors.black)), border: Border.all(width: 1.0, color: Colors.black)),
))); )));
pointsToMeasureLabel.add(PolyWidget( pointsToMeasureLabel.add(PolyWidget(
center: LatLng(wgsCoord.y + 0.0000075, wgsCoord.x + 0.0000075), center: LatLng(wgsCoord.y + 0.0000275, wgsCoord.x + 0.0000275),
widthInMeters: 3, widthInMeters: 28,
heightInMeters: 3, heightInMeters: 28,
// constraints: const BoxConstraints( // constraints: const BoxConstraints(
// minWidth: 250, // minWidth: 250,
// maxWidth: 350, // 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) { void pointsToMeasureSelectedValueChanged(int value) {
pointsToMeasureSelectedValue.value = value; pointsToMeasureSelectedValue.value = value;
print('Selected point -> ${pointsToMeasureSelectedValue.value}'); print('Selected point -> ${pointsToMeasureSelectedValue.value}');
@ -964,4 +1060,23 @@ class NavigationViewController extends GetxController {
void addMeasuredPoint() { void addMeasuredPoint() {
// _measuredPoints.add({"id": 4001, "latitude": 46.3455, "longitude": 19.652}); // _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);
}
} }

View File

@ -28,7 +28,7 @@ class NavigationView extends GetView<NavigationViewController> {
children: [ children: [
Text('Navigáció'), Text('Navigáció'),
Text( Text(
"Mérés: Budapest-4", "Mérés: Zalaegerszeg",
style: TextStyle(fontSize: 12.0), style: TextStyle(fontSize: 12.0),
) )
], ],
@ -84,6 +84,16 @@ class NavigationView extends GetView<NavigationViewController> {
const Icon(Icons.file_open, size: 26.0, color: Colors.blue), 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(
padding: const EdgeInsets.only(right: 20.0), padding: const EdgeInsets.only(right: 20.0),
child: GestureDetector( child: GestureDetector(
@ -243,12 +253,13 @@ class NavigationView extends GetView<NavigationViewController> {
MarkerLayer( MarkerLayer(
markers: controller.currentLocationMarker), markers: controller.currentLocationMarker),
MarkerLayer(markers: controller.parser.markers), MarkerLayer(markers: controller.parser.markers),
PolylineLayer(polylines: controller.pathLayer),
MarkerLayer( MarkerLayer(
markers: controller.pointsToMeasureMarker), markers: controller.pointsToMeasureMarker),
// PolylineLayer( // PolylineLayer(
// polylines: controller.parser.polylines), // polylines: controller.parser.polylines),
PolyWidgetLayer( PolyWidgetLayer(
polyWidgets: controller.pointsToMeasureLabel) polyWidgets: controller.pointsToMeasureLabel),
], ],
) )
: const Center(child: CircularProgressIndicator()), : const Center(child: CircularProgressIndicator()),

View File

@ -1,13 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:get/get.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'; import 'package:terepi_seged/pages/navigation/presentation/controllers/navigation_controller.dart';
class SettingsDialog extends StatelessWidget { class SettingsDialog extends StatelessWidget {
final controller = Get.find<NavigationViewController>(); final controller = Get.find<NavigationViewController>();
SettingsDialog({super.key}); SettingsDialog({super.key});
@override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: ListView( body: ListView(
@ -19,8 +19,26 @@ class SettingsDialog extends StatelessWidget {
children: [ children: [
IconButton( IconButton(
onPressed: () { onPressed: () {
controller.vehicleNumber = if (controller.ntripUsernameController.text.isNotEmpty) {
int.parse(controller.vehicleNumberController.text); 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(); Get.back();
}, },
icon: const Icon(Icons.close)), icon: const Icon(Icons.close)),
@ -28,7 +46,29 @@ class SettingsDialog extends StatelessWidget {
style: ButtonStyle( style: ButtonStyle(
overlayColor: overlayColor:
MaterialStateProperty.all(Colors.transparent)), 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( child: const Text(
'Bezár', 'Bezár',
style: TextStyle(color: Colors.blue, fontSize: 14.0), style: TextStyle(color: Colors.blue, fontSize: 14.0),
@ -51,12 +91,95 @@ class SettingsDialog extends StatelessWidget {
), ),
), ),
Obx(() => Column(children: [ 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( RadioListTile(
title: Text('TiGNSS Rover-FF4E'), title: Text('TiGNSS Rover-FF4E'),
value: '98:CD:AC:62:FF:4E', value: '98:CD:AC:62:FF:4E',
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
controller.gpsName.value = 'TiGNSS Rover-FF4E';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-FF4E');
}), }),
RadioListTile( RadioListTile(
title: Text('TiGNSS Rover-8BB2'), title: Text('TiGNSS Rover-8BB2'),
@ -64,7 +187,9 @@ class SettingsDialog extends StatelessWidget {
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
; controller.gpsName.value = 'TiGNSS Rover-8BB2';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-8BB2');
}), }),
RadioListTile( RadioListTile(
title: Text('TiGNSS Rover-FF36'), title: Text('TiGNSS Rover-FF36'),
@ -72,6 +197,9 @@ class SettingsDialog extends StatelessWidget {
groupValue: controller.gpsAddress.value, groupValue: controller.gpsAddress.value,
onChanged: (value) { onChanged: (value) {
controller.gpsAddress.value = value!; controller.gpsAddress.value = value!;
controller.gpsName.value = 'TiGNSS Rover-FF36';
controller.saveGpsAddress(value);
controller.saveGpsName('TiGNSS Rover-FF36');
}) })
])), ])),
const Padding( const Padding(
@ -173,15 +301,7 @@ class SettingsDialog extends StatelessWidget {
)), )),
), ),
), ),
const SizedBox(height: 5), const SizedBox(height: 5),
const Padding(
padding: EdgeInsets.symmetric(horizontal: 20),
child: Divider(
height: 5,
),
),
const SizedBox(height: 4),
const Padding( const Padding(
padding: EdgeInsets.symmetric(horizontal: 20.0), padding: EdgeInsets.symmetric(horizontal: 20.0),
child: Text( child: Text(

View File

@ -63,7 +63,8 @@ dependencies:
connectivity_plus: ^6.1.3 connectivity_plus: ^6.1.3
photo_view: ^0.15.0 photo_view: ^0.15.0
widget_zoom: ^0.0.4 widget_zoom: ^0.0.4
supabase_flutter: ^2.8.3 supabase_flutter: ^2.8.4
appwrite: ^14.0.0
flutter: flutter:
sdk: flutter sdk: flutter
@ -80,6 +81,9 @@ dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
dependency_overrides:
flutter_web_auth_2: 4.1.0
flutter_native_splash: flutter_native_splash:
android: true android: true
ios: true ios: true