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

📄 do_handle.c

📁 车载GPS监控终端的完整代码,与监控中心的通讯采用GPRS.
💻 C
📖 第 1 页 / 共 4 页
字号:
		SRAM_Write(PHONE_AT_2+0,VAILD_2);
		SRAM_Write(PHONE_AT_2+1,H_DIAL);
		SRAM_Write(PHONE_AT_2+2,nTemp-4);
		for(i=3;i<nTemp-1;i++)
		{
			SRAM_Write(PHONE_AT_2+i,gHandle_Buffer[i]);
		}
		//将拨出电话记录存储在相应的Flash中
		//while(gDelay_Flash_Timer<3) {Clear_Exter_WatchDog();}
		//Init_Buffer2();
		Write_Dail_Record(nTemp);
		gDelay_Flash_Timer=0;
		gHandle_Buffer_Point=0;
		gTimer=0;Clear_Exter_WatchDog();
		while(gTimer<500){}
		Clear_Exter_WatchDog();
		OperateSPIEnd();
		//Init_Buffer2();
	}
}

/********************************************************\
*	函数名:Handle_Answer
	作用域:本地文件调用
*	功能:
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Handle_Answer(void)
{
	unsigned char nFlag=0;
	//1,如果设备处于呼入禁止状态下,判断是否有允许此号码呼入的标志
	if(  (gON_OFF_Temp0&PHONE_IN_ON)==0 )
	{
		if(gPublic_Flag&ALLOW_PHONE_IN_F_1)		nFlag=1;
		else									nFlag=0;
	}
	//2,设备没有处于呼入禁止的状态
	else										nFlag=1;

	if(nFlag==1)
	{
		SRAM_Init();
		SRAM_Write(PHONE_AT_2+0,VAILD_2);
		SRAM_Write(PHONE_AT_2+1,H_ANSWER);
		SRAM_Write(PHONE_AT_2+2,0);
	}
	else
	{
		Send_COM3_Load(4,MAIN_RETURN_NO_CALLIN,0);
		SRAM_Init();
		SRAM_Write(PHONE_AT_2+0,VAILD_2);
		SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
		SRAM_Write(PHONE_AT_2+2,0);
	}
}
/********************************************************\
*	函数名:Move_Right_Item()
	作用域:本地文件调用
*	功能:	针对gGeneral_Buffer[]中存储的号码有重复的地方,则如何消除重复号码那一条
*	参数:	Start_Item:
			End_Item:
			Move_Count:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Move_Right_Item(unsigned char Start_Item,unsigned char End_Item,unsigned char Move_Count)
{
	unsigned int i=0,j=0;
	if(Move_Count==1)
	{
		for( i=End_Item;i>Start_Item;i=i-1 )
		{
			for(j=0;j<16;j++)
			{
				gGeneral_Buffer[i*16+j]=gGeneral_Buffer[(i-1)*16+j];
			}
		}
	}
	else if(Move_Count==2)
	{
		for( i=7;i>0;i-- )
		{
			for(j=0;j<32;j++)
			{
				gGeneral_Buffer[i*32+j]=gGeneral_Buffer[(i-1)*32+j];
			}
		}
	}
}

/********************************************************\
*	函数名:Write_Dail_Record
	作用域:本地文件调用
*	功能:	用来在每次拨出电话号码后,存储拨出电话号码的记录
*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
	补充说明:这个子程序是将拨出的电话号码存储在缓冲区中。
			  先判断已经存储的缓冲区中是否有相同的拨好记录
			  如果有,则先将此记录删除,然后重新排列,将
			  整个缓冲向左移动一个存储记录,则将第一个存储
			  记录的空间留下来,则将最新的拨出电话记录存储在
			  位置上。
\********************************************************/
void Write_Dail_Record(unsigned char nPhone_Length)
{
	unsigned char nItem=0xff;
	unsigned int i,j,k;
	i=nPhone_Length;
	Clear_Exter_WatchDog();
	OperateSPIEnd();
	ReadOnePageToBuffer2(FLASH_DIAL_PHONE);	//读第3个扇区的数据到buffer2中
	OperateSPIEnd();
	//将buffer2中的数据转移到gGeneral_Buffer中
	gGeneral_Buffer[0]=ReadByteFromBuffer2(0);
	for(i=1;i<264;i++)	gGeneral_Buffer[i]=ReadNextFromBuffer2();
	OperateSPIEnd();
	//判断gHandle_Buffer[]中的号码是否与gGeneral_Buffer[]中有重复的号码
	i=0;
	k=0;
	while(i<16)
	{
		j=0;
		while(j<nPhone_Length-4)
		{
			if( gGeneral_Buffer[i*16+j]!=gHandle_Buffer[3+j] )
			{
				i++;j=0;k=0;break;
			}
			j++;
			if(j>=nPhone_Length-4)
			{
				k=1;break;
			}
		}
		if(k==1)	break;
	}

	//说明有重复的号码,则将这一条的重复号码给覆盖住
	if(k==1)
	{
		nItem=i;
		if(nItem>0)	Move_Right_Item(0,nItem,1);
	}
	//没有重复号码,则将整个号码向后移动一条。
	else
	{
		Move_Right_Item(0,15,1);
	}
	//将最新号码写在第一条号码的位置
	for(i=0;i<16;i++)
	{
		gGeneral_Buffer[i]=0x20;
	}
	for(i=0;i<nPhone_Length-4;i++)
	{
		gGeneral_Buffer[i]=gHandle_Buffer[3+i];
	}
	//将gGeneral_Buffer[]中的数写入buffer2中
	OperateSPIEnd();
	WriteOneByteToBuffer2(0,gGeneral_Buffer[0]);
	for(i=1;i<264;i++)
	{
		WriteNextByteToBuffer2( gGeneral_Buffer[i] );
	}
	OperateSPIEnd();
	//4,将已经写入了新的拨号记录的buffer2写到flash 相应的区域中
	Clear_Exter_WatchDog();
	P6OUT|=SPI45DB041_WP;
	WriteBuffer2ToPage(FLASH_DIAL_PHONE);
	P6OUT&=~SPI45DB041_WP;
	gTimer=0;Clear_Exter_WatchDog();
	OperateSPIEnd();
}
/********************************************************\
*	函数名:Read_Dail_Record
	作用域:本地文件调用
*	功能:  读取记录拨出电话记录的FLASH中的相应位置的数据

*	参数:	nItem:表示当前所指向的记录号,其值有如下0-----15

*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Read_Dail_Record(unsigned char nItem)
{
	unsigned char nTemp,Record_Flag;
	unsigned int i;
	Clear_Exter_WatchDog();
	OperateSPIEnd();
	//读第3个扇区的数据到buffer2中
	ReadOnePageToBuffer2(FLASH_DIAL_PHONE);
	OperateSPIEnd();
	nTemp = ReadByteFromBuffer2(nItem*0x10);
	OperateSPIEnd();
	Record_Flag=0;
	//判断当前电话记录是否为空
	if( (nTemp>'9')||(nTemp<'0') )	Record_Flag=1;
	else							Record_Flag=0;
	//将所指向的拨出电话号码记录发送出去
	SRAM_Init();
	SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
	SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
	SRAM_Write(SHANDLE_DATA_VAILD+2,0x15);
	SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_DIALRECORD);
	SRAM_Write(SHANDLE_DATA_VAILD+4,nItem);
	if(Record_Flag==0)
	{
		OperateSPIEnd();
		nTemp=ReadByteFromBuffer2(nItem*0x10);
		SRAM_Write(SHANDLE_DATA_VAILD+5,nTemp);
		for(i=1;i<16;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,ReadNextFromBuffer2());
		}
		OperateSPIEnd();
	}
	else
	{
		for(i=0;i<16;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,0x20);
		}
	}
	SRAM_Write(SHANDLE_DATA_VAILD+5+16,0x0d);
}

/********************************************************\
*	函数名:Read_Phone_Note_Record
	作用域:本地文件调用
*	功能:  读取电话号码

*	参数:	nItem:表示当前所指向的记录号,其值有如下1-----20

*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Read_Phone_Note_Record(unsigned char nItem)
{
	unsigned int i=0,j=0,k=0;
	unsigned char Phone_Page=0;
	unsigned char Phone_Item=0;
	unsigned int  Phone_Address=0;
	unsigned char Phone_Num=0;
	unsigned char nTemp=0;

	if( nItem<10 )									Phone_Page=1;
	else if( (nItem>=10)&&(nItem<20) )				Phone_Page=2;
	else											{Phone_Page=0;return;}

	OperateSPIEnd();
	if(Phone_Page==1)
	{
		ReadOnePageToBuffer2(FLASH_PHONE_INFO_ONE_2);
		Phone_Item=nItem;
	}
	else if(Phone_Page==2)
	{
		ReadOnePageToBuffer2(FLASH_PHONE_INFO_TWO_2);
		Phone_Item=nItem-10;
	}
	OperateSPIEnd();
	Phone_Num=ReadByteFromBuffer2(PHONE_NUM_2);
	OperateSPIEnd();
	if( (Phone_Num>0)&&(Phone_Num<=10)&&(Phone_Item<=Phone_Num) )		j=1;
	else																j=0;
	Phone_Address=Phone_Item*21+ONE_1_FRAME_2;
	OperateSPIEnd();
	nTemp=ReadByteFromBuffer2(Phone_Address);
	OperateSPIEnd();
	if(nTemp==0x20)	j=0;

	SRAM_Init();
	SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
	SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
	SRAM_Write(SHANDLE_DATA_VAILD+2,0x1A);
	SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_RETURN_PHONE_NOTE);
	SRAM_Write(SHANDLE_DATA_VAILD+4,nItem);
	if(j==1)
	{
		SRAM_Write(SHANDLE_DATA_VAILD+5,ReadByteFromBuffer2(Phone_Address));
		for(i=1;i<8+13;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,ReadNextFromBuffer2());
		}
	}
	else
	{
		for(i=0;i<8+13;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,0x20);
		}
	}
	SRAM_Write(SHANDLE_DATA_VAILD+5+8+13,0x0d);
}
/********************************************************\
*	函数名:Write_Talk_Record
	作用域:本地文件调用
*	功能:	用来每次通话结束后,存储通话记录(此记录均是用手柄发送过来的数据包)
	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
/*
void Write_Talk_Record(unsigned char nPhone_Length)
{
    unsigned int i;
    OperateSPIEnd();
    Clear_Exter_WatchDog();
    //1,读第4个扇区的数据到buffer2中
	ReadOnePageToBuffer2(FLASH_RECORD_PHONE_2);
	OperateSPIEnd();
	//将buffer2中的数据转移到gGeneral_Buffer中
	gGeneral_Buffer[0]=ReadByteFromBuffer2(0);
	for(i=1;i<264;i++)	gGeneral_Buffer[i]=ReadNextFromBuffer2();
	OperateSPIEnd();
	//2,平移动buffer2中的通话记录
	Move_Right_Item(0,14,2);

	for(i=0;i<32;i++)
	{
		gGeneral_Buffer[i]=0x20;
	}
	//3,将新的通话记录的数据写入第一个记录区
	for(i=0;i<nPhone_Length-4;i++)
	{
		gGeneral_Buffer[i]=gHandle_Buffer[3+i];
	}
	//将gGeneral_Buffer[]中的数写入buffer2中
	OperateSPIEnd();
	WriteOneByteToBuffer2(0,gGeneral_Buffer[0]);
	for(i=1;i<264;i++)
	{
		WriteNextByteToBuffer2( gGeneral_Buffer[i] );
	}
	OperateSPIEnd();
	//4,将更新完毕的buffer2中的数据写入第4扇区
	Clear_Exter_WatchDog();
	P6OUT|=SPI45DB041_WP;
	WriteBuffer2ToPage(FLASH_RECORD_PHONE_2);
	P6OUT&=~SPI45DB041_WP;
	gTimer=0;Clear_Exter_WatchDog();
	OperateSPIEnd();
}
*/
/********************************************************\
*	函数名:Read_Talk_Record
	作用域:本地文件调用
*	功能:
*	参数:  nItem:表示当前所指向的记录,其值有如下0-----7

*	参数:
*	返回值:
*	创建人:
*
*	修改历史:(每条详述)
\********************************************************/
void Read_Talk_Record(unsigned char nItem)
{
	unsigned char nTemp,Record_Flag;
	unsigned int i;
	Record_Flag=0;
	if( nItem>7 )		return;
	//读第4个扇区的数据到buffer2中
	ReadOnePageToBuffer2(FLASH_RECORD_PHONE_2);
	OperateSPIEnd();
	nTemp = ReadByteFromBuffer2( nItem*0x10 );
	OperateSPIEnd();
	ReadOnePageToBuffer2(FLASH_RECORD_PHONE_2);
	nTemp = ReadByteFromBuffer2( (2*nItem)*0x10 );
	OperateSPIEnd();
	if( (nTemp>'9')||(nTemp<'0') )		Record_Flag=1;
	else								Record_Flag=0;
	SRAM_Init();
	SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
	SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
	SRAM_Write(SHANDLE_DATA_VAILD+2,0x1e);
	SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_TALKRECORD);
	SRAM_Write(SHANDLE_DATA_VAILD+4,nItem);
	if(Record_Flag==0)
	{
		OperateSPIEnd();
		ReadOnePageToBuffer2(FLASH_RECORD_PHONE_2);
		OperateSPIEnd();
		nTemp=ReadByteFromBuffer2( (2*nItem)*0x10 );

		SRAM_Write(SHANDLE_DATA_VAILD+5,nTemp);
		for(i=1;i<25;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,ReadNextFromBuffer2());
		}
		OperateSPIEnd();
	}
	else
	{
		for(i=0;i<25;i++)
		{
			SRAM_Write(SHANDLE_DATA_VAILD+5+i,0x20);
		}
	}
	SRAM_Write(SHANDLE_DATA_VAILD+5+25,0x0d);
}
/********************************************************\
*	函数名:Handle_ReadOnePage_Data
	作用域:本地文件调用
*	功能:
*	参数:
*	参数:
*	返回值:
*	创建人:
*	修改历史:(每条详述)
\********************************************************/
void Handle_ReadOnePage_Data(unsigned char Page_H,unsigned char Page_L)
{
	unsigned int Page_Address=0,i=0;
	unsigned char Length=0;
	Page_Address = Page_H;
	Page_Address <<=8;
	Page_Address += Page_L;

	if(Page_Address<2048)
	{
		OperateSPIEnd();
		ReadOnePageToBuffer2(Page_Address);
		OperateSPIEnd();
		gGeneral_Buffer[0]=ReadByteFromBuffer2(0);
		for(i=1;i<256;i++)	gGeneral_Buffer[i]=ReadNextFromBuffer2();
		OperateSPIEnd();
		Length=4+256;
		Waiting_Allow_Send();
		Send_COM3_Byte(0x24);Send_COM3_Byte(Length);
		Send_COM3_Byte(MAIN_READPAGE_ECHO);
		for(i=0;i<256;i++)
		{
			Send_COM3_Byte(gGeneral_Buffer[i]);
			Clear_Exter_WatchDog();
		}
		Send_COM3_Byte(0x0d);
		RX3_Ready();
	}
}
/********************************************************\
*	函数名:Handle_EraseOnePage_Data
	作用域:本地文件调用
*	功能:
*	参数:
*	参数:
*	返回值:
*	创建人:
*	修改历史:(每条详述)
\********************************************************/
/*
void Handle_EraseOnePage_Data(unsigned char Page_H,unsigned char Page_L)
{
	unsigned int Page_Address=0;
	Page_Address = Page_H;
	Page_Address <<=8;
	Page_Address += Page_L;

	if(Page_Address<2048)
	{
		OperateSPIEnd();EraseOnePage(Page_Address);OperateSPIEnd();
	}
	Send_COM3_Load(5,MAIN_ERASEPAGE_ECHO,COMMAND_OK);
}
*/
/********************************************************\
*	函数名:Send_COM3_SubProgram
	作用域:本地文件调用
*	功能:
*	参数:
*	参数:
*	返回值:
*	创建人:
*	修改历史:(每条详述)
\********************************************************/
void Send_COM3_SubProgram(unsigned char DataLength,unsigned char nCommand,unsigned char DataTemp)
{

⌨️ 快捷键说明

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