{"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);
\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
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}