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