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

📄 phonebook_drv.c

📁 利用61板、SPR模组、SPLC501液晶模组和4×4键盘建立手机通讯录模型
💻 C
字号:
//======================================================
// 文件名称:	PhoneBook_Drv.c
// 功能描述:	通讯录数据结构操作函数集,用于插入、删除、修改通讯录条目
// 维护记录:	2006-09-20	v1.0
//======================================================

#include "..\include\Flash.h"
#include "..\include\PhoneBook.h"
#include "..\include\CommonFunc.h"

PHONEBOOK_IDX *p_PB_Idx = (PHONEBOOK_IDX *)PB_IDX_SA;	// 通讯录索引指针

//========================================================================
//	语法格式:	PHONEBOOK *PB_GetInsertPos(PHONEBOOK *p_PB_Item)
//	实现功能:	获取当前条目应插入到链表中的位置(私有函数),使所有条目按姓名排序
//	参数:		p_PB_Item		准备插入的条目指针
//	返回值:	新条目将插入到某个已知条目前,函数返回这个已知条目的指针
//				如果未找到(新条目将插到链表尾部)则返回NULL
//========================================================================
PHONEBOOK *PB_GetInsertPos(PHONEBOOK *p_PB_Item)
{
	PHONEBOOK *p_PB_Temp;
	unsigned char *p_Char1, *p_Char2, Temp1, Temp2;
	unsigned char Flag_Temp;
	 
	p_PB_Temp = p_PB_Idx->FirstItem;
	Flag_Temp = 0;
	while(p_PB_Temp->Flag_Del != 0xffff)				
	{
		p_Char1 = p_PB_Item->Name;
		p_Char2 = p_PB_Temp->Name;
		
		while(*p_Char2 != '\0')							// 字符串比较
		{
			Temp1 = (*p_Char1<<8)|(*p_Char1>>8);
			Temp2 = (*p_Char2<<8)|(*p_Char2>>8);
			if(Temp1 < Temp2)
			{
				Flag_Temp = 1;							// 找到了应插入的位置
				break;
			}
			else if(Temp1 == Temp2)
			{
				p_Char1++;
				p_Char2++;
			}
			else
				break;
		}
		if(Flag_Temp)break;								// 若找到位置则退出
		p_PB_Temp = p_PB_Temp->NextItem;				// 与下一条目比较
	}
	if(p_PB_Temp->Flag_Del != 0xffff)
		return p_PB_Temp;								// 新条目应插入到p_PB_Temp之前
	else
		return NULL;									// 新条目应插入到链表末尾
}


//========================================================================
//	语法格式:	PHONEBOOK *PB_GetEmptyPos(unsigned int Pos)
//	实现功能:	获取一块可用存储空间,用来保存通讯录条目(私有函数)
//	参数:		Pos		获取第Pos块可用空间(从低地址向高地址搜索)
//	返回值:	找到的可用空间首地址,若未找到则返回NULL
//========================================================================
PHONEBOOK *PB_GetEmptyPos(unsigned int Pos)
{
	PHONEBOOK *p_PB_Temp;

	p_PB_Temp = (PHONEBOOK*)PB_ITEM_SA;					// 从条目存储空间的最低地址开始查找

	while(Pos>0)
	{
		if(p_PB_Temp < (PHONEBOOK*)PB_ITEM_SA + PB_MAX_ITEM)
		{
			while(p_PB_Temp->Flag_Del!=0xffff)
				p_PB_Temp++;
		}
		else
		{
			return NULL;			
		}		
		Pos--;		
		p_PB_Temp++;
	}
	return  p_PB_Temp-1;
}

