91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C程序實現監聽長按物理power鍵3秒關機功能

發布時間:2020-07-23 06:32:26 來源:網絡 閱讀:791 作者:樓中望月 欄目:移動開發

要實現的功能:在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;
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九寨沟县| 怀宁县| 四川省| 通城县| 灵川县| 团风县| 大冶市| 阿图什市| 毕节市| 临邑县| 伊金霍洛旗| 行唐县| 望城县| 伊通| 凤冈县| 武川县| 犍为县| 文水县| 博爱县| 松滋市| 边坝县| 蒲城县| 龙陵县| 洛浦县| 灵武市| 子长县| 盐津县| 郧西县| 滁州市| 维西| 通海县| 大渡口区| 五莲县| 当涂县| 房山区| 江北区| 宝山区| 巴中市| 仙游县| 剑川县| 普兰店市|