generated from Grigo/AndroidTemplate
Created ship vectors (not added yet)
Created menu Created udp support Created DockWidgets for compass and SOG/COG
This commit is contained in:
@@ -37,7 +37,10 @@ public class AppController implements
|
||||
|
||||
private boolean isUDPEnabled;
|
||||
private boolean isAndroidNMEAEnabled;
|
||||
private boolean isUDPNMEAEnabled;
|
||||
private boolean isGPSLocationEnabled;
|
||||
private int udpPort;
|
||||
private String dataMode;
|
||||
|
||||
// Callback для обновления UI
|
||||
private UIUpdateCallback uiUpdateCallback;
|
||||
@@ -82,7 +85,8 @@ public class AppController implements
|
||||
nmeaParser.setHybridMode(true);
|
||||
|
||||
// Инициализация UDP слушателя (порт 10110 - стандартный для AIS)
|
||||
udpListener = new UDPListener(10110);
|
||||
udpPort = 10110;
|
||||
udpListener = new UDPListener(udpPort);
|
||||
udpListener.setCallback(this);
|
||||
|
||||
// Инициализация Android NMEA слушателя (для курса, скорости, DOP)
|
||||
@@ -131,29 +135,10 @@ public class AppController implements
|
||||
});
|
||||
}
|
||||
|
||||
// Тестируем NMEA парсер (временно)
|
||||
testNMEAParser();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Тестирует NMEA парсер (временно для отладки)
|
||||
*/
|
||||
private void testNMEAParser() {
|
||||
Log.i(TAG, "Тестируем NMEA парсер...");
|
||||
|
||||
// Тестовые NMEA сообщения
|
||||
String[] testMessages = {
|
||||
"$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47",
|
||||
"$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A",
|
||||
"$GPVTG,054.7,T,034.4,M,005.5,N,010.2,K*48",
|
||||
"$GPGSA,A,3,01,02,03,04,05,06,07,08,09,10,11,12,1.2,0.8,1.0*3E"
|
||||
};
|
||||
|
||||
for (String message : testMessages) {
|
||||
Log.i(TAG, "Тестируем сообщение: " + message);
|
||||
nmeaParser.parseNMEA(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Останавливает все слушатели
|
||||
@@ -221,12 +206,7 @@ public class AppController implements
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает UDP порт
|
||||
*/
|
||||
public void setUDPPort(int port) {
|
||||
udpListener.setPort(port);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Отправляет данные по UDP
|
||||
@@ -328,7 +308,20 @@ public class AppController implements
|
||||
|
||||
@Override
|
||||
public void onVesselUpdated(Vessel vessel) {
|
||||
// В гибридном режиме обновляем только дополнительные данные
|
||||
Log.i(TAG, "🔄 onVesselUpdated вызван: lat=" + vessel.getLatitude() +
|
||||
", lon=" + vessel.getLongitude() +
|
||||
", course=" + vessel.getCourse() +
|
||||
", speed=" + vessel.getSpeed());
|
||||
|
||||
// Обновляем координаты, если они есть (для режима "только NMEA")
|
||||
if (vessel.getLatitude() != 0 && vessel.getLongitude() != 0) {
|
||||
ownVessel.setLatitude(vessel.getLatitude());
|
||||
ownVessel.setLongitude(vessel.getLongitude());
|
||||
Log.i(TAG, "📍 Координаты обновлены из NMEA: lat=" + vessel.getLatitude() +
|
||||
", lon=" + vessel.getLongitude());
|
||||
}
|
||||
|
||||
// Обновляем дополнительные данные
|
||||
if (vessel.getCourse() > 0) {
|
||||
ownVessel.setCourse(vessel.getCourse());
|
||||
updateCompass(); // Обновляем компас при изменении курса
|
||||
@@ -347,6 +340,20 @@ public class AppController implements
|
||||
", speed=" + vessel.getSpeed() +
|
||||
", satellites=" + vessel.getSatellites());
|
||||
|
||||
// Обновляем карту в главном потоке
|
||||
if (mapInterface != null) {
|
||||
Log.i(TAG, "Обновляем позицию на карте из NMEA...");
|
||||
new android.os.Handler(android.os.Looper.getMainLooper()).post(() -> {
|
||||
try {
|
||||
Log.i(TAG, "Вызываем mapInterface.updateOwnVesselPosition из NMEA...");
|
||||
mapInterface.updateOwnVesselPosition(ownVessel);
|
||||
Log.i(TAG, "Позиция на карте обновлена из NMEA");
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Ошибка обновления позиции на карте из NMEA: " + e.getMessage(), e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Обновляем UI
|
||||
if (uiUpdateCallback != null) {
|
||||
uiUpdateCallback.onVesselPositionUpdated(ownVessel);
|
||||
@@ -592,4 +599,111 @@ public class AppController implements
|
||||
executor.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
// Методы для управления настройками
|
||||
|
||||
/**
|
||||
* Устанавливает UDP порт
|
||||
*/
|
||||
public void setUDPPort(int port) {
|
||||
if (port < 1 || port > 65535) {
|
||||
Log.w(TAG, "Некорректный UDP порт: " + port);
|
||||
return;
|
||||
}
|
||||
|
||||
this.udpPort = port;
|
||||
Log.i(TAG, "UDP порт установлен: " + port);
|
||||
|
||||
// Если UDP слушатель уже создан, нужно будет его пересоздать
|
||||
if (udpListener != null && udpListener.getPort() != port) {
|
||||
Log.i(TAG, "UDP порт изменен, потребуется перезапуск UDP слушателя");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает текущий UDP порт
|
||||
*/
|
||||
public int getUDPPort() {
|
||||
return udpPort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Включает/выключает UDP NMEA
|
||||
*/
|
||||
public void setUDPNMEAEnabled(boolean enabled) {
|
||||
this.isUDPNMEAEnabled = enabled;
|
||||
Log.i(TAG, "UDP NMEA: " + (enabled ? "включен" : "выключен"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, включен ли UDP NMEA
|
||||
*/
|
||||
public boolean isUDPNMEAEnabled() {
|
||||
return isUDPNMEAEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Устанавливает режим работы с данными
|
||||
*/
|
||||
public void setDataMode(String mode) {
|
||||
this.dataMode = mode;
|
||||
Log.i(TAG, "🔄 Режим данных установлен: " + mode);
|
||||
|
||||
// Применяем режим к NMEA парсеру
|
||||
if (nmeaParser != null) {
|
||||
boolean hybridMode = "hybrid".equals(mode);
|
||||
nmeaParser.setHybridMode(hybridMode);
|
||||
Log.i(TAG, "📍 Гибридный режим NMEA парсера: " + hybridMode);
|
||||
Log.i(TAG, "📍 В режиме '" + mode + "' координаты будут " +
|
||||
(hybridMode ? "браться из Android GPS API" : "браться из NMEA сообщений"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает текущий режим работы с данными
|
||||
*/
|
||||
public String getDataMode() {
|
||||
return dataMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Перезапускает UDP слушатель с новым портом
|
||||
*/
|
||||
public void restartUDPListener() {
|
||||
if (udpListener != null) {
|
||||
Log.i(TAG, "Перезапускаем UDP слушатель с портом: " + udpPort);
|
||||
|
||||
// Останавливаем текущий слушатель
|
||||
udpListener.stop();
|
||||
udpListener.cleanup();
|
||||
|
||||
// Создаем новый слушатель с новым портом
|
||||
udpListener = new UDPListener(udpPort);
|
||||
udpListener.setCallback(this);
|
||||
|
||||
// Запускаем, если UDP включен
|
||||
if (isUDPEnabled) {
|
||||
udpListener.start();
|
||||
Log.i(TAG, "UDP слушатель перезапущен на порту: " + udpPort);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает статус всех настроек
|
||||
*/
|
||||
public String getSettingsStatus() {
|
||||
return String.format(
|
||||
"UDP: порт=%d, включен=%s, NMEA=%s\n" +
|
||||
"Android NMEA: %s\n" +
|
||||
"GPS Location: %s\n" +
|
||||
"Режим данных: %s",
|
||||
udpPort,
|
||||
isUDPEnabled ? "да" : "нет",
|
||||
isUDPNMEAEnabled ? "включен" : "выключен",
|
||||
isAndroidNMEAEnabled ? "включен" : "выключен",
|
||||
isGPSLocationEnabled ? "включен" : "выключен",
|
||||
dataMode != null ? dataMode : "не установлен"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user