android gps机制分析--之八

来源:互联网 发布:asp手机考试系统源码 编辑:程序博客网 时间:2024/06/12 08:58

5 gps数据从modem到AP

从loc_api层的locClientIndCb开始走起:

vendor/qcom/opensource/location/loc_api/loc_api_v02/loc_api_v02_client.c

locClientIndCb的主要作用是根据indications的类型,将解析出来的数据发给相应的callback处理:


首先获取message的size和indType,后面根据IndType判断indication的类型:


解析qmi message,ind_bug是传入数据,indBuffer是解析之后的数据;


Qmi_client_message_decode返回QMI_NO_ERR,并且解析的indType是eventIndType后,

走下面的流程,eventCallback赋值给了localEventCallback,解析出来的数据indBuffer赋值给了eventIndUnion.pPositionReportEvent,

其中pPositionReportEvent的数据类型是qmiLocEventPositionReportIndMsgT_v02:


qmiLocEventPositionReportIndMsgT_v02里包含了latitude、longitude等位置信息:


上面eventCallback赋值给了localEventCallback,其实也就是赋值给了后面的globalEventCb,

在继续往下之前,我们看一下globalEventCb的绑定过程:

vendor/qcom/opensource/location/loc_api/loc_api_v02/LocApiV02.cpp




globalCallbacks的赋值又是一个典型的callback绑定动作,由于类型是locClientCallbacksType,

所以是把globalEventCb绑定到locClientCallbacksType的一个成员函数上,这个成员函数就是eventIndCb。

vendor/qcom/opensource/location/loc_api/loc_api_v02/loc_api_v02_client.h


继续回到locClientOpen函数中,又调用了locClientOpenInstance:

vendor/qcom/opensource/location/loc_api/loc_api_v02/loc_api_v02_client.c



到此,eventCallback跟eventIndCb成功绑定,也就是说eventCallback 跟globalEventCb绑定在一起了,

由于eventCallback在前面绑定到了localEventCallback,所以就是说localEventCallback绑定的是globalEventCb;

因此对localEventCallback的调用,也就是调用了globalEventCb:

vendor/qcom/opensource/location/loc_api/loc_api_v02/LocApiV02.cpp


由于locApaV02Instance是LocApiV02类型的,所以调用到了LocApiV02的eventCb函数,在eventCb里根据eventId做判断,如果eventId是QMI_LOC_EVENT_POSITION_REPORT_IND_V02,则调用reportPosition: