/****************************************************************************** * Function: First_show () * DESCRIPTION: - 每一次带有信息条号的显示 * Input: str 条号 * Input: str2 信息内容 * Output: * Returns: * * ----------------------------------- * Created By wxg 15-jan-2014 * ------------------------------- ******************************************************************************/ void First_show(u8* str2 ,u8 Screen,u8 mode) { #if 1 u32 addre=0; u8 show_buf[20]; //Dis_date[22]={"2000/00/00 00:00:00"}; char T_date[22]={"00/00/00 00:00:00"}; u8 i=0; memset(show_buf,0,20); lcd_fill(0); lcd_text12(0,5,number[Screen],strlen(number[Screen]),mode); for(i=0;i<3;i++) T_date[i*3]=str2[i+5]/10+'0'; for(i=0;i<3;i++) T_date[1+i*3]=str2[i+5]%10+'0'; for(i=0;i<3;i++) T_date[9+i*3]=str2[i+5+3]/10+'0'; for(i=0;i<3;i++) T_date[10+i*3]=str2[i+5+3]%10+'0'; lcd_text12(strlen(number[Screen])*6,5,T_date,17,mode); //rt_kprintf("mian_screen --%d---%d\r\n",strlen(number[Screen]),Screen); lcd_text12(0,19,"发信地址:",8,mode); OutPrint_HEX("addre", str2+12, 3); addre=(str2[12]<<16)+(str2[13]<<8)+str2[14]; sprintf((char*)show_buf,"%d",addre); lcd_text12(60,19,(char*)show_buf,strlen((char*)show_buf),mode); lcd_update_all(); #endif }
/****************************************************************************** * Function: Read_save_data () * DESCRIPTION: - 读取存储数据 * Input: str存储电文内容 input第几条的电文 length电文长度 * Input: mode 显示模式 * Output: * Returns: * * ----------------------------------- * Created By wxg 16-jan-2014 * ------------------------------- ******************************************************************************/ u8 Read_save_data(u8*str,u8 input,u8 mode) { #if 1 u8 temp[10]; u8 data[256];//自己定义的存储格式 u16 Addre_offset=0;//存储的偏移地址 u8 data_len =0;// memset(temp,0,10); memset(data,0,256); memset(str,0,210);//纯信息内容 Addre_offset =Sort_ID(DF_BD_data_rx, Addre_offset,input); rt_kprintf("Addre_offset--%d\r\n",Addre_offset); if(Addre_offset==RT_ERROR) { lcd_fill(0); lcd_text12(0,10,"无内容可显示...",15,LCD_MODE_SET); lcd_update_all(); return RT_ERROR; } //首先读出个数和长度的数据 DF_ReadFlash(DF_BD_data_rx,Addre_offset,temp,5); //根据长度再读出真实的数据 DF_ReadFlash(DF_BD_data_rx,Addre_offset,data,temp[4]); //这是自己定义的格式17,和18存储着接收电文的长度信息//接收的存储长度除以8 data_len = ((data[17]<<8) +data[18])/8; rt_kprintf("du chu shu ju len-- %d\r\n",temp[4]); OutPrint_HEX("Read", data,temp[4]); //length =data_len; //data_len=data_len/8; if(data[11]==0x60)//如果是混发的话 { memcpy(str,data+20,data_len-1); index_txt(str,data_len-1); OutPrint_HEX("Read DATA ", str,data_len); OutPrint_HEX("index_addre",index_addre,12); OutPrint_HEX("index_len",index_len,12); } else { //数组拷贝到这个str数组 memcpy(str,data+19,data_len); index_txt(str,data_len); OutPrint_HEX("Read DATA1 ", str,data_len); OutPrint_HEX("index_addre",index_addre,12); OutPrint_HEX("index_len",index_len,12); } //从电文长度中 First_show(data ,input,mode); return data_len; #endif }
u8 Rx_data_save(u8 *str) { u8 temp[4]; u8 trans[256]; u8 len =0; u32 i= 0; u32 test_head=0; memset(trans,0,256); memset(temp,0,4); for(i=0;i<16*512;i=i+256) { if(i>=8*512) { //下半部分显示时候显示上半部分 SST25V_SectorErase_4KByte((8*(((u32)DF_BD_data_rx+8)/8))*PageSIZE); //Erase_flag =Top_15; } if(i>=16*512)//保证随时都有可以写的空间 { i=0;//从新遍历 //擦除上半部分显示下半部分 SST25V_SectorErase_4KByte((8*((u32)DF_BD_data_rx/8))*PageSIZE); //Erase_flag = After_15; rt_kprintf("erase the 8016-8023\r\n"); } DF_ReadFlash(DF_BD_data_rx,i,temp,4); test_head = (temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3]; //rt_kprintf(" %d--%d--%d--%d--%d--%x\r\n",temp[0],temp[1],temp[2],temp[3],i,test_head); if(test_head==Max_value) { test_head = find_max_id(DF_BD_data_rx)+1;//最大ID自加1 //找出上一个ID值 trans[0]=test_head>>24; trans[1]=(test_head>>16)&0xff; trans[2]=(test_head>>8)&0xff; trans[3]=test_head&0xff; len =(((str[16]<<8)+str[17])/8); //rt_kprintf("收到电文长度---%d",len); len =len+8;//根据协议加上7个字节(信息类别到电文长度) trans[4] =len+4+6+1;//+4是加上计数+1长度+是时间长度=总长 if(UDP_dataPacket_flag==0x02) { trans[5]=Temp_Gps_Gprs.Date[0]; trans[6]=Temp_Gps_Gprs.Date[1]; trans[7]=Temp_Gps_Gprs.Date[2]; trans[8]=Temp_Gps_Gprs.Time[0]; trans[9]=Temp_Gps_Gprs.Time[1]; trans[10]=Temp_Gps_Gprs.Time[2]; } else { time_now=Get_RTC(); trans[5]= time_now.year; trans[6]= time_now.month; trans[7]= time_now.day; trans[8]= time_now.hour; trans[9]= time_now.min; trans[10]= time_now.sec; } /* trans[5]=(((Gps_Gprs.Date[0])/10)<<4)+((Gps_Gprs.Date[0])%10); trans[6]=((Gps_Gprs.Date[1]/10)<<4)+(Gps_Gprs.Date[1]%10); trans[7]=((Gps_Gprs.Date[2]/10)<<4)+(Gps_Gprs.Date[2]%10); trans[8]=((Gps_Gprs.Time[0]/10)<<4)+(Gps_Gprs.Time[0]%10); trans[9]=((Gps_Gprs.Time[1]/10)<<4)+(Gps_Gprs.Time[1]%10); trans[10]=((Gps_Gprs.Time[2]/10)<<4)+(Gps_Gprs.Time[2]%10); */ OutPrint_HEX("Time", trans+5, 6);//wxg_test if(trans[4]>=256) { rt_kprintf("-------接收数据有误-----\r\n"); return RT_ERROR; } memcpy(trans+11,str+10,len);//将信息内容拷贝 DF_WriteFlashDirect(DF_BD_data_rx,i,trans,trans[4]); //OutPrint_HEX("saved", trans, trans[4]);//wxg_test memset(temp,0,4);//清零 return RT_EOK; } }
u8 ReadCycleGPS(u32 cycleread, u8 *content , u16 ReadLen) { /* NOTE : Flash 1 page = 512 Bytes ; 1 Record = 32 Bytes ; 1page= 16 Records 1Sector=8Page=128Records */ u32 pageoffset = 0; //Page 偏移 u32 InPageoffset; //页内Record偏移 u16 InPageAddr = 0; //页内 地址偏移 u8 i = 0, FCS = 0; u8 Len_read = 0; // 信息长度 /* 上报的每一包数第一个字节是有效信息的长度,从第二个字节是信息内容, 信息内容的后边是一个字节额校验(校验从长度开始到内容最后一个字节) */ //---------------------------------------------------------------------------------------------- // 1. caculate address pageoffset = (u32)(cycle_read >> 2); // 计算出 Page 偏移 除以4 (每个page能放4条记录) InPageoffset = cycle_read - (u32)(pageoffset << 2); // 计算出 页内偏移地址 InPageAddr = (u16)(InPageoffset << 7); // 计算出页内 字节 乘以 128 (每个记录128个字节) // 2. Write Record Content DF_TAKE; DF_ReadFlash(pageoffset + CycleStart_offset, InPageAddr, content, ReadLen); DF_delay_ms(10); DF_RELEASE; // 获取信息长度 Len_read = content[0]; if(DispContent == 2) { OutPrint_HEX("读取CycleGPS 内容为 ", content, Len_read + 1); } // 3. Judge FCS //--------------- 过滤已经发送过的信息 ------- FCS = 0; for ( i = 0; i < Len_read; i++ ) //计算读取信息的异或和 { FCS ^= *( content + i ); } if(((content[Len_read] != FCS) && (content[0] != 0xFF)) || (content[0] == 0xFF)) // 判断异或和 { if(content[0] == 0xFF) { // rt_kprintf("\r\n content[0]==0xFF read=%d, write=%d \r\n",cycle_read,cycle_write); cycle_read++; if(cycle_read >= Max_CycleNum) cycle_read = 0; ReadCycle_status = RdCycle_Idle; return false; } //------------------------------------------------ cycle_read++; if(cycle_read >= Max_CycleNum) cycle_read = 0; ReadCycle_status = RdCycle_Idle; return false; } //------------------------------------------------------------------------------------------ return true; //-------------------------------------------------------------------------------------------- }
u8 Common_ReadContent(u32 In_read, u8 *content , u16 ReadLen, u8 Type) { //----------------------------------------------------- //u8 regStr[25]; //----------------------------------------------------- u32 pageoffset = 0; //Page 偏移 u32 InPageoffset; //页内Record偏移 u16 InPageAddr = 0; //页内 地址偏移 u32 Start_offset = 0; u8 i = 0, FCS = 0;; //-------------------------------------------------- // memset(regStr,0,sizeof(regStr)); // 1. Classify switch(Type) { case TYPE_ExpSpdAdd: Start_offset = ExpSpdStart_offset; // memcpy(regStr,"超速报警",25); break; default : return false; } //---------------------------------------------------------------------------------------------- // 2. caculate address pageoffset = (u32)(In_read >> 4); // 计算出 Page 偏移 除以64 InPageoffset = In_read - (u32)(pageoffset << 4); // 计算出 页内偏移地址 InPageAddr = (u16)(InPageoffset << 5); // 计算出页内 字节 乘以 32 (每个记录32个字节) // 2. Write Record Content DF_ReadFlash(pageoffset + Start_offset, InPageAddr, content, ReadLen); DF_delay_us(10); if(DispContent) { OutPrint_HEX("读取Common 内容为 ", content, ReadLen); } // 3. Judge FCS //--------------- 过滤已经发送过的信息 ------- FCS = 0; for ( i = 0; i < ReadLen - 1; i++ ) //计算读取信息的异或和 { FCS ^= *( content + i ); } if(((content[ReadLen - 1] != FCS) && (content[0] != 0xFF)) || (content[0] == 0xFF)) // 判断异或和 { if(content[0] == 0xFF) { //如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 switch(Type) { case TYPE_ExpSpdAdd: ExpSpdRec_read = ExpSpdRec_write; break; default : return false; } return false; } In_read++; if(In_read >= Max_CommonNum) In_read = 0; //rt_kprintf("\r\n record info error \r\n"); return false; } if(content[0] == 0xFF) { // rt_kprintf("\r\n read 0xFF \r\n"); switch(Type) { case TYPE_ExpSpdAdd: ExpSpdRec_read = ExpSpdRec_write; break; default : return false; } return false; } // 4. end switch(Type) { case TYPE_ExpSpdAdd: ExpSpdRec_read = In_read; break; default : return false; } return true; }