android gps机制分析--之八

5 gps数据从modem到AP

从loc_api层的locClientIndCb开始走起:

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

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

android gps机制分析--之八_第1张图片

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


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

android gps机制分析--之八_第2张图片

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

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

其中pPositionReportEvent的数据类型是qmiLocEventPositionReportIndMsgT_v02:


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

android gps机制分析--之八_第3张图片

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

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

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



android gps机制分析--之八_第4张图片

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

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

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

android gps机制分析--之八_第5张图片

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

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


android gps机制分析--之八_第6张图片

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

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

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

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

android gps机制分析--之八_第7张图片

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

android gps机制分析--之八_第8张图片

你可能感兴趣的:(---【gps框架分析】)