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

📄 phonecard.c

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

#include "datatype.h"
#include "general.h"
#include "common.h"
#include "mmalloc.h"
#include "windows.h"
#include "pub_wnd.h"
#include "smsbrowse.h"
#include "para_def.h"
#include "grpmanage.h"
#include "cardmanage.h"
#include "phonecard.h"

#include "debug_out.h"
#include "phonebook.h"//yu
#include "Translate.h"
 
#define  COMPILE_OK  1
#define  COMPILING	 1

#define  FIND_BY_NAME	0
#define  FIND_BY_NUMBER	1

//static int PB_GroupManage(void);
static int PB_SelectGroup(BYTE *oldGrp);
static int PB_DetailShow(WORD pos);
static int PB_StoreInfo(void);

static PHONE_CARD gFindedCard;
static BYTE	gDisplayGroup = 0xFF;

int xstrcmp(char *pSrc, char *pDst, int len)
{
	int 	i;
	char	a, b;
	for (i = 0; i < len; ++i) {
		a = *pSrc++;
		b = *pDst++;
		if ((a >= 'a') && (a <= 'z'))
			a -= 0x20;
		if ((b >= 'a') && (b <= 'z'))
			b -= 0x20;
		if (a != b)
			return (a-b);
	}
	return 0;
}

PHONE_CARD *GetSelectCard(void)
{
	return &gFindedCard;
}

static int inputFullCard(PHONE_CARD *pCard)
{
	PHONE_CARD	nCard;
	char	number[NUMBER_LEN];
	rect	area;
	int		sel, data;
	
	memcpy(&nCard, pCard, sizeof(PHONE_CARD));
	sel = PB_SelectGroup(&nCard.group);
	if (sel < 0)
		return -1;

	memcpy(number, nCard.number, NUMBER_LEN);
	
inputnumber:
	SetRect(&area, 10, 12, 102, LCD_HEIGHT-14);//yu	SetRect(&area, 10, LCD_ICONEND+2, LCD_WIDTH-10, LCD_HEIGHT-17);
	sel = InputLine(&area, TranslateChar("输入号码"), (BYTE*)number, NUMBER_LEN-1, INPUT_DIGITAL | INPUT_FIXED);
	if (sel < 0)
		return -1;
	
	if (CheckNumberExist(number, nCard.number)) {
		XTipWndShow(TranslateChar("号码已经存在"),1);	//XMessageBox(NULL,TranslateChar("号码已经存在"), ID_OK);
		goto inputnumber;
	}
	if(0==strlen(number))	
		goto inputnumber;

inputname:
		SetRect(&area, 10, 12, 102, LCD_HEIGHT-14);//yuSetRect(&area, 10, LCD_ICONEND+2, LCD_WIDTH-10, LCD_HEIGHT-17);
	sel = InputLine(&area, TranslateChar("输入姓名"), (BYTE*)nCard.name, NAME_LEN-1, INPUT_PINYIN);
	if (sel == -1)
		return -1;
	if (sel == -2)
		goto inputnumber;
	if(0==strlen(nCard.name))	
		goto inputname;

//-----------------	yu 
	if((0==strlen(nCard.name)) && (0== strlen(number)))
		{
			XTipWndShow(TranslateChar("保存错误"),1);
			return -3;
		}
//-----------------	
//inputtype:
//--
	data = nCard.type_ring;
	sel  = SelectCallring(&data);
	if (sel == -1)
		return -1;
	if (sel == -2)
		goto inputname;
	nCard.type_ring = (BYTE)data;
//--
//input_ok:
	memcpy(nCard.number, number, NUMBER_LEN-1);//yu memcpy(nCard.number, number, NAME_LEN-1);
	memcpy(pCard, &nCard, sizeof(PHONE_CARD));
	return 0;
}

#if COMPILE_OK

const static char *menuName[] = { 
// 0	"详细信息",
// 1	"修改记录",
	"增加号码",
// 3	"添加备注",
	"删除记录",
	"删除全部", 
//	"类别管理",
	"存储状态",
};
	
