From 152d3a9d898baec75b0386b16848085f8af30332 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Sun, 7 Apr 2024 16:18:12 +0800 Subject: [PATCH 01/14] =?UTF-8?q?[640][adas]=20MogoReport=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0420?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 4 +- .../zhjt/mogo/adas/data/bean/MogoReport.java | 876 +++++++++++------- .../{ReportCodeInfo.java => ReportInfo.java} | 15 +- .../bean/{CodeInfo.java => ReportState.java} | 8 +- 4 files changed, 547 insertions(+), 356 deletions(-) rename libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/{ReportCodeInfo.java => ReportInfo.java} (53%) rename libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/{CodeInfo.java => ReportState.java} (58%) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 2815b8882d..f886339bb0 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -988,7 +988,7 @@ class MoGoAutopilotControlProvider : * @param resultCode 上报字段code */ override fun getReportResultDesc(resultCode: String): String { - return MogoReport.Result.getDesc(resultCode) + return MogoReport.ResultDesc.getDesc(resultCode) } /** @@ -996,7 +996,7 @@ class MoGoAutopilotControlProvider : * @param actionCode 上报字段code */ override fun getReportActionDesc(actionCode: String): String { - return MogoReport.Action.getDesc(actionCode) + return MogoReport.ActionDesc.getDesc(actionCode) } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java index 35ed63dc7b..7ce0bae69e 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/MogoReport.java @@ -2,132 +2,171 @@ package com.zhjt.mogo.adas.data.bean; import java.lang.reflect.Field; import java.util.HashMap; +import java.util.Locale; import java.util.Map; /** * 监控事件报告中定义的事件以及解释 - * 根据MAP3.7.1事件定义编写 - * http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=123445242 最后修改于2024-01-22 + * 根据MAP4.2.0事件定义编写 最后修改于2024-04-07 */ public class MogoReport { - public static final String RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED";//自动驾驶系统启动失败 - public static final String RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE";//无法启动自动驾驶 - public static final String RESULT_AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR";//自动驾驶效果受影响 - public static final String RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE";//无法启动远程驾驶 - public static final String RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR";//远程驾驶效果受影响 - public static final String RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING";//存在不确定因素 + public interface Result { + @ReportState("2.3.0") + String AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED";//自动驾驶系统启动失败 + @ReportState("2.3.0") + String AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE";//无法启动自动驾驶 + @ReportState("2.3.0") + String AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR";//自动驾驶效果受影响 + @ReportState("2.4.0") + String REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE";//无法启动远程驾驶 + @ReportState("2.4.0") + String REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR";//远程驾驶效果受影响 + @ReportState("2.5.0") + String SHOW_WARNING = "RESULT_SHOW_WARNING";//存在不确定因素 + } - public enum Result { - AUTOPILOT_SYSTEM_UNSTARTED(RESULT_AUTOPILOT_SYSTEM_UNSTARTED, "自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报"), - AUTOPILOT_DISABLE(RESULT_AUTOPILOT_DISABLE, "无法启动自动驾驶"), - AUTOPILOT_INFERIOR(RESULT_AUTOPILOT_INFERIOR, "自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。\n例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。"), - REMOTEPILOT_DISABLE(RESULT_REMOTEPILOT_DISABLE, "无法启动远程驾驶"), - REMOTEPILOT_INFERIOR(RESULT_REMOTEPILOT_INFERIOR, "远程驾驶部分功能受影响。例如网络高延迟"), - SHOW_WARNING(RESULT_SHOW_WARNING, "一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。\n如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件。"); + public enum ResultDesc { + AUTOPILOT_SYSTEM_UNSTARTED(Result.AUTOPILOT_SYSTEM_UNSTARTED, "自动驾驶系统启动失败"), + AUTOPILOT_DISABLE(Result.AUTOPILOT_DISABLE, "无法启动自动驾驶"), + AUTOPILOT_INFERIOR(Result.AUTOPILOT_INFERIOR, "自动驾驶效果受影响"), + REMOTEPILOT_DISABLE(Result.REMOTEPILOT_DISABLE, "无法启动远程驾驶"), + REMOTEPILOT_INFERIOR(Result.REMOTEPILOT_INFERIOR, "远程驾驶效果受影响"), + SHOW_WARNING(Result.SHOW_WARNING, "存在不确定因素,警示"); /** * 消息result code */ - public final String resultCode; + public final String result; /** * 描述 */ public final String desc; - Result(String resultCode, String desc) { - this.resultCode = resultCode; + ResultDesc(String result, String desc) { + this.result = result; this.desc = desc; } - public static String getDesc(String resultCode) { - switch (resultCode) { - case RESULT_AUTOPILOT_SYSTEM_UNSTARTED: + public static String getDesc(String result) { + switch (result) { + case Result.AUTOPILOT_SYSTEM_UNSTARTED: return AUTOPILOT_SYSTEM_UNSTARTED.desc; - case RESULT_AUTOPILOT_DISABLE: + case Result.AUTOPILOT_DISABLE: return AUTOPILOT_DISABLE.desc; - case RESULT_AUTOPILOT_INFERIOR: + case Result.AUTOPILOT_INFERIOR: return AUTOPILOT_INFERIOR.desc; - case RESULT_REMOTEPILOT_DISABLE: + case Result.REMOTEPILOT_DISABLE: return REMOTEPILOT_DISABLE.desc; - case RESULT_REMOTEPILOT_INFERIOR: + case Result.REMOTEPILOT_INFERIOR: return REMOTEPILOT_INFERIOR.desc; - case RESULT_SHOW_WARNING: + case Result.SHOW_WARNING: return SHOW_WARNING.desc; default: - return resultCode; + return result; } } } - public static final String ACTION_CONTACT_TECH_SUPPORT = "ACTION_CONTACT_TECH_SUPPORT"; - public static final String ACTION_CONTACT_MAINTENANCE = "ACTION_CONTACT_MAINTENANCE"; - public static final String ACTION_CONTACT_HARDWARE_ENGINEER = "ACTION_CONTACT_HARDWARE_ENGINEER"; - public static final String ACTION_REBOOT_PAD = "ACTION_REBOOT_PAD"; - public static final String ACTION_REBOOT_VEHICLE = "ACTION_REBOOT_VEHICLE"; - public static final String ACTION_CHECK_GEAR = "ACTION_CHECK_GEAR"; - public static final String ACTION_CHECK_NETWORK = "ACTION_CHECK_NETWORK"; - public static final String ACTION_TRY_AGAIN_LATER = "ACTION_TRY_AGAIN_LATER"; - public static final String ACTION_REMOTEPILOT_REQUEST = "ACTION_REMOTEPILOT_REQUEST"; - public static final String ACTION_MANUAL_HANDLE_REQUEST = "ACTION_MANUAL_HANDLE_REQUEST"; + public interface Action { + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") + String CONTACT_TECH_SUPPORT = "ACTION_CONTACT_TECH_SUPPORT"; + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") + String CONTACT_MAINTENANCE = "ACTION_CONTACT_MAINTENANCE"; + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") + String CONTACT_HARDWARE_ENGINEER = "ACTION_CONTACT_HARDWARE_ENGINEER"; + @ReportState(value = "2.3.0") + String REBOOT_PAD = "ACTION_REBOOT_PAD"; + @ReportState(value = "2.3.0") + String REBOOT_VEHICLE = "ACTION_REBOOT_VEHICLE"; + @ReportState(value = "2.3.0") + String CHECK_GEAR = "ACTION_CHECK_GEAR"; + @ReportState(value = "2.3.0") + String CHECK_NETWORK = "ACTION_CHECK_NETWORK"; + @ReportState(value = "2.4.0") + String TRY_AGAIN_LATER = "ACTION_TRY_AGAIN_LATER"; + @ReportState(value = "2.11.0") + String REMOTEPILOT_REQUEST = "ACTION_REMOTEPILOT_REQUEST"; + @ReportState(value = "3.3.0") + String MANUAL_HANDLE_REQUEST = "ACTION_MANUAL_HANDLE_REQUEST"; + @ReportState(value = "4.2.0") + String MANUAL_HANDLE_IMMEDIATELY = "ACTION_MANUAL_HANDLE_IMMEDIATELY"; + @ReportState(value = "4.2.0") + String REBOOT_SYSTEM = "ACTION_REBOOT_SYSTEM"; + @ReportState(value = "4.2.0") + String KEEP_POWERON_AND_WAIT = "ACTION_KEEP_POWERON_AND_WAIT"; + } - public enum Action { - CONTACT_TECH_SUPPORT(ACTION_CONTACT_TECH_SUPPORT, "联系技术支持"), - CONTACT_MAINTENANCE(ACTION_CONTACT_MAINTENANCE, "联系运维"), - CONTACT_HARDWARE_ENGINEER(ACTION_CONTACT_HARDWARE_ENGINEER, "联系硬件"), - REBOOT_PAD(ACTION_REBOOT_PAD, "重启Pad"), - REBOOT_VEHICLE(ACTION_REBOOT_VEHICLE, "重启车辆"), - CHECK_GEAR(ACTION_CHECK_GEAR, "检查车辆档位等影响自动驾驶的因素"), - CHECK_NETWORK(ACTION_CHECK_NETWORK, "检查网络连接和路由器等影响通信的因素"), - TRY_AGAIN_LATER(ACTION_TRY_AGAIN_LATER, "请稍后重试"), - REMOTEPILOT_REQUEST(ACTION_REMOTEPILOT_REQUEST, "请求远程驾驶"), - MANUAL_HANDLE_REQUEST(ACTION_MANUAL_HANDLE_REQUEST, "请安全员注意接管"), + public enum ActionDesc { + + CONTACT_TECH_SUPPORT(Action.CONTACT_TECH_SUPPORT, "联系技术支持"), + CONTACT_MAINTENANCE(Action.CONTACT_MAINTENANCE, "联系运维"), + CONTACT_HARDWARE_ENGINEER(Action.CONTACT_HARDWARE_ENGINEER, "联系硬件"), + REBOOT_PAD(Action.REBOOT_PAD, "重启Pad"), + REBOOT_VEHICLE(Action.REBOOT_VEHICLE, "重启车辆"), + CHECK_GEAR(Action.CHECK_GEAR, "检查车辆档位仪表盘等自车因素"), + CHECK_NETWORK(Action.CHECK_NETWORK, "检查网络连接和路由器等通信因素"), + TRY_AGAIN_LATER(Action.TRY_AGAIN_LATER, "请稍后重试"), + REMOTEPILOT_REQUEST(Action.REMOTEPILOT_REQUEST, "请求远程驾驶"), + MANUAL_HANDLE_REQUEST(Action.MANUAL_HANDLE_REQUEST, "请安全员注意接管"), + MANUAL_HANDLE_IMMEDIATELY(Action.MANUAL_HANDLE_IMMEDIATELY, "请安全员立即接管"), + REBOOT_SYSTEM(Action.REBOOT_SYSTEM, "系统软重启"), + KEEP_POWERON_AND_WAIT(Action.KEEP_POWERON_AND_WAIT, "请安全位置停车,保持上电,等待修复完成"), ; /** * 消息Action code */ - public final String actionCode; + public final String action; /** * 描述 */ public final String desc; - Action(String actionCode, String desc) { - this.actionCode = actionCode; + ActionDesc(String action, String desc) { + this.action = action; this.desc = desc; } - public static String getDesc(String actionCode) { - switch (actionCode) { - case ACTION_CONTACT_TECH_SUPPORT: + public static String getDesc(String action) { + switch (action) { + case Action.CONTACT_TECH_SUPPORT: return CONTACT_TECH_SUPPORT.desc; - case ACTION_CONTACT_MAINTENANCE: + case Action.CONTACT_MAINTENANCE: return CONTACT_MAINTENANCE.desc; - case ACTION_CONTACT_HARDWARE_ENGINEER: + case Action.CONTACT_HARDWARE_ENGINEER: return CONTACT_HARDWARE_ENGINEER.desc; - case ACTION_REBOOT_PAD: + case Action.REBOOT_PAD: return REBOOT_PAD.desc; - case ACTION_REBOOT_VEHICLE: + case Action.REBOOT_VEHICLE: return REBOOT_VEHICLE.desc; - case ACTION_CHECK_GEAR: + case Action.CHECK_GEAR: return CHECK_GEAR.desc; - case ACTION_CHECK_NETWORK: + case Action.CHECK_NETWORK: return CHECK_NETWORK.desc; - case ACTION_TRY_AGAIN_LATER: + case Action.TRY_AGAIN_LATER: return TRY_AGAIN_LATER.desc; - case ACTION_REMOTEPILOT_REQUEST: + case Action.REMOTEPILOT_REQUEST: return REMOTEPILOT_REQUEST.desc; - case ACTION_MANUAL_HANDLE_REQUEST: + case Action.MANUAL_HANDLE_REQUEST: return MANUAL_HANDLE_REQUEST.desc; + case Action.MANUAL_HANDLE_IMMEDIATELY: + return MANUAL_HANDLE_IMMEDIATELY.desc; + case Action.REBOOT_SYSTEM: + return REBOOT_SYSTEM.desc; + case Action.KEEP_POWERON_AND_WAIT: + return KEEP_POWERON_AND_WAIT.desc; default: - return actionCode; + return action; } } } @@ -141,7 +180,7 @@ public class MogoReport { * 系统初始化阶段错误 */ interface EINIT { - @CodeInfo("2.4.0") + @ReportState("2.4.0") String LOST_FILE = "EINIT_LOST_FILE";//系统启动时缺失必要文件,或者容器配置错误 } @@ -149,15 +188,17 @@ public class MogoReport { * 硬件故障 */ interface EHW { - @CodeInfo("2.3.0") + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") String LIDAR = "EHW_LIDAR";//未检测到雷达 - @CodeInfo("2.3.0") + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") String GNSS = "EHW_GNSS";//未检测到gnss @Deprecated - @CodeInfo(value = "2.3.0", deprecated = "3.4.0") + @ReportState(value = "2.3.0", deprecated = "3.4.0") String RTK = "EHW_RTK";//定位不准,gnss节点反馈的状态不是42 @Deprecated - @CodeInfo(value = "2.3.0", deprecated = "3.4.0") + @ReportState(value = "2.3.0", deprecated = "3.4.0") String CAN = "EHW_CAN";//无法与底盘通信,获取不到地盘状态,无法进入自动驾驶 } @@ -166,135 +207,139 @@ public class MogoReport { */ interface EMAP { /*******自动驾驶系统故障*******/ - @CodeInfo("2.3.0") + @ReportState("2.3.0") String NODE = "EMAP_NODE";//节点异常退出 - @CodeInfo("2.3.0") + @ReportState("2.3.0") String NODE_DEAD = "EMAP_NODE_DEAD";//节点异常退出过多,放弃重启 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String DATA_NOT_EXIST = "EMAP_DATA_NOT_EXIST";//无法加载到正确的sqlite文件 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TRA_NOT_EXIST = "EMAP_TRA_NOT_EXIST";//无法找到轨迹文件 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TRA_LOAD_FAILED = "EMAP_TRA_LOAD_FAILED";//加载轨迹文件失败 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String ENGINE_INIT_FAILED = "EMAP_ENGINE_INIT_FAILED";//引擎初始化失败,包括轨迹路径不存在;vehicle_config.txt加载失败 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String ATTITUDE_INIT_FAILED = "EMAP_ATTITUDE_INIT_FAILED";//当前位置距离轨迹距离大于15m - @CodeInfo("2.4.0") + @ReportState("2.4.0") String EXIT_AUTOPILOT_FOR_PLANNING = "EMAP_EXIT_AUTOPILOT_FOR_PLANNING";//因planning掉帧强退自动驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String EXIT_AUTOPILOT_FOR_LOCATION = "EMAP_EXIT_AUTOPILOT_FOR_LOCATION";//因location掉帧强退自动驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String EXIT_AUTOPILOT_FOR_CHASSIS = "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS";//因底盘消息掉帧强退自动驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String EXIT_AUTOPILOT_FOR_DISTANCE = "EMAP_EXIT_AUTOPILOT_FOR_DISTANCE";//因planning起点距离当前过远强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_BRAKE = "EMAP_EXIT_AUTOPILOT_FOR_BRAKE";//制动踏板干预而强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_ACCEL = "EMAP_EXIT_AUTOPILOT_FOR_ACCEL";//加速踏板干预而强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_STEER = "EMAP_EXIT_AUTOPILOT_FOR_STEER";//方向盘干预而强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_GEAR_SWITCH = "EMAP_EXIT_AUTOPILOT_FOR_GEAR_SWITCH";//档位切换干预而强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE = "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE";//底盘不响应请求而强退自动驾驶 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN = "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN";//底盘退出原因未知而强退自动驾驶 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_CANADAPTER_TIMEOUT = "EMAP_ENTRY_AUTOPILOT_FOR_CANADAPTER_TIMEOUT";//can_adapter消息超时未进入自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_PLANNING_TIMEOUT = "EMAP_ENTRY_AUTOPILOT_FOR_PLANNING_TIMEOUT";//PLANNING消息超时未进自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_LOCATION_TIMEOUT = "EMAP_ENTRY_AUTOPILOT_FOR_LOCATION_TIMEOUT";//定位消息超时未进自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_BRAKE = "EMAP_ENTRY_AUTOPILOT_FOR_BRAKE";//制动踏板干预未进自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_ACCEL = "EMAP_ENTRY_AUTOPILOT_FOR_ACCEL";//加速踏板干预未进自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_STEER = "EMAP_ENTRY_AUTOPILOT_FOR_STEER";//方向盘干预未进自驾 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_GEAR_SWITCH = "EMAP_ENTRY_AUTOPILOT_FOR_GEAR_SWITCH";//档位切换干预未进自驾 - @CodeInfo("3.2.0") + @ReportState("3.2.0") String ENTRY_AUTOPILOT_FOR_DISTANCE = "EMAP_ENTRY_AUTOPILOT_FOR_DISTANCE";//因planning起点距离太远不可进自驾 - @CodeInfo("3.2.0") + @ReportState("3.2.0") String ENTRY_AUTOPILOT_FOR_VEHICLE_ERROR = "EMAP_ENTRY_AUTOPILOT_FOR_VEHICLE_ERROR";//车辆故障需要保修,故障原因见msg信息 - @CodeInfo("3.2.0") + @ReportState("3.2.0") String ENTRY_AUTOPILOT_FOR_CHASSIS_FAULT = "EMAP_ENTRY_AUTOPILOT_FOR_CHASSIS_FAULT";//底盘异常,需要下电重启 - @CodeInfo("3.2.0") + @ReportState("3.2.0") String ENTRY_AUTOPILOT_FOR_UNKNOWN = "EMAP_ENTRY_AUTOPILOT_FOR_UNKNOWN";//进自驾原因确实未知,必须联系软硬件技术进行排查 - @CodeInfo("2.9.0") + @ReportState("2.9.0") String ENTRY_AUTOPILOT_FOR_OTHER_CTL = "EMAP_ENTRY_AUTOPILOT_FOR_OTHER_CTL";//其他干预未进自驾,请检查仪表盘和开关项(如双闪,制动灯灯等 可在msg中补充原因信息) @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.4.0") + @ReportState(value = "2.4.0", deprecated = "3.4.0") String HADMAP_ENGINE_NO_ROUTING_INFO = "EMAP_HADMAP_ENGINE_NO_ROUTING_INFO";//hadmap_engine算路失败或未找到轨迹文件导致的轨迹文件信息未发布 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.4.0") + @ReportState(value = "2.4.0", deprecated = "3.4.0") String HADMAP_NO_TRAJECTORY = "EMAP_HADMAP_NO_TRAJECTORY";//hadmap未发布全局路径 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.4.0") + @ReportState(value = "2.4.0", deprecated = "3.4.0") String HADMAP_PLANNING_NO_TRAJECTORY = "EMAP_HADMAP_PLANNING_NO_TRAJECTORY";//local_planning未发布局部轨迹 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.4.0") + @ReportState(value = "2.4.0", deprecated = "3.4.0") String CONTROL_ABNORMAL_COMMAND = "EMAP_CONTROL_ABNORMAL_COMMAND";//controller发布的控制指令异常 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.4.0") + @ReportState(value = "2.4.0", deprecated = "3.4.0") String CAN_ADAPTER_NO_CHASSIS_INFO = "EMAP_CAN_ADAPTER_NO_CHASSIS_INFO";//can_adapter未成功转发地盘信息 - @CodeInfo("3.3.1") + @ReportState("3.3.1") String TRAJECTORY_LOST_WHEN_AUTOPILOT = "EMAP_TRAJECTORY_LOST_WHEN_AUTOPILOT";//自驾状态,但是全局轨迹丢失超过1.5s - @CodeInfo("3.3.1") + @ReportState("3.3.1") String PLANNING_FOR_PERCEPTION_TIMEOUT = "EMAP_PLANNING_FOR_PERCEPTION_TIMEOUT";//鹰眼下发进入自驾指令,自车还未进入自驾,感知延迟超过1s - @CodeInfo("3.3.1") + @ReportState("3.3.1") String PLANNING_FOR_HADMAP_ENGINE_LANES_MSG_TIMEOUT = "EMAP_PLANNING_FOR_HADMAP_ENGINE_LANES_MSG_TIMEOUT";//鹰眼下发进入自驾指令,自车还未进入自驾,地图车道数据延迟超过1s - @CodeInfo("3.3.1") + @ReportState("3.3.1") String PLANNING_FOR_PREDICTION_TIMEOUT = "EMAP_PLANNING_FOR_PREDICTION_TIMEOUT";//鹰眼下发进入自驾指令,自车还未进入自驾,预测数据延迟超过1s - @CodeInfo("3.6.0") + @ReportState("3.6.0") String NODE_CPU_EXCEED = "EMAP_NODE_CPU_EXCEED";//节点cpu占用超过阈值 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String NODE_MEMORY_EXCEED = "EMAP_NODE_MEMORY_EXCEED";//节点内存占用超过阈值 /*******平行驾驶相关故障*******/ - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_BRAKE = "EMAP_ENTRY_REMOTEPILOT_FOR_BRAKE";//制动踏板干预未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_STEER = "EMAP_ENTRY_REMOTEPILOT_FOR_STEER";//方向盘干预未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_ACCEL = "EMAP_ENTRY_REMOTEPILOT_FOR_ACCEL";//加速踏板干预未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_GEAR_SWITCH = "EMAP_ENTRY_REMOTEPILOT_FOR_GEAR_SWITCH";//档位切换干预未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_CANADAPTER_TIMEOUT = "EMAP_ENTRY_REMOTEPILOT_FOR_CANADAPTER_TIMEOUT";//底盘消息超时未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_CTRLCMD_TIMEOUT = "EMAP_ENTRY_REMOTEPILOT_FOR_CTRLCMD_TIMEOUT";//平行驾驶控制指令超时未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_CHASSIS_FAULT = "EMAP_ENTRY_REMOTEPILOT_FOR_CHASSIS_FAULT";//底盘异常未进平行驾驶,需要下电重启 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_CHASSIS_NO_RESPONSE = "EMAP_ENTRY_REMOTEPILOT_FOR_CHASSIS_NO_RESPONSE";//底盘不响应请求未进平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_OTHER_CTL = "EMAP_ENTRY_REMOTEPILOT_FOR_OTHER_CTL";//其他干预未进平行驾驶,其他干预的原因见msg信息 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_VEHICLE_ERROR = "EMAP_ENTRY_REMOTEPILOT_FOR_VEHICLE_ERROR";//车辆故障需要保修,故障原因见msg信息 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENTRY_REMOTEPILOT_FOR_UNKNOWN = "EMAP_ENTRY_REMOTEPILOT_FOR_UNKNOWN";//未进平行驾驶原因确实未知,必须联系软硬件技术进行排查 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_CTRLCMD_TIMEOUT = "EMAP_EXIT_REMOTEPILOT_FOR_CTRLCMD_TIMEOUT";//因平行驾驶控制指令掉帧强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_CANADAPTER_TIMEOUT = "EMAP_EXIT_REMOTEPILOT_FOR_CANADAPTER_TIMEOUT";//因底盘消息掉帧强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_BRAKE = "EMAP_EXIT_REMOTEPILOT_FOR_BRAKE";//制动踏板干预而强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_ACCEL = "EMAP_EXIT_REMOTEPILOT_FOR_ACCEL";//加速踏板干预而强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_STEER = "EMAP_EXIT_REMOTEPILOT_FOR_STEER";//方向盘干预而强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_GEAR_SWITCH = "EMAP_EXIT_REMOTEPILOT_FOR_GEAR_SWITCH";//档位切换干预而强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_CHASSIS_FAULT = "EMAP_EXIT_REMOTEPILOT_FOR_CHASSIS_FAULT";//底盘异常强退平行驾驶,需要下电重启 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_CHASSIS_NO_RESPONSE = "EMAP_EXIT_REMOTEPILOT_FOR_CHASSIS_NO_RESPONSE";//底盘不响应请求强退平行驾驶 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_OTHER_CTL = "EMAP_EXIT_REMOTEPILOT_FOR_OTHER_CTL";//其他干预退出平行驾驶,其他干预的原因见msg信息 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String EXIT_REMOTEPILOT_FOR_UNKNOWN = "EMAP_EXIT_REMOTEPILOT_FOR_UNKNOWN";//退出平行驾驶原因确实未知,必须联系软硬件技术进行排查 + @ReportState("4.2.0") + String HOST_CPU_EXCEED = "EMAP_HOST_CPU_EXCEED";//系统cpu占用过高 + @ReportState("4.2.0") + String HOST_MEMORY_EXCEED = "EMAP_HOST_MEMORY_EXCEED";//系统内存占用过高 } @@ -302,7 +347,7 @@ public class MogoReport { * telematics相关故障 */ interface ETELEMATICS { - @CodeInfo("2.3.0") + @ReportState("2.3.0") String AICLOUD_AUTH_ERROR = "ETELEMATICS_AICLOUD_AUTH_ERROR";//telematics连接云端失败 } @@ -311,23 +356,23 @@ public class MogoReport { */ interface EVHC { @Deprecated - @CodeInfo(value = "2.5.0", deprecated = "3.4.0") + @ReportState(value = "2.5.0", deprecated = "3.4.0") String GEAR_INFERENCE = "EVHC_GEAR_INFERENCE";//由于档位干预退出自动驾驶或无法进入自动驾驶 @Deprecated - @CodeInfo(value = "2.5.0", deprecated = "3.4.0") + @ReportState(value = "2.5.0", deprecated = "3.4.0") String BRAKE_INFERENCE = "EVHC_BRAKE_INFERENCE";//由于刹车干预退出自动驾驶或无法进入自动驾驶 @Deprecated - @CodeInfo(value = "2.5.0", deprecated = "3.4.0") + @ReportState(value = "2.5.0", deprecated = "3.4.0") String STEER_INFERENCE = "EVHC_STEER_INFERENCE";//由于方向盘干预退出自动驾驶或无法进入自动驾驶 @Deprecated - @CodeInfo(value = "2.5.0", deprecated = "3.4.0") + @ReportState(value = "2.5.0", deprecated = "3.4.0") String ACCEL_INFERENCE = "EVHC_ACCEL_INFERENCE";//由于油门干预退出自动驾驶或无法进入自动驾驶 @Deprecated - @CodeInfo(value = "2.3.0", deprecated = "3.4.0") + @ReportState(value = "2.3.0", deprecated = "3.4.0") String CSS = "EVHC_CSS";//底盘不允许进入自动驾驶 - @CodeInfo("2.3.0") + @ReportState("2.3.0") String GEAR = "EVHC_GEAR";//档位不是D或N档 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String EPB = "EVHC_EPB";//驻车(手刹)不是锁止(拉起)状态 } @@ -335,62 +380,65 @@ public class MogoReport { * 系统状态检测异常 */ interface ESYS { - @CodeInfo("2.4.0") + @ReportState("2.4.0") String AUTOPILOT_FAILED = "ESYS_AUTOPILOT_FAILED";//在尝试启动自动驾驶,但是超过指定时间后底盘未进入,会发送此事件 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "2.5.0") + @ReportState(value = "2.4.0", deprecated = "2.5.0") String IN_INIT = "ESYS_IN_INIT";//系统处于启动中,拒绝进入自动驾驶/远程驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String IN_EXIT = "ESYS_IN_EXIT";//系统处于退出中,拒绝进入自动驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String NOT_ALLOW_AUTOPILOT_FOR_REMOTE = "ESYS_NOT_ALLOW_AUTOPILOT_FOR_REMOTE";//系统处于远程驾驶中,拒绝进入自动驾驶 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String NOT_ALLOW_REBOOT = "ESYS_NOT_ALLOW_REBOOT";//重启拒绝 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TOPIC_FREQ_DROPED = "ESYS_TOPIC_FREQ_DROPED";//存在topic严重掉频 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "3.3.1") + @ReportState(value = "2.4.0", deprecated = "3.3.1") String AUTOPILOT_TAKEN_OVER_BY_REMOTE = "ESYS_AUTOPILOT_TAKEN_OVER_BY_REMOTE";//自动驾驶被远程驾驶接管 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "2.5.0") + @ReportState(value = "2.4.0", deprecated = "2.5.0") String RTK_STATUS_FAULT = "ESYS_RTK_STATUS_FAULT";//RTK状态持续错误 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String ROUTING_REQ_TIMEOUT = "ESYS_ROUTING_REQ_TIMEOUT";//自动驾驶开始前,routing请求无响应 - @CodeInfo("2.6.0") + @Deprecated + @ReportState(value = "2.6.0", deprecated = "4.2.0") String PLANNING_CHANGE_FAILIED = "ESYS_PLANNING_CHANGE_FAILIED";//planning版本切换启动失败 - @CodeInfo("2.6.0") + @ReportState("2.6.0") String CHECK_TRAJECTORY_FAILURE = "ESYS_CHECK_TRAJECTORY_FAILURE";//轨迹文件检查超时或检查结果无可用轨迹 - @CodeInfo("3.7.0") + @ReportState("3.7.0") String CHECK_TRAJECTORY_TIMEOUT = "ESYS_CHECK_TRAJECTORY_TIMEOUT";//轨迹文件检查超时 - @CodeInfo("3.7.0") + @ReportState("3.7.0") String CHECK_TRAJECTORY_LOADING = "ESYS_CHECK_TRAJECTORY_LOADING";//当前轨迹下载中(检查中) - @CodeInfo("3.5.0") + @ReportState("3.5.0") String TRAJECTORY_AGENT_NOT_READY = "ESYS_TRAJECTORY_AGENT_NOT_READY";//轨迹下载客户端未就绪拒绝轨迹下载请求 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String MAP_ENGINE_NOT_READY = "ESYS_MAP_ENGINE_NOT_READY";//地图引擎未就绪拒绝自驾 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String FAULT = "ESYS_FAULT";//master启动10分钟,仍有agent未连接 - @CodeInfo("2.8.0") + @ReportState("2.8.0") String REBOOT_WARNING = "ESYS_REBOOT_WARNING";//命令重启不完全提示(部分模块没有关闭成功) - @CodeInfo("2.8.0") + @ReportState("2.8.0") String CAN_MSG_LOST = "ESYS_CAN_MSG_LOST";//master接收底盘消息超时 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String AGENT_NET_TIMEOUT = "ESYS_AGENT_NET_TIMEOUT";//ssm agent 心跳连接master超时 + @ReportState("4.1.0") + String ROUTING_RESPONSE_FAIL = "ESYS_ROUTING_RESPONSE_FAIL";//算路异常,拒绝自动驾驶 /*******update_config_simple 配置(包含轨迹)下载相关异常*******/ - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_SPEED_JUMP = "ESYS_CONFIG_UPDATING_SPEED_JUMP";//文件下载速度跳变,低于阈值 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_INPUT_PARAM_ABNORMAL = "ESYS_CONFIG_UPDATING_INPUT_PARAM_ABNORMAL";//配置下载传入参数异常 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_DNS_ERROR = "ESYS_CONFIG_UPDATING_DNS_ERROR";//DNS解析异常 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_URL_NOT_ARRIVED = "ESYS_CONFIG_UPDATING_URL_NOT_ARRIVED";//url不可达 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_MD5_CHECK_ERROR = "ESYS_CONFIG_UPDATING_MD5_CHECK_ERROR";//md5检查失败 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String CONFIG_UPDATING_REJECT_SAME_TRAJ_TASK = "ESYS_CONFIG_UPDATING_REJECT_SAME_TRAJ_TASK";//拒绝同名轨迹任务 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String CONFIG_UPDATING_HTTP_FAILED = "ESYS_CONFIG_UPDATING_HTTP_FAILED";//获取下载列表失败 } @@ -398,36 +446,40 @@ public class MogoReport { * 系统异常状态上报 */ interface ESSM { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String IN_INIT = "ESSM_IN_INIT";//SSM初始化,非任何模式,拒绝进入自动驾驶/平行驾驶 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String IN_EXIT = "ESSM_IN_EXIT";//SSM处于停止模式,拒绝进入自动驾驶/平行驾驶 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String AUTOPILOT_UNREADY = "ESSM_AUTOPILOT_UNREADY";//因自动驾驶状态未就绪拒绝自驾 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String AUTOPILOT_KEY_NODE_BORKEN = "ESSM_AUTOPILOT_KEY_NODE_BORKEN";//因自驾驾驶关键节点挂掉拒绝自动驾驶 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String REMOTEPILOT_UNREADY = "ESSM_REMOTEPILOT_UNREADY";//因平行驾驶状态未就绪拒绝平行驾驶 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MAP_IMAGE_DIFF = "ESSM_MAP_IMAGE_DIFF";//Agent镜像存在版本不一致的问题 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String SYS_TIME_SKIPED = "ESSM_SYS_TIME_SKIPED";//系统时间发生跳变 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ROSCORE_HAVE_REBOOT = "ESSM_ROSCORE_HAVE_REBOOT";//roscore发生重启,触发所有节点重启 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String COLD_START_TIMEOUT = "ESSM_COLD_START_TIMEOUT";//系统冷启动超时未完成 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String HAVE_AGENT_LOST_CONNECT = "ESSM_HAVE_AGENT_LOST_CONNECT";//存在agent失联 - @CodeInfo("3.3.1") + @Deprecated + @ReportState(value = "3.3.1", deprecated = "4.2.0") String IGNORED_CMD_DUE_PAD_CONTROL = "ESSM_IGNORED_CMD_DUE_PAD_CONTROL";//pad自驾中,拒绝云控的自驾命令 - @CodeInfo("3.3.1") + @Deprecated + @ReportState(value = "3.3.1", deprecated = "4.2.0") String IGNORED_CMD_DUE_AICLOUD_CONTROL = "ESSM_IGNORED_CMD_DUE_AICLOUD_CONTROL";//云控自驾中,拒绝pad的自驾命令 } interface EAGENT { - @CodeInfo("2.4.0") + @Deprecated + @ReportState(value = "2.4.0", deprecated = "4.2.0") String FATAL = "EAGENT_FATAL";//agent严重故障,无法恢复 - @CodeInfo("2.4.0") + @Deprecated + @ReportState(value = "2.4.0", deprecated = "4.2.0") String MASTER_COMMAND_HANDLER_FAILED = "EAGENT_MASTER_COMMAND_HANDLER_FAILED";//agent未能成功执行master指令 } @@ -435,13 +487,13 @@ public class MogoReport { * 相机相关异常 */ interface ECAM { - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT = "ECAM_INIT";//相机初始化失败 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String CALIB = "ECAM_CALIB";//标定信息读取失败 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String GRAB_FATAL = "ECAM_GRAB_FATAL";//相机数据采集异常 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String TS_ERROR = "ECAM_TS_ERROR";//图像时间戳异常 } @@ -450,9 +502,9 @@ public class MogoReport { * 定位异常 */ interface ELCT { - @CodeInfo("2.5.0") + @ReportState("2.5.0") String RTK_STATUS_FAULT = "ELCT_RTK_STATUS_FAULT";//RTK状态错误 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String RTK_STATUS_UNKNOWN = "ELCT_RTK_STATUS_UNKNOWN";//RTK状态不确定 } @@ -460,9 +512,9 @@ public class MogoReport { * 推流异常 */ interface EPUSH { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String VIDEO_INIT_ERROR = "EPUSH_VIDEO_INIT_ERROR";//初始化失败 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String VIDEO_START_SERVICE_ERROR = "EPUSH_VIDEO_START_SERVICE_ERROR";//启动服务失败 } @@ -470,25 +522,29 @@ public class MogoReport { * 录包异常 */ interface ERECORD { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_BAG_INIT = "ERECORD_TASK_BAG_INIT";//包初始化失败 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_SPACE = "ERECORD_TASK_SPACE";//空间不足 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_CONFIG_EMPTY = "ERECORD_TASK_CONFIG_EMPTY";//配置为空 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_QUEUE_EMPTY = "ERECORD_TASK_QUEUE_EMPTY";//数据队列为空 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String TASK_NODE_TO_TOPICS_EMPTY = "ERECORD_TASK_NODE_TO_TOPICS_EMPTY";//通过节点名获取不到topic列表---ROS2版本新增 + @ReportState("4.1.0") + String FRAMES_DROPPED = "ERECORD_FRAMES_DROPPED";//录包丢帧 + @ReportState("4.1.0") + String DISK_IO_SPEED_TOO_HIGH = "ERECORD_DISK_IO_SPEED_TOO_HIGH";//磁盘写入速度过高 } /** * 平行驾驶相关异常 */ interface EPARALLEL { - @CodeInfo("2.11.0") + @ReportState("2.11.0") String AICLOUD_CONNECTION_ERROR = "EPARALLEL_AICLOUD_CONNECTION_ERROR";//平行驾驶长连接异常 断网(此时不符合平行驾驶条件) 平行驾驶退出到自驾,同时减速停车 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String AICLOUD_NETWORK_WEAK = "EPARALLEL_AICLOUD_NETWORK_WEAK";//车端系统检测到弱网 弱网 平行驾驶退出到自驾,同时减速停车 } @@ -496,7 +552,7 @@ public class MogoReport { * 车辆处于困境,等待平行驾驶接管 */ interface EVEHICLE { - @CodeInfo("2.11.0") + @ReportState("2.11.0") String IN_TROUBLE = "EVEHICLE_IN_TROUBLE";//planning 检测到车处于困境,把困境状态汇报给 SSM,ssm 发出该事件,等待驾舱端开始平行驾驶 } @@ -504,28 +560,60 @@ public class MogoReport { * EFM(FM故障) */ interface EFM { - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ERROR3_STOP_PILOT = "EFM_ERROR3_STOP_PILOT";//触发降级停车策略 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ERROR2_FUNC_FORBID = "EFM_ERROR2_FUNC_FORBID";//禁止车辆部分功能 } + + /** + * 出车标定自检 + */ + interface ECLB { + @ReportState("4.1.0") + String LIDAR_CHECK_SUCCESS_EXT_BAD = "ECLB_LIDAR_CHECK_SUCCESS_EXT_BAD";//lidar标定自检成功,外参异常 + @ReportState("4.1.0") + String CAMERA_CHECK_SUCCESS_EXT_BAD = "ECLB_CAMERA_CHECK_SUCCESS_EXT_BAD";//camera标定自检成功,外参异常 + @ReportState("4.1.0") + String RADAR_CHECK_SUCCESS_EXT_BAD = "ECLB_RADAR_CHECK_SUCCESS_EXT_BAD";//radar标定自检成功,外参异常 + @ReportState("4.1.0") + String LIDAR_CHECK_FAILED = "ECLB_LIDAR_CHECK_FAILED";//lidar标定自检算法失败,无法判定外参是否正常,建议重试 + @ReportState("4.1.0") + String CAMERA_CHECK_FAILED = "ECLB_CAMERA_CHECK_FAILED";//camera标定自检算法失败,无法判定外参是否正常,建议重试 + @ReportState("4.1.0") + String RADAR_CHECK_FAILED = "ECLB_RADAR_CHECK_FAILED";//radar标定自检算法失败,无法判定外参是否正常,建议重试 + } } /** * 常规类型 */ interface Info { + /** + * 出车标定自检 + */ + interface ICLB { + @ReportState("4.1.0") + String LIDAR_CHECK_SUCCESS_EXT_GOOD = "ICLB_LIDAR_CHECK_SUCCESS_EXT_GOOD";//lidar标定自检成功,外参正常 + @ReportState("4.1.0") + String CAMERA_CHECK_SUCCESS_EXT_GOOD = "ICLB_CAMERA_CHECK_SUCCESS_EXT_GOOD";//camera标定自检成功,外参正常 + @ReportState("4.1.0") + String RADAR_CHECK_SUCCESS_EXT_GOOD = "ICLB_RADAR_CHECK_SUCCESS_EXT_GOOD";//radar标定自检成功,外参正常 + } + /** * 系统初始化阶段 */ interface IINIT { - @CodeInfo("2.4.0") + @ReportState("2.4.0") String BOOST = "IINIT_BOOST";//linux系统已启动(此事件会延迟发出,timestamp填linux启动时的事件) - @CodeInfo("2.3.0") + @ReportState("2.3.0") String TIME_SYNC = "IINIT_TIME_SYNC";//时间已同步 - @CodeInfo("2.3.0") + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") String SENSOR_NORMAL = "IINIT_SENSOR_NORMAL";//各传感器正常 - @CodeInfo("2.3.0") + @Deprecated + @ReportState(value = "2.3.0", deprecated = "4.2.0") String MAP_STARTED = "IBOOT_MAP_STARTED";//当前xavier上所有节点已启动成功 } @@ -534,51 +622,54 @@ public class MogoReport { * 自动驾驶运行信息 */ interface IMAP { - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TRA_EXIST = "IMAP_TRA_EXIST";//已找到轨迹文件 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String DATA_EXIST = "IMAP_DATA_EXIST";//加载正确的sqlite - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TRA_LOADED = "IMAP_TRA_LOADED";//轨迹文件加载成功 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TRA_ROUTING = "IMAP_TRA_ROUTING";//算路成功 - @CodeInfo("2.6.0") + @ReportState("2.6.0") String TRA_TYPE = "IMAP_TRA_TYPE";//加载轨迹类型通知 - @CodeInfo("2.7.0") + @ReportState("2.7.0") String PARAM_SERVER = "IMAP_PARAM_SERVER";//当前系统使用的param server版本(rosmaster或redis) - @CodeInfo("3.6.0") + @ReportState("3.6.0") String ENGINE_INIT_FINISHED = "IMAP_ENGINE_INIT_FINISHED";//地图引擎初始化完成 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String RECEIVED_ROUTING_REQUEST = "IMAP_RECEIVED_ROUTING_REQUEST";//成功接收订单信息 - @CodeInfo("2.8.0") + @ReportState("2.8.0") String ENTRY_AUTOPILOT = "IMAP_ENTRY_AUTOPILOT";//控制进入自动驾驶成功 - @CodeInfo("3.3.1") + @ReportState("3.3.1") String PLANNING_FOR_PREDICTION_RECEIVED = "IMAP_PLANNING_FOR_PREDICTION_RECEIVED";//自车进入车自驾,收到预测消息时解除预测数据超时警报 - @CodeInfo("3.3.1") + @ReportState("3.3.1") String PLANNING_FOR_HADMAP_ENGINE_LANES_MSG_RECEIVED = "IMAP_PLANNING_FOR_HADMAP_ENGINE_LANES_MSG_RECEIVED";//自车进入车自驾,收到地图车道消息时解除地图数据超时警报 - @CodeInfo("3.3.1") + @ReportState("4.2.0") + String PLANNING_FOR_RECEPTION_RECEIVED = "IMAP_PLANNING_FOR_RECEPTION_RECEIVED";//自车进入车自驾, 收到感知消息时解除感知数据超时警报 + @Deprecated + @ReportState(value = "3.3.1", deprecated = "4.2.0") String PLANNING_FOR_PERCEPTION_RECEIVED = "IMAP_PLANNING_FOR_PERCEPTION_RECEIVED";//自车进入车自驾,收到感知消息时解除感知数据超时警报 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String START_AUTOPILOT = "IMAP_START_AUTOPILOT";//控制侧开始自驾 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String EXIT_AUTOPILOT = "IMAP_EXIT_AUTOPILOT";//控制侧正常退出自驾 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String START_REMOTEPILOT = "IMAP_START_REMOTEPILOT";//控制侧开始平行驾驶 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ENTRY_REMOTEPILOT = "IMAP_ENTRY_REMOTEPILOT";//控制侧进入平行驾驶 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String EXIT_REMOTEPILOT = "IMAP_EXIT_REMOTEPILOT";//控制侧退出平行驾驶 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String CONTROLLER_START_FM_COMMAND = "IMAP_CONTROLLER_START_FM_COMMAND";//控制侧开始故障处理命令 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String CONTROLLER_FINISH_FM_COMMAND = "IMAP_CONTROLLER_FINISH_FM_COMMAND";//控制侧完成故障处理命令 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String CONTROLLER_ABORT_FM_COMMAND = "IMAP_CONTROLLER_ABORT_FM_COMMAND";//控制侧未完成停车但终止,原因写入msg - @CodeInfo("3.7.1") + @ReportState("3.7.1") String PLANNING_START_FM_COMMAND = "IMAP_PLANNING_START_FM_COMMAND";//规划开始执行故障停车处理命令 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String PLANNING_FINISH_FM_COMMAND = "IMAP_PLANNING_FINISH_FM_COMMAND";//规划完成故障停车处理命令 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String PLANNING_ABORT_FM_COMMAND = "IMAP_PLANNING_ABORT_FM_COMMAND";//规划未完成停车但终止,原因写入msg } @@ -587,11 +678,11 @@ public class MogoReport { */ interface ITELEMATICS { @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "2.5.0") + @ReportState(value = "2.4.0", deprecated = "2.5.0") String ROUTING_REQUEST_SENT = "ITELEMATICS_ROUTING_REQUEST_SENT";//已发送算路请求 - @CodeInfo("2.3.0") + @ReportState("2.3.0") String AUTOPILOT_CMD_FORWARDED = "ITELEMATICS_AUTOPILOT_CMD_FORWARDED";//自动驾驶命令已转发 - @CodeInfo("2.3.0") + @ReportState("2.3.0") String AICLOUD_AUTH_OK = "ITELEMATICS_AICLOUD_AUTH_OK";//aicloud连接认证成功 } @@ -601,70 +692,78 @@ public class MogoReport { */ interface ISYS { /*******常规信息*******/ - @CodeInfo("2.4.0") + @ReportState("2.4.0") String STARTING = "ISYS_STARTING";//系统启动中 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String RUNNING = "ISYS_RUNNING";//所有Xavier启动完成 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String EXITING = "ISYS_EXITING";//系统退出中 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String AUTOPILOT_READY = "ISYS_AUTOPILOT_READY";//自动驾驶状态就绪 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String AUTOPILOT_STARTING = "ISYS_AUTOPILOT_STARTING";//自动驾驶启动中 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String AUTOPILOT_RUNING = "ISYS_AUTOPILOT_RUNING";//自动驾驶运行中 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String TOPIC_FREQ_NORMAL = "ISYS_TOPIC_FREQ_NORMAL";//topic频率正常或者恢复正常 @Deprecated - @CodeInfo(value = "2.4.0", deprecated = "2.5.0") + @ReportState(value = "2.4.0", deprecated = "2.5.0") String RTK_STATUS_NORMAL = "ISYS_RTK_STATUS_NORMAL";//rtk状态正常或恢复正常 - @CodeInfo("2.4.0") + @ReportState("2.4.0") String CAN_NORMAL = "ISYS_CAN_NORMAL";//底盘状态正常或恢复正常 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String REOMTEPILOT_STARTING = "ISYS_REOMTEPILOT_STARTING";//平行驾驶启动中 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String REOMTEPILOT_RUNING = "ISYS_REOMTEPILOT_RUNING";//平行驾驶运行中 - @CodeInfo("2.6.0") + @ReportState("2.6.0") String SYSTEM_IN_IDLE = "ISYS_SYSTEM_IN_IDLE";//系统进入空闲状态 - @CodeInfo("2.6.0") + @ReportState("2.6.0") String SYSTEM_OUT_IDLE = "ISYS_SYSTEM_OUT_IDLE";//系统退出空闲状态 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String ALREADY_AUTOPILOT_STATE = "ISYS_ALREADY_AUTOPILOT_STATE";//已经在自驾状态驾驶,继续自驾命令 - @CodeInfo("3.3.1") + @Deprecated + @ReportState(value = "3.3.1", deprecated = "4.2.0") String AUTOPILOT_TAKEN_OVER_BY_REMOTE = "ISYS_AUTOPILOT_TAKEN_OVER_BY_REMOTE";//自动驾驶被远程驾驶接管 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String AUTOPILOT_TRA_LOADED = "ISYS_AUTOPILOT_TRA_LOADED";//自动驾驶路线加载成功 - @CodeInfo("3.6.0") + @ReportState("3.6.0") String AUTOPILOT_SHELL_WASTETIME = "ISYS_AUTOPILOT_SHELL_WASTETIME";//记录autopilot.sh脚本耗时 /*******轨迹下载相关*******/ - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT_TRAJECTORY_START = "ISYS_INIT_TRAJECTORY_START";//轨迹管理_轨迹开始下载 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT_TRAJECTORY_SUCCESS = "ISYS_INIT_TRAJECTORY_SUCCESS";//轨迹管理_轨迹下载成功 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT_TRAJECTORY_FAILURE = "ISYS_INIT_TRAJECTORY_FAILURE";//轨迹管理_轨迹下载失败,本地无对应轨迹 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT_TRAJECTORY_WARNING = "ISYS_INIT_TRAJECTORY_WARNING";//轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功 - @CodeInfo("2.5.0") + @ReportState("2.5.0") String INIT_TRAJECTORY_TIMEOUT = "ISYS_INIT_TRAJECTORY_TIMEOUT";//轨迹管理_轨迹下载超时 /*******配置更新相关*******/ - @CodeInfo("2.6.0") + @Deprecated + @ReportState(value = "2.6.0", deprecated = "4.2.0") String CONFIG_UPDATE_HADMAP = "ISYS_CONFIG_UPDATE_HADMAP";//需要重启升级高精地图 - @CodeInfo("2.9.0") + @Deprecated + @ReportState(value = "2.9.0", deprecated = "4.2.0") String CONFIG_UPDATE_AI_MODEL = "ISYS_CONFIG_UPDATE_AI_MODEL";//需要重启升级AI模型 - @CodeInfo("2.9.0") + @Deprecated + @ReportState(value = "2.9.0", deprecated = "4.2.0") String CONFIG_UPDATE_SLAM_MAP = "ISYS_CONFIG_UPDATE_SLAM_MAP";//需要重启升级SLAM地图 - @CodeInfo("2.10.0") + @Deprecated + @ReportState(value = "2.10.0", deprecated = "4.2.0") String CONFIG_UPDATING_HD_MAP = "ISYS_CONFIG_UPDATING_HD_MAP";//高精地图更新中 - @CodeInfo("2.10.0") + @Deprecated + @ReportState(value = "2.10.0", deprecated = "4.2.0") String CONFIG_UPDATING_SLAM_MAP = "ISYS_CONFIG_UPDATING_SLAM_MAP";//slam 地图更新中 - @CodeInfo("2.10.0") + @Deprecated + @ReportState(value = "2.10.0", deprecated = "4.2.0") String CONFIG_UPDATING_AI_MODEL = "ISYS_CONFIG_UPDATING_AI_MODEL";//AI模型更新中 - @CodeInfo("2.10.0") + @Deprecated + @ReportState(value = "2.10.0", deprecated = "4.2.0") String CONFIG_UPDATING_GRID_MAP = "ISYS_CONFIG_UPDATING_GRID_MAP";//珊格地图更新中 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String TRAJECTORY_AGENT_READY = "ISYS_TRAJECTORY_AGENT_READY";//配置下载客户端已就绪 } @@ -672,28 +771,32 @@ public class MogoReport { * 系统状态 常规信息 */ interface ISSM { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String INIT = "ISSM_INIT";//SSM系统上电初始化 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String RESTARTED = "ISSM_RESTARTED";//SSM系统发生重启 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String AUTO_PILOT_STATE_CHANGE = "ISSM_AUTO_PILOT_STATE_CHANGE";//自驾状态变化,msg填写 1 to 0 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String REMOTE_PILOT_STATE_CHANGE = "ISSM_REMOTE_PILOT_STATE_CHANGE";//平行驾驶状态变化, msg填写 1 to 6 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String AUTO_PILOT_FINISH = "ISSM_AUTO_PILOT_FINISH";//一次自驾请求处理结束 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String REMOTE_PILOT_FINISH = "ISSM_REMOTE_PILOT_FINISH";//一次平行驾驶处理结束 - @CodeInfo("3.7.0") + @ReportState("3.7.0") String OTA_UPGRADE_START = "ISSM_OTA_UPGRADE_START";//OTA升级开始(升级内容见msg) - @CodeInfo("3.7.0") + @ReportState("3.7.0") String OTA_UPGRADE_FINISH = "ISSM_OTA_UPGRADE_FINISH";//OTA升级结束(升级内容见msg) - @CodeInfo("3.8.0") + @ReportState("3.8.0") String OTA_UPGRADE_LOADING = "ISSM_OTA_UPGRADE_LOADING";//OTA升级进行中 - @CodeInfo("3.7.0") + @ReportState("3.7.0") String RECEIVE_SHUTDOWN_SIGNAL = "ISSM_RECEIVE_SHUTDOWN_SIGNAL";//SSM收到下电信号 - @CodeInfo("3.3.0") + @ReportState("3.3.0") String HAVE_AGENT_CONNECTED = "ISSM_HAVE_AGENT_CONNECTED";//agent已连接成功 + @ReportState("4.1.0") + String MAN_START_NODE = "ISSM_MAN_START_NODE";//调试开启指定节点 + @ReportState("4.1.0") + String MAN_STOP_NODE = "ISSM_MAN_STOP_NODE";//调试关闭指定节点 // String MODE_XX_START = "ISSM_MODE_XX_START";//SSM变更模式开始 // String MODE_XX_FINISH = "ISSM_MODE_XX_FINISH";//SSM变更模式完成(第一次ready) @@ -704,45 +807,60 @@ public class MogoReport { //以上6组被注释掉的字段 中的MODE_XX分别替换成MODE_RUN、MODE_IDLE、MODE_STOP - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_START = "ISSM_MODE_RUN_START";//SSM变更模式开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_FINISH = "ISSM_MODE_RUN_FINISH";//SSM变更模式完成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_ABORT = "ISSM_MODE_RUN_ABORT";//SSM变更模式中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_TIMEOUT = "ISSM_MODE_RUN_TIMEOUT";//SSM变更模式超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_READY = "ISSM_MODE_RUN_READY";//SSM模式就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_RUN_UNREADY = "ISSM_MODE_RUN_UNREADY";//SSM未就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_START = "ISSM_MODE_IDLE_START";//SSM变更模式开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_FINISH = "ISSM_MODE_IDLE_FINISH";//SSM变更模式完成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_ABORT = "ISSM_MODE_IDLE_ABORT";//SSM变更模式中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_TIMEOUT = "ISSM_MODE_IDLE_TIMEOUT";//SSM变更模式超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_READY = "ISSM_MODE_IDLE_READY";//SSM模式就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_IDLE_UNREADY = "ISSM_MODE_IDLE_UNREADY";//SSM未就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_START = "ISSM_MODE_STOP_START";//SSM变更模式开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_FINISH = "ISSM_MODE_STOP_FINISH";//SSM变更模式完成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_ABORT = "ISSM_MODE_STOP_ABORT";//SSM变更模式中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_TIMEOUT = "ISSM_MODE_STOP_TIMEOUT";//SSM变更模式超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_READY = "ISSM_MODE_STOP_READY";//SSM模式就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String MODE_STOP_UNREADY = "ISSM_MODE_STOP_UNREADY";//SSM未就绪 + + @ReportState("4.2.0") + String MODE_RUN_STOP = "ISSM_MODE_RUN_STOP";//SSM变更模式结束-运行模式 + @ReportState("4.2.0") + String MODE_IDLE_STOP = "ISSM_MODE_IDLE_STOP";//SSM变更模式结束-空闲模式 + @ReportState("4.2.0") + String MODE_STOP_STOP = "ISSM_MODE_STOP_STOP";//SSM变更模式结束-停止模式 + @ReportState("4.2.0") + String FUNC_REMOTE_PILOT_STOP = "ISSM_FUNC_REMOTE_PILOT_STOP";//产品状态检查结束-平行驾驶状态 + @ReportState("4.2.0") + String FUNC_AUTO_PILOT_STOP = "ISSM_FUNC_AUTO_PILOT_STOP";//产品状态检查结束-自动驾驶状态 + @ReportState("4.2.0") + String FUNC_COLD_START_STOP = "ISSM_FUNC_COLD_START_STOP";//产品状态检查结束-冷启动状态 + + // String FUNC_YY_START = "ISSM_FUNC_YY_START";//产品状态检查开始 // String FUNC_YY_FINISH = "ISSM_FUNC_YY_FINISH";//产品状态达成(第一次ready) // String FUNC_YY_TIMEOUT = "ISSM_FUNC_YY_TIMEOUT";//产品状态检查超时 @@ -751,60 +869,61 @@ public class MogoReport { // String FUNC_YY_READY = "ISSM_FUNC_YY_READY";//产品状态就绪 //以上6组被注释掉的字段 中的FUNC_YY分别替换成FUNC_COLD_START、FUNC_AUTO_PILOT、FUNC_REMOTE_PILOT - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_START = "ISSM_FUNC_COLD_START_START";//产品状态检查开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_FINISH = "ISSM_FUNC_COLD_START_FINISH";//产品状态达成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_TIMEOUT = "ISSM_FUNC_COLD_START_TIMEOUT";//产品状态检查超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_ABORT = "ISSM_FUNC_COLD_START_ABORT";//产品状态检查中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_UNREADY = "ISSM_FUNC_COLD_START_UNREADY";//产品状态未就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_COLD_START_READY = "ISSM_FUNC_COLD_START_READY";//产品状态就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_START = "ISSM_FUNC_AUTO_PILOT_START";//产品状态检查开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_FINISH = "ISSM_FUNC_AUTO_PILOT_FINISH";//产品状态达成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_TIMEOUT = "ISSM_FUNC_AUTO_PILOT_TIMEOUT";//产品状态检查超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_ABORT = "ISSM_FUNC_AUTO_PILOT_ABORT";//产品状态检查中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_UNREADY = "ISSM_FUNC_AUTO_PILOT_UNREADY";//产品状态未就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_AUTO_PILOT_READY = "ISSM_FUNC_AUTO_PILOT_READY";//产品状态就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_START = "ISSM_FUNC_REMOTE_PILOT_START";//产品状态检查开始 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_FINISH = "ISSM_FUNC_REMOTE_PILOT_FINISH";//产品状态达成(第一次ready) - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_TIMEOUT = "ISSM_FUNC_REMOTE_PILOT_TIMEOUT";//产品状态检查超时 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_ABORT = "ISSM_FUNC_REMOTE_PILOT_ABORT";//产品状态检查中止 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_UNREADY = "ISSM_FUNC_REMOTE_PILOT_UNREADY";//产品状态未就绪 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String FUNC_REMOTE_PILOT_READY = "ISSM_FUNC_REMOTE_PILOT_READY";//产品状态就绪 } interface IAGENT { - @CodeInfo("2.4.0") + @Deprecated + @ReportState(value = "2.4.0", deprecated = "4.2.0") String EXECUTE_MASTER_COMMAND = "IAGENT_EXECUTE_MASTER_COMMAND";//执行系统指令成功 } interface ICAM { - @CodeInfo("2.5.0") + @ReportState("2.5.0") String READY = "ICAM_READY";//相机已就绪 } interface ILCT { - @CodeInfo("2.5.0") + @ReportState("2.5.0") String RTK_STATUS_NORMAL = "ILCT_RTK_STATUS_NORMAL";//rtk状态正常或恢复正常 - @CodeInfo("2.6.0") + @ReportState("2.6.0") String RTK_OR_SLAM_CHANGE = "ILCT_RTK_OR_SLAM_CHANGE";//定位输出源发生RTK和SLAM变换 } @@ -812,9 +931,9 @@ public class MogoReport { * 推流状态 */ interface IPUSH { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String VIDEO_INIT_SUCCESS = "IPUSH_VIDEO_INIT_SUCCESS";//推流初始化成功 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String VIDEO_START_SERVICE_SUCCESS = "IPUSH_VIDEO_START_SERVICE_SUCCESS";//推流服务启动成功 } @@ -822,9 +941,9 @@ public class MogoReport { * 录包状态 */ interface IRECORDER { - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_AUTO = "IRECORDER_TASK_AUTO";//自动录包任务创建 - @CodeInfo("2.10.0") + @ReportState("2.10.0") String TASK_CMD = "IRECORDER_TASK_CMD";//指令录包任务创建 } @@ -832,7 +951,7 @@ public class MogoReport { * 平行驾驶相关 */ interface IPARALLEL { - @CodeInfo("2.11.0") + @ReportState("2.11.0") String AICLOUD_CONNECTION_OK = "IPARALLEL_AICLOUD_CONNECTION_OK";//长连接连接恢复后, 5s 内如果长连状态一直 ok 的话,会触发该事件 建议鹰眼展示该事件 } @@ -840,7 +959,7 @@ public class MogoReport { * 车辆处于困境相关 */ interface IVEHICLE { - @CodeInfo("2.11.0") + @ReportState("2.11.0") String NOT_IN_TROUBLE = "IVEHICLE_NOT_IN_TROUBLE";//车辆脱离困境,恢复正常,可继续开始自动驾驶了 触发频率:处于困境中,触发一次; 脱困后,触发一次 云端驾舱会接入该事件 建议鹰眼也接入,展示困境状态/脱困状态 } @@ -848,11 +967,11 @@ public class MogoReport { * IFSM(功能状态管理) */ interface IFSM { - @CodeInfo("3.5.0") + @ReportState("3.5.0") String AUTO_PILOT_STATE_CHANGED = "IFSM_AUTO_PILOT_STATE_CHANGED";//自动驾驶状态机变化 (msg 填写如 standby to active ) - @CodeInfo("3.5.0") + @ReportState("3.5.0") String REMOTE_PILOT_STATE_CHANGED = "IFSM_REMOTE_PILOT_STATE_CHANGED";//平行驾驶状态机变化 - @CodeInfo("3.5.0") + @ReportState("3.5.0") String TELECTRL_PILOT_STATE_CHANGED = "IFSM_TELECTRL_PILOT_STATE_CHANGED";//遥感驾驶状态机变化 } @@ -860,15 +979,15 @@ public class MogoReport { * IFM (故障管理) */ interface IFM { - @CodeInfo("3.4.0") + @ReportState("3.4.0") String HANDLE_FAULTS_START = "IFM_HANDLE_FAULTS_START";//FM开始处理故障 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String HANDLE_FAULTS_STOP = "IFM_HANDLE_FAULTS_STOP";//FM停止处理故障 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ALL_FAULTS_RECOVER = "IFM_ALL_FAULTS_RECOVER";//FM当前已无故障 (只有有故障到全都消失时候上报) - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ONLY_WARNING_FAULTS = "IFM_ONLY_WARNING_FAULTS";//FM仅存在警示故障 - @CodeInfo("3.4.0") + @ReportState("3.4.0") String ERROR1_SLOW_SPEED = "IFM_ERROR1_SLOW_SPEED";//存在故障触发减速策略 } @@ -876,27 +995,59 @@ public class MogoReport { * IMF(蘑方消息回执) */ interface IMF { - @CodeInfo("3.7.1") + @ReportState("3.7.1") String SPEED_CHANGE_RECEIVE = "IMF_SPEED_CHANGE_RECEIVE";//蘑方加速度变化指令收到(msg字段的拼接方式为:传进来的加速度值$$其它想加的内容,没有可以不填) - @CodeInfo("3.7.1") + @ReportState("3.7.1") String SPEED_CHANGE_EXECUTE = "IMF_SPEED_CHANGE_EXECUTE";//蘑方加速度变化指令执行(msg字段的拼接方式为:传进来的加速度值$$其它想加的内容,没有可以不填) - @CodeInfo("3.7.1") + @ReportState("3.7.1") String SPEED_RESET_RECEIVE = "IMF_SPEED_RESET_RECEIVE";//蘑方复位指令收到(msg字段的拼接方式为:传进来的加速度值$$其它想加的内容,没有可以不填) - @CodeInfo("3.7.1") + @ReportState("3.7.1") String SPEED_RESET_EXECUTE = "IMF_SPEED_RESET_EXECUTE";// 蘑方复位指令执行(msg字段的拼接方式为:传进来的加速度值$$其它想加的内容,没有可以不填) - @CodeInfo("3.7.1") + @ReportState("3.7.1") String LAN_CHANG_RECEIVE = "IMF_LAN_CHANG_RECEIVE";//蘑方变道指令收到(msg字段的拼接方式为:-1/1$$其它想加的内容,没有可以不填) -1: 左变道;1: 右变道 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String LAN_CHANG_EXECUTE = "IMF_LAN_CHANG_EXECUTE";//蘑方变道指令执行(msg字段的拼接方式为:-1/1$$其它想加的内容,没有可以不填) -1: 左变道;1: 右变道 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String HORN_RECEIVE = "IMF_HORN_RECEIVE";//蘑方鸣笛指令收到(msg字段的拼接方式为:1.0/2.0$$其它想加的内容,没有可以不填) 1.0:开始鸣笛;2.0: 结束鸣笛 - @CodeInfo("3.7.1") + @ReportState("3.7.1") String HORN_EXECUTE = "IMF_HORN_EXECUTE";//蘑方鸣笛指令执行(msg字段的拼接方式为:1.0/2.0$$其它想加的内容,没有可以不填) 1.0:开始鸣笛;2.0: 结束鸣笛 } } } - private static final Map codeInfoMap = new HashMap<>(); + + private static final Map resultStates = new HashMap<>(); + private static final Map actionStates = new HashMap<>(); + private static final Map codeStates = new HashMap<>(); + + + /** + * 获取指定Result的相关信息 + * + * @param result 指定Result {@link Result} + * @return 输入Result的相关信息 不存在返回null + */ + public static ReportInfo getReportResultState(String result) { + if (resultStates.isEmpty()) { + getAllResultFieldAnnotation(Result.class); + } + return resultStates.get(result); + } + + + /** + * 获取指定Action的相关信息 + * + * @param action 指定Action {@link Action} + * @return 输入Action的相关信息 不存在返回null + */ + public static ReportInfo getReportActionState(String action) { + if (actionStates.isEmpty()) { + getAllActionFieldAnnotation(Action.class); + } + return actionStates.get(action); + } + /** * 获取指定Code的相关信息 @@ -904,30 +1055,71 @@ public class MogoReport { * @param code 指定Code {@link Code} * @return 输入Code的相关信息 不存在返回null */ - public static ReportCodeInfo getReportCodeState(String code) { - if (codeInfoMap.isEmpty()) { - getAllFieldAnnotation(Code.class); + public static ReportInfo getReportCodeState(String code) { + if (codeStates.isEmpty()) { + getAllCodeFieldAnnotation(Code.class); } - return codeInfoMap.get(code); + return codeStates.get(code); } - //获取所有的字段 - private static void getAllFieldAnnotation(Class clazz) { + private static void getAllResultFieldAnnotation(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { - boolean fieldHasAnno = field.isAnnotationPresent(CodeInfo.class); + boolean fieldHasAnno = field.isAnnotationPresent(ReportState.class); if (fieldHasAnno) { - CodeInfo fieldAnno = field.getAnnotation(CodeInfo.class); + ReportState fieldAnno = field.getAnnotation(ReportState.class); if (fieldAnno != null) { - String code = clazz.getSimpleName() + "_" + field.getName(); - ReportCodeInfo state = new ReportCodeInfo(code, fieldAnno.value(), fieldAnno.deprecated()); - codeInfoMap.put(code, state); + String code = clazz.getSimpleName().toUpperCase(Locale.getDefault()) + "_" + field.getName(); + ReportInfo state = new ReportInfo(code, fieldAnno.value(), fieldAnno.deprecated()); + resultStates.put(code, state); } } } Class[] innerClazz = clazz.getDeclaredClasses(); for (Class inner : innerClazz) { - getAllFieldAnnotation(inner); + getAllResultFieldAnnotation(inner); + } + } + + private static void getAllActionFieldAnnotation(Class clazz) { + + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + boolean fieldHasAnno = field.isAnnotationPresent(ReportState.class); + if (fieldHasAnno) { + ReportState fieldAnno = field.getAnnotation(ReportState.class); + if (fieldAnno != null) { + String code = clazz.getSimpleName().toUpperCase(Locale.getDefault()) + "_" + field.getName(); + ReportInfo state = new ReportInfo(code, fieldAnno.value(), fieldAnno.deprecated()); + actionStates.put(code, state); + } + } + } + Class[] innerClazz = clazz.getDeclaredClasses(); + for (Class inner : innerClazz) { + getAllActionFieldAnnotation(inner); + } + } + + //获取所有Code的字段 + private static void getAllCodeFieldAnnotation(Class clazz) { + + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + boolean fieldHasAnno = field.isAnnotationPresent(ReportState.class); + if (fieldHasAnno) { + ReportState fieldAnno = field.getAnnotation(ReportState.class); + if (fieldAnno != null) { + String code = clazz.getSimpleName() + "_" + field.getName(); + ReportInfo state = new ReportInfo(code, fieldAnno.value(), fieldAnno.deprecated()); + codeStates.put(code, state); + } + } + } + Class[] innerClazz = clazz.getDeclaredClasses(); + for (Class inner : innerClazz) { + getAllCodeFieldAnnotation(inner); } } } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportCodeInfo.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportInfo.java similarity index 53% rename from libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportCodeInfo.java rename to libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportInfo.java index 0579bd5171..19df3093ac 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportCodeInfo.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportInfo.java @@ -1,7 +1,9 @@ package com.zhjt.mogo.adas.data.bean; -public class ReportCodeInfo { - public final String code; +import android.text.TextUtils; + +public class ReportInfo { + public final String name; /** * 开始支持的版本(包含) */ @@ -12,17 +14,14 @@ public class ReportCodeInfo { */ public final String deprecatedVersion; - public ReportCodeInfo(String code, String sinceVersion, String deprecatedVersion) { - this.code = code; + public ReportInfo(String name, String sinceVersion, String deprecatedVersion) { + this.name = name; this.sinceVersion = sinceVersion; this.deprecatedVersion = deprecatedVersion; } @Override public String toString() { - return code + - " sinceVersion='" + sinceVersion + '\'' + - ", deprecatedVersion='" + deprecatedVersion + '\'' + - '}'; + return name + " 开始支持版本(包含)=" + sinceVersion + (TextUtils.isEmpty(deprecatedVersion) ? "" : ", 弃用版本(不包含)='" + deprecatedVersion); } } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/CodeInfo.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportState.java similarity index 58% rename from libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/CodeInfo.java rename to libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportState.java index e55158c574..efe4f0a0bd 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/CodeInfo.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReportState.java @@ -7,13 +7,13 @@ import java.lang.annotation.Target; /** * MAP系统消息报告版本管理 - * 主要用于标记新增Code的版本,以及标记弃用的的Code + * 主要用于标记新增Result、Action、Code的版本,以及标记弃用的Result、Action、Code */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) -public @interface CodeInfo { - String value();//Code新增版本 +public @interface ReportState { + String value();//新增版本 - String deprecated() default "";//Code弃用版本 + String deprecated() default "";//弃用版本 } From 2883ed51a4031a716da61f8098f75c9786f49b75 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 8 Apr 2024 16:21:09 +0800 Subject: [PATCH 02/14] =?UTF-8?q?[6.4.0][Feat]FM=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E5=B9=B6=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/function/msgbox/DataManager.kt | 24 +++++++++++++++++-- .../core/function/msgbox/MsgBoxProvider.kt | 8 +++++++ .../core/function/msgbox/db/MsgBoxDao.kt | 3 +++ .../api/datacenter/msgbox/IMsgBoxProvider.kt | 2 ++ .../call/msgbox/CallerMsgBoxManager.kt | 7 ++++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt index 397d1222c0..18894c47d6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/DataManager.kt @@ -130,6 +130,9 @@ object DataManager { CallerMsgBoxListenerManager.invokeListener(MsgCategory.NOTICE, msg) } MsgBoxType.FMINFO -> { + synchronized(this) { + fmInfoList.add(msg) + } CallerMsgBoxListenerManager.invokeListener(MsgCategory.FM_INFO, msg) } MsgBoxType.VOICE -> { @@ -250,7 +253,7 @@ object DataManager { } } - private suspend fun getCacheMessages(context: Context): List = + private suspend fun getCacheMessages(context: Context): List = withContext(Dispatchers.IO) { delay(2000) return@withContext MsgBoxDb.getDb(context) @@ -326,7 +329,7 @@ object DataManager { } } else -> { - return@map MsgBoxBean(MsgBoxType.V2X, V2XMsg()) + return@map null } } } @@ -368,6 +371,13 @@ object DataManager { recordBagList.clear() } + if (fmInfoList.isNotEmpty()) { + fmInfoList.forEach { + msgInfoList.add(MsgBoxInfo(it.bean2Json, it.type.ordinal, it.timestamp)) + } + fmInfoList.clear() + } + if (msgInfoList.isNotEmpty()) { MsgBoxDb.getDb(context) .monitorDao() @@ -387,4 +397,14 @@ object DataManager { } } } + + fun queryFMInfoList(context: Context, startTime: Long, endTime: Long): List { + return MsgBoxDb.getDb(context).monitorDao() + .getFMInfoList(MsgBoxType.FMINFO.ordinal, startTime, endTime) + .map { boxInfo -> + MsgBoxBean(MsgBoxType.FMINFO, GsonUtils.fromJson(boxInfo.bean2Json, FMInfoMsg::class.java)).apply { + timestamp = boxInfo.timeStamp + } + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt index 106b464eef..41e0b64671 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgBoxProvider.kt @@ -50,6 +50,14 @@ class MsgBoxProvider : IMsgBoxProvider { return DataManager.getRecordBagData() } + override fun queryFMInfoList( + context: Context, + startTime: Long, + endTime: Long + ): List { + return DataManager.queryFMInfoList(context, startTime, endTime) + } + override fun removeRecordInfo(context: Context, msgBoxBean: MsgBoxBean, key: String) { DataManager.removeRecordInfo(key, key) DataManager.delMsgBoxBean(context, msgBoxBean) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt index 923e574416..51124004f8 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/db/MsgBoxDao.kt @@ -16,6 +16,9 @@ interface MsgBoxDao { @Query("SELECT * FROM t_msg_box") fun getAllCachedMessages(): List + @Query("SELECT * FROM t_msg_box WHERE json_obj_type == (:fmType) AND time_stamp >= (:startTime) AND time_stamp <= (:endTime)") + fun getFMInfoList(fmType: Int, startTime: Long, endTime: Long): List + @Query("DELETE FROM t_msg_box") fun deleteMsgTable() } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/msgbox/IMsgBoxProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/msgbox/IMsgBoxProvider.kt index 28ffc983f2..42e55c5e73 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/msgbox/IMsgBoxProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/datacenter/msgbox/IMsgBoxProvider.kt @@ -26,6 +26,8 @@ interface IMsgBoxProvider: IMoGoFunctionServerProvider { */ fun getCachedRecordBagData(): List + fun queryFMInfoList(context: Context, startTime: Long, endTime: Long): List + fun removeRecordInfo(context: Context, msgBoxBean: MsgBoxBean, key: String) fun getDismissTime(): Long diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt index b453929178..0ee40a2d7e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt @@ -64,6 +64,13 @@ object CallerMsgBoxManager { return providerApi?.getCachedRecordBagData() } + /** + * 查询一段时间范围内的FM数据集合 + */ + fun queryFMInfoList(context: Context, startTime: Long, endTime: Long): List? { + return providerApi?.queryFMInfoList(context, startTime, endTime) + } + /** * 用户已处理的Bag包需要删除(上传或取消都包含) * key: Bag包的唯一标识key, msgBoxBean: UI展示的那个对象而不是重新new的 From afd44e9da7c846dadccab4ceed6c9be47294e2fc Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Mon, 8 Apr 2024 16:21:49 +0800 Subject: [PATCH 03/14] =?UTF-8?q?[6.4.0][Feat]=E6=96=B0=E5=A2=9E=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=BB=BA=E8=AE=AE=E7=9A=84=E6=95=B0=E6=8D=AE=E6=9D=A5?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mogo/eagle/core/data/enums/DataSourceType.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/DataSourceType.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/DataSourceType.kt index 727e05201d..fbff75f3d3 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/DataSourceType.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/DataSourceType.kt @@ -8,7 +8,8 @@ enum class DataSourceType(name: String) { MAP("HDMAP"), TELEMATIC("TELEMATIC"), AICLOUD("AI云"), - SUMMARY("汇总");// V2X事件汇总 + SUMMARY("汇总"),// V2X事件汇总 + WORKORDER("工单建议"); companion object{ @@ -19,6 +20,7 @@ enum class DataSourceType(name: String) { TELEMATIC -> "TELEMATIC" AICLOUD -> "AI云" SUMMARY -> "汇总" + WORKORDER -> "工单建议" else -> "defalut" } } From 4e35d90a57b340837d8cca04d7e6d5d5cc529cee Mon Sep 17 00:00:00 2001 From: EmArrow Date: Mon, 8 Apr 2024 16:30:05 +0800 Subject: [PATCH 04/14] [6.4.0] add func of auth cert show --- .../autopilot/MoGoAutopilotControlProvider.kt | 6 +- .../MoGoAdasMsgConnectStatusListenerImpl.kt | 20 +++-- .../status/flow/OverViewImpl.kt | 50 ++++++++++- .../status/ui/StatusSummaryView.kt | 34 -------- .../hmi/ui/setting/DebugSettingView.kt | 32 ++++--- .../hmi/ui/setting/StatusSummaryAdapter.kt | 3 + .../hmi/ui/setting/StatusSummaryView.kt | 80 ++++++++++++++++-- .../src/main/res/drawable-xhdpi/ssl_check.png | Bin 0 -> 988 bytes .../stageone/secret/CertFileManager.kt | 10 +++ .../stageone/secret/PassPortSecret.java | 5 +- .../IMoGoAutopilotCarConfigListener.kt | 7 +- .../function/api/cloud/IMoGoCertProvider.kt | 2 + .../function/api/cloud/IMoGoCloudListener.kt | 5 ++ ...CallerAutopilotCarConfigListenerManager.kt | 17 ++++ .../call/cloud/CallerCloudCertManager.kt | 4 + .../call/cloud/CallerCloudListenerManager.kt | 13 +++ 16 files changed, 217 insertions(+), 71 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index f886339bb0..b08efc0941 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -129,7 +129,7 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtF()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) @@ -260,7 +260,7 @@ class MoGoAutopilotControlProvider : .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false)// 乘客端直连工控机改为false - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtF()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) @@ -321,7 +321,7 @@ class MoGoAutopilotControlProvider : // 设置IP地址 val options = AdasOptions.newBuilder() .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtF()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index c1bbbb09c0..9e41f5caa3 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -17,6 +17,7 @@ import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerParallelDrivingActionsListenerManager import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager @@ -59,13 +60,14 @@ class MoGoAdasMsgConnectStatusListenerImpl : private val isSentBasicInfoReq = AtomicBoolean(false)//是否已回复域控基础信息请求 @Volatile - private var certificationResult = "" + private var certificationResult = "未开启认证" init { CallerCloudListenerManager.addListener(TAG, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) CallerAutopilotActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) CallerParallelDrivingActionsListenerManager.setConnected(AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) + CallerAutopilotCarConfigListenerManager.invokeAutopilotCertFileResult(certificationResult) } private fun connectToast(reason: String) { @@ -249,7 +251,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : */ override fun onCertification(status: AdasConstants.CertificationStatus) { if (status == AdasConstants.CertificationStatus.TIMEOUT) { - certificationResult = ":认证超时"; + certificationResult = ":证书认证超时" CallerLogger.d( "$M_D_C$TAG", "域控证书认证超时(表示域控未发送BasicInfoReq接口的数据【这种情况可能是连接出现了问题】)" @@ -257,24 +259,25 @@ class MoGoAdasMsgConnectStatusListenerImpl : } else { if (status != AdasConstants.CertificationStatus.NOT_ENABLED) { if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_SUCCESS) { + certificationResult = ":成功校验域控证书" CallerLogger.d( "$M_D_C$TAG", - "域控证书链校验成功" + "成功校验域控证书" ) } else if (status == AdasConstants.CertificationStatus.ROOT_CRT_ERROR) { - certificationResult = ":ROOT证书异常"; + certificationResult = ":获取ROOT证书异常" CallerLogger.d( "$M_D_C$TAG", "ROOT证书异常(表示未传递证书,没有拿到ROOT证书)" ) } else if (status == AdasConstants.CertificationStatus.IPC_CRT_ERROR) { - certificationResult = ":域控证书异常"; + certificationResult = ":获取域控证书异常" CallerLogger.d( "$M_D_C$TAG", "域控证书异常(表示域控发送了BasicInfoReq接口的数据但是未传递证书或证书解码失败【失败的可能性很低】)" ) } else if (status == AdasConstants.CertificationStatus.CERTIFICATE_CHAIN_FAILED) { - certificationResult = ":证书链校验失败"; + certificationResult = ":域控证书校验失败" CallerLogger.d( "$M_D_C$TAG", "域控证书链校验失败(表示证书链未验证通过。证书不匹配、证书格式不正确)" @@ -282,6 +285,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : } } } + CallerAutopilotCarConfigListenerManager.invokeAutopilotCertFileResult(certificationResult) } private fun saveIntoMsgBox( @@ -341,7 +345,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : * 工控机获取SN */ override fun onAutopilotSNRequest(basicInfoReq: MessagePad.BasicInfoReq) { - CallerLogger.d("$M_D_C$TAG", "收到域控基础信息请求"); + CallerLogger.d("$M_D_C$TAG", "收到域控基础信息请求") isReceivedBasicInfoReq.set(true) if (!TextUtils.isEmpty(SharedPrefsMgr.getInstance().sn)) { syncBasicInfoToAutopilot() @@ -396,7 +400,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : } override fun tokenGot(token: String, sn: String) { - CallerLogger.d("$M_D_C$TAG", "SN获取成功=$sn"); + CallerLogger.d("$M_D_C$TAG", "SN获取成功=$sn") if (isReceivedBasicInfoReq.get() && !isSentBasicInfoReq.get()) {//已收到域控基础信息请求,但是之前SN没有所以还未回复,现在获取到SN后再进行回复 syncBasicInfoToAutopilot() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt index 3508e7fc2f..2faadac60d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt @@ -8,13 +8,20 @@ import android.content.IntentFilter import android.location.LocationManager import android.util.Log import androidx.core.location.LocationManagerCompat +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.IMogoStatusChangedListener import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.utilcode.util.AppStateManager @@ -30,7 +37,8 @@ import java.util.concurrent.atomic.AtomicBoolean internal class OverViewImpl(ctx: Context) : IFlow(ctx), IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, - IConnectStatusListener, IMogoStatusChangedListener { + IConnectStatusListener, IMogoStatusChangedListener, IMoGoAutopilotCarConfigListener, + IMoGoCloudListener { companion object { const val TAG = "OverViewImpl" @@ -56,6 +64,9 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), @Volatile private var isAutopilotException = false + @Volatile + private var isAuthCrtException = false + @Volatile private var isFirst = true @@ -125,6 +136,8 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), MogoStatusManager.getInstance() .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerCloudListenerManager.addListener(TAG, this) val isGranted = checkIsGpsException() if (!isGranted) { @@ -268,11 +281,41 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), } private fun checkIfNotException() { - if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException && !isAutopilotException) { + if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException && !isAutopilotException && !isAuthCrtException) { send(OverViewStatus(false)) } } + override fun authCrtFile(device: String, root: String) { + super.authCrtFile(device, root) + isAuthCrtException = false + checkIfNotException() + } + + override fun authCrtError(errorMsg: String) { + super.authCrtError(errorMsg) + isAuthCrtException = true + send(OverViewStatus(true)) + } + + override fun onCertificationResult(msg: String) { + super.onCertificationResult(msg) + if (!SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + ) { + return + } + if(msg.contains("成功校验")){ + isAuthCrtException = false + checkIfNotException() + }else{ + isAuthCrtException = true + send(OverViewStatus(true)) + } + } + override fun onDestroy() { super.onDestroy() // CallerDevaToolsListenerManager.removeListener(TAG) @@ -280,6 +323,9 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), MogoStatusManager.getInstance() .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerCloudListenerManager.removeListener(TAG) + try { if (registered.compareAndSet(true, false) && receiver != null) { ctx.unregisterReceiver(receiver) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt deleted file mode 100644 index 1845640015..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.status.ui - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.widget.FrameLayout -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.zhjt.mogo_core_function_devatools.R - -/** - * 状态汇总View控件 - */ -class StatusSummaryView@JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : FrameLayout( - context, - attrs, - defStyleAttr -), IMoGoAutopilotStatusListener { - companion object{ - private const val TAG = "SummaryStatusView" - } - - init { - LayoutInflater.from(context).inflate(R.layout.view_initiative_bad_case, this, true) - initView() - } - - private fun initView() { - - } -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 9556510904..aa86877049 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -12,7 +12,6 @@ import android.os.Build import android.os.Process import android.text.Html import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -89,6 +88,7 @@ import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.kotlin.scope import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -204,7 +204,8 @@ internal class DebugSettingView @JvmOverloads constructor( // 高精地图是否已缓存 private var isHDCached = false - private var isClickCheckedCbSsl = false//是否已经点击且选中证书认证按钮 + //是否已经点击且选中证书认证按钮 + private var isCertCheck = false private var isFirstDownLoadCertHint = false init { @@ -1293,14 +1294,13 @@ internal class DebugSettingView @JvmOverloads constructor( } } //是否启用证书认证 - cbSsl.isChecked = - SharedPrefsMgr.getInstance().getBoolean( - MoGoConfig.AUTOPILOT_CERTIFICATION, - MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE - ) + val check = SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + isCertCheck = check + cbSsl.isChecked = check cbSsl.setOnCheckedChangeListener { _, isChecked -> - isClickCheckedCbSsl = isChecked -// 下载证书 if (isChecked) { if (CallerCloudCertManager.getRootCrtF().isNullOrEmpty()) { if (!isFirstDownLoadCertHint) { @@ -1308,25 +1308,31 @@ internal class DebugSettingView @JvmOverloads constructor( ToastUtils.showShort("证书文件不存在,正在下载") } cbSsl.isChecked = false + //下载证书 CallerCloudCertManager.certFileDownLoad { errorMsg -> ThreadUtils.runOnUiThread { + isCertCheck = false ToastUtils.showShort(errorMsg) } } + }else{ + isCertCheck = true } + }else{ + isCertCheck = false } SharedPrefsMgr.getInstance() - .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, cbSsl.isChecked) + .putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", cbSsl.isChecked) } } override fun authCrtFile(device: String, root: String) { super.authCrtFile(device, root) ThreadUtils.runOnUiThread { - if (isClickCheckedCbSsl) { + if (isCertCheck) { cbSsl.isChecked = true SharedPrefsMgr.getInstance() - .putBoolean(MoGoConfig.AUTOPILOT_CERTIFICATION, true) + .putBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", true) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { tvCertFile.text = Html.fromHtml( @@ -2504,6 +2510,6 @@ internal class DebugSettingView @JvmOverloads constructor( paramIndexes = [0] ) private fun invokeCronetResult(json: String) { - Log.d("CronetNetwork", json) + CallerLogger.d(SceneConstant.M_HMI + "CronetNetwork", json) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt index e1109c28b6..15f0de63a3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryAdapter.kt @@ -48,6 +48,9 @@ class StatusSummaryAdapter(private val ctx: Context, var data: ArrayList { ivFuncView.setImageResource(R.drawable.controller) } + 5 -> { + ivFuncView.setImageResource(R.drawable.ssl_check) + } } if (entity.isException) { tvStatusDesc.setTextColor(Color.parseColor("#FF4444")) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt index 165f28ed20..4faa82f169 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StatusSummaryView.kt @@ -2,19 +2,26 @@ package com.mogo.eagle.core.function.hmi.ui.setting import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.widget.FrameLayout import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.IMogoStatusChangedListener import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.status.StatusSummaryEntity +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudCertManager +import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.function.hmi.R @@ -26,7 +33,7 @@ import com.zhjt.mogo.adas.data.AdasConstants /** * 状态汇总View控件 */ -class StatusSummaryView@JvmOverloads constructor( +class StatusSummaryView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 @@ -35,8 +42,9 @@ class StatusSummaryView@JvmOverloads constructor( attrs, defStyleAttr ), IConnectStatusListener, IMogoStatusChangedListener, - IMoGoDevaToolsListener, IMoGoAutopilotStatusListener { - companion object{ + IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, IMoGoAutopilotCarConfigListener, + IMoGoCloudListener { + companion object { private const val TAG = "SummaryStatusView" } @@ -50,6 +58,13 @@ class StatusSummaryView@JvmOverloads constructor( it.add(StatusSummaryEntity(2)) it.add(StatusSummaryEntity(3)) it.add(StatusSummaryEntity(4, "域控未连接", true)) + it.add( + StatusSummaryEntity( + 5, + CallerAutopilotCarConfigListenerManager.getCertFileResult(), + CallerCloudCertManager.getRootCrtF().isNullOrEmpty() + ) + ) } } @@ -67,6 +82,8 @@ class StatusSummaryView@JvmOverloads constructor( MogoStatusManager.getInstance() .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerAutopilotCarConfigListenerManager.addListener(TAG, this) + CallerCloudListenerManager.addListener(TAG, this) } private fun initView() { @@ -81,9 +98,10 @@ class StatusSummaryView@JvmOverloads constructor( it.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) it.addItemDecoration( CommonDividerItemDecoration.Builder() - .spanCountTBCare(false) - .horizontalInnerSpace(10.PX) - .build()) + .spanCountTBCare(false) + .horizontalInnerSpace(10.PX) + .build() + ) StatusSummaryAdapter(context, data).apply { adapter = this it.adapter = this @@ -108,6 +126,8 @@ class StatusSummaryView@JvmOverloads constructor( MogoStatusManager.getInstance() .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerAutopilotCarConfigListenerManager.removeListener(TAG) + CallerCloudListenerManager.removeListener(TAG) } /** @@ -168,30 +188,39 @@ class StatusSummaryView@JvmOverloads constructor( AdasConstants.IpcConnectionStatus.DISCONNECTED -> { pair = Pair("域控未连接", true) } + AdasConstants.IpcConnectionStatus.CONNECTED -> { pair = Pair("域控已连接", false) } + AdasConstants.IpcConnectionStatus.CONNECTING -> { pair = Pair("域控连接中", true) } + AdasConstants.IpcConnectionStatus.RECONNECTING_TIMER, AdasConstants.IpcConnectionStatus.RECONNECTING_NETWORK -> { pair = Pair("域控重连中", true) } + AdasConstants.IpcConnectionStatus.CONNECT_EXCEPTION -> { pair = Pair("域控连接异常", true) } + AdasConstants.IpcConnectionStatus.ILLEGAL_ADDRESS -> { pair = Pair("非法域控地址", true) } + AdasConstants.IpcConnectionStatus.SEARCH_ADDRESS -> { pair = Pair("正在搜索域控地址", true) } + AdasConstants.IpcConnectionStatus.NOT_FOUND_ADDRESS -> { pair = Pair("找不到可用的域控地址", true) } + AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> { pair = Pair("域控心跳超时", true) } + AdasConstants.IpcConnectionStatus.SERVER_DISCONNECTED -> { pair = Pair("域控主动断开连接", true) } @@ -203,4 +232,41 @@ class StatusSummaryView@JvmOverloads constructor( adapter?.notifyItemChanged(4) } } + + override fun authCrtFile(device: String, root: String) { + super.authCrtFile(device, root) + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = "本机证书已下载" + data[5].isException = false + adapter?.notifyItemChanged(5) + } + } + + override fun authCrtError(errorMsg: String) { + super.authCrtError(errorMsg) + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = "本机证书下载异常:$errorMsg" + data[5].isException = true + adapter?.notifyItemChanged(5) + } + } + + override fun onCertificationResult(msg: String) { + super.onCertificationResult(msg) + if (!SharedPrefsMgr.getInstance().getBoolean( + "${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", + MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE + ) + ) { + return + } + UiThreadHandler.post { + if (data.size < 6) return@post + data[5].desc = msg + data[5].isException = !msg.contains("成功校验") + adapter?.notifyItemChanged(5) + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/ssl_check.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe5c0f1a8af6b86e0c0eaec62d21e6b71135216 GIT binary patch literal 988 zcmV<210(#2P)Px&mPtfGRCr$Pn$4BdFc5%8p#j)O0ekVC4p_<|oTy+)2V7XrRI*7OxljNvR6xWV z#S_M3$(F{lyu|V)Z&$zb&97t|SovdCEH^gT79?=@?f3A0Pf$cr*YH9gQypp%{Rm;L`33gP0Wn3XSsl zG;RU*uMF&deQfp}cW8lNyRmTCY+#Rl=86xK08kL)o3jSq z^AoK7ft#2sZ&OY2udXon0QP=rHJJ&(crxVKLFRLc@O+j~9Wl6)!WEMNxYR_ZKQ4FC z9-3^B3?P*Mi%RNSOria@Vol$=KMwTg;q^YY_6|fAb`&$NMGre7W1IKn=-IMH`)UAD zZoo7`0Sqg`D?HIo)go1w7}-1h2lRxXe{UO?2~r=G3&a2*0emMt+$3p?x4RQydry!8 zV9JGx3P4O8AOS+K#sH-NpuVZvSGzzA0BM#zOAtXzwx2s27~4{lx?D-34$T?b_MxkAmpw;bwD37KZjfvN-2B_uSMR{U z>vkibPuu2e289Nv;1*~A4rj-xeRrTZ6(#}Tn&R4{+^jXj6kxoPlp4qVrM`qo0ub8h zP<@{w+*sc^zA4B8pm#c)P?&@u$a@3r1&EwK8-QMR$Os{HR35XKnD%S{aIrZc%qhIO z6doe$trHa1Am@=6tTEb+>66t0_=3H2ea^e=JNH>dc^>Atic1KwBWR#;sCfNd{<&IkvnIf zMFHd#L_1dnpe1)J r = initLow(passportService, deviceId, path); diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotCarConfigListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotCarConfigListener.kt index 255cd1c59f..f51ad9a1ea 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotCarConfigListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotCarConfigListener.kt @@ -12,6 +12,11 @@ interface IMoGoAutopilotCarConfigListener { * * @param carConfigResp 包括docker版本,macAddress等基础信息,详见proto */ - fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) + fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp){} + + /** + * 与工控证书验证结果 + */ + fun onCertificationResult(msg: String){} } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCertProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCertProvider.kt index fbd266d3df..3a00812113 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCertProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCertProvider.kt @@ -8,4 +8,6 @@ interface IMoGoCertProvider:IProvider { fun getDeviceCrtF():String? fun getRootCrtF(): String? + + fun getCrtFileErrorMsg(): String? } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt index d82f858588..41dca782c4 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/cloud/IMoGoCloudListener.kt @@ -6,6 +6,11 @@ interface IMoGoCloudListener{ //单独线程 fun authCrtFile(device:String, root:String){} + /** + * 下载证书文件异常 + */ + fun authCrtError(errorMsg: String){} + fun tokenGot(token: String, sn: String){} /** diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt index 950f9bb2fe..dbf75c5c27 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotCarConfigListenerManager.kt @@ -11,11 +11,16 @@ object CallerAutopilotCarConfigListenerManager : CallerBase() { if (!token.isNullOrEmpty() && !sn.isNullOrEmpty()) { listener.tokenGot(token!!, sn!!) } + if(CallerCloudCertManager.getDeviceCrtF()!= null && CallerCloudCertManager.getRootCrtF()!= null){ + listener.authCrtFile(CallerCloudCertManager.getDeviceCrtF()!!, CallerCloudCertManager.getRootCrtF()!!) + } + if(CallerCloudCertManager.getCrtFileErrorMsg()!= null){ + listener.authCrtError(CallerCloudCertManager.getCrtFileErrorMsg()!!) + } } fun invokeCloudCrtFile(deviceCrtFile: String, rootCrtFile: String) { @@ -26,6 +32,13 @@ object CallerCloudListenerManager : CallerBase() { } } + fun invokeCloudCrtError(errorMsg: String){ + M_LISTENERS.forEach { + val listener = it.value + listener.authCrtError(errorMsg) + } + } + /** * 分发获取到的设备sn */ From a6487c4966df78d356c56e13289310b5e2b7c87a Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Mon, 8 Apr 2024 17:40:02 +0800 Subject: [PATCH 05/14] =?UTF-8?q?[640][app]=20=E6=B7=BB=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=95=8C=E9=9D=A2=E5=90=8E=E7=9A=84=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 12 ++++++------ .../function/call/cloud/CallerCloudCertManager.kt | 10 +++++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index b08efc0941..bfdfffcc4c 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -130,8 +130,8 @@ class MoGoAutopilotControlProvider : .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false) .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -261,8 +261,8 @@ class MoGoAutopilotControlProvider : .setPingAddressList(AdasManager.getInstance().pingAddressList) .setPassenger(false)// 乘客端直连工控机改为false .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) .build() AdasManager.getInstance().create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -322,8 +322,8 @@ class MoGoAutopilotControlProvider : val options = AdasOptions.newBuilder() .setPassenger(false) .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtF()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtF()) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) .setSpecifiedAddress(autoPilotIp) .build() diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt index cd35221a0e..bd2f04dc58 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/cloud/CallerCloudCertManager.kt @@ -27,6 +27,14 @@ object CallerCloudCertManager { } fun getDeviceCrtF(): String? { + return certProviderApi.getDeviceCrtF() + } + + fun getRootCrtF(): String? { + return certProviderApi.getRootCrtF() + } + + fun getDeviceCrtFDecode(): String? { var crt = certProviderApi.getDeviceCrtF() if (!crt.isNullOrEmpty()) { crt = String(Base64.decode(crt, Base64.NO_WRAP), StandardCharsets.UTF_8) @@ -34,7 +42,7 @@ object CallerCloudCertManager { return crt } - fun getRootCrtF(): String? { + fun getRootCrtFDecode(): String? { var crt = certProviderApi.getRootCrtF() if (!crt.isNullOrEmpty()) { crt = String(Base64.decode(crt, Base64.NO_WRAP), StandardCharsets.UTF_8) From 7e6cc37b285cfcb193c13434a0c2564ff8dc841e Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 8 Apr 2024 19:52:04 +0800 Subject: [PATCH 06/14] =?UTF-8?q?[6.4.0]=E4=BA=8B=E4=BB=B6=E5=92=8CFM?= =?UTF-8?q?=E6=95=85=E9=9A=9C=E4=BF=A1=E6=81=AF=E4=BA=A4=E4=BA=92=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 54 ++++++++++++++---- .../adapter/DriverMsgBoxBubbleAdapter.kt | 26 +++++++-- .../msgbox/adapter/DriverMsgBoxListAdapter.kt | 56 ++++++++++--------- .../mogo/eagle/core/data/msgbox/FMInfoMsg.kt | 3 +- .../mogo/eagle/core/data/msgbox/MsgFmData.kt | 14 ++--- ...llerFaultManagementStateListenerManager.kt | 10 +++- 6 files changed, 113 insertions(+), 50 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 8415e33cc2..bc3dc0a6fa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -8,13 +8,16 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.data.msgbox.MsgFmData import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.api.order.IOrderListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager @@ -97,23 +100,52 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } } else if(category == MsgCategory.SYS_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) + val reportMsg = msgBoxBean.bean as ReportEntity + //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + var isShowReport = false + for(action in reportMsg.actionsList){ + if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + isShowReport = true + } + } + } + if(isShowReport){ + //展示消息 + showData(msgBoxBean) + } + } else if(category == MsgCategory.FM_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if(FunctionBuildConfig.isTakeoverRemind){ //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车 - || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车 - || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车 - ){ - //语音提示 - try { - SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) - }catch (e: Exception){ - e.printStackTrace() + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) + fmInfoMsg.fmInfoList?.forEach { faultInfo -> + if(faultInfo.faultActionCount>0){ + faultInfo.faultActionList.forEach {actionCode -> + //获取建议操作级别,得到建议操作级别最高的操作 + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ + curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) + } + } + } + } + //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + if(curFaultLevel == 0){ + //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + //语音提示 + try { + SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips) + }catch (e: Exception){ + e.printStackTrace() + } + //展示消息 + showData(msgBoxBean) } - //展示消息 - showData(msgBoxBean) } } } else{ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index fc6ab08a14..18436b65e5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -21,6 +21,7 @@ import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform +import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout @@ -242,7 +243,6 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A is BubbleFmHolder ->{ data?.let { val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg - holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) if(fmMsg.policyTime == null){ holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat()) }else{ @@ -250,26 +250,43 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A } if(fmMsg.fmInfoList?.size == 0){ holder.tvBubbleFmFaultAction.text = "建议操作:暂无" + holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode) }else{ - var curFaultLevel = 0 //默认级别,遍历数组找出级别最高的(level数越小大,级别越高) + var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) fmMsg.fmInfoList?.forEach { faultInfo -> if(faultInfo.faultActionCount>0){ faultInfo.faultActionList.forEach {actionCode -> //获取建议操作级别,得到建议操作级别最高的操作 - if(MsgFmData.FaultAction.getFaultLevel(actionCode) > curFaultLevel){ + if(MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel){ curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode) } } } } val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel) + holder.tvBubbleFmFault.text = faultAction //当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、 // 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容 - if(curFaultLevel == 0){ + if(curFaultLevel == 5){ holder.tvBubbleFmFaultAction.text = "建议操作:暂无" }else{ holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})" } + //不同级别的Icon显示 + when(curFaultLevel){ + 0->{ + //重度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + } + 1,2,3->{ + //中度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + } + 4,5->{ + //轻度预警样式 + holder.ivBubbleFmImage.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + } + } } } } @@ -409,6 +426,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault) var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction) var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime) + var ivBubbleFmImage: ImageView = itemView.findViewById(R.id.ivBubbleFmImage) } //SSM连接消息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index a665a8dd12..4147dff501 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -173,39 +173,21 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : "时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}" holder.tvFmTime.text = fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1,getHourMinFormat()) } - //不同级别的Icon显示 - if(fmInfoMsg.policyCode == "FM_DP_ONLY_WARNING"){ - //警示 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) - }else if(fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT1" - || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT2" - || fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT3"){ - //降速行驶 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open)) - }else if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" - || fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" - || fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP"){ - //安全停车 - holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) - holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open)) - } - //Title - holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) - holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) //建议操作 if(fmInfoMsg.fmInfoList.isNullOrEmpty()){ //建议操作暂无 holder.tvFmActionOpen.text = "建议操作:暂无" holder.tvFmActionNormal.text = "建议操作:暂无" + //Title + holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) + holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode) }else{ val receiveFaultLevel = ArrayList() fmInfoMsg.fmInfoList!!.forEach { info -> if(info.faultActionCount != 0){ info.faultActionList.forEach { action -> //如果不包含此故障Level,则进行添加 - if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action)) && MsgFmData.FaultAction.getFaultLevel(action)!=0){ + if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action))){ receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action)) } } @@ -216,7 +198,28 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : val faultActionStr: StringBuilder = StringBuilder() faultActionStr.append("建议操作:") receiveFaultLevel.sort() - receiveFaultLevel.reverse() +// receiveFaultLevel.reverse() + //Title + holder.tvFmTitleNormal.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0]) + holder.tvFmTitleOpen.text = MsgFmData.FaultAction.getFaultAction(receiveFaultLevel[0]) + //不同级别的Icon显示 + when(receiveFaultLevel[0]){ + 0->{ + //重度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open)) + } + 1,2,3->{ + //中度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open)) + } + 4,5->{ + //轻度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) + } + } receiveFaultLevel.forEach {level-> if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank()){ faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level)) @@ -227,11 +230,11 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : faultActionStr.append(")") } if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){ - faultActionStr.append("/") + faultActionStr.append(";") } } if(faultActionStr.length > 5){ - if(faultActionStr.endsWith("/")){ + if(faultActionStr.endsWith(";")){ faultActionStr.deleteCharAt(faultActionStr.lastIndex) } holder.tvFmActionOpen.text = faultActionStr.toString() @@ -243,6 +246,9 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : }else{ holder.tvFmActionOpen.text = "建议操作:暂无" holder.tvFmActionNormal.text = "建议操作:暂无" + //轻度预警样式 + holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal)) + holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open)) } } //故障策略 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt index eefaac14f4..9d72baf4f8 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/FMInfoMsg.kt @@ -19,5 +19,6 @@ data class FMInfoMsg( data class FMFilterInfoMsg( var fmInfoList: List?, var policyCode: String?, - var cacheFilterList: MutableList? + var cacheFilterList: MutableList?, + var receiveTime: Long ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt index 32297c55cc..52d3682e4b 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt @@ -15,19 +15,19 @@ class MsgFmData{ val faultLevel: Int//故障处理级别 ){ //请求平行驾驶接管 - FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER("恢复策略","请求平行驾驶接管","FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER","如planing出站时,规划失败",5), + FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER("恢复策略","请求平行驾驶接管","FM_ACT_NEED_PARALLEL_DERVING_TAKEOVER","如planing出站时,规划失败",3), //请求人工驾驶接管 - FM_ACT_NEED_MANNUAL_DERVING("恢复策略","请求人工驾驶接管","FM_ACT_NEED_MANNUAL_DERVING","如planing规划失败,且存在弱网判断",6), + FM_ACT_NEED_MANNUAL_DERVING("恢复策略","请求人工驾驶接管","FM_ACT_NEED_MANNUAL_DERVING","如planing规划失败,且存在弱网判断",0), //系统重启 - FM_ACT_NEED_RESTART_SYSTEM("恢复策略","系统重启","FM_ACT_NEED_RESTART_SYSTEM","如检测到出现多个节点奔溃",4), + FM_ACT_NEED_RESTART_SYSTEM("恢复策略","系统重启","FM_ACT_NEED_RESTART_SYSTEM","如检测到出现多个节点奔溃",2), //整车下电重启 - FM_ACT_MUST_VEHICLE_POWER_RESET("恢复策略","整车下电重启","FM_ACT_MUST_VEHICLE_POWER_RESET","如底盘无数据,需要下电重启",7), + FM_ACT_MUST_VEHICLE_POWER_RESET("恢复策略","整车下电重启","FM_ACT_MUST_VEHICLE_POWER_RESET","如底盘无数据,需要下电重启",1), //请联系硬件工程师 - FM_ACT_CONTACT_HARDWARE_ENGINEER("人工处理","请联系硬件工程师","FM_ACT_CONTACT_HARDWARE_ENGINEER","硬件接线,域控启动等故障",3), + FM_ACT_CONTACT_HARDWARE_ENGINEER("人工处理","请联系硬件工程师","FM_ACT_CONTACT_HARDWARE_ENGINEER","硬件接线,域控启动等故障",4), //请联系运维工程师 - FM_ACT_CONTACT_OPERATIONS_ENGINEER("人工处理","请联系运维工程师","FM_ACT_CONTACT_OPERATIONS_ENGINEER","系统配置不对,网络等故障",2), + FM_ACT_CONTACT_OPERATIONS_ENGINEER("人工处理","请联系运维工程师","FM_ACT_CONTACT_OPERATIONS_ENGINEER","系统配置不对,网络等故障",4), //请联系软件工程师 - FM_ACT_CONTACT_SOFTWARE_ENGINEER("人工处理","请联系软件工程师","FM_ACT_CONTACT_SOFTWARE_ENGINEER","节点挂掉,无法启动等故障",1); + FM_ACT_CONTACT_SOFTWARE_ENGINEER("人工处理","请联系软件工程师","FM_ACT_CONTACT_SOFTWARE_ENGINEER","节点挂掉,无法启动等故障",4); companion object{ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt index 11ef68c0b8..27cf20598e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFaultManagementStateListenerManager.kt @@ -4,6 +4,7 @@ import com.mogo.eagle.core.data.msgbox.FMFilterInfoMsg import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgFmData import com.mogo.eagle.core.function.api.autopilot.IMoGoFaultManagementStateListener import com.mogo.eagle.core.function.call.base.CallerBase import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager @@ -39,7 +40,11 @@ object CallerFaultManagementStateListenerManager : CallerBase Date: Wed, 10 Apr 2024 16:27:20 +0800 Subject: [PATCH 07/14] =?UTF-8?q?[6.4.0]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90=E4=BF=AE=E6=94=B9=E7=B1=BB=E5=9E=8B=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index bc3dc0a6fa..959553636e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener @@ -100,22 +101,23 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } } else if(category == MsgCategory.SYS_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) - val reportMsg = msgBoxBean.bean as ReportEntity - //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - var isShowReport = false - for(action in reportMsg.actionsList){ - if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ - if(CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7){ - isShowReport = true + if(msgBoxBean.type == MsgBoxType.REPORT){ + val reportMsg = msgBoxBean.bean as ReportEntity + //P8-P1均只收在消息盒子里,P0消息盒子弹出,其中P0弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 + var isShowReport = false + for(action in reportMsg.actionsList){ + if("ACTION_MANUAL_HANDLE_IMMEDIATELY" == action){ + if(CallerAutoPilotStatusListenerManager.getState() == 2 + || CallerAutoPilotStatusListenerManager.getState() == 7){ + isShowReport = true + } } } + if(isShowReport){ + //展示消息 + showData(msgBoxBean) + } } - if(isShowReport){ - //展示消息 - showData(msgBoxBean) - } - } else if(category == MsgCategory.FM_INFO){ CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if(FunctionBuildConfig.isTakeoverRemind){ From 81389d56ab4902d2e35364bb5c304b6b65b448b8 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Wed, 10 Apr 2024 17:29:21 +0800 Subject: [PATCH 08/14] =?UTF-8?q?[640][adas]=20=E8=83=BD=E5=90=A6=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=87=AA=E9=A9=BE=E6=9D=A1=E4=BB=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20=E6=B2=B9=E9=97=A8=E6=96=B9=E5=90=91=E7=9B=98=E5=8D=B1?= =?UTF-8?q?=E9=99=A9=E6=8A=A5=E8=AD=A6=E7=81=AF=E7=8A=B6=E6=80=81=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E6=8A=BD=E7=A6=BB=E5=BA=95=E7=9B=98=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E5=8E=9F=E5=9B=A0=E7=88=B6=E7=B1=BB=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=BD=A6=E7=81=AF=E7=8A=B6=E6=80=81=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=94=A8=E4=BA=8E=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=90=8E=E7=9A=84=E8=BD=A6=E7=81=AF=E7=8A=B6?= =?UTF-8?q?=E6=80=81=EF=BC=8C=E7=9B=AE=E5=89=8D=E8=BE=93=E5=87=BA=EF=BC=9A?= =?UTF-8?q?=E5=B7=A6=E5=8F=B3=E8=BD=AC=E7=81=AF=E5=92=8C=E5=8F=8C=E9=97=AA?= =?UTF-8?q?=E7=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/script/vehicleFlavors/ochDFHQ.gradle | 4 +- app/script/vehicleFlavors/ochFT.gradle | 4 +- app/script/vehicleFlavors/ochJL.gradle | 4 +- app/script/vehicleFlavors/ochM1.gradle | 5 +- app/script/vehicleFlavors/ochM2.gradle | 4 +- .../mogo/launcher/startup/ConfigStartUp.kt | 2 +- .../autopilot/MoGoAutopilotControlProvider.kt | 6 +- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 24 ++- .../core/data/config/FunctionBuildConfig.kt | 2 +- .../CallerChassisLamplightListenerManager.kt | 4 +- .../adas/data/bean/UnableLaunchReason.java | 1 - .../zhidao/support/adas/high/AdasChannel.java | 12 +- .../zhidao/support/adas/high/AdasManager.java | 9 +- .../zhidao/support/adas/high/AdasOptions.java | 24 +-- .../support/adas/high/IAdasNetCommApi.java | 7 +- .../support/adas/high/OnAdasListener.java | 11 ++ .../adas/high/common/TurnLightState.java | 34 ++++ .../ability/AutopilotAbility230.java | 59 ++---- .../ability/AutopilotAbility250.java | 97 +++------- .../ability/AutopilotAbility330.java | 23 ++- .../ability/AutopilotAbility350And360.java | 98 +++------- .../ability/AutopilotAbility360.java | 23 ++- .../ability/AutopilotAbilityManager.java | 99 ++++------ .../ability/BaseAutopilotAbilityChassis.java | 175 ++++++++++++++++++ .../adas/high/msg/ChassisStatesMessage.java | 34 +++- .../adas/high/msg/MyMessageFactory.java | 12 +- .../adas/high/msg/VehicleStateMessage.java | 42 ++++- 27 files changed, 486 insertions(+), 333 deletions(-) create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TurnLightState.java create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/BaseAutopilotAbilityChassis.java diff --git a/app/script/vehicleFlavors/ochDFHQ.gradle b/app/script/vehicleFlavors/ochDFHQ.gradle index 07645b6903..8ee3dea128 100644 --- a/app/script/vehicleFlavors/ochDFHQ.gradle +++ b/app/script/vehicleFlavors/ochDFHQ.gradle @@ -16,8 +16,8 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - // ③不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_P);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③能启动自驾的档位 MAP<360代码中会移除P档 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);}}' } diff --git a/app/script/vehicleFlavors/ochFT.gradle b/app/script/vehicleFlavors/ochFT.gradle index fbc9a66f09..41f4b6cd7b 100644 --- a/app/script/vehicleFlavors/ochFT.gradle +++ b/app/script/vehicleFlavors/ochFT.gradle @@ -15,7 +15,7 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - // ③不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'null' + // ③能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'null' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/ochJL.gradle b/app/script/vehicleFlavors/ochJL.gradle index 51396a0233..5821f84474 100644 --- a/app/script/vehicleFlavors/ochJL.gradle +++ b/app/script/vehicleFlavors/ochJL.gradle @@ -16,7 +16,7 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'true' - // ③不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' } } \ No newline at end of file diff --git a/app/script/vehicleFlavors/ochM1.gradle b/app/script/vehicleFlavors/ochM1.gradle index b4c2f4071e..a00868473c 100644 --- a/app/script/vehicleFlavors/ochM1.gradle +++ b/app/script/vehicleFlavors/ochM1.gradle @@ -13,9 +13,8 @@ project.android.productFlavors { // ①标识构建的应用身份类型,具体查看 README.md APP_IDENTITY_MODE规则 buildConfigField 'String', 'APP_IDENTITY_MODE_TAIL', "\"M1\"" - // ②构建的是否要动态更换模型 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'null' - + // ②M1能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' // ③不能启动自驾的档位 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' diff --git a/app/script/vehicleFlavors/ochM2.gradle b/app/script/vehicleFlavors/ochM2.gradle index b7d7988e75..dd3e198dad 100644 --- a/app/script/vehicleFlavors/ochM2.gradle +++ b/app/script/vehicleFlavors/ochM2.gradle @@ -16,7 +16,7 @@ project.android.productFlavors { // ②构建的是否要动态更换模型 buildConfigField 'boolean', 'IS_CAR_MODEL_CHANGE', 'false' - // ③M2不能启动自驾的档位 - buildConfigField 'java.util.Set', 'UNABLE_LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_N);add(chassis.Chassis.GearPosition.GEAR_P);add(chassis.Chassis.GearPosition.GEAR_R);}}' + // ③M2能启动自驾的档位 + buildConfigField 'java.util.Set', 'LAUNCH_AUTOPILOT_GEAR', 'new java.util.HashSet(){{add(chassis.Chassis.GearPosition.GEAR_D);}}' } } \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index 6c1f1e6e8b..ba8f154e2c 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -45,7 +45,7 @@ object ConfigStartUp { // 各个module需要的url FunctionBuildConfig.urlJson = GsonUtils.fromJson(BuildConfig.URLs, UrlConfig::class.java) //不能启动自动驾驶的档位 - FunctionBuildConfig.unableLaunchAutopilotGear = BuildConfig.UNABLE_LAUNCH_AUTOPILOT_GEAR + FunctionBuildConfig.launchAutopilotGear = BuildConfig.LAUNCH_AUTOPILOT_GEAR // 各车型宣传视频本地配置json FunctionBuildConfig.mediaUrlConfig = BuildConfig.mediaUrlConfig FunctionBuildConfig.musicUrlConfig = BuildConfig.musicUrlConfig diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index bfdfffcc4c..b932142efa 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -132,7 +132,7 @@ class MoGoAutopilotControlProvider : .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -228,7 +228,7 @@ class MoGoAutopilotControlProvider : val options = AdasOptions .newBuilder() .setPassenger(true) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance() .create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -263,7 +263,7 @@ class MoGoAutopilotControlProvider : .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) - .setUnableLaunchAutopilotGear(FunctionBuildConfig.unableLaunchAutopilotGear) + .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) .build() AdasManager.getInstance().create(mContext, options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index a98e8ef5cb..75d46a51f9 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.datacenter.autopilot.adapter import bag_manager.BagManagerOuterClass +import chassis.Chassis import chassis.ChassisStatesOuterClass import chassis.VehicleStateOuterClass import com.mogo.eagle.core.data.app.AppConfigInfo @@ -169,7 +170,7 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { if (vehicleState != null) { //转向灯数据 - CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(vehicleState.light) +// CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(vehicleState.light) //刹车灯数据 CallerChassisLamplightListenerManager.invokeAutopilotBrakeLightData(vehicleState.brakeLightStatus) //方向盘转向角数据 @@ -231,10 +232,10 @@ class MoGoAdasListenerImpl : OnAdasListener { ) { if (chassisStates != null) { chassisStates.bcmSystemStates?.let { bcmSystemStates -> - bcmSystemStates.turnLightState?.let { - //转向灯数据 - CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(it) - } +// bcmSystemStates.turnLightState?.let { +// //转向灯数据 +// CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(it) +// } //刹车灯数据 CallerChassisLamplightListenerManager.invokeAutopilotBrakeLightData(bcmSystemStates.brakeLightState != 0) } @@ -277,6 +278,19 @@ class MoGoAdasListenerImpl : OnAdasListener { } } + /** + * 底盘车灯状态 转换过的可以直接使用 + * 例如: + * 原始右转数据: 0 2 0 2 0 2。。。 + * 转换之后数据: 2 2 2 2 2 2。。。 + * + * @param light 车灯 目前域控发送车灯有 左传{@link Chassis.LightSwitch#LIGHT_LEFT} 右转{@link Chassis.LightSwitch#LIGHT_RIGHT} 危险报警灯{@link Chassis.LightSwitch#LIGHT_FLASH} + */ + override fun onLightSwitch(light: Chassis.LightSwitch) { + //转向灯数据 + CallerChassisLamplightListenerManager.invokeAutopilotLightSwitchData(light) + } + //自动驾驶状态 @ChainLog( linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index 8adf15a6c3..cdf8180f9d 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -302,7 +302,7 @@ object FunctionBuildConfig { */ @Volatile @JvmField - var unableLaunchAutopilotGear: Set? = null + var launchAutopilotGear: Set? = null /** * 当前应用是否支持patch升级 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLamplightListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLamplightListenerManager.kt index a18985d90d..0eead86298 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLamplightListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisLamplightListenerManager.kt @@ -17,10 +17,10 @@ object CallerChassisLamplightListenerManager : CallerBase unableLaunchAutopilotGear) { - AutopilotAbilityManager.getInstance().setUnableLaunchAutopilotGear(unableLaunchAutopilotGear); + public void setLaunchAutopilotGear(@Nullable Set launchAutopilotGear) { + AutopilotAbilityManager.getInstance().setLaunchAutopilotGear(launchAutopilotGear); } /** 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 b85ecec0d1..f29f121e3c 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 @@ -4,6 +4,7 @@ import android.content.Context; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.google.protobuf.ByteString; import com.zhidao.support.adas.high.bean.VersionCompatibility; @@ -1794,13 +1795,13 @@ public class AdasManager implements IAdasNetCommApi { } /** - * 设置不能启动自动驾驶的档位 + * 设置可以启动自动驾驶的档位 * - * @param unableLaunchAutopilotGear 不能起自驾档位 + * @param launchAutopilotGear 能起自驾档位 null表示所有档位都可启动 */ @Override - public void setUnableLaunchAutopilotGear(Set unableLaunchAutopilotGear) { - AutopilotAbilityManager.getInstance().setUnableLaunchAutopilotGear(unableLaunchAutopilotGear); + public void setLaunchAutopilotGear(@Nullable Set launchAutopilotGear) { + AutopilotAbilityManager.getInstance().setLaunchAutopilotGear(launchAutopilotGear); } /** diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java index a72b8ba6ed..8f3d61adf1 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java @@ -51,7 +51,7 @@ public class AdasOptions { private final String deviceCrt; private final boolean isAutoConnect; private final Set subscribeInterfaceOptions; - private final Set unableLaunchAutopilotGear; + private final Set launchAutopilotGear; private AdasOptions(Builder builder) { @@ -66,7 +66,7 @@ public class AdasOptions { this.deviceCrt = builder.deviceCrt; this.isAutoConnect = builder.isAutoConnect; this.subscribeInterfaceOptions = builder.subscribeInterfaceOptions; - this.unableLaunchAutopilotGear = builder.unableLaunchAutopilotGear; + this.launchAutopilotGear = builder.launchAutopilotGear; } public boolean isPassenger() { @@ -113,8 +113,8 @@ public class AdasOptions { return subscribeInterfaceOptions; } - public Set getUnableLaunchAutopilotGear() { - return unableLaunchAutopilotGear; + public Set getLaunchAutopilotGear() { + return launchAutopilotGear; } public static Builder newBuilder() { @@ -141,7 +141,7 @@ public class AdasOptions { private String deviceCrt; private boolean isAutoConnect = DEFAULT.IS_AUTO_CONNECT; private Set subscribeInterfaceOptions; - private Set unableLaunchAutopilotGear; + private Set launchAutopilotGear; private Builder() { @@ -159,7 +159,7 @@ public class AdasOptions { this.deviceCrt = options.deviceCrt; this.isAutoConnect = options.isAutoConnect; this.subscribeInterfaceOptions = options.subscribeInterfaceOptions; - this.unableLaunchAutopilotGear = options.unableLaunchAutopilotGear; + this.launchAutopilotGear = options.launchAutopilotGear; } @@ -276,8 +276,8 @@ public class AdasOptions { /** * 设备证书 * 启用认证后如果不传递,必须在调用以下方法时传递 - * {@link AdasManager#sendBasicInfoResp(String, AdasConstants.Environment, AdasConstants.TerminalRole, String)} - * {@link AdasManager#sendBasicInfoResp(String, AdasConstants.Environment, AdasConstants.TerminalRole, int, String, String)} + * {@link AdasManager#sendBasicInfoResp(String, int, int, String)} + * {@link AdasManager#sendBasicInfoResp(String, int, int, int, String, String)} * * @param deviceCrt root证书 * @return Builder @@ -325,13 +325,13 @@ public class AdasOptions { } /** - * 不能启动自驾的档位 + * 能启动自驾的档位 * - * @param unableLaunchAutopilotGear 档位 + * @param launchAutopilotGear 能起自驾档位 null表示所有档位都可启动 * @return Builder */ - public Builder setUnableLaunchAutopilotGear(Set unableLaunchAutopilotGear) { - this.unableLaunchAutopilotGear = unableLaunchAutopilotGear; + public Builder setLaunchAutopilotGear(Set launchAutopilotGear) { + this.launchAutopilotGear = launchAutopilotGear; return this; } 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 c1e78865be..5ba39f8bf5 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 @@ -1,6 +1,7 @@ package com.zhidao.support.adas.high; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.Constants; @@ -145,11 +146,11 @@ public interface IAdasNetCommApi { void setAutoConnect(boolean enable); /** - * 设置不能启动自动驾驶的档位 + * 设置可以启动自动驾驶的档位 * - * @param unableLaunchAutopilotGear 不能起自驾档位 + * @param launchAutopilotGear 能起自驾档位 null表示所有档位都可启动 */ - void setUnableLaunchAutopilotGear(Set unableLaunchAutopilotGear); + void setLaunchAutopilotGear(@Nullable Set launchAutopilotGear); /** * 自动驾驶设备基础信息应答 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 d50e61c691..d854e887cd 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 @@ -26,6 +26,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; import java.util.ArrayList; import bag_manager.BagManagerOuterClass; +import chassis.Chassis; import chassis.ChassisStatesOuterClass; import chassis.VehicleStateOuterClass; import fault_management.FmInfo; @@ -98,6 +99,16 @@ public interface OnAdasListener { */ void onChassisStates(MessagePad.Header header, ChassisStatesOuterClass.ChassisStates chassisStates); + /** + * 底盘车灯状态 转换过的可以直接使用 + * 例如: + * 原始右转数据: 0 2 0 2 0 2。。。 + * 转换之后数据: 2 2 2 2 2 2。。。 + * + * @param light 车灯 目前域控发送车灯有 左传{@link Chassis.LightSwitch#LIGHT_LEFT} 右转{@link Chassis.LightSwitch#LIGHT_RIGHT} 危险报警灯{@link Chassis.LightSwitch#LIGHT_FLASH} + */ + void onLightSwitch(@NonNull Chassis.LightSwitch light); + /** * 自动驾驶状态 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TurnLightState.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TurnLightState.java new file mode 100644 index 0000000000..bba6036d87 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TurnLightState.java @@ -0,0 +1,34 @@ +package com.zhidao.support.adas.high.common; + +public class TurnLightState { + private boolean m_state; + private double m_lastOnTime; + + public TurnLightState() { + init(); + } + + public void init() { + this.m_state = false; + this.m_lastOnTime = 0.0; + } + + public boolean update(boolean state) { + long t = System.currentTimeMillis(); + if (state) { + // on! + m_state = true; + m_lastOnTime = t; + } else { + // off? + if (m_state && (t - m_lastOnTime > 500)) { + m_state = false; + } + } + return m_state; + } + + public boolean getState() { + return m_state; + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java index 28fa9577d5..9a0aebe96f 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high.common.autopilot.ability; +import androidx.annotation.NonNull; + import com.zhjt.mogo.adas.data.bean.UnableLaunchData; import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; @@ -7,9 +9,6 @@ import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; -import chassis.Chassis; -import chassis.ChassisStatesOuterClass; - /** * 是否可以启动自动驾驶能力检测 工控机版本>=230&& <250 使用此类 * 目前监控了底盘的一些状态和查询节点状态应答的数据 @@ -17,58 +16,27 @@ import chassis.ChassisStatesOuterClass; *

* 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 */ -public class AutopilotAbility230 { - private static final String TAG = AutopilotAbility230.class.getSimpleName(); +public class AutopilotAbility230 extends BaseAutopilotAbilityChassis { private volatile Timer timer; - private ChassisStatesOuterClass.ChassisStates chassisStates; - private OnAutopilotAbilityListener listener; - protected AutopilotAbility230() { - } - - - protected void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { - this.chassisStates = chassisStates; + public AutopilotAbility230(@NonNull AutopilotAbilityManager manager) { + super(manager); } private void onCallback() { - boolean isAutopilotAbility = true;//是否能启动自动驾驶 + ArrayList unableAutopilotReasons = null;//不能启动自动驾驶原因 - //检测底盘相关 - if (chassisStates != null) { - if (chassisStates.hasBrakeSystemStates()) { - float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); - if (brake > 0) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_BRAKE, AutopilotAbilityManager.REASON_CHASSIS_BRAKE); - } - } - if (chassisStates.hasGearSystemStates()) { - Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); - if (!AutopilotAbilityManager.getInstance().isLaunchAutopilot(gear)) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_GEAR, AutopilotAbilityManager.REASON_CHASSIS_GEAR); - } - } - //TODO 关于手刹:不同车型的实现不同所以目前没法使用此字段 - -// //电子驻车制动系统 -// if (chassisStates.hasEpbSystemStates()) { -// ChassisStatesOuterClass.EPBSystemStates epb = chassisStates.getEpbSystemStates(); -// if (epb.hasEpbEnableState()){ -// epb.getEpbWorkState(); -// } -// } - - } + unableAutopilotReasons = onCallbackChassis(unableAutopilotReasons); if (listener != null) { + boolean isAutopilotAbility = unableAutopilotReasons == null || unableAutopilotReasons.isEmpty();//是否能启动自动驾驶 listener.onAutopilotAbility(isAutopilotAbility, new UnableLaunchData(this.getClass().getSimpleName(), null, null, null), unableAutopilotReasons); } } - protected synchronized void start(OnAutopilotAbilityListener listener) { - this.listener = listener; + @Override + public synchronized void start(OnAutopilotAbilityListener listener) { + super.start(listener); if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @@ -80,12 +48,13 @@ public class AutopilotAbility230 { } } + + @Override protected synchronized void stop() { if (timer != null) { timer.cancel(); timer = null; } - this.chassisStates = null; - this.listener = null; + super.stop(); } } 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 2d5c7cbdd2..96abff9b14 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 @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high.common.autopilot.ability; +import androidx.annotation.NonNull; + import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhjt.mogo.adas.data.bean.UnableLaunchData; @@ -10,9 +12,6 @@ import java.util.List; import java.util.Timer; import java.util.TimerTask; -import chassis.Chassis; -import chassis.ChassisStatesOuterClass; -import chassis.VehicleStateOuterClass; import system_master.SystemStatusInfo; /** @@ -22,24 +21,13 @@ import system_master.SystemStatusInfo; *

* 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 */ -public class AutopilotAbility250 { - private static final String TAG = AutopilotAbility250.class.getSimpleName(); +public class AutopilotAbility250 extends BaseAutopilotAbilityChassis { private volatile Timer timer; - private ChassisStatesOuterClass.ChassisStates chassisStates; - private VehicleStateOuterClass.VehicleState vehicleState; - private int mapVersion = -1;//MAP版本 private int masterVersion = -1;//Master版本 - private boolean isHQ = false;//是否是HQ - private boolean isDF = false;//是否是DF - private boolean isM1 = false;//是否是M1 - private OnAutopilotAbilityListener listener; - protected AutopilotAbility250(int mapVersion, boolean isHQ, boolean isDF, boolean isM1) { - this.mapVersion = mapVersion; - this.isHQ = isHQ; - this.isDF = isDF; - this.isM1 = isM1; - this.masterVersion = -1; + + public AutopilotAbility250(@NonNull AutopilotAbilityManager manager) { + super(manager); } @@ -47,16 +35,8 @@ public class AutopilotAbility250 { onCallback(statusInfo); } - protected void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { - this.chassisStates = chassisStates; - } - - protected void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) { - this.vehicleState = vehicleState; - } private void onCallback(SystemStatusInfo.StatusInfo statusInfo) { - boolean isAutopilotAbility = true;//是否能启动自动驾驶 ArrayList unableAutopilotReasons = null;//不能启动自动驾驶原因 //检测节点状态相关 if (statusInfo != null) { @@ -67,13 +47,11 @@ public class AutopilotAbility250 { CupidLogUtils.i(TAG, "MasterVersion=" + masterVersion); //SSM 3版本兼容 if (mapVersion >= 30400 && masterVersion > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) { - isAutopilotAbility = statusInfo.getAutoPilotReady(); - if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); + if (!statusInfo.getAutoPilotReady()) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); } } else if (mapVersion >= 21000 && masterVersion > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行 - isAutopilotAbility = statusInfo.getAutoPilotReady(); - if (!isAutopilotAbility) { + if (!statusInfo.getAutoPilotReady()) { SystemStatusInfo.NodeFaultList nodeFaultList = statusInfo.getAutoPilotUnreadyList(); if (nodeFaultList.getSum() > 0) { List list = nodeFaultList.getNodeList(); @@ -81,20 +59,20 @@ public class AutopilotAbility250 { String nodeName = info.getNodeName(); int state = info.getState(); if (state < AutopilotAbilityManager.NODE_INFO_STATE.length) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE[state]); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE[state]); } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); } } } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); } } } 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; + boolean isAutopilotAbility = false; String unableAutopilotReason = null; if (systemState == SystemStatusInfo.SystemState.SYS_STARTING) { unableAutopilotReason = "系统正在启动"; @@ -118,51 +96,24 @@ public class AutopilotAbility250 { unableAutopilotReason = "未知系统状态"; } if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); } } } } else { - isAutopilotAbility = false;//是否能启动自动驾驶 - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM查询超时无响应"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM查询超时无响应"); } //检测底盘相关 - if (chassisStates != null) { - if (chassisStates.hasBrakeSystemStates()) { - float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); - if (brake > 0) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_BRAKE, AutopilotAbilityManager.REASON_CHASSIS_BRAKE); - } - } - if (chassisStates.hasGearSystemStates()) { - Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); - if (!AutopilotAbilityManager.getInstance().isLaunchAutopilot(gear)) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_GEAR, AutopilotAbilityManager.REASON_CHASSIS_GEAR); - } - } - } - if ((!isHQ && !isDF && !isM1) || mapVersion < 30600) { - if (vehicleState != null) { - //TODO 关于手刹:目前只有老底盘中存在这个字段,df360开始,其他车型未知 - //电子驻车制动系统 - if (vehicleState.hasParkingBrake()) { - boolean isBrake = vehicleState.getParkingBrake(); - if (isBrake) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.PARKING_BRAKE, AutopilotAbilityManager.REASON_CHASSIS_PARKING_BRAKE); - } - } - } - } + unableAutopilotReasons = onCallbackChassis(unableAutopilotReasons); if (listener != null) { + boolean isAutopilotAbility = unableAutopilotReasons == null || unableAutopilotReasons.isEmpty();//是否能启动自动驾驶 listener.onAutopilotAbility(isAutopilotAbility, new UnableLaunchData(this.getClass().getSimpleName(), statusInfo, null, null), unableAutopilotReasons); } } - protected synchronized void start(OnAutopilotAbilityListener listener) { - this.listener = listener; + @Override + public synchronized void start(OnAutopilotAbilityListener listener) { + super.start(listener); if (timer == null) { timer = new Timer(); timer.schedule(new TimerTask() { @@ -174,17 +125,17 @@ public class AutopilotAbility250 { } } + + @Override protected synchronized void stop() { if (timer != null) { timer.cancel(); timer = null; } - this.chassisStates = null; - this.masterVersion = -1; - this.listener = null; + masterVersion = -1; + super.stop(); } - protected void onCallTimeout() { onCallback(null); } 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 index f21bdfbdc6..36ec9ee850 100644 --- 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 @@ -2,6 +2,8 @@ package com.zhidao.support.adas.high.common.autopilot.ability; import android.text.TextUtils; +import androidx.annotation.NonNull; + import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhjt.mogo.adas.data.bean.UnableLaunchData; @@ -25,6 +27,8 @@ import system_master.SystemStatusInfo; */ public class AutopilotAbility330 { private static final String TAG = AutopilotAbility330.class.getSimpleName(); + @NonNull + private final AutopilotAbilityManager manager; private volatile Timer timer; private volatile FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond;//自动驾驶状态为OFF的原因 @@ -32,7 +36,8 @@ public class AutopilotAbility330 { private int masterVersion = -1;//Master版本 private OnAutopilotAbilityListener listener; - protected AutopilotAbility330(int mapVersion) { + protected AutopilotAbility330(@NonNull AutopilotAbilityManager manager, int mapVersion) { + this.manager = manager; this.mapVersion = mapVersion; this.masterVersion = -1; } @@ -60,7 +65,7 @@ public class AutopilotAbility330 { if (mapVersion >= 30400 && masterVersion > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) { isAutopilotAbility = statusInfo.getAutoPilotReady(); if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); } } else if (mapVersion >= 21000 && masterVersion > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行 isAutopilotAbility = statusInfo.getAutoPilotReady(); @@ -72,13 +77,13 @@ public class AutopilotAbility330 { String nodeName = info.getNodeName(); int state = info.getState(); if (state < AutopilotAbilityManager.NODE_INFO_STATE.length) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE[state]); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE[state]); } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); } } } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); } } } else { @@ -109,13 +114,13 @@ public class AutopilotAbility330 { unableAutopilotReason = "未知系统状态"; } if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); } } } } else { isAutopilotAbility = false;//是否能启动自动驾驶 - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM查询超时无响应"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM查询超时无响应"); } if (fsmStatusReasonRespond != null) { int count = fsmStatusReasonRespond.getFsmStatusReasonRespondCount(); @@ -124,11 +129,11 @@ public class AutopilotAbility330 { for (int i = 0; i < count; i++) { String respond = fsmStatusReasonRespond.getFsmStatusReasonRespond(i); if (!TextUtils.isEmpty(respond)) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM, UnableLaunchReason.UnableType.FSM_OFFER, respond); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM, UnableLaunchReason.UnableType.FSM_OFFER, respond); } } if (unableAutopilotReasons == null || unableAutopilotReasons.isEmpty()) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM_ERROR, "FSM数据异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM_ERROR, "FSM数据异常"); } } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility350And360.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility350And360.java index 8abfb52fbb..eb56d11779 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility350And360.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility350And360.java @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high.common.autopilot.ability; +import androidx.annotation.NonNull; + import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhjt.mogo.adas.data.bean.UnableLaunchData; @@ -7,9 +9,6 @@ import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; import java.util.ArrayList; -import chassis.Chassis; -import chassis.ChassisStatesOuterClass; -import chassis.VehicleStateOuterClass; import system_master.SsmInfo; /** @@ -18,42 +17,21 @@ import system_master.SsmInfo; * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知 *

*/ -public class AutopilotAbility350And360 { - private static final String TAG = AutopilotAbility250.class.getSimpleName(); - private ChassisStatesOuterClass.ChassisStates chassisStates; - private VehicleStateOuterClass.VehicleState vehicleState; - private int mapVersion = -1;//MAP版本 +public class AutopilotAbility350And360 extends BaseAutopilotAbilityChassis { + private int masterVersion = -1;//Master版本 - private boolean isHQ = false;//是否是HQ - private boolean isDF = false;//是否是DF - private boolean isM1 = false;//是否是M1 - private OnAutopilotAbilityListener listener; - - protected AutopilotAbility350And360(int mapVersion, boolean isHQ, boolean isDF, boolean isM1) { - this.mapVersion = mapVersion; - this.isHQ = isHQ; - this.isDF = isDF; - this.isM1 = isM1; - this.masterVersion = -1; + public AutopilotAbility350And360(@NonNull AutopilotAbilityManager manager) { + super(manager); } protected void setStatusInfo(SsmInfo.SsmStatusInf statusInfo) { - onCallback(statusInfo); } - protected void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { - this.chassisStates = chassisStates; - } - - protected void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) { - this.vehicleState = vehicleState; - } private void onCallback(SsmInfo.SsmStatusInf statusInfo) { - boolean isAutopilotAbility = true;//是否能启动自动驾驶 ArrayList unableAutopilotReasons = null;//不能启动自动驾驶原因 //检测节点状态相关 if (statusInfo != null) { @@ -64,13 +42,11 @@ public class AutopilotAbility350And360 { CupidLogUtils.i(TAG, "MasterVersion=" + masterVersion); //SSM 3版本兼容 if (masterVersion > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) { - isAutopilotAbility = statusInfo.getAutoPilotReady(); - if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); + if (!statusInfo.getAutoPilotReady()) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); } } else if (masterVersion > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行 - isAutopilotAbility = statusInfo.getAutoPilotReady(); - if (!isAutopilotAbility) { + if (!statusInfo.getAutoPilotReady()) { int count = statusInfo.getAutoPilotUnreadyListCount(); if (count > 0) { for (int i = 0; i < count; i++) { @@ -78,19 +54,18 @@ public class AutopilotAbility350And360 { String nodeName = info.getNodeName(); int state = info.getState().getNumber(); if (state < AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY.length) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY[state]); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY[state]); } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); } } } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); } } } else { SsmInfo.ModeState modeState = statusInfo.getModeState(); if (modeState != SsmInfo.ModeState.MODE_RUN_UNREADY && modeState != SsmInfo.ModeState.MODE_RUN_READY) { - isAutopilotAbility = false; String unableAutopilotReason = null; if (modeState == SsmInfo.ModeState.MODE_STOP_UNREADY) { unableAutopilotReason = "系统处于停止模式(未就绪)"; @@ -103,56 +78,29 @@ public class AutopilotAbility350And360 { } else { unableAutopilotReason = "未知系统模式"; } - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); } } } else { - isAutopilotAbility = false;//是否能启动自动驾驶 - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM超时无响应"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM超时无响应"); } //检测底盘相关 - if (chassisStates != null) { - if (chassisStates.hasBrakeSystemStates()) { - float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); - if (brake > 0) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_BRAKE, AutopilotAbilityManager.REASON_CHASSIS_BRAKE); - } - } - if (chassisStates.hasGearSystemStates()) { - Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); - if (!AutopilotAbilityManager.getInstance().isLaunchAutopilot(gear)) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_GEAR, AutopilotAbilityManager.REASON_CHASSIS_GEAR); - } - } - } - if ((!isHQ && !isDF && !isM1) || mapVersion < 30600) { - if (vehicleState != null) { - //TODO 关于手刹:目前只有老底盘中存在这个字段,df360开始,其他车型未知 - //电子驻车制动系统 - if (vehicleState.hasParkingBrake()) { - boolean isBrake = vehicleState.getParkingBrake(); - if (isBrake) { - isAutopilotAbility = false; - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.PARKING_BRAKE, AutopilotAbilityManager.REASON_CHASSIS_PARKING_BRAKE); - } - } - } - } + unableAutopilotReasons = onCallbackChassis(unableAutopilotReasons); if (listener != null) { + boolean isAutopilotAbility = unableAutopilotReasons == null || unableAutopilotReasons.isEmpty();//是否能启动自动驾驶 listener.onAutopilotAbility(isAutopilotAbility, new UnableLaunchData(this.getClass().getSimpleName(), null, statusInfo, null), unableAutopilotReasons); } } - protected void start(OnAutopilotAbilityListener listener) { - this.listener = listener; + @Override + public synchronized void start(OnAutopilotAbilityListener listener) { + super.start(listener); } - protected void stop() { - this.chassisStates = null; - this.masterVersion = -1; - this.listener = null; + @Override + protected synchronized void stop() { + masterVersion = -1; + super.stop(); } protected void onCallTimeout() { diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility360.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility360.java index 07b19eea16..b5f17a69d8 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility360.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility360.java @@ -2,6 +2,8 @@ package com.zhidao.support.adas.high.common.autopilot.ability; import android.text.TextUtils; +import androidx.annotation.NonNull; + import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhjt.mogo.adas.data.bean.UnableLaunchData; @@ -20,12 +22,15 @@ import system_master.SsmInfo; */ public class AutopilotAbility360 { private static final String TAG = AutopilotAbility360.class.getSimpleName(); + @NonNull + private final AutopilotAbilityManager manager; private volatile FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond;//自动驾驶状态为OFF的原因 private int masterVersion = -1;//Master版本 private OnAutopilotAbilityListener listener; - protected AutopilotAbility360() { + protected AutopilotAbility360(@NonNull AutopilotAbilityManager manager) { + this.manager = manager; this.masterVersion = -1; } @@ -52,7 +57,7 @@ public class AutopilotAbility360 { if (masterVersion > 2 && statusInfo.hasAutoPilotReady() && statusInfo.hasAutoPilotUnreadyReason()) { isAutopilotAbility = statusInfo.getAutoPilotReady(); if (!isAutopilotAbility) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, statusInfo.getAutoPilotUnreadyReason()); } } else if (masterVersion > 1 && statusInfo.hasAutoPilotReady()) {//如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行 isAutopilotAbility = statusInfo.getAutoPilotReady(); @@ -64,13 +69,13 @@ public class AutopilotAbility360 { String nodeName = info.getNodeName(); int state = info.getState().getNumber(); if (state < AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY.length) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY[state]); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, nodeName + AutopilotAbilityManager.NODE_INFO_STATE_FIXED_FREQUENCY[state]); } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, nodeName + "未知异常"); } } } else { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_ERROR, "未知异常节点"); } } } else { @@ -89,12 +94,12 @@ public class AutopilotAbility360 { } else { unableAutopilotReason = "未知系统模式"; } - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.SSM, UnableLaunchReason.UnableType.SSM_OFFER, unableAutopilotReason); } } } else { isAutopilotAbility = false;//是否能启动自动驾驶 - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM超时无响应"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.SSM_TIMEOUT, "SSM超时无响应"); } if (fsmStatusReasonRespond != null) { int count = fsmStatusReasonRespond.getFsmStatusReasonRespondCount(); @@ -103,11 +108,11 @@ public class AutopilotAbility360 { for (int i = 0; i < count; i++) { String respond = fsmStatusReasonRespond.getFsmStatusReasonRespond(i); if (!TextUtils.isEmpty(respond)) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM, UnableLaunchReason.UnableType.FSM_OFFER, respond); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM, UnableLaunchReason.UnableType.FSM_OFFER, respond); } } if (unableAutopilotReasons == null || unableAutopilotReasons.isEmpty()) { - unableAutopilotReasons = AutopilotAbilityManager.getInstance().addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM_ERROR, "FSM数据异常"); + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM_ERROR, "FSM数据异常"); } } } 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 ac45c9287a..64ce59ffc1 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 @@ -11,7 +11,6 @@ import com.zhjt.mogo.adas.data.bean.UnableLaunchData; import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; import java.util.ArrayList; -import java.util.HashSet; import java.util.Set; import java.util.Timer; import java.util.TimerTask; @@ -19,7 +18,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import chassis.Chassis; import chassis.ChassisStatesOuterClass; -import chassis.VehicleStateOuterClass; import function_state_management.FSMStatusReasonQueryOuterClass; import mogo.telematics.pad.MessagePad; import system_master.SsmInfo; @@ -38,17 +36,13 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { protected static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测周期 protected static final String[] NODE_INFO_STATE = {"未知状态", "依赖未就绪", "启动中", "运行", "停止", "无法启动状态", "人为启动状态", "人为关闭状态"}; protected static final String[] NODE_INFO_STATE_FIXED_FREQUENCY = {"未知状态", "依赖未就绪", "启动中", "运行", "停止", "无法启动状态", "非自动启动状态", "非自动关闭状态"}; - protected static final String REASON_CHASSIS_BRAKE = "请检查刹车踏板"; - protected static final String REASON_CHASSIS_GEAR = "当前档位无法启动"; - protected static final String REASON_CHASSIS_PARKING_BRAKE = "请检查手刹"; + private static volatile AutopilotAbilityManager INSTANCE; private OnAdasListener listener; private int mapVersion = -1;//工控机版本 private boolean isFutianSweeper = false;//是否是福田清扫车 private boolean isJinlvM1 = false;//是否是M1 private boolean isHQ = false;//是否是HQ - private boolean isDF = false;//是否是DF - private boolean isM1 = false;//是否是M1 private AutopilotAbility230 autopilotAbility230; private AutopilotAbility250 autopilotAbility250; private AutopilotAbility330 autopilotAbility330; @@ -61,9 +55,9 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private final AtomicBoolean isOldSsmTimeout = new AtomicBoolean(false);//SSM是否超时 老状态 private final AtomicBoolean isInitCarConfig = new AtomicBoolean(false);//车辆信息是否初始化 /** - * 不能启动自动驾驶的档位 + * 能启动自动驾驶的档位 */ - private Set unableLaunchAutopilotGear; + private Set launchAutopilotGear; private AutopilotAbilityManager() { @@ -80,27 +74,17 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { return INSTANCE; } - public void setUnableLaunchAutopilotGear(Set unableLaunchAutopilotGear) { - if (unableLaunchAutopilotGear != null) { - this.unableLaunchAutopilotGear = new HashSet<>(unableLaunchAutopilotGear); - taxiUnmanned(); + public void setLaunchAutopilotGear(Set launchAutopilotGear) { + this.launchAutopilotGear = launchAutopilotGear; + if (autopilotAbility230 != null) { + autopilotAbility230.setLaunchAutopilotGear(launchAutopilotGear); + } else if (autopilotAbility250 != null) { + autopilotAbility250.setLaunchAutopilotGear(launchAutopilotGear); + } else if (autopilotAbility350And360 != null) { + autopilotAbility350And360.setLaunchAutopilotGear(launchAutopilotGear); } } - /** - * 获取当前档位是否能启动自动驾驶 如果不传递默认可以启动 - * 不能启动自驾档位规则:app/README.md/不能启动自动驾驶的档位 - * - * @param currentGear 当前档位 - * @return 是否能启动自驾 - */ - public boolean isLaunchAutopilot(Chassis.GearPosition currentGear) { - if (unableLaunchAutopilotGear != null && !unableLaunchAutopilotGear.isEmpty()) { - return !unableLaunchAutopilotGear.contains(currentGear); - } - return true; - } - /** * 添加不能启动自驾的原因 * @@ -117,16 +101,6 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { return unableAutopilotReasons; } - /** - * Taxi无人化相关,从MAP360开始去掉P档限制和手刹限制 - */ - private void taxiUnmanned() { - if ((isHQ || isDF) && mapVersion >= 30600) { - if (unableLaunchAutopilotGear != null) { - unableLaunchAutopilotGear.remove(Chassis.GearPosition.GEAR_P); - } - } - } public void setCarConfig(@NonNull MessagePad.CarConfigResp carConfig) { if (!isInitCarConfig.get()) { @@ -137,10 +111,17 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { isFutianSweeper = carConfig.getIsFutianSweeper(); isJinlvM1 = carConfig.getIsJinlvM1(); isHQ = carConfig.getIsHQ(); - isDF = carConfig.getIsDF(); - isM1 = carConfig.getIsJinlvM1(); - taxiUnmanned(); initAutopilotAbility(); + if (autopilotAbility230 != null) { + autopilotAbility230.setCarConfig(carConfig); + autopilotAbility230.setLaunchAutopilotGear(launchAutopilotGear); + } else if (autopilotAbility250 != null) { + autopilotAbility250.setCarConfig(carConfig); + autopilotAbility250.setLaunchAutopilotGear(launchAutopilotGear); + } else if (autopilotAbility350And360 != null) { + autopilotAbility350And360.setCarConfig(carConfig); + autopilotAbility350And360.setLaunchAutopilotGear(launchAutopilotGear); + } } } } @@ -189,29 +170,13 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { * * @param chassisStates 底盘 */ - public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { + public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates, Chassis.LightSwitch light) { if (autopilotAbility230 != null) { - autopilotAbility230.setChassisStates(chassisStates); - } - if (autopilotAbility250 != null) { - autopilotAbility250.setChassisStates(chassisStates); - } - if (autopilotAbility350And360 != null) { - autopilotAbility350And360.setChassisStates(chassisStates); - } - } - - /** - * 老底盘中手刹状态更新(新底盘PB中没有所以单独传递) - * - * @param vehicleState 底盘 - */ - public void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) { - if (autopilotAbility250 != null) { - autopilotAbility250.setVehicleState(vehicleState); - } - if (autopilotAbility350And360 != null) { - autopilotAbility350And360.setVehicleState(vehicleState); + autopilotAbility230.setChassisStates(chassisStates, light); + } else if (autopilotAbility250 != null) { + autopilotAbility250.setChassisStates(chassisStates, light); + } else if (autopilotAbility350And360 != null) { + autopilotAbility350And360.setChassisStates(chassisStates, light); } } @@ -235,33 +200,33 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { if (mapVersion >= 30600 && isFutianSweeper) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:360清扫车专用"); if (autopilotAbility360 == null) { - autopilotAbility360 = new AutopilotAbility360(); + autopilotAbility360 = new AutopilotAbility360(this); autopilotAbility360.start(this); } } else if ((mapVersion >= 30500 && (isJinlvM1 || isHQ)) || mapVersion >= 30600) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:350和360共用"); if (autopilotAbility350And360 == null) { - autopilotAbility350And360 = new AutopilotAbility350And360(mapVersion, isHQ, isDF, isM1); + autopilotAbility350And360 = new AutopilotAbility350And360(this); autopilotAbility350And360.start(this); } } else if (mapVersion >= 30300 && isFutianSweeper) {//目前只有MAP330的清扫车用的新的FSM状态原因查询 CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:330清扫车专用"); if (autopilotAbility330 == null) { - autopilotAbility330 = new AutopilotAbility330(mapVersion); + autopilotAbility330 = new AutopilotAbility330(this, mapVersion); autopilotAbility330.start(this); } } else if (mapVersion >= 20500) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:250"); if (autopilotAbility250 == null) { - autopilotAbility250 = new AutopilotAbility250(mapVersion, isHQ, isDF, isM1); + autopilotAbility250 = new AutopilotAbility250(this); autopilotAbility250.start(this); } } else { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:230"); if (autopilotAbility230 == null) { - autopilotAbility230 = new AutopilotAbility230(); + autopilotAbility230 = new AutopilotAbility230(this); autopilotAbility230.start(this); } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/BaseAutopilotAbilityChassis.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/BaseAutopilotAbilityChassis.java new file mode 100644 index 0000000000..6eb31f8457 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/BaseAutopilotAbilityChassis.java @@ -0,0 +1,175 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import androidx.annotation.NonNull; + +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; + +import java.util.ArrayList; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import chassis.Chassis; +import chassis.ChassisStatesOuterClass; +import mogo.telematics.pad.MessagePad; + +/** + * 所有需要使用底盘检测数据的版本父类 + */ +public abstract class BaseAutopilotAbilityChassis { + protected final String TAG = this.getClass().getSimpleName(); + private static final String REASON_CHASSIS_BRAKE = "刹车踏板"; + private static final String REASON_CHASSIS_THROTTLE = "油门踏板"; + private static final String REASON_CHASSIS_GEAR = "档位"; + private static final String REASON_CHASSIS_HAZARD_LIGHTS = "危险报警灯"; + private static final String REASON_CHASSIS_STEERING = "方向盘"; + @NonNull + protected final AutopilotAbilityManager manager; + private ChassisStatesOuterClass.ChassisStates chassisStates; + protected OnAutopilotAbilityListener listener; + protected int mapVersion = -1;//工控机版本 + protected boolean isJinlv = false;//是否是金旅小巴 + protected boolean isJinlvM1 = false;//是否是M1 + protected boolean isJinlvM2 = false;//是否是M2 + protected boolean isHQ = false;//是否是HQ + protected boolean isDF = false;//是否是DF + + private final AtomicReference currentLight = new AtomicReference<>(Chassis.LightSwitch.LIGHT_NONE); + /** + * 能启动自动驾驶的档位 + */ + private Set launchAutopilotGear; + + private float oldThrottle = Float.MAX_VALUE;//方向盘转角 + + public BaseAutopilotAbilityChassis(@NonNull AutopilotAbilityManager manager) { + this.manager = manager; + } + + public void setCarConfig(@NonNull MessagePad.CarConfigResp carConfig) { + mapVersion = carConfig.getMapVersion(); + isJinlv = carConfig.getIsJinlv(); + isJinlvM1 = carConfig.getIsJinlvM1(); + isJinlvM2 = carConfig.getIsJinlvM2(); + isHQ = carConfig.getIsHQ(); + isDF = carConfig.getIsDF(); + taxiUnmanned(); + } + + public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates, Chassis.LightSwitch light) { + this.chassisStates = chassisStates; + currentLight.set(light); + } + + + public void setLaunchAutopilotGear(Set launchAutopilotGear) { + this.launchAutopilotGear = launchAutopilotGear; + taxiUnmanned(); + } + + /** + * Taxi无人化相关,从MAP360开始去掉P档限制和手刹限制 + */ + private void taxiUnmanned() { + if ((isHQ || isDF) && mapVersion < 30600) { + if (launchAutopilotGear != null) { + launchAutopilotGear.remove(Chassis.GearPosition.GEAR_P); + } + } + } + + + /** + * 获取当前档位是否能启动自动驾驶 如果不传递默认可以启动 + * 不能启动自驾档位规则:app/README.md/不能启动自动驾驶的档位 + * + * @param currentGear 当前档位 + * @return 是否能启动自驾 + */ + private boolean isLaunchAutopilotGear(Chassis.GearPosition currentGear) { + if (launchAutopilotGear != null && !launchAutopilotGear.isEmpty()) { + return launchAutopilotGear.contains(currentGear); + } + return true; + } + + /** + * 获取当前是否开启危险报警灯 + * 双闪处于打开状态(taxi可以进自驾,金旅bus不可以) + * + * @return 是否能启动自驾 + */ + public boolean isLaunchAutopilotLight() { + if (isJinlv || isJinlvM1 || isJinlvM2) { + return currentLight.get() != Chassis.LightSwitch.LIGHT_FLASH; + } + return true; + } + + + protected ArrayList onCallbackChassis(ArrayList unableAutopilotReasons) { + //检测底盘相关 + if (chassisStates != null) { + //制动踏板 + if (chassisStates.hasBrakeSystemStates()) { + float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); + if (brake > 0) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_BRAKE, REASON_CHASSIS_BRAKE); + } + } + //油门踏板 + if (chassisStates.hasDrivingSystemStates()) { + float throttle = chassisStates.getDrivingSystemStates().getThrottleResponsePosition(); + if (throttle > 0) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_THROTTLE, REASON_CHASSIS_THROTTLE); + } + } + //档位 + if (chassisStates.hasGearSystemStates()) { + Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); + if (!isLaunchAutopilotGear(gear)) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_GEAR, REASON_CHASSIS_GEAR); + } + } + //危险报警灯 + if (!isLaunchAutopilotLight()) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_HAZARD_LIGHTS, REASON_CHASSIS_HAZARD_LIGHTS); + } + //方向盘 + if (chassisStates.hasSteerSystemStates()) { + ChassisStatesOuterClass.SteerSystemStates steerSystemStates = chassisStates.getSteerSystemStates(); + if (steerSystemStates.hasSteeringWheelAngle()) { + float throttle = steerSystemStates.getSteeringWheelAngle(); + if (oldThrottle == Float.MAX_VALUE) { + oldThrottle = throttle; + } else { + CupidLogUtils.log(TAG, "方向盘当前角度=" + oldThrottle + " 方向盘1秒前角度=" + throttle); + boolean isTurning = Math.abs(throttle - oldThrottle) > 2.0F; + oldThrottle = throttle; + CupidLogUtils.log(TAG, "方向盘是否转动=" + isTurning); + if (isTurning) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.CHASSIS, UnableLaunchReason.UnableType.CHASSIS_STEERING, REASON_CHASSIS_STEERING); + } + } + } + } + } + return unableAutopilotReasons; + } + + public synchronized void start(OnAutopilotAbilityListener listener) { + this.listener = listener; + + } + + protected synchronized void stop() { + this.chassisStates = null; + this.listener = null; + mapVersion = -1; + isHQ = false; + isJinlv = false; + isJinlvM1 = false; + isJinlvM2 = false; + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ChassisStatesMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ChassisStatesMessage.java index d96347a46b..c6fac0d844 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ChassisStatesMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ChassisStatesMessage.java @@ -3,24 +3,56 @@ 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.ParallelDrivingManager; +import com.zhidao.support.adas.high.common.TurnLightState; import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.protocol.RawData; +import chassis.Chassis; import chassis.ChassisStatesOuterClass; /** * 重构后的底盘状态 */ public class ChassisStatesMessage extends MyAbstractMessageHandler { + private final TurnLightState lightLeft; + private final TurnLightState lightRight; + + public ChassisStatesMessage(TurnLightState lightLeft, TurnLightState lightRight) { + this.lightLeft = lightLeft; + this.lightRight = lightRight; + } @Override public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { ChassisStatesOuterClass.ChassisStates chassisStates = ChassisStatesOuterClass.ChassisStates.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); - AutopilotAbilityManager.getInstance().setChassisStates(chassisStates); + Chassis.LightSwitch light = updateLight(chassisStates, adasListener); + AutopilotAbilityManager.getInstance().setChassisStates(chassisStates, light); ParallelDrivingManager.getInstance().setChassisStates(chassisStates); if (adasListener != null) { adasListener.onChassisStates(raw.getHeader(), chassisStates); + adasListener.onLightSwitch(light); } } + private Chassis.LightSwitch updateLight(ChassisStatesOuterClass.ChassisStates chassisStates, OnAdasListener adasListener) { + Chassis.LightSwitch light = Chassis.LightSwitch.LIGHT_NONE; + if (chassisStates.hasBcmSystemStates()) { + ChassisStatesOuterClass.BCMSystemStates bcm = chassisStates.getBcmSystemStates(); + light = bcm.getTurnLightState(); + } + boolean isTurnLightLeft = lightLeft.update((light.getNumber() & Chassis.LightSwitch.LIGHT_LEFT.getNumber()) != 0); + boolean isTurnLightRight = lightRight.update((light.getNumber() & Chassis.LightSwitch.LIGHT_RIGHT.getNumber()) != 0); + if (isTurnLightLeft && isTurnLightRight) { + //双闪 + light = Chassis.LightSwitch.LIGHT_FLASH; + } else if (isTurnLightLeft) { + //左传 + light = Chassis.LightSwitch.LIGHT_LEFT; + } else if (isTurnLightRight) { + //右转 + light = Chassis.LightSwitch.LIGHT_RIGHT; + } + return light; + } + } 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 52500c03eb..cf77bff8e7 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 @@ -1,6 +1,7 @@ package com.zhidao.support.adas.high.msg; import com.zhidao.support.adas.high.common.AutopilotReview; +import com.zhidao.support.adas.high.common.TurnLightState; import com.zhjt.mogo.adas.common.MessageType; import mogo.telematics.pad.MessagePad; @@ -47,11 +48,18 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg fSMStatusReasonRespondMessage;//FSM状态原因查询 private final AutopilotReview autopilotReview; + private final TurnLightState lightLeft = new TurnLightState(); + private final TurnLightState lightRight = new TurnLightState(); public MyMessageFactory(AutopilotReview autopilotReview) { this.autopilotReview = autopilotReview; } + public void initTurnLightState() { + lightLeft.init(); + lightRight.init(); + } + @Override public IMsg createMessage(MessagePad.MessageType messageType) { if (messageType == MessageType.TYPE_RECEIVE_TRAJECTORY.typeCode) { @@ -75,13 +83,13 @@ public class MyMessageFactory implements IMyMessageFactory { } else if (messageType == MessageType.TYPE_RECEIVE_VEHICLE_STATE.typeCode) { //底盘信息, 透传底盘状态,pb参考底盘 if (vehicleStateMessage == null) { - vehicleStateMessage = new VehicleStateMessage(); + vehicleStateMessage = new VehicleStateMessage(lightLeft, lightRight); } return vehicleStateMessage; } else if (messageType == MessageType.TYPE_RECEIVE_CHASSIS_STATES.typeCode) { //重构后的底盘状态 if (chassisStatesMessage == null) { - chassisStatesMessage = new ChassisStatesMessage(); + chassisStatesMessage = new ChassisStatesMessage(lightLeft, lightRight); } return chassisStatesMessage; } else if (messageType == MessageType.TYPE_RECEIVE_AUTOPILOT_STATE.typeCode) { diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java index 198b6129de..56fffc8955 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java @@ -5,9 +5,10 @@ import android.os.SystemClock; 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.ParallelDrivingManager; -import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.common.ParallelDrivingManager; +import com.zhidao.support.adas.high.common.TurnLightState; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.protocol.RawData; import chassis.Chassis; @@ -19,6 +20,13 @@ import common.HeaderOuterClass; * 底盘信息, 透传底盘状态,pb参考底盘 */ public class VehicleStateMessage extends MyAbstractMessageHandler { + private final TurnLightState lightLeft; + private final TurnLightState lightRight; + + public VehicleStateMessage(TurnLightState lightLeft, TurnLightState lightRight) { + this.lightLeft = lightLeft; + this.lightRight = lightRight; + } @Override public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { @@ -27,18 +35,40 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { long nowTime = 0; if (CupidLogUtils.isEnableLog()) nowTime = SystemClock.elapsedRealtime(); - AutopilotAbilityManager.getInstance().setVehicleState(vehicleState); ParallelDrivingManager.getInstance().setVehicleState(vehicleState); - ChassisStatesOuterClass.ChassisStates chassisStates = compatibility(adasListener, raw, vehicleState); + Chassis.LightSwitch light = updateLight(vehicleState, adasListener); + ChassisStatesOuterClass.ChassisStates chassisStates = compatibility(vehicleState, light); if (adasListener != null) { //TODO 暂时关闭老底盘转发 后期 会删除 onVehicleState //adasListener.onChassisStates(raw.getHeader(), chassisStates); adasListener.onVehicleState(raw.getHeader(), vehicleState); + adasListener.onLightSwitch(light); } AdasChannel.calculateTimeConsumingBusiness("底盘信息", nowTime); // CupidLogUtils.e("底盘信息--->" + vehicleState.toString()); } + private Chassis.LightSwitch updateLight(VehicleStateOuterClass.VehicleState vehicleState, OnAdasListener adasListener) { + Chassis.LightSwitch light = Chassis.LightSwitch.LIGHT_NONE; + if (vehicleState.hasLight()) { + light = vehicleState.getLight(); + } + boolean isTurnLightLeft = lightLeft.update((light.getNumber() & Chassis.LightSwitch.LIGHT_LEFT.getNumber()) != 0); + boolean isTurnLightRight = lightRight.update((light.getNumber() & Chassis.LightSwitch.LIGHT_RIGHT.getNumber()) != 0); + if (isTurnLightLeft && isTurnLightRight) { + //双闪 + light = Chassis.LightSwitch.LIGHT_FLASH; + } else if (isTurnLightLeft) { + //左传 + light = Chassis.LightSwitch.LIGHT_LEFT; + } else if (isTurnLightRight) { + //右转 + light = Chassis.LightSwitch.LIGHT_RIGHT; + } + return light; + } + + /** * 将老地盘数据转换成新地盘数据 * 字段注释中 鹰眼已用 的 已和底盘相关开发 确认过,其他字段均为确认对应关系 @@ -49,7 +79,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { * fuel_value robo_taxi_state robo_bus_state * robo_bus_jinlv_m1_state */ - private ChassisStatesOuterClass.ChassisStates compatibility(OnAdasListener adasListener, RawData raw, VehicleStateOuterClass.VehicleState vehicleState) throws InvalidProtocolBufferException { + private ChassisStatesOuterClass.ChassisStates compatibility(VehicleStateOuterClass.VehicleState vehicleState, Chassis.LightSwitch light) throws InvalidProtocolBufferException { /**************老地盘转换成新地盘PB***************/ ChassisStatesOuterClass.ChassisStates.Builder builder = ChassisStatesOuterClass.ChassisStates.newBuilder(); //工控机所用Header @@ -114,7 +144,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { .setSweeperFutianTaskSystemStates(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.parseFrom(bytes)));//鹰眼已用 清扫车专用 } ChassisStatesOuterClass.ChassisStates chassisStates = builder.build(); - AutopilotAbilityManager.getInstance().setChassisStates(chassisStates); + AutopilotAbilityManager.getInstance().setChassisStates(chassisStates, light); ParallelDrivingManager.getInstance().setChassisStates(chassisStates); return chassisStates; } From 03b3fbe42e463841c8f760c194e95ef050c319c3 Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 11 Apr 2024 16:19:06 +0800 Subject: [PATCH 09/14] =?UTF-8?q?[6.4.0][code]=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lancet/ViewPressedStateLancet.java | 144 ++++++++++++------ 1 file changed, 97 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java index 950f0e4a47..f76b47d647 100644 --- a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java +++ b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java @@ -481,69 +481,119 @@ public class ViewPressedStateLancet { text.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); return true; } - ColorStateList textColor = text.getTextColors(); if (textColor != null) { - int current = text.getCurrentTextColor(); - int pressed = textColor.getColorForState(new int[]{ android.R.attr.state_pressed }, Integer.MIN_VALUE); - if (pressed != Integer.MIN_VALUE && pressed != current) { + int defaultColor = textColor.getDefaultColor(); + int pressedColor = Color.argb((int)(Color.alpha(defaultColor) * alpha), Color.red(defaultColor), Color.green(defaultColor), Color.blue(defaultColor)); + if (!textColor.isStateful()) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- isStateful() => false hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- isStateful() => false hit ---" + "["+text+"]"); + }*/ + int[][] states = new int[2][1]; + int[] colors = new int[2]; + states[0] = new int[] { android.R.attr.state_pressed, -android.R.attr.state_focused, -android.R.attr.state_active }; + colors[0] = pressedColor; + states[1] = StateSet.WILD_CARD; + colors[1] = defaultColor; + ColorStateList newColor = new ColorStateList(states, colors); + text.setTag(R.id.click_pressed_attr_replaced_color, textColor); + text.setTextColor(newColor); + return true; + } + int pressed = textColor.getColorForState(new int[] { android.R.attr.state_pressed }, Integer.MIN_VALUE); + if (pressed != Integer.MIN_VALUE && pressed != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- pressed hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- pressed hit ---" + "["+text+"]"); + }*/ return false; } - int enableColor = textColor.getColorForState(new int[] { android.R.attr.state_enabled }, Integer.MIN_VALUE); - int defaultColor = current; - if (enableColor == Integer.MIN_VALUE && enableColor != current) { - defaultColor = textColor.getDefaultColor(); - } - int pressedColor = Color.argb((int)(Color.alpha(defaultColor) * alpha), Color.red(defaultColor), Color.green(defaultColor), Color.blue(defaultColor)); - int disableColor = textColor.getColorForState(new int[] { -android.R.attr.state_enabled }, Integer.MIN_VALUE); - int size = 2; - if (disableColor != Integer.MIN_VALUE && disableColor != current) { - size += 1; - } - boolean hasChecked = false; + int disabledColor = textColor.getColorForState(new int[] { -android.R.attr.state_enabled }, Integer.MIN_VALUE); int checkedColor = textColor.getColorForState(new int[] { android.R.attr.state_checked }, Integer.MIN_VALUE); - if (checkedColor != Integer.MIN_VALUE && checkedColor != current) { - hasChecked = true; - size += 1; + int unCheckedColor = textColor.getColorForState(new int[] { -android.R.attr.state_checked }, Integer.MIN_VALUE); + int selectedColor = textColor.getColorForState(new int[] { android.R.attr.state_enabled }, Integer.MIN_VALUE); + int unSelectedColor = textColor.getColorForState(new int[] { -android.R.attr.state_selected }, Integer.MIN_VALUE); + int size = 2; + if (disabledColor != Integer.MIN_VALUE && disabledColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- disabled hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- disabled hit ---" + "["+text+"]"); + }*/ + size++; } - boolean hasUnChecked = false; - int unCheckedColor = textColor.getColorForState(new int[]{ -android.R.attr.state_checked }, Integer.MIN_VALUE); - if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != current) { - hasUnChecked = true; - size += 1; + if (checkedColor != Integer.MIN_VALUE && checkedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- checked hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- checked hit ---" + "["+text+"]"); + }*/ + size++; + } + if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- unchecked hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- unchecked hit ---" + "["+text+"]"); + }*/ + size++; + } + if (selectedColor != Integer.MIN_VALUE && selectedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- selected hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- selected hit ---" + "["+text+"]"); + }*/ + size++; + } + if (unSelectedColor != Integer.MIN_VALUE && unSelectedColor != defaultColor) { + /*if (text.getId() != View.NO_ID) { + Log.d("ViewPressedStateLancet", "---- unselected hit ---" + "["+text+"->"+text.getResources().getResourceName(text.getId())+"]"); + } else { + Log.d("ViewPressedStateLancet", "---- unselected hit ---" + "["+text+"]"); + }*/ + size++; } int[][] states = new int[size][1]; int[] colors = new int[size]; - states[0] = new int[] { android.R.attr.state_pressed, -android.R.attr.state_focused, -android.R.attr.state_active }; + states[0] = new int[] { android.R.attr.state_pressed }; colors[0] = pressedColor; - if (size > 2) { - states[1] = new int[] { -android.R.attr.state_enabled }; - colors[1] = disableColor; - states[2] = new int[] { android.R.attr.state_enabled }; - colors[2] = defaultColor; - if (hasChecked) { - states[3] = new int[] { android.R.attr.state_checked }; - colors[3] = checkedColor; - } - if (hasUnChecked) { - if (size > 4) { - states[4] = new int[] { -android.R.attr.state_checked }; - colors[4] = unCheckedColor; - } else { - states[3] = new int[] { -android.R.attr.state_checked }; - colors[3] = unCheckedColor; - } - } - } else { - states[1] = StateSet.WILD_CARD; - colors[1] = defaultColor; + int index = 1; + if (disabledColor != Integer.MIN_VALUE && disabledColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_enabled }; + colors[index] = disabledColor; + index++; } + if (checkedColor != Integer.MIN_VALUE && checkedColor != defaultColor) { + states[index] = new int[] { android.R.attr.state_checked }; + colors[index] = checkedColor; + index++; + } + if (unCheckedColor != Integer.MIN_VALUE && unCheckedColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_checked }; + colors[index] = unCheckedColor; + index++; + } + if (selectedColor != Integer.MIN_VALUE && selectedColor != defaultColor) { + states[index] = new int[] { android.R.attr.state_selected }; + colors[index] = selectedColor; + index++; + } + if (unSelectedColor != Integer.MIN_VALUE && unSelectedColor != defaultColor) { + states[index] = new int[] { -android.R.attr.state_selected }; + colors[index] = unSelectedColor; + index++; + } + states[index] = StateSet.WILD_CARD; + colors[index] = defaultColor; ColorStateList newColor = new ColorStateList(states, colors); text.setTag(R.id.click_pressed_attr_replaced_color, textColor); text.setTextColor(newColor); return true; } - return false; } if (view != null) { From 119f28d6ce249c3a6407311454f270d4042553e9 Mon Sep 17 00:00:00 2001 From: renwj Date: Thu, 11 Apr 2024 18:26:51 +0800 Subject: [PATCH 10/14] =?UTF-8?q?[6.4.0][=E5=85=A8=E9=87=8F=E6=97=A5?= =?UTF-8?q?=E5=BF=97]=20debug=E7=89=88=E6=9C=AC=E6=94=BE=E5=BC=80crash?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E6=94=B6=E9=9B=86=EF=BC=9B=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E6=97=A5=E5=BF=97=E4=B8=8A=E4=BC=A0=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E9=99=84=E5=B8=A6=E5=B0=86=E6=9C=AA=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E7=9A=84=E9=93=BE=E8=B7=AF=E6=97=A5=E5=BF=97=E4=B9=9F=E6=89=93?= =?UTF-8?q?=E5=8C=85=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.gradle | 2 +- .../logcat/MoGoLogRecordProviderImpl.kt | 58 ++++++++++++------- .../core/utilcode/download/DownloadUtils.kt | 9 +++ 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/config.gradle b/config.gradle index 7ee8c77407..2e42f48ff5 100644 --- a/config.gradle +++ b/config.gradle @@ -225,7 +225,7 @@ ext { btrace : "com.bytedance.btrace:rhea-core:2.0.0", mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.11", - log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.50", + log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.80", // 安全证书 passport_secret : "com.zhidaoauto:sdk-java:1.0.6-SNAPSHOT", diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt index ecab17f24d..80b845d927 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -4,6 +4,7 @@ import android.Manifest import android.content.* import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Build +import android.os.Environment import android.os.Process import android.os.SystemClock import android.util.Log @@ -14,10 +15,13 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.core.log.record.* import com.mogo.core.log.record.config.* import com.mogo.core.log.record.config.crash.CrashConfig +import com.mogo.core.log.record.config.extra.IExtraFileToUpload +import com.mogo.core.log.record.config.extra.ToUploadFile import com.mogo.core.log.record.config.state.IStateProvider import com.mogo.core.log.record.model.UploadError import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.function.api.devatools.logcat.* +import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.zhidao.loglib.bean.RemoteLogPushContent import com.zhjt.mogo_core_function_devatools.BuildConfig import com.zhjt.mogo_core_function_devatools.logcat.checker.AnrLogChecker @@ -25,6 +29,7 @@ import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig import com.zhjt.mogo_core_function_devatools.logcat.uploader.* import kotlinx.coroutines.* import java.io.* +import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit.MINUTES import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicLong @@ -45,13 +50,12 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, private val lastUploadTime by lazy { AtomicLong(0) } override fun init(context: Context) { - val zip = File(context.getExternalFilesDir(null), "logcat/zip") val builder = LogcatConfig.Builder().context(context) .recordPeriod(MINUTES.toMillis(5)) // 5分钟一个文件 .maxSizeInLogDir((512 * 1024 * 1024).toLong()) // 512M最大容量 .recordDir(File(context.getExternalFilesDir(null), "logcat")) .pid(Process.myPid()) - .generateZipDir(zip.absolutePath) + .generateZipDir(File(context.getExternalFilesDir(null), "logcat/zip").absolutePath) .stateProvider(object : IStateProvider { override fun provide(divider: String?): Map { return mutableMapOf().also { itx -> @@ -104,6 +108,18 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, itx["协议版本号"] = AppConfigInfo.protocolVersionNumber itx["${divider}-7"] = divider itx["角色"] = AppConfigInfo.role + val downloads = try { + DownloadUtils.getAllDownloadRecords() + } catch (t: Throwable) { + emptyList() + } + if (downloads.isNotEmpty()) { + itx["${divider}-7"] = divider + itx["下载汇总"] = "(${downloads.size})" + downloads.forEach { + itx[it.first] = "\n\r----------------------------------------------------------${it.second}\n\r" + } + } } } }) @@ -114,26 +130,26 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, .systemTags("ActivityManager") .checker(AnrLogChecker()) } - -// if (BuildConfig.DEBUG) { -// builder.crashConfig( -// CrashConfig.Builder() -// .enabled(true) -// .crashDir(File(context.getExternalFilesDir(null), "logcat/crash")) -// .nativeCrash(true) -// .anr(true) -// .javaCrash(true) -// .build() -// ) -// } - LogcatManager.init(builder) - scope.launch { - try { - zip.takeIf { it.exists() }?.deleteRecursively() - } catch (t: Throwable) { - t.printStackTrace() - } + if (BuildConfig.DEBUG) { + builder.crashConfig( + CrashConfig.Builder() + .enabled(true) + .crashDir(File(context.getExternalFilesDir(null), "crash")) + .expireDuration(TimeUnit.DAYS.toMillis(3)) + .javaCrash(true) + .nativeCrash(true) + .anr(true) + .build() + ) } + builder.extraFilesToUpload(object : IExtraFileToUpload { + override fun filesToUpload(): List { + return ArrayList().also { + it.add(ToUploadFile(File(Environment.getExternalStorageDirectory(), "MLog"))) + } + } + }) + LogcatManager.init(builder) } override fun target(): Class { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/download/DownloadUtils.kt b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/download/DownloadUtils.kt index c4891e5acd..8e11869b47 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/download/DownloadUtils.kt +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/download/DownloadUtils.kt @@ -84,4 +84,13 @@ object DownloadUtils { } .launchIn(scope) } + + fun getAllDownloadRecords(): List> { + if (Downloader.hasInit()) { + return runBlocking { + Downloader.getAllDownloadRecords() ?: emptyList() + } + } + return emptyList() + } } \ No newline at end of file From bcf36bb8ed582f47ec9313b91ae5e5560d509474 Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 12 Apr 2024 16:23:16 +0800 Subject: [PATCH 11/14] =?UTF-8?q?[6.4.0][=E5=85=A8=E9=87=8F=E6=97=A5?= =?UTF-8?q?=E5=BF=97]=20=E4=B8=8A=E4=BC=A0=E5=85=A5=E5=8F=A3=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=97=B6=E9=97=B4=E6=AE=B5=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../logcat/MoGoLogRecordProviderImpl.kt | 4 +- .../hmi/ui/setting/DebugSettingView.kt | 106 +++++++++++++++--- .../logcat/IMoGoLogRecordProvider.kt | 2 +- 3 files changed, 91 insertions(+), 21 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt index 80b845d927..479b3d2b97 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -211,8 +211,8 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, return LogcatManager.export() } - override fun upload(): Unit = runBlocking { - val state = LogcatManager.upload(0, System.currentTimeMillis()) + override fun upload(startTime: Long, endTime: Long): Unit = runBlocking { + val state = LogcatManager.upload(startTime, endTime) if (state is UploadError) { throw AssertionError(state.toString()) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index aa86877049..6bae51e4fa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1582,26 +1582,48 @@ internal class DebugSettingView @JvmOverloads constructor( //上传全量日志 exportAllLogs?.onClick { v -> - v.visibility = View.INVISIBLE - logLoadingView?.visibility = View.VISIBLE - v.scope.launch(Dispatchers.IO) { - var isUploadSuccess = false - try { - CallerDevaToolsManager.logcat()?.upload() - isUploadSuccess = true - } catch (t: Throwable) { - t.printStackTrace() - } - withContext(Dispatchers.Main) { - if (isUploadSuccess) { - ToastUtils.showShort("上传成功") - } else { - ToastUtils.showShort("上传失败") + ListPopupWindow(v.context).also { p -> + val items = LogcatUploadDuration.values() + p.setAdapter(LogcatUploadAdapter(v.context, items)) + p.anchorView = v + p.isModal = true + p.setBackgroundDrawable(ColorDrawable(Color.WHITE)) + p.setOnItemClickListener { _, _, position, _ -> + val item = items[position] + v.visibility = View.INVISIBLE + logLoadingView?.visibility = View.VISIBLE + p.dismiss() + v.scope.launch(Dispatchers.IO) { + val endTime = System.currentTimeMillis() + val startTime = when(item) { + LogcatUploadDuration.IN_15M -> endTime - TimeUnit.MINUTES.toMillis(15) + LogcatUploadDuration.IN_45M -> endTime - TimeUnit.MINUTES.toMillis(45) + LogcatUploadDuration.IN_1H -> endTime - TimeUnit.HOURS.toMillis(1) + LogcatUploadDuration.IN_2H -> endTime - TimeUnit.HOURS.toMillis(2) + LogcatUploadDuration.IN_3H -> endTime - TimeUnit.HOURS.toMillis(3) + LogcatUploadDuration.IN_6H -> endTime - TimeUnit.HOURS.toMillis(6) + LogcatUploadDuration.IN_1D -> endTime - TimeUnit.DAYS.toMillis(1) + LogcatUploadDuration.ALL -> 0 + } + var isUploadSuccess = false + try { + CallerDevaToolsManager.logcat()?.upload(startTime, endTime) + isUploadSuccess = true + } catch (t: Throwable) { + t.printStackTrace() + } + withContext(Dispatchers.Main) { + if (isUploadSuccess) { + ToastUtils.showShort("上传成功") + } else { + ToastUtils.showShort("上传失败") + } + logLoadingView?.visibility = View.INVISIBLE + exportAllLogs?.visibility = View.VISIBLE + } } - logLoadingView?.visibility = View.INVISIBLE - exportAllLogs?.visibility = View.VISIBLE } - } + }.show() } if (JunkConfig.isSupportJunkDetect) { @@ -1737,6 +1759,54 @@ internal class DebugSettingView @JvmOverloads constructor( } } + private enum class LogcatUploadDuration(val text: String) { + IN_15M("15分钟内"), + IN_45M("45分钟内"), + IN_1H("1小时内"), + IN_2H("2小时内"), + IN_3H("3小时内"), + IN_6H("6小时内"), + IN_1D("一天内"), + ALL("上传所有") + } + + private class LogcatUploadAdapter(private val ctx: Context, private val items: Array): BaseAdapter() { + override fun getCount(): Int { + return items.size + } + + override fun getItem(position: Int): Any { + return items[position] + } + + override fun getItemId(position: Int): Long { + return items[position].ordinal.toLong() + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + var result = convertView + val duration = items[position] + if (result == null) { + val temp = View.inflate(ctx, android.R.layout.simple_list_item_1, null) + temp.tag = Holder(temp.findViewById(android.R.id.text1)) + result = temp + } + val holder = result?.tag as? Holder + if (holder != null) { + holder.text?.setTextColor(Color.BLACK) + holder.text?.text = duration.text + } else { + val text = result?.findViewById(android.R.id.text1) + text?.setTextColor(Color.BLACK) + text?.text = duration.text + result?.tag = Holder(text) + } + return result!! + } + + private inner class Holder(val text: TextView? = null) + } + private enum class ApmVLogUploadDuration(val text: String) { IN_15M("15分钟内"), IN_45M("45分钟内"), diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/logcat/IMoGoLogRecordProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/logcat/IMoGoLogRecordProvider.kt index 8b1956a9fd..740526daa5 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/logcat/IMoGoLogRecordProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/logcat/IMoGoLogRecordProvider.kt @@ -13,7 +13,7 @@ interface IMoGoLogRecordProvider { fun export(): File? - fun upload() + fun upload(startTime: Long, endTime: Long) fun testJavaCrash(runOnNewThread: Boolean) From e12b17f9d3c0d277349638af7e6c090c3056f420 Mon Sep 17 00:00:00 2001 From: EmArrow Date: Mon, 8 Apr 2024 17:59:32 +0800 Subject: [PATCH 12/14] [6.4.0] wait --- .../identify/TrackerSourceFilterHelper.kt | 3 +- .../eagle/core/data/enums/TrafficTypeEnum.kt | 44 ++++++++++-------- .../src/main/res/raw/sanjiaozhui.nt3d | Bin 20542 -> 39960 bytes gradle/bytex/bytex_lancetx.gradle | 2 +- gradle/bytex/bytex_matrix.gradle | 2 +- gradle/bytex/bytex_thread_opt.gradle | 2 +- .../main/java/com/mogo/map/AMapViewWrapper.kt | 4 ++ 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt index 13c4c0f747..881e35fb41 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/identify/TrackerSourceFilterHelper.kt @@ -13,7 +13,7 @@ object TrackerSourceFilterHelper { @SuppressLint("NewApi") fun filterData(data: TrackedObject): Boolean { if (!FunctionBuildConfig.isDrawUnknownIdentifyData && (data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type - || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_501.type || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_502.type) + || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_DAO_LU_SHI_GONG.type || data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_DAO_LU_SHI_GU.type) ) { return true } @@ -51,6 +51,7 @@ object TrackerSourceFilterHelper { var color = "" if (!FunctionBuildConfig.isDrawUnknownIdentifyData && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI.type + && data.type == TrafficTypeEnum.TYPE_TRAFFIC_ID_CONE.type ) { return "" } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt index d58e416597..ddc371b711 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/enums/TrafficTypeEnum.kt @@ -17,21 +17,6 @@ enum class TrafficTypeEnum( var traffic3DIconId: Int, var traffic3DNightIconId: Int ) { - - TYPE_TRAFFIC_ID_501( - 501, - "未知数据", - R.raw.traffic_xiankuang, - R.raw.traffic_xiankuang, - R.raw.traffic_xiankuang - ), - TYPE_TRAFFIC_ID_502( - 502, - "未知数据", - R.raw.traffic_xiankuang, - R.raw.traffic_xiankuang, - R.raw.traffic_xiankuang - ), TYPE_TRAFFIC_ID_WEI_ZHI( 100, "未知数据", @@ -95,12 +80,12 @@ enum class TrafficTypeEnum( R.raw.special_vehicle, R.raw.special_vehicle ), - TYPE_TRAFFIC_ID_DAO_LU_SHI_GONG( + TYPE_TRAFFIC_ID_CONE( 12, - "道路施工", - R.raw.v2x_shigong_warning, - R.raw.v2x_shigong_warning, - R.raw.v2x_shigong_warning + "三角锥", + R.raw.sanjiaozhui, + R.raw.sanjiaozhui, + R.raw.sanjiaozhui ), TYPE_TRAFFIC_ID_LUCE_TA_CHE( 103, @@ -122,6 +107,20 @@ enum class TrafficTypeEnum( R.raw.lucedaba, R.raw.lucedaba, R.raw.lucedaba + ), + TYPE_TRAFFIC_ID_DAO_LU_SHI_GONG( + 501, + "道路施工", + R.raw.v2x_shigong_warning, + R.raw.v2x_shigong_warning, + R.raw.v2x_shigong_warning + ), + TYPE_TRAFFIC_ID_DAO_LU_SHI_GU( + 502, + "道路事故", + R.raw.v2x_shigu_sanjiaopai, + R.raw.v2x_shigu_sanjiaopai, + R.raw.v2x_shigu_sanjiaopai ); companion object { @@ -134,6 +133,7 @@ enum class TrafficTypeEnum( TYPE_TRAFFIC_ID_TA_CHE.type -> TYPE_TRAFFIC_ID_TA_CHE TYPE_TRAFFIC_ID_MOTO.type -> TYPE_TRAFFIC_ID_MOTO TYPE_TRAFFIC_ID_BUS.type -> TYPE_TRAFFIC_ID_BUS + TYPE_TRAFFIC_ID_CONE.type -> TYPE_TRAFFIC_ID_CONE TYPE_TRAFFIC_ID_TRUCK.type -> TYPE_TRAFFIC_ID_TRUCK TYPE_TRAFFIC_ID_CAMERA.type -> TYPE_TRAFFIC_ID_CAMERA TYPE_TRAFFIC_ID_SPECIAL_VEHICLE.type -> TYPE_TRAFFIC_ID_SPECIAL_VEHICLE @@ -153,6 +153,7 @@ enum class TrafficTypeEnum( TYPE_TRAFFIC_ID_TA_CHE.type -> R.raw.taxi_traffic_tachexiaoche TYPE_TRAFFIC_ID_MOTO.type -> R.raw.taxi_traffic_motuoche TYPE_TRAFFIC_ID_BUS.type -> R.raw.taxi_traffic_daba + TYPE_TRAFFIC_ID_CONE.type -> R.raw.sanjiaozhui TYPE_TRAFFIC_ID_TRUCK.type -> R.raw.taxi_traffic_daba TYPE_TRAFFIC_ID_CAMERA.type -> R.raw.shexiangtou TYPE_TRAFFIC_ID_SPECIAL_VEHICLE.type -> R.raw.special_vehicle @@ -170,6 +171,7 @@ enum class TrafficTypeEnum( TYPE_TRAFFIC_ID_TA_CHE.type -> R.raw.traffic_tachexiaoche_day TYPE_TRAFFIC_ID_MOTO.type -> R.raw.traffic_motuoche_day TYPE_TRAFFIC_ID_BUS.type -> R.raw.traffic_daba_day + TYPE_TRAFFIC_ID_CONE.type -> R.raw.sanjiaozhui TYPE_TRAFFIC_ID_TRUCK.type -> R.raw.traffic_daba_day TYPE_TRAFFIC_ID_CAMERA.type -> R.raw.shexiangtou TYPE_TRAFFIC_ID_SPECIAL_VEHICLE.type -> R.raw.special_vehicle @@ -190,6 +192,7 @@ enum class TrafficTypeEnum( TYPE_TRAFFIC_ID_TA_CHE.type -> R.raw.taxi_traffic_tachexiaoche TYPE_TRAFFIC_ID_MOTO.type -> R.raw.taxi_traffic_motuoche TYPE_TRAFFIC_ID_BUS.type -> R.raw.taxi_traffic_daba + TYPE_TRAFFIC_ID_CONE.type -> R.raw.sanjiaozhui TYPE_TRAFFIC_ID_TRUCK.type -> R.raw.taxi_traffic_daba TYPE_TRAFFIC_ID_CAMERA.type -> R.raw.shexiangtou TYPE_TRAFFIC_ID_SPECIAL_VEHICLE.type -> R.raw.special_vehicle @@ -207,6 +210,7 @@ enum class TrafficTypeEnum( TYPE_TRAFFIC_ID_TA_CHE.type -> R.raw.traffic_tachexiaoche TYPE_TRAFFIC_ID_MOTO.type -> R.raw.traffic_motuoche TYPE_TRAFFIC_ID_BUS.type -> R.raw.traffic_daba + TYPE_TRAFFIC_ID_CONE.type -> R.raw.sanjiaozhui TYPE_TRAFFIC_ID_TRUCK.type -> R.raw.traffic_daba TYPE_TRAFFIC_ID_CAMERA.type -> R.raw.shexiangtou TYPE_TRAFFIC_ID_SPECIAL_VEHICLE.type -> R.raw.special_vehicle diff --git a/core/mogo-core-res/src/main/res/raw/sanjiaozhui.nt3d b/core/mogo-core-res/src/main/res/raw/sanjiaozhui.nt3d index e0251bd11de65cd8265a30e7a94007f4cd43e0b7..112866217551b2d0edd0b7d5506bf8669f288605 100644 GIT binary patch delta 28581 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 F{|kU`M?3%k delta 9014 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 + if (o != n) { + UiThreadHandler.post { + updateView(n){ + viewWifiStateBg.setImageResource(it) } } } } - private var wifiManager: WifiManager? = null - private var wifiHandler: WifiHandler? = null + private var wifiName: String by Delegates.observable("") { _, o, n -> + if (o != n) { + UiThreadHandler.post { + if(n.contains("unknow")){ + viewStatusBarTag.text = "" + }else{ + viewStatusBarTag.text = n + } + } + } + } - @Volatile - private var level: Int = 0 + private val txtSize: Float init { + LayoutInflater.from(context).inflate(R.layout.view_wifi_state, this, true) + val a = context.obtainStyledAttributes(attrs, R.styleable.WifiStateView, defStyleAttr, 0) + txtSize = a.getDimension( + R.styleable.WifiStateView_wifi_size, + resources.getDimension(R.dimen.dp_35) + ) + a.recycle() + viewStatusBarTag.setTextSize(TypedValue.COMPLEX_UNIT_PX,AutoSizeUtils.dp2px(context,txtSize).toFloat()) wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager? wifiHandler = WifiHandler(this) @@ -67,6 +101,8 @@ class WifiStateView @JvmOverloads constructor( return } val wifiInfo = wifiManager!!.connectionInfo + wifiName = wifiInfo.ssid.replace("\"","") + Log.i("emArrow", "wifiName: $wifiName") level = WifiManager.calculateSignalLevel(wifiInfo.rssi, 5) wifiHandler?.sendEmptyMessage(level) } @@ -95,9 +131,25 @@ class WifiStateView @JvmOverloads constructor( override fun onSkinModeChange(skinMode: Int) { wifiHandler?.sendEmptyMessage(level) + UiThreadHandler.post { + when (skinMode) { + 0 -> setStatusBarDarkOrLight(false) + 1 -> setStatusBarDarkOrLight(true) + } + } } - fun updateView(wifiState: Int, resId: ((Int) -> Unit)) { + private fun setStatusBarDarkOrLight(light: Boolean) = if (light) { + viewStatusBarTag.setTextColor(resources.getColor(R.color.color_2C2E30)) + } else { + viewStatusBarTag.setTextColor(resources.getColor(R.color.color_FFFFFF)) + } + + fun updateLevel(wifiState: Int){ + level = wifiState + } + + private fun updateView(wifiState: Int, resId: ((Int) -> Unit)) { when (FunctionBuildConfig.skinMode) { 0 -> { when (wifiState) { @@ -109,6 +161,7 @@ class WifiStateView @JvmOverloads constructor( 4 -> resId.invoke(R.drawable.wifi_light_state_five) } } + 1 -> { when (wifiState) { -1 -> resId.invoke(R.drawable.wifi_dark_state_one) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml index c4847f676a..897357307c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_status_bar.xml @@ -18,20 +18,9 @@ android:textSize="@dimen/dp_45" android:textStyle="bold" /> - - diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml new file mode 100644 index 0000000000..f7fe62dd7c --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_wifi_state.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml index b3f04dc3f8..751928af40 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/attr.xml @@ -89,6 +89,10 @@ + + + +