From 2278c848e0330f1760eeeb4a5a2e83209b122259 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 24 May 2024 13:20:08 +0800 Subject: [PATCH 01/43] =?UTF-8?q?[adas]=20=E5=90=AF=E5=8A=A8=E8=87=AA?= =?UTF-8?q?=E9=A9=BE=E4=B8=8E=E4=B8=8B=E8=BD=BD=E8=BD=A8=E8=BF=B9=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9E=E7=AE=97=E8=B7=AF?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 26 ++++++++++------- .../IMoGoAutopilotControlProvider.kt | 11 +++++-- .../CallerAutoPilotControlManager.kt | 6 ++-- .../src/main/proto/message_pad.proto | 11 +++++++ .../zhidao/support/adas/high/AdasChannel.java | 26 ++++++++++++----- .../zhidao/support/adas/high/AdasManager.java | 29 +++++++++++-------- .../support/adas/high/IAdasNetCommApi.java | 17 ++++++----- 7 files changed, 83 insertions(+), 43 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 b932142efa..f1f21e1750 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 @@ -383,12 +383,12 @@ class MoGoAutopilotControlProvider : private fun startAutoPilotWithNoParameter(source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null) + .sendAutoPilotModeReq(1, source, null, false) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null) + .sendAutoPilotModeReq(1, source, null, false) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶 无参") @@ -399,12 +399,12 @@ class MoGoAutopilotControlProvider : private fun startAutoPilot(controlParameters: AutopilotControlParameters, source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo()) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), false) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo()) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), false) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶") @@ -440,17 +440,21 @@ class MoGoAutopilotControlProvider : ) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { - AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine()) + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) { + AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(),isAutoRouting,routeInfo) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { - AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(), downloadType) + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) { + AdasManager.getInstance().sendTrajectoryDownloadReq( + autoPilotLine.toAutoPilotLine(), + downloadType, + isAutoRouting, + routeInfo) } override fun cancelAutoPilot() { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { - AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null) + AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null, false) } else { CallerLogger.e("$M_D_C$TAG", "车机与工控机链接失败,无法断开自动驾驶") } @@ -920,11 +924,11 @@ class MoGoAutopilotControlProvider : */ override fun setControlAutopilotCarAuto(isEnable: Boolean) { if (isEnable) { - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null) + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null, false) } else { // 司机屏才可关闭自动驾驶 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) + AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null, false) } } } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 805b79c7e9..5d8d0f4ff6 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -13,6 +13,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm.TaskConfi import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop.StopTaskResp import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume.BigTaskActionResp +import mogo.telematics.pad.MessagePad import mogo.yycp.paralleldriving.protocol.ParallelDrivingRequest /** @@ -55,13 +56,17 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { /** * 发送 轨迹下载请求 */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) /** * 发送 轨迹下载请求 - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * + * @param autoPilotLine 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param isAutoRouting 20240523 是否进行自动算路 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) /** * 结束自动驾驶 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 2abbfb75b6..945ced2c4a 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -182,7 +182,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - providerApi?.sendTrajectoryDownloadReq(autoPilotLine) + //TODO 需要传参 isAutoRouting, routeInfo +// providerApi?.sendTrajectoryDownloadReq(autoPilotLine, isAutoRouting, routeInfo) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, 0) } } @@ -193,7 +194,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType) + //TODO 需要传参 isAutoRouting, routeInfo +// providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, isAutoRouting, routeInfo) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, downloadType) } } diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index 962820c486..bbb60baffe 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -272,6 +272,9 @@ message TrajectoryDownloadReq Line line = 1; //路线 uint32 source = 2; //指令来源: 0: default, 1:pad, 2:aicloud uint32 downloadType = 3; //下载类型: 0:正常下载 1:预下载 + + bool isAutoRouting = 4; //20240523 是否进行自动算路 + RouteInfo routeInfo = 5; //20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! } // message definition for MessageType: MsgTypeBasicInfoReq @@ -297,6 +300,8 @@ message Location double latitude = 2; double altitude = 3; double heading = 4; + + bool station = 5; //20240523, 判断此点是中间站点还是途径点 ------- true:站点, false:简单的途径点 } message RouteInfo @@ -312,6 +317,10 @@ message RouteInfo uint32 routeID = 9; string routeName = 10; Line line = 11; //路线信息 + + string newRoutingMd5 = 12; //20240523 默认空值"":原有轨迹线路;若存在有效MD5值,新算路信息 + repeated Location blackPoints = 13; //20240523 不让走的道路,异常线路点 + bool isRestart = 14; //20240523 用于表示判断是否是起点下单。默认false:起点下单, true: 中间站点下单 或者接管后重新启动 } message SetAutopilotModeReq @@ -319,6 +328,8 @@ message SetAutopilotModeReq uint32 mode = 1; //1: enter autopilot mode, 0: quit autopilot mode uint32 source = 2; //命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) RouteInfo routeInfo = 3; //自动驾驶路径信息 + + bool isAutoRouting = 4; //20240523 是否进行自动算路 } // message definition for MsgTypeSetDemoModeReq diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 6460ecf0bf..f3d0c82a56 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -1189,21 +1189,23 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * 设置自动驾驶模式 启动自动驾驶 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param mode 1: enter autopilot mode, 0: quit autopilot mode - * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) - * @param routeInfo 自动驾驶路径信息 + * @param mode 1: enter autopilot mode, 0: quit autopilot mode + * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) + * @param routeInfo 自动驾驶路径信息 + * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { + public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting) { MessagePad.SetAutopilotModeReq.Builder builder = MessagePad.SetAutopilotModeReq.newBuilder(); builder.setMode(mode); builder.setSource(source); if (routeInfo != null) builder.setRouteInfo(routeInfo); + builder.setIsAutoRouting(isAutoRouting); MessagePad.SetAutopilotModeReq req = builder.build(); if (autopilotReview != null) autopilotReview.onAutopilotCommandTrigger(req); return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray()); @@ -1655,8 +1657,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param isAutoRouting 20240523 是否进行自动算路 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 @@ -1669,13 +1673,19 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec paramIndexes = {0} ) @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType) { + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder(); builder.setSource(1);//指令来源: 0: default, 1:pad, 2:aicloud - builder.setLine(line); + if (line != null) { + builder.setLine(line); + } if (downloadType > -1) { builder.setDownloadType(downloadType); } + builder.setIsAutoRouting(isAutoRouting); + if (routeInfo != null) { + builder.setRouteInfo(routeInfo); + } MessagePad.TrajectoryDownloadReq req = builder.build(); return sendPBMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ, req.toByteArray()); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index f29f121e3c..7f9669cdf3 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 @@ -393,17 +393,18 @@ public class AdasManager implements IAdasNetCommApi { * 设置自动驾驶模式 启动自动驾驶 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param mode 1: enter autopilot mode, 0: quit autopilot mode - * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) - * @param routeInfo 自动驾驶路径信息 + * @param mode 1: enter autopilot mode, 0: quit autopilot mode + * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) + * @param routeInfo 自动驾驶路径信息 + * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { - return mChannel == null ? -1L : mChannel.sendAutoPilotModeReq(mode, source, routeInfo); + public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting) { + return mChannel == null ? -1L : mChannel.sendAutoPilotModeReq(mode, source, routeInfo, isAutoRouting); } /** @@ -758,30 +759,34 @@ public class AdasManager implements IAdasNetCommApi { * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param isAutoRouting 20240523 是否进行自动算路 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - public long sendTrajectoryDownloadReq(MessagePad.Line line) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1); + public long sendTrajectoryDownloadReq(MessagePad.Line line, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1, isAutoRouting, routeInfo); } /** * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param isAutoRouting 20240523 是否进行自动算路 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType); + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType, isAutoRouting, routeInfo); } /** 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 5ba39f8bf5..557e3f4447 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 @@ -173,15 +173,16 @@ public interface IAdasNetCommApi { * 设置自动驾驶模式 启动自动驾驶 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param mode 1: enter autopilot mode, 0: quit autopilot mode - * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) - * @param routeInfo 自动驾驶路径信息 + * @param mode 1: enter autopilot mode, 0: quit autopilot mode + * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) + * @param routeInfo 自动驾驶路径信息 + * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo); + long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting); /** @@ -475,14 +476,16 @@ public interface IAdasNetCommApi { * 发送 轨迹下载请求 * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * - * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @param downloadType 下载类型: 0:正常下载 1:预下载 + * @param isAutoRouting 20240523 是否进行自动算路 + * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType); + long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo); /** * 发送 状态查询请求 From 86e6e4483a060207534c4021067279db397b5ee6 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Fri, 24 May 2024 18:29:41 +0800 Subject: [PATCH 02/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E5=90=AF=E5=8A=A8Routing=E8=87=AA=E5=8A=A8=E9=A9=BE?= =?UTF-8?q?=E9=A9=B6=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/taxi/ui/routing/TaxiRoutingModel.kt | 1 + .../autopilot/MoGoAutopilotControlProvider.kt | 14 +++++++--- .../autopilot/AutopilotControlParameters.kt | 27 ++++++++++++------- .../IMoGoAutopilotControlProvider.kt | 4 +-- .../CallerAutoPilotControlManager.kt | 8 +++--- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt index 2392b26090..6db672f5ea 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -492,6 +492,7 @@ object TaxiRoutingModel { CallerLogger.e(TAG, "AutopilotControlParameters is empty.") return } + parameters.isAutoRouting = true OchAutoPilotManager.startAutoPilot(parameters); 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 f1f21e1750..95bfb3c1e0 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 @@ -380,6 +380,11 @@ class MoGoAutopilotControlProvider : startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.MO_FANG) } } + + /** + * 无参数启动自动驾驶,现在的调用方有:魔方 + * @param source 数据来源 + */ private fun startAutoPilotWithNoParameter(source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() @@ -396,15 +401,16 @@ class MoGoAutopilotControlProvider : } } } + private fun startAutoPilot(controlParameters: AutopilotControlParameters, source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), false) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.isAutoRouting) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), false) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.isAutoRouting) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶") @@ -440,11 +446,11 @@ class MoGoAutopilotControlProvider : ) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) { + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) { AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(),isAutoRouting,routeInfo) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) { + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) { AdasManager.getInstance().sendTrajectoryDownloadReq( autoPilotLine.toAutoPilotLine(), downloadType, diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt index 4daa8cb771..ac94b2a76c 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt @@ -139,6 +139,8 @@ class AutopilotControlParameters { @JvmField var autoPilotLine: AutoPilotLine? = null // 自动驾驶路线 + var isAutoRouting = false//是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 + class AutoPilotLine { var lineId = 0L var lineName = "" @@ -216,15 +218,20 @@ class AutopilotControlParameters { } override fun toString(): String { - return "AutopilotControlParameters{" + - "startName='" + startName + '\'' + - ", endName='" + endName + '\'' + - ", startLatLon=" + startLatLon + - ", wayLatLons=" + wayLatLons + - ", endLatLon=" + endLatLon + - ", speedLimit=" + speedLimit + - ", vehicleType=" + vehicleType + - ", isSpeakVoice=" + isSpeakVoice + - '}' + return "AutopilotControlParameters(" + + "startName='$startName', " + + "endName='$endName', " + + "startLatLon=$startLatLon, " + + "wayLatLons=$wayLatLons," + + "endLatLon=$endLatLon," + + "speedLimit=$speedLimit, " + + "vehicleType=$vehicleType, " + + "routeID=$routeID, " + + "routeName='$routeName', " + + "isSpeakVoice=$isSpeakVoice, " + + "autoPilotLine=$autoPilotLine, " + + "isAutoRouting=$isAutoRouting)" } + + } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 5d8d0f4ff6..5b6755b01e 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -56,7 +56,7 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { /** * 发送 轨迹下载请求 */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) /** * 发送 轨迹下载请求 @@ -66,7 +66,7 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) /** * 结束自动驾驶 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 945ced2c4a..96befaeb27 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -182,8 +182,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO 需要传参 isAutoRouting, routeInfo -// providerApi?.sendTrajectoryDownloadReq(autoPilotLine, isAutoRouting, routeInfo) + //TODO Routing 需要传参 isAutoRouting, routeInfo + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, false, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, 0) } } @@ -194,8 +194,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO 需要传参 isAutoRouting, routeInfo -// providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, isAutoRouting, routeInfo) + //TODO Routing 需要传参 isAutoRouting, routeInfo + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, false, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, downloadType) } } From a007bbf1303df6579a23159a597b0a4aee9cbbb1 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Fri, 24 May 2024 19:14:24 +0800 Subject: [PATCH 03/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E5=90=AF=E5=8A=A8Routing=E8=87=AA=E5=8A=A8=E9=A9=BE?= =?UTF-8?q?=E9=A9=B6=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 3 ++- .../och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt | 7 ++++++- .../java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt index aa5fd325a5..d0ece766dd 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -11,7 +11,8 @@ data class GrayLineBean( var lineFailCount: Int?, //线路累计反馈不可用次数 var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, - var endSite: RoutingSite? + var endSite: RoutingSite?, + var isAutoRouting: Boolean = true, //是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 ) data class RoutingSite( diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt index 501cc62945..807cdeafcd 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -32,7 +32,12 @@ class TaxiRoutingChooseLineAdapter( override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { val currentPosition = holder.bindingAdapterPosition val data = mData[currentPosition] - holder.lineNameTextView.text = data.lineName + // 区分Routing和循迹 + holder.lineNameTextView.text = if (data.isAutoRouting) { + "Routing-" + data.lineName + } else { + data.lineName + } holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}次" holder.historyVerifyNumTextView.text = "路线累计反馈${data.lineSuccessCount}可用,${data.lineFailCount}不可用" diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt index 6db672f5ea..90cbe7943b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -492,7 +492,8 @@ object TaxiRoutingModel { CallerLogger.e(TAG, "AutopilotControlParameters is empty.") return } - parameters.isAutoRouting = true + // 使用云端配置的Routing灰度路线 + parameters.isAutoRouting = grayLineBean.isAutoRouting OchAutoPilotManager.startAutoPilot(parameters); From 06c0366b4282380717a76b6aa32223af4b6b5764 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Mon, 27 May 2024 14:16:33 +0800 Subject: [PATCH 04/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2gradle=EF=BC=8Cmaven=E4=BB=A3=E7=90=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1https\://mirrors.tencent.com/gradle/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 55e1a2591e..27fa064374 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Sep 22 11:53:55 CST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://mirrors.tencent.com/gradle/gradle-6.1.1-all.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 1267d23bc1dbd0c6ff4a20a43907ad257ecce634 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Mon, 27 May 2024 18:02:00 +0800 Subject: [PATCH 05/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=81=B0=E5=BA=A6=E8=B7=AF=E7=BA=BF=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E6=B3=A8=E6=84=8F=20//TODO=20Routing=20?= =?UTF-8?q?=E5=90=8E=E9=9D=A2=E9=9C=80=E8=A6=81=E7=BB=9F=E4=B8=80=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=9C=9F=E5=AE=9E=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 2 +- .../java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt index d0ece766dd..4f8514afb5 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -12,7 +12,7 @@ data class GrayLineBean( var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, var endSite: RoutingSite?, - var isAutoRouting: Boolean = true, //是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 + var isAutoRouting: Boolean = true //是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 ) data class RoutingSite( diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt index 90cbe7943b..97d3992f19 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -211,6 +211,10 @@ object TaxiRoutingModel { DebugView.printInfoMsg("[查询灰度路线] 请求success,dataSize=${data?.data?.size}") val result = mutableListOf() data.data?.also { + //TODO Routing 临时修改,这里后面从接口数据直接获取,需要配合运营平台一起修改灰度路线数据 + it.forEach { + it.isAutoRouting = true + } result.addAll(it) } mTaxiRoutingCallbackMap.forEach { From c51e4aa6b9b1d59fcbfd1dc491462c41c9630409 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Thu, 30 May 2024 17:54:25 +0800 Subject: [PATCH 06/43] =?UTF-8?q?[adas]=20routing=E9=9C=80=E6=B1=82?= =?UTF-8?q?=EF=BC=8C=E5=85=BC=E5=AE=B9=E8=87=AA=E5=8A=A8=E7=AE=97=E8=B7=AF?= =?UTF-8?q?=E5=92=8C=E8=BD=A8=E8=BF=B9=E7=AE=97=E8=B7=AF=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5PB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo-adas-data/src/main/proto/message_pad.proto | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index bbb60baffe..8ef978bc44 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -273,8 +273,7 @@ message TrajectoryDownloadReq uint32 source = 2; //指令来源: 0: default, 1:pad, 2:aicloud uint32 downloadType = 3; //下载类型: 0:正常下载 1:预下载 - bool isAutoRouting = 4; //20240523 是否进行自动算路 - RouteInfo routeInfo = 5; //20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! + RouteInfo routeInfo = 4; //20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填!(Line信息重复) } // message definition for MessageType: MsgTypeBasicInfoReq @@ -316,11 +315,10 @@ message RouteInfo bool isSpeakVoice = 8; //abandoned uint32 routeID = 9; string routeName = 10; - Line line = 11; //路线信息 + Line line = 11; //路线信息,原有轨迹线路信息 - string newRoutingMd5 = 12; //20240523 默认空值"":原有轨迹线路;若存在有效MD5值,新算路信息 - repeated Location blackPoints = 13; //20240523 不让走的道路,异常线路点 - bool isRestart = 14; //20240523 用于表示判断是否是起点下单。默认false:起点下单, true: 中间站点下单 或者接管后重新启动 + repeated Location blackPoints = 12; //20240523 不让走的道路,异常线路点 + bool isStation = 13; //20240523 用于表示判断是否是站点下单。默认false:起点下单,接管下单; true: 中间站点下单 } message SetAutopilotModeReq @@ -329,7 +327,6 @@ message SetAutopilotModeReq uint32 source = 2; //命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) RouteInfo routeInfo = 3; //自动驾驶路径信息 - bool isAutoRouting = 4; //20240523 是否进行自动算路 } // message definition for MsgTypeSetDemoModeReq From 03c922249af75142dd422e61dad10a5eff2da58e Mon Sep 17 00:00:00 2001 From: donghongyu Date: Fri, 31 May 2024 14:17:23 +0800 Subject: [PATCH 07/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E5=88=A0?= =?UTF-8?q?=E9=99=A4isAutoRouting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 3 +-- .../routing/TaxiRoutingChooseLineAdapter.kt | 6 +----- .../och/taxi/ui/routing/TaxiRoutingModel.kt | 6 ------ .../autopilot/MoGoAutopilotControlProvider.kt | 21 +++++++++---------- .../autopilot/AutopilotControlParameters.kt | 4 +--- .../IMoGoAutopilotControlProvider.kt | 5 ++--- .../CallerAutoPilotControlManager.kt | 8 +++---- .../zhidao/support/adas/high/AdasChannel.java | 8 ++----- .../zhidao/support/adas/high/AdasManager.java | 15 ++++++------- .../support/adas/high/IAdasNetCommApi.java | 6 ++---- 10 files changed, 29 insertions(+), 53 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt index 4f8514afb5..aa5fd325a5 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -11,8 +11,7 @@ data class GrayLineBean( var lineFailCount: Int?, //线路累计反馈不可用次数 var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, - var endSite: RoutingSite?, - var isAutoRouting: Boolean = true //是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 + var endSite: RoutingSite? ) data class RoutingSite( diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt index 807cdeafcd..828a8e4416 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -33,11 +33,7 @@ class TaxiRoutingChooseLineAdapter( val currentPosition = holder.bindingAdapterPosition val data = mData[currentPosition] // 区分Routing和循迹 - holder.lineNameTextView.text = if (data.isAutoRouting) { - "Routing-" + data.lineName - } else { - data.lineName - } + holder.lineNameTextView.text = data.lineName holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}次" holder.historyVerifyNumTextView.text = "路线累计反馈${data.lineSuccessCount}可用,${data.lineFailCount}不可用" diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt index 97d3992f19..2392b26090 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -211,10 +211,6 @@ object TaxiRoutingModel { DebugView.printInfoMsg("[查询灰度路线] 请求success,dataSize=${data?.data?.size}") val result = mutableListOf() data.data?.also { - //TODO Routing 临时修改,这里后面从接口数据直接获取,需要配合运营平台一起修改灰度路线数据 - it.forEach { - it.isAutoRouting = true - } result.addAll(it) } mTaxiRoutingCallbackMap.forEach { @@ -496,8 +492,6 @@ object TaxiRoutingModel { CallerLogger.e(TAG, "AutopilotControlParameters is empty.") return } - // 使用云端配置的Routing灰度路线 - parameters.isAutoRouting = grayLineBean.isAutoRouting OchAutoPilotManager.startAutoPilot(parameters); 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 95bfb3c1e0..2f333858e5 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 @@ -388,12 +388,12 @@ class MoGoAutopilotControlProvider : private fun startAutoPilotWithNoParameter(source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null, false) + .sendAutoPilotModeReq(1, source, null) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null, false) + .sendAutoPilotModeReq(1, source, null) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶 无参") @@ -405,12 +405,12 @@ class MoGoAutopilotControlProvider : private fun startAutoPilot(controlParameters: AutopilotControlParameters, source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.isAutoRouting) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo()) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.isAutoRouting) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo()) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶") @@ -446,21 +446,20 @@ class MoGoAutopilotControlProvider : ) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) { - AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(),isAutoRouting,routeInfo) + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, routeInfo: MessagePad.RouteInfo?) { + AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(),routeInfo) } - override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) { + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, routeInfo: MessagePad.RouteInfo?) { AdasManager.getInstance().sendTrajectoryDownloadReq( autoPilotLine.toAutoPilotLine(), downloadType, - isAutoRouting, routeInfo) } override fun cancelAutoPilot() { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { - AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null, false) + AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null) } else { CallerLogger.e("$M_D_C$TAG", "车机与工控机链接失败,无法断开自动驾驶") } @@ -930,11 +929,11 @@ class MoGoAutopilotControlProvider : */ override fun setControlAutopilotCarAuto(isEnable: Boolean) { if (isEnable) { - AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null, false) + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, null) } else { // 司机屏才可关闭自动驾驶 if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null, false) + AdasManager.getInstance().sendAutoPilotModeReq(0, 0, null) } } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt index ac94b2a76c..58f9e37cf3 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt @@ -139,7 +139,6 @@ class AutopilotControlParameters { @JvmField var autoPilotLine: AutoPilotLine? = null // 自动驾驶路线 - var isAutoRouting = false//是否进行自动算路,true--使用车端自动算路,false--不使用自动算路,使用轨迹循迹 class AutoPilotLine { var lineId = 0L @@ -229,8 +228,7 @@ class AutopilotControlParameters { "routeID=$routeID, " + "routeName='$routeName', " + "isSpeakVoice=$isSpeakVoice, " + - "autoPilotLine=$autoPilotLine, " + - "isAutoRouting=$isAutoRouting)" + "autoPilotLine=$autoPilotLine)" } diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 5b6755b01e..121840c7d7 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -56,17 +56,16 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { /** * 发送 轨迹下载请求 */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, routeInfo: MessagePad.RouteInfo?) /** * 发送 轨迹下载请求 * * @param autoPilotLine 线路相关参数详情见PB message_pad.proto -> Line * @param downloadType 下载类型: 0:正常下载 1:预下载 - * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! */ - fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, isAutoRouting: Boolean, routeInfo: MessagePad.RouteInfo?) + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int, routeInfo: MessagePad.RouteInfo?) /** * 结束自动驾驶 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 96befaeb27..627f2e4fad 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -182,8 +182,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO Routing 需要传参 isAutoRouting, routeInfo - providerApi?.sendTrajectoryDownloadReq(autoPilotLine, false, null) + //TODO Routing 需要传参 routeInfo + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, 0) } } @@ -194,8 +194,8 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO Routing 需要传参 isAutoRouting, routeInfo - providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, false, null) + //TODO Routing 需要传参 routeInfo + providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, downloadType) } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index f3d0c82a56..b57759ce9a 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -1192,20 +1192,18 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting) { + public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { MessagePad.SetAutopilotModeReq.Builder builder = MessagePad.SetAutopilotModeReq.newBuilder(); builder.setMode(mode); builder.setSource(source); if (routeInfo != null) builder.setRouteInfo(routeInfo); - builder.setIsAutoRouting(isAutoRouting); MessagePad.SetAutopilotModeReq req = builder.build(); if (autopilotReview != null) autopilotReview.onAutopilotCommandTrigger(req); return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ, req.toByteArray()); @@ -1659,7 +1657,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * * @param line 线路相关参数详情见PB message_pad.proto -> Line * @param downloadType 下载类型: 0:正常下载 1:预下载 - * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 @@ -1673,7 +1670,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec paramIndexes = {0} ) @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo) { MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder(); builder.setSource(1);//指令来源: 0: default, 1:pad, 2:aicloud if (line != null) { @@ -1682,7 +1679,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec if (downloadType > -1) { builder.setDownloadType(downloadType); } - builder.setIsAutoRouting(isAutoRouting); if (routeInfo != null) { builder.setRouteInfo(routeInfo); } 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 7f9669cdf3..8ac84e549d 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 @@ -396,15 +396,14 @@ public class AdasManager implements IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting) { - return mChannel == null ? -1L : mChannel.sendAutoPilotModeReq(mode, source, routeInfo, isAutoRouting); + public long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendAutoPilotModeReq(mode, source, routeInfo); } /** @@ -760,15 +759,14 @@ public class AdasManager implements IAdasNetCommApi { * 此方法存在域控回执,监听{@link OnAdasListener#onReceiveReceivedAck(ReceivedAck)}回调.使用方法:将此方法的返回值与{@link ReceivedAck#getMsgId()}进行比较,如果相同判断{@link ReceivedAck#getStatus()}是否等于{@link ReceivedAck.Status#NORMAL},详情参见CheckSystemView中的onReceiveReceivedAck * * @param line 线路相关参数详情见PB message_pad.proto -> Line - * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - public long sendTrajectoryDownloadReq(MessagePad.Line line, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1, isAutoRouting, routeInfo); + public long sendTrajectoryDownloadReq(MessagePad.Line line, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, -1, routeInfo); } /** @@ -777,7 +775,6 @@ public class AdasManager implements IAdasNetCommApi { * * @param line 线路相关参数详情见PB message_pad.proto -> Line * @param downloadType 下载类型: 0:正常下载 1:预下载 - * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 @@ -785,8 +782,8 @@ public class AdasManager implements IAdasNetCommApi { * * -1L:添加到WS发送消息队列失败 */ @Override - public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo) { - return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType, isAutoRouting, routeInfo); + public long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo) { + return mChannel == null ? -1L : mChannel.sendTrajectoryDownloadReq(line, downloadType, routeInfo); } /** 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 557e3f4447..ed05195d5c 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 @@ -176,13 +176,12 @@ public interface IAdasNetCommApi { * @param mode 1: enter autopilot mode, 0: quit autopilot mode * @param source 命令来源: 0: pad模拟, 1: pad业务, 2:aicloud, 3:魔方(清扫车MAP Version==332以及MAP Version>=350,其他车型目前未上线) * @param routeInfo 自动驾驶路径信息 - * @param isAutoRouting 20240523 是否进行自动算路 * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo, boolean isAutoRouting); + long sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo); /** @@ -478,14 +477,13 @@ public interface IAdasNetCommApi { * * @param line 线路相关参数详情见PB message_pad.proto -> Line * @param downloadType 下载类型: 0:正常下载 1:预下载 - * @param isAutoRouting 20240523 是否进行自动算路 * @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填! * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 * * =0:表示乘客屏模式添加到WS发送消息队列 * * -1L:添加到WS发送消息队列失败 */ - long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, boolean isAutoRouting, MessagePad.RouteInfo routeInfo); + long sendTrajectoryDownloadReq(MessagePad.Line line, int downloadType, MessagePad.RouteInfo routeInfo); /** * 发送 状态查询请求 From 71139f9c9ab88644af014be7c14f1c6b04bb6816 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Mon, 3 Jun 2024 19:30:05 +0800 Subject: [PATCH 08/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/taxi/callback/ITaxiRoutingCallback.kt | 45 +++++++++++++++++++ .../taxi/network/TaxiRoutingServiceManager.kt | 3 ++ .../mogo/och/taxi/ui/base/TaxiPresenter.java | 3 ++ .../routing/TaxiRoutingChooseLineActivity.kt | 3 ++ .../routing/TaxiRoutingChooseLineAdapter.kt | 2 +- .../taxi/ui/routing/TaxiRoutingFragment.kt | 7 +++ .../routing/TaxiRoutingFragmentViewModel.kt | 1 + .../och/taxi/ui/routing/TaxiRoutingModel.kt | 32 ++++++++++++- 8 files changed, 93 insertions(+), 3 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt index 22fcb34e93..df310b978f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiRoutingCallback.kt @@ -4,14 +4,59 @@ import com.mogo.och.taxi.bean.GrayLineBean import com.mogo.och.taxi.bean.StartGrayAndQueryContrailRsp interface ITaxiRoutingCallback { + /** + * 查询灰度路线列表--成功✅ + */ fun onQueryRoutingGrayLineListSuccess(data: MutableList) + + /** + * 查询灰度路线列表--失败❌ + * @param errorStr 错误信息 + */ fun onQueryRoutingGrayLineListFailed(errorStr: String) + + /** + * 灰度任务&查询轨迹详情--成功✅ + */ fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) + + /** + * 灰度任务&查询轨迹详情--失败❌ + * @param errorStr 错误信息 + */ fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) + + /** + * 灰度任务过程中,上报问题打点--成功✅ + */ fun onSubmitGrayLineIssueLocationSuccess() + + /** + * 灰度任务过程中,上报问题打点--失败❌ + * @param errorStr 错误信息 + */ fun onSubmitGrayLineIssueLocationFailed(errorStr: String) + + /** + * 结束灰度任务--成功✅ + */ fun onSubmitEndTaskSuccess() + + /** + * 结束灰度任务--成功❌ + * @param errorStr 错误信息 + */ fun onSubmitEndTaskFailed(errorStr: String) + + /** + * MAP到站通知 + * @param grayId 灰度路线ID + */ fun onAutoPilotArriveAtEndStation(grayId: Long?) + + /** + * 自车定位围栏 + * @param grayId 灰度路线ID + */ fun onGDMapArriveAtEndStation(grayId: Long?) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt index 0d1377a6cf..fe8caf97af 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/network/TaxiRoutingServiceManager.kt @@ -105,6 +105,9 @@ object TaxiRoutingServiceManager { .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) } + /** + * 标记灰度任务被启动验证 + */ fun startGrayTaskAndQueryRoutingContrail( context: Context, sn: String, diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java index 3f0c3169f4..8cf65e5a50 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/base/TaxiPresenter.java @@ -73,9 +73,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS * 开启自动驾驶 自驾模式 */ public void startAutoPilot() { + // 这里区分是订单还是灰度测试 if (MogoStatusManager.getInstance().isTaxiUnmanedDriverLineRoutingVerifyMode()) { + // 灰度测试 TaxiRoutingModel.INSTANCE.startAutoPilotByClick(); } else { + // 订单 TaxiTaskModel.INSTANCE.startAutopilotByClick(); } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt index e9c72c0f2a..4514f3b265 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt @@ -90,6 +90,8 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { btnClose.setOnClickListener { finish() } + + // 选择路线后,「确认」按钮 btnChooseLineSubmit.setOnClickListener { if (mCurrentChosenPosition == -1) { ToastUtils.showLong("请先选择任务") @@ -99,6 +101,7 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { mLoadingDialog.showLoading() val chosenItem = mRoutingLineList[mCurrentChosenPosition] mViewModel.sendUiIntent( + // 调用查询接口获取路线详情 TaxiRoutingUiIntent.StartTaskAndQueryContrail(chosenItem) ) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt index 828a8e4416..8c0813955b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineAdapter.kt @@ -32,7 +32,7 @@ class TaxiRoutingChooseLineAdapter( override fun onBindViewHolder(holder: SwitchLineViewHolder, position: Int) { val currentPosition = holder.bindingAdapterPosition val data = mData[currentPosition] - // 区分Routing和循迹 + holder.lineNameTextView.text = data.lineName holder.todayVerifyNumTextView.text = "本车今日已验证:${data.carVerificationCount}次" holder.historyVerifyNumTextView.text = diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt index da83878c81..9f95ea75b7 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragment.kt @@ -122,6 +122,9 @@ class TaxiRoutingFragment : BaseFragment(), ICommonNaviChangedCallback { } } + /** + * 展示选择任务视图 + */ private fun showChooseTaskView() { noDataContainer.visibility = View.VISIBLE mCurrentTaskLayout.visibility = View.GONE @@ -134,6 +137,9 @@ class TaxiRoutingFragment : BaseFragment(), ICommonNaviChangedCallback { removeAllMapMarker() } + /** + * 展示当前路线任务信息 + */ private fun showCurrentLineTaskContentView(data: RoutingUIState.RoutingTask) { noDataContainer.visibility = View.GONE mCurrentTaskLayout.visibility = View.VISIBLE @@ -143,6 +149,7 @@ class TaxiRoutingFragment : BaseFragment(), ICommonNaviChangedCallback { btnChooseTask.visibility = View.GONE btnStartTask.visibility = View.VISIBLE + // 开始任务,按钮 btnStartTask.setOnClickListener { mViewModel.sendUiIntent(TaxiRoutingUiIntent.StartTaskAction(data)) } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt index b8436acf82..292c3eca79 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingFragmentViewModel.kt @@ -59,6 +59,7 @@ class TaxiRoutingFragmentViewModel : BaseViewModel { DebugView.printInfoMsg("[开始任务] 准备开始任务") val grayLineBean = intent.routingTask.grayLineBean diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt index 2392b26090..41421c3cbe 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingModel.kt @@ -88,7 +88,9 @@ object TaxiRoutingModel { OchAutoPilotStatusListenerManager.removeListener(TAG) } - //MAP到站监听 + /** + * MAP到站监听 + */ private val mMogoAutopilotStatusListener: IOchAutopilotStatusListener = object : IOchAutopilotStatusListener { @@ -128,7 +130,9 @@ object TaxiRoutingModel { } } - // 自车定位监听 + /** + * 自车定位监听 + */ private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = object : IMoGoChassisLocationGCJ02Listener { override fun onChassisLocationGCJ02(currentLocation: MogoLocation?) { @@ -199,6 +203,9 @@ object TaxiRoutingModel { CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) } + /** + * 查询灰度路线 + */ fun queryRoutingGrayLineList() { DebugView.printInfoMsg("[查询灰度路线] 准备发送请求,sn=${SharedPrefsMgr.getInstance().sn}") TaxiRoutingServiceManager.queryRoutingGrayLineList(mContext, @@ -255,6 +262,9 @@ object TaxiRoutingModel { }) } + /** + * 开始灰度任务&查询轨迹详情 + */ fun startGrayTaskAndQueryRoutingContrail(contrailId: Long, grayLineBean: GrayLineBean) { DebugView.printInfoMsg("[开始灰度任务&查询轨迹详情] 准备发送请求,contrailId=${contrailId}, lineId=${grayLineBean.lineId}") TaxiRoutingServiceManager.startGrayTaskAndQueryRoutingContrail( @@ -275,6 +285,7 @@ object TaxiRoutingModel { DebugView.printInfoMsg("[开始灰度任务&查询轨迹详情] 请求success,taskId=${data.taskId}, contrailId=${contrailId}, lineId=${grayLineBean.lineId}") mTaxiRoutingCallbackMap.forEach { val listener = it.value + //TODO Routing 从这里解析出经停信息,并和订单一样调用下载轨迹接口 listener.onStartGrayTaskAndQueryContrailSuccess(data) } } @@ -315,6 +326,9 @@ object TaxiRoutingModel { ) } + /** + * 灰度任务过程中,上报问题打点 + */ fun submitGrayLineIssueLocation(grayId: Long, gcjLon: Double, gcjLat: Double) { DebugView.printInfoMsg("[上报打点] 准备发送请求,grayId=$grayId, gcjLon=$gcjLon, gcjLat=$gcjLat") val submit = SubmitGrayLineIssueLocationReq(grayId, gcjLon, gcjLat) @@ -374,6 +388,9 @@ object TaxiRoutingModel { ) } + /** + * 结束灰度任务 + */ fun endGrayTask(grayId: Long, type: EndGrayTaskFeedbackType, occurrenceTime:Long,) { DebugView.printInfoMsg("[结束灰度任务] 准备发送请求,grayId=$grayId, type=${type.type}, typeName=${type.name}") val submit = EndGrayContrailTaskReq(grayId, type.type,occurrenceTime) @@ -432,6 +449,9 @@ object TaxiRoutingModel { }) } + /** + * 更新灰度路线信息 + */ fun updateCurrentGrayLineAndContrail( grayLineBean: GrayLineBean?, contrailBean: ContrailBean?, @@ -442,6 +462,9 @@ object TaxiRoutingModel { currentGrayId = grayId } + /** + * 灰度测试路线,启动自动驾驶 + */ fun startAutoPilotByClick() { if (currentGrayLineBean == null || currentContrailBean == null) { CallerLogger.e( @@ -454,6 +477,9 @@ object TaxiRoutingModel { startAutoPilot(currentGrayLineBean!!, currentContrailBean!!) } + /** + * 启动自动驾驶 + */ fun startAutoPilot(grayLineBean: GrayLineBean, contrailBean: ContrailBean) { if (grayLineBean.startSite == null || grayLineBean.endSite == null) { CallerLogger.e(TAG, "start site or end site is null") @@ -487,12 +513,14 @@ object TaxiRoutingModel { return } + // 初始化自动驾驶需要的参数 val parameters = initAutopilotControlParameters(grayLineBean, contrailBean) if (null == parameters) { CallerLogger.e(TAG, "AutopilotControlParameters is empty.") return } + // 开启自动驾驶 OchAutoPilotManager.startAutoPilot(parameters); DebugView.printInfoMsg("[启自驾] 调用成功") From ade4b8a9a83c8bec3967018e06bb017a71bd922c Mon Sep 17 00:00:00 2001 From: donghongyu Date: Wed, 12 Jun 2024 17:25:38 +0800 Subject: [PATCH 09/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E7=81=B0?= =?UTF-8?q?=E5=BA=A6=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0RoutingRequest?= =?UTF-8?q?=E5=85=B3=E9=94=AE=E4=BF=A1=E6=81=AF=EF=BC=8C=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E9=80=8F=E4=BC=A0=E7=BB=99MAP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 76 +++++++++++++++--- .../routing/TaxiRoutingChooseLineActivity.kt | 5 ++ .../routing/TaxiRoutingChooseLineViewModel.kt | 3 + .../och/taxi/ui/routing/TaxiRoutingModel.kt | 80 +++++++++++++++++-- .../och/taxi/ui/routing/TaxiRoutingUiState.kt | 3 + .../autopilot/AutopilotControlParameters.kt | 6 +- .../CallerAutoPilotControlManager.kt | 17 +++- 7 files changed, 172 insertions(+), 18 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt index aa5fd325a5..fe4b2a391b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -2,6 +2,9 @@ package com.mogo.och.taxi.bean import com.mogo.eagle.core.data.BaseData +/** + * 灰度路线信息 + */ data class GrayLineBean( var lineId: Long?, //线路id var lineName: String?, //线路名称 @@ -11,18 +14,30 @@ data class GrayLineBean( var lineFailCount: Int?, //线路累计反馈不可用次数 var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, - var endSite: RoutingSite? + var endSite: RoutingSite?, + var hdMapDBVersionCode: String?,// Routing 运营平台通过算路引擎算这条路时候使用的对应高精地图版本号 + var hdMapDBVersionName: String?,// Routing 运营平台通过算路引擎算这条路时候使用的对应高精地图版本名 + var routingEnginVersionCode: String?,// Routing 运营平台当前的算路引擎版本号码 + var routingEnginVersionName: String?,// Routing 运营平台当前的算路引擎版本名称 + var wayPoints: MutableList?,// Routing 给算路引擎使用的经停点列表,不是真正的要停车 + var blackPoints: MutableList?// Routing 给算路引擎使用的黑名单点,目的是不参与算路 ) +/** + * 站点信息 + */ data class RoutingSite( - var siteId: Long, - var siteName: String, - var gcjLat: Double, - var gcjLon: Double, - var wgs84Lon: Double, - var wgs84Lat: Double + var siteId: Long,// 站点ID + var siteName: String,// 站点名称 + var gcjLat: Double,// 高德坐标 + var gcjLon: Double,// 高德坐标 + var wgs84Lon: Double,//高精坐标 + var wgs84Lat: Double//高精坐标 ) +/** + * 轨迹信息 + */ data class ContrailBean( var lineId: Long = -1L, var lineName: String = "", @@ -40,29 +55,70 @@ data class ContrailBean( var version: Long = -1L ) +/** + * 查询灰度线路列表 + */ data class QueryGrayContrailListRsp(var data: MutableList?) : BaseData() + +/** + * 通过id查询轨迹详情 + */ data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long) + +/** + * 开始一个路线的灰度任务,对服务端的路线标记 + */ data class StartGrayContrailTaskRsp(var data: Long?) : BaseData() + +/** + * 根据id查询灰度轨迹详情 + */ data class QueryRoutingContrailByIdRsp(var data: ContrailBean?) : BaseData() + +/** + * 上报路线打点 + */ data class SubmitGrayLineIssueLocationReq(var grayId: Long, var gcjLon: Double, var gcjLat: Double) -data class EndGrayContrailTaskReq(var grayId: Long, var feedback: Int,var occurrenceTime:Long) //feedback 1:成功 2:失败 + +/** + * 结束一个路线的灰度任务 + */ +data class EndGrayContrailTaskReq( + var grayId: Long, + var feedback: Int, + var occurrenceTime: Long +) //feedback 1:成功 2:失败 + + +/** + * 灰度任务&查询轨迹详情 + */ data class StartGrayAndQueryContrailRsp( var taskId: Long?, var contrail: ContrailBean?, var grayLineBean: GrayLineBean ) : BaseData() -data class PointError(var code:String,var name:String,var isCheck:Boolean = false) +data class PointError(var code: String, var name: String, var isCheck: Boolean = false) + +/** + * 获取打点问题字典 + */ data class QueryPointErrorReasonsRsp(var data: MutableList?) : BaseData() + +/** + * 结束一个路线的灰度任务,并上报灰度路线测试情况 + */ data class SaveGrayContrailErrorReasons( var grayId: Long, var gcjLon: Double, var gcjLat: Double, var wgs84Lon: Double, var wgs84Lat: Double, - var occurrenceTime:Long, + var occurrenceTime: Long, var noteCodes: MutableList, ) //feedback 1:成功 2:失败 + enum class EndGrayTaskFeedbackType(var type: Int) { USABLE_YES(1), USABLE_NO(2) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt index 4514f3b265..b9e8894048 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineActivity.kt @@ -107,6 +107,9 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { } } + /** + * 初始化UI观察者 + */ private fun initViewModelObserver() { lifecycleScope.launchWhenStarted { mViewModel.uiStateFlow.map { it.routingUiState }.collect { routingUiState -> @@ -114,6 +117,7 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { TAG, "uiStateFlow-initViewModelObserver: $routingUiState" ) + // 分发处理具体UI更新 when (routingUiState) { is RoutingUIState.Init -> { showEmptyView() @@ -131,6 +135,7 @@ class TaxiRoutingChooseLineActivity : AppCompatActivity() { } } + // 将结果同步更新到UI is RoutingUIState.PostRoutingTaskResult -> { FlowBus.with(TaxiDriverEventConst.RoutingActivityEvent.EVENT_TYPE_GET_CHOSEN_LINE_TASK) .post(this, RoutingUIState.RoutingTask( diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt index f6f733248e..f69a3b5f2b 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingChooseLineViewModel.kt @@ -56,6 +56,9 @@ class TaxiRoutingChooseLineViewModel : BaseViewModel + // 初始化自动驾驶需要的参数 + val parameters = initAutopilotControlParameters( + startGrayAndQueryContrailRsp.grayLineBean, + contrail + ) + + if (parameters!!.autoPilotLine == null) { + CallerLogger.e( + SceneConstant.M_BUS + TAG, + "sendTrajectoryReq(): mAutoPilotLine is null!!!" + ) + return + } + writeChainLog( + "轨迹监控", + "sendTrajectoryReq() 下发轨迹 轨迹id" + parameters.autoPilotLine!!.lineId, + true, + OchChainLogManager.EVENT_KEY_INFE_WITH_TRAJECTORY + ) + CallerAutoPilotControlManager.sendTrajectoryDownloadReq(parameters) + CallerLogger.d( + SceneConstant.M_BUS + TAG, + "sendTrajectoryReq(): " + + GsonUtils.toJson(parameters) + ) + } + } + /** * 更新灰度路线信息 */ @@ -521,7 +558,7 @@ object TaxiRoutingModel { } // 开启自动驾驶 - OchAutoPilotManager.startAutoPilot(parameters); + OchAutoPilotManager.startAutoPilot(parameters) DebugView.printInfoMsg("[启自驾] 调用成功") CallerLogger.d( @@ -531,6 +568,9 @@ object TaxiRoutingModel { mControllerStatusCallback?.startOpenAutopilot() } + /** + * 初始化自动驾驶控制参数 + */ private fun initAutopilotControlParameters( grayLineBean: GrayLineBean, contrailBean: ContrailBean @@ -548,6 +588,36 @@ object TaxiRoutingModel { parameters.startLatLon = AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon) parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon) + + // Routing 给算路引擎使用的:经停点列表、黑名单 + val wayLatLons: MutableList = ArrayList() + val blackLatLons: MutableList = ArrayList() + + if (!grayLineBean.wayPoints.isNullOrEmpty()) { + for (mogoLatLng in grayLineBean.wayPoints!!) { + wayLatLons.add( + AutopilotControlParameters.AutoPilotLonLat( + mogoLatLng.wgs84Lat, + mogoLatLng.wgs84Lon + ) + ) + } + } + + if (!grayLineBean.blackPoints.isNullOrEmpty()) { + for (mogoLatLng in grayLineBean.blackPoints!!) { + wayLatLons.add( + AutopilotControlParameters.AutoPilotLonLat( + mogoLatLng.wgs84Lat, + mogoLatLng.wgs84Lon + ) + ) + } + } + + parameters.wayLatLons = wayLatLons + parameters.blackLatLons = blackLatLons + if (parameters.autoPilotLine == null) { parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine( contrailBean.lineId, diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt index 9aef55856b..8be6e8e374 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/routing/TaxiRoutingUiState.kt @@ -6,6 +6,9 @@ import com.mogo.och.taxi.bean.GrayLineBean data class TaxiRoutingUiState(val routingUiState: RoutingUIState) : IUiState +/** + * 算路UI状态 + */ sealed class RoutingUIState { object Init : RoutingUIState() diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt index 58f9e37cf3..7fcc66a5f9 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt @@ -113,7 +113,10 @@ class AutopilotControlParameters { var startLatLon: AutoPilotLonLat? = null @JvmField - var wayLatLons: List? = null + var wayLatLons: List? = null // Routing 给算路引擎使用的经停点列表,不是真正的要停车 + + @JvmField + var blackLatLons: List? = null // Routing 给算路引擎使用的黑名单点,目的是不参与算路 @JvmField var endLatLon: AutoPilotLonLat? = null @@ -222,6 +225,7 @@ class AutopilotControlParameters { "endName='$endName', " + "startLatLon=$startLatLon, " + "wayLatLons=$wayLatLons," + + "blackLatLons=$blackLatLons," + "endLatLon=$endLatLon," + "speedLimit=$speedLimit, " + "vehicleType=$vehicleType, " + diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 627f2e4fad..227630c0c2 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -4,6 +4,8 @@ import android.os.SystemClock import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.toAutoPilotLine +import com.mogo.eagle.core.data.autopilot.toRouteInfo import com.mogo.eagle.core.data.deva.badcase.BagManagerEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths @@ -177,12 +179,23 @@ object CallerAutoPilotControlManager { } } + /** + * 发送 轨迹下载请求 + */ + fun sendTrajectoryDownloadReq(autopilotControlParameters: AutopilotControlParameters) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + // Routing 需要传参 routeInfo + providerApi?.sendTrajectoryDownloadReq(autopilotControlParameters.autoPilotLine!!, autopilotControlParameters.toRouteInfo()) + CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autopilotControlParameters.autoPilotLine!!, 0) + } + } + /** * 发送 轨迹下载请求 */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO Routing 需要传参 routeInfo + //TODO Routing 需要传参 routeInfo,这里建议业务侧重新整合到同一个数据实体内传入 providerApi?.sendTrajectoryDownloadReq(autoPilotLine, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, 0) } @@ -194,7 +207,7 @@ object CallerAutoPilotControlManager { */ fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, downloadType: Int) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - //TODO Routing 需要传参 routeInfo + //TODO Routing 需要传参 routeInfo,这里建议业务侧重新整合到同一个数据实体内传入 providerApi?.sendTrajectoryDownloadReq(autoPilotLine, downloadType, null) CallerAutoPilotStatusListenerManager.invokeTrajectoryDownloadReq(autoPilotLine, downloadType) } From 1851593eab765b4a5128d8af00e7ac1403645163 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 17 Jun 2024 15:17:45 +0800 Subject: [PATCH 10/43] =?UTF-8?q?[6.4.4]=E4=BF=AE=E5=A4=8D=E5=86=B7?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=BF=9B=E5=BA=A6=E5=BC=82=E5=B8=B8=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt index ba45156c35..c8d9d7023c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ConnectionProcessView.kt @@ -365,6 +365,7 @@ class ConnectionProcessView @JvmOverloads constructor( override fun onFinish() { //将SSM连接状态置为false ssmConnectStatus = false + autopilotReadyStatus = false //展示连接SSM失败视图 showSSMConnectFailView() } @@ -386,6 +387,7 @@ class ConnectionProcessView @JvmOverloads constructor( override fun onFinish() { //将冷启动状态置为false + ssmConnectStatus = false autopilotReadyStatus = false if(CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ssmAutoPilotReady){ //冷启动成功 From 352ed82c2f9347a82e622f4eac888ec48841e5e2 Mon Sep 17 00:00:00 2001 From: yakunyang Date: Mon, 17 Jun 2024 16:12:19 +0800 Subject: [PATCH 11/43] =?UTF-8?q?[6.4.4]=20[fix]=20=E7=BA=BF=E8=B7=AF?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../och/shuttle/passenger/ui/BusPassengerRouteFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/ui/BusPassengerRouteFragment.java b/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/ui/BusPassengerRouteFragment.java index 502cbd4bdd..0009a3b75a 100644 --- a/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/shuttle/passenger/src/main/java/jinlv/com/mogo/och/shuttle/passenger/ui/BusPassengerRouteFragment.java @@ -211,6 +211,8 @@ public class BusPassengerRouteFragment extends public void hideNoTaskView(){ if (mNoLineInfoView.getVisibility() == View.VISIBLE){ mNoLineInfoView.setVisibility(View.GONE); + } + if (mRouteInfoView.getVisibility() == View.GONE){ mRouteInfoView.setVisibility(View.VISIBLE); } } From f0a7901658ec066cef06f3f5e939fe1591edf21e Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 21 Jun 2024 09:54:44 +0800 Subject: [PATCH 12/43] =?UTF-8?q?[6.4.4][=E5=BA=94=E7=94=A8=E5=8D=87?= =?UTF-8?q?=E7=BA=A7][bugfix]=20=E9=85=8D=E7=BD=AE=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AF=BC=E8=87=B4=E5=8D=87=E7=BA=A7=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binding/BindingCarManager.kt | 4 +++ .../upgrade/UpgradeAppNetWorkManager.kt | 29 +++++++++++++++---- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt index e448a75ea4..892b3dd8b7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt @@ -252,5 +252,9 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener, IMoGoCloudListener { ) } } + + fun getMacAddress(): String? { + return mAddress + } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt index 660526fd19..72db69103d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt @@ -1,6 +1,7 @@ package com.zhjt.mogo_core_function_devatools.upgrade import android.content.* +import android.text.TextUtils import android.util.* import android.widget.Toast import com.mogo.commons.constants.* @@ -22,8 +23,10 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.getMisChannelCode import com.mogo.eagle.core.utilcode.mogo.logger.scene.* import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.FileUtils +import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager import kotlinx.coroutines.* import okhttp3.* import java.util.TreeMap @@ -55,9 +58,25 @@ class UpgradeAppNetWorkManager private constructor() { fun getAppUpgradeInfo(context: Context?, mac: String, screenType: String) { upgradeJob?.safeCancel() scope.launch { - val sn = SharedPrefsMgr.getInstance().sn - val macAddress = mac //"48:b0:2d:4d:31:7f" - val type = screenType //"10" + var sn = SharedPrefsMgr.getInstance().sn + var macAddress = mac //"48:b0:2d:4d:31:7f" + var type = screenType //"10" + while (sn == null || TextUtils.isEmpty(sn)) { + Logger.d(TAG, "sn is null or empty.") + delay(TimeUnit.MINUTES.toMillis(1)) + sn = SharedPrefsMgr.getInstance().sn + } + while (TextUtils.isEmpty(macAddress)) { + Logger.d(TAG, "mac address is null or empty.") + delay(TimeUnit.MINUTES.toMillis(1)) + macAddress = BindingCarManager.getMacAddress() ?: "" + } + while (type == "0") { + Logger.d(TAG, "type is 0") + delay((TimeUnit.MINUTES.toMillis(1))) + type = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode).toString() + } + Logger.d(TAG, "start upgrade request ...") SharedPrefsMgr.getInstance().putString(SharedPrefsConstants.HOST_ADDRESS, HostConst.getHost()) try { val records = provider?.getUpgradeRecords()?.also { @@ -67,7 +86,7 @@ class UpgradeAppNetWorkManager private constructor() { "${ it.first } -> ${ it.second }" } } - itx["role"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) + itx["role"] = type }) } Log.d(TAG, "getAppUpgradeInfo: -> records:" + records?.entries?.joinToString(",") { itx -> "key:${itx.key} -> value:[${itx.value.joinToString(",") { "${it.first},${it.second}" } }]"}) @@ -98,7 +117,7 @@ class UpgradeAppNetWorkManager private constructor() { if (mDownloadRequested) { mDownloadRequested = false } - getAppUpgradeInfo(context, mac, screenType) + getAppUpgradeInfo(context, macAddress, type) }.also { upgradeJob = it } From 7de4388820d478d67b293482ea199887488c6c43 Mon Sep 17 00:00:00 2001 From: renwj Date: Fri, 21 Jun 2024 11:35:12 +0800 Subject: [PATCH 13/43] =?UTF-8?q?[6.4.4][=E5=BA=94=E7=94=A8=E5=8D=87?= =?UTF-8?q?=E7=BA=A7][bugfix]=20=E6=B7=BB=E5=8A=A0=E5=9F=8B=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../upgrade/UpgradeAppNetWorkManager.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt index 72db69103d..3cf59615e9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt @@ -63,17 +63,20 @@ class UpgradeAppNetWorkManager private constructor() { var type = screenType //"10" while (sn == null || TextUtils.isEmpty(sn)) { Logger.d(TAG, "sn is null or empty.") + MogoAnalyticUtils.track("AppUpgradeParams", HashMap().also { it["sn"] = sn }) delay(TimeUnit.MINUTES.toMillis(1)) sn = SharedPrefsMgr.getInstance().sn } while (TextUtils.isEmpty(macAddress)) { Logger.d(TAG, "mac address is null or empty.") + MogoAnalyticUtils.track("AppUpgradeParams", HashMap().also { it["mac_address"] = macAddress }) delay(TimeUnit.MINUTES.toMillis(1)) macAddress = BindingCarManager.getMacAddress() ?: "" } while (type == "0") { Logger.d(TAG, "type is 0") delay((TimeUnit.MINUTES.toMillis(1))) + MogoAnalyticUtils.track("AppUpgradeParams", HashMap().also { it["type"] = type }) type = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode).toString() } Logger.d(TAG, "start upgrade request ...") From 88f73c5fd7f75335ee968e5bf965c07867606be5 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Fri, 21 Jun 2024 20:17:47 +0800 Subject: [PATCH 14/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E8=B7=AF?= =?UTF-8?q?=E7=BA=BF=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E7=BB=8F=E5=81=9C=E7=82=B9=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt index fe4b2a391b..80f5543b0d 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/bean/TaxiRoutingBean.kt @@ -52,7 +52,8 @@ data class ContrailBean( var txtFileUrlDPQP: String = "", var txtFileMd5DPQP: String = "", var contrailSaveTimeDPQP: Long = -1L, - var version: Long = -1L + var version: Long = -1L, + var passPoints: MutableList?, // 用于算路的经停点 ) /** From 9ecedbc17a8f8475e0749d2e93a55bf09bbbfe86 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 24 Jun 2024 11:02:30 +0800 Subject: [PATCH 15/43] =?UTF-8?q?[6.4.6]=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=A7=E4=BA=8E2=E8=A1=8C=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable-xhdpi/bg_msg_box_v2x.png | Bin 29866 -> 0 bytes .../src/main/res/drawable/bg_msg_box_v2x.9.png | Bin 0 -> 30194 bytes .../main/res/layout/item_msg_box_autopilot.xml | 13 +++++++------ .../src/main/res/layout/item_msg_box_fsm.xml | 13 +++++++------ .../src/main/res/layout/item_msg_box_ssm.xml | 13 +++++++------ .../src/main/res/layout/item_msg_box_v2x.xml | 13 +++++++------ .../res/layout/item_msg_bubble_autopilot.xml | 13 +++++++------ .../src/main/res/layout/item_msg_bubble_fsm.xml | 13 +++++++------ .../src/main/res/layout/item_msg_bubble_ssm.xml | 13 +++++++------ .../src/main/res/layout/item_msg_bubble_v2x.xml | 13 +++++++------ 10 files changed, 56 insertions(+), 48 deletions(-) delete mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_msg_box_v2x.png deleted file mode 100644 index d41c75bc33019166f8f2414fb1848df07def69f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29866 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 HH-i5U&+tW$ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/bg_msg_box_v2x.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d4a5b2b27ca600fd3d8a5b03608f8874c3e495 GIT binary patch literal 30194 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 J(tP;xe*suz)*b)= literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml index 8718a6c212..c81b4277fb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml index 9b2403e515..595b2d7b71 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml index fb4d2d14fc..74e6a820fb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml index 95f88716a2..aa7368475e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml index 9f0199eb80..58cb07451a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml index ed2245fa1f..8ec3709076 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml index 5aa40ef9ba..7b0030c91b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml @@ -2,7 +2,8 @@ \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml index 55ac93d864..37e21f8a77 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml @@ -2,7 +2,8 @@ \ No newline at end of file From 59de8cd5b2de7ece1fb0d5d834b1920cbb9ea1ee Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 24 Jun 2024 11:28:07 +0800 Subject: [PATCH 16/43] =?UTF-8?q?[6.4.6]=E8=B0=83=E6=95=B4=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=9B=92=E5=AD=90=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=86=85=E5=AE=B9margin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/res/layout/item_msg_box_autopilot.xml | 6 ++++-- .../src/main/res/layout/item_msg_box_fsm.xml | 6 ++++-- .../src/main/res/layout/item_msg_box_ssm.xml | 6 ++++-- .../src/main/res/layout/item_msg_box_v2x.xml | 6 ++++-- .../src/main/res/layout/item_msg_bubble_autopilot.xml | 6 ++++-- .../src/main/res/layout/item_msg_bubble_fsm.xml | 6 ++++-- .../src/main/res/layout/item_msg_bubble_ssm.xml | 6 ++++-- .../src/main/res/layout/item_msg_bubble_v2x.xml | 6 ++++-- 8 files changed, 32 insertions(+), 16 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml index c81b4277fb..af6c0e91af 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_autopilot.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml index 595b2d7b71..59c58fdb9d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_fsm.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml index 74e6a820fb..9cfb6b9827 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ssm.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml index aa7368475e..dd60fb62ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_v2x.xml @@ -30,7 +30,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml index 58cb07451a..8f23c77a4a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_autopilot.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml index 8ec3709076..468e6fd76d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_fsm.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml index 7b0030c91b..884c218e64 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_ssm.xml @@ -32,7 +32,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml index 37e21f8a77..3239c78652 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml @@ -30,7 +30,8 @@ android:layout_marginStart="@dimen/dp_15" android:textColor="#FFFFFFFF" android:textSize="@dimen/sp_32" - android:layout_marginTop="@dimen/dp_10" + android:layout_marginTop="@dimen/dp_5" + android:layout_marginBottom="@dimen/dp_5" /> \ No newline at end of file From e528da6fc9aaeebe4811384ba5ff84fa74cb7619 Mon Sep 17 00:00:00 2001 From: donghongyu Date: Mon, 24 Jun 2024 19:18:21 +0800 Subject: [PATCH 17/43] =?UTF-8?q?[Routing=20dev]=201=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E5=A4=8Ddpqp=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E6=B2=A1?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AF=BC=E8=87=B4=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../unmanned/taxi/ui/routing/TaxiRoutingModel.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt index eebe7d71aa..e09092349d 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt @@ -593,8 +593,8 @@ object TaxiRoutingModel { val wayLatLons: MutableList = ArrayList() val blackLatLons: MutableList = ArrayList() - if (!grayLineBean.wayPoints.isNullOrEmpty()) { - for (mogoLatLng in grayLineBean.wayPoints!!) { + if (!contrailBean.passPoints.isNullOrEmpty()) { + for (mogoLatLng in contrailBean.passPoints!!) { wayLatLons.add( AutopilotControlParameters.AutoPilotLonLat( mogoLatLng.wgs84Lat, @@ -628,11 +628,11 @@ object TaxiRoutingModel { contrailBean.txtFileMd5, contrailBean.contrailSaveTime, TaxiUnmannedConst.BUSINESSTYPE.toString(), - contrailBean.csvFileUrlDPQP, - contrailBean.csvFileMd5DPQP, - contrailBean.txtFileUrlDPQP, - contrailBean.txtFileMd5DPQP, - contrailBean.contrailSaveTimeDPQP + "", + "", + "", + "", + -1L ) } return parameters From 1ffcee57f2afd0805bb78e8206e0f0be8e8863db Mon Sep 17 00:00:00 2001 From: aibingbing Date: Fri, 21 Jun 2024 18:59:28 +0800 Subject: [PATCH 18/43] =?UTF-8?q?[646]feat:=E5=A2=9E=E5=8A=A0=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E8=BD=A8=E8=BF=B9=E7=BB=98=E5=88=B6=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eagle/core/function/MapBizProvider.kt | 2 + .../MogoTrajectoryOverlayManager.java | 85 +++++ .../TrajectoryOverlayDrawer.java | 301 ++++++++++++++++++ .../trajectoryoverlay/TrajectoryStrategy.kt | 169 ++++++++++ .../java/com/mogo/map/overlay/core/Level.kt | 5 + 5 files changed, 562 insertions(+) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt index aa9311d344..4c03580f0c 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/MapBizProvider.kt @@ -11,6 +11,7 @@ import com.mogo.eagle.core.function.business.SpeedLimitDataManager import com.mogo.eagle.core.function.business.ai.AiCloudIdentifyDataManager.Companion.aiCloudIdentifyDataManager import com.mogo.eagle.core.function.business.identify.MapIdentifySubscriber import com.mogo.eagle.core.function.business.routeoverlay.MogoRouteOverlayManager +import com.mogo.eagle.core.function.business.trajectoryoverlay.MogoTrajectoryOverlayManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.map.MapDataWrapper @@ -25,6 +26,7 @@ class MapBizProvider :IMoGoFunctionServerProvider, IMogoRoma { MapDataWrapper.init() MapIdentifySubscriber.instance MogoRouteOverlayManager.getInstance().init() + MogoTrajectoryOverlayManager.getInstance().init() MapPointCloudSubscriber.instance SpeedLimitDataManager.getInstance().start() if(DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model()){ //todo 新增稳定设备类型需要添加,目的避免在nuc设备上使用此类功能 diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java new file mode 100644 index 0000000000..be09ee92a8 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java @@ -0,0 +1,85 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay; + +import androidx.annotation.Nullable; + +import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; + +import java.util.LinkedList; +import java.util.List; + +import mogo.telematics.pad.MessagePad; + +public class MogoTrajectoryOverlayManager implements + IMoGoPlanningRottingListener, + IMoGoChassisLocationGCJ02Listener { + private static volatile MogoTrajectoryOverlayManager sInstance; + private static final String TAG = "MogoTrajectoryOverlayManager"; + + private final LinkedList> queue = new LinkedList<>(); + + private MogoTrajectoryOverlayManager() { + } + + + public void init() { + CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, this); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 1,this); + } + + public static MogoTrajectoryOverlayManager getInstance() { + if (sInstance == null) { + synchronized (MogoTrajectoryOverlayManager.class) { + if (sInstance == null) { + sInstance = new MogoTrajectoryOverlayManager(); + } + } + } + return sInstance; + } + + @Override + public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp globalPathResp) { + CallerLogger.i(TAG, "onAutopilotRotting size="+globalPathResp.getWayPointsList().size()); + if (globalPathResp != null) { + synchronized (queue) { + queue.clear(); + queue.offer(globalPathResp.getWayPointsList()); + } + } + } + + @Override + public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { + if (gnssInfo == null) { + return; + } + int autoPilotState = CallerAutoPilotStatusListenerManager.INSTANCE.getState(); + boolean isArriveAtStation = CallerAutoPilotStatusListenerManager.INSTANCE.isArriveAtStation(); +// Log.d(TAG, "-- onChassisLocationGCJ02 -- 1 ---" + ":auto-mode:" + autoPilotState + ", isArriveAtStation: " + isArriveAtStation); +// if (isArriveAtStation && autoPilotState != 2) { +// RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); +// return; +// } +// Log.d(TAG, "-- onChassisLocationGCJ02 -- 2 ---" + "auto-mode:" + autoPilotState + ", isDemoMode:" + FunctionBuildConfig.isDemoMode + ", force:" + FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView); +// boolean force = FunctionBuildConfig.isForceDrawAutopilotTrajectoryByDebugSettingView || FunctionBuildConfig.isDemoMode && FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData; +// if (!force && autoPilotState != 2) { +// RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); +// return; +// } +// Log.d(TAG, "-- onChassisLocationGCJ02 -- 3 ---"); + synchronized (queue) { + if (!queue.isEmpty()) { + List items = queue.pollLast(); + if (items != null && !items.isEmpty()) { + TrajectoryOverlayDrawer.getInstance().drawTrajectoryList(items, gnssInfo.getHeading()); + } + } + } + } +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java new file mode 100644 index 0000000000..7ba5a7beb7 --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java @@ -0,0 +1,301 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay; + +import static com.mogo.map.MogoMap.DEFAULT; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; + +import androidx.core.util.Pools; + +import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager; +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; +import com.mogo.map.overlay.IMoGoOverlayManager; +import com.mogo.map.overlay.core.Level; +import com.mogo.map.overlay.line.Polyline; +import com.zhidaoauto.map.sdk.open.common.tools.MapTools; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import kotlin.Pair; +import mogo.telematics.pad.MessagePad; + +public class TrajectoryOverlayDrawer { + + private static final String TAG = "TrajectoryOverlayDrawer"; + + // 连接线参数 + private Handler mRenderHandler; + private final IMoGoOverlayManager mogoOverlayManager; + private static volatile TrajectoryOverlayDrawer sInstance; + private static final byte[] obj = new byte[0]; + private Polyline.Options mPolylineOptions; + private static final int COLOR_LIGHT = Color.parseColor("#BAEBF5"); + + + //用于taxi乘客屏渐变颜色集合 + private static List colors = null; + + private TrajectoryOverlayDrawer() { + // 渐变色 + mogoOverlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); + if (mogoOverlayManager != null) { + mPolylineOptions = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) + .setUseGps(true) + .setWidth(30) + .setIsGradient(true) + .build(); + + // 线条粗细,渐变,渐变色值 + HandlerThread renderTask = new HandlerThread("trajectory_render") { + @Override + protected void onLooperPrepared() { + super.onLooperPrepared(); + mRenderHandler = new Handler(getLooper()); + } + }; + renderTask.start(); + } + } + + public static TrajectoryOverlayDrawer getInstance() { + if (sInstance == null) { + synchronized (obj) { + if (sInstance == null) { + sInstance = new TrajectoryOverlayDrawer(); + } + } + } + return sInstance; + } + + public void clearMogoTrajectoryOverlay() { + if (mogoOverlayManager != null) { + if (mRenderTask != null) { + mRenderHandler.removeCallbacks(mRenderTask); + } + mogoOverlayManager.removeAllLinesInLevel(Level.TRAJECTORY_LINE); + } + } + + private class RenderTask implements Runnable { + private volatile List routeList; + + private final Pools.Pool pools; + private final LinkedList points; + + private double bearing; + + public RenderTask() { + this.pools = new Pools.SimplePool<>(500); + this.points = new LinkedList<>(); + } + + public void setData(List routeList, double bearing) { + this.routeList = routeList; + this.bearing = bearing; + } + + @SuppressLint("LongLogTag") + @Override + public void run() { + IMoGoOverlayManager overlayManager = mogoOverlayManager; + if (overlayManager == null) { + return; + } + LinkedList pps = this.points; + boolean isExcept = false; + int total; + + try { + pps.clear(); + List routes = this.routeList; + if (routes == null || (total = routes.size()) < 2) { + isExcept = true; + return; + } +// boolean isColorfulStrategy = !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); + //TODO + boolean isColorfulStrategy = false; + if (isColorfulStrategy) { + TrajectoryStrategy.INSTANCE.start(); + } else { + if (colors == null) { + ArrayList> temps = new ArrayList<>(); +// temps.add(new Pair<>(0, 51)); +// temps.add(new Pair<>(10, 102)); +// temps.add(new Pair<>(30, 51)); +// temps.add(new Pair<>(100, 0)); + temps.add(new Pair<>(0, 51)); + temps.add(new Pair<>(10, 51)); + temps.add(new Pair<>(30, 51)); + temps.add(new Pair<>(100, 51)); + List alphas = MapTools.INSTANCE.getColorAlpha(temps); + if (alphas != null && !alphas.isEmpty()) { + colors = new ArrayList<>(); + for (int i : alphas) { + colors.add(Color.argb(i, 48,203,251)); + } + } + } + } + for (int i = 0; i < total; i++) { + MessagePad.Location route = null; + try { + route = routes.get(i); + if (route == null) { + continue; + } + } catch (Throwable t) { + Log.d("Trajectory", "render-error:" + t.getMessage()); + } + if (route == null) { + //数组越界了,结束循环 + break; + } + MogoLatLng acquire = pools.acquire(); + double latitude = route.getLatitude(); + double longitude = route.getLongitude(); + if (acquire == null) { + acquire = new MogoLatLng(latitude, longitude); + } else { + acquire.lon = longitude; + acquire.lat = latitude; + } +// acquire.acc = route.getAcceleration(); +// acquire.speed = route.getVelocity(); + pps.add(acquire); +// if (isColorfulStrategy) { +//// RouteStrategy.INSTANCE.check(route.getVelocity(), route.getAcceleration(), routeList.size()); +// } + } + double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); + double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); + if (points.size() > 0) { + MogoLatLng top = null; + while (points.size() != 0) { + MogoLatLng first = points.peek(); + if (first == null) { + continue; + } + if (first == top) { + break; + } + lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); + lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); + long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat); + if (angle >= 90) { + if (isColorfulStrategy) { + TrajectoryStrategy.INSTANCE.remove(first.acc); + } + pools.release(first); + points.poll(); + } + top = first; + } + if (points.size() == 0) { + isExcept = true; + return; + } +// MogoLatLng self = pools.acquire(); +// if (self == null) { +// self = new MogoLatLng(lat, lon); +// } else { +// self.lat = lat; +// self.lon = lon; +// } +// points.addFirst(self); + + Polyline.Options.Builder builder; + if (mPolylineOptions == null) { + builder = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) + .setUseGps(true) + .setWidth(20) + .setIsGradient(true); + } else { + builder = mPolylineOptions.builder(); + } + + if (isColorfulStrategy) { + TrajectoryStrategy.INSTANCE.end(); + Strategy strategy = TrajectoryStrategy.INSTANCE.getStrategy(); + List colors = strategy.getColors(); + boolean isLightOn = strategy instanceof ColorfulStrategy && ((ColorfulStrategy) strategy).isLightOn(); + builder.colors(colors); + builder.setLightOn(isLightOn); + builder.setLightColor(COLOR_LIGHT); + builder.setLightSpeed(0.3f); + } else { + if (colors != null && !colors.isEmpty()) { + builder.colors(colors); + builder.setIsGradient(true); +// builder.setLightOn(true); + builder.setLightOn(false); + builder.setLightColor(COLOR_LIGHT); + builder.setLightSpeed(0.3f); + } + } + builder.points(points); + builder.setVisible(true); + Polyline.Options options = builder.build(); + if (mPolylineOptions == null) { + mPolylineOptions = options; + } + overlayManager.showOrUpdateLine(options,DEFAULT); + } else { + isExcept = true; + } + } catch (Throwable t) { + t.printStackTrace(); + } finally { + if (isExcept) { + setVisible(false); + } + if (points.size() > 0) { + for (int i = 0; i < points.size(); i++) { + MogoLatLng latLng = points.get(i); + if (latLng == null) { + continue; + } + pools.release(latLng); + } + } + } + } + + private long isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) { + return DrivingDirectionUtils.getDegreeOfCar2Poi2(car_lon, car_lat, lon, lat, car_head); + } + } + + private volatile RenderTask mRenderTask; + + public void drawTrajectoryList(List routeList, double bearing) { + if (mogoOverlayManager != null) { + if (mRenderTask == null) { + mRenderTask = new RenderTask(); + } + mRenderTask.setData(routeList, bearing); + if (mRenderHandler != null) { + mRenderHandler.removeCallbacks(mRenderTask); + mRenderHandler.post(mRenderTask); + } + } + } + + public void setVisible(boolean isVisible) { + if (mogoOverlayManager != null) { + if (isVisible) { + mogoOverlayManager.showAllLinesInLevel(Level.TRAJECTORY_LINE); + } else { + mogoOverlayManager.hideAllLinesInLevel(Level.TRAJECTORY_LINE); + } + } + } +} diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt new file mode 100644 index 0000000000..5891babd2e --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt @@ -0,0 +1,169 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay + +import android.animation.ArgbEvaluator +import android.graphics.Color +import android.view.animation.AccelerateInterpolator +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE +import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE_DARK +import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_RED_DARK +import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_TRANSPARENT +import java.util.* +import kotlin.properties.Delegates + + +interface IStrategy { + fun getColors(): List +} + +class Colors { + + companion object { + val COLOR_BLUE = Color.parseColor("#FF2ABAD9") + val COLOR_BLUE_DARK = Color.parseColor("#FF074EFF") + val COLOR_RED_DARK = Color.parseColor("#FFFF5F00") + val COLOR_TRANSPARENT = Color.parseColor("#002ABAD9") + } +} + +sealed class Strategy : IStrategy + +class DefaultStrategy(private val colors: List? = null) : Strategy() { + + override fun getColors(): List = colors ?: listOf(COLOR_BLUE, COLOR_TRANSPARENT) +} + +class ColorfulStrategy(private val colors: List = emptyList(), var isLightOn: Boolean) : + Strategy() { + override fun getColors(): List = colors +} + +object TrajectoryStrategy { + + private var isEnable by Delegates.observable(HmiBuildConfig.isShowRouteStrategy) { _, _, newValue -> + if (!newValue) { + strategy = null + colors.clear() + } + } + + private var strategy: Strategy? = null + + private val colors: ArrayList = ArrayList() + + private var index = 0 + + private val sorted: NavigableMap by lazy { TreeMap() } + + private var endEvaluator: ArgbEvaluator? = null + + private var startColor = Int.MAX_VALUE + + private var hasLessThan0 = false + + fun start() { + if (sorted.isEmpty()) { + fill() + } + strategy = null + index = 0 + startColor = Int.MAX_VALUE + colors.clear() + endEvaluator = null + hasLessThan0 = false + } + + fun end() { + if (isEnable) { + if (colors.isEmpty()) { + return + } + val first = colors[0] + colors.add(0, first) + strategy = ColorfulStrategy(colors, true) + } + } + + fun check(speed: Double, acc: Double, total: Int) { + if (!isEnable) { + return + } + if (sorted.isEmpty()) { + return + } + if (acc < 0) { + hasLessThan0 = true + } + val delta = (total * 0.35).toInt() + val last = total - delta + val entry = sorted.floorEntry(acc) + if (entry != null) { + if (index >= last - 1) { + if (startColor == Int.MAX_VALUE) { + startColor = entry.value + if (endEvaluator == null) { + endEvaluator = ArgbEvaluator() + } + colors += entry.value + } else { + if (endEvaluator != null) { + val fraction = (index - last) * 1.0f / delta + colors += endEvaluator!!.evaluate( + fraction, + startColor, + COLOR_TRANSPARENT + ) as Int + } + } + } else { + colors += entry.value + } + } + index++ + } + + fun remove(acc: Double): List { + if (!isEnable) { + return emptyList() + } + if (sorted.isEmpty()) { + throw AssertionError("sorted map must not be null.") + } + val entry = sorted.floorEntry(acc) + if (entry != null) { + colors.remove(entry.value) + } + return ArrayList(colors) + } + + private fun fill() { + var startValue = -4.0 + var endValue = 0.0 + val step = 0.01 + var current = startValue + val evaluator = ArgbEvaluator() + val interceptor = AccelerateInterpolator() + var total = endValue - startValue + while (current <= endValue) { + val fraction = interceptor.getInterpolation(((current - startValue) / total).toFloat()) + val colorValue = evaluator.evaluate(fraction, COLOR_RED_DARK, COLOR_BLUE) as Int + sorted[current] = colorValue + current += step + } + startValue = 0.01 + endValue = 3.0 + current = startValue + total = endValue - startValue + while (current <= endValue) { + val fraction = (current - startValue) / total + val colorValue = + evaluator.evaluate(fraction.toFloat(), COLOR_BLUE, COLOR_BLUE_DARK) as Int + sorted[current] = colorValue + current += step + } + } + + fun getStrategy(): Strategy = if (isEnable) { + (strategy ?: DefaultStrategy()) + } else DefaultStrategy() +} \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt index 620cd25678..a1e56e7edd 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt @@ -15,6 +15,11 @@ enum class Level(val zIndex: Int) { */ ROAD_CENTER_LINE(40000), + /** + * 全局轨迹线 + */ + TRAJECTORY_LINE(74000), + /** * 前车引导线 */ From cb9df531293bce9de767e66fa4f9bc3670dc2ec6 Mon Sep 17 00:00:00 2001 From: aibingbing Date: Tue, 25 Jun 2024 17:38:33 +0800 Subject: [PATCH 19/43] =?UTF-8?q?[646]=20feat:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E8=BD=A8=E8=BF=B9=E5=B1=95=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8F=90=E4=BE=9B=E5=AF=B9=E5=A4=96=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E6=8E=A5=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MogoTrajectoryOverlayManager.java | 27 ++++-- .../MogoTrajectoryOverlayProvider.kt | 37 ++++++++ .../TrajectoryOverlayDrawer.java | 95 +++++++++---------- .../trajectoryoverlay/TrajectoryStrategy.kt | 13 +-- .../core/data/constants/MogoServicePaths.java | 3 + .../IMoGoGlobalTrajectoryDrawListener.kt | 22 +++++ .../CallerMapGlobalTrajectoryDrawManager.kt | 44 +++++++++ .../java/com/mogo/map/overlay/core/Level.kt | 2 +- 8 files changed, 177 insertions(+), 66 deletions(-) create mode 100644 core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt create mode 100644 core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java index be09ee92a8..932d8a5a26 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayManager.java @@ -1,12 +1,14 @@ package com.mogo.eagle.core.function.business.trajectoryoverlay; +import android.util.Pair; + import androidx.annotation.Nullable; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; @@ -26,10 +28,9 @@ public class MogoTrajectoryOverlayManager implements private MogoTrajectoryOverlayManager() { } - public void init() { CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, this); - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 1,this); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 1, this); } public static MogoTrajectoryOverlayManager getInstance() { @@ -45,7 +46,7 @@ public class MogoTrajectoryOverlayManager implements @Override public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp globalPathResp) { - CallerLogger.i(TAG, "onAutopilotRotting size="+globalPathResp.getWayPointsList().size()); + CallerLogger.i(TAG, "onAutopilotRotting size=" + globalPathResp.getWayPointsList().size()); if (globalPathResp != null) { synchronized (queue) { queue.clear(); @@ -59,8 +60,8 @@ public class MogoTrajectoryOverlayManager implements if (gnssInfo == null) { return; } - int autoPilotState = CallerAutoPilotStatusListenerManager.INSTANCE.getState(); - boolean isArriveAtStation = CallerAutoPilotStatusListenerManager.INSTANCE.isArriveAtStation(); +// int autoPilotState = CallerAutoPilotStatusListenerManager.INSTANCE.getState(); +// boolean isArriveAtStation = CallerAutoPilotStatusListenerManager.INSTANCE.isArriveAtStation(); // Log.d(TAG, "-- onChassisLocationGCJ02 -- 1 ---" + ":auto-mode:" + autoPilotState + ", isArriveAtStation: " + isArriveAtStation); // if (isArriveAtStation && autoPilotState != 2) { // RouteOverlayDrawer.getInstance().clearMogoRouteOverlay(); @@ -73,13 +74,25 @@ public class MogoTrajectoryOverlayManager implements // return; // } // Log.d(TAG, "-- onChassisLocationGCJ02 -- 3 ---"); + + } + + public Pair drawTrajectoryOverlayOnce() { + Pair result = new Pair(false, "全局轨迹未就绪或为空"); synchronized (queue) { if (!queue.isEmpty()) { List items = queue.pollLast(); if (items != null && !items.isEmpty()) { - TrajectoryOverlayDrawer.getInstance().drawTrajectoryList(items, gnssInfo.getHeading()); + double heading = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getHeading(); + TrajectoryOverlayDrawer.getInstance().drawTrajectoryList(items, heading); + return new Pair(true, "success"); } } + return result; } } + + public void clearTrajectoryOverlay() { + TrajectoryOverlayDrawer.getInstance().clearMogoTrajectoryOverlay(); + } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt new file mode 100644 index 0000000000..b57ec0b25c --- /dev/null +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/MogoTrajectoryOverlayProvider.kt @@ -0,0 +1,37 @@ +package com.mogo.eagle.core.function.business.trajectoryoverlay + +import android.content.Context +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.trajectory.IMoGoGlobalTrajectoryDrawListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import java.util.concurrent.atomic.AtomicReference + +@Route(path = MogoServicePaths.PATH_MAP_GLOBAL_TRAJECTORY) +class MogoTrajectoryOverlayProvider : IMoGoGlobalTrajectoryDrawListener { + + companion object { + private const val TAG = "MogoTrajectoryOverlayProvider" + } + + private var hasDrawn = AtomicReference(false) + + override fun init(context: Context?) { + CallerLogger.i(TAG, "---init---") + } + + override fun hasDrawnGlobalTrajectory(): Boolean { + return hasDrawn.get() + } + + override fun drawGlobalTrajectory(): Pair { + val result = MogoTrajectoryOverlayManager.getInstance().drawTrajectoryOverlayOnce() + hasDrawn.set(result.first) + return Pair(result.first, result.second) + } + + override fun clearGlobalTrajectory() { + MogoTrajectoryOverlayManager.getInstance().clearTrajectoryOverlay() + hasDrawn.set(false) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java index 7ba5a7beb7..f0ea3d89dc 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java @@ -11,7 +11,6 @@ import android.util.Log; import androidx.core.util.Pools; import com.mogo.eagle.core.data.map.MogoLatLng; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.map.overlay.IMoGoOverlayManager; @@ -37,7 +36,7 @@ public class TrajectoryOverlayDrawer { private static final byte[] obj = new byte[0]; private Polyline.Options mPolylineOptions; private static final int COLOR_LIGHT = Color.parseColor("#BAEBF5"); - + private static final int mPolylineWidth = 50; //用于taxi乘客屏渐变颜色集合 private static List colors = null; @@ -48,7 +47,7 @@ public class TrajectoryOverlayDrawer { if (mogoOverlayManager != null) { mPolylineOptions = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) .setUseGps(true) - .setWidth(30) + .setWidth(mPolylineWidth) .setIsGradient(true) .build(); @@ -86,10 +85,8 @@ public class TrajectoryOverlayDrawer { private class RenderTask implements Runnable { private volatile List routeList; - private final Pools.Pool pools; private final LinkedList points; - private double bearing; public RenderTask() { @@ -120,8 +117,8 @@ public class TrajectoryOverlayDrawer { isExcept = true; return; } -// boolean isColorfulStrategy = !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); - //TODO + //boolean isColorfulStrategy = !AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode); + //全局轨迹线 没有颜色策略,使用固定颜色 boolean isColorfulStrategy = false; if (isColorfulStrategy) { TrajectoryStrategy.INSTANCE.start(); @@ -132,15 +129,15 @@ public class TrajectoryOverlayDrawer { // temps.add(new Pair<>(10, 102)); // temps.add(new Pair<>(30, 51)); // temps.add(new Pair<>(100, 0)); - temps.add(new Pair<>(0, 51)); - temps.add(new Pair<>(10, 51)); - temps.add(new Pair<>(30, 51)); - temps.add(new Pair<>(100, 51)); + temps.add(new Pair<>(0, 100)); + temps.add(new Pair<>(10, 100)); + temps.add(new Pair<>(30, 100)); + temps.add(new Pair<>(100, 100)); List alphas = MapTools.INSTANCE.getColorAlpha(temps); if (alphas != null && !alphas.isEmpty()) { colors = new ArrayList<>(); for (int i : alphas) { - colors.add(Color.argb(i, 48,203,251)); + colors.add(Color.argb(i, 78,121,173)); } } } @@ -168,41 +165,36 @@ public class TrajectoryOverlayDrawer { acquire.lon = longitude; acquire.lat = latitude; } -// acquire.acc = route.getAcceleration(); -// acquire.speed = route.getVelocity(); pps.add(acquire); -// if (isColorfulStrategy) { -//// RouteStrategy.INSTANCE.check(route.getVelocity(), route.getAcceleration(), routeList.size()); -// } } - double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); - double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); +// double lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); +// double lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); if (points.size() > 0) { - MogoLatLng top = null; - while (points.size() != 0) { - MogoLatLng first = points.peek(); - if (first == null) { - continue; - } - if (first == top) { - break; - } - lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); - lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); - long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat); - if (angle >= 90) { - if (isColorfulStrategy) { - TrajectoryStrategy.INSTANCE.remove(first.acc); - } - pools.release(first); - points.poll(); - } - top = first; - } - if (points.size() == 0) { - isExcept = true; - return; - } +// MogoLatLng top = null; +// while (points.size() != 0) { +// MogoLatLng first = points.peek(); +// if (first == null) { +// continue; +// } +// if (first == top) { +// break; +// } +// lon = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLongitude(); +// lat = CallerChassisLocationWGS84ListenerManager.INSTANCE.getChassisLocationWGS84().getLatitude(); +// long angle = isPointOnCarFront(lon, lat, bearing, first.lon, first.lat); +// if (angle >= 90) { +// if (isColorfulStrategy) { +// TrajectoryStrategy.INSTANCE.remove(first.acc); +// } +// pools.release(first); +// points.poll(); +// } +// top = first; +// } +// if (points.size() == 0) { +// isExcept = true; +// return; +// } // MogoLatLng self = pools.acquire(); // if (self == null) { // self = new MogoLatLng(lat, lon); @@ -216,8 +208,8 @@ public class TrajectoryOverlayDrawer { if (mPolylineOptions == null) { builder = new Polyline.Options.Builder("trajectory_overlay", Level.TRAJECTORY_LINE) .setUseGps(true) - .setWidth(20) - .setIsGradient(true); + .setWidth(mPolylineWidth) + .setIsGradient(false); } else { builder = mPolylineOptions.builder(); } @@ -229,16 +221,15 @@ public class TrajectoryOverlayDrawer { boolean isLightOn = strategy instanceof ColorfulStrategy && ((ColorfulStrategy) strategy).isLightOn(); builder.colors(colors); builder.setLightOn(isLightOn); - builder.setLightColor(COLOR_LIGHT); - builder.setLightSpeed(0.3f); + //builder.setLightColor(COLOR_LIGHT); + //builder.setLightSpeed(0.3f); } else { if (colors != null && !colors.isEmpty()) { builder.colors(colors); builder.setIsGradient(true); -// builder.setLightOn(true); builder.setLightOn(false); - builder.setLightColor(COLOR_LIGHT); - builder.setLightSpeed(0.3f); + //builder.setLightColor(COLOR_LIGHT); + //builder.setLightSpeed(0.3f); } } builder.points(points); @@ -289,7 +280,7 @@ public class TrajectoryOverlayDrawer { } } - public void setVisible(boolean isVisible) { + private void setVisible(boolean isVisible) { if (mogoOverlayManager != null) { if (isVisible) { mogoOverlayManager.showAllLinesInLevel(Level.TRAJECTORY_LINE); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt index 5891babd2e..690c56abd2 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryStrategy.kt @@ -4,11 +4,12 @@ import android.animation.ArgbEvaluator import android.graphics.Color import android.view.animation.AccelerateInterpolator import com.mogo.eagle.core.data.config.HmiBuildConfig -import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE -import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_BLUE_DARK -import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_RED_DARK -import com.mogo.eagle.core.function.business.routeoverlay.Colors.Companion.COLOR_TRANSPARENT -import java.util.* +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_BLUE +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_BLUE_DARK +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_RED_DARK +import com.mogo.eagle.core.function.business.trajectoryoverlay.Colors.Companion.COLOR_TRANSPARENT +import java.util.NavigableMap +import java.util.TreeMap import kotlin.properties.Delegates @@ -21,7 +22,7 @@ class Colors { companion object { val COLOR_BLUE = Color.parseColor("#FF2ABAD9") val COLOR_BLUE_DARK = Color.parseColor("#FF074EFF") - val COLOR_RED_DARK = Color.parseColor("#FFFF5F00") + val COLOR_RED_DARK = Color.parseColor("#FF0FF5F0") val COLOR_TRANSPARENT = Color.parseColor("#002ABAD9") } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java index b1460e7ea7..126a82ee37 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/constants/MogoServicePaths.java @@ -103,6 +103,9 @@ public class MogoServicePaths { @Keep public static final String PATH_VISUAL_ANGLE = "/map/angle_change"; + @Keep + public static final String PATH_MAP_GLOBAL_TRAJECTORY = "/map/global_trajectory"; + @Keep public static final String PATH_PATCH_UPGRADE = "/patch/api"; diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt new file mode 100644 index 0000000000..6f86e76437 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/trajectory/IMoGoGlobalTrajectoryDrawListener.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.api.map.trajectory + +import com.alibaba.android.arouter.facade.template.IProvider + +interface IMoGoGlobalTrajectoryDrawListener : IProvider { + + /** + * 是否已经在高精地图绘制了全局轨迹 + */ + fun hasDrawnGlobalTrajectory(): Boolean + + /** + * 在高精地图绘制全局规划 + * @return boolean-是否绘制成功, string-绘制结果原因 + */ + fun drawGlobalTrajectory(): Pair + + /** + * 清除高精地图中的全局轨迹 + */ + fun clearGlobalTrajectory() +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt new file mode 100644 index 0000000000..41c29ee859 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapGlobalTrajectoryDrawManager.kt @@ -0,0 +1,44 @@ +package com.mogo.eagle.core.function.call.map + +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.data.constants.MogoServicePaths +import com.mogo.eagle.core.function.api.map.trajectory.IMoGoGlobalTrajectoryDrawListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger + + +object CallerMapGlobalTrajectoryDrawManager { + + private val provider by lazy { + ARouter.getInstance().build(MogoServicePaths.PATH_MAP_GLOBAL_TRAJECTORY) + .navigation() as? IMoGoGlobalTrajectoryDrawListener + } + + fun init() { + provider?.let { + CallerLogger.i("CallerMapGlobalTrajectoryDrawManager", "--- init ---") + } + } + + /** + * 是否已经在高精地图绘制了全局轨迹 + */ + fun hasDrawnGlobalTrajectory(): Boolean { + return provider?.hasDrawnGlobalTrajectory() ?: false + } + + /** + * 在高精地图绘制全局规划 + * @return boolean-是否绘制成功, string-未绘制原因 + */ + fun drawGlobalTrajectory(): Pair { + return provider?.drawGlobalTrajectory() ?: Pair(false, "provider=null") + } + + /** + * 清除高精地图中的全局轨迹 + */ + fun clearGlobalTrajectory() { + provider?.clearGlobalTrajectory() + } + +} \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt index a1e56e7edd..f997dceb1c 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt @@ -18,7 +18,7 @@ enum class Level(val zIndex: Int) { /** * 全局轨迹线 */ - TRAJECTORY_LINE(74000), + TRAJECTORY_LINE(65000), /** * 前车引导线 From 75d18a6ea7ecc028e990216a429b85f3f39c3c6a Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Thu, 13 Jun 2024 19:13:26 +0800 Subject: [PATCH 20/43] =?UTF-8?q?[650][adas]=20=E5=90=8C=E6=AD=A5=E5=9F=9F?= =?UTF-8?q?=E6=8E=A7=E6=9B=B4=E6=96=B0=E5=90=AF=E5=8A=A8=E8=87=AA=E9=A9=BE?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E4=BA=8B=E4=BB=B6=EF=BC=9B=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6Code=20=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=E4=BA=8B=E4=BB=B6=E5=AE=9A=E4=B9=89=E8=A1=A8?= =?UTF-8?q?=20=E7=AC=AC143=E7=89=88=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zhjt/mogo/adas/data/bean/MogoReport.java | 15 ++++++++++++++- .../support/adas/high/msg/ReportMessage.java | 5 +++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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 7ce0bae69e..91e01db97e 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 @@ -7,7 +7,8 @@ import java.util.Map; /** * 监控事件报告中定义的事件以及解释 - * 根据MAP4.2.0事件定义编写 最后修改于2024-04-07 + * 根据诊断事件定义表 第143版 编写 最后修改于2024-06-13 + * 由于 MAP420及以后版本 诊断事件定义表 中不会标记 新增版本以及弃用版本,所以将不再使用 @ReportState进行版本注解 */ public class MogoReport { public interface Result { @@ -341,6 +342,8 @@ public class MogoReport { @ReportState("4.2.0") String HOST_MEMORY_EXCEED = "EMAP_HOST_MEMORY_EXCEED";//系统内存占用过高 + String ENTRY_AUTOPILOT_FOR_GEAR_NOT_READY = "EMAP_ENTRY_AUTOPILOT_FOR_GEAR_NOT_READY";//档位不正确未进自驾 + } /** @@ -583,6 +586,14 @@ public class MogoReport { @ReportState("4.1.0") String RADAR_CHECK_FAILED = "ECLB_RADAR_CHECK_FAILED";//radar标定自检算法失败,无法判定外参是否正常,建议重试 } + + /** + * EFSM(功能状态管理) + */ + interface EFSM { + @ReportState("4.4.0") + String ENTRY_AUTOPILOT = "EFSM_ENTRY_AUTOPILOT";//FSM因为某些原因未进自驾 + } } /** @@ -973,6 +984,8 @@ public class MogoReport { String REMOTE_PILOT_STATE_CHANGED = "IFSM_REMOTE_PILOT_STATE_CHANGED";//平行驾驶状态机变化 @ReportState("3.5.0") String TELECTRL_PILOT_STATE_CHANGED = "IFSM_TELECTRL_PILOT_STATE_CHANGED";//遥感驾驶状态机变化 + @ReportState("4.4.0") + String RECEIVE_AP_REQUEST = "IFSM_RECEIVE_AP_REQUEST";//FSM收到自驾或平行驾驶或手动驾驶请求信号 } /** diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java index 4c62c50bb4..614c0854a6 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java @@ -61,6 +61,11 @@ public class ReportMessage extends MyAbstractMessageHandler { startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_CHASSIS_FAULT);//控制判断底盘异常,需要重启车辆 //不知道确切的失败原因,需要联系控制进一步排查 startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_UNKNOWN);//不知道确切的失败原因,需要联系控制进一步排查 + + + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.ROUTING_RESPONSE_FAIL);//算路异常,拒绝自动驾驶 + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.TRAJECTORY_AGENT_NOT_READY);//轨迹下载客户端未就绪拒绝轨迹下载请求 + startAutopilotFailCode.add(MogoReport.Code.Error.EFSM.ENTRY_AUTOPILOT);//FSM因为某些原因未进自驾 } @Override From 39f6f085fc9ac3f76b00bbaad4df2a7429daa0a3 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 14 Jun 2024 15:15:40 +0800 Subject: [PATCH 21/43] =?UTF-8?q?[650][adas]=20=E6=96=B0=E5=A2=9EFSM2024?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3;=E6=96=B0=E5=A2=9EFSM2024=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8CFSM=E6=95=B0=E6=8D=AE=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E6=96=B0=E5=A2=9E=E6=A3=80=E6=B5=8B=E8=83=BD=E5=90=A6?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=87=AA=E9=A9=BE440=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E7=89=88=E6=9C=AC=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/adapter/MoGoAdasListenerImpl.kt | 27 ++++++ .../autopilot/IMoGoAutopilotStatusListener.kt | 8 ++ .../api/autopilot/IMoGoFsm2024Listener.kt | 18 ++++ .../CallerAutoPilotStatusListenerManager.kt | 13 +++ .../autopilot/CallerFsm2024ListenerManager.kt | 24 +++++ .../zhjt/mogo/adas/common/MessageType.java | 1 + .../adas/data/bean/LaunchConditionData.java | 40 +++++++-- .../adas/data/bean/UnableLaunchReason.java | 5 +- .../src/main/proto/fsm2024.proto | 53 +++++++++++ .../src/main/proto/message_pad.proto | 4 + .../support/adas/high/OnAdasListener.java | 17 ++++ .../ability/AutopilotAbility440.java | 62 +++++++++++++ .../ability/AutopilotAbilityManager.java | 89 +++++++++++++++---- .../adas/high/msg/FSM2024StateMessage.java | 33 +++++++ .../adas/high/msg/MyMessageFactory.java | 7 ++ 15 files changed, 377 insertions(+), 24 deletions(-) create mode 100644 core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt create mode 100644 core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt create mode 100644 libraries/mogo-adas-data/src/main/proto/fsm2024.proto create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java create mode 100644 libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java 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 c165e1244d..7df0e654c3 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 @@ -74,6 +74,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop import com.zhjt.service.chain.ChainLog import fault_management.FmInfo +import fsm.Fsm2024 import function_state_management.FunctionStates import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject @@ -491,6 +492,16 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerFaultManagementStateListenerManager.invokeFaultManagementState(fmInfo) } + /** + * FSM状态 + * 目前在启动自驾前置条件检测440版本中使用 + * @param header 头 + * @param fsmState 数据 + */ + override fun onFSM2024State(header: MessagePad.Header, fsmState: Fsm2024.FSMStateMsg) { + CallerFsm2024ListenerManager.invokeFSM2024State(fsmState) + } + /** * 数据采集配置应答 */ @@ -938,10 +949,26 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerRoboBusJinlvM1StitchedVideoListenerManager.invokeRoboBusJinlvM1StitchedVideo(data) } + /** + * 域控SSM接口接收超时 + * 状态变动时才会回调,默认SSM状态正常 + * + * @param isTimeout true:SSM接口接收超时 false:SSM接口恢复正常 + */ override fun onSsmReceiveTimeout(isTimeout: Boolean) { CallerAutoPilotStatusListenerManager.invokeSsmReceiveTimeout(isTimeout) } + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + override fun onFsm2024ReceiveTimeout(isTimeout: Boolean) { + CallerAutoPilotStatusListenerManager.invokeFsmReceiveTimeout(isTimeout) + } + /** * 是否可以启动自动驾驶 * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt index e8cba74ab1..b51a0ad17e 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt @@ -56,6 +56,14 @@ interface IMoGoAutopilotStatusListener { */ fun onSsmReceiveTimeout(isTimeout: Boolean) {} + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + fun onFsmReceiveTimeout(isTimeout: Boolean) {} + /** * 工控机主动查询 AdasManager#sendStatusQueryReq(),后会收到如下回调 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt new file mode 100644 index 0000000000..3da37890b7 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoFsm2024Listener.kt @@ -0,0 +1,18 @@ +package com.mogo.eagle.core.function.api.autopilot + +import fsm.Fsm2024 + +/** + * 新版FSM状态 + */ +interface IMoGoFsm2024Listener { + + /** + * FSM状态 + * 目前在启动自驾前置条件检测440版本中使用 + * @param header 头 + * @param fsmState 数据 + */ + fun onFSM2024State(fsmState: Fsm2024.FSMStateMsg) + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 95df93ec34..d2bf8ec4f0 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -236,6 +236,19 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { + + /** + * 绿波通行(单路口)事件推送, 透传 + */ + fun invokeFSM2024State(fsmState: Fsm2024.FSMStateMsg) { + M_LISTENERS.forEach { + val listener = it.value + listener.onFSM2024State(fsmState) + } + } + + +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java index f51b9037b6..90bda6b466 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java @@ -30,6 +30,7 @@ public enum MessageType { TYPE_RECEIVE_M1_STITCHED_VIDEO(MessagePad.MessageType.MsgTypeM1StitchedVideo, "M1拼接视频"), TYPE_RECEIVE_SSM(MessagePad.MessageType.MsgTypeSSMState, "SSM系统状态"), TYPE_RECEIVE_FM_STATE(MessagePad.MessageType.MsgTypeFMState, "FM状态"), + TYPE_RECEIVE_FSM2024_STATE(MessagePad.MessageType.MsgTypeFSM2024State, "FSM状态"), TYPE_RECEIVE_BASIC_INFO_REQ(MessagePad.MessageType.MsgTypeBasicInfoReq, "自动驾驶设备基础信息请求"), TYPE_SEND_BASIC_INFO_RESP(MessagePad.MessageType.MsgTypeBasicInfoResp, "自动驾驶设备基础信息应答"), diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java index e906c4f36b..5cb6b0df08 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/LaunchConditionData.java @@ -11,6 +11,7 @@ import org.json.JSONObject; import chassis.Chassis; import chassis.ChassisStatesOuterClass; +import fsm.Fsm2024; import function_state_management.FSMStatusReasonQueryOuterClass; import system_master.SsmInfo; import system_master.SystemStatusInfo; @@ -45,14 +46,19 @@ public class LaunchConditionData { */ public final SsmInfo.SsmStatusInf ssmInfo; public final FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond;//FSM数据 + public final Fsm2024.FSMStateMsg fsmState;//FSM数据 public final long createTime; + public LaunchConditionData(String abilityVersion, Fsm2024.FSMStateMsg fsmState) { + this(abilityVersion, null, Float.MAX_VALUE, null, null, null, null, fsmState); + } + public LaunchConditionData(String abilityVersion, SystemStatusInfo.StatusInfo statusInfo, SsmInfo.SsmStatusInf ssmInfo, FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) { - this(abilityVersion, null, Float.MAX_VALUE, null, statusInfo, ssmInfo, fsmStatusReasonRespond); + this(abilityVersion, null, Float.MAX_VALUE, null, statusInfo, ssmInfo, fsmStatusReasonRespond, null); } public LaunchConditionData(String abilityVersion, @@ -62,6 +68,17 @@ public class LaunchConditionData { SystemStatusInfo.StatusInfo statusInfo, SsmInfo.SsmStatusInf ssmInfo, FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond) { + this(abilityVersion, chassisStates, oldSteering, light, statusInfo, ssmInfo, fsmStatusReasonRespond, null); + } + + public LaunchConditionData(String abilityVersion, + ChassisStatesOuterClass.ChassisStates chassisStates, + float oldSteering, + Chassis.LightSwitch light, + SystemStatusInfo.StatusInfo statusInfo, + SsmInfo.SsmStatusInf ssmInfo, + FSMStatusReasonQueryOuterClass.FSMStatusReasonRespond fsmStatusReasonRespond, + Fsm2024.FSMStateMsg fsmState) { this.abilityVersion = abilityVersion; this.chassisStates = chassisStates; this.oldSteering = oldSteering; @@ -69,6 +86,7 @@ public class LaunchConditionData { this.statusInfo = statusInfo; this.ssmInfo = ssmInfo; this.fsmStatusReasonRespond = fsmStatusReasonRespond; + this.fsmState = fsmState; createTime = System.currentTimeMillis(); } @@ -78,9 +96,10 @@ public class LaunchConditionData { jsonObject.put("ability_version", abilityVersion); jsonObject.put("create_object_time", createTime); JSONArray array = new JSONArray(); - JSONObject chassisStatesObject = new JSONObject(); - chassisStatesObject.put("name", "ChassisStates"); + JSONObject chassisStatesObject = null; if (chassisStates != null) { + chassisStatesObject = new JSONObject(); + chassisStatesObject.put("name", "ChassisStates"); if (chassisStates.hasHeader()) { chassisStatesObject.put("data_header", TextFormat.printer().escapingNonAscii(false).printToString(chassisStates.getHeader())); } @@ -120,18 +139,27 @@ public class LaunchConditionData { } //车灯 if (light != null) { + if (chassisStatesObject == null) { + chassisStatesObject = new JSONObject(); + chassisStatesObject.put("name", "ChassisStates"); + } chassisStatesObject.put("light", light.name()); } - array.put(chassisStatesObject); + if (chassisStatesObject != null) { + array.put(chassisStatesObject); + } if (statusInfo != null) { - arrayPut(array, statusInfo.getClass().getName(), statusInfo.getAutoPilotReady(), statusInfo.getAutoPilotUnreadyReason()); + arrayPut(array, statusInfo); } if (ssmInfo != null) { - arrayPut(array, ssmInfo.getClass().getName(), ssmInfo.getAutoPilotReady(), ssmInfo.getAutoPilotUnreadyReason()); + arrayPut(array, ssmInfo); } if (fsmStatusReasonRespond != null) { arrayPut(array, fsmStatusReasonRespond); } + if (fsmState != null) { + arrayPut(array, fsmState); + } if (array.length() > 0) { jsonObject.put("data", array); } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java index e0b11d41ed..f966ea314e 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/UnableLaunchReason.java @@ -14,6 +14,7 @@ public class UnableLaunchReason { CHASSIS,//底盤 SSM, FSM, + FSM2024, } /** @@ -31,7 +32,9 @@ public class UnableLaunchReason { CHASSIS_HAZARD_LIGHTS,//危险报警灯 SSM_OFFER,//SSM提供的原因 FSM_OFFER,//FSM提供的原因 - SSM_TIMEOUT//SSM超时 + FSM2024_OFFER,//FSM2024提供的原因 + SSM_TIMEOUT,//SSM超时 + FSM2024_TIMEOUT//FSM2024超时 } /** diff --git a/libraries/mogo-adas-data/src/main/proto/fsm2024.proto b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto new file mode 100644 index 0000000000..ec22d1cc38 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/proto/fsm2024.proto @@ -0,0 +1,53 @@ +syntax = "proto2"; +package fsm; + +import "header.proto"; + +enum State { + OFF = 0; + STANDBY = 1; //Standby 未来会弃用, 并入OFF + ACTIVATING = 2; + PILOT_DRIVING_ACTIVE = 3; //未来会被弃用,所有激活状态统一在Active状态下作为子状态管理 + PARALLEL_DRIVING_ACTIVE = 4; //未来会被弃用,所有激活状态统一在Active状态下作为子状态管理 + SAFETY_STOP = 5; + ACTIVE = 6; +} + +enum SafetyStopMode { + NOT_NEEDED = 0; + PLANNER_STOP = 1; + CONTROLLER_COMFORT_STOP = 2; + CONTROLLER_EMERGENCY_STOP = 3; +} + +enum ActiveMode { + NOT_ACTIVE= 0; + PILOT_ACTIVE= 1; + PARALLEL_ACTIVE= 2; + SIMULATOR_ACTIVE= 3; //模拟器驾驶, M1上专用 +} + +message FSMStateMsg { + required common.Header header = 1; + required State function_state = 2; + required SafetyStopMode fsm_safety_stop_mode = 4; //FSM如果进入safety stop,是planning 进行停车,还是control进行舒适停车,还是control进行紧急停车 + + required ActiveMode active_mode = 6; + + required bool new_msg_flag = 10; + + required bool pilot_standby_flag = 11; + required bool parallel_standby_flag = 12; + required bool simulator_standby_flag = 13; + + optional string pilot_not_standby_reason= 21; //FSM 无法自驾无法就绪的原因。 + optional string parallel_not_standby_reason= 22; //FSM 无法平行即使就绪原因 + optional string simulator_not_standby_reason= 23; //FSM 无法模拟器驾驶原因 + + optional uint64 fail_to_pilot_session_id= 36; + optional uint64 fail_to_parallel_session_id= 37; + optional uint64 fail_to_simulator_session_id= 38; + + optional string abnormal_state_trans_reason= 41; //FSM 异常退出ACTIVATING/自驾/平行驾驶/模拟器驾驶原因 (包括接管) + +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index c6db5a9b33..f19766f18f 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -35,6 +35,7 @@ enum MessageType MsgTypeM1StitchedVideo = 0x1000e; //m1拼接视频 定频10hz MsgTypeSSMState = 0x1000f; //ssm 系统状态 定频1hz hq m1 MAP350开始支持,其他车型MAP360开始支持 MsgTypeFMState = 0x10010; //FM状态 定频1hz bus和清扫车是MAP370开始支持,其他车型MAP360开始支持 + MsgTypeFSM2024State = 0x10011; //20240531 FSM状态 定频10hz (telematics做状态变化判断,无变化10hz上报,有变化立即上报) BUS MAP440开始支持,其他车型暂未支持 //### 以下消息全部不定频 ### MsgTypeBasicInfoReq = 0x10100; //自动驾驶设备基础信息请求 @@ -755,3 +756,6 @@ message SessionInfo //message definition for MsgTypeFMState //refer to fm_info.proto for details + +//message definition for MsgTypeFSM2024State +//refer to fsm2024.proto 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 90afedde94..0503a47d30 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 @@ -30,6 +30,7 @@ import chassis.Chassis; import chassis.ChassisStatesOuterClass; import chassis.VehicleStateOuterClass; import fault_management.FmInfo; +import fsm.Fsm2024; import function_state_management.FunctionStates; import mogo.telematics.pad.MessagePad; import mogo.v2x.MogoV2X; @@ -237,6 +238,14 @@ public interface OnAdasListener { */ void onFaultManagementState(MessagePad.Header header, @NonNull FmInfo.FaultResultMsg fmInfo); + /** + * FSM状态 + * + * @param header 头 + * @param fsmState 数据 + */ + void onFSM2024State(@NonNull MessagePad.Header header, @NonNull Fsm2024.FSMStateMsg fsmState); + /** * 数据采集配置应答 * @@ -488,6 +497,14 @@ public interface OnAdasListener { */ void onSsmReceiveTimeout(boolean isTimeout); + /** + * 域控FSM接口接收超时 + * 状态变动时才会回调,默认FSM状态正常 前提是存在FSM接口 + * + * @param isTimeout true:FSM接口接收超时 false:FSM接口恢复正常 + */ + void onFsm2024ReceiveTimeout(boolean isTimeout); + /** * 是否有能力启动自动驾驶 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java new file mode 100644 index 0000000000..b3de145659 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility440.java @@ -0,0 +1,62 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo.adas.data.bean.LaunchConditionData; +import com.zhjt.mogo.adas.data.bean.UnableLaunchReason; + +import java.util.ArrayList; + +import fsm.Fsm2024; + +/** + * 是否可以启动自动驾驶能力检测 工控机版本>=4400&&(isJinlv||isJinlvM1||isJinlvM) 使用此类 + * 目前监控了FSM2024状态 + */ +public class AutopilotAbility440 { + private final String TAG = this.getClass().getSimpleName(); + + @NonNull + private final AutopilotAbilityManager manager; + private OnAutopilotAbilityListener listener; + + + public AutopilotAbility440(@NonNull AutopilotAbilityManager manager) { + this.manager = manager; + } + + + public void setFSMState(Fsm2024.FSMStateMsg fsmState) { + onCallbackFsm(fsmState); + } + + protected void onCallFsmTimeout() { + onCallbackFsm(null); + } + + protected void onCallbackFsm(Fsm2024.FSMStateMsg fsmState) { + ArrayList unableAutopilotReasons = null;//不能启动自动驾驶原因 + if (fsmState == null) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.LIB, UnableLaunchReason.UnableType.FSM2024_TIMEOUT, "FSM超时无响应"); + } else { + if (!fsmState.getPilotStandbyFlag()) { + unableAutopilotReasons = manager.addUnableAutopilotReason(unableAutopilotReasons, UnableLaunchReason.SourceType.FSM2024, UnableLaunchReason.UnableType.FSM2024_OFFER, fsmState.getPilotNotStandbyReason()); + } + } + if (listener != null) { + boolean isAutopilotAbility = unableAutopilotReasons == null || unableAutopilotReasons.isEmpty();//是否能启动自动驾驶 + listener.onAutopilotAbility(isAutopilotAbility, new LaunchConditionData(this.getClass().getSimpleName(), fsmState), unableAutopilotReasons); + } + } + + + public synchronized void start(OnAutopilotAbilityListener listener) { + this.listener = listener; + + } + + public synchronized void stop() { + this.listener = null; + } + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java index cf32f031a1..8cf5651d40 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 @@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import chassis.Chassis; import chassis.ChassisStatesOuterClass; +import fsm.Fsm2024; import function_state_management.FSMStatusReasonQueryOuterClass; import mogo.telematics.pad.MessagePad; import system_master.SsmInfo; @@ -32,7 +33,7 @@ import system_master.SystemStatusInfo; */ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private static final String TAG = AutopilotAbilityManager.class.getSimpleName(); - protected static final long DEFAULT_SSM_TIMEOUT = 5000L;//SSM超时时间 + protected static final long DEFAULT_TIMEOUT = 5000L;//SSM和FSM超时时间 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 = {"未知状态", "依赖未就绪", "启动中", "运行", "停止", "无法启动状态", "非自动启动状态", "非自动关闭状态"}; @@ -41,24 +42,29 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private OnAdasListener listener; private int mapVersion = -1;//工控机版本 private boolean isFutianSweeper = false;//是否是福田清扫车 + private boolean isJinlv = false;//是否是小巴 private boolean isJinlvM1 = false;//是否是M1 + private boolean isJinlvM2 = false;//是否是M2 private boolean isHQ = false;//是否是HQ private AutopilotAbility230 autopilotAbility230; private AutopilotAbility250 autopilotAbility250; private AutopilotAbility330 autopilotAbility330; private AutopilotAbility350And360 autopilotAbility350And360; private AutopilotAbility360 autopilotAbility360; + private AutopilotAbility440 autopilotAbility440; private Timer startTimer; - private Timer ssmTimeoutTimer;//SSM超时计时器 + private Timer timeoutTimer;//SSM和FSM超时计时器 private long ssmReceiveTime;//SSM接收时间 + private long fsmReceiveTime;//FSM接收时间 private final AtomicBoolean isOldSsmTimeout = new AtomicBoolean(false);//SSM是否超时 老状态 + private final AtomicBoolean isOldFsmTimeout = new AtomicBoolean(false);//FSM是否超时 老状态 private final AtomicBoolean isInitCarConfig = new AtomicBoolean(false);//车辆信息是否初始化 /** * 能启动自动驾驶的档位 */ private Set launchAutopilotGear; - + private boolean isSupportFSM2024 = false; private AutopilotAbilityManager() { } @@ -109,7 +115,9 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { isInitCarConfig.set(true); mapVersion = version; isFutianSweeper = carConfig.getIsFutianSweeper(); + isJinlv = carConfig.getIsJinlv(); isJinlvM1 = carConfig.getIsJinlvM1(); + isJinlvM2 = carConfig.getIsJinlvM2(); isHQ = carConfig.getIsHQ(); initAutopilotAbility(); if (autopilotAbility230 != null) { @@ -165,6 +173,14 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + public void setFSM2024State(Fsm2024.FSMStateMsg fsmState) { + fsmReceiveTime = System.currentTimeMillis(); + onCallFSMTimeout(false); + if (autopilotAbility440 != null) { + autopilotAbility440.setFSMState(fsmState); + } + } + /** * 底盘状态更新 * @@ -197,13 +213,20 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { private void initAutopilotAbility() { stopAllTimer(); - if (mapVersion >= 30600 && isFutianSweeper) { + isSupportFSM2024 = false; + if (mapVersion >= 40400 && (isJinlv || isJinlvM1 || isJinlvM2)) { + isSupportFSM2024 = true; + CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:440"); + if (autopilotAbility440 == null) { + autopilotAbility440 = new AutopilotAbility440(this); + autopilotAbility440.start(this); + } + } else if (mapVersion >= 30600 && isFutianSweeper) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:360清扫车专用"); if (autopilotAbility360 == null) { autopilotAbility360 = new AutopilotAbility360(this); autopilotAbility360.start(this); } - } else if ((mapVersion >= 30500 && (isJinlvM1 || isHQ)) || mapVersion >= 30600) { CupidLogUtils.log(TAG, "能否启动自驾能力检测使用版本:350和360共用"); if (autopilotAbility350And360 == null) { @@ -231,7 +254,7 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } if (autopilotAbility230 == null) { - startSsmTimeoutTimer();//MAP230及以下没有SSM所以不需要超时 + startTimeoutTimer();//MAP230及以下没有SSM和FSM所以不需要超时 } } @@ -270,6 +293,13 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + private void stop440() { + if (autopilotAbility440 != null) { + autopilotAbility440.stop(); + autopilotAbility440 = null; + } + } + private void stopTimer() { if (startTimer != null) { startTimer.cancel(); @@ -298,12 +328,14 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } - private void stopSsmTimeoutTimer() { - if (ssmTimeoutTimer != null) { + private void stopTimeoutTimer() { + if (timeoutTimer != null) { isOldSsmTimeout.set(false); + isOldFsmTimeout.set(false); ssmReceiveTime = 0; - ssmTimeoutTimer.cancel(); - ssmTimeoutTimer = null; + fsmReceiveTime = 0; + timeoutTimer.cancel(); + timeoutTimer = null; } } @@ -311,15 +343,17 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { * 连接工控机成功调用此函数,如果dockerVersion还未获取到将启动最低版本的启动自动驾驶能力检测 * 此函数为保险措施 以防无法获取工控机版本时 也能 正常执行逻辑 */ - public synchronized void startSsmTimeoutTimer() { - if (ssmTimeoutTimer == null) { + public synchronized void startTimeoutTimer() { + if (timeoutTimer == null) { ssmReceiveTime = System.currentTimeMillis(); - ssmTimeoutTimer = new Timer(); - ssmTimeoutTimer.schedule(new TimerTask() { + fsmReceiveTime = System.currentTimeMillis(); + timeoutTimer = new Timer(); + timeoutTimer.schedule(new TimerTask() { @Override public void run() { + //SSM超时检测 long timeDifference = System.currentTimeMillis() - ssmReceiveTime; - if (timeDifference >= DEFAULT_SSM_TIMEOUT) { + if (timeDifference >= DEFAULT_TIMEOUT) { onCallSSMTimeout(true); //超时 if (autopilotAbility250 != null) { @@ -335,8 +369,18 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { autopilotAbility360.onCallTimeout(); } } + //FSM超时检测 + if (isSupportFSM2024) { + timeDifference = System.currentTimeMillis() - fsmReceiveTime; + if (timeDifference >= DEFAULT_TIMEOUT) { + onCallFSMTimeout(true); + if (autopilotAbility440 != null) { + autopilotAbility440.onCallFsmTimeout(); + } + } + } } - }, 1000L, DEFAULT_SSM_TIMEOUT); + }, 1000L, DEFAULT_TIMEOUT); } } @@ -347,14 +391,22 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { } } + private synchronized void onCallFSMTimeout(boolean isTimeout) { + if (isTimeout != isOldFsmTimeout.get()) { + isOldFsmTimeout.set(isTimeout); + listener.onFsm2024ReceiveTimeout(isTimeout); + } + } + private void stopAllTimer() { - stopSsmTimeoutTimer(); + stopTimeoutTimer(); stopTimer(); stop230(); stop250(); stop330(); stop350And360(); stop360(); + stop440(); } public synchronized void stop() { @@ -363,7 +415,10 @@ public class AutopilotAbilityManager implements OnAutopilotAbilityListener { mapVersion = -1; isFutianSweeper = false; isHQ = false; + isJinlv = false; isJinlvM1 = false; + isJinlvM2 = false; + isSupportFSM2024 = false; } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java new file mode 100644 index 0000000000..82821b0bfb --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/FSM2024StateMessage.java @@ -0,0 +1,33 @@ +package com.zhidao.support.adas.high.msg; + +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.CupidLogUtils; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; +import com.zhidao.support.adas.high.protocol.RawData; + +import fsm.Fsm2024; + +/** + * FSM状态 + */ +public class FSM2024StateMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + Fsm2024.FSMStateMsg fsmState = Fsm2024.FSMStateMsg.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("FSM状态", raw.receiveTime); + AutopilotAbilityManager.getInstance().setFSM2024State(fsmState); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onFSM2024State(raw.getHeader(), fsmState); + } + AdasChannel.calculateTimeConsumingBusiness("FSM状态", nowTime); + } + +} 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 cf77bff8e7..b32de8d39d 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 @@ -32,6 +32,7 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg statusQueryRespMessage;//状态查询应答 private IMsg systemStatusMessage;//定频SSM private IMsg faultManagementMessage;//FM状态 + private IMsg fSM2024StateMessage;//FSM状态 private IMsg recordDataConfigRespMessage;//数据采集配置应答 private IMsg planningDecisionStateMessage;//planning决策状态 private IMsg obuWarningDataMessage;//工控机透传OBU V2I数据 @@ -176,6 +177,12 @@ public class MyMessageFactory implements IMyMessageFactory { faultManagementMessage = new FaultManagementMessage(); } return faultManagementMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_FSM2024_STATE.typeCode) { + //FSM状态 + if (fSM2024StateMessage == null) { + fSM2024StateMessage = new FSM2024StateMessage(); + } + return fSM2024StateMessage; } else if (messageType == MessageType.TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP.typeCode) { //数据采集配置应答 if (recordDataConfigRespMessage == null) { From b92b2745e6aacead9f13a332196e59035834cb4f Mon Sep 17 00:00:00 2001 From: aibingbing Date: Wed, 26 Jun 2024 10:26:26 +0800 Subject: [PATCH 22/43] =?UTF-8?q?[646]refactor:=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E8=BD=A8=E8=BF=B9=E5=B1=82=E7=BA=A7&?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../trajectoryoverlay/TrajectoryOverlayDrawer.java | 2 +- .../src/main/java/com/mogo/map/overlay/core/Level.kt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java index f0ea3d89dc..2c06361935 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/trajectoryoverlay/TrajectoryOverlayDrawer.java @@ -137,7 +137,7 @@ public class TrajectoryOverlayDrawer { if (alphas != null && !alphas.isEmpty()) { colors = new ArrayList<>(); for (int i : alphas) { - colors.add(Color.argb(i, 78,121,173)); + colors.add(Color.argb(i, 48,163,255)); } } } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt index f997dceb1c..bed00cfa76 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/overlay/core/Level.kt @@ -10,16 +10,16 @@ enum class Level(val zIndex: Int) { */ MAP_MARKER(100), + /** + * 全局轨迹线 + */ + TRAJECTORY_LINE(35000), + /** * 车道中心线 */ ROAD_CENTER_LINE(40000), - /** - * 全局轨迹线 - */ - TRAJECTORY_LINE(65000), - /** * 前车引导线 */ From 2effcae75d84814f8de50a380c76589cdc23a1b3 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 26 Jun 2024 10:46:58 +0800 Subject: [PATCH 23/43] =?UTF-8?q?[6.4.6]=20[fea]=20[15m+ssm=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8B=A6=E6=88=AA=E6=94=B6=E6=8B=A2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/OchAutoPilotManager.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt index b7769f9dd3..7e99e340a2 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt @@ -1,9 +1,13 @@ package com.mogo.och.common.module.manager.autopilot.autopilot import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoReceiveReceivedAckListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerReceiveReceivedAckListenerManager +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager +import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager import com.zhjt.mogo.adas.common.MessageType import com.zhjt.mogo.adas.data.bean.ReceivedAck import com.zhjt.mogo.adas.data.bean.ReceivedAck.Status @@ -15,6 +19,25 @@ object OchAutoPilotManager : IMoGoReceiveReceivedAckListener { CallerReceiveReceivedAckListenerManager.addListener(TAG,this) } + @JvmStatic + fun canStartAutoPilot(lineId: Number?): String { + return TrajectoryAndDistanceManager.canStartAutopilot(lineId).apply { + if(!isNullOrBlank()){ + // 去启动绘制高精地图上的轨迹 + } + } + } + + @JvmStatic + fun canStartAutoPilotSSM():Boolean{ + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { + ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + + ", 请稍候重试"); + return false + } + return true + } + @JvmStatic fun startAutoPilot(controlParameters: AutopilotControlParameters?) { OchAutopilotAnalytics.triggerStartAutopilotParameters(controlParameters) From 8748712e906a27f89f0321145ac6088fdbc95f2a Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Wed, 26 Jun 2024 11:28:09 +0800 Subject: [PATCH 24/43] =?UTF-8?q?[650][adas]=20=E6=A0=B9=E6=8D=AE=E4=BA=A7?= =?UTF-8?q?=E5=93=81=E9=9C=80=E6=B1=82=EF=BC=8C=E5=BD=93=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E8=87=AA=E9=A9=BE=E6=97=B6=E7=9A=84=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=A6=82=E6=9E=9C=E6=95=B0=E6=8D=AE=E6=98=AFfsm?= =?UTF-8?q?=E5=B0=86=E6=8F=92=E5=85=A5=E6=B6=88=E6=81=AF=E7=9B=92=E5=AD=90?= =?UTF-8?q?=EF=BC=8C=E5=85=B6=E4=BB=96=E6=95=B0=E6=8D=AE=E6=BA=90=E6=8C=89?= =?UTF-8?q?=E7=85=A7=E5=8E=9F=E6=9C=89=E6=96=B9=E5=BC=8F=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/OCHAdasAbilityManager.java | 9 +++++++ .../autopilot/OchAutoPilotManager.kt | 25 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java index cb43850345..0335b46428 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/OCHAdasAbilityManager.java @@ -59,9 +59,18 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo return isAutopilotAbility; } + public String getAbilityVersion() { + return launchConditionData == null ? "" : launchConditionData.abilityVersion; + } + public String getOriginalData() { return launchConditionData == null ? "" : launchConditionData.getJson(); } + + public ArrayList getUnableAutopilotReasons() { + return unableAutopilotReasons; + } + public String getAutopilotUnAbilityReason(){ try { if(unableAutopilotReasons==null||unableAutopilotReasons.isEmpty()){ diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt index 7e99e340a2..ce201d7def 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/autopilot/OchAutoPilotManager.kt @@ -2,9 +2,13 @@ package com.mogo.och.common.module.manager.autopilot.autopilot import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.msgbox.AutopilotMsg +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.function.api.autopilot.IMoGoReceiveReceivedAckListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerReceiveReceivedAckListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.manager.autopilot.OCHAdasAbilityManager import com.mogo.och.common.module.manager.distance.TrajectoryAndDistanceManager @@ -29,10 +33,23 @@ object OchAutoPilotManager : IMoGoReceiveReceivedAckListener { } @JvmStatic - fun canStartAutoPilotSSM():Boolean{ - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); + fun canStartAutoPilotSSM(): Boolean { + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { + val reasons = OCHAdasAbilityManager.getInstance().unableAutopilotReasons + if ("AutopilotAbility440" == OCHAdasAbilityManager.getInstance().abilityVersion && !reasons.isNullOrEmpty()) { + val msg = reasons[0].unableLaunchReason + " 来源:" + reasons[0].source + CallerMsgBoxManager.saveMsgBox( + MsgBoxBean( + MsgBoxType.AUTOPILOT, + AutopilotMsg(0, "自动驾驶启动失败", msg, System.currentTimeMillis()) + ) + ) + } else { + ToastUtils.showLong( + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + + ", 请稍候重试" + ); + } return false } return true From e04b18daccb4e86f183aabbb1a1c9aac3adfd36c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 26 Jun 2024 11:41:18 +0800 Subject: [PATCH 25/43] =?UTF-8?q?[6.4.6]=20[fix]=20[=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/manager/distance/TrajectoryAndDistanceManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt index d5b067bbab..0b94e6c161 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/distance/TrajectoryAndDistanceManager.kt @@ -660,7 +660,7 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { * 返回空为可启动自驾 * 返回其他不可启动自驾 返回为原因 */ - fun canStartAutopilot(lineId: Long?): String { + fun canStartAutopilot(lineId: Number?): String { if (lineId == null) { OchAutopilotAnalytics.triggerDistance2LineorStation("未传轨迹ID") return "请确认线路ID" From ae1a678ee80d8581e8e8e7cb4142bfffcfe62655 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 26 Jun 2024 12:04:02 +0800 Subject: [PATCH 26/43] =?UTF-8?q?[6.4.6]=20[fea]=20[=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E9=AB=98=E7=B2=BE=E5=9C=B0=E5=9B=BE=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mogo/och/bus/model/OrderModel.java | 17 +++-- .../src/main/res/layout/bus_base_fragment.xml | 11 +++- .../mogo/och/charter/model/DriverM1Model.kt | 24 ++++--- .../main/res/layout/charter_base_fragment.xml | 10 ++- .../passenger/model/CharterPassengerModel.kt | 10 +-- .../manager/autopilot/line/LineManager.kt | 31 +++++++++ .../module/wigets/map/drawline/LineView.kt | 60 ++++++++++++++++++ .../wigets/map/orderstatus/OrderStatusView.kt | 2 +- .../drawable-nodpi/common_map_line_close.png | Bin 0 -> 20341 bytes .../drawable-nodpi/common_map_line_open.png | Bin 0 -> 24632 bytes .../mogo/och/shuttle/model/OrderModel.java | 15 +++-- .../main/res/layout/shuttle_base_fragment.xml | 10 ++- .../com/mogo/och/taxi/model/TaxiModel.java | 8 +-- .../och/taxi/presenter/TaxiPresenter.java | 4 +- .../main/res/layout/taxi_base_fragment.xml | 11 +++- .../taxi/passenger/model/AutopilotManager.kt | 10 +-- .../taxi/ui/routing/TaxiRoutingModel.kt | 7 +- .../taxi/ui/task/TaxiCurrentTaskViewModel.kt | 2 + .../unmanned/taxi/ui/task/TaxiTaskModel.kt | 16 ++--- .../layout/unmanned_taxi_base_fragment.xml | 11 +++- .../passenger/model/AutopilotManager.kt | 7 +- 21 files changed, 201 insertions(+), 65 deletions(-) create mode 100644 OCH/common/common/src/main/java/com/mogo/och/common/module/manager/autopilot/line/LineManager.kt create mode 100644 OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/map/drawline/LineView.kt create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_map_line_close.png create mode 100644 OCH/common/common/src/main/res/drawable-nodpi/common_map_line_open.png diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java index 41484f0972..19b8786a6a 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java @@ -48,6 +48,7 @@ import com.mogo.och.bus.util.BusSendTripInfoManager; import com.mogo.och.bus.util.BusTrajectoryManager; import com.mogo.och.bus.util.BusVoiceManager; import com.mogo.och.common.module.manager.autopilot.autopilot.OchAutoPilotManager; +import com.mogo.och.common.module.manager.autopilot.line.LineManager; import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener; import com.mogo.och.common.module.manager.socket.lan.LanSocketManager; import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg; @@ -197,6 +198,8 @@ public class OrderModel { }); } + // 初始化调用 + // 登录状态发生变化调用 public void queryBusCacheRoutes(){ String loginStr = CacheDataManager.Companion.getInstance().getCacheData( @@ -720,7 +723,7 @@ public class OrderModel { FunctionBuildConfig.isPassStartAutopilotCommand); //3、距离轨迹15m计算 - String resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long)busRoutesResult.getLineId()); + String resion = OchAutoPilotManager.canStartAutoPilot(busRoutesResult.getLineId()); if(TrajectoryAndDistanceManager.errorTypeNoneLineId.equals(resion)){ MogoLocation nextStationPoint = new MogoLocation(); if (backgroundCurrentStationIndex < stationList.size() - 1) { @@ -733,7 +736,7 @@ public class OrderModel { currentStationPoint.setLongitude(busStationBean.getGcjLon()); currentStationPoint.setLatitude(busStationBean.getGcjLat()); setTrajectoryStation(currentStationPoint,nextStationPoint, (long)busRoutesResult.getLineId()); - resion = TrajectoryAndDistanceManager.INSTANCE.canStartAutopilot((long)busRoutesResult.getLineId()); + resion = OchAutoPilotManager.canStartAutoPilot(busRoutesResult.getLineId()); } if(!StringUtils.isEmpty(resion)){ ToastUtils.showShort(resion); @@ -742,9 +745,7 @@ public class OrderModel { } //4、ssm 给出数据 - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); + if (!OchAutoPilotManager.canStartAutoPilotSSM()) { triggerUnableStartAPReasonEvent(); return; } @@ -962,11 +963,15 @@ public class OrderModel { * @param result */ private void updateBusStatus(BusRoutesResult result) { - if (result == null) return; + if (result == null) { + LineManager.setLineId(-1); + return; + } busRoutesResult = result; List site = result.getSites(); currentTaskId = result.getTaskId(); currentLineId = result.getLineId(); + LineManager.setLineId(currentLineId); stationList.clear(); stationList.addAll(site); diff --git a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml index a32dea82da..8e2b52baa1 100644 --- a/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml +++ b/OCH/bus/driver/src/main/res/layout/bus_base_fragment.xml @@ -258,6 +258,7 @@ android:layout_height="@dimen/dp_142"/> + + + +