- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
Android GPS架构分析(四)
ROMan">
言归正传,分析sgpsInterface->init方法。
gps_qume.c
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;
}
在sGpsInterface->init中,也就是在qemu_gps_init方法,首先调用了gps_state_init,其次注册了回调函数,再说一次,这个回调函数就是在JNI层实现的,而且有JNI层传下来的函数。
static void
gps_state_init( GpsState* state )
{
state->init = 1;
state->control[0] = -1;
state->control[1] = -1;
state->fd = -1;
state->fd = qemu_channel_open(&state->channel,
QEMU_CHANNEL_NAME,
O_RDONLY );
if (state->fd < 0) {
D("no gps emulation detected");
return;
}
D("gps emulation will read from '%s'qemud channel", QEMU_CHANNEL_NAME );
if ( socketpair( AF_LOCAL, SOCK_STREAM, 0,state->control ) < 0 ) {
LOGE("could not create thread controlsocket pair: %s", strerror(errno));
goto Fail;
}
if ( pthread_create( &state->thread,NULL, gps_state_thread, state ) != 0 ) {
LOGE("could not create gps thread:%s", strerror(errno));
goto Fail;
}
D("gps state initialized");
return;
Fail:
gps_state_done( state );
}
在这个gps_state_init函数中,首先打开串口,然后建立socket通信,然后建立线程监听底层数据上报,分别对应于代码中黄低部分。
3)建立线程监听事件
mEventThread = new GpsEventThread();
mEventThread.start();
来看看GpsEventThread的run函数。
public void run() {
if (DEBUG) Log.d(TAG, "GpsEventThreADStarting");
// Exit as soon as disable() is calledinstead of waiting for the GPS to stop.
while (mEnabled) {
// this will wait for an event from theGPS,
// which will be reported viareportLocation or reportStatus
native_wait_for_event();
}
if (DEBUG) Log.d(TAG, "GpsEventThreadexiting");
}
}
run函数中还是需要调用native函数:JNI:android_location_GpsLocationProvider_wait_for_event函数。这个函数就是在一个while循环里面等待事件的触发(由回调函数触发),然后调用GpsLocationProvider类的数据上报函数(Location数据)。这个在后面还会讲到。
static voidandroid_location_GpsLocationProvider_wait_for_event(JNIEnv* env, jobject obj)
{
pthread_mutex_lock(&sEventMutex);
while (sPendingCallbacks == 0) {
pthread_cond_wait(&sEventCond,&sEventMutex);
}
...
}
分析完了enable函数以后就轮到enableLocationTracking函数了。
GpsLocationProvider.java
public void enableLocationTracking(booleanenable) {
synchronized (mHandler) {
mHandler.removeMessages(ENABLE_TRACKING);
Message m = Message.obtain(mHandler,ENABLE_TRACKING);
m.arg1 = (enable ? 1 : 0);
mHandler.sendMessage(m);
}
}
同样地,也采取Handler的方式。调用的是handleEnableLocationTracking函数。
private voidhandleEnableLocationTracking(boolean enable) {
if (enable) {
mTTFF = 0;
mLastFixTime = 0;
startNavigating();
} else {
mAlARMManager.cancel(mWakeupIntent);
mAlarmManager.cancel(mTimeoutIntent);
stopNavigating();
}
}
调用startNavigating函数。
private void startNavigating() {
if (!mStarted) {
if (DEBUG) Log.d(TAG,"startNavigating");
mStarted = true;
int positionMode;
if (Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ASSISTED_GPS_ENABLED, 1) !=0) {
positionMode = GPS_POSITION_MODE_MS_BASED;
} else {
positionMode =GPS_POSITION_MODE_STANDALONE;
}
if (!native_start(positionMode, false, 1)){
mStarted = false;
Log.e(TAG, "native_start failed instartNavigating()");
return;
}
...
在startNavigating函数中,最有作用的语句就是调用native方法native_start。调用到了JNI层的android_location_GpsLocationProvider_start函数。
android_location_GpsLocationProvider.cpp
申明:网友回复良莠不齐,仅供参考。如需专业帮助,请学习易迪拓培训专家讲授的ADS视频培训课程。
上一篇:ADS射频功放设计
下一篇:ADS2009U1 linux 错误请资深工程师求助
ADS濠电姷鏁搁崑鐐哄垂閸洖绠归柍鍝勬噹閸屻劌霉閻樺樊鍎忛柛鎴犲█閺屾盯骞囬崗鍝ュ嚬闂佸摜濮村Λ婵嬪蓟濞戙垹鐒洪柛鎰屽懐绠掗梻浣告惈濡酣宕曢悽绋胯摕婵炴垯鍨归悡娑㈡煕閹邦喖浜鹃柡渚囧灠椤啴濡堕崱妯煎弳闁诲孩纰嶅姗€顢氶敐澶樻晝闁冲灈鏅滈悗濠氭⒑閻熸壆鎽犳慨濠傜秺閹繝鏁撻敓锟� | More...
ADS闂傚倷娴囧畷鐢稿窗閹扮増鍋¢柕澶堝剻濞戞ǚ鏀介悗锝冨妷閸嬫捇宕掗悙鏌ュ敹闂佸搫娲ㄩ崑鐐烘倵椤掆偓閳规垿鎮欓崣澶樻濠电偛鐡ㄥ畝绋跨暦濠靛宸濋悗娑欋缚閸橀亶姊洪崘鍙夋儓闁哥姵宀稿銊╂偋閸稐绨婚梺鍝勫€搁悘婵嬵敂椤愶附鐓欏瀣閳诲牏鈧娲樼划蹇浰囬鈧弻锛勪沪鐠囨祴鍋撻弴銏犵厴闁硅揪绠戠壕鍏肩箾閹达綁鍝洪柣锝堟椤啴濡堕崘銊ュХ闂佺懓鍤栭幏锟�
濠电姷鏁搁崑鐐哄垂閸洖绠伴柛顐f礀绾惧綊鏌¢崶銉ョ仼缂佺姷濞€閺屾盯鍩勯崘顏呭枦闂佺ǹ顑嗛幐鎼佸煡婢跺﹦鏆﹂柛銉㈡櫇閻涖儳绱撻崒娆愮グ濞存粠鍓欓‖濠囨儌婵夛拷2012,ADS2014
ADS闂傚倷娴囬褏鎹㈤幇顔藉床闁归偊鍠掗崑鎾愁潩椤愩垹绁梺闈涙閸婂骞戦崟顒佸闁哄洨濮撮弸娑㈡煕閳轰礁顏€规洘锕㈡俊姝岊槻閻犱焦鐓″缁樻媴鐟欏嫨浠у┑鐘噰閸嬫挾绱撴担鐟扮祷妞ゎ厾鍏橀獮鍡楃暆閸曨偆顦悷婊冨閸掑﹥绺介崨濠勫幍闁荤喐鐟ョ€氼剚鎱ㄩ敃鍌涚厱婵﹫绲芥禍楣冩⒒娴h棄鍚瑰┑顔芥綑闇夐柛鏇ㄥ幘娑撳秹鏌熼悜妯诲闁哄棴鎷�
ADS闂備浇顕уù鐑藉极婵犳艾纾诲┑鐘叉搐缁愭鏌″搴″箺闁稿鍔嶉妵鍕箛閵婏箑娅氶梺鍓插亽娴滎亪寮婚弴銏犻唶婵犻潧娴傚Λ鐐烘⒑濮瑰洤濮傜紒鐘崇墵瀵鈽夐姀鈩冩珳闂佸憡鍔戦崝宀勶綖閸涱収娓婚柕鍫濇閳锋劖绻涢崣澶岀煉妤犵偛绻掗埀顒婄秵閸犳牠鎮樺畷鍥e亾鐟欏嫭绀€婵炲眰鍊濋獮鍐敂閸喓鍘介梺缁樓规禍顒傜驳韫囨稒鐓欓柛鎴欏€栫€氾拷
国内最全面、最专业的Agilent ADS培训课程,可以帮助您从零开始,全面系统学习ADS设计应用【More..】
- Agilent ADS教学培训课程套装
- 两周学会ADS2011、ADS2013视频教程
- ADS2012、ADS2013射频电路设计详解
- ADS高低阻抗线微带滤波器设计培训教程
- ADS混频器仿真分析实例视频培训课程
- ADS Momentum电磁仿真设计视频课程
- ADS射频电路与通信系统设计高级培训
- ADS Layout和电磁仿真设计培训视频
- ADS Workspace and Simulators Training Course
- ADS Circuit Simulation Training Course
- ADS Layout and EM Simulation Training Course
- Agilent ADS 内部原版培训教材合集