typedef struct {
	window_t	wnd;
	listbox_t	list;
	inputbox_t	*keyb;
	menu_t		tmenu;
	int			select;

	WORD		card[MAX_CARD_NUM];		/* 搜索结果,待显示的电话本 */ 
	WORD		acard[MAX_CARD_NUM];	/* 全部待搜索电话本 */ 
	WORD		total;					/* 全部待搜索电话本总数 */ 
	WORD		sum;					/* 搜索结果,待显示的电话本数目 */ 

	char		keyWord[NUMBER_LEN];	/* 关键字 */ 
	BYTE		keyLen;					/* 关键字输入长度 */ 
	
	BYTE		group[MAX_GROUP_NUM];
	BYTE		grpSum;
	BYTE		grpCur;
	BYTE		grpShow;

	BYTE		idFind;
	int			next;			/* 退出状态 */ 
} pb_browse_t;
static pb_browse_t  *gPBBrowse = NULL;

static int OnDrawCardItem(listbox_t *lb, rect *rc, int num)
{
	PHONE_CARD	nCard;
	
	if (num >= gPBBrowse->sum)
		return -1;
	
	if (PB_ReadOne(gPBBrowse->card[num], &nCard) < 0)
		return -1;
	MoveTo(rc->Xmin + 2, rc->Ymax);
	if(0==strlen(nCard.name))
		DrawText((BYTE*)nCard.number, 0, 12);
	else
		DrawText((BYTE*)nCard.name, 0, 12);
	return 0;
}

static WORD	SearchPhoneBook(char *keyWord)
{
	WORD	i, finded;
	int		len;
	char	ascName[NAME_LEN];
	PHONE_CARD	nCard;
	
	len = strlen(keyWord);
	if (len == 0) {
		memcpy(gPBBrowse->card, gPBBrowse->acard, MAX_CARD_NUM*2);
		gPBBrowse->sum = gPBBrowse->total;
		return gPBBrowse->total;
	}
	
	finded = 0;
	for (i = 0; i < gPBBrowse->total; ++i) {
		PB_ReadOne(gPBBrowse->acard[i], &nCard);
		ChangeNameToASCII((BYTE*)nCard.name, (BYTE*)ascName, NAME_LEN);
		if (xstrcmp(ascName, keyWord, len) != 0)
			continue;
		gPBBrowse->card[finded++] = gPBBrowse->acard[i];
	}
	return finded;
}

static WORD	SearchGroupPhoneBook(BYTE grp)
{
	WORD	i, finded;
	PHONE_CARD	nCard;
	
	finded = 0;
	for (i = 0; i < gPBBrowse->total; ++i) {
		PB_ReadOne(gPBBrowse->acard[i], &nCard);
		if (nCard.group != grp)
			continue;
		gPBBrowse->card[finded++] = gPBBrowse->acard[i];
	}
	return finded;
}


static int	SearchPhoneCard(void)
{
	if (gDisplayGroup != 0xFF)
		gPBBrowse->sum = SearchGroupPhoneBook(gDisplayGroup);
	else
		gPBBrowse->sum = SearchPhoneBook(gPBBrowse->keyWord);
	return (int)(gPBBrowse->sum);
}


static void ShowKeyword(void)
{
	rect	area;
	BYTE	first, len;
	
	SetRect(&area, 48, LCD_HEIGHT-HZ_MAIN, LCD_WIDTH, LCD_HEIGHT);
	EraseRect(&area);
	first = 0;
	len = gPBBrowse->keyLen;
	if (len > 10) {
		first = len - 10;
		len = 10;
	}
	MoveTo(60, LCD_HEIGHT+1);
	DrawText((BYTE*)gPBBrowse->keyWord, first, len);
}

static void OnPaintGroup(void)
{
	char	name[GRP_NAME_LEN];
	rect	rc;
	
	if (gPBBrowse->grpShow == 0xFF)
		return;

	GRP_ReadOne(gPBBrowse->group[gPBBrowse->grpCur], name);

	TextAlign(alignCenter, alignBottom);
	MoveTo(LCD_HMID, LCD_HEIGHT);
	DrawString((BYTE*)name);
	TextAlign(alignLeft, alignBottom);
	SetRect(&rc, 0, LCD_HEIGHT-12, LCD_WIDTH, LCD_HEIGHT);
	InvertRect(&rc);
}

static void OnBrowseKeyDown(int keyID)
{
	int		tmp;
	switch (keyID) {
	case KEY_MENU:
		/* 删除输入法键盘 */ 
		XDeleteInputBoard(gPBBrowse->keyb);
		XPopMenu(&gPBBrowse->tmenu, 1, LCD_HEIGHT-2, 0);
		/* 重新创建输入法键盘 */ 
		gPBBrowse->keyb = XCreateInputBoard(&gPBBrowse->wnd.comp, INPUT_ENGLISH | INPUT_FIXED);
		if (gDisplayGroup != 0xFF) {
			XDisableInput(gPBBrowse->keyb);
		}
		else {
			XShowInputBoard(gPBBrowse->keyb);
			v_WriteLcdBuff();
		}
		break;
	case KEY_OK:
		if (0 != gPBBrowse->sum) {
			if (gPBBrowse->idFind == 1) {
				PB_ReadOne(gPBBrowse->card[gPBBrowse->select], &gFindedCard);
				gPBBrowse->next = 1;
			}
			else {
				/* 删除输入法键盘 */ 
				XDeleteInputBoard(gPBBrowse->keyb);
				tmp = PB_DetailShow(gPBBrowse->card[gPBBrowse->select]);
				if (tmp == 1)
					gPBBrowse->next = 1;
				else
					gPBBrowse->next = 2;
				/* 重新创建输入法键盘 */ 
				gPBBrowse->keyb = XCreateInputBoard(&gPBBrowse->wnd.comp, INPUT_ENGLISH | INPUT_FIXED);
				if (gDisplayGroup != 0xFF) {
					XDisableInput(gPBBrowse->keyb);
				}
			}
			XPostQuitMessage(&gPBBrowse->wnd);
		}
		break;
	case KEY_CANCEL://yu add
			//gPBBrowse->grpShow != 0xFF;???
			gPBBrowse->keyLen=0;
			gPBBrowse->next = -1;
			XPostQuitMessage(&gPBBrowse->wnd);
		break;
	case KEY_DEL:
		if ((gPBBrowse->grpShow == 0xFF) && gPBBrowse->keyLen) {
			gPBBrowse->keyLen--;
			gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
			ShowKeyword();
			gPBBrowse->select = 0;
			SearchPhoneCard();
			XListBoxSet(&gPBBrowse->list, gPBBrowse->sum, HZ_MAIN, OnDrawCardItem);
			gPBBrowse->select = XListBoxSetCurrent(&gPBBrowse->list, gPBBrowse->select);
			XShowComponent(&gPBBrowse->list.comp);
			v_WriteLcdBuff();
			return;
		}
		else {
			gPBBrowse->next = -1;
			XPostQuitMessage(&gPBBrowse->wnd);
		}
		break;
	case KEY_UP:
	case KEY_DOWN:
		XListBoxKeyHandle(&gPBBrowse->list, keyID);
		gPBBrowse->select = XListBoxGetSelect(&gPBBrowse->list);
		break;
	default:
		break;
	}
}

static int pbBrowseProc(XMSG *msg)
{
	int		num;
	BYTE	*buf;
	
	switch (msg->message) {
	case MSG_PAINT:
		EraseRect(&msg->comp->rc);
		OnPaintGroup();
		break;

	case MSG_WAITOUT:
	case MSG_KEYDOWN:
		num = XInputMsgHandle(gPBBrowse->keyb, msg);
		if (num == 1) {
			buf = XInputGetInput(gPBBrowse->keyb);
			if (gPBBrowse->keyLen < NUMBER_LEN-1) {
				gPBBrowse->keyWord[gPBBrowse->keyLen++] = buf[0];
				gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
				if (0 == SearchPhoneCard()) {
					gPBBrowse->keyLen--;
					gPBBrowse->keyWord[gPBBrowse->keyLen] = 0;
					SearchPhoneCard();
				}
				ShowKeyword();
				XListBoxSet(&gPBBrowse->list, gPBBrowse->sum, HZ_MAIN, OnDrawCardItem);
				gPBBrowse->select = XListBoxSetCurrent(&gPBBrowse->list, gPBBrowse->select);
				XShowComponent(&gPBBrowse->list.comp);
				v_WriteLcdBuff();
			}
		}
		else if (num == 0) {
			OnBrowseKeyDown(msg->param1);
		}
		else {
			v_WriteLcdBuff();
		}
		break;
	default:
		XDefaultWindowProc(msg);
		break;
	}
	return 0;
}

static int OnMenuNewCard(menu_t *pMenu)
{
	int		inStat;
	PHONE_CARD	nCard;

	if (MAX_CARD_NUM == PB_GetNumber()) {
		XTipWndShow(TranslateChar("空间已满"),1);//yu XMessageBox(NULL, TranslateChar("空间已满"), ID_OK);
		return -1;
	}
	memset(&nCard, 0, sizeof(PHONE_CARD));
	nCard.group = gPBBrowse->grpShow;
	nCard.prior = gDevicePara.dev.defPrior;

	
	inStat = inputFullCard(&nCard);

	if (0 == inStat) {
		PB_WriteOne(NEW_CARD, &nCard);
		XTipWndShow(TranslateChar("保存成功"),1);//yu add
		
		gPBBrowse->next = 2;
		gPBBrowse->select = gPBBrowse->sum;
		XPostQuitMessage(&gPBBrowse->wnd);
	}
	else {
		XTipWndShow(TranslateChar("保存失败"),1);
		XShowComponent(&gPBBrowse->wnd.comp);
		v_WriteLcdBuff();
	}
	return 0;
}


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

	if (XMessageBox(NULL, TranslateChar("删除电话本?"), ID_OK) == ID_OK) {
		if(0==PB_DeleteOne(gPBBrowse->card[gPBBrowse->select]))
			XTipWndShow(TranslateChar("删除成功"),1);//yu add
		gPBBrowse->next = 2;
		XPostQuitMessage(&gPBBrowse->wnd);
	}
	return 0;
}
extern void PB_ClearData(void);

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

	if (XMessageBox(NULL, TranslateChar("删除全部?"), ID_OK) == ID_OK) {
		PB_ClearData();
		XTipWndShow(TranslateChar("删除成功"),1);//yu add
		gPBBrowse->next = 2;
		XPostQuitMessage(&gPBBrowse->wnd);
	}
	return 0;
}

/*
static int OnMenuGroup(menu_t *pMenu)
{
	PB_GroupManage();
	gPBBrowse->grpSum = GRP_GetIndex(gPBBrowse->group, MAX_GROUP_NUM);
	if (gPBBrowse->grpShow != 0xFF) {
		if (gPBBrowse->grpSum == 0) {
			gPBBrowse->grpShow = 0xFF;
		}
		else {
			if (gPBBrowse->group[gPBBrowse->grpCur] != gPBBrowse->grpShow) {
				gPBBrowse->grpCur  = 0;
				gPBBrowse->grpShow = 0xFF;
			}
		}
	}
//	XShowComponent(&gPBBrowse->wnd.comp);
	gPBBrowse->next = 2;
	XPostQuitMessage(&gPBBrowse->wnd);
	return 0;
}
*/
static int OnMenuStoreInfo(menu_t *pMenu)
{
	PB_StoreInfo();
	XShowComponent(&gPBBrowse->wnd.comp);
	v_WriteLcdBuff();
	return 0;
}


int PB_Browse(void *argv)
{
	rect	area;
	XMSG	msg;
	BYTE	i;
	int		ret;

	gPBBrowse = (pb_browse_t*)malloc(sizeof(pb_browse_t));
	if (NULL == gPBBrowse)
		return -1;

	gPBBrowse->idFind = 0;
	if (argv != NULL) {
		gPBBrowse->idFind = 1;
		gDisplayGroup = 0xFF;		/* 全程搜索 */ 
	}
//	memset(gPBBrowse, 0, sizeof(pb_browse_t));

	gPBBrowse->select = -1;		/* 没有选择项 */ 
	gPBBrowse->grpShow= gDisplayGroup;
	gPBBrowse->grpSum = GRP_GetIndex(gPBBrowse->group, MAX_GROUP_NUM);

	gPBBrowse->grpCur = 0;
	if (gDisplayGroup != 0xFF) {
		for (i = 0; i < gPBBrowse->grpSum; ++i) {
			if (gPBBrowse->group[i] == gDisplayGroup) {
				gPBBrowse->grpCur = i;
				break;
			}
		}
	}

repeat:
	gPBBrowse->total = PB_GetIndex(0xFF, gPBBrowse->acard);
//	gPBBrowse->select = 0;
	if (gPBBrowse->grpShow == 0xFF) {
		gPBBrowse->keyLen = 0;
		gPBBrowse->keyWord[0] = 0;
	}
	/* 参数设置模块窗口的矩形区域 */ 
	SetRect(&area, 0, LCD_ICONEND+1, LCD_WIDTH, LCD_HEIGHT);

	/* 创建参数设置模块的窗口,父窗口为空 */ 
	XCreateWindow(NULL, &gPBBrowse->wnd, &area, TranslateChar("电话本"), pbBrowseProc, FALSE);

⌨️ 快捷键说明

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