Ntrip beállítások sheet, ntrip státusz sheet

This commit is contained in:
2026-07-05 15:48:33 +02:00
parent fa25a320eb
commit 2bd39fbd4e
6 changed files with 629 additions and 42 deletions
+99 -36
View File
@@ -9,6 +9,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:terepi_seged/services/gnss/gnss_connection.dart';
import 'package:terepi_seged/services/gnss/gnss_device_service.dart';
import 'package:terepi_seged/services/gnss/gnss_service.dart';
class NtripException implements Exception {
final String message;
@@ -37,6 +40,9 @@ class NtripService extends GetxService {
final ggaLastSentTime = ''.obs;
final lastError = ''.obs;
final lastRtcmAt = Rxn<DateTime>();
final connectedSince = Rxn<DateTime>();
// ── Beállítások ───────────────────────────────────────────────────
final host = ''.obs; // gnssnet.hu IP
final port = 2101.obs;
@@ -48,12 +54,12 @@ class NtripService extends GetxService {
bool get hasCompleteSettings =>
host.value.trim().isNotEmpty && mountpoint.value.trim().isNotEmpty;
// ── UI controllerek (beállítás dialóghoz) ────────────────────────
final hostController = TextEditingController();
final portController = TextEditingController();
final mountpointController = TextEditingController();
final usernameController = TextEditingController();
final passwordController = TextEditingController();
// // ── UI controllerek (beállítás dialóghoz) ────────────────────────
// final hostController = TextEditingController();
// final portController = TextEditingController();
// final mountpointController = TextEditingController();
// final usernameController = TextEditingController();
// final passwordController = TextEditingController();
// ── Belső állapot ────────────────────────────────────────────────
static const _secure = FlutterSecureStorage();
@@ -76,23 +82,61 @@ class NtripService extends GetxService {
Future<void> onInit() async {
super.onInit();
await _loadSettings();
_syncControllersFromValues();
// _syncControllersFromValues();
_wireGnssListener();
}
if (autoConnect.value && hasCompleteSettings) {
unawaited(connect().catchError((e) {
lastError.value = e.toString();
}));
void _wireGnssListener() {
if (!Get.isRegistered<GnssService>()) {
Future.delayed(const Duration(seconds: 2), _wireGnssListener);
}
ever<GnssConnectionState>(GnssService.to.connectionState, (state) {
if (state == GnssConnectionState.connected) {
final type = GnssService.to.activeConnectionType.value;
final isExternal = type == GnssConnectionType.btSerial ||
type == GnssConnectionType.ble;
if (isExternal &&
autoConnect.value &&
hasCompleteSettings &&
!isConnected.value) {
unawaited(connect().catchError((e) {
lastError.value = e.tostring();
}));
}
} else if (state == GnssConnectionState.disconnected ||
state == GnssConnectionState.error) {
if (isConnected.value) {
unawaited(disconnect());
}
}
});
}
void _ensureReceiverReady() {
if (!Get.isRegistered<GnssService>() ||
GnssService.to.connectionState.value != GnssConnectionState.connected) {
throw NtripException(
'Nincs csatlakoztatott GNSS vevő - előbb csatlakozz az eszközhöz, '
'utána indítható az NTRIP korrekció.');
}
final type = GnssService.to.activeConnectionType.value;
if (type == GnssConnectionType.phoneGps) {
throw NtripException(
'A telefon beépített GPS-e nem tud RTK korrekciókat fogadni - '
'az NTRIP használatához külső GNSS vevő szükséges');
}
}
@override
void onClose() {
disconnect();
hostController.dispose();
portController.dispose();
mountpointController.dispose();
usernameController.dispose();
passwordController.dispose();
// hostController.dispose();
// portController.dispose();
// mountpointController.dispose();
// usernameController.dispose();
// passwordController.dispose();
super.onClose();
}
@@ -101,11 +145,14 @@ class NtripService extends GetxService {
/// Kapcsolódás a casterhez. Megvárja a caster válaszát, és
/// [NtripException]-t dob értelmes üzenettel, ha valami nem stimmel
/// (rossz jelszó, rossz mountpoint, időtúllépés, hálózati hiba).
Future<void> connect() async {
Future<void> connect({bool bypassReceiverCheck = false}) async {
if (isConnected.value) return;
if (!hasCompleteSettings) {
throw NtripException('Hiányzó NTRIP beállítások (host / mountpoint).');
}
if (!bypassReceiverCheck) {
_ensureReceiverReady();
}
lastError.value = '';
_headerValidated = false;
@@ -140,6 +187,7 @@ class NtripService extends GetxService {
);
isConnected.value = true;
connectedSince.value = DateTime.now();
} on NtripException {
await _teardown();
rethrow;
@@ -165,6 +213,8 @@ class NtripService extends GetxService {
_socket?.destroy();
_socket = null;
isConnected.value = false;
connectedSince.value = null;
lastRtcmAt.value = null;
_headerValidated = false;
_headerBytes.clear();
}
@@ -175,6 +225,19 @@ class NtripService extends GetxService {
await connect();
}
Future<String> testConnection() async {
if (isConnected.value) {
throw NtripException('Már van élő NTRIP kapcsolat.');
}
try {
await connect(bypassReceiverCheck: true);
return 'A caster elfogadta a kapcsolatot - '
'a beállítások (jelszó, mountpoint) rendben vannak.';
} finally {
await disconnect();
}
}
// ── GGA küldés ───────────────────────────────────────────────────
/// Az NMEA feldolgozó hívja minden GGA mondatnál.
@@ -365,7 +428,7 @@ class NtripService extends GetxService {
this.password.value = password;
if (autoConnect != null) this.autoConnect.value = autoConnect;
_syncControllersFromValues();
// _syncControllersFromValues();
final prefs = await SharedPreferences.getInstance();
await prefs.setString('ntrip_host', this.host.value);
@@ -380,17 +443,17 @@ class NtripService extends GetxService {
await prefs.remove('ntrip_password');
}
Future<void> saveSettings() async {
await updateSettings(
host: hostController.text,
port: int.tryParse(portController.text) ?? 2101,
mountpoint: mountpointController.text,
username: usernameController.text,
password: passwordController.text.isNotEmpty
? passwordController.text
: password.value,
);
}
// Future<void> saveSettings() async {
// await updateSettings(
// host: hostController.text,
// port: int.tryParse(portController.text) ?? 2101,
// mountpoint: mountpointController.text,
// username: usernameController.text,
// password: passwordController.text.isNotEmpty
// ? passwordController.text
// : password.value,
// );
// }
Future<void> _loadSettings() async {
final prefs = await SharedPreferences.getInstance();
@@ -402,13 +465,13 @@ class NtripService extends GetxService {
autoConnect.value = prefs.getBool('ntrip_auto_connect') ?? false;
}
void _syncControllersFromValues() {
hostController.text = host.value;
portController.text = port.value.toString();
mountpointController.text = mountpoint.value;
usernameController.text = username.value;
// Jelszót nem pre-töltjük biztonsági okokból
}
// void _syncControllersFromValues() {
// hostController.text = host.value;
// portController.text = port.value.toString();
// mountpointController.text = mountpoint.value;
// usernameController.text = username.value;
// // Jelszót nem pre-töltjük biztonsági okokból
// }
// ── Segédfüggvények ──────────────────────────────────────────────