📄 phalarm.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 + -