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

📄 phone.c

📁 本程序是使用CDMA450模块开发的一个无线公话完整程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	//name[15]='\0';
	showMessage(2, name);

	phoneDialStatus = PCS_DIAL;
//	pMemberActive = &gMemberActive;
	v_WriteLcdBuff();
}

/* 来电显示 */ 
static void showCallIn(void)
{
	char    name[60];
	int aint;
	memset(&gMemberActive, 0, sizeof(TALKING_MEMBER));
	strncpy(gMemberActive.rec.number, g_pDialWnd->number, NUMBER_LEN-1);
	gMemberActive.recType = PH_REC_UNTALK;
	gMemberActive.callType= PCT_CALLIN;
	gMemberActive.status  = PCS_WAIT;
	
	memset(name, 0, 60);
	showMessage(0, TranslateChar("有来电"));
	aint=GetNameFromNumber(g_pDialWnd->number, name);
	if(aint<0)
		showMessage(2, name);
	else
		{	
			showMessage(2, name);
			showMessage(3, g_pDialWnd->number);//yu add
		}

	phoneDialStatus = PCS_WAIT;
	v_WriteLcdBuff();
}

static void showSendDtmf(char ch)
{
	if (phoneDialStatus == PCS_TALK) {
		memset(gDtmfBuffer, 0, MAX_DTMF);
		gDtmfLength = 0;
	}
	AT_SendDTMF(ch);
	if (gDtmfLength < MAX_DTMF) {
		gDtmfBuffer[gDtmfLength++] = ch;
	}
	else {
		gDtmfLength--;
		memmove(gDtmfBuffer, gDtmfBuffer+1, gDtmfLength);
		gDtmfBuffer[gDtmfLength++] = ch;
	}
	
	showNumberOnLCD(gDtmfBuffer, gDtmfLength);
	phoneDialStatus = PCS_DTMF;
}


static void showTalkStop(void)
{
	char	time[16];
	showMessage(0, TranslateChar("通话结束"));
//	Phone_StoreRec(talkingMem[0].number, recordType, talkingMem[0].time);
	sprintf(time, "%02d:%02d", gMemberActive.rec.seconds/60, gMemberActive.rec.seconds%60);
	showMessage(2, time);
	gMemberActive.secStop = 0;
	phoneDialStatus = PCS_STOP;
	v_WriteLcdBuff();
}
static int CallastrictoutFun(void)
{int ret;
int tmp;
	ret=0;
	tmp=strlen(gDevicePara.Callastrict.IDD_head);

	if(1==gDevicePara.Callastrict.out)
		ret=-2;
	else if((1==gDevicePara.Callastrict.IDD_out)&&\
		(g_pDialWnd->input > tmp))
		{
			if(0==strncmp(g_pDialWnd->number,gDevicePara.Callastrict.IDD_head,tmp))
				ret=-1;
		}
	debug_print_str(DM_RUNINFO, (info_buffer, "呼叫限制(-1: IDD  ;-2 All;0:no): %d", ret));
	return ret;
}
#if 1
#define  TimeOut_xms   200    //单位是10ms 系统时钟10ms
NU_TIMER   TimeOutTimer;
static void disable_TimeOut_timer(void)
{
	NU_Control_Timer(&TimeOutTimer, NU_DISABLE_TIMER);
}
static void OnTimeout(UNSIGNED id)
{	disable_TimeOut_timer();
	StoreMessage(MSG_TIMEOUT, 0, 0);
}
static void enable_TimeOut_Msg(int Time_xms)
{

	NU_Control_Timer(&TimeOutTimer,NU_DISABLE_TIMER);
	NU_Reset_Timer(&TimeOutTimer, OnTimeout, \
		Time_xms, Time_xms, NU_ENABLE_TIMER);
}

void init_TimeOut_timer(void)
{

	//===============================
	//===============================
	NU_Create_Timer(&TimeOutTimer, "TIMOUT", OnTimeout, 10,
					TimeOut_xms, TimeOut_xms, NU_DISABLE_TIMER);
	//NU_Create_Timer(&keytimer, "KEYTIM", OnKeyScan, 4,
	//					初值, 间隔, NU_ENABLE_TIMER);
	//OnKeyScan(timer ID)
	//===============================
	//===============================
}
#endif
extern void SetHandleKey(int id);
extern int AT_SetMicAGC(int vol);
static void Start_Dial_gotoTalk(void)
		{char *Number;
			Number=CutPauseNumber(g_pDialWnd->number);
			showDialOut(Number);
			if(0>CallastrictoutFun())
				{
				AT_Hangup();
				showMessage(0, TranslateChar("呼叫限制"));
				Waiting(2000);//yu add
				showIdleStatus();//yu add
				return;
				}
				
			/* ATD here */ 
			if (AT_Dial(Number) == 0) //if (AT_Dial(g_pDialWnd->number) == 0) 
			{char *idex;
				AT_SetMicAGC(gDevicePara.sysdata.MICAGC);//YU ADD
				
				SwitchAudioOnDial();		/* */ 

				idex=strpbrk(g_pDialWnd->number,"P");
				if(idex!=NULL)
					{//有p
					char OPchar;
					//SetHandleKey(0);
					phoneDialStatus = PCS_DTMF;
						for(;0<strlen(idex);)
							{	
								OPchar=idex[0];
								idex++;
								if('P'==OPchar)
									{
									enable_TimeOut_Msg(302);
									if(ID_OK != STimeOutMessageBox(TranslateChar("暂停..."),idex))
										break;
									}
								else
									{
									enable_TimeOut_Msg(120);
									AT_SendDTMF(OPchar);
									if(ID_OK != STimeOutMessageBox(TranslateChar("正在发送..."),idex))
										break;
									}
							}
					//SetHandleKey(1);
					}
				//yu
				phoneDialStatus = PCS_TALK;
				OnSecondShow();//Start_Dial_gotoTalk
				g_pDialWnd->input = 0;
				memset(g_pDialWnd->number, 0, NUMBER_LEN);
			}
			else {
				AT_Hangup();
				showMessage(0, TranslateChar("拨号失败"));

				Waiting(2000);//yu add
				showIdleStatus();//yu add
			}
		}

/* 停止拨号,发起拨号后取消 */ 
static void OnStopDial(void)
{
	/* 停止拨号 ATH */ 
	AT_Hangup();
	REC_Talk_TimeNummber(PH_REC_DIALED, &gMemberActive.rec);
	showIdleStatus();
}

/* 拒绝接听,来电后拒绝接听 */ 
static void OnRejectCall(int id)
{
	/* 拒绝接听 ATH */ 
	if (id)
		AT_Hangup();
	REC_Talk_TimeNummber(PH_REC_TALKED, &gMemberActive.rec);
	showIdleStatus();
}

/* 接听电话,来电后接听 */ 
static void OnAcceptCall(int id)
{
	/* 接听 */ 
	if (id)
		AT_AcceptCall();
	gMemberActive.status  = PCS_TALK;
	gMemberActive.recType = PH_REC_TALKED;
	phoneDialStatus = PCS_TALK;
	OnTalkConnect(0);
//	AudioControl(VM_HANDLE);
//	AT_SelectChannel(HANDFREE);
	OnSecondShow();
}

/* 挂断电话,通话后主动挂断 */ 
static void OnHangupTalk(void)
{
	if (phoneDialStatus == PCS_IDLE)
		return;
	/* 断开连接 ATH */ 
	AT_Hangup();
	REC_Talk_TimeNummber(gMemberActive.recType, &gMemberActive.rec);
	StopVoiceMenu();			/* 停止播放任务 */ 
	showTalkStop();
	show_Icon_SPK_Hand(0); //yu
}

