android gps機制分析--定位資料HAL處理
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層。