天天看點

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方法繼續傳輸資料。