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

📄 phonerecord.c

📁 本程序是使用CDMA450模块开发的一个无线公话完整程序
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "datatype.h"

#include "common.h"
#include "mmalloc.h"
#include "windows.h"
//#include "timer.h"
#include "recmanage.h"
#include "cardmanage.h"
#include "para_def.h"
#include "phone.h"
#include "smsbrowse.h"
#include "phonecard.h"
#include "phonerecord.h"
#include "Translate.h"
#include "debug_out.h"

static BYTE  phoneRecPage = PH_REC_UNTALK;   /* record phone record window */
//static PHONE_RECORD  recordCurrent;
//static BYTE  recordNextWnd = MOD_PHONE;
//static BYTE  recordCurPage = PH_REC_UNTALK;

const static char *recName[] = { 
	"详细信息",
	"保存号码",
	"发送短信",
	"删除记录",
	"删除全部",
};


/* 测试用
void PREC_Store(char *number, BYTE nBox, WORD sec, BYTE type, BYTE prior)
{
	PHONE_RECORD	rec;
	
	memset(&rec, 0, sizeof(PHONE_RECORD));
	strncpy(rec.number, number, NUMBER_LEN);
	rec.seconds = sec;
	rec.type  = type;
	rec.prior = prior;

	REC_WriteOne(nBox, &rec);
}
*/


typedef struct {
	window_t	wnd;
	listbox_t	list;
	menu_t		tmenu;
	int			select;
	PHONE_RECORD	record[MAX_RECORD_NUM];
	BYTE		recSum;
	BYTE		box;			/* 未接、已接、拨出 */ 
	int			next;			/* 退出状态 */ 
} phone_record_t;
static phone_record_t  *g_pPhRecord = NULL;

static int OnDrawListItem(listbox_t *lb, rect *rc, int num)
{
	char	info[60];

	if (num >= g_pPhRecord->recSum)
		return -1;

	num = g_pPhRecord->recSum-num-1;
	MoveTo(rc->Xmin + 2, rc->Ymax);
	memset(info, 0, 60);
	GetNameFromNumber(g_pPhRecord->record[num].number, info);
	DrawText((BYTE*)info, 0, 12);
//	sprintf(info, "%4d", g_pPhRecord->record[num].seconds);
//	MoveTo(rc->Xmin + 130, rc->Ymax - 1);
//	DrawText(info, 0, 4);
	return 0;
}

const static char *recBoxName[] = { 
	"未 接 电 话",
	"已 接 电 话",
	"呼 出 电 话",
};

static void OnPaint(void)
{
	rect	rc;

	TextAlign(alignCenter, alignBottom);
	MoveTo(LCD_HMID, LCD_HEIGHT);
	DrawString((BYTE*)TranslateChar(recBoxName[phoneRecPage]));
	TextAlign(alignLeft, alignBottom);
	SetRect(&rc, 0, LCD_HEIGHT-HZ_MAIN, LCD_WIDTH, LCD_HEIGHT);
	InvertRect(&rc);
	
}

static int rec_wnd_proc(XMSG *msg)
{
	int		sel;
	switch (msg->message) {
	case MSG_PAINT:
		EraseRect(&msg->comp->rc);
		OnPaint();
		break;
	case MSG_KEYDOWN:
		switch (msg->param1) {
		case KEY_OK:
			if (0 == g_pPhRecord->recSum)
				break;
			sel = g_pPhRecord->recSum - g_pPhRecord->select - 1;
			setDialNumber(g_pPhRecord->record[sel].number);
			XPostQuitMessage(&g_pPhRecord->wnd);
			break;
		case KEY_CANCEL:
			g_pPhRecord->next = -1;
			XPostQuitMessage(&g_pPhRecord->wnd);
			break;
		case KEY_UP:
		case KEY_DOWN:
			XListBoxKeyHandle(&g_pPhRecord->list, msg->param1);
			g_pPhRecord->select = XListBoxGetSelect(&g_pPhRecord->list);
			break;
		case KEY_MENU:
			XPopMenu(&g_pPhRecord->tmenu, 1, LCD_HEIGHT-2, 0);
			break;
		case KEY_DH://yu  case KEY_QIEHUAN:// 通话记录切换case KEY_D1:
			phoneRecPage++;
			phoneRecPage %= 3;
			g_pPhRecord->select = 0;
			g_pPhRecord->next = 2;
			XPostQuitMessage(&g_pPhRecord->wnd);
			break;
		default:
			break;
		}
	default :
		XDefaultWindowProc(msg);
		break;
	}
	return 0;
}


static int OnMenuDeleteAll(menu_t *pMenu)
{
	if (0 == g_pPhRecord->recSum)
		return -1;

	if (XMessageBox(NULL,TranslateChar("删除全部?"), ID_OK) != ID_OK)
		return -1;

	g_pPhRecord->select = 0;
	REC_DeleteAll(phoneRecPage);
	g_pPhRecord->next = 2;
	XTipWndShow(TranslateChar("删除成功"),1);//yu add
	XPostQuitMessage(&g_pPhRecord->wnd);
	return 0;
}

