⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 好记星的控件,包括button,list,对文件操作
💻 C
字号:
/****************************************************************************/
/*                                                                          */
/*              Copyright (C) 2005 SHENZHEN MEIJIN CO.LTD                   */
/*                                                                          */
/* FILE NAME:   Timer.h                                                     */
/* MODULE NAME: 定时器管理模块                                              */
/* DESCRIPTION: 本程序的主要功能是管理系统中的定时器                        */
/*                                                                          */
/* FUNCTIONS:                                                               */
/*              TimerInitialize     定时器管理模块初始化                    */
/*              TimerCreateTimer    创建定时器                              */
/*              TimerDestroyTimer   销毁定时时钟                            */
/*              TimerResetTimer     重新设置定时时钟                        */
/*              TimerStopTimer      停止定时时钟                            */
/*              TimerScan           扫描定时器是否有定时存在                */
/*                                                                          */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/

// 包含相关的头文件
#include "Base.h"
#include "Timer.h"

#define _TIMER_EVENT_USE_QUEUE      1
extern NU_QUEUE     g_quEventQueue; // 事件队列


/* 定义时钟管理数据结构 */
typedef struct tagMTIMER_CTRL_BLK
{
    NU_TIMER    ntBaseTimer;    /* Nucleus Timer struct   */
    UINT16      wTimerID;       /* timer ID */
    UINT16      wTimerFlag;     /* timer flag */
} MTIMER_CTRL_BLK;
#define TIMER_INTERIOR_FLAG     0x55AA
#define TIMER_MAX_COUNT         6

static MTIMER_CTRL_BLK  g_aTimerBuffer[TIMER_MAX_COUNT];
#ifndef _TIMER_EVENT_USE_QUEUE
static UINT16           g_wTimerID[TIMER_MAX_COUNT][2];
#endif


/****************************************************************************/
/* FUNCTION:   BOOL  TimerInitialize(VOID)                                 */
/* DESCRIPTION:定时器管理模块初始化                                        */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     初始化成功返回TRUE,否则返回FALSE                           */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
BOOL TimerInitialize( VOID )
{
#ifndef _TIMER_EVENT_USE_QUEUE
    int     i;
    for ( i = 0; i < TIMER_MAX_COUNT; i++ )
    {
        g_aTimerBuffer[i].wTimerFlag = 0;
        g_wTimerID[i][0] = 0;
    }
#endif

    return TRUE;
}

/****************************************************************************/
/* FUNCTION:   VOID __KnlTimerCallbackFunc( UNSIGNED dwTimer )             */
/* DESCRIPTION:内部接收定时的回调函数                                      */
/* INPUTS:     dwTimer - 定时器句柄                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     NONE                                                        */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
VOID __KnlTimerCallbackFunc(UNSIGNED dwTimer)
{
    MTIMER_CTRL_BLK    *pTmcb;
#ifndef _TIMER_EVENT_USE_QUEUE
    int                 i;
#else
    UINT                aEvent[2];
#endif

    pTmcb = (MTIMER_CTRL_BLK*)dwTimer;

#ifndef _TIMER_EVENT_USE_QUEUE
    for ( i = 0; i < TIMER_MAX_COUNT; i++ )
    {
        if ( g_wTimerID[i][0] != TIMER_INTERIOR_FLAG )
        {
            g_wTimerID[i][0] = TIMER_INTERIOR_FLAG;
            g_wTimerID[i][1] = pTmcb->wTimerID;
            break;
        }
    }
#else
    aEvent[0] = EVENT_TIMER;
    aEvent[1] = (UINT)pTmcb->wTimerID;
    NU_Send_To_Queue(&g_quEventQueue, aEvent, 2, NU_NO_SUSPEND);
#endif
}

/****************************************************************************/
/* FUNCTION:   HTIMER TimerCreateTimer(UINT16 wTimerID, UINT32 dwTimeLen)  */
/* DESCRIPTION:创建定时器(创建的同时即开始计时)                          */
/* INPUTS:     wTimerID - 定时时钟的ID号                                   */
/*              dwTimeLen - 定时时钟的时长(毫秒数)                          */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     创建成功则返回TIMER句柄,创建失败则返回NULL                 */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
HTIMER TimerCreateTimer( UINT16 wTimerID, UINT32 dwTimeLen )
{
    MTIMER_CTRL_BLK   *pTmcb;
    int                 i;

    pTmcb = (MTIMER_CTRL_BLK*)g_aTimerBuffer;
    for ( i = 0; i < TIMER_MAX_COUNT; i++ )
    {
        if ( pTmcb->wTimerFlag != TIMER_INTERIOR_FLAG )
            break;
        pTmcb++;
    }
    if ( i >= TIMER_MAX_COUNT )
        return (HTIMER)NULL;

    memset(pTmcb, 0, sizeof(MTIMER_CTRL_BLK));
#ifdef WIN32
    dwTimeLen = ((dwTimeLen + (1000/18/2)) * 18 / 1000);
#else
    dwTimeLen = ((dwTimeLen + (1000 /NU_PLUS_Ticks_Per_Second/2)) * NU_PLUS_Ticks_Per_Second / 1000);
#endif
    if ( dwTimeLen < 1 )
        dwTimeLen = 1;
    if ( NU_Create_Timer( (NU_TIMER*)pTmcb, "Timer", __KnlTimerCallbackFunc,
        (UINT32)pTmcb, dwTimeLen, dwTimeLen, NU_ENABLE_TIMER ) != NU_SUCCESS)
    {
        pTmcb->wTimerFlag = TIMER_INTERIOR_FLAG;
        return (HTIMER)NULL;
    }

    pTmcb->wTimerID = wTimerID;
    pTmcb->wTimerFlag = TIMER_INTERIOR_FLAG;

    return (HTIMER)pTmcb;
}

