[change] 添加是否可以启动自动驾驶回调接口

This commit is contained in:
xinfengkun
2022-09-20 15:13:01 +08:00
parent 6394714d7e
commit 804ff55403
9 changed files with 193 additions and 2 deletions

View File

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

View File

@@ -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?) {
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@ import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中,目前放在AutopilotStateMessage 数据接口中,此接口数据刷新不是太频繁
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中
* 与工控机链接成功后,工控机断开连接超时监测管理器
* 由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端是无感知的,所以需要根据最后一次接收数据的时间进行超时检测
*/

View File

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

View File

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