Navigációs fejlesztések, kitűzési fejlesztések
This commit is contained in:
@@ -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<bool> 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<bool> 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<int>(
|
||||
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) {}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class MapView extends GetView<MapViewController> {
|
||||
children: [
|
||||
Text('Térkép'),
|
||||
Text(
|
||||
"Budapest",
|
||||
"Zalaegerszeg",
|
||||
style: TextStyle(fontSize: 12.0),
|
||||
)
|
||||
],
|
||||
@@ -89,8 +89,27 @@ class MapView extends GetView<MapViewController> {
|
||||
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,
|
||||
|
||||
@@ -6,7 +6,6 @@ class SettingsDialog extends StatelessWidget {
|
||||
final controller = Get.find<MapViewController>();
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user