/****************************************************************************/
/* FUNCTION:   BOOL TimerDestroyTimer(HTIMER hTimer)                       */
/* DESCRIPTION:销毁定时时钟                                                */
/* INPUTS:     hTimer - 定时时钟的句柄                                     */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     销毁成功则返回TRUE,否则返回NULL                            */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
BOOL TimerDestroyTimer( HTIMER hTimer )
{
	if ( hTimer == (HTIMER)NULL )
        return FALSE;
    if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
        return FALSE;   //非法的TIMER句柄

    if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
        return FALSE;

    if ( NU_Delete_Timer((NU_TIMER*)hTimer) != NU_SUCCESS )
        return FALSE;

    ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag = 0;
    return TRUE;
}

/****************************************************************************/
/* FUNCTION:   BOOL TimerResetTimer( HTIMER hTimer, UINT16 wTimerID,       */
/*                                    UINT32 dwTimeLen )                    */
/* DESCRIPTION:重新设置定时时钟                                            */
/* INPUTS:     hTimer - 定时时钟的句柄                                     */
/*              wTimerID - 定时时钟的ID号                                   */
/*              dwTimeLen - 定时时钟的时长(毫秒数)                          */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     重置成功则返回TRUE,否则返回NULL                            */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
BOOL TimerResetTimer( HTIMER hTimer, UINT16 wTimerID, UINT32 dwTimeLen )
{
	if ( hTimer == (HTIMER)NULL )
        return FALSE;
    if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
        return FALSE;   //非法的TIMER句柄

    if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
        return FALSE;

#ifdef WIN32
    dwTimeLen = ((dwTimeLen + (1000/18/2)) * 18 / 1000);
#else
    dwTimeLen = ((dwTimeLen + (1000 /NU_PLUS_Ticks_Per_Second/2)) * NU_PLUS_Ticks_Per_Second / 1000);
#endif
    if ( dwTimeLen < 1 )
        dwTimeLen = 1;
    NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER);
    if ( NU_Reset_Timer((NU_TIMER*)hTimer, __KnlTimerCallbackFunc,
        dwTimeLen, dwTimeLen, NU_ENABLE_TIMER) != NU_SUCCESS )
        return FALSE;

    ((MTIMER_CTRL_BLK*)hTimer)->wTimerID = wTimerID;
    return TRUE;
}

/****************************************************************************/
/* FUNCTION:   BOOL TimerStopTimer( HTIMER hTimer )                        */
/* DESCRIPTION:停止定时时钟                                                */
/* INPUTS:     hTimer - 定时时钟的句柄                                     */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     成功停止则返回TRUE,失败则返回FALSE                         */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-23          创建                                    */
/****************************************************************************/
BOOL TimerStopTimer(HTIMER hTimer)
{
	if ( hTimer == (HTIMER)NULL )
        return FALSE;
    if ( ((MTIMER_CTRL_BLK*)hTimer)->wTimerFlag != TIMER_INTERIOR_FLAG )
        return FALSE;   //非法的TIMER句柄

    if ( NU_Control_Timer((NU_TIMER*)hTimer, NU_DISABLE_TIMER) != NU_SUCCESS )
        return FALSE;

    return TRUE;
}

#ifndef _TIMER_EVENT_USE_QUEUE
/****************************************************************************/
/* FUNCTION:   UINT16 TimerScan( VOID )                                    */
/* DESCRIPTION:扫描定时器是否有定时存在                                    */
/* INPUTS:     NONE                                                        */
/* OUTPUTS:    NONE                                                        */
/* RETURN:     有定时时,返回定时时间到的定时的ID号,否则返回NULL          */
/****************************************************************************/
/*    NAME         DATE               REMARKS                               */
/* ==========  ============   ==============================================*/
/*   谢永良     2005-03-30          创建                                    */
/****************************************************************************/
UINT16 TimerScan(VOID)
{
    int     i;
    UINT16  wTimer;

    wTimer = 0;
    for ( i = 0; i < TIMER_MAX_COUNT; i++ )
    {
        if ( g_wTimerID[i][0] == TIMER_INTERIOR_FLAG )
        {
            wTimer = g_wTimerID[i][1];
            g_wTimerID[i][0] = 0;
            break;
        }
    }
    return wTimer;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -