sh123 2022-08-20 16:20:15 +03:00
rodzic e71a53c5be
commit 252ad5187c
2 zmienionych plików z 40 dodań i 2 usunięć

Wyświetl plik

@ -11,6 +11,8 @@ import android.util.Log;
import androidx.preference.PreferenceManager;
import com.radio.codec2talkie.app.AppMessage;
import com.radio.codec2talkie.protocol.aprs.AprsData;
import com.radio.codec2talkie.protocol.aprs.AprsDataFactory;
import com.radio.codec2talkie.protocol.message.TextMessage;
import com.radio.codec2talkie.protocol.position.Position;
import com.radio.codec2talkie.settings.PreferenceKeys;
@ -26,6 +28,7 @@ import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Timer;
@ -120,9 +123,14 @@ public class AprsIs implements Protocol, Runnable {
if (_isTxGateEnabled) {
// TODO, forward APRS-IS data to radio
}
AprsData aprsData = AprsDataFactory.fromAprsIs(line);
if (aprsData != null && aprsData.isValid()) {
// TODO, need to extract src, dst, digipath
// _parentProtocolCallback.onReceiveData(aprsData.);
}
_parentProtocolCallback.onReceiveLog(line);
}
return _childProtocol.receive() || line.length() > 0;
return _childProtocol.receive();
}
ProtocolCallback _protocolCallback = new ProtocolCallback() {
@ -284,7 +292,12 @@ public class AprsIs implements Protocol, Runnable {
}
if (bytesRead > 0 && buf[0] != '#') {
synchronized (_rxQueue) {
_rxQueue.put(Arrays.copyOf(buf, bytesRead));
try {
_rxQueue.put(Arrays.copyOf(buf, bytesRead));
} catch (BufferOverflowException e) {
e.printStackTrace();
_rxQueue.clear();
}
}
}
// write data

Wyświetl plik

@ -1,6 +1,7 @@
package com.radio.codec2talkie.protocol.aprs;
import java.nio.ByteBuffer;
import java.util.Arrays;
public class AprsDataFactory {
public static AprsData create(AprsDataType aprsDataType) {
@ -30,4 +31,28 @@ public class AprsDataFactory {
aprsData.fromBinary(srcCallsign, dstCallsign, digipath, data);
return aprsData;
}
public static AprsData fromAprsIs(String textData) {
String[] callsignData = textData.split(">");
if (callsignData.length < 2) return null;
String srcCallsign = callsignData[0];
String[] digipathData = callsignData[1].split(":");
if (digipathData.length < 2) return null;
String[] path = digipathData[0].split(",");
if (path.length == 0) return null;
String dstCallsign = path[0];
String data = digipathData[1];
String[] filteredPath = new String[path.length - 1];
System.arraycopy(path, 1, filteredPath, 0, path.length - 1);
StringBuilder digipath = new StringBuilder();
String sep = "";
for (String p : filteredPath) {
if (p.startsWith("WIDE")) {
digipath.append(sep);
digipath.append(p);
sep = ",";
}
}
return fromBinary(srcCallsign, dstCallsign, digipath.toString(), data.getBytes());
}
}