Ntrip beállítások sheet, ntrip státusz sheet
This commit is contained in:
@@ -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 ──────────────────────────────────────────────
|
||||
|
||||
|
||||
Reference in New Issue
Block a user