android gps機制分析--定位資料HAL處理

Achillisjack發表於2017-05-21

6 gps資料在HAL中處理

reportPosition的實現,前面提到的包含了position資訊的qmiLocEventPositionReportIndMsgT_v02資料型別作為引數傳入:


解析出qmiLocEventPositionReportIndMsgT_v02裡的相應的資料,填充到UlpLocation結構中,

以下是經緯度,填充到UlpLocation location.gpsLocation中,當然也包含了Altitude、Heading、accuracy等值的填充;


最後UlpLocation填充完成,當然UlpLocation的成員變數GpsLocation也相應的填充完成了,呼叫:


LocApiBase::reportPosition的實現:

hardware/qcom/gps/core/LocApiBase.cpp

LocApiBase::reportPosition裡有一個TO_ALL_LOCADAPTERS的巨集定義:



看下TO_ALL_ADAPTERS的定義,大致意思應該是針對每個LocAdapterBase*型別的adapter依次呼叫他們的reportPosition方法:

hardware/qcom/gps/core/LocApiBase.h 


具體來看下LocAdapterBase的reportPosition方法的具體實現:

hardware/qcom/gps/core/LocAdapterBase.cpp


mLocAdapterProxyBase包含在LocAdapterBase類中:




reportPosition的定義,這是一個虛擬函式,也就是說具體實現需要看子類,關於reportPosition的具體實現,

我們可以在LocalAdapterBase的子類LocInternalAdapter裡面看下,具體定義如下:


new出來的LocEngReportPosition物件的第二個引數是傳入的UlpLocation型別的資料,

sendMsg函式通過msg_q_snd會把msg傳送到訊息佇列mQ中:

hardware/qcom/gps/core/MsgTask.cpp


然後run函式通過msg_q_rcv接受訊息佇列mQ的訊息,讀取msg,依次執行msg的log()和proc():


msg是LocMsg型別的資料,其中proc是一個虛擬函式,需要在其子類中實現:


LocEngReportPosition恰好是LocMsg的子類:


看一下LocEngReportPosition:proc的實現:

hardware/qcom/gps/loc_api/libloc_api_50001/loc_eng.cpp


把location的資訊通過location_cb傳遞給android framework層:



小結:Position資訊在loc_api層是qmiLocEventPositionReportIndMsgT_v02型別的資料,

在LocApiV02 :: reportPosition函式裡面轉換成UlpLocation型別的資料,然後經過一系列步驟傳送到message queue中,

MsgTask:run函式從message queue中取出相應的資料,然後呼叫proc()函式,在proc()函式裡loc eng層的callback

把資料轉換成GpsLocation型別的資料,再傳遞到android framework層。

相關文章