按键适配
来源:互联网 发布: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();
}
#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();
}
- 按键适配
- android虚拟按键适配
- A20平台物理按键适配总结
- 安桌屏幕虚拟按键适配
- Android屏幕适配(底部虚拟按键)
- android屏幕适配----虚拟按键
- Android虚拟按键适配Popupwindow
- android 华为虚拟按键适配
- Android屏幕适配(底部虚拟按键)
- hisi平台遥控器按键适配
- 按键
- 按键
- 按键
- 按键
- 屏幕适配之带虚拟按键手机屏幕适配
- Android适配华为手机虚拟按键显示或隐藏
- 虚拟按键隐藏之后cocos游戏的适配问题
- Android适配之虚拟按键遮挡布局
- Google Wallet再次悲剧 被运营商拒于千里之外
- 用GDB调试程序(七)
- Word选择性批量删除和隐藏换行符
- 用GDB调试程序(六)
- 最常被程序员们谎称读过的计算机书籍
- 按键适配
- foreach循环详解
- android取得手机屏幕大小DisplayMetrics的核心代码
- 62 架构师首先是开发人员
- 2012C++程序设计实验报告【9.4】
- OpenGL编程指南 - 第二章
- 九周任务三:定义分数类中的<<和>>的重载,实现分数的输入和输出
- C语言中的多维数组与指针
- lhgdialog API 说明(1)