xyh пре 3 месеци
родитељ
комит
9a9e449199

+ 27 - 0
src/main/java/com/example/backend/controller/RadarStatusController.java

@@ -290,4 +290,31 @@ public class RadarStatusController {
             throw new ServiceException("获取干扰列表数据失败");
         }
     }
+
+    @PostMapping("/platform/{platformId}/setEcmParam")
+    public ResponseEntity<Void> setEcmParam(
+            @PathVariable @NotBlank String platformId,
+            @RequestBody @Valid ecmParams params) {
+        logger.info("平台 {} 发送消息", platformId);
+        try {
+            radarStatusService.setEcmParam(platformId,params);
+            return ResponseEntity.ok().build();
+        } catch (Exception e) {
+            logger.error("发送消息失败", e);
+            throw new ServiceException("发送消息失败");
+        }
+    }
+
+    @GetMapping("/platform/{platformId}/getTeamMemberByID")
+    public ResponseEntity<List<String>> getTeamMemberByID(
+            @PathVariable @NotBlank String platformId) {
+        logger.info("获取平台 {} 的编队成员数据", platformId);
+        try {
+            List<String> list = radarStatusService.getTeamMemberByID(platformId);
+            return ResponseEntity.ok(list);
+        } catch (Exception e) {
+            logger.error("获取编队成员数据失败", e);
+            throw new ServiceException("获取编队成员数据失败");
+        }
+    }
 }

+ 38 - 1
src/main/java/com/example/backend/dds/DataReaderListenerImpl.java

