android gps机制分析--定位数据HAL处理

本文转载自:http://blog.csdn.net/u012439416/article/details/72612197

6 gps数据在HAL中处理

reportPosition的实现,前面提到的包含了position信息的qmiLocEventPositionReportIndMsgT_v02数据类型作为参数传入:

android gps机制分析--定位数据HAL处理

解析出qmiLocEventPositionReportIndMsgT_v02里的相应的数据,填充到UlpLocation结构中,

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

android gps机制分析--定位数据HAL处理

最后UlpLocation填充完成,当然UlpLocation的成员变量GpsLocation也相应的填充完成了,调用:

android gps机制分析--定位数据HAL处理

LocApiBase::reportPosition的实现:

hardware/qcom/gps/core/LocApiBase.cpp

LocApiBase::reportPosition里有一个TO_ALL_LOCADAPTERS的宏定义:

android gps机制分析--定位数据HAL处理
android gps机制分析--定位数据HAL处理

看下TO_ALL_ADAPTERS的定义,大致意思应该是针对每个LocAdapterBase*类型的adapter依次调用他们的reportPosition方法:

hardware/qcom/gps/core/LocApiBase.h 

android gps机制分析--定位数据HAL处理

具体来看下LocAdapterBase的reportPosition方法的具体实现:

hardware/qcom/gps/core/LocAdapterBase.cpp

android gps机制分析--定位数据HAL处理

mLocAdapterProxyBase包含在LocAdapterBase类中:

android gps机制分析--定位数据HAL处理
android gps机制分析--定位数据HAL处理

reportPosition的定义,这是一个虚函数,也就是说具体实现需要看子类,关于reportPosition的具体实现,

我们可以在LocalAdapterBase的子类LocInternalAdapter里面看下,具体定义如下:

android gps机制分析--定位数据HAL处理

new出来的LocEngReportPosition对象的第二个参数是传入的UlpLocation类型的数据,

sendMsg函数通过msg_q_snd会把msg发送到消息队列mQ中:

hardware/qcom/gps/core/MsgTask.cpp

android gps机制分析--定位数据HAL处理

然后run函数通过msg_q_rcv接受消息队列mQ的消息,读取msg,依次执行msg的log()和proc():

android gps机制分析--定位数据HAL处理

msg是LocMsg类型的数据,其中proc是一个虚函数,需要在其子类中实现:

android gps机制分析--定位数据HAL处理

LocEngReportPosition恰好是LocMsg的子类:

android gps机制分析--定位数据HAL处理

看一下LocEngReportPosition:proc的实现:

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

android gps机制分析--定位数据HAL处理

把location的信息通过location_cb传递给Android framework层:

android gps机制分析--定位数据HAL处理

小结:Position信息在loc_api层是qmiLocEventPositionReportIndMsgT_v02类型的数据,

在LocApiV02 :: reportPosition函数里面转换成UlpLocation类型的数据,然后经过一系列步骤发送到message queue中,

MsgTask:run函数从message queue中取出相应的数据,然后调用proc()函数,在proc()函数里loc eng层的callback

把数据转换成GpsLocation类型的数据,再传递到android framework层。


自我总结: