android gps机制分析--之六

3 Modem流程分析

modem_proc\gps\gnss\loc_mw\src\ loc_task.c


首先初始化middlewaremodule,设置IPC以及timers,初始化QMI等一系列工作:

android gps机制分析--之六_第1张图片

通过os_IpcReceive接受消息,调用loc_middleware_proc对p_msg进行处理:

android gps机制分析--之六_第2张图片

在loc_middleware_proc函数里根据p_msg的MsgId判断消息类型,再调用不同的处理函数:


在locQmiShimProcessIpc函数中,与location相关的命令再调用locQmiShimProcessInitQmiLoc函数处理:

modem_proc\gps\gnss\loc_mw\src\loc_qmi_shim.c

android gps机制分析--之六_第3张图片
android gps机制分析--之六_第4张图片

在这个函数里注册了locQmiShimClientConnectCb这个回调:

android gps机制分析--之六_第5张图片

而这个回调函数主要的作用是通知shim层连接的到来,初始化连接,触发loc:

android gps机制分析--之六_第6张图片


在locQmiShimEventCb回调中,第二个参数是e_LocEvent,即loction事件,函数根据这个事件的类型,调用相关的处理函数,我们这边只关注LOC_EVENT_PARSED_POSITION_REPORT事件类型,即解析后的position的report事件:

modem_proc/gps/gnss/loc_mw_inc/loc_api_2.h


android gps机制分析--之六_第7张图片
android gps机制分析--之六_第8张图片

往下调用了locQmiHandleParsedPositionReport函数,通过解析第二个参数pz_ParsedPositionRpt,

解析出经纬度等GPS信息,填充到pz_IndInfo:

android gps机制分析--之六_第9张图片

这里我们看到这个数据结构:qmiLocEventPositionReportIndMsgT_v02,也就是在ap侧解析的GPS的event信息,

并最终剥离出上层能够识别的GpsLocation数据结构的:




这里使用到一个宏:LOC_QMI_SHIM_SET_VALUE,作用就是验证variable是否有效,如果有效,就把value的值赋值给variable:



在函数最后,将q_Id的值设为QMI_LOC_EVENT_POSITION_REPORT_IND_V02,

AP侧在eventCb里根据QMI_LOC_EVENT_POSITION_REPORT_IND_V02做判断,调用reportPosition方法继续传输数据。

你可能感兴趣的:(---【gps框架分析】)