本文转载自:http://blog.csdn.net/u012439416/article/details/72612197
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层。
自我总结: