u8 Api_Config_read(u8 *name,u16 ID,u8* buffer, u16 Rd_len) // ¶ÁÈ¡Media area ID ÊDZ¨Êý { if(strcmp((const char*)name,config)==0) { DF_ReadFlash(ConfigStart_offset, 0, buffer, Rd_len); DF_delay_ms(10); // large content delay return true; } if(strcmp((const char*)name,jt808)==0) { DF_ReadFlash(JT808Start_offset, 0, buffer, Rd_len); DF_delay_ms(10); // large content delay return true; } if(strcmp((const char*)name,tired_config)==0) { DF_ReadFlash(TiredCondifg_offset, 0, buffer, Rd_len); DF_delay_ms(10); return true; } if(strcmp((const char*)name,BD_ext_config)==0) { DF_ReadFlash(DF_BD_Extend_Page, 0, buffer, Rd_len); DF_delay_ms(10); return true; } return false; }
/****************************************************************************** * 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 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;; /* 上报的每一包数据位31个字节, 每条记录为32个字节,用每条记录的最后一个字节来作为是否上报过的标志位。没有上报该标志为0xFF 上报过后该标志为被写为0x01 */ //---------------------------------------------------------------------------------------------- // 1. caculate address pageoffset=(u32)(cycle_read>>4); // 计算出 Page 偏移 除以16 InPageoffset=cycle_read-(u32)(pageoffset<<4); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset<<5); // 计算出页内 字节 乘以 32 (每个记录32个字节) // 2. Write Record Content DF_ReadFlash(pageoffset+CycleStart_offset,InPageAddr,content,ReadLen); DF_delay_us(20); if(DispContent==2) { rt_kprintf("\r\n 读取CycleGPS 内容为 :\r\n "); for(i=0;i<ReadLen;i++) rt_kprintf("%2X ",content[i]); rt_kprintf("\r\n"); } // 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) { rt_kprintf("\r\n content[0]==0xFF read=%d, write=%d \r\n",cycle_read,cycle_write); //cycle_read=cycle_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 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; //-------------------------------------------------------------------------------------------- }
/****************************************************************************** * Function: find_max_id () * DESCRIPTION: - 找到最大的ID值 * Input: * Input: * Output: * Returns: * * ----------------------------------- * Created By wxg 15-jan-2014 * ------------------------------- ******************************************************************************/ u32 find_max_id(u16 addre) { #if 1 u8 temp[4]; u32 tmp_id=0; u32 tran_id=0; u32 i=0; memset(temp,0,4); for(i=0;i<16*512;i=i+256) { DF_ReadFlash(addre,i,temp,4); tmp_id = (temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3]; if(tmp_id!=Max_value) { if(tmp_id>tran_id) { tran_id = tmp_id; } else { tran_id = 0; } } //tran_id =tran_id +1; } rt_kprintf("the max ID --%d\r\n",tran_id); return tran_id ; #endif }
/****************************************************************************** * Function: Sort_ID () * DESCRIPTION: - 可以搜索当前存储区域的任意的ID和地址 * Input: addre存储起始地址 offset返回偏移量 * Input: rank:查询ID的排名倒序 * Output: * Returns: * * ----------------------------------- * Created By wxg 16-jan-2014 * ------------------------------- ******************************************************************************/ u16 Sort_ID(u16 addre,u16 offset,u8 rank) { #if 1 u8 temp[4]; u32 i; u32 max_addre =0; u32 tmp_addre =0; memset(temp,0,4); max_addre = find_max_id(DF_BD_data_rx); if(max_addre==0) { return RT_ERROR; } for(i=0;i<16*512;i=i+256) { DF_ReadFlash(addre,i,temp,4); tmp_addre= (temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3]; if(tmp_addre==(max_addre-rank)) { offset =i; //rt_kprintf("the offset is ---%d\r\n",offset); return offset; } } return RT_ERROR; #endif }
void DF_WriteFlash(u16 page_counter, u16 page_offset, u8 *p, u16 length) //512bytes 一个单位 { u16 i = 0, j = 0, k = 0; //写补报 for(i = 0; i < 8; i++) { DF_ReadFlash((8 * (page_counter / 8)) + i, 0, SectorBuf_save[i], DFBakSize); //PageSIZE } SST25V_SectorErase_4KByte((8 * ((u32)page_counter / 8))*PageSIZE); DF_delay_ms(100); for(j = 0; j < 8; j++) { if(j == (page_counter % 8)) { for(i = 0; i < length; i++) { SectorBuf_save[j][page_offset + i] = *p; p++; } } for(k = 0; k < DFBakSize; k++) { SST25V_ByteWrite(SectorBuf_save[j][k], ((8 * (page_counter / 8)) + j)*PageSIZE + k); } } DF_delay_ms(20); }
u8 Read_DrvRecoder(u32 In_read,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 FCS=0; u16 i=0; /* 上报的每一包数据位31个字节, 每条记录为32个字节,用每条记录的最后一个字节来作为是否上报过的标志位。没有上报该标志为0xFF 上报过后该标志为被写为0x01 */ //---------------------------------------------------------------------------------------------- // 1. caculate address pageoffset=(u32)(In_read>>1); // 计算出 Page 偏移 除以2 InPageoffset=In_read-(u32)(pageoffset<<1); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset<<8); // 计算出页内 字节 乘以 256 (每个记录256个字节) 238(content)+1(FCS) // 2. Write Record Content DF_ReadFlash(pageoffset+VehicleRecStart_offset,InPageAddr,content,ReadLen); DF_delay_us(10); // rt_kprintf("\r\n ReadRecoder Starpageoffset=%d PageOffset= %d , InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); // rt_kprintf("\r\n 读取 Records 内容为 :\r\n"); // for(i=0;i<ReadLen;i++) // rt_kprintf("%2X ",content[i]); // rt_kprintf("\r\n"); // 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) { Recorder_Read=Recorder_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } Recorder_Read++; if(Recorder_Read>=Max_RecoderNum) Recorder_Read=0; // rt_kprintf("\r\n ******* DrvRecoder 该条记录内容不对 ******* \r\n"); return false; } if(content[0]==0xFF) { Recorder_Read=Recorder_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } //-------------------------------------------------------------- return true; //-------------------------------------------------------------------------------------------- }
u8 Read_MintPosition(u32 In_read,u8 *content ,u16 ReadLen) { // 读取单位小时内每分钟的位置信息 /* NOTE : Flash 1 page = 512 Bytes ; 1 Record = 32 Bytes ; 1page= 16 Records 1Sector=8Page=128Records */ u32 pageoffset=0; //Page 偏移 u8 FCS=0; u16 i=0; /* 上报的每一包数据位31个字节, 每条记录为32个字节,用每条记录的最后一个字节来作为是否上报过的标志位。没有上报该标志为0xFF 上报过后该标志为被写为0x01 */ //---------------------------------------------------------------------------------------------- // 1. caculate address pageoffset=In_read; // 计算出 Page 偏移 除以1 // 计算出 页内偏移地址 // 计算出页内 字节 乘以 512 (每个记录512个字节) 485(content)+1(FCS) // 2. Write Record Content DF_ReadFlash(pageoffset+AvrgMintPosit_offset,0,content,ReadLen); DF_delay_us(10); // rt_kprintf("\r\n ReadRecoder Starpageoffset=%d PageOffset= %d \r\n",VehicleRecStart_offset,pageoffset); // rt_kprintf("\r\n 单位小时每分钟位置读取 Position 内容为 :\r\n"); // for(i=0;i<ReadLen;i++) // rt_kprintf("%2X ",content[i]); // rt_kprintf("\r\n"); // 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) { AvrgMintPosit_Read=AvrgMintPosit_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } AvrgMintPosit_Read++; if(AvrgMintPosit_Read>=Max_MintPos) AvrgMintPosit_Read=0; // rt_kprintf("\r\n ******* DrvRecoder 该条记录内容不对 ******* \r\n"); return false; } if(content[0]==0xFF) { AvrgMintPosit_Read=AvrgMintPosit_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } //-------------------------------------------------------------- return true; //-------------------------------------------------------------------------------------------- }
u32 Api_DFdirectory_Query(u8 *name, u8 returnType) { // returnType=0 返回记录数目 returnType=1 时返回改目录文件大小 u8 flag=0; u32 pic_current_page=0; if(strcmp((const char*)name,spdpermin)==0) { return AvrgSpdPerMin_write; } if(strcmp((const char*)name,tired_warn)==0) { return TiredDrv_write ; } if(strcmp((const char*)name,camera_1)==0) { pic_current_page=PicStart_offset; flag=1; } if(strcmp((const char*)name,camera_2)==0) { pic_current_page=PicStart_offset2; flag=1; } if(strcmp((const char*)name,camera_3)==0) { pic_current_page=PicStart_offset3; flag=1; } if(strcmp((const char*)name,camera_4)==0) { pic_current_page=PicStart_offset4; flag=1; } if(strcmp((const char*)name,voice)==0) { DF_ReadFlash(SoundStart_offdet,0,(u8*)&SrcFileSize,4); return SrcFileSize; } if(flag) { DF_delay_ms(5); DF_ReadFlash(pic_current_page, 0,PictureName, 23); memcpy((u8*)&PicFileSize,PictureName+19,4); return PicFileSize ; } return 0; }
void BD_MODULE_Read(void) { DF_ReadFlash(DF_GPS_MODULE_offset,0,&GPS_MODULE_TYPE,1); if(Module_3017A==GPS_MODULE_TYPE) rt_kprintf("\r\n 北斗定位模块: 3017A"); else if(Module_3020C==GPS_MODULE_TYPE) rt_kprintf("\r\n 北斗定位模块: 3020C"); // else // rt_kprintf("\r\n 北斗定位模块: 尚未自动检测"); }
void DF_EraseAppFile_Area(void) { u16 i=0; /* 1.先擦除0扇区 2.读出page48内容并将其写到第0扇区的page 0 3.读出page49内容并将其写到第0扇区的page 0 4.擦除 6-38扇区 即 48page 到 304 page 5.以后有数据过来就直接写入,不需要再擦除了 */ SST25V_SectorErase_4KByte(0x0); DF_delay_ms(5); WatchDog_Feed(); DF_ReadFlash(48,0,SST25Temp,PageSIZE); //DF_delay_ms(1); DF_WriteFlashDirect(0,0,SST25Temp,PageSIZE); DF_delay_ms(1); WatchDog_Feed(); DF_ReadFlash(49,0,SST25Temp,PageSIZE); DF_WriteFlashDirect(1,0,SST25Temp,PageSIZE); DF_delay_ms(1); for(i=6;i<134;i++) // 要求是512K -> 128 erase sector 6-134 128K -> 32 { WatchDog_Feed(); SST25V_SectorErase_4KByte(((u32)i*4096)); DF_delay_ms(5); WatchDog_Feed(); } DF_ReadFlash(0,0,SST25Temp,PageSIZE); DF_WriteFlashDirect(48,0,SST25Temp,PageSIZE); WatchDog_Feed(); DF_delay_ms(1); DF_ReadFlash(1,0,SST25Temp,PageSIZE); WatchDog_Feed(); DF_WriteFlashDirect(49,0,SST25Temp,PageSIZE); rt_kprintf("\r\nSST25Ready\r\n"); }
static Look_data(u8 *str,u8 input) { u32 temp_usr=0; u32 temp_addr=0; memset(str,0,sizeof(str)); DF_ReadFlash(DF_BD_first_target,0,str,3); temp_addr = (BD1_control.data_user_addr[0]<<16)+(BD1_control.data_user_addr[1]<<8)+(BD1_control.data_user_addr[2]); temp_usr = (BD1_struct.UserAddr[0]<<16)+(BD1_struct.UserAddr[1]<<8)+BD1_struct.UserAddr[2]; rt_kprintf("temp_addr:%d---temp_usr:%d\r\n",temp_addr,temp_usr); sprintf((char*)str, "%7d", temp_addr);//通信地址 sprintf(((char*)str)+15, "%7d", temp_usr);//用户地址 lcd_fill(0); lcd_text12(0, 5,"通信地址:",9,LCD_MODE_SET); lcd_text12(60, 5,((char*)str),7,LCD_MODE_SET); lcd_text12(0, 19,"用户地址:",9,LCD_MODE_SET); lcd_text12(60, 19,((char*)str)+15,7,LCD_MODE_SET); lcd_update_all(); AddreorFre_screen =input; }
u8 Save_PerSecContent(u32 In_wr,u8 *content ,u16 saveLen) { /* 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 reg[1]={0}; //---------------------------------------------------------------------------------------------- // 1. Judge Whether needs to Erase page pageoffset=(u32)(In_wr/7); // 计算出 Page 偏移 除以7 InPageoffset=In_wr-(u32)(pageoffset*7); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset*70); // 计算出页内 字节 乘以 70 (每个记录70个字节) if(((pageoffset%8)==0)&&(InPageoffset==0)) // 判断是否需要擦除Block 被移除到下一个Block 1Block=8Page { SST25V_SectorErase_4KByte((pageoffset+AvrgSpdSec_offset)*PageSIZE); // erase Sector mDelaymS(50); // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6)); } // 2. Filter write area DF_ReadFlash(pageoffset+AvrgSpdSec_offset,InPageAddr,reg,1); DF_delay_us(10); if(reg[0]!=0xff) // 如果要写入的区域 dirty ,则地址增然后从新开始寻找知道找到为止 { In_wr++; AvrgSpdPerSec_write++; if(AvrgSpdPerSec_write>=Max_SPDerSec) AvrgSpdPerSec_write=0; // rt_kprintf("\r\n ******* 每秒钟速度 写区域 Write area : %d In_wr=%d is Dirity! \r\n",AvrgSpdPerSec_write,In_wr); //-------------------------- return false; } // 3. Write Record Content DF_WriteFlashDirect(pageoffset+AvrgSpdSec_offset,InPageAddr,content,saveLen); // 写入信息 DF_delay_ms(10); // rt_kprintf("\r\n Write PerMit Starpageoffset=%d PageOffset= %d , InPageAddr= %d \r\n",AverageSpdStart_offset,pageoffset,InPageoffset); return true; //-------------------------------------------------------------------------------------------- }
//----------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------------- u8 Save_DrvRecoder(u32 In_write,u8 *content ,u16 saveLen) { /* 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 reg[1]={0}; //---------------------------------------------------------------------------------------------- // 1. Judge Whether needs to Erase page pageoffset=(u32)(In_write>>1); // 计算出 Page 偏移 除以2 InPageoffset=In_write-(u32)(pageoffset<<1); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset<<8); // 计算出页内 字节 乘以 256 (每个记录256个字节) 206(content)+1(FCS) if(((pageoffset%8)==0)&&(InPageoffset==0)) // 判断是否需要擦除Block 被移除到下一个Sector 1Sector=8 Page { SST25V_SectorErase_4KByte((pageoffset+VehicleRecStart_offset)*PageSIZE); // erase Sector DF_delay_ms(70); // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6)); } // 2. Filter write area DF_ReadFlash(pageoffset+VehicleRecStart_offset,InPageAddr,reg,1); if(reg[0]!=0xff) // 如果要写入的区域 dirty ,则地址跳到下一个 { In_write++; Recorder_write++; if(Recorder_write>=Max_RecoderNum) Recorder_write=0; // rt_kprintf("\r\n ******* 行车记录仪写区域 Write area : %d is Dirity! \r\n",In_write); return false; } // 3. Write Record Content DF_WriteFlashDirect(pageoffset+VehicleRecStart_offset,InPageAddr,content,saveLen); // 写入信息 DF_delay_ms(8); // rt_kprintf("\r\n DrvRec Starpageoffset=%d PageOffset= %d , InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); return true; //-------------------------------------------------------------------------------------------- }
u8 Save_MintPosition(u32 In_write,u8 *content ,u16 saveLen) { // 记录单位小时内每分钟的位置信息 /* NOTE : Flash 1 page = 512 Bytes ; 1 Record = 32 Bytes ; 1page= 16 Records 1Sector=8Page=128Records */ u32 pageoffset=0; //Page 偏移 u8 reg[1]={0}; //---------------------------------------------------------------------------------------------- // 1. Judge Whether needs to Erase page 每条记录512个字节 pageoffset=In_write; // 计算出 Page 偏移 除以4 // 计算出 页内偏移地址 0 // 计算出页内 字节 乘以 512 (每个记录512个字节) 485(content)+1(FCS) if((pageoffset%8)==0) // 判断是否需要擦除Block 被移除到下一个Block 1Block=8 Page { SST25V_SectorErase_4KByte((pageoffset+AvrgMintPosit_offset)*PageSIZE); // erase Sector DF_delay_ms(50); // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6)); } // 2. Filter write area DF_ReadFlash(pageoffset+AvrgMintPosit_offset,0,reg,1); if(reg[0]!=0xff) // 如果要写入的区域 dirty ,则地址增然后从新开始寻找知道找到为止 { In_write++; AvrgMintPosit_write++; if(AvrgMintPosit_write>=Max_MintPos) AvrgMintPosit_write=0; // rt_kprintf("\r\n ******* 行车记录仪写区域 Write area : %d is Dirity! \r\n",In_write); //---------------------------- return false; } // 3. Write Record Content DF_WriteFlashDirect(pageoffset+AvrgMintPosit_offset,0,content,saveLen); // 写入信息 DF_delay_ms(10); // rt_kprintf("\r\n DrvRec Starpageoffset=%d PageOffset= %d , InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); return true; //-------------------------------------------------------------------------------------------- }
//----------------------------------------------------------------------------------------------------------- u8 Common_WriteContent(u32 In_write, u8 *content , u16 saveLen, u8 Type) { //----------------------------------------------------- u8 reg[1]; //u8 regStr[25]; //----------------------------------------------------- u32 pageoffset = 0; //Page 偏移 u32 InPageoffset; //页内Record偏移 u16 InPageAddr = 0; //页内 地址偏移 u32 Start_offset = 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_write >> 4); // 计算出 Page 偏移 除以16 InPageoffset = In_write - (u32)(pageoffset << 4); // 计算出 页内偏移地址 InPageAddr = (u16)(InPageoffset << 5); // 计算出页内 字节 乘以 32 (每个记录32个字节) if(((pageoffset % 8) == 0) && (InPageoffset == 0)) // 判断是否需要擦除Block 被移除到下一个Block 1Block=8Page { SST25V_SectorErase_4KByte((pageoffset + Start_offset)*PageSIZE); // erase Sector DF_delay_ms(70); } // 2. Filter write area DF_ReadFlash(pageoffset + Start_offset, InPageAddr, reg, 1); if(reg[0] != 0xff) // 如果要写入的区域 dirty ,则地址增然后从新开始寻找知道找到为止 { In_write++; if(In_write >= Max_CommonNum) In_write = 0; return false; } // 3. Write Record Content DF_WriteFlashDirect(pageoffset + Start_offset, InPageAddr, content, saveLen); // 写入信息 DF_delay_ms(10); // 4. end switch(Type) { case TYPE_ExpSpdAdd: ExpSpdRec_write = In_write; break; default : 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; }
u8 Api_DFdirectory_Read(u8 *name,u8 *buffer, u16 len, u8 style ,u16 numPacket) // style 1. old-->new 0 : new-->old { /* Á¬Ðøµ÷Óü¸´Î £¬ÒÀ´Î°´style ·½Ê½µÝÔö*/ // style 1. old-->new 0 : new-->old // numPacket : °²×° style ·½Ê½¶ÁÈ¡¿ªÊ¼ µÚ¼¸ÌõÊý¾Ý°ü from: 0 u16 read_addr=0; if(strcmp((const char*)name,spdpermin)==0) { if(style==1) read_addr=0+numPacket; else { if(AvrgSpdPerMin_write==0) return false; else if(AvrgSpdPerMin_write>=(numPacket+1)) read_addr=AvrgSpdPerMin_write-1-numPacket; else return false; } Read_PerMinContent(read_addr,buffer, len); //---------------------- return true; } if(strcmp((const char*)name,spd_warn)==0) { if(style==1) read_addr=0+numPacket; else { if(ExpSpdRec_write==0) return false; else if(ExpSpdRec_write>=(numPacket+1)) read_addr=ExpSpdRec_write-1-numPacket; else return false; } Common_ReadContent( read_addr, buffer, len, TYPE_ExpSpdAdd); return true; } if(strcmp((const char*)name,tired_warn)==0) { if(style==1) read_addr=0+numPacket; else { if(TiredDrv_write==0) return false; else if(TiredDrv_write>=(numPacket+1)) read_addr=TiredDrv_write-1-numPacket; else return false; } Common_ReadContent( read_addr, buffer, len, TYPE_TiredDrvAdd); //------------------------- return true; } if(strcmp((const char*)name,doubt_data)==0) { if(style==1) read_addr=0+numPacket; else { if(Recorder_write==0) return false; else if(Recorder_write>=(numPacket+1)) read_addr=Recorder_write-1-numPacket; else return false; } Read_DrvRecoder(read_addr, buffer, len ); //------------------------- return true; } //------- MultiMedia RAW data --------- if(strcmp((const char*)name,voice)==0) { if(style==0) return false; // Ö»ÔÊÐí´Óold -> new DF_ReadFlash(SoundStart_offdet+numPacket,0, buffer, len); return true; } if(strcmp((const char*)name,camera_1)==0) { DF_ReadFlash(PicStart_offset+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_2)==0) { DF_ReadFlash(PicStart_offset2+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_3)==0) { DF_ReadFlash(PicStart_offset3+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_4)==0) { DF_ReadFlash(PicStart_offset4+numPacket,0,buffer, len); return true; } return false; }
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 ISP_Read( u32 Addr, u8* Instr, u16 len) { DF_ReadFlash(Addr,0,Instr,len); return 1; }
u16 Api_RecordNum_Query(u8 *name) { #if 0 if(strcmp((const char*)name,event_808)==0) { return event; } if(strcmp((const char*)name,msg_broadcast)==0) { DF_ReadFlash(DF_Broadcast_offset+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,phonebook)==0) { DF_ReadFlash(DF_PhoneBook_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,Rail_cycle)==0) { DF_ReadFlash(DF_Event_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,Rail_rect)==0) { DF_ReadFlash(DF_RectangleRail_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,Rail_polygen)==0) { DF_ReadFlash(DF_PolygenRail_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,turn_point)==0) { DF_ReadFlash(DF_turnPoint_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,route_line)==0) { DF_ReadFlash(DF_Route_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,ask_quesstion)==0) { DF_ReadFlash(DF_AskQuestion_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,text_msg)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } // 3. ¼Ç¼ if(strcmp((const char*)name,spd_warn)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,tired_warn)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,doubt_data)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,spdpermin)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,pospermin)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,pic_index)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,voice_index)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); return true; } return false; #endif return 1; }
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_TiredDrvAdd: Start_offset=TiredDrvStart_offset; // memcpy(regStr,"疲劳驾驶",25); break; case TYPE_ExpSpdAdd: Start_offset=ExpSpdStart_offset; // memcpy(regStr,"超速报警",25); break; case TYPE_ErrorLogAdd: Start_offset=AbNormalStart_offset; // memcpy(regStr,"异常LOG",25); break; case TYPE_LogInAdd: Start_offset=LogIn_offset; // memcpy(regStr,"登录记录",25); break; case TYPE_SettingChgAdd: Start_offset=SettingChg_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); // rt_kprintf("\r\n Common Starpageoffset=%d PageOffset= %d , InPageAddr= %d TYPE= %s\r\n",Start_offset,pageoffset,InPageoffset,regStr); if(DispContent) { rt_kprintf("\r\n 读取Common 内容为 :\r\n"); for(i=0;i<ReadLen;i++) rt_kprintf("%2X ",content[i]); rt_kprintf("\r\n"); } // 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_TiredDrvAdd: TiredDrv_read=TiredDrv_write; break; case TYPE_ExpSpdAdd: ExpSpdRec_read=ExpSpdRec_write; break; case TYPE_AvrgSpdAdd: AvrgSpdPerMin_Read=AvrgSpdPerMin_write; break; case TYPE_ErrorLogAdd: ErrorLog_Read=ErrorLog_write; break; case TYPE_LogInAdd: Login_Read=Login_write; break; case TYPE_SettingChgAdd: Settingchg_read=Settingchg_write; break; default : return false; } return false; } In_read++; if(In_read>=Max_CycleNum) In_read=0; rt_kprintf("\r\n ******* 该条记录内容不对 ******* \r\n"); return false; } if(content[0]==0xFF) { rt_kprintf("\r\n 读取内容为 0xFF \r\n"); switch(Type) { case TYPE_TiredDrvAdd: TiredDrv_read=TiredDrv_write; break; case TYPE_ExpSpdAdd: ExpSpdRec_read=ExpSpdRec_write; break; case TYPE_AvrgSpdAdd: AvrgSpdPerMin_Read=AvrgSpdPerMin_write; break; case TYPE_ErrorLogAdd: ErrorLog_Read=ErrorLog_write; break; case TYPE_LogInAdd: Login_Read=Login_write; break; case TYPE_SettingChgAdd: Settingchg_read=Settingchg_write; break; default : return false; } return false; } // 4. end switch(Type) { case TYPE_TiredDrvAdd: TiredDrv_read=In_read; break; case TYPE_ExpSpdAdd: ExpSpdRec_read=In_read; break; case TYPE_AvrgSpdAdd: AvrgSpdPerMin_Read=In_read; break; case TYPE_ErrorLogAdd: ErrorLog_Read=In_read; break; case TYPE_LogInAdd: Login_Read=In_read; break; case TYPE_SettingChgAdd: Settingchg_read=In_read; break; default : return false; } return true; }
static void keypress(unsigned int key) { switch(KeyValue) { case KeyValueMenu: if(comfirmation_flag==4) { pMenuItem=&Menu_1_Idle; pMenuItem->show(); } else { pMenuItem=&Menu_0_loggingin; pMenuItem->show(); } col_screen=0; CarBrandCol_Cou=1; comfirmation_flag=0; break; case KeyValueOk: if(col_screen==1) { if(MENU_set_carinfor_flag==1) { comfirmation_flag=0; lcd_fill(0); lcd_text12(12,3,"车牌颜色设置完成",16,LCD_MODE_SET); lcd_text12(24,18,"按菜单键返回",12,LCD_MODE_SET); lcd_update_all(); rt_kprintf("\r\n车牌颜色设置完成,按菜单键返回,%d",Vechicle_Info.Dev_Color); // 车牌颜色 if(License_Not_SetEnable==1) Vechicle_Info.Dev_Color=0; else Vechicle_Info.Dev_Color=Menu_color_num; DF_WriteFlashSector(DF_Vehicle_Struct_offset,0,(u8*)&Vechicle_Info,sizeof(Vechicle_Info)); } else { col_screen=2; CarSet_0_counter=0;// menu_color_flag=1;//车牌颜色设置完成 lcd_fill(0); lcd_text12(20,3,(char *)car_col,13,LCD_MODE_SET); lcd_text12(12,18,"按确认键查看信息",16,LCD_MODE_SET); lcd_update_all(); } } else if(col_screen==2) { menu_color_flag=0; col_screen=3; comfirmation_flag=1;//保存设置信息标志 lcd_fill(0); if(License_Not_SetEnable==1) lcd_text12(0,0,"无牌照",6,LCD_MODE_SET); else lcd_text12(0,0,(char *)Menu_Car_license,8,LCD_MODE_SET); lcd_text12(54,0,(char *)Menu_VechileType,6,LCD_MODE_SET); //==== 车牌号未设置===== if(License_Not_SetEnable==1) lcd_text12(96,0,(char *)"0",1,LCD_MODE_SET); else lcd_text12(96,0,(char *)Menu_VecLogoColor,4,LCD_MODE_SET); lcd_text12(0,12,"SIM卡号",7,LCD_MODE_SET); lcd_text12(43,12,(char *)Menu_sim_Code,11,LCD_MODE_SET); lcd_text12(24,23,"确定",4,LCD_MODE_INVERT); lcd_text12(72,23,"取消",4,LCD_MODE_SET); lcd_update_all(); } else if(comfirmation_flag==1) { col_screen=0; comfirmation_flag=4; //保存设置的信息 lcd_fill(0); lcd_text12(18,3,"保存已设置信息",14,LCD_MODE_SET); lcd_text12(0,18,"按菜单键进入待机界面",20,LCD_MODE_SET); lcd_update_all(); // 保存速度类型 // gps速度JT808Conf_struct.Speed_GetType= 0: 传感器速度 JT808Conf_struct.Speed_GetType=1 spd_type(JT808Conf_struct.Speed_GetType); //车牌号 //rt_kprintf("\r\n(保存信息)Menu_Car_license=%s",Menu_Car_license); memset(Vechicle_Info.Vech_Num,0,sizeof(Vechicle_Info.Vech_Num)); memcpy(Vechicle_Info.Vech_Num,Menu_Car_license,strlen((const char*)Menu_Car_license)); //rt_kprintf("\r\n(保存信息)Vechicle_Info.Vech_Num=%s",Vechicle_Info.Vech_Num); // 车辆类型 memset(Vechicle_Info.Vech_Type,0,sizeof(Vechicle_Info.Vech_Type)); memcpy(Vechicle_Info.Vech_Type,Menu_VechileType,10); //rt_kprintf("\r\n(保存1 )Vechicle_Info.Vech_Num=%s",Vechicle_Info.Vech_Num); /////// //车辆VIN memset(Vechicle_Info.Vech_VIN,0,sizeof(Vechicle_Info.Vech_VIN)); memcpy(Vechicle_Info.Vech_VIN,Menu_Vin_Code,17); //rt_kprintf("\r\n(保存2 )Vechicle_Info.Vech_Num=%s",Vechicle_Info.Vech_Num); // SIM卡号码 //memset(JT808Conf_struct.Vech_sim,0,sizeof(JT808Conf_struct.Vech_sim)); //memcpy(JT808Conf_struct.Vech_sim,Menu_sim_Code,11); //----------------------------------------------------------------------------- memset(SimID_12D,0,sizeof(SimID_12D)); SimID_12D[0]='0'; memcpy(SimID_12D+1,Menu_sim_Code,11); DF_WriteFlashSector(DF_SIMID_12D,0,SimID_12D,13); delay_ms(80); //rt_kprintf("\r\n 显示屏设备SIM_ID设置为 : %s", SimID_12D); DF_ReadFlash(DF_SIMID_12D,0,SimID_12D,13); SIMID_Convert_SIMCODE(); // 转换 //---------------------------------------------------------------------------- //rt_kprintf("\r\n(保存3 )Vechicle_Info.Vech_Num=%s",Vechicle_Info.Vech_Num); // 车牌颜色 if(License_Not_SetEnable==1) Vechicle_Info.Dev_Color=0; else Vechicle_Info.Dev_Color=Menu_color_num; //车辆设置完成 Login_Menu_Flag=1; // 输入界面为0 DF_WriteFlashSector(DF_LOGIIN_Flag_offset,0,&Login_Menu_Flag,1); // 存储 //rt_kprintf("\r\n(保存4 )Vechicle_Info.Vech_Num=%s",Vechicle_Info.Vech_Num); DF_WriteFlashSector(DF_Vehicle_Struct_offset,0,(u8*)&Vechicle_Info,sizeof(Vechicle_Info)); WatchDog_Feed(); DF_WriteFlashSector(DF_VehicleBAK_Struct_offset,0,(u8*)&Vechicle_Info,sizeof(Vechicle_Info)); WatchDog_Feed(); DF_WriteFlashSector(DF_VehicleBAK2_Struct_offset,0,(u8*)&Vechicle_Info,sizeof(Vechicle_Info)); delay_ms(3); DF_ReadFlash(DF_Vehicle_Struct_offset,0,(u8*)&Vechicle_Info,sizeof(Vechicle_Info)); } else if(comfirmation_flag==2) { col_screen=0; comfirmation_flag=3; lcd_fill(0); lcd_text12(6, 3,"请确认是否重新设置",18,LCD_MODE_SET); lcd_text12(12,18,"按确认键重新设置",16,LCD_MODE_SET); lcd_update_all(); } else if(comfirmation_flag==3) { col_screen=0; comfirmation_flag=0; //重新设置 pMenuItem=&Menu_0_loggingin; pMenuItem->show(); comfirmation_flag=0; col_screen=0; CarBrandCol_Cou=1; } break; case KeyValueUP: if(col_screen==1) { CarBrandCol_Cou--; if(CarBrandCol_Cou<1) CarBrandCol_Cou=5; car_col_fun(CarBrandCol_Cou); } else if(col_screen==3) { comfirmation_flag=1; lcd_fill(0); if(License_Not_SetEnable==1) lcd_text12(0,0,"无牌照",6,LCD_MODE_SET); else lcd_text12(0,0,(char *)Menu_Car_license,8,LCD_MODE_SET); lcd_text12(54,0,(char *)Menu_VechileType,6,LCD_MODE_SET); //==== 车牌号未设置===== if(License_Not_SetEnable==1) lcd_text12(96,0,(char *)"0",1,LCD_MODE_SET); else lcd_text12(96,0,(char *)Menu_VecLogoColor,4,LCD_MODE_SET); lcd_text12(0,12,"SIM卡号",7,LCD_MODE_SET); lcd_text12(43,12,(char *)Menu_sim_Code,11,LCD_MODE_SET); lcd_text12(24,23,"确定",4,LCD_MODE_INVERT); lcd_text12(72,23,"取消",4,LCD_MODE_SET); lcd_update_all(); } break; case KeyValueDown: if(col_screen==1) { CarBrandCol_Cou++; if(CarBrandCol_Cou>5) CarBrandCol_Cou=1; car_col_fun(CarBrandCol_Cou); } else if(col_screen==3) { comfirmation_flag=2; lcd_fill(0); if(License_Not_SetEnable==1) lcd_text12(0,0,"无牌照",6,LCD_MODE_SET); else lcd_text12(0,0,(char *)Menu_Car_license,8,LCD_MODE_SET); lcd_text12(54,0,(char *)Menu_VechileType,6,LCD_MODE_SET); //==== 车牌号未设置===== if(License_Not_SetEnable==1) lcd_text12(96,0,(char *)"0",1,LCD_MODE_SET); else lcd_text12(96,0,(char *)Menu_VecLogoColor,4,LCD_MODE_SET); lcd_text12(0,12,"SIM卡号",7,LCD_MODE_SET); lcd_text12(43,12,(char *)Menu_sim_Code,11,LCD_MODE_SET); lcd_text12(24,23,"确定",4,LCD_MODE_SET); lcd_text12(72,23,"取消",4,LCD_MODE_INVERT); lcd_update_all(); } break; } KeyValue=0; }
/*更新北斗线程,接收调试串口来的数据,透传到gps串口中*/ void thread_usb_update( void* parameter ) { rt_uint16_t i=0; #define READ_PACKET_SIZE 1012 void ( *msg )( void *p ); int fd = -1, count = 0; //rt_uint8_t *pdata; /*数据*/ rt_err_t res; rt_uint8_t file_infor[20]; rt_uint32_t file_datalen; /*升级文件长度*/ rt_uint16_t page,j; msg =(void (*)(void*)) parameter; ptr_read_packet= rt_malloc( 520 ); if( ptr_read_packet == RT_NULL ) { Exit_updata=0; check_error=1; msg( "E内存不足" ); return; } // 1. Lock DF and Erase File Area DF_LOCK=1; rt_thread_delay(2); DF_EraseAppFile_Area(); /*查找U盘*/ //-------------------------------------------------------------------------------- while( 1 ) { if( rt_device_find( "udisk" ) == RT_NULL ) /*没有找到*/ { count++; if( count <= 10 ) { msg( "I等待U盘插入" ); }else { msg( "EU盘不存在" ); /*指示U盘不存在*/ check_error=1; goto end_upgrade_usb_0; } rt_thread_delay( RT_TICK_PER_SECOND ); }else { msg( "I查找升级文件" ); break; } } /*查找指定文件*/ fd = open( "/udisk/UPDATE.TCB", O_RDONLY, 0 ); if( fd >= 0 ) msg( "I读取文件升级" ); else { msg( "E升级文件不存在" ); check_error=1; goto end_upgrade_usb_0; } file_datalen=0;//文件长度统计 Updata_PacketNum=0;//升级进度指示 //------------------------------------------------------------------------------- while( 1 ) { rt_thread_delay(RT_TICK_PER_SECOND/2); res=0; res = read( fd, ptr_read_packet,514 ); memcpy(fetch_data_514,ptr_read_packet,514); if(res<0) { msg("E读取文件出错"); check_error=1; goto end_upgrade_usb_1; } else if( res == 514 ) /*判断是否为最后一包*/ { Updata_PacketNum++; page=(((u16)fetch_data_514[0])<<8)+((u16)fetch_data_514[1]); file_datalen+=res; rt_kprintf("\r\n读取的数据page=%d,file_datalen=%d ",page,file_datalen); for(j=0;j<10;j++) rt_kprintf(" %2X",fetch_data_514[j]); rt_kprintf("\r\n"); WatchDog_Feed(); if(page==50) { //-------- Version Type judge------ if(Update_HardSoft_Version_Judge(fetch_data_514+2)==false) // +2 是内容 { msg( "E固件类型不匹配" ); goto end_upgrade_usb_1; } DF_WriteFlashDirect(50,0,&fetch_data_514[2],512); DF_ReadFlash(50,0,read_data_514,512); for(i=0;i<512;i++) { if(read_data_514[i]!=fetch_data_514[i+2]) rt_kprintf("\r\n page=%d,i=%d,write=%X,read=%X",page,i,fetch_data_514[i+2],read_data_514[i]); } msg( "I文件升级完成" ); rt_kprintf("文件长度 = %d",file_datalen); DF_LOCK=0; goto end_upgrade_usb_1; } else { if(page%8==0) DF_WriteFlashSector(page,0,&fetch_data_514[2],512); else DF_WriteFlashDirect(page,0,&fetch_data_514[2],512); rt_thread_delay(3); //---------- 下载内容比较判断 ----------------------------------------------- DF_ReadFlash(page,0,read_data_514,512); for(i=0;i<512;i++) { if(read_data_514[i]!=fetch_data_514[i+2]) { rt_kprintf("\r\n page=%d,i=%d,write=%X,read=%X",page,i,fetch_data_514[i+2],read_data_514[i]); msg( "E写入文件错误" ); check_error=1; goto end_upgrade_usb_1; } } //-------------------------------------------------------------------------- sprintf((char *)file_infor,"I升级第%d包",Updata_PacketNum); msg(file_infor); } } else { msg( "EU盘读取错误" ); check_error=1; goto end_upgrade_usb_1; } } //-------------------------------------------------------------------- end_upgrade_usb_1: if( fd >= 0 ) { close( fd ); } end_upgrade_usb_0: Exit_updata=0; rt_free( ptr_read_packet); ptr_read_packet= RT_NULL; }
u8 Api_DFdirectory_Read(u8 *name,u8 *buffer, u16 len, u8 style ,u16 numPacket) // style 1. old-->new 0 : new-->old { /* 连续调用几次 ,依次按style 方式递增*/ // style 1. old-->new 0 : new-->old // numPacket : 安装 style 方式读取开始 第几条数据包 from: 0 u16 read_addr=0; DF_delay_ms(1); if(strcmp((const char*)name,spdpermin)==0) { if(style==1) read_addr=0+numPacket; else { if(AvrgSpdPerMin_write==0) return false; else if(AvrgSpdPerMin_write>=(numPacket+1)) read_addr=AvrgSpdPerMin_write-1-numPacket; else return false; } Read_PerMinContent(read_addr,buffer, len); //---------------------- return true; } if(strcmp((const char*)name,spd_warn)==0) { if(style==1) read_addr=0+numPacket; else { if(ExpSpdRec_write==0) return false; else if(ExpSpdRec_write>=(numPacket+1)) read_addr=ExpSpdRec_write-1-numPacket; else return false; } Common_ReadContent( read_addr, buffer, len, TYPE_ExpSpdAdd); return true; } if(strcmp((const char*)name,tired_warn)==0) { if(style==1) read_addr=0+numPacket; else { if(TiredDrv_write==0) return false; else if(TiredDrv_write>=(numPacket+1)) read_addr=TiredDrv_write-1-numPacket; else return false; } Common_ReadContent( read_addr, buffer, len, TYPE_TiredDrvAdd); //------------------------- return true; } if(strcmp((const char*)name,doubt_data)==0) { if(style==1) read_addr=0+numPacket; else { if(Recorder_write==0) return false; else if(Recorder_write>=(numPacket+1)) read_addr=Recorder_write-1-numPacket; else return false; } Read_DrvRecoder(read_addr, buffer, len ); //------------------------- return true; } //------- MultiMedia RAW data --------- if(strcmp((const char*)name,voice)==0) { if(style==0) return false; // 只允许从old -> new DF_ReadFlash(SoundStart_offdet+numPacket,0, buffer, len); return true; } if(strcmp((const char*)name,camera_1)==0) { DF_ReadFlash(PicStart_offset+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_2)==0) { DF_ReadFlash(PicStart_offset2+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_3)==0) { DF_ReadFlash(PicStart_offset3+numPacket,0,buffer, len); return true; } if(strcmp((const char*)name,camera_4)==0) { DF_ReadFlash(PicStart_offset4+numPacket,0,buffer, len); return true; } return false; }
u8 Read_PerSecContent(u32 In_read,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 FCS=0; u16 i=0; /* 上报的每一包数据位31个字节, 每条记录为32个字节,用每条记录的最后一个字节来作为是否上报过的标志位。没有上报该标志为0xFF 上报过后该标志为被写为0x01 */ //---------------------------------------------------------------------------------------------- // 1. caculate address pageoffset=(u32)(In_read/7); // 计算出 Page 偏移 除以7 InPageoffset=In_read-(u32)(pageoffset*7); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset*70); // 计算出页内 字节 乘以 70 (每个记录70个字节) // 2. Write Record Content DF_ReadFlash(pageoffset+AvrgSpdSec_offset,InPageAddr,content,ReadLen); DF_delay_us(10); // rt_kprintf("\r\n Read PerMintSPD Starpageoffset=%d PageOffset= %d , InPageAddr= %d 每分钟平均速度 \r\n",AverageSpdStart_offset,pageoffset,InPageoffset); if(DispContent==2) { rt_kprintf("\r\n 读取每秒PerSecSPD 内容为 :\r\n"); for(i=0;i<ReadLen;i++) rt_kprintf("%2X ",content[i]); rt_kprintf("\r\n"); } // 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) { rt_kprintf("\r\n 读取内容为0xFF \r\n"); AvrgSpdPerSec_Read=AvrgSpdPerSec_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } AvrgSpdPerSec_Read++; if(AvrgSpdPerSec_Read>=Max_SPDerSec) AvrgSpdPerSec_Read=0; //rt_kprintf("\r\n ******* PerMit 该条记录内容不对 ******* \r\n"); return false; } if(content[0]==0xFF) { rt_kprintf("\r\n 读取内容为0xFF \r\n"); AvrgSpdPerSec_Read=AvrgSpdPerSec_write;//如果是内容是0xFF ,读指针和写指针相等,不再触发上报。 return false; } //----------------------------------------------------------------------------------------------------- return true; //----------------------------------------------------------------------------------------------------- }
/****************************************************************************** * Function: show_text () * DESCRIPTION: - 显示函数 * Input: n_screen 是第几条内容 * Input: n_sub_screen 当前内容可显示屏数 * Output: * Returns: * * ----------------------------------- * Created By wxg 15-jan-2014 * ------------------------------- ******************************************************************************/ show_text(u8 n_screen,u8 n_sub_screen) { u8 temp[2];//读出计数和长度 u8 tmp[256];//读出全部内容 u8 timer[6];//时间buffer u8 text_data[210];//信息内容 u16 len_txt;//文本长度 //读出flash数据 if(mainshow==show_first) { memset(temp,0,10); memset(tmp,0,256); memset(timer,0,6); memset(text_data,0,210); mainshow=0; now_show=0; subshow=0; wait_show=0; len_txt=0; if(Erase_flag ==Top_15) { DF_ReadFlash(DF_BD_data_rx,n_screen*256,temp,2); } if(Erase_flag ==After_15) { DF_ReadFlash(DF_BD_data_rx+8,n_screen*256,temp,2); } if(1<=temp[0]<=15) { if(mainshow==show_first) { DF_ReadFlash(DF_BD_data_rx,n_screen*256,tmp,temp[1]); memcpy(timer,tmp+2,6);//时间 //计算出内容长度 len_txt = tmp[14]<<8+tmp[15]; len_txt=len_txt/8; memcpy( text_data,tmp+16,len_txt); now_show =len_txt; } } else { lcd_fill(0); lcd_text12(0,10,"无内容可显示...",15,LCD_MODE_SET); lcd_update_all(); } } //开始显示 if(mainshow==show_first ) { First_show(tmp ,n_screen);//显示时间和条数 mainshow=show_end;//如果showing==show_end主屏号++,等到Auto_line_show返回值为0 则可以++; subshow=show_first;//子屏显示++; } wait_show =Auto_line_show(text_data, now_show); if(wait_show!=0) { now_show= wait_show; } else { mainshow=show_first ;//主屏可以显示 subshow=show_end;//子屏不可以显示 } }
u8 Api_RecordNum_Read( u8 *name,u8 Rec_Num,u8 *buffer, u16 len) // Rec_Num<128 Len<128 { if(strcmp((const char*)name,event_808)==0) { DF_ReadFlash(DF_Event_Page+Rec_Num, 0,buffer, len); // DF_delay_ms(10); return true; } if(strcmp((const char*)name,msg_broadcast)==0) { DF_ReadFlash(DF_Broadcast_offset+Rec_Num, 0,buffer, len); //DF_delay_ms(10); return true; } if(strcmp((const char*)name,phonebook)==0) { DF_ReadFlash(DF_PhoneBook_Page+Rec_Num, 0,buffer, len); //DF_delay_ms(10); return true; } if(strcmp((const char*)name,Rail_cycle)==0) { DF_ReadFlash(DF_Event_Page+Rec_Num, 0,buffer, len); // DF_delay_ms(10); return true; } if(strcmp((const char*)name,Rail_rect)==0) { DF_ReadFlash(DF_RectangleRail_Page+Rec_Num, 0,buffer, len); // DF_delay_ms(10); return true; } if(strcmp((const char*)name,Rail_polygen)==0) { DF_ReadFlash(DF_PolygenRail_Page+Rec_Num, 0,buffer, len); //DF_delay_ms(10); return true; } if(strcmp((const char*)name,turn_point)==0) { DF_ReadFlash(DF_turnPoint_Page+Rec_Num, 0,buffer, len); // DF_delay_ms(10); return true; } if(strcmp((const char*)name,route_line)==0) { DF_ReadFlash(DF_Route_Page+Rec_Num, 0,buffer, len); DF_delay_ms(10); return true; } if(strcmp((const char*)name,ask_quesstion)==0) { DF_ReadFlash(DF_AskQuestion_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,text_msg)==0) { DF_ReadFlash(DF_Msg_Page+Rec_Num, 0,buffer, len); //DF_delay_ms(10); return true; } if(strcmp((const char*)name,pic_index)==0) { DF_ReadFlash(DF_PicIndex_Page+Rec_Num, 0,buffer, len); return true; } if(strcmp((const char*)name,voice_index)==0) { DF_ReadFlash(DF_SoundIndex_Page+Rec_Num, 0,buffer, len); //DF_delay_ms(10); return true; } return false; }
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 Common_WriteContent(u32 In_write,u8 *content ,u16 saveLen, u8 Type) { //----------------------------------------------------- u8 reg[1]; //u8 regStr[25]; //----------------------------------------------------- u32 pageoffset=0; //Page 偏移 u32 InPageoffset; //页内Record偏移 u16 InPageAddr=0; //页内 地址偏移 u32 Start_offset=0; //-------------------------------------------------- //memset(regStr,0,sizeof(regStr)); // 1. Classify switch(Type) { case TYPE_TiredDrvAdd: Start_offset=TiredDrvStart_offset; // memcpy(regStr,"疲劳驾驶",25); break; case TYPE_ExpSpdAdd: Start_offset=ExpSpdStart_offset; // memcpy(regStr,"超速报警",25); break; case TYPE_ErrorLogAdd: Start_offset=AbNormalStart_offset; //memcpy(regStr,"异常LOG",25); break; case TYPE_LogInAdd: Start_offset=LogIn_offset; // memcpy(regStr,"登录记录",25); break; case TYPE_SettingChgAdd: Start_offset=SettingChg_offset; //memcpy(regStr,"参数修改",25); break; default : return false; } //---------------------------------------------------------------------------------------------- // 2. caculate address pageoffset=(u32)(In_write>>4); // 计算出 Page 偏移 除以16 InPageoffset=In_write-(u32)(pageoffset<<4); // 计算出 页内偏移地址 InPageAddr=(u16)(InPageoffset<<5); // 计算出页内 字节 乘以 32 (每个记录32个字节) if(((pageoffset%8)==0)&&(InPageoffset==0)) // 判断是否需要擦除Block 被移除到下一个Block 1Block=8Page { SST25V_SectorErase_4KByte((pageoffset+Start_offset)*PageSIZE); // erase Sector DF_delay_ms(70); // rt_kprintf("\r\n Common --- Erase Cycle Block : %d\r\n",(pageoffset>>6)); } // 2. Filter write area DF_ReadFlash(pageoffset+Start_offset,InPageAddr,reg,1); if(reg[0]!=0xff) // 如果要写入的区域 dirty ,则地址增然后从新开始寻找知道找到为止 { In_write++; if(In_write>=Max_CommonNum) In_write=0; // rt_kprintf("\r\n ******* Common 写区域 Write area : %d is Dirity! \r\n",In_write); return false; } // 3. Write Record Content DF_WriteFlashDirect(pageoffset+Start_offset,InPageAddr,content,saveLen); // 写入信息 DF_delay_ms(10); //rt_kprintf("\r\n Common Starpageoffset=%d PageOffset= %d , InPageAddr= %d TYPE= %s \r\n",CycleStart_offset,pageoffset,InPageoffset,regStr); // 4. end switch(Type) { case TYPE_TiredDrvAdd: TiredDrv_write=In_write; break; case TYPE_ExpSpdAdd: ExpSpdRec_write=In_write; break; case TYPE_AvrgSpdAdd: AvrgSpdPerMin_write=In_write; break; case TYPE_ErrorLogAdd: ErrorLog_write=In_write; break; case TYPE_LogInAdd: Login_write=In_write; break; case TYPE_SettingChgAdd: Settingchg_write=In_write; break; default : return false; } return true; }