/* 挂断电话,通话后被动断开 */ 
static void OnCutoffTalk(void)
{
	StopVoiceMenu();			/* 停止播放任务 */ 
	REC_Talk_TimeNummber(gMemberActive.recType, &gMemberActive.rec);
	showTalkStop();
	show_Icon_SPK_Hand(0); //yu
	
}
extern void onPlayDialTone(int mode);
static void OnKeySPK(void)
{
	switch (phoneDialStatus) {
	case PCS_TALK:
	case PCS_DTMF:
		//----------------
		if (1 == gTalkWithHandle)
			SwitchToHandfree();
		else
		{	
			if(HOOK_ON==gRunParam.handleHook)
				SwitchToHandset();
			else
			{
				g_pDialWnd->input = 0;
				g_pDialWnd->number[0] = 0;
				OnHangupTalk();
			}
			
		}
		//	SwitchToHandset();/**/
		//----------------
		break;
	case PCS_STOP:
		showIdleStatus();
	case PCS_IDLE:
		phoneDialStatus=PCS_INPUT;
		ClearPhoneLCD();
		MoveTo(0, 30);//36);//yu add
		DrawString((BYTE*)TranslateChar("请拨号"));
		v_WriteLcdBuff();
		onPlayDialTone(HANDFREE);
		break;
	case PCS_INPUT:
//		if(g_pDialWnd->input)
//			{
//			Start_Dial_gotoTalk();
//			}
//		else
//			{
				g_pDialWnd->input = 0;
				g_pDialWnd->number[g_pDialWnd->input] = 0;
				showIdleStatus();
//			}
		break;
	case PCS_WAIT://来铃接听
		if(1==gDevicePara.sysdata.en_RecieveCAll)
			{
			StopRingNotify();
			OnAcceptCall(1);
			SwitchToHandfree();/**/
			}
		break;
	case PCS_DIAL:
//yu	case PCS_STOP:
	default:
		break;
	}
}
extern void onPlayStart(int PlayID);
extern void onToneStopPlay(void);

static void OnHOOKeyUP(void)
{
#ifdef HARDWARE
#else
	gRunParam_handleHook=1;
#endif
	debug_out_str(DM_RUNINFO, "OnHOOKeyUP(void)");
	sprintf(info, "UPin_phoneDialStatus:%d\r\n", phoneDialStatus);
	debug_out_str(DM_RUNINFO, info);


	switch (phoneDialStatus) {
	case PCS_TALK:
	case PCS_DTMF:
		//----------------
		//if (1 == gTalkWithHandle)
		//	SwitchToHandfree();
		//else
			SwitchToHandset();/**/
		//----------------
		//showSendDtmf(ch);
		break;
	case PCS_INPUT:
		if(g_pDialWnd->input)
			{
			Start_Dial_gotoTalk();
			break;
			}
	case PCS_STOP:
		showIdleStatus();
	case PCS_IDLE:
	phoneDialStatus=PCS_INPUT;
		ClearPhoneLCD();
		MoveTo(0, 30);//36);//yu add
		DrawString((BYTE*)TranslateChar("请拨号"));
		v_WriteLcdBuff();
		onPlayDialTone(HANDHELD);//播放假拨号音
		break;
	case PCS_WAIT://来铃接听
		if(1==gDevicePara.sysdata.en_RecieveCAll)
			{
			StopRingNotify();
			OnAcceptCall(1);
			SwitchToHandset();/**/
			}
		break;
	case PCS_DIAL:
//yu	case PCS_STOP:
	default:
		break;
	}
}
static void OnHOOKeyDown(void)
{
#ifdef HARDWARE
#else
	gRunParam_handleHook=0;
#endif

	debug_out_str(DM_RUNINFO, "OnHOOKeyDown(void)");
	sprintf(info, "Downin_phoneDialStatus:%d\r\n", phoneDialStatus);
	debug_out_str(DM_RUNINFO, info);
	switch (phoneDialStatus) {
	case PCS_TALK:
	case PCS_DTMF:
		if (1 == gTalkWithHandle)
			{
			g_pDialWnd->input = 0;
			g_pDialWnd->number[0] = 0;
			OnHangupTalk();
			}
		//showSendDtmf(ch);
		break;
	case PCS_IDLE:
		break;
	case PCS_INPUT:
			g_pDialWnd->input = 0;
			g_pDialWnd->number[g_pDialWnd->input] = 0;
			showIdleStatus();
		break;
	case PCS_WAIT:
	case PCS_DIAL:
	case PCS_STOP:
	default:
		break;
	}
}
extern int SetAudioMessageNum(void);
static void OnKeyD1_PCS_IDLE(void)
{//Audio Message
	if(0<strlen(gDevicePara.sysdata.AudioMessage))
		{
			strcpy(g_pDialWnd->number,gDevicePara.sysdata.AudioMessage);
			g_pDialWnd->input=strlen(g_pDialWnd->number);

			//直接进入拨号画面showDialNumber();
			Start_Dial_gotoTalk();
		}
	else
		{
		SetAudioMessageNum();
		showIdleStatus();
		}
}
static void OnKeyD9_PCS_IDLE(void)
{//Audio Message
	if(0<strlen(&gDevicePara.sysdata.D112[0][0]))
		{
			strcpy(g_pDialWnd->number,&gDevicePara.sysdata.D112[0][0]);
			g_pDialWnd->input=strlen(g_pDialWnd->number);
			//直接进入拨号画面showDialNumber();
			Start_Dial_gotoTalk();
		}
	else
		{
		}
}
static void OnInputKey(char ch)
{
	switch (phoneDialStatus) {
	case PCS_TALK:
	case PCS_DTMF:
		showSendDtmf(ch);
		break;
	case PCS_IDLE:
		//if(KEY_D1==ch)
		//	OnKeyD1_PCS_IDLE();
		break;//yu 禁止预拨号
	case PCS_INPUT:
		if (g_pDialWnd->input < NUMBER_LEN-1) {
			g_pDialWnd->number[g_pDialWnd->input++] = ch;
			g_pDialWnd->number[g_pDialWnd->input] = 0;
			showDialNumber(); // 10
		}
		break;
	case PCS_WAIT:
	case PCS_DIAL:
	case PCS_STOP:
	default:
		break;
	}
}
extern WORD REC_Read_Redial(PHONE_RECORD *pRec);