//========================================================================
//	语法格式:	PHONEBOOK *PB_Item_Insert(PHONEBOOK *p_PB_Item)
//	实现功能:	向链表中插入一个条目
//	参数:		p_PB_Item	待插入条目的指针
//	返回值:	条目插入链表后的存储地址
//========================================================================
PHONEBOOK *PB_Item_Insert(PHONEBOOK *p_PB_Item)
{
	PHONEBOOK_IDX PB_Idx;
	PHONEBOOK *p_PB_Temp, *p_PB_Cur;
	unsigned int i;
	
	p_PB_Cur = p_PB_Item;
	
	p_PB_Temp = PB_GetInsertPos(p_PB_Cur);
	if(p_PB_Temp == NULL)								// 插入到链表末尾
	{
		if(p_PB_Idx->ItemNum==0)
			p_PB_Cur->PreItem = PB_GetEmptyPos(2);
		else
			p_PB_Cur->PreItem = p_PB_Idx->LastItem;
		p_PB_Cur->NextItem = PB_GetEmptyPos(2);
		PB_Idx.FirstItem = p_PB_Idx->FirstItem;
		PB_Idx.LastItem = PB_GetEmptyPos(1);
	}
	else												// 插入到链表中
	{
		if(p_PB_Temp->PreItem->Flag_Del == 0xffff)		// 链表头部
		{
			p_PB_Cur->PreItem = PB_GetEmptyPos(2);
			PB_Idx.FirstItem = PB_GetEmptyPos(1);
		}
		else
		{
			p_PB_Cur->PreItem = p_PB_Temp->PreItem;		// 链表中部
			PB_Idx.FirstItem = p_PB_Idx->FirstItem;
		}
		p_PB_Cur->NextItem = p_PB_Temp;
		PB_Idx.LastItem = p_PB_Idx->LastItem;
	}
	p_PB_Cur = PB_GetEmptyPos(1);
	Flash_Modify((unsigned int)p_PB_Cur, (unsigned int*)p_PB_Item, sizeof(PHONEBOOK));
	p_PB_Item = p_PB_Cur;
	
	///	保存通讯录索引
	PB_Idx.ItemNum = p_PB_Idx->ItemNum + 1;
	if(p_PB_Cur->VoiceIdx!=0xffff)
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num + 1;
	else
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num;
	for(i=0;i<PB_MAX_VOICE;i++)
		PB_Idx.Voice_PBAddr[i] = p_PB_Idx->Voice_PBAddr[i];
	if(p_PB_Cur->VoiceIdx != 0xffff)
		PB_Idx.Voice_PBAddr[p_PB_Cur->VoiceIdx] = p_PB_Cur;
	Flash_Modify(PB_IDX_SA, (unsigned int*)&PB_Idx, sizeof(PHONEBOOK_IDX));

	/// 更新相关链表项
	if(p_PB_Cur->PreItem->Flag_Del!=0xffff)
	{
		p_PB_Temp = p_PB_Cur->PreItem;
		Flash_Modify((unsigned int)&(p_PB_Temp->NextItem), (unsigned int*)&p_PB_Cur, sizeof(PHONEBOOK *));
	}
	if(p_PB_Cur->NextItem->Flag_Del!=0xffff)
	{
		p_PB_Temp = p_PB_Cur->NextItem;
		Flash_Modify((unsigned int)&(p_PB_Temp->PreItem), (unsigned int*)&p_PB_Cur, sizeof(PHONEBOOK *));
	}
	p_PB_Temp = PB_GetEmptyPos(1);
	p_PB_Cur = p_PB_Idx->FirstItem;
	Flash_Modify((unsigned int)&(p_PB_Cur->PreItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
	p_PB_Cur = p_PB_Idx->LastItem;
	Flash_Modify((unsigned int)&(p_PB_Cur->NextItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
	
	return p_PB_Item;
}

//========================================================================
//	语法格式:	PHONEBOOK *PB_Item_Del(PHONEBOOK *p_PB_Item)
//	实现功能:	从链表中删除一个条目
//	参数:		p_PB_Item	待删除条目的指针
//	返回值:	删除的条目所在地址
//========================================================================
PHONEBOOK *PB_Item_Del(PHONEBOOK *p_PB_Item)
{
	PHONEBOOK_IDX PB_Idx;
	PHONEBOOK *p_PB_Temp, *p_PB_Cur;
	unsigned int i;
	
	p_PB_Cur = p_PB_Item;
	i = 0xffff;
	
	Flash_Modify((unsigned int)&p_PB_Cur->Flag_Del, &i, sizeof(unsigned int));
	
	///	保存通讯录索引
	PB_Idx.ItemNum = p_PB_Idx->ItemNum - 1;
	if(PB_Idx.ItemNum==0)
	{
		PB_Idx.FirstItem = (PHONEBOOK *)PB_ITEM_SA;
		PB_Idx.LastItem = (PHONEBOOK *)PB_ITEM_SA;
	}
	else
	{
		if(p_PB_Cur==p_PB_Idx->FirstItem)
			PB_Idx.FirstItem = p_PB_Cur->NextItem;
		else
			PB_Idx.FirstItem = p_PB_Idx->FirstItem;

		if(p_PB_Cur==p_PB_Idx->LastItem)
			PB_Idx.LastItem = p_PB_Cur->PreItem;
		else
			PB_Idx.LastItem = p_PB_Idx->LastItem;
	}
	if(p_PB_Cur->VoiceIdx!=0xffff)
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num - 1;
	else
		PB_Idx.Voice_Num = p_PB_Idx->Voice_Num;

	for(i=0;i<PB_MAX_VOICE;i++)
		PB_Idx.Voice_PBAddr[i] = p_PB_Idx->Voice_PBAddr[i];
	if(p_PB_Cur->VoiceIdx != 0xffff)
		PB_Idx.Voice_PBAddr[p_PB_Cur->VoiceIdx] = NULL;
	
	Flash_Modify(PB_IDX_SA, (unsigned int*)&PB_Idx, sizeof(PHONEBOOK_IDX));

	/// 更新相关链表项
	if(p_PB_Cur->PreItem->Flag_Del!=0xffff)
	{
		p_PB_Temp = p_PB_Cur->PreItem;
		Flash_Modify((unsigned int)&(p_PB_Temp->NextItem), (unsigned int*)&p_PB_Cur->NextItem, sizeof(PHONEBOOK *));
	}
	if(p_PB_Cur->NextItem->Flag_Del!=0xffff)
	{
		p_PB_Temp = p_PB_Cur->NextItem;
		Flash_Modify((unsigned int)&(p_PB_Temp->PreItem), (unsigned int*)&p_PB_Cur->PreItem, sizeof(PHONEBOOK *));
	}
	p_PB_Temp = PB_GetEmptyPos(1);
	p_PB_Cur = p_PB_Idx->FirstItem;
	if(p_PB_Cur->Flag_Del!=0xffff)
		Flash_Modify((unsigned int)&(p_PB_Cur->PreItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
	p_PB_Cur = p_PB_Idx->LastItem;
	if(p_PB_Cur->Flag_Del!=0xffff)
		Flash_Modify((unsigned int)&(p_PB_Cur->NextItem), (unsigned int*)&p_PB_Temp, sizeof(PHONEBOOK *));
	
	return p_PB_Item;	
}


//========================================================================
//	语法格式:	PHONEBOOK *PB_Item_Search(unsigned char *KeyWord, PHONEBOOK *p_PB_Start, unsigned int Direction)
//	实现功能:	搜索一个以指定关键字开头的条目
//	参数:		KeyWord			搜索的关键字
//				p_PB_Start		从哪个条目开始搜索
//				Direction		搜索方向,0-向前搜索,1-向后搜索
//	返回值:	搜索到的条目指针,若未找到匹配条目则返回NULL
//========================================================================
PHONEBOOK *PB_Item_Search(unsigned char *KeyWord, PHONEBOOK *p_PB_Start, unsigned int Direction)
{
	PHONEBOOK *p_PB_Item, *p_PB_Result;
	unsigned char *p_Char1, *p_Char2;
	
	p_PB_Item = p_PB_Start;
	p_PB_Result = NULL;
	while(p_PB_Item->Flag_Del==0)
	{
		p_Char1 = KeyWord;
		p_Char2 = p_PB_Item->Name;
		while(*p_Char2!='\0')						// 逐字比较
		{
			if(*p_Char1!=*p_Char2)break;
			p_Char1++;
			p_Char2++;
		}
		if(*p_Char1=='\0')							// 找到了匹配的条目
		{
			p_PB_Result = p_PB_Item;
			break;
		}
		else										// 若未找到则与下一条目比较
			p_PB_Item = (Direction==0) ? p_PB_Item->PreItem : p_PB_Item->NextItem;
	}
	return p_PB_Result;
}

⌨️ 快捷键说明

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