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

来源:互联网 发布:单片机cy标志为 编辑:程序博客网 时间:2024/06/05 19:20

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层。

原创粉丝点击