Created ship vectors (not added yet)

Created menu
Created udp support
Created DockWidgets for compass and SOG/COG
This commit is contained in:
2025-09-03 15:40:02 +03:00
parent 2734560160
commit 25b1dabf73
70 changed files with 3145 additions and 293 deletions
@@ -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 : "не установлен"
);
}
}