alarm.c 3.76 KB
/**    
    @file     alarm.c
    @date     2009-04-09
    @author   오재경 freefrug@falinux.com
    @brief    알람디바이스 드라이버를 열고 관리한다.

    @modify   
    @todo    
    @bug     
    @remark   
    
    @warning 
*/
//
//  저작권    에프에이리눅스(주)
//            외부공개 금지
//
//----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/un.h> 
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <pollmng.h>
#include <util.h>
#include <ioctl-alarm.h>
#include <alarm.h>                        

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 );
}