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

📄 timer.c

📁 EGui是一个开源的图形系统软件,类似于QT/Embedded、GTK-FB、MicroWindow。目标是嵌入式平台整合解 决方案。基于Linux Framebuffer 设备驱动上实现。有完
💻 C
字号:
/******************************************************** * Egui code,LGPL * Function : Timer for EGui  * Author: fishbaoz@hotmail.com * Data : 2006-03-15 * $Id: timer.c,v 1.7 2006/04/13 22:52:54 baozheng Exp $ ********************************************************//*                               O                            (_)                          _ )_( _                        /`_) H (_`\                      .' (  { }  ) '.                    _/ /` '-'='-' `\ \_                   [_.'   _,...,_   '._]                    |   .:"`````":.   |                    |__//_________\\__|                     | .-----------. |                     | |  .-"""-.  | |                     | | /    /  \ | |                     | ||-   <   -|| |                     | | \    \  / | |                     | |[`'-...-'`]| |                     | | ;-.___.-; | |                     | | |  |||  | | |                     | | |  |||  | | |                     | | |  |||  | | |                     | | |  |||  | | |                     | | |  |||  | | |                     | | | _|||_ | | |                     | | | >===< | | |                     | | | |___| | | |                     | | |  |||  | | |                     | | |  ;-;  | | |                     | | | (   ) | | |                     | | |  '-'  | | |                     | | '-------' | |                    _| '-----------' |_                   [= === === ==== == =]                   [__--__--___--__--__]                  /__-___-___-___-___-__\                 `"""""""""""""""""""""""` */#include <stdio.h>#include <stdlib.h>#include <Egui.h>#define GET_MS(sec)  (1*(sec))egui_timer_list_t    egui_timer_list_table={(egui_timer_t*)&egui_timer_list_table,					    (egui_timer_t*)&egui_timer_list_table};egui_timer_list_t    *egui_timer_list=&egui_timer_list_table;voidEgui_timer_init(){    gettimeofday (&(egui_timer_list->start_msec), NULL);    gettimeofday (&(egui_timer_list->last_msec), NULL);   }/* allocate and initialize a new timer node */egui_timer_t *Egui_timer_new(){    egui_timer_t  *new_timer;    new_timer = (egui_timer_t *)malloc (sizeof(egui_timer_t));    new_timer -> prev		= NULL;    new_timer -> next		= NULL;    new_timer -> delta_interval	= 0;    new_timer -> function	= NULL;    new_timer -> parameter	= NULL;    return new_timer;}void Egui_timer_free(egui_timer_t *p_timer){    free(p_timer);}/*  insert interval=3:        3  insert interval=4:        3 -> 1  insert interval=4:        3 -> 1 -> 0  insert interval=8:        3 -> 1 -> 0 -> 4  insert interval=10:       3 -> 1 -> 0 -> 4 -> 2  insert interval=2:        2 -> 1 -> 1 -> 0 -> 4 -> 2   */void Egui_timer_insert(unsigned int interval,		       timer_callback_t function,		       unsigned int *para){    egui_timer_t  *new_timer, *index;    unsigned int  delta_interval;    new_timer		= Egui_timer_new();        new_timer ->function	= function;    new_timer ->parameter	= para;     /* search the whole list, insert the whole list at a proper position */    for(index = ((egui_timer_t *)egui_timer_list)->next, delta_interval = GET_MS(interval);	;	index = index->next)    {	if (delta_interval == 0 || /* we have got it, it is "<0" probably */	    (index==(egui_timer_t *)egui_timer_list))	/* end of whole list */	    break;	if ( delta_interval < index->delta_interval ) /* we've got it */	{	    index->delta_interval -= delta_interval;	    break;	}	delta_interval -= index->delta_interval;    }    /* got it, didnt we? */    new_timer ->delta_interval	= delta_interval;    /* insert before index */    new_timer ->prev	= index->prev;    new_timer ->next	= index;    index->prev->next	= new_timer;    index->prev		= new_timer;}static unsigned intget_elapse(){    struct timeval	current;    struct timeval	elapsed;    gettimeofday (&current, NULL);    if (egui_timer_list->last_msec.tv_usec >	current.tv_usec)    {	current.tv_usec += 1000000;	current.tv_sec--;    }    elapsed.tv_sec = current.tv_sec - egui_timer_list->last_msec.tv_sec;    elapsed.tv_usec = current.tv_usec - egui_timer_list->last_msec.tv_usec;    /* update the timer */    egui_timer_list->last_msec = current;    return (elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000);}/*  */void Egui_timer_handler(){    egui_timer_t	*index, *tmp;    signed int		elapsed_time;    /* if the whole list is empty, return */    elapsed_time = 0 - get_elapse();    for(index = ((egui_timer_t *)egui_timer_list)->next;	index!=(egui_timer_t *)egui_timer_list;	tmp = index,  index = index->next, Egui_timer_free(tmp))    {	elapsed_time += index->delta_interval;	if (elapsed_time > 0)	{	    index->delta_interval = elapsed_time;	    break;		/* we still have to wait. */	}	/* got one, delete it from the queue. */	egui_timer_list->first	= index->next;	index->next->prev		= (egui_timer_t *)egui_timer_list;	if (index->function)	    index->function (index->parameter);    }}

⌨️ 快捷键说明

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