static void OnkeyRedial(void)
{PHONE_RECORD pRedial;
if((phoneDialStatus==PCS_IDLE)||\
	((phoneDialStatus==PCS_INPUT)&&(g_pDialWnd->input==0)))
	{
		REC_Read_Redial(&pRedial);
		strcpy(g_pDialWnd->number,pRedial.number);
		g_pDialWnd->input=strlen(g_pDialWnd->number);

		if (g_pDialWnd->input)
			Start_Dial_gotoTalk();//yu  8 showDialNumber();
		else
			showIdleStatus();
		XSetBaseWindow(&g_pDialWnd->wnd);

		debug_print_str(DM_RUNINFO, (info_buffer, "input: %d\n number:", g_pDialWnd->input));
		debug_print_str(DM_RUNINFO, (info_buffer,g_pDialWnd->number));
	}
}

static int OnKeyDEL(void)//yu
{
	switch (phoneDialStatus) 
		{
		case PCS_INPUT:
			if (g_pDialWnd->input)
			{
				g_pDialWnd->input--;
				g_pDialWnd->number[g_pDialWnd->input] = 0;
			}
			
			if (g_pDialWnd->input)
				showDialNumber(); // 7
			else
				showIdleStatus();
			break;
		//------------------------
		default:
			break;
		}
	return 0;
}
static int OnKeyCancel(void)
{
	switch (phoneDialStatus) {
	case PCS_INPUT:
			showIdleStatus();
		break;
	case PCS_DIAL:
		OnStopDial();	/* 保存通话记录 */ 
		strncpy(g_pDialWnd->number, gMemberActive.rec.number, NUMBER_LEN-1);
		g_pDialWnd->input = strlen(g_pDialWnd->number);
		g_pDialWnd->number[g_pDialWnd->input] = 0;
		showDialNumber(); //6
		break;
	case PCS_FWAIT:
		debug_out_str(DM_RUNINFO, "Press NO");
		StopVoiceMenu();		
//yu		SetHandleRing(0, 1);
		OnRejectCall(1);

⌨️ 快捷键说明

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