diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java index 2893d8f6..09ebf6b0 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator1.java @@ -3,6 +3,7 @@ package com.imdroid.sideslope.bd; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.LocalDateTime; import java.util.*; /** @@ -24,6 +25,7 @@ public class FocusCalculator1 implements FocusCalculator{ double pointSelectedRate = 0.5; double iterStep = 1;//mm double[] referPoint; //参考点,一般是上一次计算的位置,用来辅助计算重心 + LocalDateTime referPointTime; // 惯导算法相关 final List tilts = Collections.synchronizedList(new ArrayList<>()); @@ -34,11 +36,11 @@ public class FocusCalculator1 implements FocusCalculator{ final double shockThreshold = 1.5; //其他 - int delay_ms = 0; - int delay_counter = 0; - int counterNoB562 = 0; - int counterNoFixed = 0; - int counterFixedResult = 0; + int delay_ms; + int delay_counter; + int counterNoB562; + int counterNoFixed; + int counterFixedResult; /*public FocusCalculator1(double height, Tilt tilt0, double[] position0){ this.height = height; @@ -54,6 +56,8 @@ public class FocusCalculator1 implements FocusCalculator{ counterNoB562 = 0; counterNoFixed = 0; counterFixedResult = 0; + delay_ms = 0; + delay_counter = 0; } @Override @@ -63,6 +67,8 @@ public class FocusCalculator1 implements FocusCalculator{ counterNoB562 = 0; counterNoFixed = 0; counterFixedResult = 0; + delay_ms = 0; + delay_counter = 0; } /** @@ -102,9 +108,15 @@ public class FocusCalculator1 implements FocusCalculator{ @Override public void setReferPoint(double[] point){ referPoint = point; + referPointTime = LocalDateTime.now(); } @Override public double[] getReferPoint(){ + if(referPoint==null || referPointTime==null) return null; + + if(LocalDateTime.now().isAfter(referPointTime.plusHours(24))) { + referPoint = null; + } return referPoint; } @Override @@ -368,7 +380,8 @@ public class FocusCalculator1 implements FocusCalculator{ } @Override public int getAvgDelayMs(){ - return delay_ms/delay_counter; + if(delay_counter==0) return -1; + else return delay_ms/delay_counter; } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator2.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator2.java index 1ce6a63c..1d215d4b 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator2.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/bd/FocusCalculator2.java @@ -148,7 +148,8 @@ public class FocusCalculator2 extends FocusCalculator1{ public void setReferPoint(double[] point){ if(referPointFilteredFlag){ // 初始参考位置保持24小时 - if(initReferPointTime!=null && LocalDateTime.now().isAfter(initReferPointTime.plusHours(1))){ + if(initReferPointTime!=null && + LocalDateTime.now().isAfter(initReferPointTime.plusHours(24))){ referPoint = point; } } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java index 0df175ec..fd075de6 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/MultiLineGNSSCalcService.java @@ -47,7 +47,7 @@ public class MultiLineGNSSCalcService { GnssGroupCalcMapper groupCalcMapper; List groupCalcList; - GnssGroupCalc getGroupCalc(int groupId){ + synchronized GnssGroupCalc getGroupCalc(int groupId){ if(groupCalcList == null){ groupCalcList = groupCalcMapper.selectList(null); } @@ -187,6 +187,7 @@ public class MultiLineGNSSCalcService { } public void refreshGroupCalc(){ + if(groupCalcList!=null) groupCalcList.clear(); groupCalcList = groupCalcMapper.selectList(null); logger.info("group paras changed"); } diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java index a9ceab44..b9223069 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/calc/SingleLineGNSSCalcService.java @@ -44,9 +44,11 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { @Autowired GnssGroupCalcMapper groupCalcMapper; + + // 非线程安全,需加同步保护 List groupCalcList; - GnssGroupCalc getGroupCalc(int groupId){ + synchronized GnssGroupCalc getGroupCalc(int groupId){ if(groupCalcList == null){ groupCalcList = groupCalcMapper.selectList(null); } @@ -58,6 +60,13 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { return null; } + /*** + * 处理本轮的固定解,求出重心位置。多线程调用,访问成员变量要考虑多线程安全 + * @param message d341报文 + * @param completeWhenIdle 是否根据空闲时间判断本轮结束。是则启动30s定时器;否则需显示调用SingleDone函数 + * @return + */ + @Override public double[] calcSingle(D341LocationMessage message, boolean completeWhenIdle) { String deviceId = message.getId(); @@ -229,7 +238,7 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService { } public void refreshGroupCalc(){ - groupCalcList.clear(); + if(groupCalcList!=null) groupCalcList.clear(); groupCalcList = groupCalcMapper.selectList(null); calculatorMap.clear(); logger.info("group paras changed"); diff --git a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java index f2bd753e..d5d30406 100644 --- a/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java +++ b/sec-beidou-rtcm/src/main/java/com/imdroid/sideslope/service/WarningServiceImpl.java @@ -9,9 +9,9 @@ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Service public class WarningServiceImpl implements WarningService { @@ -23,7 +23,7 @@ public class WarningServiceImpl implements WarningService { GnssStatusMapper gnssStatusMapper; // warning type <-> level & value - Map cfgMap = new HashMap<>(); + Map cfgMap = new ConcurrentHashMap<>(); int warningLevel2Code = 0; @PostConstruct