1. 程式人生 > >android gps機制分析--之六

android gps機制分析--之六

3 Modem流程分析

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


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


通過os_IpcReceive接受訊息,呼叫loc_middleware_proc對p_msg進行處理:


在loc_middleware_proc函式里根據p_msg的MsgId判斷訊息型別,再呼叫不同的處理函式:


在locQmiShimProcessIpc函式中,與location相關的命令再呼叫locQmiShimProcessInitQmiLoc函式處理:

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



在這個函式裡註冊了locQmiShimClientConnectCb這個回撥:


而這個回撥函式主要的作用是通知shim層連線的到來,初始化連線,觸發loc:



在locQmiShimEventCb回撥中,第二個引數是e_LocEvent,即loction事件,函式根據這個事件的型別,呼叫相關的處理函式,我們這邊只關注LOC_EVENT_PARSED_POSITION_REPORT事件型別,即解析後的position的report事件:

modem_proc/gps/gnss/loc_mw_inc/loc_api_2.h




往下呼叫了locQmiHandleParsedPositionReport函式,通過解析第二個引數pz_ParsedPositionRpt,

解析出經緯度等GPS資訊,填充到pz_IndInfo:


這裡我們看到這個資料結構: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方法繼續傳輸資料。