您的位置:首页 > 移动开发 > Android开发

mstar android-supernva key处理流程

2017-08-07 16:39 253 查看


Mstar 6A638平台MHL按键KEY发送流程

分类: Mstar_MHL  |  标签: Mstar MHL  |  作者: kevinx_xu 相关  |  发布日期
: 2015-09-23  |  热度 : 393°

2015年9月18日 
Android 部分
RootActivity

        
android/device/mstar/common/apps/MTvPlayer/src/com/mstar/tv/tvplayer/ui/RootActivity.java


2185     public boolean onKeyDown(int keyCode, KeyEvent event) {

//此处对MHL进行检测,看是否有MHL 的设备接入,如果没有,则不进行下发,如果有,则继续发送

2232         if (mTvMhlManager.CbusStatus() == true && mTvMhlManager.IsMhlPortInUse() == true) {

//调用mTvMhlManager 中的IRKeyProcess 进行key 的发送


2233             if (mTvMhlManager.IRKeyProcess(keyCode, false) == true) {

2234                 SystemClock.sleep(140);

2235                 return true;

2236             }

2237         }
...


TvMhlManager

 android/device/mstar/common/libraries/tv2/java/com/mstar/android/tv/TvMhlManager.java
129     public boolean IRKeyProcess(int keycode, boolean bIsRelease) {

130         ITvMhl service = getService();

131         try {

//只是转去调用TvMhlService.java 中的IRKeyProcess

132             return service.IRKeyProcess(keycode, bIsRelease);

133         } catch (RemoteException e) {

134             e.printStackTrace();

135         }

136         return false;

137     }

138


TvMhlService

        android/device/mstar/common/libraries/tv2/MTvService/src/com/mstar/tv/service/TvMhlService.java
103     public boolean IRKeyProcess(int keycode, boolean isRelease) throws RemoteException {

//此处获取MStar tvapi 中的MhlManager.java进行调用


104         return TvManager.getInstance().getMhlManager().IRKeyProcess(keycode, isRelease);

105     }


MhlManager

        
android/device/mstar/common/libraries/tvapi/java/com/mstar/android/tvapi/common/MhlManager.java

//直接调用JNI 中的函数
147     // native fuc

148     public native final boolean IRKeyProcess(int keycode, boolean bIsRelease);


com_mstar_android_tvapi_common_MhlManager

        
android/device/mstar/common/libraries/tvapi/jni/com_mstar_android_tvapi_common_MhlManager.cpp

//向android注册此接口
391     {"IRKeyProcess",          "(IZ)Z", (void *)com_mstar_android_tvapi_common_MhlManager_IRKeyProcess},
296 jboolean com_mstar_android_tvapi_common_MhlManager_IRKeyProcess
297 (JNIEnv *env, jobject thiz, jint keycode, jboolean bIsRelease) {

298     ALOGI("IRKeyProcess");

299     sp<MhlManager> srv = getMhlManager(env, thiz);

300     if (srv == NULL) {

301         jniThrowException(env, "com/mstar/android/tvapi/common/exception/TvIpcException", "can not connect to server");

302         return 0;
303     }

304

305     jint size = sizeof(astRCPKeyTranslate) / sizeof(android2MufKey);

306     for (jint i = 0; i < size; i++) {


    //NOTE:此处对Android 的Key 与 muf 的Key 进行转换,如果发现有哪些Key没发送成功,可以先查下此表是不是有对应的Key 进行转换
307         if (astRCPKeyTranslate[i].androidKeyCode == keycode) {

308             return srv->IRKeyProcess(astRCPKeyTranslate[i].mufKeyCode, bIsRelease);

             //对Key值进行转换后,进行本地方法的调用,调用 Supervnoa 中tvos


MhlManager 的接口进行发送,此处进行

Supernova


309         }

310     }

311     return false;

312 }

313


Supernova 部分
MhlManager

        
Supernova/projects/tvos/mhlmanager/libmhlmanager/MhlManager.cpp

241 bool MhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease)

242 {

243     ALOGV("IRKeyProcess\n\n");

244     if(mMhlManager == NULL)

245     {

246         return false;

247     }

248

//调用"mstar.mhlmanager" 的服务MhlManagerService connect 时返回的代理IMhlManager BpMhlManager进行发送

249     return mMhlManager->IRKeyProcess(keycode, bIsRelease);

250 }

251


IMhlManager

        
Supernova/projects/tvos/mhlmanager/libmhlmanager/IMhlManager.cpp
130 bool BpMhlManager::IRKeyProcess(int32_t keycode, bool bIsRelease)

131 {

132     ALOGV("Send MHL_IRKEYPROCESS\n");

133     Parcel data, reply;

134     data.writeInterfaceToken(IMhlManager::getInterfaceDescriptor());

135     data.writeInt32(keycode);

136     data.writeInt32(bIsRelease);

137     remote()->transact(MHL_IRKEYPROCESS, data, &reply);

//通过Binder来调用服务端进行发送

138    return static_cast<bool>(reply.readInt32());

139 }

140

178 status_t BnMhlManager::onTransact(uint32_t code,

179                                 const Parcel& data,

180                                 Parcel* reply,

181                                 uint32_t flags)

