按键适配

来源:互联网 发布:sql insert into date 编辑:程序博客网 时间:2024/05/16 09:29
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <alloca.h>
#include <assert.h>
#include "mcu.h"
#include "mcu_config.h"

#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "KEYBOARD"

#define KEYDATA_LEN 4
#define KEYTYPE  0x12


pthread_t s_tid_KeyAdapter;
static pthread_mutex_t s_keymutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t s_key_cond = PTHREAD_COND_INITIALIZER;
static unsigned char s_keydata;

//按键值定义
typedef enum E_keycode
{
    //下面是Android系统标准按键类型
    HOME     = 3,//返回主页
        SEL_UP = 19,//选择向上    
        SEL_DOWN = 20,//选择向下
    VOL_UP   = 24,//音量+
    VOL_DOWN = 25,//音量-
    POWER    = 26,//电源键
    ENTER    = 66,//进入
    MUTE     = 91,//静音


    //自定义按键类型
    FM_AM =145,//收音机调频
    MUSIC = 143,//音乐
    WEB   = 142,//网页
    TEL   = 140,//电话
    SOS   = 139,//紧急呼叫
    ICALL = 138,//一键通
    NAVI  = 141,//导航
    MOVIE = 144,//电影


}E_KeyCode;

//按键数据处理函数
static void keyParse(int keycode)
{
    static char s_keyArray[64] = {0};
    static char s_intent[256] = {0};
    LOGD("keyParse %d!\r\n",keycode);
    switch(keycode){
        //Android标准系统按键类型
        case ENTER:
        case HOME:
                case SEL_UP:
                case SEL_DOWN:    
        case VOL_UP:
        case VOL_DOWN:
                case POWER:
                case MUTE:
            sprintf(s_keyArray, "input keyevent %d", keycode);
            system(s_keyArray);
            LOGD(s_keyArray);
            break;

        //自定义按键类型
        case FM_AM:
        case MUSIC:
        case WEB:
        case TEL:
        case SOS:
        case ICALL:
        case NAVI:
        case MOVIE:
        
            sprintf(s_intent, "am broadcast -a com.hsae.ng102.panelkeydown --ei keycode %d", keycode);
            system(s_intent);
            LOGD(s_intent);
            break;
        default:
            LOGD("undefined keycode.\r\n");
            break;
    }
}

//按键检测线程
static void*  key_event_process_entry(void* arg)
{
    int keycode = 0;
    while(1){
        //等待接收MCU端来的按键数据
        pthread_mutex_lock(&s_keymutex);
        pthread_cond_wait(&s_key_cond, &s_keymutex);
        keycode = s_keydata;
        pthread_mutex_unlock(&s_keymutex);

        //处理按键数据
        keyParse(keycode);
        usleep(10000);

    }
    return NULL;
}
//按键检测线程初始化
static int init_key_event_thread_create(void)
{

    int ret;    
    pthread_attr_t attr;
    pthread_attr_init (&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    ret = pthread_create(&s_tid_KeyAdapter, &attr, key_event_process_entry, &attr);

    if (ret < 0) {
        LOGD("key thread create failure!\n");
        return -1;
    }
    LOGD("key thread create success!\n");
    return 0;

}

//按键消息处理的回调函数,供注册函数使用
static void _msg_handle_12(a5_msg_t msg)
{
    assert(msg !=NULL);
    if((msg->type ==KEYTYPE) &&(msg->len ==KEYDATA_LEN)){
        pthread_mutex_lock(&s_keymutex);
        s_keydata=msg->data[3];
        pthread_cond_signal(&s_key_cond);
        pthread_mutex_unlock(&s_keymutex);
    }
}

//按键检测模块初始化
int keyadapt_init(void)
{            
    mcu_register(0x12,_msg_handle_12);
    return init_key_event_thread_create();
}