@@ -25,10 +25,14 @@ public class DataReaderListenerImpl extends DDS._DataReaderListenerLocalBase {
     private int num_msgs = 0;
     public int isInit = 0;
     public int isRecall = 0;
+    public int isTeam = 0;
+    public int versionID = 1;
     public String text = "";
     private static final int N_EXPECTED = 40;
     private ArrayList<Boolean> counts = new ArrayList<Boolean>(N_EXPECTED);
-    public Map<String, Position> positionMap = new HashMap<>();
+    public Map<String, Position> positionMap = new ConcurrentHashMap<>();
+    public Map<String, Position> radarPositionMap = new ConcurrentHashMap<>();
+    public Map<String, List<String>> coopTeamMap = new ConcurrentHashMap<>();
     public final Map<String, List<com.example.backend.model.Message>> messageList = new ConcurrentHashMap<>();
 
     private void initialize_counts() {
@@ -105,6 +109,7 @@ public class DataReaderListenerImpl extends DDS._DataReaderListenerLocalBase {
                     String[] messageList = message.split("\n");
                     String[] countList = messageList[0].split(" ");
                     int count = Integer.parseInt(countList[0]);
+                    int radarCount = Integer.parseInt(countList[1]);
                     for(int i=1;i<=count;i++){
                         String[] s = messageList[i].split(" ");
                         Position p = new Position();
@@ -116,6 +121,17 @@ public class DataReaderListenerImpl extends DDS._DataReaderListenerLocalBase {
                         p.z = Double.parseDouble(s[6]);
                         positionMap.put(s[0],p);
                     }
+                    for(int i=count+1;i<=radarCount+count;i++){
+                        String[] s = messageList[i].split(" ");
+                        Position p = new Position();
+                        p.coopID = "未知";
+                        p.jaming = "未知";
+                        p.isReal = "未知";
+                        p.x = Double.parseDouble(s[4]);
+                        p.y = Double.parseDouble(s[5]);
+                        p.z = Double.parseDouble(s[6]);
+                        radarPositionMap.put(s[0],p);
+                    }
                     //回复初始化应答
                     isRecall = 1;
                 }
@@ -171,6 +187,23 @@ public class DataReaderListenerImpl extends DDS._DataReaderListenerLocalBase {
                     messageList.put(recivier,list);
 
                 }
+                if(mh.value.subject.equals("4")){
+                    //收到网络分组信息
+                    String message = mh.value.text;
+                    String[] messageList = message.split("\n");
+                    String[] countList = messageList[0].split(" ");
+                    if(Integer.parseInt(countList[2])<=versionID)return;//旧版本或重复
+                    for(int i=1;i<=Integer.parseInt(countList[0]);i++){
+                        String[] s = messageList[i].split(" ");
+                        String coopID = s[0];
+                        List<String> list = new ArrayList<>();
+                        for(int j=2;j<s.length;j++){
+                            list.add(s[j]);
+                        }
+                        coopTeamMap.put(coopID,list);
+                    }
+                    isTeam = 1;
+                }
                 if (invalid_count == true) {
                     System.out.println("ERROR: Invalid message.count (" + mh.value.count + ")");
                 }
@@ -234,8 +267,12 @@ public class DataReaderListenerImpl extends DDS._DataReaderListenerLocalBase {
 
     public void resetAll(){
         this.positionMap.clear();
+        this.radarPositionMap.clear();
+        this.coopTeamMap.clear();
+        this.messageList.clear();
         this.isInit = 0;
         this.isRecall = 0;
+        this.isTeam = 0;
     }
 
     public void report_validity() {

+ 72 - 5
src/main/java/com/example/backend/service/RadarStatusService.java

@@ -63,6 +63,7 @@ public class RadarStatusService {
                     this.messageList.clear();
                     this.messageStatusMap.clear();
                     this.outmessageList.clear();
+                    this.ecmParamsList.clear();
                 }
                 if (subscriber.listener.isInit==1&&subscriber.listener.isRecall==1) {
                     try {
@@ -80,6 +81,9 @@ public class RadarStatusService {
                     subscriber.listener.isRecall=0;
                     init();
                 }
+                if(subscriber.listener.isInit==1){
+                    checkTargets();
+                }
                 if(subscriber.listener.isInit==0){
                     //未初始化,发送初始化请求
                     try {
@@ -93,6 +97,19 @@ public class RadarStatusService {
 
                     }  // 回复初始化应答
                 }
+                if(subscriber.listener.isTeam==0&&subscriber.listener.isInit==1){
+                    //未分组,发送网络分组请求
+                    try {
+                        publisher.publishMessage(
+                                "2",
+                                "41",
+                                "这是网络分组请求"
+                        );
+
+                    } catch (Exception e) {
+
+                    }
+                }
             }
         }
     }
@@ -116,12 +133,10 @@ public class RadarStatusService {
         platformRadarMap.put(platformId, initDefaultPlatform(platformId));
         platformParamsMap.put(platformId, initDefaultParams());
         Queue<RadarTarget> queue = new ConcurrentLinkedQueue<>();
-        queue.addAll(initDefaultTargets());
         platformTargetsMap.put(platformId, queue);
         MessageStatus m = new MessageStatus();
         messageStatusMap.put(platformId,m);
-        //messageList.put(platformId,initDefaultMessage(platformId));
-        //outmessageList.put(platformId,initDefaultMessage(platformId));
+        ecmParamsList.put(platformId,new ArrayList<>());
     }
 
     public List<Map<String, Object>> getRadarStatus(String platformId) {
@@ -276,9 +291,8 @@ public class RadarStatusService {
     public List<RadarTarget> getRadarTargets(String platformId) {
         logger.info("获取平台 {} 的目标数据", platformId);
         Queue<RadarTarget> queue = platformTargetsMap.computeIfAbsent(platformId, k -> {
-            logger.info("平台 {} 不存在,创建默认目标数据队列", platformId);
+            logger.info("平台 {} 不存在", platformId);
             Queue<RadarTarget> newQueue = new ConcurrentLinkedQueue<>();
-            newQueue.addAll(initDefaultTargets());
             return newQueue;
         });
         return new ArrayList<>(queue);
@@ -425,6 +439,26 @@ public class RadarStatusService {
         return ecmParamsList.get(platformID);
     }
 
+    public void setEcmParam(String platformID,ecmParams params){
+       List<ecmParams> list = ecmParamsList.get(platformID);
+       list.add(params);
+       ecmParamsList.put(platformID,list);
+    }
+
+    //编队成员方法
+    public List<String> getTeamMemberByID(String platformID) {
+        for(List<String> list : subscriber.listener.coopTeamMap.values()){
+            if(list.contains(platformID)){
+                return list;
+            }
+        }
+        List<String> list = new ArrayList<>();
+        list.add("101");
+        list.add("102");
+        list.add("103");
+        return list;
+    }
+
     // 初始化默认目标数据
     private List<RadarTarget> initDefaultTargets() {
         List<RadarTarget> defaultTargets = new ArrayList<>();
@@ -455,4 +489,37 @@ public class RadarStatusService {
         }
         else return "7";
     }
+
+    private void checkTargets(){
+        platformTargetsMap.clear();
+        for(String missile : subscriber.listener.positionMap.keySet()){
+            Queue<RadarTarget> queue = new ConcurrentLinkedQueue<>();
+            for(String radar : subscriber.listener.radarPositionMap.keySet()){
+                Position thisMissile = subscriber.listener.positionMap.get(missile);
+                Position thisRadar = subscriber.listener.radarPositionMap.get(radar);
+                if(Math.sqrt((thisMissile.x-thisRadar.x)*(thisMissile.x-thisRadar.x)+(thisMissile.y-thisRadar.y)*(thisMissile.y-thisRadar.y)+(thisMissile.z-thisRadar.z)*(thisMissile.z-thisRadar.z))<=1000000){
+                    //进入侦察范围
+                    RadarTarget target = new RadarTarget();
+                    double dx = thisMissile.x-thisRadar.x;
+                    double dy = thisMissile.y-thisRadar.y;
+                    double dz = thisMissile.z-thisRadar.z;
+                    double azi,elv;
+                    azi = dx==0&&dy==0 ? 0.0 : Math.toDegrees(Math.atan2(dx,dy));
+                    azi = azi<0 ? azi+360 : azi;
+                    elv = Math.toDegrees(Math.atan2(dz,Math.sqrt(dx*dx+dy*dy)));
+                    target.setTargetId(Integer.valueOf(radar));
+                    target.setEnemyPro("未知");
+                    target.setFlightState("未知");
+                    target.setLightQuality("未知");
+                    target.setSimTime("未知");
+                    target.setTargetDistance(Math.sqrt((thisMissile.x-thisRadar.x)*(thisMissile.x-thisRadar.x)+(thisMissile.y-thisRadar.y)*(thisMissile.y-thisRadar.y)+(thisMissile.z-thisRadar.z)*(thisMissile.z-thisRadar.z)));
+                    target.setTargetAzi(azi);
+                    target.setTargetEle(elv);
+                    target.setTargetRSpeed(0);
+                    queue.add(target);
+                }
+            }
+            platformTargetsMap.put(missile,queue);
+        }
+    }
 }