extern int OnStoreSimCard(char * number);
#if 1
static int OnMenuStoreCard(menu_t *pMenu)
{
	BYTE	box;
	menu_t	popmenu;
	int		sel;
	int id;
	if (0 == g_pPhRecord->recSum)
		return -1;

	sel = g_pPhRecord->recSum - g_pPhRecord->select - 1;

	XCreateMenu(NULL, &popmenu);
	XAppendMenuItem(&popmenu, TranslateChar("本机电话本"), NULL);
	XAppendMenuItem(&popmenu, TranslateChar("SIM电话本"), NULL);
	
	id = XPopMenu(&popmenu, 28, LCD_HEIGHT-18, 1);
	box = 0;
	switch (id) {
	case 0:
		if(0==OnStoreCard(g_pPhRecord->record[sel].number))
			box = 1;
		break;
	case 1:
		if(0==OnStoreSimCard(g_pPhRecord->record[sel].number))
			box = 1;
		break;
	default:
		break;
	}

	if (box == 0)
		{
		XTipWndShow(TranslateChar("保存失败"),1);
		XShowComponent(&g_pPhRecord->wnd.comp);
		v_WriteLcdBuff();
		return -1;
		}
	XTipWndShow(TranslateChar("保存成功"),1);

	XShowComponent(&g_pPhRecord->wnd.comp);
	v_WriteLcdBuff();
	return 0;

}
#endif
static int OnMenuSendSms(menu_t *pMenu)
{
	int		sel;

	if (0 == g_pPhRecord->recSum)
		return -1;

	sel = g_pPhRecord->recSum - g_pPhRecord->select - 1;
	SMS_SendMessageTo(g_pPhRecord->record[sel].number);
	XShowComponent(&g_pPhRecord->wnd.comp);
	v_WriteLcdBuff();
	return 0;
}

static int OnMenuDeleteOne(menu_t *pMenu)
{
	if (0 == g_pPhRecord->recSum)
		return -1;

	if (XMessageBox(NULL, TranslateChar("删除该记录?"), ID_OK) != ID_OK)
		return -1;

	if(0==REC_DeleteOne(phoneRecPage, (WORD)(g_pPhRecord->recSum - g_pPhRecord->select - 1)))
		XTipWndShow(TranslateChar("删除成功"),1);//yu add
	g_pPhRecord->next = 2;
	XPostQuitMessage(&g_pPhRecord->wnd);
	return 0;
}

static int OnMenuShowDetail(menu_t *pMenu)
{
	int		sel, exit;
	if (0 == g_pPhRecord->recSum)
		return -1;

	sel = g_pPhRecord->recSum - g_pPhRecord->select - 1;
	exit = PH_Detail_Record(&g_pPhRecord->record[sel]);
	if (exit == 1) {
		XPostQuitMessage(&g_pPhRecord->wnd);
	}
	else {
		XShowComponent(&g_pPhRecord->wnd.comp);
		v_WriteLcdBuff();
	}
	return 0;
}

extern int REC_WriteOneFlag(BYTE box, WORD pos);
extern void showUnTalkPhone(int id);
int PH_Talk_Record(void *argv)
{	int Ret,temCnt;
	rect	area;
	XMSG	msg;

	g_pPhRecord = (phone_record_t*)malloc(sizeof(phone_record_t));
	if (NULL == g_pPhRecord)
		return -1;
	g_pPhRecord->select = 0;
	if (argv != NULL) {
		phoneRecPage= (int)argv;
	}

repeat:
	g_pPhRecord->recSum = (BYTE)REC_ReadBox(phoneRecPage, g_pPhRecord->record);
	if (phoneRecPage == PH_REC_UNTALK)
		{
		showUnTalkPhone(0);		/* 表示已经查看未接电话 */ 
		for(temCnt=0;temCnt<g_pPhRecord->recSum;temCnt++)
			{
				REC_WriteOneFlag(PH_REC_UNTALK, temCnt);//清除未接
			}
		}

	
	SetRect(&area, 0, LCD_ICONEND+1, LCD_WIDTH, LCD_HEIGHT);
	XCreateWindow(NULL, &g_pPhRecord->wnd, &area, TranslateChar("通话记录"), rec_wnd_proc, FALSE);
	XSetBaseWindow(&g_pPhRecord->wnd);

	SetRect(&area, 0, LCD_ICONEND+1, LCD_WIDTH-1, LCD_HEIGHT-12-1);
	XCreateListBox(&g_pPhRecord->wnd.comp, \
					&g_pPhRecord->list, &area, \
					g_pPhRecord->recSum, HZ_MAIN, OnDrawListItem);
	g_pPhRecord->select = XListBoxSetCurrent(&g_pPhRecord->list, g_pPhRecord->select);
	
	XCreateMenu(NULL, &g_pPhRecord->tmenu);
	XAppendMenuItem(&g_pPhRecord->tmenu, TranslateChar(recName[0]), OnMenuShowDetail);
	XAppendMenuItem(&g_pPhRecord->tmenu, TranslateChar(recName[1]), OnMenuStoreCard);
	XAppendMenuItem(&g_pPhRecord->tmenu, TranslateChar(recName[2]), OnMenuSendSms);
	XAppendMenuItem(&g_pPhRecord->tmenu, TranslateChar(recName[3]), OnMenuDeleteOne);
	XAppendMenuItem(&g_pPhRecord->tmenu, TranslateChar(recName[4]), OnMenuDeleteAll);
	
	XShowComponent(&g_pPhRecord->wnd.comp);

	v_WriteLcdBuff();
	g_pPhRecord->next = 0;
	while (XGetMessage(&msg) != -1)
		XDispatchMessage(&msg);

	XDestroyWindow(&g_pPhRecord->wnd);
	Ret=g_pPhRecord->next;
	if (2 == g_pPhRecord->next)
		goto repeat;
	
	free(g_pPhRecord);
	g_pPhRecord = NULL;
	debug_print_str(DM_RUNINFO, (info_buffer, "PH_Talk_Record Ret: %d", Ret));
	return 0;
}

typedef struct {
	window_t	wnd;
	textbox_t	tBox;
	PHONE_RECORD *pRec;
	int			len;
	char		info[256];
	int			exit;
} rec_detail_t;
rec_detail_t  *g_pDetailRec = NULL;

static int recordToShow(PHONE_RECORD *rec)
{
	char	*pDst;
	char	info[60];

	pDst = g_pDetailRec->info;
	strcpy(pDst, " ");
	if (GetNameFromNumber(rec->number, info) < 0) {
		/* 电话本中不存在 */ 
		strcat(pDst, TranslateChar("电话号码"));
	}
	else {
		strcat(pDst, info);
	}
	strcat(pDst, ":\n");
	strcat(pDst, rec->number);

	strcat(pDst, "\n");
	strcat(pDst, TranslateChar("通话日期"));
	strcat(pDst, ":\n");
	sprintf(info, "%04d-%02d-%02d", \
			(int)((rec->date>>16)&0xFFFF), \
			(int)((rec->date>>8)&0xFF), \
			(int)(rec->date&0xFF) );
	strcat(pDst, info);

	strcat(pDst, "\n");
	strcat(pDst, TranslateChar("通话时间"));
	strcat(pDst, ":\n");
	sprintf(info, "%02d-%02d-%02d", \
			(int)((rec->time>>16)&0xFF), \
			(int)((rec->time>>8)&0xFF), \
			(int)(rec->time&0xFF) );
	strcat(pDst, info);
	
	strcat(pDst, "\n");
	strcat(pDst, TranslateChar("通话时长"));
	strcat(pDst, ":\n");
	sprintf(info, "%02d分%02d秒", rec->seconds/60, rec->seconds%60);
	strcat(pDst, info);

	return strlen(pDst);
}

static int rec_detail_proc(XMSG *msg)
{
	switch (msg->message) {
	case MSG_KEYDOWN:
		switch (msg->param1) {
		//case KEY_MENU://yu add 1
		case KEY_OK:
			setDialNumber(g_pDetailRec->pRec->number);
			g_pDetailRec->exit = 1;
//			XMessageBox("12", "拨号", ID_OK);
			XPostQuitMessage(&g_pDetailRec->wnd);
			break;
		case KEY_CANCEL:
			g_pDetailRec->exit = -1;
			XPostQuitMessage(&g_pDetailRec->wnd);
			break;
		case KEY_UP:
		case KEY_DOWN:
			XTextBoxKeyHandle(&g_pDetailRec->tBox, msg->param1);
			break;
		}
		break;
	default:
		XDefaultWindowProc(msg);
		break;
	}
	return 0;
}

int PH_Detail_Record(PHONE_RECORD *pRec)
{
	int		exit;
	rect	area;
	XMSG	msg;
	
	g_pDetailRec = (rec_detail_t*)malloc(sizeof(rec_detail_t));
	if (NULL == g_pDetailRec)
		return -1;

	g_pDetailRec->pRec = pRec;
	g_pDetailRec->len = recordToShow(pRec);
//	memcpy(&g_pDetailRec->rec, pRec, sizeof(PHONE_RECORD));
	SetRect(&area, 0, LCD_ICONEND+1, LCD_WIDTH-1, LCD_HEIGHT-1);
	XCreateWindow(NULL, &g_pDetailRec->wnd, &area, "详细记录", rec_detail_proc, FALSE);
	
	XCreateTextBox(&g_pDetailRec->wnd.comp, &g_pDetailRec->tBox, \
					&area, g_pDetailRec->len, (BYTE*)g_pDetailRec->info);
	
	XShowComponent(&g_pDetailRec->wnd.comp);
	v_WriteLcdBuff();
	
	g_pDetailRec->exit = -2;
	while (XGetMessage(&msg) != -1)
		XDispatchMessage(&msg);
	
	XDestroyWindow(&g_pDetailRec->wnd);
	
	exit = g_pDetailRec->exit;
	free(g_pDetailRec);
	g_pDetailRec = NULL;
	
	return exit;
}

⌨️ 快捷键说明

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