[change] 添加是否可以启动自动驾驶回调接口
This commit is contained in:
@@ -84,6 +84,7 @@ import com.zhidao.support.adas.high.AdasOptions;
|
||||
import com.zhidao.support.adas.high.OnAdasConnectStatusListener;
|
||||
import com.zhidao.support.adas.high.OnAdasListener;
|
||||
import com.zhidao.support.adas.high.OnMultiDeviceListener;
|
||||
import com.zhidao.support.adas.high.bean.AutopilotAbility;
|
||||
import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.ByteUtil;
|
||||
import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS;
|
||||
@@ -110,6 +111,7 @@ import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
import chassis.Chassis;
|
||||
import chassis.VehicleStateOuterClass;
|
||||
import io.netty.channel.Channel;
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
@@ -164,6 +166,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
private ListPopupWindow listPopupWindow;
|
||||
private FloatWindow floatWindow;
|
||||
private View include_title;
|
||||
private boolean isAutopilotAbility = true;
|
||||
private String autopilotAbilityReason;
|
||||
// @Override
|
||||
// protected void onStart() {
|
||||
// super.onStart();
|
||||
@@ -796,6 +800,50 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
DataDistribution.getInstance().addData(base);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAutopilotAbility(AutopilotAbility ability) {
|
||||
isAutopilotAbility = true;
|
||||
autopilotAbilityReason = null;
|
||||
if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || ability.gear == Chassis.GearPosition.GEAR_R) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "挡位不正常";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
if (ability.brake > 0) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "制动踏板被踩下";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
if (ability.statusInfo == null) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "系统Topic不正常";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "系统正在启动";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "系统正在关闭";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_FAULT) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = "系统异常";
|
||||
}
|
||||
if (isAutopilotAbility)
|
||||
for (SystemStatusInfo.HealthInfo healthInfo : ability.statusInfo.getHealthInfoList()) {
|
||||
if (healthInfo.getState() == SystemStatusInfo.HealthState.FAULT) {
|
||||
isAutopilotAbility = false;
|
||||
autopilotAbilityReason = healthInfo.getName() + " Topic异常";
|
||||
break;
|
||||
}
|
||||
}
|
||||
Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) {
|
||||
Trajectory base = new Trajectory(header, trajectory, sdf);
|
||||
|
||||
@@ -50,6 +50,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateLi
|
||||
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
|
||||
import com.zhidao.support.adas.high.AdasManager
|
||||
import com.zhidao.support.adas.high.OnAdasListener
|
||||
import com.zhidao.support.adas.high.bean.AutopilotAbility
|
||||
import com.zhidao.support.adas.high.common.ProtocolStatus
|
||||
import com.zhjt.service.chain.ChainLog
|
||||
import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD
|
||||
@@ -427,4 +428,11 @@ class MoGoAdasListenerImpl : OnAdasListener {
|
||||
override fun onError(status: ProtocolStatus, bytes: ByteArray) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否可以启动自动驾驶
|
||||
* 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility
|
||||
*/
|
||||
override fun onAutopilotAbility(ability: AutopilotAbility?) {
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
|
||||
import com.zhidao.support.adas.high.common.ByteUtil;
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.CupidLogUtils;
|
||||
@@ -506,9 +507,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
private void updateConnectStatus(@Define.IPCConnectionStatus int status, @Nullable String reason) {
|
||||
ipcConnectionStatus.set(status);
|
||||
if (status == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
|
||||
|
||||
AutopilotAbilityManager.getInstance().start();
|
||||
startCheckCompatibility();
|
||||
} else {
|
||||
AutopilotAbilityManager.getInstance().stop();
|
||||
stopCheckCompatibility();
|
||||
}
|
||||
if (status == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) {
|
||||
@@ -596,6 +598,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
|
||||
void setOnAdasListener(OnAdasListener adasListener) {
|
||||
mAdasListener = adasListener;
|
||||
AutopilotAbilityManager.getInstance().setOnAdasListener(adasListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.zhidao.support.adas.high;
|
||||
|
||||
import com.zhidao.support.adas.high.bean.AutopilotAbility;
|
||||
import com.zhidao.support.adas.high.common.ProtocolStatus;
|
||||
|
||||
import chassis.VehicleStateOuterClass;
|
||||
@@ -186,4 +187,10 @@ public interface OnAdasListener {
|
||||
*/
|
||||
void onError(ProtocolStatus status, byte[] bytes);
|
||||
|
||||
/**
|
||||
* 是否有能力启动自动驾驶
|
||||
*
|
||||
* @param ability 是否可以启动自动驾驶
|
||||
*/
|
||||
void onAutopilotAbility(AutopilotAbility ability);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package com.zhidao.support.adas.high.bean;
|
||||
|
||||
import chassis.Chassis;
|
||||
import system_master.SystemStatusInfo;
|
||||
|
||||
/**
|
||||
* 自动驾驶能力 能否启动自动驾驶
|
||||
* 未赋值表示接口通讯异常或者工控机相关节点异常 如果回调持续都是未赋值的状态表示此问题是持久性的
|
||||
*/
|
||||
public class AutopilotAbility {
|
||||
/**
|
||||
* 刹车踏板开度 0~100
|
||||
* -1表示未赋值
|
||||
*/
|
||||
public final float brake;
|
||||
/**
|
||||
* 挡位
|
||||
* null表示未赋值
|
||||
*/
|
||||
public final Chassis.GearPosition gear;
|
||||
/**
|
||||
* 状态查询结果
|
||||
* null表示未赋值
|
||||
* 不能启动自动驾驶的判断
|
||||
* statusInfo.getHealthInfoList().get().getState()== SystemStatusInfo.HealthState.FAULT
|
||||
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_STARTING
|
||||
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_EXITING
|
||||
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_FAULT
|
||||
*/
|
||||
public final SystemStatusInfo.StatusInfo statusInfo;
|
||||
|
||||
public AutopilotAbility(float brake, Chassis.GearPosition gear, SystemStatusInfo.StatusInfo statusInfo) {
|
||||
this.brake = brake;
|
||||
this.gear = gear;
|
||||
this.statusInfo = statusInfo;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package com.zhidao.support.adas.high.common;
|
||||
|
||||
import com.zhidao.support.adas.high.AdasManager;
|
||||
import com.zhidao.support.adas.high.OnAdasListener;
|
||||
import com.zhidao.support.adas.high.bean.AutopilotAbility;
|
||||
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import chassis.Chassis;
|
||||
import chassis.VehicleStateOuterClass;
|
||||
import system_master.SystemStatusInfo;
|
||||
|
||||
/**
|
||||
* 是否可以启动自动驾驶能力检测
|
||||
*/
|
||||
public class AutopilotAbilityManager {
|
||||
private static final String TAG = AutopilotAbilityManager.class.getSimpleName();
|
||||
private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间
|
||||
private static volatile AutopilotAbilityManager INSTANCE;
|
||||
|
||||
private OnAdasListener listener;
|
||||
private volatile Timer timer;
|
||||
|
||||
private VehicleStateOuterClass.VehicleState vehicleState;
|
||||
|
||||
public void setOnAdasListener(OnAdasListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
private AutopilotAbilityManager() {
|
||||
}
|
||||
|
||||
public static AutopilotAbilityManager getInstance() {
|
||||
if (INSTANCE == null) {
|
||||
synchronized (AutopilotAbilityManager.class) {
|
||||
if (INSTANCE == null) {
|
||||
INSTANCE = new AutopilotAbilityManager();
|
||||
}
|
||||
}
|
||||
}
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) {
|
||||
if (listener != null) {
|
||||
float brake = -1;
|
||||
Chassis.GearPosition gear = null;
|
||||
if (vehicleState != null) {
|
||||
brake = vehicleState.getBrake();
|
||||
gear = vehicleState.getGear();
|
||||
}
|
||||
listener.onAutopilotAbility(new AutopilotAbility(brake, gear, statusInfo));
|
||||
}
|
||||
}
|
||||
|
||||
public void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) {
|
||||
this.vehicleState = vehicleState;
|
||||
}
|
||||
|
||||
public synchronized void start() {
|
||||
if (timer == null) {
|
||||
timer = new Timer();
|
||||
timer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
AdasManager.getInstance().sendStatusQueryReq();
|
||||
}
|
||||
}, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void stop() {
|
||||
if (timer != null) {
|
||||
timer.cancel();
|
||||
timer = null;
|
||||
}
|
||||
this.vehicleState = null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import java.util.TimerTask;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
/**
|
||||
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中,目前放在AutopilotStateMessage 数据接口中,此接口数据刷新不是太频繁
|
||||
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中
|
||||
* 与工控机链接成功后,工控机断开连接超时监测管理器
|
||||
* 由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端是无感知的,所以需要根据最后一次接收数据的时间进行超时检测
|
||||
*/
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg;
|
||||
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.zhidao.support.adas.high.OnAdasListener;
|
||||
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
|
||||
import com.zhidao.support.adas.high.protocol.RawData;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
@@ -15,6 +16,7 @@ public class StatusQueryRespMessage extends MyAbstractMessageHandler {
|
||||
@Override
|
||||
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
|
||||
SystemStatusInfo.StatusInfo statusInfo= SystemStatusInfo.StatusInfo.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
|
||||
AutopilotAbilityManager.getInstance().setStatusInfo(statusInfo);
|
||||
if (adasListener != null) {
|
||||
adasListener.onStatusQueryResp(raw.getHeader(), statusInfo);
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg;
|
||||
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.zhidao.support.adas.high.OnAdasListener;
|
||||
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
|
||||
import com.zhidao.support.adas.high.protocol.RawData;
|
||||
|
||||
import chassis.VehicleStateOuterClass;
|
||||
@@ -14,6 +15,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler {
|
||||
@Override
|
||||
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
|
||||
VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
|
||||
AutopilotAbilityManager.getInstance().setVehicleState(vehicleState);
|
||||
if (adasListener != null) {
|
||||
adasListener.onVehicleState(raw.getHeader(), vehicleState);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user