C程序实现监听长按物理power键3秒关机功能

要实现的功能:在android Framework层被裁剪掉的情况下,实现监听长按的物理power按键,实现长按3秒后关机功能;

思路:使用event epoll,非阻塞式IO操作,同时避免无差别轮询,做到避免忙轮和无差别轮询提高效率;

要用到的epoll函数:

epoll_create(EPOLL_SIZE_HINT);
epoll_wait(mEpollFd, mPendingEventItems, 8, -1);
epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem)
epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, &eventItem);

下面是实现的过程:

int main(int argc, char *argv[])
{
    ALOGI("robot test robot power");
	struct itimerval old_value;
	int tap_power_time = 0;
	int tap_power_type = 0;
	int tap_power_code = 0;
	int tap_power_value = 0;
    struct itimerval tick;
	int mEpollFd;
	const int EPOLL_SIZE_HINT = 8;
	const char* DEV_INPUT = "/dev/input/event1";
	struct epoll_event mPendingEventItems[8];

	unsigned char buf[1024] = {0};
	struct inotify_event *event = NULL;
	struct RawEvent* readBuffer = (struct RawEvent*) malloc (sizeof(struct RawEvent));
	mEpollFd = epoll_create(EPOLL_SIZE_HINT);
	int fd = open(DEV_INPUT, O_RDWR | O_CLOEXEC);

	/*
	* struct epoll_event {  
	*	uint32_t events;     // epoll events (bit mask)
	*	epoll_data_t data;   // User data  
	* };  
	*/
	struct epoll_event eventItem;
    memset(&eventItem, 0, sizeof(eventItem));
	/**
	* EPOLLIN: has data to read
	* EPOLLOUT: has data to write
	*/
    eventItem.events = EPOLLIN;

	/**
	* EPOLL_CTL_ADD: add fd to watching list
	* EPOLL_CTL_DEL: remove fd from watching list
	*/
	if (epoll_ctl(mEpollFd, EPOLL_CTL_ADD, fd, &eventItem) == -1)
	{
		exit(0);
	}

	for (;;)
	{
		/**
		* parameter -1 : wait until event occur ;
		*            0 : return immediately when deal with a non-block event
		*/
		epoll_wait(mEpollFd, mPendingEventItems, 8, -1);
		int32_t readSize = read(fd, readBuffer, sizeof(struct input_event));
		struct input_event *event =(struct input_event*) readBuffer;

		tap_power_time = (int) event->time.tv_sec;
		tap_power_type = event->type;
		tap_power_code = event->code;
		tap_power_value = event->value;

		if(is_power_down_key(tap_power_type, tap_power_code, tap_power_value))
		{
			ALOGI("robot power down key");
			signal(SIGALRM,handle_exit);
			memset(&tick,0,sizeof(tick));
			tick.it_value.tv_sec= 3;
			tick.it_value.tv_usec= 0;
			setitimer(ITIMER_REAL,&tick,NULL);
		}
		else if(is_power_up_key(tap_power_type, tap_power_code, tap_power_value)) 
		{
			tick.it_value.tv_sec= 0;
			tick.it_value.tv_usec= 0;
			setitimer(ITIMER_REAL,&tick,NULL);
		}

	}

	epoll_ctl(mEpollFd, EPOLL_CTL_DEL, fd, &eventItem);
    return 0;
}
struct RawEvent {
    int32_t when;
    int32_t deviceId;
    int32_t type;
    int32_t code;
    int32_t value;
};

void handle_exit(int sig)
{
	ALOGI("robot 3 second time out ,now shutdown!");
	system("reboot -p");
}
int is_power_down_key(int type, int code, int value)
{
	int is_down = 0;
	is_down = (type == 1) && (code == 116) && (value == 1);
	return is_down;
}

int is_power_up_key(int type, int code, int value)
{
	int is_up = 0;
	is_up = (type == 1) && (code == 116) && (value == 0);
	return is_up;
}
时间: 2024-10-18 05:55:47

C程序实现监听长按物理power键3秒关机功能的相关文章

cocos2d-x之监听手机的物理按键

1 //如何监听按键事件 2 //创建物理按键的监听事件 3 auto listener = EventListenerKeyboard::create(); 4 //按键被释放时执行的操作,EventKeyboard::KeyCode表示按键代码 5 listener->onKeyReleased = [](EventKeyboard::KeyCode code,Event *e){ 6 log("Key Code : %d",code);//显示按键的值 7 //按下后退键关

mui 监听安卓手机物理返回按键及一些常见的配置

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" type="text/css" href="css/mui.css"/> <style type="text/css"> .mui-

支付宝小程序滚动监听吸顶效果

axml部分 <view class=" {{menuFixed ? 'fixed': ''}}" id="affix">菜单栏</view> axss部分 .fixed{position: fixed; top: 0; } js部分 Page({ data: { menuFixed:"", }, // 监听页面滚动距离scrollTop onPageScroll: function(e) { var that = thi

微信小程序 watch监听数据变化 类似vue中的watch

1.参考 https://github.com/donghaohao/vuefy 2.项目使用 列表循环  图片上传对应每个学生 需要监听学生的变化  上传对应的图片 原文地址:https://www.cnblogs.com/zhengao/p/10734826.html

从网页监听Android设备的返回键

最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App.如何打开浏览器和如何返回App这里就不说了,有兴趣的童鞋可私下交流. 之所以说这个需求蛋疼,是因为Android有个物理返回键啊……返回键啊……键啊……啊…… 用户按下返回键后,预期应该跟点击页面上的返回键一样——返回App.然而这个返回键的被按下的时候网页完全不知道啊(onbeforeunload不算),找不到直接的办法去监听,愁死我们这全苦逼

HTML5 监听移动端浏览器返回键兼容版本

// 往windosw对象中的历史记录注入URL的方法 function addUrl() { var state = { title: "title", url: "#" }; window.history.pushState(state, "title", "#"); } addUrl(); // 每调用一次可以监听返回一次 addUrl(); // 每调用一次可以监听返回一次 addUrl(); // 每调用一次可以监听

长按power键弹出关机菜单,点击关机会弹出提示框,点击重启没有提示框确认直接进入重启状态,添加确认提示框

--- a/idh.code/frameworks/base/core/res/res/values-es/strings.xml +++ b/idh.code/frameworks/base/core/res/res/values-es/strings.xml @@ -1710,5 +1710,5 @@ <string name="station_state_connected">"Stación %1$s esta conectada"</st

涂抹Oracle笔记1-创建数据库及配置监听程序

一.安装ORACLE数据库软件OLTP:online transaction processing 指那些短事务,高并发,读写频繁的数据库系统.--DB_BLOCK_SIZE通常设置较小.OLAP:online analysis processing 指那些处理长事务,低并发,多读少写的数据库系统.---DB_BLOCK_SIZE通常设置较大,如32K. ASM:automatic storage management 自动存储管理系统,独立于操作系统的一种存储管理系统,直接通过操作系统看不到存

一个基于Socket的http请求监听程序实现

首先来看以下我们的需求: 用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql数据库,然后把接受到的信息在浏览器中显示出来 要点: Socket,线程,数据库,IO操作,观察者模式 来看下我们如何来设计这个小系统,这个系统包含三部分的内容,一个是监听端口,二是记录日志,三是数据回显,端口监听第一想到的就是Socket编程了,数据回显也是一样的,无非是把当前请求客户端的sock