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

📄 phalarm.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
#include <string.h>

#include "asixwin.h"
#include "asixapp.h"

#include "lmalloc.h"
#include "at.h"

#include "at_rps.h"
#include "at_pdu.h"

#include "appdb.h"
#include "carddb.h"

#include "psat.h"

#include "phonehis.h"

void PhoneAlarmBox( char *name, char *number );
void PhoneAlarm( void );

extern TASKDESCRIPTION PhoneTskDesp;

//**********************TASKDESCRIPTION*********************
DWORD	PhoneAlarmStk[STACK_SIZE];

TASKDESCRIPTION PhoneAlarmTskDesp = 
{"电话提醒",	ASIX_SERVICE,	NOT_IN_ANYGROUP,	NULL,	STACK_SIZE,	1,	PHY_LCD_W,	PHY_LCD_H,	PhoneAlarm,	SERVICE_PRI};

TASKDESCRIPTIONLIST	PhoneAlarmTskDespLst =
{NULL,	NULL,	&PhoneAlarmTskDesp, PHALMSERVER_ID, PhoneAlarmStk};
//**********************END  TASKDESCRIPTION****************

U8 clipflag = 1;//为了测试定义的来电显示标志变量,1代表有来电显示

void PhoneAlarm( void )
{   
	MSG msg,switchmsg;
	U8 quit = 0;

	char number[25];
	char *name;
    U8 dataLen;	
  
	// 数据库相关定义
	LOCALSEARCHLIST	  *searchlist;
	DBLACB			  *card_lacb;
	BYTE			  *card_data;
	U16			      offset;

	WaitUnsolicitedResponse( AT_RPS_RING );
	WaitUnsolicitedResponse( AT_RPS_CLIP );

	while( !quit )
	{
		ASIXGetMessage( &msg,NULL,0,0 );
		switch( msg.message )
		{
			case WM_AT:
				switch( msg.lparam )
				{
					case AT_RPS_CLIP:  // 来电提醒
						{
							AT_RPS_PAR  *par = ( AT_RPS_PAR * )msg.data;
							SUBPAR		*subpar = par->head;
							  
							// 获取来电号码
							dataLen = ( U8 )strlen( subpar->data );
							memcpy( number, &subpar->data[2], dataLen -3 );
							number[dataLen-3] = '\0';
																		
							// 链接名片簿数据库
							card_lacb = LinkDataBase( CARD_DATA_BASE );  
							
							// 根据来电号码在名片簿中查询来电者姓名
							// 在移动电话号码中查找
							searchlist = LocalFindRecord( card_lacb, CARD_MOBILE_FIELD, number, PRECISE_FULL_MATCH );  //先在移动电话字段中查找号码

							if( searchlist->num != 0 )
							{   
								// 在移动电话号码中查到
								card_data = searchlist->head[0].data+12;
								offset = *( (U16 *)card_data );
								name = card_data + offset;
							}									   
							else
							{
								// 在移动电话号码中查找
								searchlist = LocalFindRecord( card_lacb, CARD_PHONE_FIELD, number, PRECISE_FULL_MATCH );
								if( searchlist->num != 0 )
								{  
									// 在固定电话号码中查到
									card_data = searchlist->head[0].data+12;
									offset = *( (U16 *)card_data );
									name = card_data + offset;
								}
								else
									name = NULL;
							}
							// 断开与数据库的连接
							DetachDataBase( card_lacb );
				   									
							// 弹出提醒对话框
							PhoneAlarmBox( name, number );	
							
							// 处理完毕,切换到后台运行
							switchmsg.messageType = ASIX_MESSAGE;
							switchmsg.message = SM_SWITCH;
							switchmsg.lparam = PHALMSERVER_ID;
							switchmsg.wparam = SWAP_TO_BACKGROUND;
							SysSendMessage( SYSTASK_ID, &switchmsg );

						}
						FreeParameter( msg.data );
						break;
					case AT_RPS_RING:
						if( clipflag == 0 )	// 没有来电显示
						{
							PhoneAlarmBox( NULL, NULL );

							// 处理完毕,切换到后台运行
							switchmsg.messageType = ASIX_MESSAGE;
							switchmsg.message = SM_SWITCH;
							switchmsg.wparam = SWAP_TO_BACKGROUND;
							switchmsg.lparam = PHALMSERVER_ID;
							SysSendMessage( SYSTASK_ID, &switchmsg );
						} 
						FreeParameter( msg.data ); 
						break;
				}
				break;		
		}
		DefWindowProc( msg.message, msg.lparam, msg.data, msg.wparam );			                    
	}
	
	EndofTask();
}



