RadarStatusService.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608
  1. package com.example.backend.service;
  2. import com.example.backend.dds.TestSubscriber;
  3. import com.example.backend.dds.TestPublisher;
  4. import com.example.backend.model.*;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.scheduling.annotation.Async;
  7. import org.springframework.scheduling.annotation.Scheduled;
  8. import org.springframework.stereotype.Service;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import java.time.LocalDateTime;
  12. import java.time.format.DateTimeFormatter;
  13. import java.util.*;
  14. import java.util.concurrent.*;
  15. import jakarta.annotation.PostConstruct;
  16. @Service
  17. public class RadarStatusService {
  18. private static final Logger logger = LoggerFactory.getLogger(RadarStatusService.class);
  19. ExecutorService e = Executors.newSingleThreadExecutor();
  20. private final Map<String, RadarStatus> platformRadarMap = new ConcurrentHashMap<>();
  21. private final Map<String, List<RadarParam>> platformParamsMap = new ConcurrentHashMap<>();
  22. private final Map<String, Queue<RadarTarget>> platformTargetsMap = new ConcurrentHashMap<>();
  23. private final Map<String, MessageStatus> messageStatusMap = new ConcurrentHashMap<>();
  24. private final Map<String, List<Message>> messageList = new ConcurrentHashMap<>();
  25. private final Map<String, List<Message>> outmessageList = new ConcurrentHashMap<>();
  26. private final Map<String, List<ecmParams>> ecmParamsList = new ConcurrentHashMap<>();
  27. private final Map<String, ecmStatus> ecmStatusList = new ConcurrentHashMap<>();
  28. public final TestSubscriber subscriber = new TestSubscriber();
  29. public final TestPublisher publisher = new TestPublisher();
  30. // 设置队列最大容量
  31. private static final int MAX_QUEUE_SIZE = 100;
  32. public RadarStatusService() throws Exception {
  33. }
  34. @Async
  35. @Scheduled(fixedRate = 6000) // 每3秒执行一次
  36. public void checkInitStateTask() {
  37. if (subscriber != null && subscriber.listener != null) {
  38. try {//发送心跳信息
  39. publisher.publishMessage(
  40. "5",
  41. "8",
  42. "这是心跳信息"
  43. );
  44. } catch (Exception e) {
  45. }
  46. synchronized (subscriber.listener) {
  47. // 读写操作
  48. // 根据你的具体业务逻辑判断状态
  49. if(subscriber.listener.isInit==0){
  50. this.messageList.clear();
  51. this.messageStatusMap.clear();
  52. this.outmessageList.clear();
  53. this.ecmParamsList.clear();
  54. }
  55. if (subscriber.listener.isInit==1&&subscriber.listener.isRecall==1) {
  56. try {
  57. subscriber.listener.isRecall=0;
  58. publisher.publishMessage(
  59. "5",
  60. "11",
  61. "这是初始化应答"
  62. );
  63. } catch (Exception e) {
  64. } // 回复初始化应答
  65. subscriber.listener.isRecall=0;
  66. init();
  67. }
  68. if(subscriber.listener.isInit==1){
  69. checkTargets();
  70. }
  71. if(subscriber.listener.isInit==0){
  72. //未初始化,发送初始化请求
  73. try {
  74. publisher.publishMessage(
  75. "5",
  76. "12",
  77. "这是初始化请求"
  78. );
  79. } catch (Exception e) {
  80. } // 回复初始化应答
  81. }
  82. if(subscriber.listener.isTeam==0&&subscriber.listener.isInit==1){
  83. //未分组,发送网络分组请求
  84. try {
  85. publisher.publishMessage(
  86. "5",
  87. "41",
  88. "这是网络分组请求"
  89. );
  90. } catch (Exception e) {
  91. }
  92. }
  93. if(subscriber.listener.isTeam==1&&subscriber.listener.isInit==1&&subscriber.listener.isCoopParamsInit==0){
  94. //未初始化参数 发送请求
  95. try {
  96. publisher.publishMessage(
  97. "5",
  98. "101",
  99. "这是分组参数初始化请求"
  100. );
  101. } catch (Exception e) {
  102. }
  103. }
  104. }
  105. }
  106. }
  107. @PostConstruct
  108. public void init() {
  109. // 初始化默认平台的状态和参数
  110. for(String key : subscriber.listener.radarPositionMap.keySet()){
  111. initializePlatform(key);
  112. }
  113. }
  114. public Set<String> getPlatforms(){
  115. return subscriber.listener.radarPositionMap.keySet();
  116. }
  117. // 初始化平台数据
  118. private void initializePlatform(String platformId) {
  119. logger.info("初始化平台 {} 的数据", platformId);
  120. platformRadarMap.put(platformId, initDefaultPlatform(platformId));
  121. platformParamsMap.put(platformId, initDefaultParams());
  122. Queue<RadarTarget> queue = new ConcurrentLinkedQueue<>();
  123. platformTargetsMap.put(platformId, queue);
  124. MessageStatus m = new MessageStatus();
  125. messageStatusMap.put(platformId,m);
  126. ecmParamsList.put(platformId,new ArrayList<>());
  127. sdrStatus s = new sdrStatus();
  128. if(platformId.equals(subscriber.listener.realJamID)||platformId.equals(subscriber.listener.realRadarID)){
  129. s.platformStatus = "离线";
  130. s.serviceStatus = "无法提供";
  131. s.jamingPolicy = "无";
  132. s.investingPolicy = "无";
  133. subscriber.listener.sdrStatueMap.put(platformId,s);
  134. }
  135. else{
  136. s.platformStatus = "此设备并未采用半实物设备模拟";
  137. s.serviceStatus = "此设备并未采用半实物设备模拟";
  138. s.jamingPolicy = "此设备并未采用半实物设备模拟";
  139. s.investingPolicy = "此设备并未采用半实物设备模拟";
  140. subscriber.listener.sdrStatueMap.put(platformId,s);
  141. }
  142. }
  143. public List<Map<String, Object>> getRadarStatus(String platformId) {
  144. logger.info("获取平台 {} 的雷达状态", platformId);
  145. RadarStatus status = platformRadarMap.computeIfAbsent(platformId, this::initDefaultPlatform);
  146. return convertToKeyValueList(status);
  147. }
  148. public String getIsReal(String platformId) {
  149. logger.info("获取平台 {} 的是否半实物", platformId);
  150. Position p = subscriber.listener.positionMap.get(platformId);
  151. String s = p.isReal.equals("2") ? "是" : "否";
  152. return s;
  153. }
  154. public RadarStatus updateRadarStatus(String platformId, RadarStatus updatedStatus) {
  155. if (updatedStatus == null) {
  156. logger.error("尝试更新空的雷达状态");
  157. throw new IllegalArgumentException("雷达状态不能为空");
  158. }
  159. logger.info("更新平台 {} 的雷达状态", platformId);
  160. updatedStatus.setPlatformId(platformId);
  161. platformRadarMap.put(platformId, updatedStatus);
  162. try {
  163. publisher.publishMessage(
  164. "RadarSystem",
  165. "DetectionUpdate",
  166. "XYH"
  167. );
  168. } catch (Exception e) {
  169. }
  170. return updatedStatus;
  171. }
  172. // 辅助方法,创建一个 key-value 对
  173. private Map<String, Object> createKeyValue(String key, Object value) {
  174. Map<String, Object> map = new HashMap<>();
  175. map.put("key", key);
  176. map.put("value", value);
  177. return map;
  178. }
  179. // 将雷达状态转换为前端需要的格式
  180. private List<Map<String, Object>> convertToKeyValueList(RadarStatus status) {
  181. List<Map<String, Object>> radarStatusList = new ArrayList<>();
  182. // 添加平台ID到返回数据中
  183. radarStatusList.add(createKeyValue("平台编号", status.getPlatformId()));
  184. // 只包含雷达状态数据
  185. radarStatusList.add(createKeyValue("型号", status.getModel()));
  186. radarStatusList.add(createKeyValue("序号", status.getSerialNumber()));
  187. radarStatusList.add(createKeyValue("类型", status.getType()));
  188. radarStatusList.add(createKeyValue("连接方式", status.getConnectionType()));
  189. radarStatusList.add(createKeyValue("开机时间", status.getStartupTime()));
  190. radarStatusList.add(createKeyValue("发现概率(%)", status.getDetectionProbability()));
  191. radarStatusList.add(createKeyValue("虚警率(%)", status.getFalseAlarmRate()));
  192. radarStatusList.add(createKeyValue("扫描周期(s)", status.getScanCycle()));
  193. radarStatusList.add(createKeyValue("波束指向方位角", status.getBeamAzimuth()));
  194. radarStatusList.add(createKeyValue("波束指向俯仰角", status.getBeamElevation()));
  195. radarStatusList.add(createKeyValue("天线最大增益(dB)", status.getAntennaGain()));
  196. radarStatusList.add(createKeyValue("副瓣增益(dB)", status.getSideLobeGain()));
  197. return radarStatusList;
  198. }
  199. private RadarStatus initDefaultPlatform(String platformId) {
  200. RadarStatus defaultStatus = new RadarStatus();
  201. defaultStatus.setPlatformId(platformId);
  202. defaultStatus.setModel("默认型号测试数据");
  203. defaultStatus.setSerialNumber("000000");
  204. defaultStatus.setType("默认类型");
  205. defaultStatus.setConnectionType("TCP");
  206. defaultStatus.setStartupTime("2024-01-01 00:00:00");
  207. defaultStatus.setDetectionProbability(90.0);
  208. defaultStatus.setFalseAlarmRate(0.1);
  209. defaultStatus.setScanCycle(10);
  210. defaultStatus.setBeamAzimuth(0);
  211. defaultStatus.setBeamElevation(0);
  212. defaultStatus.setAntennaGain(30.0);
  213. defaultStatus.setSideLobeGain(-20.0);
  214. return defaultStatus;
  215. }
  216. // 获取雷达参数
  217. public List<RadarParam> getRadarParams(String platformId) {
  218. logger.info("获取平台 {} 的雷达参数", platformId);
  219. return platformParamsMap.computeIfAbsent(platformId, k -> {
  220. logger.info("平台 {} 不存在,创建默认参数", platformId);
  221. return initDefaultParams();
  222. });
  223. }
  224. // 更新雷达参数
  225. public List<RadarParam> updateRadarParams(String platformId, List<RadarParam> radarParams) {
  226. if (radarParams == null || radarParams.isEmpty()) {
  227. logger.error("尝试更新空的雷达参数列表");
  228. throw new IllegalArgumentException("雷达参数不能为空");
  229. }
  230. logger.info("更新平台 {} 的雷达参数,参数数量: {}", platformId, radarParams.size());
  231. // 验证参数的合法性
  232. validateRadarParams(radarParams);
  233. // 存储参数
  234. platformParamsMap.put(platformId, new ArrayList<>(radarParams));
  235. try {
  236. publisher.publishMessage(
  237. "RadarSystem",
  238. "DetectionUpdate",
  239. "XYH"
  240. );
  241. } catch (Exception e) {
  242. }
  243. System.out.println(subscriber.getText());
  244. return radarParams;
  245. }
  246. // 获取位置信息
  247. public Position getPositionById(String platformId) {
  248. for(String key : subscriber.listener.radarPositionMap.keySet()){
  249. if(key.equals(platformId)){
  250. return subscriber.listener.radarPositionMap.get(key);
  251. }
  252. }
  253. return null;
  254. }
  255. // 验证雷达参数的合法性
  256. private void validateRadarParams(List<RadarParam> params) {
  257. if (params.stream().anyMatch(p -> p.getKey() == null || p.getKey().trim().isEmpty())) {
  258. throw new IllegalArgumentException("参数键不能为空");
  259. }
  260. if (params.stream().anyMatch(p -> p.getValue() == null)) {
  261. throw new IllegalArgumentException("参数值不能为空");
  262. }
  263. }
  264. // 初始化默认参数
  265. private List<RadarParam> initDefaultParams() {
  266. List<RadarParam> defaultParams = new ArrayList<>();
  267. defaultParams.add(new RadarParam("开关机状态", "打开"));
  268. defaultParams.add(new RadarParam("抗干扰措施", "频率捷变"));
  269. defaultParams.add(new RadarParam("工作模式", "搜索"));
  270. defaultParams.add(new RadarParam("脉冲参数", "自动"));
  271. defaultParams.add(new RadarParam("方位扫描中心(°)", "0"));
  272. defaultParams.add(new RadarParam("俯仰扫描中心(°)", "0"));
  273. defaultParams.add(new RadarParam("波束宽度(°)", "2"));
  274. defaultParams.add(new RadarParam("方位扫描范围(°)", "10"));
  275. defaultParams.add(new RadarParam("俯仰扫描范围(°)", "10"));
  276. defaultParams.add(new RadarParam("发射机功率(W)", "100"));
  277. return defaultParams;
  278. }
  279. // 修改获取目标数据的方法
  280. public List<RadarTarget> getRadarTargets(String platformId) {
  281. logger.info("获取平台 {} 的目标数据", platformId);
  282. Queue<RadarTarget> queue = platformTargetsMap.computeIfAbsent(platformId, k -> {
  283. logger.info("平台 {} 不存在", platformId);
  284. Queue<RadarTarget> newQueue = new ConcurrentLinkedQueue<>();
  285. return newQueue;
  286. });
  287. return new ArrayList<>(queue);
  288. }
  289. // 修改更新目标数据的方法
  290. public List<RadarTarget> updateRadarTargets(String platformId, List<RadarTarget> targets) {
  291. if (targets == null || targets.isEmpty()) {
  292. logger.error("尝试更新空的目标数据列表");
  293. throw new IllegalArgumentException("目标数据不能为空");
  294. }
  295. logger.info("更新平台 {} 的目标数据,目标数量: {}", platformId, targets.size());
  296. validateRadarTargets(targets);
  297. Queue<RadarTarget> queue = platformTargetsMap.computeIfAbsent(
  298. platformId,
  299. k -> new ConcurrentLinkedQueue<>()
  300. );
  301. // 添加新数据到队列
  302. for (RadarTarget target : targets) {
  303. queue.offer(target);
  304. // 如果队列超出最大容量,移除最旧的数据
  305. while (queue.size() > MAX_QUEUE_SIZE) {
  306. queue.poll();
  307. }
  308. }
  309. return new ArrayList<>(queue);
  310. }
  311. // 添加清除目标数据的方法
  312. public void clearRadarTargets(String platformId) {
  313. logger.info("清除平台 {} 的目标数据", platformId);
  314. Queue<RadarTarget> queue = platformTargetsMap.get(platformId);
  315. if (queue != null) {
  316. queue.clear();
  317. }
  318. }
  319. // 添加获取队列大小的方法
  320. public int getRadarTargetsCount(String platformId) {
  321. Queue<RadarTarget> queue = platformTargetsMap.get(platformId);
  322. return queue != null ? queue.size() : 0;
  323. }
  324. // 验证目标数据的合法性
  325. private void validateRadarTargets(List<RadarTarget> targets) {
  326. for (RadarTarget target : targets) {
  327. if (target.getTargetId() == null) {
  328. throw new IllegalArgumentException("目标ID不能为空");
  329. }
  330. if (target.getSimTime() == null || target.getSimTime().trim().isEmpty()) {
  331. throw new IllegalArgumentException("仿真时间不能为空");
  332. }
  333. }
  334. }
  335. //获取消息数据 链路状态相关方法
  336. public MessageStatus getMsgStatusById(String PlatformID){
  337. return subscriber.listener.messageStatusMap.get(PlatformID);
  338. }
  339. public void setMsgStatusById(String PlatformID,MessageStatus m){
  340. // messageStatusMap.put(PlatformID,m);
  341. subscriber.listener.messageStatusMap.put(PlatformID,m);
  342. publisher.publishMessage("5","9",PlatformID+" "+m.startUp+" "+m.quite+" "+m.mode);
  343. }
  344. public List<Message> getMsgListById(String PlatformID){
  345. return subscriber.listener.messageList.get(PlatformID);
  346. }
  347. public void setMsgListById(String PlatformID,Message m){
  348. List<Message> list = messageList.get(PlatformID);
  349. list.add(m);
  350. messageList.put(PlatformID,list);
  351. }
  352. public List<Message> getOutMsgListById(String PlatformID){
  353. return outmessageList.get(PlatformID);
  354. }
  355. public void setOutMsgListById(String PlatformID,Message m){
  356. List<Message> list = outmessageList.get(PlatformID);
  357. list.add(m);
  358. outmessageList.put(PlatformID,list);
  359. }
  360. //---------------------------------
  361. //平台发送消息给平台方法
  362. public void sendMessageToOther(String platformID,Message msg,String other,String subject){
  363. publisher.publishMessage(platformID+" "+"3"+" "+other,subject,msg.getTime()+" "+msg.getTopic()+" "+msg.getText());
  364. }
  365. public void sendRadarPulseMsg(String platformID, radarPulseMsg msg,String recivier){
  366. publisher.publishMessage(platformID+" "+"3"+" "+recivier,"5",msg.getType()+" "+msg.getEnv()+" "+msg.getLon()+" "+msg.getLat()+" "+msg.getH()+" "+msg.getFreq()+" "+msg.getPRI());
  367. List<Message> list = outmessageList.get(platformID)==null ? new ArrayList<>() : outmessageList.get(platformID);
  368. LocalDateTime now = LocalDateTime.now();
  369. // 定义格式(例如:yyyy-MM-dd HH:mm:ss)
  370. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  371. // 格式化时间
  372. String formattedDateTime = now.format(formatter);
  373. list.add(new Message(formattedDateTime,platformID,"雷达脉冲",msg.getType()+" "+msg.getEnv()+" "+msg.getLon()+" "+msg.getLat()+" "+msg.getH()+" "+msg.getFreq()+" "+msg.getPRI(),"1"));
  374. outmessageList.put(platformID,list);
  375. }
  376. public void sendDisturbMsg(String platformID, disturbMsg msg,String recivier){
  377. publisher.publishMessage(platformID+" "+"3"+" "+recivier,"6",msg.getJaming()+" "+msg.getEnv()+" "+msg.getArea()+" "+msg.getJamingPolicy()+" "+msg.getTarget()+" "+msg.getIsCoop()+" "+msg.getPRI());
  378. List<Message> list = outmessageList.get(platformID)==null ? new ArrayList<>() : outmessageList.get(platformID);
  379. LocalDateTime now = LocalDateTime.now();
  380. // 定义格式(例如:yyyy-MM-dd HH:mm:ss)
  381. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  382. // 格式化时间
  383. String formattedDateTime = now.format(formatter);
  384. list.add(new Message(formattedDateTime,platformID,"电子干扰",msg.getJaming()+" "+msg.getEnv()+" "+msg.getArea()+" "+msg.getJamingPolicy()+" "+msg.getTarget()+" "+msg.getIsCoop()+" "+msg.getPRI(),"1"));
  385. outmessageList.put(platformID,list);
  386. }
  387. public void sendCompMsg(String platformID, compMsg msg,String recivier){
  388. publisher.publishMessage(platformID+" "+"3"+" "+recivier,"7",msg.getTopic()+" "+msg.getPriority()+" "+msg.getIsBroadcast()+" "+msg.getText());
  389. List<Message> list = outmessageList.get(platformID)==null ? new ArrayList<>() : outmessageList.get(platformID);
  390. LocalDateTime now = LocalDateTime.now();
  391. // 定义格式(例如:yyyy-MM-dd HH:mm:ss)
  392. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  393. // 格式化时间
  394. String formattedDateTime = now.format(formatter);
  395. list.add(new Message(formattedDateTime,platformID,"综合情报",msg.getTopic()+" "+msg.getPriority()+" "+msg.getIsBroadcast()+" "+msg.getText(),"1"));
  396. outmessageList.put(platformID,list);
  397. }
  398. //电子攻击相关方法\
  399. public ecmStatus getECMStatusByID(String platformID){
  400. return ecmStatusList.get(platformID);
  401. }
  402. public List<ecmParams> getECMParamsByID(String platformID){
  403. return ecmParamsList.get(platformID);
  404. }
  405. public void setEcmParam(String platformID,ecmParams params){
  406. List<ecmParams> list = ecmParamsList.get(platformID);
  407. list.add(params);
  408. ecmParamsList.put(platformID,list);
  409. }
  410. public sdrStatus getSdrStatusByID(String platformID){
  411. return subscriber.listener.sdrStatueMap.get(platformID);
  412. }
  413. //编队成员方法
  414. public List<String> getTeamMemberByID(String platformID) {
  415. for(List<String> list : subscriber.listener.coopTeamMap.values()){
  416. if(list.contains(platformID)){
  417. return list;
  418. }
  419. }
  420. List<String> list = new ArrayList<>();
  421. return list;
  422. }
  423. // 初始化默认目标数据
  424. private List<RadarTarget> initDefaultTargets() {
  425. List<RadarTarget> defaultTargets = new ArrayList<>();
  426. defaultTargets.add(new RadarTarget("14:37.15", 1, "我方", "后端数据测试", "高", 10, -50, 859, 5.4));
  427. defaultTargets.add(new RadarTarget("14:33.40", 2, "未知", "后端数据测试", "低", 40, -70, 458, 10.1));
  428. defaultTargets.add(new RadarTarget("14:38.55", 3, "可疑目标", "后端数据测试", "中", 120, -54, 269, 15.3));
  429. defaultTargets.add(new RadarTarget("14:39.30", 4, "可疑目标", "后端数据测试", "中", 210, -60, 234, 22.5));
  430. return defaultTargets;
  431. }
  432. private List<Message> initDefaultMessage(String platformID) {
  433. List<Message> defaultMessage = new ArrayList<>();
  434. defaultMessage.add(new Message("2025-4-1 12:00","100","综合情报","这是测试消息内容","0"));
  435. defaultMessage.add(new Message("2025-4-1 12:00","100","综合情报","这是测试消息内容","1"));
  436. defaultMessage.add(new Message("2025-4-1 12:00","100","综合情报","这是测试消息内容","0"));
  437. return defaultMessage;
  438. }
  439. public String msgToNumber(String s){
  440. if(s.equals("雷达脉冲")){
  441. return "5";
  442. }
  443. else if(s.equals("电子干扰")){
  444. return "6";
  445. }
  446. else return "7";
  447. }
  448. //检查范围
  449. //原版
  450. // private void checkTargets(){
  451. // platformTargetsMap.clear();
  452. // for(String missile : subscriber.listener.positionMap.keySet()){
  453. // Queue<RadarTarget> queue = new ConcurrentLinkedQueue<>();
  454. // for(String radar : subscriber.listener.radarPositionMap.keySet()){
  455. // Position thisMissile = subscriber.listener.positionMap.get(missile);
  456. // Position thisRadar = subscriber.listener.radarPositionMap.get(radar);
  457. // 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){
  458. // //进入侦察范围
  459. // RadarTarget target = new RadarTarget();
  460. // double dx = thisMissile.x-thisRadar.x;
  461. // double dy = thisMissile.y-thisRadar.y;
  462. // double dz = thisMissile.z-thisRadar.z;
  463. // double azi,elv;
  464. // azi = dx==0&&dy==0 ? 0.0 : Math.toDegrees(Math.atan2(dx,dy));
  465. // azi = azi<0 ? azi+360 : azi;
  466. // elv = Math.toDegrees(Math.atan2(dz,Math.sqrt(dx*dx+dy*dy)));
  467. // target.setTargetId(Integer.valueOf(radar));
  468. // target.setEnemyPro("未知");
  469. // target.setFlightState("未知");
  470. // target.setLightQuality("未知");
  471. // target.setSimTime("未知");
  472. // 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)));
  473. // target.setTargetAzi(azi);
  474. // target.setTargetEle(elv);
  475. // target.setTargetRSpeed(0);
  476. // queue.add(target);
  477. // }
  478. // }
  479. // platformTargetsMap.put(missile,queue);
  480. // }
  481. // }
  482. private void checkTargets(){
  483. platformTargetsMap.clear();
  484. //雷达循环
  485. for(String radar : subscriber.listener.radarPositionMap.keySet()){
  486. Queue<RadarTarget> queue = new ConcurrentLinkedQueue<>();
  487. //侦察循环
  488. for(String missile : subscriber.listener.positionMap.keySet()){
  489. //侦察
  490. Position thisMissile = subscriber.listener.positionMap.get(missile);
  491. //雷达
  492. Position thisRadar = subscriber.listener.radarPositionMap.get(radar);
  493. 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){
  494. //进入侦察范围
  495. RadarTarget target = new RadarTarget();
  496. double dx = thisMissile.x-thisRadar.x;
  497. double dy = thisMissile.y-thisRadar.y;
  498. double dz = thisMissile.z-thisRadar.z;
  499. double azi,elv;
  500. azi = dx==0&&dy==0 ? 0.0 : Math.toDegrees(Math.atan2(dx,dy));
  501. azi = azi<0 ? azi+360 : azi;
  502. elv = Math.toDegrees(Math.atan2(dz,Math.sqrt(dx*dx+dy*dy)));
  503. target.setTargetId(Integer.valueOf(radar));
  504. target.setEnemyPro("未知");
  505. target.setFlightState("未知");
  506. target.setLightQuality("未知");
  507. target.setSimTime("未知");
  508. 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)));
  509. target.setTargetAzi(azi);
  510. target.setTargetEle(elv);
  511. target.setTargetRSpeed(0);
  512. queue.add(target);
  513. }
  514. }
  515. platformTargetsMap.put(radar,queue);
  516. }
  517. }
  518. }