diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto
index 631aee93b6..0fb0670fc3 100644
--- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto
+++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto
@@ -70,6 +70,7 @@ enum MessageType
MsgTypeTaskCmd = 0x10122; //云控任务指令, 云控<->鹰眼双向透传
MsgTypeFSMStatusReasonQueryReq = 0x10123; //fsm状态原因查询
MsgTypeFSMStatusReasonQueryResp = 0x10124; //fsm状态原因查询应答
+ MsgTypeGetDebugInfo = 0x10125; //debug信息查询 pad->telematics
}
message Header
@@ -125,7 +126,7 @@ message TrackedSource
message TrackedObject
{
- uint32 type = 1; //物体类型, 0:Background, 1:Person, 2:Bicycle, 3:Car, 4:MotorCycle,
+ uint32 type = 1; //物体类型, 0:Background, 1:Person, 2:Bicycle, 3:Car, 4:MotorCycle,
//5:TrafficSign, 6:Bus, 7:CellPhone, 8:Truck, 9:Bottle, 10:TrafficLight,
//11:Rider, 12:TriangleRoadblock, 13:WarningTriangle, 100:Unknown,
//501:RoadWork_occupy_0501, 502:RoadWork_break_0502
@@ -175,7 +176,7 @@ message TrackedObjects
// message definition for MsgTypeGnssInfo
message GnssInfo
{
- double longitude = 1; //经度
+ double longitude = 1; //经度
double latitude = 2; //纬度
double altitude = 3; //海拔
double heading = 4; //航向角
@@ -264,6 +265,7 @@ message BasicInfoResp
string sn = 1;
uint32 environment = 2; //1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
uint32 role = 3; //客户端角色:0: 司机屏,1: 乘客屏,2: 调试屏
+ string version = 4; //鹰眼版本
}
// message definition for MsgTypeSetAutopilotModeReq
@@ -316,11 +318,20 @@ message CarConfigResp
string macAddress = 3;
ProtocolVersion protocolVersion = 4; //通信协议版本
double speedLimit = 5; //自动驾驶限速, 单位:m/s
- double maxSpeedLimit = 6; //最大自动驾驶限速, 单位:m/s
+ double maxSpeedLimit = 6; //最大自动驾驶限速, 单位:m/s
double minAcceleration = 7; //最小加速度, 单位:m/s²
double maxAcceleration = 8; //最大加速度, 单位:m/s²
string carType = 9; //车辆类型
string subCarType = 10; //车辆子类型
+ reserved 11 to 100;
+ int32 mapVersion = 101;//dockVersion解析出版本号,解析失败为-1。例如:"MAP-taxi_RoboTaxi_df_2.8.0.3_20220928_test" 解析结果为:280
+ bool isDF = 102;//车型是否是东风
+ bool isHQ = 103;//车型是否是红旗
+ bool isJinlv = 104;//车型是否是金旅小巴
+ bool isJinlvM1 = 105;//车型是否是金旅M1
+ bool isJinlvM2 = 106;//车型是否是金旅M2
+ bool isFutianSweeper = 107;//车型是否是福田清扫车
+ bool isKaiwo = 108;//车型是否是开沃
}
// message definition for MsgTypeRecordCause
@@ -584,13 +595,14 @@ message PlanningActionMsg
//message definition for MsgTypeSetParamReq
message SetOneParam
{
- uint32 type = 1; // 0:default 1:绕障类功能开关(bool) 2:变道绕障的目标障碍物速度阈值(double, m/s)
+ uint32 type = 1; // 0:default 1:绕障类功能开关(bool) 2:变道绕障的目标障碍物速度阈值(double, m/s)
// 3:AEB开关(bool) 0:关闭自动紧急制动功能 1:启用自动紧急制动功能
// 4:限制绕障开关(bool) 0:正常绕障 1:限制绕障 默认0
// 5:停车让行线前避让等待开关(bool) 0:停车让行线前无需等待 1:停车让行线前需要等待 默认0
// 6:地图限速功能开关(bool) 0:不使用地图限速功能 1:使用地图限速功能 默认0
// 7:环岛模式开关(bool) 0:普通模式 1:环岛模式 默认0
- // 8:弱网减速停车策略开关(bool) 0:关闭弱网减速停车策略 1:使用弱网减速停车策略
+ // 8:弱网减速停车策略开关(bool) 0:关闭弱网减速停车策略 1:使用弱网减速停车策略
+ // 9:m1拼接视频自车位置参数(string), 格式:x,y,width,height
string value = 2; // 转成字符串的值
}
@@ -647,9 +659,6 @@ message PlanningCmd
//message definition for MsgTypeBackCameraVideo
//payload:jpeg data
-//message definition for MsgTypeM1StitchedVideo
-//payload:jpeg data
-
//message definition for MsgTypeV2nCongestionEvent
//refer to RSI_PB in mogo_v2x.proto for details
@@ -669,4 +678,25 @@ message PlanningCmd
//refer to FSMStatusReasonQuery.proto for details
//message definition for MsgTypeFSMStatusReasonQueryResp
-//refer to FSMStatusReasonQuery.proto for details
\ No newline at end of file
+//refer to FSMStatusReasonQuery.proto for details
+
+//message definition for MsgTypeM1StitchedVideo
+//payload:jpeg data
+
+//message definition for MsgTypeGetDebugInfo
+message DebugInfo
+{
+ uint32 seq = 1; //seq num
+ repeated SessionInfo sessions = 2; //有效session信息
+}
+
+message SessionInfo
+{
+ uint32 sessionID = 1;
+ uint32 role = 2;
+ string sn = 3;
+ uint64 connectedTimeStamp = 4;
+ string version = 5;
+}
+
+
diff --git a/libraries/mogo-adas/build.gradle b/libraries/mogo-adas/build.gradle
index 5710f48d1e..cbfe6e34dd 100644
--- a/libraries/mogo-adas/build.gradle
+++ b/libraries/mogo-adas/build.gradle
@@ -65,6 +65,10 @@ android {
lintOptions {
abortOnError false
}
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java
index a3311dccab..dc487d8475 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java
@@ -66,6 +66,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import bag_manager.BagManagerOuterClass;
import chassis.SpecialVehicleTaskCmdOuterClass;
import common.HeaderOuterClass;
+import function_state_management.FSMStatusReasonQueryOuterClass;
import mogo.telematics.pad.MessagePad;
import okio.ByteString;
@@ -1576,6 +1577,21 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
return sendPBMessage(MessageType.TYPE_SEND_BAG_MANAGER_CMD.typeCode, bagManager.toByteArray());
}
+ /**
+ * FSM状态原因查询
+ * 当FSMFunctionStates的类型是XXX_DRIVING_OFF时查询OFF的原因
+ * 当FSMFunctionStates的类型是PILOT_DRIVING_OFF时会自动调用
+ *
+ * @param type 0:default, 1:请求反馈原因
+ * @return boolean
+ */
+ @Override
+ public boolean sendFSMStatusReasonQuery(int type) {
+ FSMStatusReasonQueryOuterClass.FSMStatusReasonQuery query = FSMStatusReasonQueryOuterClass.FSMStatusReasonQuery.newBuilder()
+ .setType(type)
+ .build();
+ return sendPBMessage(MessageType.TYPE_SEND_FSM_STATUS_REASON_QUERY_REQ.typeCode, query.toByteArray());
+ }
/**
* 发送清扫车指令到云控
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
index 6f6b0d5c67..abcc99229c 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
@@ -1,12 +1,14 @@
package com.zhidao.support.adas.high;
import android.content.Context;
+import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.zhidao.support.adas.high.bean.VersionCompatibility;
import com.zhidao.support.adas.high.common.AppPreferenceHelper;
import com.zhidao.support.adas.high.common.Constants;
+import com.zhidao.support.adas.high.common.CupidLogUtils;
import com.zhidao.support.adas.high.common.Define;
import com.zhidao.support.adas.high.common.MessageType;
import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
@@ -19,6 +21,8 @@ import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import bag_manager.BagManagerOuterClass;
import chassis.SpecialVehicleTaskCmdOuterClass;
@@ -44,7 +48,7 @@ public class AdasManager implements IAdasNetCommApi {
private static final int PROTOCOL_VERSION = MessagePad.ProtocolVersion.CurrentVersion.getNumber();
private volatile MessagePad.CarConfigResp carConfig;
private static final String ADAS_VERSION = BuildConfig.VERSION_NAME;
-
+ private final Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+");
private AdasChannel mChannel;
public static AdasManager getInstance() {
@@ -827,6 +831,19 @@ public class AdasManager implements IAdasNetCommApi {
return mChannel != null && mChannel.sendBagManagerCmd(bagManager);
}
+ /**
+ * FSM状态原因查询
+ * 当FSMFunctionStates的类型是XXX_DRIVING_OFF时查询OFF的原因
+ * 当FSMFunctionStates的类型是PILOT_DRIVING_OFF时会自动调用
+ *
+ * @param type 0:default, 1:请求反馈原因
+ * @return boolean
+ */
+ @Override
+ public boolean sendFSMStatusReasonQuery(int type) {
+ return mChannel != null && mChannel.sendFSMStatusReasonQuery(type);
+ }
+
/**
* 开始大任务响应
* 1、云端下发大任务信息(type: 100001)-> sweeper_task.proto/StartTaskResp 响应信息
@@ -978,4 +995,48 @@ public class AdasManager implements IAdasNetCommApi {
public long getTimeoutDetectionTime() {
return ReceiveTimeoutManager.getInstance().getTimeout();
}
+
+ /**
+ * 解析版本 格式 xxx.xxx.xxx(x的数量不固定)
+ * 如果用于比较,仅适用于除个位数非0的字符串,例如:"12.03.04" 解析出为120304可能无法正常对比
+ * 目前已用于DockerVersion和MaserVersion的解析
+ *
+ * @param ver 版本字符串 例如:"MAP-taxi_RoboTaxi_df_2.8.0.3_20220928_test" 解析结果为:280
+ * @return -1表示解析失败
+ */
+ public int parseVersion(String ver) {
+ return parseVersion(true, ver);
+ }
+
+ /**
+ * 解析版本 格式 xxx.xxx.xxx(x的数量不固定)
+ * 如果用于比较,仅适用于非个位数非0的字符串,例如:"12.03.04" 解析出为120304可能无法正常对比
+ * 目前已用于DockerVersion和MaserVersion的解析
+ *
+ * @param isUseAll 是否使用全部截取数据 true:表示 12.34.56 截取之后 123456 false:表示12.34.56 截取之后 12
+ * @param ver 版本字符串 例如:"MAP-taxi_RoboTaxi_df_2.8.0.3_20220928_test" 解析结果为:280
+ * @return -1表示解析失败
+ */
+ public int parseVersion(boolean isUseAll, String ver) {
+ int version = -1;
+ if (!TextUtils.isEmpty(ver)) {
+ try {
+ Matcher matcher = pattern.matcher(ver);
+ if (matcher.find()) {
+ String group = matcher.group();
+ if (!TextUtils.isEmpty(group)) {
+ if (isUseAll) {
+ group = group.replace(".", "");
+ } else {
+ group = group.split("\\.")[0];
+ }
+ version = Integer.parseInt(group);
+ }
+ }
+ } catch (Exception e) {
+ CupidLogUtils.e("AdasManager", "版本解析失败=" + ver, e);
+ }
+ }
+ return version;
+ }
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
index af1c9776b0..76a39773be 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
@@ -511,6 +511,16 @@ public interface IAdasNetCommApi {
*/
boolean sendBagManagerCmd(BagManagerOuterClass.BagManager bagManager);
+ /**
+ * FSM状态原因查询
+ * 当FSMFunctionStates的类型是XXX_DRIVING_OFF时查询OFF的原因
+ * 当FSMFunctionStates的类型是PILOT_DRIVING_OFF时会自动调用
+ *
+ * @param type 0:default, 1:请求反馈原因
+ * @return boolean
+ */
+ boolean sendFSMStatusReasonQuery(int type);
+
/**
* 开始大任务响应
* 1、云端下发大任务信息(type: 100001)-> sweeper_task.proto/StartTaskResp 响应信息
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
index 6e0e3d6460..b6428d708c 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
@@ -240,13 +240,21 @@ public interface OnAdasListener {
void onObuMapMath(MessagePad.Header header, ObuScene.MapMatchData mapMatchData);
/**
- * 重构后的功能状态
+ * 重构后的功能状态 20hz
*
* @param header 头
* @param functionStates 数据
*/
void onFunctionStates(MessagePad.Header header, FunctionStates.FSMFunctionStates functionStates);
+ /**
+ * FSM状态原因查询 回调
+ *
+ * @param header 头
+ * @param respond 数据
+ */
+// void onFSMStatusReasonRespond(@NonNull MessagePad.Header header, @NonNull FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond respond);
+
/**
* 清扫车后部摄像头视频 10Hz
*
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java
index 4d8477a1e4..8597b10e14 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java
@@ -65,6 +65,8 @@ public enum MessageType {
TYPE_SEND_PLANNING_CMD(MessagePad.MessageType.MsgTypePlanningCmd, "给Planning指令"),
TYPE_SEND_SWEEPER_CLOUD_TASK_CMD(MessagePad.MessageType.MsgTypeTaskCmd, "发送清扫车指令到云控"),
TYPE_RECEIVE_SWEEPER_CLOUD_TASK_CMD(MessagePad.MessageType.MsgTypeTaskCmd, "云控下发清扫车任务指令"),
+ TYPE_SEND_FSM_STATUS_REASON_QUERY_REQ(MessagePad.MessageType.MsgTypeFSMStatusReasonQueryReq, "FSM状态原因查询"),
+ TYPE_RECEIVE_FSM_STATUS_REASON_QUERY_RESP(MessagePad.MessageType.MsgTypeFSMStatusReasonQueryResp, "FSM状态原因查询应答"),
//TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释
TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, "Planning决策状态"),
TYPE_RECEIVE_SWEEPER_TASK_INDEX_DATA(MessagePad.MessageType.MsgTypeSweeperTaskIndexData, "清扫车指标数据"),
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java
index ff336195ee..81afbb44dc 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java
@@ -13,7 +13,7 @@ import chassis.ChassisStatesOuterClass;
import system_master.SystemStatusInfo;
/**
- * 是否可以启动自动驾驶能力检测 工控机版本>=250使用此类
+ * 是否可以启动自动驾驶能力检测 非清扫车MAP版本>=250使用此类 清扫车MAP版本>=250&& <330使用此类
* 目前监控了底盘的一些状态和查询节点状态应答的数据
* 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知
*
@@ -53,10 +53,15 @@ public class AutopilotAbility250 {
if (statusInfo.hasMasterVersion()) {
//截取Master Version
String masterVersion = statusInfo.getMasterVersion();
- version = AutopilotAbilityManager.getInstance().parseVersion(false, masterVersion);
+ version = AdasManager.getInstance().parseVersion(false, masterVersion);
}
- //如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行
- if (version > 1 && statusInfo.hasAutoPilotReady()) {
+ //SSM 3版本兼容
+ if (version > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) {
+ isAutopilotAbility = statusInfo.getAutoPilotReady();
+ if (!isAutopilotAbility) {
+ unableAutopilotReason = statusInfo.getAutoPilotUnreadyReason();
+ }
+ } else if (version > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行
isAutopilotAbility = statusInfo.getAutoPilotReady();
if (!isAutopilotAbility) {
SystemStatusInfo.NodeFaultList nodeFaultList = statusInfo.getAutoPilotUnreadyList();
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility330.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility330.java
new file mode 100644
index 0000000000..49c8c5c192
--- /dev/null
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility330.java
@@ -0,0 +1,175 @@
+package com.zhidao.support.adas.high.common.autopilot.ability;
+
+import android.os.Message;
+
+import com.google.protobuf.TextFormat;
+import com.zhidao.support.adas.high.AdasManager;
+
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import function_state_management.FSMStatusReasonQueryOuterClass;
+import system_master.SystemStatusInfo;
+
+/**
+ * 是否可以启动自动驾驶能力检测 工控机版本>=330使用此类
+ * 目前监控了查询节点状态应答的数据和FSM状态原因查询
+ * TODO 目前只用于清扫车,其他车型需要MAP支持 FSM的相关功能
+ * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知
+ *
+ * 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态
+ */
+public class AutopilotAbility330 {
+ private static final String TAG = AutopilotAbility330.class.getSimpleName();
+ private static final int WHAT_TIMEOUT = 0;
+ private static final int DEFAULT_TIMEOUT = 1500;
+ private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间
+ private static final String[] NODE_INFO_STATE = {"未知状态 ", "依赖未就绪 ", "启动中 ", "运行 ", "停止 ", "无法启动状态 ", "人为启动状态 ", "人为关闭状态 "};
+ private volatile Timer timer;
+
+ private volatile FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond;//自动驾驶状态为OFF的原因
+
+ public AutopilotAbility330() {
+ }
+
+ public synchronized void setFsmStatusReasonRespond(FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) {
+ this.fsmStatusReasonRespond = fsmStatusReasonRespond;
+ }
+
+ public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) {
+ if (AutopilotAbilityManager.getInstance().getHandler() != null) {
+ if (AutopilotAbilityManager.getInstance().getHandler().hasMessages(WHAT_TIMEOUT))
+ AutopilotAbilityManager.getInstance().getHandler().removeMessages(WHAT_TIMEOUT);
+ }
+ onCallback(statusInfo);
+ }
+
+
+ private void onCallback(SystemStatusInfo.StatusInfo statusInfo) {
+ boolean isAutopilotAbility = true;//是否能启动自动驾驶
+ String unableAutopilotReason = null;//不能启动自动驾驶原因
+ //检测节点状态相关
+ if (statusInfo != null) {
+ int version = -1;
+ if (statusInfo.hasMasterVersion()) {
+ //截取Master Version
+ String masterVersion = statusInfo.getMasterVersion();
+ version = AdasManager.getInstance().parseVersion(false, masterVersion);
+ }
+ //SSM 3版本兼容
+ if (version > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) {
+ isAutopilotAbility = statusInfo.getAutoPilotReady();
+ if (!isAutopilotAbility) {
+ unableAutopilotReason = statusInfo.getAutoPilotUnreadyReason();
+ }
+ } else if (version > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行
+ isAutopilotAbility = statusInfo.getAutoPilotReady();
+ if (!isAutopilotAbility) {
+ SystemStatusInfo.NodeFaultList nodeFaultList = statusInfo.getAutoPilotUnreadyList();
+ if (nodeFaultList.getSum() > 0) {
+ List list = nodeFaultList.getNodeList();
+ StringBuilder builder = new StringBuilder();
+ for (SystemStatusInfo.NodeInfo info : list) {
+ builder.append(info.getNodeName());
+ int state = info.getState();
+ if (state < NODE_INFO_STATE.length) {
+ builder.append(NODE_INFO_STATE[state]);
+ } else {
+ builder.append("未知异常 ");
+ }
+ }
+ unableAutopilotReason = builder.toString();
+ } else {
+ unableAutopilotReason = "未知异常节点";
+ }
+ }
+ } else {
+ SystemStatusInfo.SystemState systemState = statusInfo.getSysState();
+ // 目前已知可以下发启动自驾命令的状态: SystemState.SYS_RUNNING、SystemState.PILOT_READY、SystemState.AUTO_PILOT_STARTING、SystemState.AUTO_PILOT_RUNNING
+ if (systemState != SystemStatusInfo.SystemState.SYS_RUNNING && systemState != SystemStatusInfo.SystemState.PILOT_READY) {
+ isAutopilotAbility = false;
+ if (systemState == SystemStatusInfo.SystemState.SYS_STARTING) {
+ unableAutopilotReason = "系统正在启动";
+ } else if (systemState == SystemStatusInfo.SystemState.SYS_EXITING) {
+ unableAutopilotReason = "系统正在关闭";
+ } else if (systemState == SystemStatusInfo.SystemState.SYS_FAULT) {
+ unableAutopilotReason = "系统异常";
+ } else if (systemState == SystemStatusInfo.SystemState.AUTO_PILOT_STARTING) {
+ //TODO 如果第一次下发了启动自动驾驶,没起来或者存在干预 此时systemState是AUTO_PILOT_STARTING 需要二次下发启动自驾命令 所以需要排除此状态
+ isAutopilotAbility = true;
+ //unableAutopilotReason = "正在开始自动驾驶";
+ } else if (systemState == SystemStatusInfo.SystemState.AUTO_PILOT_RUNNING) {
+ //TODO 车辆进站属于未退自驾状态,此状态不进行限制,否则无法再次发下启动自驾命令
+ isAutopilotAbility = true;
+// unableAutopilotReason = "自动驾驶运行中";
+ } else if (systemState == SystemStatusInfo.SystemState.REMOTE_PILOT_STARTING) {
+ unableAutopilotReason = "平行驾驶启动中";
+ } else if (systemState == SystemStatusInfo.SystemState.REMOTE_PILOT_RUNNING) {
+ unableAutopilotReason = "平行驾驶运行中";
+ } else {
+ unableAutopilotReason = "未知系统状态";
+ }
+ }
+ }
+ } else {
+ isAutopilotAbility = false;//是否能启动自动驾驶
+ unableAutopilotReason = "SSM状态查询超时无响应";//不能启动自动驾驶原因
+ }
+ if (isAutopilotAbility) {
+ if (fsmStatusReasonRespond != null) {
+ int count = fsmStatusReasonRespond.getFsmStatusReasonRespondCount();
+ StringBuilder builder = null;
+ if (count > 0) {
+ builder = new StringBuilder();
+ for (int i = 0; i < count; i++) {
+ String respond = fsmStatusReasonRespond.getFsmStatusReasonRespond(i);
+ builder.append(respond).append(' ');
+ }
+ }
+ if (builder != null) {
+ isAutopilotAbility = false;
+ builder.deleteCharAt(builder.length() - 1);//删除末尾
+ unableAutopilotReason = builder.toString();
+ }
+ }
+ }
+ AutopilotAbilityManager.getInstance().onAutopilotAbility(isAutopilotAbility, unableAutopilotReason);
+ }
+
+ public synchronized void start() {
+ if (timer == null) {
+ timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ if (AutopilotAbilityManager.getInstance().getOnAutopilotAbilityListener() != null) {
+ AutopilotAbilityManager.getInstance().getOnAutopilotAbilityListener().onStatusQuery();
+ }
+ AdasManager.getInstance().sendStatusQueryReq();
+ if (AutopilotAbilityManager.getInstance().getHandler() != null) {
+ if (AutopilotAbilityManager.getInstance().getHandler().hasMessages(WHAT_TIMEOUT))
+ AutopilotAbilityManager.getInstance().getHandler().removeMessages(WHAT_TIMEOUT);
+ AutopilotAbilityManager.getInstance().getHandler().sendEmptyMessageDelayed(WHAT_TIMEOUT, DEFAULT_TIMEOUT);
+ }
+ }
+ }, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步
+ }
+ }
+
+ public synchronized void stop() {
+ if (timer != null) {
+ timer.cancel();
+ timer = null;
+ }
+ }
+
+
+ public void onHandleMessage(Message msg) {
+ if (msg.what == WHAT_TIMEOUT) {
+ onCallback(null);
+ }
+ }
+
+
+}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java
index 5ba1d3d65b..4f06bcbaed 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java
@@ -2,7 +2,7 @@ package com.zhidao.support.adas.high.common.autopilot.ability;
import android.os.Handler;
import android.os.Message;
-import android.text.TextUtils;
+import android.util.Log;
import com.zhidao.support.adas.high.AdasManager;
import com.zhidao.support.adas.high.OnAdasListener;
@@ -12,11 +12,10 @@ import com.zhidao.support.adas.high.common.CupidLogUtils;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import chassis.Chassis;
import chassis.ChassisStatesOuterClass;
+import function_state_management.FSMStatusReasonQueryOuterClass;
import mogo.telematics.pad.MessagePad;
import system_master.SystemStatusInfo;
@@ -31,12 +30,13 @@ public class AutopilotAbilityManager {
private static final String TAG = AutopilotAbilityManager.class.getSimpleName();
private static volatile AutopilotAbilityManager INSTANCE;
private OnAdasListener listener;
- private final Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+");
private Handler handler;
private OnAutopilotAbilityListener onAutopilotAbilityListener;
- private int dockerVersion = -1;//工控机版本
+ private int mapVersion = -1;//工控机版本
+ private boolean isFutianSweeper = false;//是否是福田清扫车
private AutopilotAbility230 autopilotAbility230;
private AutopilotAbility250 autopilotAbility250;
+ private AutopilotAbility330 autopilotAbility330;
private Timer startTimer;
/**
* 不能启动自动驾驶的档位
@@ -81,15 +81,12 @@ public class AutopilotAbilityManager {
}
public void setCarConfig(MessagePad.CarConfigResp carConfig) {
- if (dockerVersion == -1) {
- String v = carConfig.getDockVersion();
- int version = parseVersion(true, v);
- if (version != -1) {
- stopTimer();
- dockerVersion = version;
- CupidLogUtils.i(TAG, "工控机版本=" + dockerVersion);
- initAutopilotAbility();
- }
+ mapVersion = carConfig.getMapVersion();
+ isFutianSweeper = carConfig.getIsFutianSweeper();
+ if (mapVersion != -1) {
+ stopTimer();
+ CupidLogUtils.i(TAG, "工控机版本=" + mapVersion);
+ initAutopilotAbility();
}
}
@@ -120,12 +117,25 @@ public class AutopilotAbilityManager {
}
+ /**
+ * SSM状态更新
+ *
+ * @param statusInfo SSM
+ */
public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) {
if (autopilotAbility250 != null) {
autopilotAbility250.setStatusInfo(statusInfo);
}
+ if (autopilotAbility330 != null) {
+ autopilotAbility330.setStatusInfo(statusInfo);
+ }
}
+ /**
+ * 底盘状态更新
+ *
+ * @param chassisStates 底盘
+ */
public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) {
if (autopilotAbility230 != null) {
autopilotAbility230.setChassisStates(chassisStates);
@@ -135,6 +145,17 @@ public class AutopilotAbilityManager {
}
}
+ /**
+ * FSM OFF状态原因更新
+ *
+ * @param fsmStatusReasonRespond 原因
+ */
+ public void setFsmStatusReasonRespond(FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) {
+ if (autopilotAbility330 != null) {
+ autopilotAbility330.setFsmStatusReasonRespond(fsmStatusReasonRespond);
+ }
+ }
+
public void onHandleMessage(Message msg) {
if (autopilotAbility250 != null) {
autopilotAbility250.onHandleMessage(msg);
@@ -142,14 +163,27 @@ public class AutopilotAbilityManager {
}
private void initAutopilotAbility() {
- if (dockerVersion >= 250) {
+ //目前只有MAP330的清扫车用的新的FSM状态原因查询
+ if (mapVersion >= 330 && isFutianSweeper) {
+ Log.i(TAG, "是否可以启动自动驾驶能力检测使用330版本");
stop230();
+ stop250();
+ if (autopilotAbility330 == null) {
+ autopilotAbility330 = new AutopilotAbility330();
+ autopilotAbility330.start();
+ }
+ } else if (mapVersion >= 250) {
+ Log.i(TAG, "是否可以启动自动驾驶能力检测使用250版本");
+ stop230();
+ stop330();
if (autopilotAbility250 == null) {
autopilotAbility250 = new AutopilotAbility250();
autopilotAbility250.start();
}
} else {
+ Log.i(TAG, "是否可以启动自动驾驶能力检测使用230版本");
stop250();
+ stop330();
if (autopilotAbility230 == null) {
autopilotAbility230 = new AutopilotAbility230();
autopilotAbility230.start();
@@ -172,6 +206,13 @@ public class AutopilotAbilityManager {
}
}
+ private void stop330() {
+ if (autopilotAbility330 != null) {
+ autopilotAbility330.stop();
+ autopilotAbility330 = null;
+ }
+ }
+
private void stopTimer() {
if (startTimer != null) {
startTimer.cancel();
@@ -189,8 +230,8 @@ public class AutopilotAbilityManager {
startTimer.schedule(new TimerTask() {
@Override
public void run() {
- if (dockerVersion == -1 && AdasManager.getInstance().getIpcConnectionStatus() == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
- dockerVersion = 230;
+ if (mapVersion == -1 && AdasManager.getInstance().getIpcConnectionStatus() == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
+ mapVersion = 230;
initAutopilotAbility();
}
}
@@ -204,37 +245,8 @@ public class AutopilotAbilityManager {
stop230();
stop250();
handler = null;
- dockerVersion = -1;
+ mapVersion = -1;
+ isFutianSweeper = false;
}
-
- /**
- * 解析版本 格式 xxx.xxx.xxx(x的数量不固定)
- *
- * @param isUserAll 是否使用全部截取数据 true:表示 12.34.56 截取之后 123456 false:表示12.34.56 截取之后 12
- * @param ver 版本字符串
- * @return -1表示解析失败
- */
- public int parseVersion(boolean isUserAll, String ver) {
- int version = -1;
- if (!TextUtils.isEmpty(ver)) {
- try {
- Matcher matcher = pattern.matcher(ver);
- if (matcher.find()) {
- String group = matcher.group();
- if (!TextUtils.isEmpty(group)) {
- if (isUserAll) {
- group = group.replace(".", "");
- } else {
- group = group.split("\\.")[0];
- }
- version = Integer.parseInt(group);
- }
- }
- } catch (Exception e) {
- CupidLogUtils.e(TAG, "版本解析失败=" + ver, e);
- }
- }
- return version;
- }
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
index e35bbb8071..a1b5876195 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
@@ -4,6 +4,7 @@ import android.os.SystemClock;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasChannel;
+import com.zhidao.support.adas.high.AdasManager;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.AutopilotReview;
import com.zhidao.support.adas.high.common.CupidLogUtils;
@@ -23,18 +24,21 @@ public class AutopilotStateMessage extends MyAbstractMessageHandler {
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.AutopilotState autopilotState = MessagePad.AutopilotState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
- AdasChannel.calculateTimeConsumingOnDispatchRaw("自动驾驶状态", raw.receiveTime);
- long nowTime = 0;
- if (CupidLogUtils.isEnableLog())
- nowTime = SystemClock.elapsedRealtime();
- if (adasListener != null) {
- adasListener.onAutopilotState(raw.getHeader(), autopilotState);
- }
- if (autopilotReview != null) {
- autopilotReview.onAutopilotResult(autopilotState);
- }
- AdasChannel.calculateTimeConsumingBusiness("自动驾驶状态", nowTime);
+ //判断当前工控机非清扫车330及以上将进行解析(清扫车330及以上使用FSM,此接口将被兼容调用)
+ if (AdasManager.getInstance().getCarConfig() == null || !(AdasManager.getInstance().getCarConfig().getMapVersion() >= 330 && AdasManager.getInstance().getCarConfig().getIsFutianSweeper())) {
+ MessagePad.AutopilotState autopilotState = MessagePad.AutopilotState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
+ AdasChannel.calculateTimeConsumingOnDispatchRaw("自动驾驶状态", raw.receiveTime);
+ long nowTime = 0;
+ if (CupidLogUtils.isEnableLog())
+ nowTime = SystemClock.elapsedRealtime();
+ if (adasListener != null) {
+ adasListener.onAutopilotState(raw.getHeader(), autopilotState);
+ }
+ if (autopilotReview != null) {
+ autopilotReview.onAutopilotResult(autopilotState);
+ }
+ AdasChannel.calculateTimeConsumingBusiness("自动驾驶状态", nowTime);
// CupidLogUtils.e("自动驾驶状态--->" + autopilotState.toString());
+ }
}
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
index 7a63aed0b6..01b40555df 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
@@ -1,6 +1,7 @@
package com.zhidao.support.adas.high.msg;
import android.os.SystemClock;
+import android.text.TextUtils;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasChannel;
@@ -20,6 +21,7 @@ public class CarConfigRespMessage extends MyAbstractMessageHandler {
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
MessagePad.CarConfigResp carConfigResp = MessagePad.CarConfigResp.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
+ carConfigResp = addPersonalParameter(carConfigResp);
AdasChannel.calculateTimeConsumingOnDispatchRaw("车机基础信息应答", raw.receiveTime);
AutopilotAbilityManager.getInstance().setCarConfig(carConfigResp);
AdasManager.getInstance().setCarConfig(carConfigResp);
@@ -32,4 +34,27 @@ public class CarConfigRespMessage extends MyAbstractMessageHandler {
AdasChannel.calculateTimeConsumingBusiness("车机基础信息应答", nowTime);
CupidLogUtils.e("车机基础信息应答--->" + carConfigResp.toString());
}
+
+ /**
+ * 添加私有参数
+ */
+ private MessagePad.CarConfigResp addPersonalParameter(MessagePad.CarConfigResp carConfigResp) {
+ if (carConfigResp != null) {
+ String dockVersion = carConfigResp.getDockVersion();
+ String carType = carConfigResp.getCarType().toLowerCase();
+ String subCarType = carConfigResp.getSubCarType().toLowerCase();
+ MessagePad.CarConfigResp.Builder builder = carConfigResp.toBuilder();
+ builder.setMapVersion(AdasManager.getInstance().parseVersion(dockVersion));
+ builder.setIsDF("df".equals(carType))//是否是东风
+ .setIsHQ("hq".equals(carType))//是否是红旗
+ .setIsJinlv("jinlv".equals(carType) && TextUtils.isEmpty(subCarType))//是否是金旅小巴
+ .setIsJinlvM1("jinlv".equals(carType) && "m1".equals(subCarType))//是否是金旅M1
+ .setIsJinlvM2("jinlv".equals(carType) && "m2".equals(subCarType))//是否是金旅M2
+ .setIsFutianSweeper("sweeper".equals(carType))//是否是福田清扫车
+ .setIsKaiwo("kaiwo".equals(carType));//是否是开沃
+ return builder.build();
+ }
+ return null;
+ }
+
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMStatusReasonRespondMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMStatusReasonRespondMessage.java
new file mode 100644
index 0000000000..6a6a623aab
--- /dev/null
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSMStatusReasonRespondMessage.java
@@ -0,0 +1,36 @@
+package com.zhidao.support.adas.high.msg;
+
+import android.os.SystemClock;
+import android.util.Log;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.zhidao.support.adas.high.AdasChannel;
+import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.common.CupidLogUtils;
+import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager;
+import com.zhidao.support.adas.high.protocol.RawData;
+
+import function_state_management.FSMStatusReasonQueryOuterClass;
+
+/**
+ * FSM状态原因查询 当FSMFunctionStates的类型是XXX_DRIVING_OFF时查询OFF的原因结果回调
+ */
+public class FSMStatusReasonRespondMessage extends MyAbstractMessageHandler {
+
+ public FSMStatusReasonRespondMessage() {
+ }
+
+ @Override
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond respond = FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
+ AdasChannel.calculateTimeConsumingOnDispatchRaw("FSM状态原因查询", raw.receiveTime);
+ long nowTime = 0;
+ if (CupidLogUtils.isEnableLog())
+ nowTime = SystemClock.elapsedRealtime();
+ AutopilotAbilityManager.getInstance().setFsmStatusReasonRespond(respond);
+// if (adasListener != null) {
+// adasListener.onFSMStatusReasonRespond(raw.getHeader(), respond);
+// }
+ AdasChannel.calculateTimeConsumingBusiness("FSM状态原因查询", nowTime);
+ }
+}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FunctionStatesMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FunctionStatesMessage.java
index ff734645a7..435f84dff3 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FunctionStatesMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FunctionStatesMessage.java
@@ -4,28 +4,119 @@ import android.os.SystemClock;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasChannel;
+import com.zhidao.support.adas.high.AdasManager;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.CupidLogUtils;
+import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager;
import com.zhidao.support.adas.high.protocol.RawData;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
import function_state_management.FunctionStates;
+import mogo.telematics.pad.MessagePad;
/**
- * 重构后的功能状态
+ * 重构后的功能状态(FSM) 20hz
*/
public class FunctionStatesMessage extends MyAbstractMessageHandler {
+ private final static String TAG = FunctionStatesMessage.class.getSimpleName();
+ private final Map modeMap = new HashMap<>();
+ private final AtomicLong timesCount = new AtomicLong(0);//几次,此接口1秒20次
+ private final AtomicInteger oldMode = new AtomicInteger(0);
+
+ private FunctionStates.PilotDrivingFunctionState oldPilotDrivingFunctionState = null;//上次自动驾驶状态
+
+ public FunctionStatesMessage() {
+ initModeMap();
+ }
+
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
FunctionStates.FSMFunctionStates functionStates = FunctionStates.FSMFunctionStates.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
AdasChannel.calculateTimeConsumingOnDispatchRaw("重构后的功能状态", raw.receiveTime);
long nowTime = 0;
- if (CupidLogUtils.isEnableLog())
- nowTime = SystemClock.elapsedRealtime();
+ if (CupidLogUtils.isEnableLog()) nowTime = SystemClock.elapsedRealtime();
+ checkPilotDrivingFunctionStateOFF(functionStates.getPilotDrivingFunctionState());
if (adasListener != null) {
- adasListener.onFunctionStates(raw.getHeader(), functionStates);
+ MessagePad.Header header = raw.getHeader();
+ adasListener.onFunctionStates(header, functionStates);
+ AdasManager manager = AdasManager.getInstance();
+ if (manager.getCarConfig() != null && manager.getCarConfig().getMapVersion() >= 330 && manager.getCarConfig().getIsFutianSweeper()) {//判断当前MAP版本>=330并且是清扫车才调用兼容方法
+ compatibility(header, functionStates, adasListener);
+ }
}
AdasChannel.calculateTimeConsumingBusiness("重构后的功能状态", nowTime);
}
+ /**
+ * 检查自动驾驶状态是否为OFF
+ *
+ * @param pilotDrivingFunctionState 自动驾驶状态
+ */
+ private void checkPilotDrivingFunctionStateOFF(FunctionStates.PilotDrivingFunctionState pilotDrivingFunctionState) {
+ if (oldPilotDrivingFunctionState != pilotDrivingFunctionState) {
+ oldPilotDrivingFunctionState = pilotDrivingFunctionState;
+ if (pilotDrivingFunctionState == FunctionStates.PilotDrivingFunctionState.PILOT_DRIVING_OFF) {
+ //如果自动驾驶状态为OFF需要查询原因
+ AdasManager.getInstance().sendFSMStatusReasonQuery(1);
+ } else {
+ AutopilotAbilityManager.getInstance().setFsmStatusReasonRespond(null);
+ }
+ }
+
+ }
+
+ //兼容老版本的自动驾驶状态接口
+ private void compatibility(MessagePad.Header header, FunctionStates.FSMFunctionStates functionStates, OnAdasListener adasListener) {
+ int mode = 0;
+ int iter = functionStates.getPilotDrivingFunctionState().getNumber();
+ if (modeMap.containsKey(iter)) {
+ if (modeMap.get(iter)) {
+ mode = 1;
+ }
+ }
+ iter = functionStates.getParallelDrivingFunctionState().getNumber();
+ if (modeMap.containsKey(iter)) {
+ if (modeMap.get(iter)) {
+ mode = 6;
+ }
+ }
+ //如果有变化立即更新
+ if (oldMode.get() != mode) {
+ oldMode.set(mode);
+ timesCount.set(-19);
+ sendAutopilotState(mode, header, adasListener);
+ CupidLogUtils.i(TAG, "FSM转老自动驾驶,立即变更状态=" + (mode + 1));
+ }
+ //降频1秒发一次
+ if (timesCount.getAndIncrement() % 20 == 0) {
+ sendAutopilotState(mode, header, adasListener);
+ CupidLogUtils.i(TAG, "FSM转老自动驾驶,定频状态=" + (mode + 1));
+ }
+ }
+
+ private void sendAutopilotState(int mode, MessagePad.Header header, OnAdasListener adasListener) {
+ MessagePad.AutopilotState autopilotState = MessagePad.AutopilotState.newBuilder().setAutopilotMode(mode).setState(mode + 1).build();
+ adasListener.onAutopilotState(header.toBuilder().setMsgType(MessagePad.MessageType.MsgTypeAutopilotState).build(), autopilotState);
+
+ }
+
+ private void initModeMap() {
+ modeMap.put(0, false);
+ modeMap.put(1, false);
+ modeMap.put(2, true);
+ modeMap.put(3, true);
+ modeMap.put(4, true);
+ modeMap.put(5, true);
+ modeMap.put(6, false);
+ modeMap.put(7, true);
+ modeMap.put(8, true);
+ modeMap.put(9, true);
+ modeMap.put(10, true);
+ }
+
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java
index 1cb5b0dc9c..f522fbf5a7 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java
@@ -40,6 +40,7 @@ public class MyMessageFactory implements IMyMessageFactory {
private IMsg pointCloudMessage;//3D点云
private IMsg sweeperCloudTaskMessage;//云控下发清扫车任务指令
private IMsg m1StitchedVideoMessage;//M1拼接视频
+ private IMsg fSMStatusReasonRespondMessage;//FSM状态原因查询
private final AutopilotReview autopilotReview;
@@ -206,12 +207,18 @@ public class MyMessageFactory implements IMyMessageFactory {
}
return sweeperCloudTaskMessage;
} else if (messageType == MessageType.TYPE_RECEIVE_M1_STITCHED_VIDEO.typeCode) {
- //清扫车后摄像头
+ //M1拼接视频
if (m1StitchedVideoMessage == null) {
m1StitchedVideoMessage = new M1StitchedVideoMessage();
}
return m1StitchedVideoMessage;
- } else {
+ } else if (messageType == MessageType.TYPE_RECEIVE_FSM_STATUS_REASON_QUERY_RESP.typeCode) {
+ //FSM状态原因查询
+ if (fSMStatusReasonRespondMessage == null) {
+ fSMStatusReasonRespondMessage = new FSMStatusReasonRespondMessage();
+ }
+ return fSMStatusReasonRespondMessage;
+ } else {
//MessageType.TYPE_DEFAULT.typeCode
return null;
}