天天看点

android gps机制分析--之六3 Modem流程分析

3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析

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

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

android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析

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

modem_proc/gps/gnss/loc_mw_inc/loc_api_2.h

android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析

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

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

android gps机制分析--之六3 Modem流程分析

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

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

android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析

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

android gps机制分析--之六3 Modem流程分析
android gps机制分析--之六3 Modem流程分析

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

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