182 {

183     switch(code)

184     {

...

200         case MHL_IRKEYPROCESS:

201         {

202             ALOGV("Receive MHL_IRKEYPROCESS\n");

203             CHECK_INTERFACE(IMhlManager, data, reply);

204             int32_t keycode = data.readInt32();

205             int32_t bIsReleas = data.readInt32();

                //调用      MhlManagerService 中的服务函数来进行调用Msrv

206             reply->writeInt32(IRKeyProcess(keycode, (bool)bIsReleas));

207             return NO_ERROR;

208         } break;

...


MhlManagerService 

        
Supernova/projects/tvos/mhlmanager/libmhlmanagerservice/MhlManagerService.cpp


281 bool MhlManagerService::Client::IRKeyProcess(int32_t u32RCPKey, bool bIsRelease)
282 {
283 #if(RELEASE_BINDER_TEST == 1)
284     TEST_BOOL_SHORT("IRKeyProcess","u32RCPKey",u32RCPKey) ;
285 #endif
286
287     TVOS_API_ESTIMATE_START()
288     TVOS_API_ESTIMATE_START(LOCK)
289     Mutex::Autolock lock(m_FuncLock);
290     TVOS_API_ESTIMATE_END(LOCK)
291     bool ret = false;
292 #if (MHL_ENABLE == 1)
293     ALOGV("IRKeyProcess(callingPid %d, clientPid %d)\n", IPCThreadState::self()->getCallingPid(), m_ClientPid);

294
295     ret = MSrv_Control::GetMSrvMHL()->IRKeyProcess((U32)u32RCPKey, (bool)bIsRelease);   

        //调用MSrv层的服务

296 #endif
297     TVOS_API_ESTIMATE_END()
298     return ret;
299 }


MSrv_MHL

        
Supernova/projects/msrv/common/src/MSrv_MHL.cpp

611 // Key Event

612 MAPI_BOOL MSrv_MHL::IRKeyProcess(U32 u32RCPKey, BOOL bIsRelease)

613 {

614     if(m_pMhl==NULL)

615     {

616         return false;

617     }

618     return m_pMhl->IRKeyProcess(u32RCPKey,bIsRelease);

//调用Mapi中的内容进行发送

//m_pMhl = mapi_interface::Get_mapi_mhl();

619 }


mapi_mhl

        
Supernova/MStarSDK/src/devices/mhl/mapi_mhl.cpp

153 MAPI_BOOL mapi_mhl::IRKeyProcess(MAPI_U32 u32RCPKey, MAPI_BOOL bIsRelease)

154 {

155    // mapi_scope_lock(scopeLock, &m_Mutex);

156

157     if(stMapiMHLFun.IRKeyProcess == NULL)

158     {

159         printf("!!!!! Error: Mhl SendRCP PressRelease Cmd = NULL");

160         return MAPI_FALSE;

161     }
162


163     return(stMapiMHLFun.IRKeyProcess(u32RCPKey,bIsRelease));
//NOTE:此处的Mapi 可以认为是一个傀儡,在device_mhl.cpp 中会实现mapi_mhl 中的接口函数,mapi_mhl 只是将所有的调用接口转给


device_mhl
164 }


device_mhl

   
Supernova/projects/devices/mhl/device_mhl.cpp

412 MAPI_BOOL device_mhl::IRKeyProcess( MAPI_U32 u32Keycode,  MAPI_BOOL bIsRelease)

413 {
414     MAPI_U8 u8RcpKey, u8Idx;// u8Len;
415
416     //printf("IR Key: 0x%x %x\r\n", static_cast<MAPI_U16>(0xFFFF & (u32Keycode>>16)), static_cast<MAPI_U16>(0xFFFF & u32Keycode));

417     if(bIsRelease == MAPI_TRUE)
418     {
419         printf("MHL utopia will send RCP Release key after Press key\r\n");

420         return MAPI_FALSE;
421     }
422     for(u8Idx = 0; u8Idx < LENGTH_TRANSLATION_ARRAY; u8Idx++)
423     {
424         if (astRCPKeyTranslate[u8Idx].u8IRKeyCode == u32Keycode)
425         {
426             u8RcpKey = astRCPKeyTranslate[u8Idx].u8RCPKeyCode;    
        //此处将muf key 转化为 RCP 的key 即转化为标准的MHL 定义的key 如果发现有哪些Key没发送成功,

//可以先查下此表是不是有对应的Key 进行转换
427             printf("RCP Key: 0x%x\r\n", u8RcpKey);
428             break;
429         }
430     }
431
432     if (u8Idx == LENGTH_TRANSLATION_ARRAY)
433     {
434         printf("IR key is not supported by RCP key, AL = %d\r\n", LENGTH_TRANSLATION_ARRAY);
435         return MAPI_FALSE;
436     }
437     else
438     {
439         return mapi_mhl_SendRCPAutoReleaseCmd(u8RcpKey);    //调用Mapi 的接口将RCP key发送

//oh, My God. 此处调用的utopia 的接口进行协议发送。已经打包了,看不到了哦,一般不会有问题,有问题只能请MStar进行协助解决了。

440         //return msapi_mhl_SendRCPCmd(u8RcpKey);
441     }
442


   以上为Android 到Supernova 中的整个MHL key 的发送过程。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: