Navigációs fejlesztések, kitűzési fejlesztések
This commit is contained in:
@@ -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<bool> 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<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 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ class NavigationView extends GetView<NavigationViewController> {
|
||||
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<NavigationViewController> {
|
||||
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<NavigationViewController> {
|
||||
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()),
|
||||
|
||||
@@ -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<NavigationViewController>();
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user