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