FT8CN/ft8cn/app/src/main/java/com/bg7yoz/ft8cn/flex/FlexRadioFactory.java

186 wiersze
5.4 KiB
Java
Czysty Zwykły widok Historia

package com.bg7yoz.ft8cn.flex;
import android.util.Log;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
// VITA 形成的发现消息解析器的枚举定义
//enum VitaTokens {
// nullToken ,
// ipToken,
// portToken,
// modelToken,
// serialToken,
// callsignToken,
// nameToken,
// dpVersionToken,
// versionToken,
// statusToken,
//};
/**
* RadioFactory
* RadioFactory: Radio Factory线FlexRadioflexRadios
*
* Upd4992广vitaflexRadios
* @author BGY70Z
* @date 2023-03-20
*/
public class FlexRadioFactory {
private static final String TAG="FlexRadioFactory";
private static final int FLEX_DISCOVERY_PORT =4992;
private static FlexRadioFactory instance=null;
private final RadioUdpClient broadcastClient ;
private OnFlexRadioEvents onFlexRadioEvents;
private Timer refreshTimer=null;
private TimerTask refreshTask=null;
public ArrayList<FlexRadio> flexRadios=new ArrayList<>();
/**
*
* @return
*/
public static FlexRadioFactory getInstance(){
if (instance==null){
instance= new FlexRadioFactory();
}
return instance;
}
public FlexRadioFactory() {
broadcastClient = new RadioUdpClient(FLEX_DISCOVERY_PORT);
broadcastClient.setOnUdpEvents(new RadioUdpClient.OnUdpEvents() {
@Override
public void OnReceiveData(DatagramSocket socket, DatagramPacket packet, byte[] data) {
VITA vita = new VITA(data);
if (vita.isAvailable//如果数据包有效且classId=0x534CFFFF,StreamId=0x800更新电台列表
&&vita.informationClassCode==VITA.FLEX_CLASS_ID
&&vita.packetClassCode==VITA.VS_Discovery
&&vita.streamId==VITA.FLEX_Discovery_stream_ID){
updateFlexRadioList(new String(vita.payload));
}
}
});
try {
broadcastClient.setActivated(true);
} catch (SocketException e) {
e.printStackTrace();
Log.e(TAG, "FlexRadioFactory: "+e.getMessage());
}
}
public void startRefreshTimer(){
if (refreshTimer==null) {
refreshTask=new TimerTask() {
@Override
public void run() {
Log.e(TAG, "run: 检查离线" );
checkOffLineRadios();
}
};
refreshTimer=new Timer();
refreshTimer.schedule(refreshTask, 1000, 1000);//检查电台列表中的电台是否在线(每一秒)
}
}
public void cancelRefreshTimer(){
if (refreshTimer!=null){
refreshTimer.cancel();
refreshTimer=null;
refreshTask.cancel();
refreshTask=null;
}
}
/**
*
* @param s
* @return
*/
private String getSerialNum(String s){
String[] strings=s.split(" ");
for (int i = 0; i <strings.length ; i++) {
if (strings[i].toLowerCase().startsWith("serial")){
return strings[i].substring("serial".length()+1);
}
}
return "";
}
/**
*
* @param serial
* @return
*/
public FlexRadio checkFlexRadioBySerial(String serial){
for (FlexRadio radio:flexRadios) {
if (radio.isEqual(serial)){
return radio;
}
}
return null;
}
private synchronized void updateFlexRadioList(String s){
String serial=getSerialNum(s);
if (serial.equals("")){return;}
FlexRadio radio=checkFlexRadioBySerial(serial);
if (radio!=null){
radio.updateLastSeen();
}else {
radio=new FlexRadio(s);
if (onFlexRadioEvents!=null){
onFlexRadioEvents.OnFlexRadioAdded(radio);
}
flexRadios.add(radio);
}
}
/**
* 线线线
*/
private void checkOffLineRadios(){
for (FlexRadio radio:flexRadios) {
if (radio.isInvalidNow()){
if (onFlexRadioEvents!=null){
onFlexRadioEvents.OnFlexRadioInvalid(radio);
}
}
}
}
//***********Getter****************
public RadioUdpClient getBroadcastClient() {
return broadcastClient;
}
public OnFlexRadioEvents getOnFlexRadioEvents() {
return onFlexRadioEvents;
}
public void setOnFlexRadioEvents(OnFlexRadioEvents onFlexRadioEvents) {
this.onFlexRadioEvents = onFlexRadioEvents;
}
//*********************************
/**
*
*/
public static interface OnFlexRadioEvents{
void OnFlexRadioAdded(FlexRadio flexRadio);
void OnFlexRadioInvalid(FlexRadio flexRadio);
}
}