int32_t iothread_start( struct iothread * self, uint8_t index, iothreads_t parent ) { self->index = index; self->parent = parent; self->sets = evsets_create(); if ( self->sets == NULL ) { iothread_stop(self); return -1; } self->cmdevent = event_create(); self->queue = msgqueue_create( MSGQUEUE_DEFAULT_SIZE ); if ( self->queue == NULL || self->cmdevent == NULL ) { iothread_stop(self); return -2; } // 初始化命令事件 event_set( self->cmdevent, msgqueue_popfd(self->queue), EV_READ|EV_PERSIST ); event_set_callback( self->cmdevent, iothread_on_command, self ); evsets_add( self->sets, self->cmdevent, 0 ); // 启动线程 pthread_attr_t attr; pthread_attr_init( &attr ); // assert( pthread_attr_setstacksize( &attr, THREAD_DEFAULT_STACK_SIZE ) ); pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); int32_t rc = pthread_create(&(self->id), &attr, iothread_main, self); pthread_attr_destroy( &attr ); if ( rc != 0 ) { iothread_stop(self); return -3; } return 0; }
int main(int agrc, const char *argv[]) { int fd, ret; fd_set rdflag; unsigned char keystate[KEYMAXNUM] = {}; unsigned char bufstate[KEYMAXNUM] = {}; s_inputdata event; s_msginfo msginfo_key5,msginfo_key4; s_ioMSG iomsg_key5, iomsg_key4; msginfo_key5.path_id = 'i'; if(msgqueue_create(&msginfo_key5) != 0) { M_print_str("msgqueue_create fail"); } msginfo_key4.path_id = 'j'; msgqueue_create(&msginfo_key4); fd = open(getenv("KEYPAD_DEV"), O_RDONLY);//|O_NONBLOCK); if(fd < 0) { M_print_err(errno); return 1; } FD_ZERO(&rdflag); FD_SET(fd, &rdflag); while(1) { ret = select(fd+1, &rdflag, NULL, NULL, 0); if(!(ret > 0)) { M_print_err(errno); FD_ZERO(&rdflag); FD_SET(fd, &rdflag); continue; } ret = read(fd, &event, sizeof(event)); if(ret != sizeof(event)) { continue; } switch(event.code) { case KEY5: //给进程发信号或者发消息 if(event.value == KEY_DOWN) { iomsg_key5.mtype = 1; iomsg_key5.io_switch = OPENDOOR; iomsg_key5.t = time(NULL); msgsnd(msginfo_key5.id_msg, &iomsg_key5, sizeof(iomsg_key5)-sizeof(long), 0); D_M_PRINT(0, "send msg"); } else //KEY_UP {} D_M_PRINT(event.value, ""); break; case KEY4: //给进程发信号 if(event.value == KEY_DOWN) {} else //KEY_UP {} D_M_PRINT(event.value, ""); break; default: break; } } return 1; }