Android GPS数据上报(基于gps_qemu.c)(一)

2014-11-24 10:44:19 ? 作者: ? 浏览: 0

在网上找了好久关于这方面的东西,可都是介绍启动的,现在我把我理解的其数据上报的流程写下来,以作记录:


(主要基于gps_qemu.c的数据上报)


hardware/libhardware_legacy/gps/gps_qemu.c(HAL层)


数据从串口传上来主要是通过函数static void* gps_state_thread( void* arg )接收,并解析上报给


android_location_GpsLocationProvider.cpp(JNI层)的,下面首先来看gps_state_thread中数据抓取及数据解析:


else if (fd == gps_fd)


{


char buff[32];


D("gps fd event");


for (;;) {


int nn, ret;



ret = read( fd, buff, sizeof(buff) );//从串口获取数据)


if (ret < 0) {


if (errno == EINTR)


continue;


if (errno != EWOULDBLOCK)


LOGE("error while reading from gps daemon socket: %s:", strerror(errno));


break;


}


D("received %d bytes: %.*s", ret, ret, buff);


for (nn = 0; nn < ret; nn++)


nmea_reader_addc( reader, buff[nn] );//解析数据并上报)


}


D("gps fd event end");


}


接下来看nmea_reader_addc函数(在gps_qemu.c中):


if (c == '/n') {


nmea_reader_parse( r ); //解析数据并上报


r->pos = 0;


}


函数nmea_reader_parse( NmeaReader* r )(在gps_qemu.c中)


if (r->callback) {


r->callback( &r->fix ); //这句就是上报数据了


r->fix.flags = 0;


}


else {


D("no callback, keeping data until needed !");


}


=====================================注释一===================================


这里有个回调函数r->callback,这个回调函数是在gps_state_thread函数中通过nmea_reader_set_callback函数设置的,nmea_reader_set_callback中有这样的语句:


r->callback = cb;//这就是设定了


而在gps_state_thread中传给nmea_reader_set_callback的state->callbacks.location_cb参数是在这里设定的


static int qemu_gps_init(GpsCallbacks* callbacks)


{


GpsState* s = _gps_state;


if (!s->init)


gps_state_init(s);


if (s->fd < 0)


return -1;


s->callbacks = *callbacks;


return 0;


}


而函数qemu_gps_init是在qemuGpsInterface结构体中被JNI(c/c++部分)层调用的,在JNI(c/c++部分)层怎样调用,这将在注释二中解释


============================================================================


在这里,数据在HAL层的路已经走完,下面就进入到JNI(c/c++部分)层android_location_GpsLocationProvider.cpp中了


在这层中首先接收到数据的是函数location_callback:


memcpy(&sGpsLocation, location, sizeof(sGpsLocation));//这里把接收到的数据传给sGpsLocation结构体


接着再在android_location_GpsLocationProvider_wait_for_event中:


if (pendingCallbacks & kLocation)


memcpy(&sGpsLocationCopy, &sGpsLocation, sizeof(sGpsLocationCopy));//把数据传给sGpsLocationCopy结构体


。。。。。。。这里省略了几行。。。。。。


if (pendingCallbacks & kLocation) {


env->CallVoidMethod(obj, method_reportLocation, sGpsLocationCopy.flags, //把数据上报给上层(注释二中解释相关函数)


(jdouble)sGpsLocationCopy.latitude, (jdouble)sGpsLocationCopy.longitude,


(jdouble)sGpsLocationCopy.altitude,


(jfloat)sGpsLocationCopy.speed, (jfloat)sGpsLocationCopy.bearing,


(jfloat)sGpsLocationCopy.accuracy, (jlong)sGpsLocationCopy.timestamp);


}


=====================================注释二===================================



在这一层里location_callback,是怎样接收到数据呢?


其实这个函数是作为一个回调函数,在HAL层中调用的,其是通过调用qemu_gps_init函数把location_callback注册到HAL层中的


我没看下调用qemu_gps_init,在函数android_location_GpsLocationProvider_init(JNI层):


if (!sGpsInterface)


sGpsInterface = gps_get_interface();//这句是获得在HAN层定义的GpsInterface指针,gps_get_interface


//定义在hardware/libhardware_legacy/gps/gps.cp

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: