📄 phone.c
字号:
#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 + -