/** @file alarm.c @date 2009-04-09 @author 오재경 freefrug@falinux.com @brief 알람디바이스 드라이버를 열고 관리한다. @modify @todo @bug @remark @warning */ // // 저작권 에프에이리눅스(주) // 외부공개 금지 // //---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include char desc_alarm[] = "falinux alarm ver 0.1.0"; /// alarm 개별 구조체 typedef struct { int count; unsigned int per_msec; } alarm_priv_t; //------------------------------------------------------------------------------ /** @brief 알람 디바이스 드라이버를 open 한다. @param count 알람발생회수, 0보다 작으면 지속적인 알람이다. @param per_msec 알람발생 텀 @return poll_obj_t 형태의 포인터 *///---------------------------------------------------------------------------- poll_obj_t *alarm_open( int count, unsigned int per_msec ) { poll_obj_t *obj; alarm_priv_t *alarm; int dev; dev = dev_open( "/dev/falinux-alarm", ALARM_MSG_MAJOR_DEF, 0 ); if ( dev < 0 ) { perror( "dev open error:" ); return NULL; } // alarm 만의 정보를 설정한다. alarm = (alarm_priv_t *)malloc( sizeof(alarm_priv_t) ); alarm->count = count; alarm->per_msec = per_msec; obj = poll_add( dev ); obj->type = STYP_FILE; obj->priv = (void *)alarm; if ( ( 0 < count ) || ( count == ENDLESS_ALARM_NOTIFY ) ) { alarm_restart( obj ); } return obj; } //------------------------------------------------------------------------------ /** @brief 알람을 중지한다. @param obj 폴객체 포인터 *///---------------------------------------------------------------------------- void alarm_stop( poll_obj_t *obj ) { ioctl( obj->fd, IOCTL_ALARM_CLR, 0 ); } //------------------------------------------------------------------------------ /** @brief 알람을 재시작한다. @param obj 폴객체 포인터 @param count 알람발생회수, 0보다 작으면 지속적인 알람이다. @param per_msec 알람발생 텀 *///---------------------------------------------------------------------------- void alarm_restart( poll_obj_t *obj ) { ioctl_alarm_set_t alarm_set; alarm_priv_t *alarm; alarm = (alarm_priv_t *)obj->priv; alarm_set.count = alarm->count; alarm_set.per_msec = alarm->per_msec; ioctl( obj->fd, IOCTL_ALARM_SET, &alarm_set ); } //------------------------------------------------------------------------------ /** @brief 알람을 확인한다.(알람이 발생하면 반드시 호출하여야 한다.) @param obj 폴객체 포인터 @remark 알람이 발생하면 반드시 호출하여야 한다. *///---------------------------------------------------------------------------- void alarm_handled( poll_obj_t *obj ) { char buf[4]; read( obj->fd, buf, 1 ); } //------------------------------------------------------------------------------ /** @brief alarm 드라이버를 close 한다. @param obj 폴객체 포인터 *///---------------------------------------------------------------------------- void alarm_close( poll_obj_t *obj ) { close( obj->fd ); if ( obj->priv ) { free( obj->priv ); } poll_delete( obj ); }