1、成员变量多线程安全优化

2、增加重心计算参考点的时间有效期判断
This commit is contained in:
weidong 2024-04-26 09:27:55 +08:00
parent 875d0dd423
commit 7854b5f45c
5 changed files with 36 additions and 12 deletions

View File

@ -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<Tilt> 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;
}
}

View File

@ -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;
}
}

View File

@ -47,7 +47,7 @@ public class MultiLineGNSSCalcService {
GnssGroupCalcMapper groupCalcMapper;
List<GnssGroupCalc> 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");
}

View File

@ -44,9 +44,11 @@ public class SingleLineGNSSCalcService implements GNSSDataCalcService {
@Autowired
GnssGroupCalcMapper groupCalcMapper;
// 非线程安全需加同步保护
List<GnssGroupCalc> 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");

View File

@ -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<Integer, int[]> cfgMap = new HashMap<>();
Map<Integer, int[]> cfgMap = new ConcurrentHashMap<>();
int warningLevel2Code = 0;
@PostConstruct