{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508999245,"data":{"id":71713927,"title":"17.7.4 引导一致性","slug":"xdqcy3","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"

场景图

说明:

主副屏透出相同的引导信息,均可发起引导信息请求,均可发起引导操作。

多屏通道初始化后默认开启该功能。需要注意的是引导服务需要在通道服务和视图服务初始化后再做初始化,且依赖定位和算路一致性的对接。

特殊接口:

IRouteConsisAdditionObserver::onGetNaviPath

任何一端主动发起了setNaviPath之后,AutoSDK内部多屏通道都会对另外一端的HMI触发回调IRouteConsisAdditionObserver::onGetNaviPath。原因是:主动发起setNaviPath的端,做了向AutoSDK设置路线的操作,假设我们称路线集合为P1,因为SDK要确保多屏行中体验的一致性,所以另外一端的AutoSDK会主动向HMI索要对应的路线集合P2,。P2和P1是完全相同一致的路线。

这个函数的实现见关联的代码示例,一定不能实现错。见本章节最后的代码调用示例,要按照示例代码给出SDK需要的路线集合,往路线集合中装填,SDK的业务逻辑需要使用。不能给出路线,也不能多给路线,或少给路线。

时序图

定位一致性

主副屏引导一致

主副屏引导不一致

说明:主副屏可以实现主屏进入引导,但副屏不进入引导(不跟随进引导),再后续根据需要进入引导状态(不同步进引导)。

算路一致性

核心接口

ChannelMsgSyncController ChannelService.setAdapter(IConsisMessageAdapter consisAdapter)

业务类型

接口作用

接口名

切换引导状态

开始导航

guide.GuideService.startNavi

停止导航

guide.GuideService.stopNavi

恢复导航

guide.GuideService.resumeNavi

暂停导航

guide.GuideService.pauseNavi

设置导航路线

guide.GuideService.setNaviPath

设置导航主路线

guide.GuideService.selectMainPathID

引导参数配置

配置引导参数

guide.GuideService.setParam

设置信息参数

guide.GuideService.setExtraInfoParam

设置信息数据

guide.GuideService.setExtraInfoData

设置定制化播报内容

guide.GuideService.setCustomizationInfo

忽略换路通知

guide.GuideService.ignorePathSugguestion

获取引导信息

获取在线转向图标

guide.GuideService.obtainManeuverIconData

获取在线高级特效转向图标

guide.GuideService.obtainAdvancedManeuverIconData

获取出口编号和路牌方向信息

guide.GuideService.obtainExitDirectionInfo

获取服务区和收费站信息

guide.GuideService.obtainSAPAInfo

获取引导线数据

guide.GuideService.queryAppointLanesInfo

引导信息通知

巡航信息通知

guide.observer.ICruiseObserver

导航信息通知

guide.observer.INaviObserver

引导操作切换

guide.observer.IGuideOperateObserver

     说明:函数详情,请复制函数名称到在线API搜索

调用示例

初始化时序示例

需要关注的是多屏服务和引导服务的初始化时序。

/*< 获取通道服务实例 */\nChannelService mChannelService = (ChannelService)ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.ChannelServiceID);\nif (mChannelService == null) {\n    return false;\n}\n\n/*< 通道服务初始化 */\nChannelInitParam initParam = new ChannelInitParam();\n...\nmChannelService.init(initParam);\n\n...\n    \n/*< 初始化定位服务,在多屏服务初始化后再做 */\nmPosService.init();\n\n/*< 初始化算路服务,在多屏服务初始化后再做 */\nmRouteService.init();\n\n/*< 初始化引导服务,在多屏服务初始化后再做 */\nmGuideService.init();\n\n/*< 设置一致性通道接收端数据交互,MultiChannelMsgAdapter定义见“IConsisMessageAdapter 实现示例” */\nIConsisMessageAdapter consisAdapter = new IConsisMessageAdapter();\nChannelMsgSyncController notify = mChannelService.setDataTransfer(consisAdapter);

IConsisMessageAdapter 实现示例

\nclass MultiChannelMsgAdapter extends IConsisMessageAdapter\n{\n\t@Override\n    public boolean onStartNavi(int id, NaviType type, int resultCode)\n    {\n        //转到主线程\n        PostToMainThread(onStartNaviMainThread, id, type, resultCode);\n    }\n    \n    public boolean onStartNaviMainThread(int id, NaviType type, int resultCode)\n    {\n        //做预置操作\n    \t{\n            //预置操作举例:绘制路线\n            drawGuidePath(id, type);\n            //其他预置操作\n            ...\n        }\n        \n        //通知一致性模块开始导航\n        notify->startNavi(0, bl::NaviTypeSimulation, resultCode);\n        return true;\n    }\n       \n    //IConsisMessageAdapter中其余5个接口都按上述流程处理\n    ...\n\n    //需要特殊处理的接口:onSetNaviPath\n\t@Override\n    public boolean onSetNaviPath(NaviPath naviPath, long mainIndex, int resultCode)\n    {\n    \t//先在SDK回调线程中,对naviPath进行拷贝操作\n        {\n            NaviPath naviPathCopy = new NaviPath();\n            naviPathCopy.setScene(naviPath.getScene());\n            naviPathCopy.setStrategy(naviPath.getStrategy());\n            naviPathCopy.setType(naviPath.getType());\n            naviPathCopy.setVecPaths(naviPath.getVecPaths());\n            POIForRequest srcPoi = naviPath.getPoint();\n            POIForRequest desPoi = POIForRequest.create();\n            desPoi.copy(srcPoi);\n            naviPathCopy.setPoint(desPoi);\n        }\n                \n        //转到主线程\n        PostToMainThread(onStartNaviMainThread, naviPathCopy, mainIndex, resultCode);\n    }\n}\n\n

OnGetNaviPath实现示例

public void onGetNaviPath(ArrayList<ConsisPathIdentity> identities, \n                          ArrayList<PathInfo> paths)\n{\n\tfor(int idIdx = 0; idIdx < identities.size(); idIdx ++)\n    {\n    \tConsisPathIdentity iden = identities[idIdx];\n        \n        boolean bFind = False;\n        \n        // pathList是HMI自己缓存的路线规划结果\n        for(int hmiIdx = 0; hmiIdx < pathList.size(); hmiIdx++)\n        {\n        \tPathInfo path = pathList[hmiIdx];\n            \n            if(iden.isOnline == path.isOnline())\n            {\n                // 在线路线, 使用pathId判断\n                if(iden.isOnline)\n                {\n                    if(iden.pathId == path.getPathId())\n                    {\n                        paths.add(path);\n                        bFind = true;\n                        break;\n                    }                \n                }\n\t\t\t\t// 离线路线,pathId大概率是不一致的,使用offlineIdenStr进行判断\n                if(False == iden.isOnline)\n                {                    \n                    String offlineIdenStrpath.getOfflineReqCustomIdentityId();\n                    if(iden.offlineIdentityId.equals(offlineIdenStr))\n                    {\n                        paths.add(path);\n                        bFind = True;\n                        break;\n                    }                \n                }                \n            }\n        }\n        \n        if(False == bFind)\n        {\n        \t// HMI无法给出SDK需要的路线,输出报错日志,方便排查问题\n        }\n    }\n}
","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-11-17 08:48:59","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":89,"collectCount":0,"estimateDate":12,"docStatus":0,"permissions":true,"overView":false}}