//提醒弹出框函数
void PhoneAlarmBox( char *name, char *number )
{
//	U32	    hGC; 
	MSG		msg;
    U8		quit = FALSE;

	// 窗口和控件
	U32	    mainwin; 	
	U32	    infor; 
	U32	    pick, cancel; 

	// 定时器
	U32		ringTimer;

	char	*caption;
//	U32	    hbmp; 
    
    
    CreateTimer( &ringTimer, 6000, NULL, NULL, ALARM_MODE|AUTO_CLEAR_MODE );  //创建并启动用于检验对方是否挂断的定时器
	StartTimer ( ringTimer );

    //发送峰鸣请求,代码空缺

	if( name == NULL )
	{
		if( number == NULL )
			caption = "没有来电显示";
		else
			caption = number;
	}
	else
		caption = name;
	mainwin = CreateWindow( WNDCLASS_WIN, "您的电话", WS_POPUP|WS_BORDER|WS_CAPTION, 0, 70, 159, 100, 0, 0, NULL ); 
	infor   = CreateWindow( WNDCLASS_STATIC, caption, WS_CHILD|SS_TEXT, 30, 95, 125, 40, mainwin, 0, NULL ); 
	pick    = CreateWindow( WNDCLASS_BUTTON, "接听", WS_CHILD|BS_BOARD_REGULAR, 30, 140, 40, 20, mainwin, 0, NULL ); 
	cancel  = CreateWindow( WNDCLASS_BUTTON, "拒接", WS_CHILD|BS_BOARD_REGULAR, 90, 140, 40, 20, mainwin, 0, NULL );   
    //以上为创建提醒窗口和相关控件
	
//	hGC = GetGC(); 
//	hbmp = LoadBitmap( question_icon );	
//	DisplayBMP( hGC,5,95,hbmp ); 
//	FreeBitmap( hbmp );  //图形相关
	
	PopUpWindow( mainwin, 0 );  //弹出提醒窗口


	while ( !quit ) 
	{
		ASIXGetMessage( &msg,NULL,0,0 );
		
		switch ( msg.message )
		{
			
			case WM_COMMAND:
				if ( msg.lparam == pick )  // 点击接听按钮
				{
					StopTimer( ringTimer );
					PICK_UP();  // 接听
					// 向电话任务发送消息
					{
						MSG		call_msg;
						DWORD	id;
						char	*data;

						data = (char *)Lmalloc( 50 );
						if( data != NULL )
						{
							if( name != NULL )
								strcpy( data, name );
							else
								data[0] = '\0';

							if( number != NULL )
								strcpy( data+25, number );
							else
								data[25] = '\0';

							id = CreateDynamicTask( &PhoneTskDesp, RUN_AS_EXISTED_TASK );
							call_msg.messageType = ASIX_MESSAGE;
							call_msg.message = WM_ALARM;
							call_msg.wparam = ALARM_PHONE;
							call_msg.data = (void *)data;
							SysSendMessage( id, &call_msg );
						}
					}
					quit = 1;
				}				
				else if( msg.lparam == cancel )  // 点击拒接按钮
				{
					StopTimer( ringTimer );
					HANG_UP( );	// 挂断
					// 保存通话记录(拒接电话)
					{
						PHONEHISDATA	hisdata;
						ASIX_DATE		date;
						ASIX_TIME		time, elapse = { 0, 0, 0 };
						DBLACB	*lacb;

						lacb = LinkDataBase( PH_DATA_BASE );
						if( lacb == NULL )	// 连接数据库失败
							break;

						GetDate( &date );
						GetTime( &time );
						hisdata.date = &date;
						hisdata.name = name;
						hisdata.number = number;
						hisdata.type = PhHisTypeLst[REFUSED_TYPE][0];
						hisdata.time = &time;
						hisdata.elapse = &elapse;

						SavePhoneHistory( lacb, &hisdata );
					}
					quit = 1;
				}
				break;			
			case WM_AT:
				switch( msg.lparam )
				{
					case AT_RPS_RING:	// 铃声消息,表明对方尚未挂断
						// 启动定时器重新定时
						StopTimer( ringTimer );
						StartTimer( ringTimer );
						break;					
					default:
					    FreeParameter( msg.data );
						break;
				}
				break;
			case WM_TIMER:
				if ( msg.lparam == ringTimer )  // 定时器到期,表明对方挂断
				{ 
					// 保存通话记录(未接电话)
					{
						PHONEHISDATA	hisdata;
						ASIX_DATE		date;
						ASIX_TIME		time, elapse = { 0, 0, 0 };
						DBLACB	*lacb;

						lacb = LinkDataBase( PH_DATA_BASE );
						if( lacb == NULL )	// 连接数据库失败
							break;

						GetDate( &date );
						GetTime( &time );
						hisdata.date = &date;
						hisdata.name = name;
						hisdata.number = number;
						hisdata.type = PhHisTypeLst[NRECEIVED_TYPE][0];
						hisdata.time = &time;
						hisdata.elapse = &elapse;

						SavePhoneHistory( lacb, &hisdata );
					}
					//向主界面发送消息,存未接信息
					quit = TRUE;
				}
				break;
        }
		
		DefWindowProc(msg.message, msg.lparam, msg.data, msg.wparam);
	}
		//发送停止峰鸣请求,代码空缺
	FreeTimer(ringTimer);  //释放定时器
	
	DestroyWindow(mainwin);  //销毁提醒窗口

}

⌨️ 快捷键说明

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