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

📄 phone.c

📁 本程序是使用CDMA450模块开发的一个无线公话完整程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "nucleus.h"
#include "at.h"
#include "app.h"
#include "calendar.h"
#include "general.h"
#include "mmalloc.h"
#include "windows.h"
#include "cardmanage.h"
#include "recmanage.h"
#include "public.h"
#include "phone.h"
#include "Translate.h"
#include "sms_def.h"
#ifdef HARDWARE
   #include "TempHard.h"
  #include "rtc_time.h"
  #include "configcpu.h"
//yu  #include "voice.h"
//yu  #include "handleset.h"
//yu  #include "guard_dev.h"
#else
 char  gRunParam_handleHook=0;
#endif
#define AudioControl(x)
static char info[30];

#include "debug_out.h"
extern void Waiting(int a);

// yu ------
extern void show_Icon_SPK_Hand(char state);
extern void show_Icon_SMS(char state);
extern void show_Icon_WEIJIE(char state);


void RingNotify(char *number);		/* 来电震铃提示 */ 
void StopRingNotify(void);			/* 停止来电震铃提示 */ 
void OnTalkConnect(int dir);		/* 电话接通后切换语音通道 */ 
//yuvoid StartVoiceMenu(void);			/* 切换语音通道为语音菜单状态 */ 
void StopVoiceMenu(void);			/* 结束语音菜单状态 */ 
//void VoiceMenuOnSecond(void);		/* 每秒检查语音菜单播放时间 */ 
void SwitchAudioOnDial(void);		/* 拨出电话时切换语音通道 */ 
void SwitchToHandfree(void);
void SwitchToHandset(void);


/* 变量定义 */ 
//static char gDTMFPwd[16];		/* 用户输入的密码 */ 
//static char	gPwdLength;			/* 密码输入长度 */ 
//static char	gPwdCount;			/* 密码输入次数 */ 
/* DTMF菜单 */ 
static char	gMenuClass = 0;		/* 语音菜单级别 1 -- 主菜单,2 -- 输入密码, 3 -- 遥控菜单 */ 
//yu static char	gMenuCount;			/* 语音菜单播放计时,30秒之内必须响应 */ 

static char	gTalkWithHandle;	/* 用手柄进行通话 */ 


#define PDS_PIN     0x11		/* PIN码输入 */ 
#define PDS_PUK     0x12		/* PUK吗输入 */ 
#define PDS_LOCK    0x13		/* 卡被锁住 */ 


#define MAX_DTMF	32
static char	gDtmfBuffer[MAX_DTMF+4];
static char gDtmfLength;


#define PCT_DIALOUT		0		/* 呼叫类型:拨出 */ 
#define PCT_CALLIN		1		/* 呼叫类型:呼入 */ 

#define PCS_IDLE		0		/* 呼叫状态:空闲状态 */ 
#define PCS_DIAL		1		/* 呼叫状态:拨出号码 */ 
#define PCS_WAIT		2		/* 呼叫状态:来电等待接听 */ 
#define PCS_INPUT		3		/* 呼叫状态:输入号码 */ 

#define PCS_TALK			4		/* 呼叫状态:通话中 */ 
//#define PCS_HOLD		5		/* 呼叫状态:通话保持 */ 
#define PCS_STOP		6		/* 呼叫状态:通话结束 */ 
#define PCS_DTMF		7		/* 呼叫状态:输入DTMF */ 

#define PCS_FWAIT		8		/* 假来电:来电等待接听 */ 
#define PCS_VDIAL		9		/* 拨中心号码,进入语音菜单 */ 
//#define PCS_VTALK		10		/* 进入语音菜单菜单 */ 


#define PCS_INIT		100		/* 初始化状态 */ 


#define PLS_LOCK		1		/* 话机锁定状态 */ 
#define PLS_UNLOCK		0		/* 话机解锁状态 */ 

typedef struct {
	PHONE_RECORD	rec;
	BYTE			callType;		/* 呼叫类型:发起还是接听 */ 
	BYTE			recType;		/* 通话记录类型 */ 	
	BYTE			status;			/* 状态:等待接听、通话、挂起、拨号、结束 */ 
	BYTE			secStop; 		/* 停止后计时器 */ 
	BYTE			callid;                // 0, 1, 2 
} TALKING_MEMBER;

//#define  MAX_MEMBER		10//yu free
//static TALKING_MEMBER	gTalkingMem[MAX_MEMBER];	/* 成员列表 */ //yu free
static TALKING_MEMBER	gMemberActive;				/* 当前操作通话成员 */ 
//static TALKING_MEMBER	*pMemberActive;				/* 激活的成员地址 */ //yu free
//static char gMemberCur;			/* 当前成员序号 */ //yu free
//static char gMemberSum;			/* 通话成员数 */ //yu free

static char gRingTimeCount = 0;		/* 来电震铃计时 */ 
static char gRingMsgCount  = 0;		/* 收到来电RING次数 */ 
static char phoneDialStatus = PCS_INIT;		/* 号码输入状态 */ 
//yu static char phoneLockStatus;			/* 话机锁定状态 */ 


static void showTalkStop(void);

void VolumnAdjust(void);		/* 音量调节 */ 
//int SpecialCommand(char *cmd);	/* 特殊命令处理 */ 

int gSYS_SIMLOCK=0;
#if 1
char gServiceIDch[LOGOIDlen]={"\0"};
char *GetServiceName(char * idchar)
{
	int		pos;
	
	for(pos=0;pos<LOGOMAX;pos++)
		{
			if(0==strncmp(gDevicePara.factoryData.Logo[pos].LogoID,idchar,LOGOnamelen))
				break;
		}

	return (char*)gDevicePara.factoryData.Logo[pos].LogoName;
}
#else
int	gServiceID = 0;
const char *gServiceName[] = 
{
	"中国移动", "中国联通", "中国卫通", "中国铁通", "未知网络",
};
char *GetServiceName(int id)
{
	int		pos;

	pos = 4;
	switch (id) {
	case 46000:
	case 46002:
		pos = 0;
		break;
	case 46001://联通GSM
	case 46003://联通cdma
		pos = 1;
		break;
	case 46007:
	case 46051:
		pos = 2;
		break;
	case 46022:
	case 46050:
		pos = 3;
		break;
	default:
		break;
	}
	return (char*)gServiceName[pos];
}
#endif

typedef struct {
	window_t	wnd;
	menu_t		tmenu;
	int			nextWnd;
	char		number[NUMBER_LEN+5];		/* 输入号码 */ //yu add 5
	char		input;					/* 输入长度 */ 
	char		idSec;					/* 是否需要更新通话成员的时间显示 */ 
	int			idSel;
} phone_dial_t;

static phone_dial_t  *g_pDialWnd;


int CheckModuleBusy(void)
{
	if ((phoneDialStatus == PCS_DIAL) || \
		(phoneDialStatus == PCS_WAIT) || \
		(phoneDialStatus == PCS_TALK) || \
		(phoneDialStatus == PCS_VDIAL) || \
		/*(phoneDialStatus == PCS_VTALK) || \***/
		(phoneDialStatus == PCS_FWAIT) )
		return 1;
	return 0;	
}
/*
int CheckTestMode(void)
{
	if ((gRunParam.initModule > 3) && (phoneLockStatus != PLS_TEST))
		return 0;
	return 1;
}
int CheckBackMain(void)
{
	return ((phoneLockStatus == PLS_UNLOCK)? 1 : 0);
}


static void ClearActiveMember(void)
{
	memset(&gMemberActive, 0, sizeof(TALKING_MEMBER));
}

*/


/* 显示电话状态 */ 
#define  LCD_X		(LCD_WIDTH+1)
#define  LCD_Y		(LCD_HEIGHT-17)

static void ClearPhoneLCD(void)
{
	rect	rcShow;
	
	SetRect(&rcShow, 0, LCD_ICONEND, LCD_WIDTH, LCD_HEIGHT);
	EraseRect(&rcShow);

	MoveTo(0, LCD_ICONEND);
	LineTo(LCD_WIDTH, LCD_ICONEND);
}

void showMessage(char row, char *str)
{
	rect	area;
	short	ypos;
//	if (gMemberSum)
//		return;
	if (row == 0) {
		ClearPhoneLCD();
		ypos = LCD_ICONEND + HZ_MAIN+1;//yu ypos = LCD_ICONEND + 20;
	}
	else {
		ypos = LCD_ICONEND + row*(HZ_MAIN+1);//yu ypos = LCD_ICONEND + row*20;
		SetRect(&area, 0, ypos, LCD_WIDTH-1, ypos+HZ_MAIN);
		EraseRect(&area);
	}

	TextAlign(alignCenter, alignBaseline);
	MoveTo(LCD_HMID, ypos+HZ_MAIN);
	DrawString((BYTE*)str);
	TextAlign(alignLeft, alignBaseline);
	v_WriteLcdBuff();
}
int check_phoneDialStatusIdle(void)
{		
if(phoneDialStatus==PCS_IDLE)
	return 0;
else
	return -1;
}

static void showLockStatus(void)
{
}
void IdleShowMesage(void)
{
	StoreMessage(MSG_Check_Idle,1, 0);//clo on
}

static void showIdleStatus(void)
{
//yu	const char	weekName[] = "日一二三四五六";
//	DWORD	sysDate;
	XDATE	date;
	char timeStr[8];//yu
//yu	BYTE	week;
	char	dateStr[16];
//yu	char	name[8] = "星期";
//	sysDate = GetSysDate();
//	date.year  = ((sysDate>>16)&0xFFFF);
//	date.month = ((sysDate>>8)&0xFF);
//	date.day   = (sysDate&0xFF);
#ifdef HARDWARE
	date.year  = YEAR;
	date.month = MONTH;
	date.day   = DOM;

	date.hour   = HOUR;//yu
	date.min= MIN;//yu
#else
	date.year  = 2005;
	date.month = 8;
	date.day   = 8;

	date.hour   = 23;//yu
	date.min= 56;//yu
#endif
//yu	week = GetWeekOfDay(&date);
//yu	strncpy(&name[4], (char*)&weekName[week*2], 2);
//yu	name[6] = 0;
	sprintf(timeStr, "%02d:%02d", date.hour, date.min);
//	sprintf(dateStr, "%04d年%02d月%02d日", date.year, date.month, date.day);
//-------------------
//"日月年",
//"月日年",
//"年月日",
	switch (gDevicePara.sysdata.DateFormat)
		{
		case 0:
			sprintf(dateStr, "%02d/%02d/%04d", date.day, date.month,date.year);
			break;
		case 1:
			sprintf(dateStr, "%02d/%02d/%04d", date.month, date.day,date.year);
		 	break;
		default:
			sprintf(dateStr, "%04d/%02d/%02d", date.year, date.month, date.day);
			break;
		}
//-------------------
	ClearPhoneLCD();
	TextAlign(alignCenter, alignBaseline);
#ifdef  HARDWARE
	debug_print_str(DM_RUNINFO, (info_buffer, "gRunParam.initModule 0x%x", (int)gRunParam.initModule));

	if (gRunParam.initModule == 0) {
	//if (gRunParam.initModule < 3) {
		//MoveTo(LCD_HMID, 42);//MoveTo(LCD_HMID, 50);
		//DrawString((BYTE*)TranslateChar("初始化系统"));
		ShowLogoBmpl(gDevicePara.factoryData.LogoBmp,0);

		
	}
	else
#endif
	{
		MoveTo(LCD_HMID, 32);//36);
		DrawString((BYTE*)GetServiceName(gServiceIDch));//yu gServiceID
		MoveTo(LCD_HMID, 50);//yu48//61);
		DrawString((BYTE*)timeStr);//yu	DrawString((BYTE*)name);
		MoveTo(LCD_HMID, 63);//79);
		DrawString((BYTE*)dateStr);
		phoneDialStatus = PCS_IDLE;
	debug_out_str(DM_RUNINFO, "showIdleStatus(void)");
	}
	TextAlign(alignLeft, alignBaseline);
	
	v_WriteLcdBuff();
	/* 状态 */ 
	g_pDialWnd->input = 0;
	g_pDialWnd->number[0] = 0;
	IdleShowMesage();
	gRunParam.LockCnt=0;//
//	disableDialTimer();
//	PD_ReturnToIdle();
}


void TalkTimeCount(void)
{
	switch (phoneDialStatus) {
	case PCS_DTMF:
	case PCS_TALK:
		gMemberActive.rec.seconds++;
		break;
//	case PCS_VTALK:
//		VoiceMenuOnSecond();
//		break;
	case PCS_WAIT:
	case PCS_FWAIT:
	case PCS_VDIAL:
		gRingTimeCount++;
		break;
	default:
		break;
	}
}
static char strnumber[60];
static char *CutPauseNumber(char *number)
{
	char *idex;
	strncpy(strnumber,number,60);
	strnumber[59]='\0';
	idex=strpbrk(strnumber,"P");
	if(idex != NULL)
		*idex='\0';
	return strnumber;
	//-----------------------------
}
extern int REC_Talk_TimeNummber(BYTE box, PHONE_RECORD * pRec);
static void OnSecondShow(void)
{
	char	timeShow[20];
	
	TextAlign(alignCenter, alignBaseline);
	switch (phoneDialStatus) {
/*	case PCS_INPUT:
		if(g_pDialWnd->input>0)
				send_DialyNummber();
		break;*/
	case PCS_TALK:
		showMessage(0, CutPauseNumber(gMemberActive.rec.number));// 1
		sprintf(timeShow, " %02d:%02d", gMemberActive.rec.seconds/60, gMemberActive.rec.seconds%60);//通话时长
		showMessage(2, timeShow);
		break;
	case PCS_STOP:
		if (gMemberActive.secStop == 3) {
			gMemberActive.rec.seconds = 0;
			showIdleStatus();
		}
		gMemberActive.secStop++;
		break;
	case PCS_WAIT:
		if (gRingTimeCount > 6) {
			StopRingNotify();
			REC_Talk_TimeNummber(PH_REC_UNTALK, &gMemberActive.rec);
			showUnTalkPhone(1);		/* 表示有未接电话 */ 
			showTalkStop();
		}
		break;
	case PCS_VDIAL:
		/* 拨中心20秒不响应 */ 
		if (gRingTimeCount > 30) {
			AT_Hangup();		/* 挂机 */ 
			phoneDialStatus = PCS_IDLE;		
		}
		break;
	case PCS_FWAIT:
		/* 20秒不响应 */ 
		if (gRingTimeCount > 20) {
			AT_Hangup();
			StopVoiceMenu();			/* 停止播放任务 */ 
//			OnHangupTalk();		/* 结束语音菜单状态 */ 
		}
		break;
	default:
		break;
	}
	TextAlign(alignLeft, alignBaseline);
}

static void showNumberOnLCD(char *pNum, int len)
{
	int     i,linMax;
	
	if (len < 0)
		return;

	ClearPhoneLCD();
	

	if (len > 16) {
		linMax=len-16;
		if(linMax>8)linMax=8;
		for (i = 1; i <= linMax; i++) {
			DrawDigital(LCD_X-i*14, LCD_Y-34, pNum[len-i-16]);
		}
	}
	if (len > 8) {
		linMax=len-8;
		if(linMax>8)linMax=8;
		for (i = 1; i <= linMax; i++) {
			DrawDigital(LCD_X-i*14, LCD_Y-17, pNum[len-i-8]);
		}
	}
		linMax=len-0;
		if(linMax>8)linMax=8;
	for (i = 1; i <=linMax; i++) {
		DrawDigital(LCD_X-i*14, LCD_Y, pNum[len-i]);
	}
	v_WriteLcdBuff();
}

void setDialNumber(char *number)
{
	memcpy(g_pDialWnd->number, number, NUMBER_LEN);
	g_pDialWnd->input = strlen(number);
}

static void showDialNumber(void)
{

	showNumberOnLCD(g_pDialWnd->number, g_pDialWnd->input);
	phoneDialStatus = PCS_INPUT;


}
static void showDialOut(char *Number)
{
	char    name[60];
		//Number=CutPauseNumber(g_pDialWnd->number);

	memset(&gMemberActive, 0, sizeof(TALKING_MEMBER));
	strncpy(gMemberActive.rec.number, g_pDialWnd->number, NUMBER_LEN-1);
	gMemberActive.recType = PH_REC_DIALED;
	gMemberActive.callType= PCT_DIALOUT;
	gMemberActive.status  = PCS_DIAL;

	memset(name, 0, 60);
	GetNameFromNumber(Number, name);

	showMessage(0, TranslateChar("正在拨号"));

⌨️ 快捷键说明

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