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"); }
void MediaIndex_Init(void) { u8 i=0; memset((u8*)&MediaIndex,0,sizeof(MediaIndex)); for(i=0;i<8;i++) { MediaIndex.ID=i+1; if(i==0) { MediaIndex.Type=0; memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName)); memcpy(MediaIndex.FileName,"pic.jpg",7); DF_WriteFlashSector(DF_PicIndex_Page,0,(u8*)&MediaIndex,sizeof(MediaIndex)); DF_delay_ms(50); MediaIndex.Type=1; memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName)); memcpy(MediaIndex.FileName,"sound.wav",9); DF_WriteFlashSector(DF_SoundIndex_Page,0,(u8*)&MediaIndex,sizeof(MediaIndex)); DF_delay_ms(50); } else { MediaIndex.Type=0; memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName)); memcpy(MediaIndex.FileName,"pic.jpg",7); DF_WriteFlashDirect(DF_PicIndex_Page+i, 0,(u8*)&MediaIndex, sizeof(MediaIndex)); DF_delay_ms(10); MediaIndex.Type=1; memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName)); memcpy(MediaIndex.FileName,"sound.wav",9); DF_WriteFlashDirect(DF_SoundIndex_Page+i,0,(u8*)&MediaIndex,sizeof(MediaIndex)); DF_delay_ms(10); } } }
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 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 Api_DFdirectory_Write(u8 *name,u8 *buffer, u16 len) { if(strcmp((const char*)name,spdpermin)==0) { Save_PerMinContent(AvrgSpdPerMin_write,buffer, len); //----- Record update---- AvrgSpdPerMin_write++; if(AvrgSpdPerMin_write>=Max_SPDSperMin) AvrgSpdPerMin_write=0; DF_Write_RecordAdd(AvrgSpdPerMin_write, AvrgSpdPerMin_write, TYPE_AvrgSpdAdd); //---------------------- return true; } if(strcmp((const char*)name,spd_warn)==0) { Common_WriteContent( ExpSpdRec_write, buffer, len, TYPE_ExpSpdAdd); //----- Record update---- ExpSpdRec_write++; if(ExpSpdRec_write>=Max_SPDSperMin) ExpSpdRec_write=0; DF_Write_RecordAdd(ExpSpdRec_write, ExpSpdRec_write, TYPE_ExpSpdAdd); //----- Record update---- return true; } if(strcmp((const char*)name,tired_warn)==0) { Common_WriteContent( TiredDrv_write, buffer, len, TYPE_TiredDrvAdd); //----- Record update---- TiredDrv_write++; if(TiredDrv_write>=Max_CommonNum) TiredDrv_write=0; DF_delay_us(10); DF_Write_RecordAdd(TiredDrv_write,TiredDrv_read,TYPE_TiredDrvAdd); //------------------------- return true; } if(strcmp((const char*)name,doubt_data)==0) { Save_DrvRecoder(Recorder_write, buffer, len ); //----- Record update---- Recorder_write++; if(Recorder_write>=Max_RecoderNum) Recorder_write=0; DF_Write_RecordAdd(Recorder_write,Recorder_Read,TYPE_VechRecordAdd); //------------------------- return true; } //------- MultiMedia RAW data --------- if(strcmp((const char*)name,voice)==0) { DF_WriteFlashDirect(SoundStart_offdet+Dev_Voice.Voice_PageCounter,0,Dev_Voice.Voice_Reg,500); return true; } if(strcmp((const char*)name,camera_1)==0) { DF_WriteFlashDirect(pic_current_page,0,buffer, len); return true; } if(strcmp((const char*)name,camera_2)==0) { DF_WriteFlashDirect(pic_current_page,0,buffer, len); return true; } if(strcmp((const char*)name,camera_3)==0) { DF_WriteFlashDirect(pic_current_page,0,buffer, len); return true; } if(strcmp((const char*)name,camera_4)==0) { DF_WriteFlashDirect(pic_current_page,0,buffer, len); return true; } return false; }
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; }
/*更新北斗线程,接收调试串口来的数据,透传到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 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; }
void Pic_Data_Process(void) { u8 tmp[40]; u8 pic_buf[600]; u16 i = 0; DF_TAKE; // 1. Judge last package PackageLen = _485_content_wr; if(PackageLen < PageSIZE) CameraState.last_package = 1; else if((CameraState.last_package == 0) && (_485_content[510] == 0xFF) && (_485_content[511] == 0xD9)) { CameraState.last_package = 1; } // 2. Block ++ CameraState.block_counter++; // 3. Check first packet if(CameraState.create_Flag == 1) // 如果是第一包则创建文件 hhmmss_x.jpg { CameraState.create_Flag = 0; // clear memset(tmp, 0, sizeof(tmp)); memset(PictureName, 0, sizeof(PictureName)); //----------- 创建图片文件处理 ------------- /* 每张图片占32个page 其中第1个page 为图片索引,后边127个Page为图片内容 SST25 开辟个区域做图片缓存 */ if(CameraState.Camera_Number == 1) { pic_current_page = PicStart_offset; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_1); } else if(CameraState.Camera_Number == 2) { pic_current_page = PicStart_offset2; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_2); ; } else if(CameraState.Camera_Number == 3) { pic_current_page = PicStart_offset3; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_3); } else if(CameraState.Camera_Number == 4) { pic_current_page = PicStart_offset4; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_4); } DF_delay_ms(150); WatchDog_Feed(); pic_current_page++; // 图片内容从 第二个page 开始 第一个Page 存储的是图片索引 pic_PageIn_offset = 0; // 页内偏移清空 pic_size = 0; // 清除图片大小 //------------------------------------------ memset(PictureName, 0, sizeof(PictureName)); // sprintf((char*)PictureName,"0:%02d%02d%02d%02d%02d%02d-%d.jpg",time_now.year,time_now.month,time_now.day,time_now.hour,time_now.min,time_now.sec,CameraState.Camera_Number); sprintf((char*)PictureName,"%02d%02d%02d%02d%02d%02d-%d.jpg",time_now.year,time_now.month,time_now.day,time_now.hour,time_now.min,time_now.sec,CameraState.Camera_Number); if(GB19056.workstate == 0) rt_kprintf("\r\n 创建图片名称: %s \r\n ", PictureName); WatchDog_Feed(); WatchDog_Feed(); // ----- 写图片索引 ------- Save_MediaIndex(0, PictureName, CameraState.Camera_Number, 0); } // 4. 填写存储图片内容数据 -------------------- WatchDog_Feed(); DF_WriteFlashDirect(pic_current_page, 0, _485_content, PackageLen); // 写一次一个Page 512Bytes delay_ms(150); #ifdef TFCARD if(sd_ok) sd_writefile(PictureName, _485_content, PackageLen); #endif // rt_kprintf(" \r\n ---- pkg=%d \r\n",CameraState.block_counter); //--- read compare memset(pic_buf, 0, 600); DF_ReadFlash(pic_current_page, 0, pic_buf, PackageLen); delay_ms(10); for(i = 0; i < PackageLen; i++) { if(pic_buf[i] != _485_content[i]) { if(GB19056.workstate == 0) rt_kprintf(" \r\n write--read Error"); // rt_kprintf(" \r\n ----read not equal write where i=%d Rd[i]=%2X WR[i]=%2X \r\n",i,pic_buf[i],_485_content[i]); DF_WriteFlashDirect(pic_current_page, 0, _485_content, PackageLen); // 再写一次一个Page 512Bytes delay_ms(100); break; } } pic_size += PackageLen; // 图片大小累加 pic_current_page++; //写一页加一 // pic_PageIn_offset+=PackageLen; // DF_delay_ms(50); // 5. 最后一包 ,即拍照结束 if(CameraState.last_package == 1) { memset(_485_content, 0, sizeof(_485_content)); _485_content_wr = 0; //------------- 图片拍照结束 相关处理 ------------------------------------ // 1. 写图片索引 if(CameraState.Camera_Number == 1) pic_current_page = PicStart_offset; //计算图片起始page else if(CameraState.Camera_Number == 2) pic_current_page = PicStart_offset2; //计算图片起始page else if(CameraState.Camera_Number == 3) pic_current_page = PicStart_offset3; //计算图片起始page else if(CameraState.Camera_Number == 4) pic_current_page = PicStart_offset4; //计算图片起始page PictureName[18] = CameraState.Camera_Number; memcpy(PictureName + 19, (u8 *)&pic_size, 4); DF_WriteFlashDirect(pic_current_page, 0, PictureName, 23); DF_delay_ms(8); // 5.1 更新图片读写记录 //-------------------------------------------------------------------------- if(GB19056.workstate == 0) rt_kprintf("\r\n PicSize: %d Bytes\r\n Camera %d End\r\n", pic_size, CameraState.Camera_Number); CameraState.SingleCamra_TakeResualt_BD = 0; // 单路摄像头拍照 SD_ACKflag.f_BD_CentreTakeAck_0805H = 1; // 发送中心拍照命令应答 //---------- Normal process --------------------- Camera_End(MultiTake.Taking); // 5.2 拍照完成后检查有没有多路 拍-----------Multi Take process-------------------- if(1 == MultiTake.Taking) { switch(CameraState.Camera_Number) { case 1: //-------- old process--------------- MultiTake.TakeResult[0] = Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry = 0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- CameraState.Camera_Number = 2; //------------------------- Camera_Start(CameraState.Camera_Number); break; case 2: //-------- old process--------------- MultiTake.TakeResult[1] = Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry = 0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- CameraState.Camera_Number = 3; //------------------------- Camera_Start(CameraState.Camera_Number); break; case 3: //-------- old process--------------- MultiTake.TakeResult[2] = Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry = 0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- CameraState.Camera_Number = 4; //------------------------- Camera_Start(CameraState.Camera_Number); break; case 4: //-------- old process--------------- MultiTake.TakeResult[3] = Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry = 0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; break; default: MultiTake_End(); break; } } else if((0 == MultiTake.Taking) && (0 == MultiTake.Transfering)) { //------ 判断车门开关拍照是否上传状态 ------ if((OpenDoor_StartTakeFlag == 1) && (Opendoor_transFLAG == 0)) { MultiTake_End(); // 车门开关不上传 OpenDoor_StartTakeFlag = 0; } else { //rt_kprintf("\r\n Single Camera !\r\n"); if(CameraState.Camera_Take_not_trans == 0) Photo_send_start(CameraState.Camera_Number); //在不是多路拍照的情况下拍完就可以上传了 else CameraState.Camera_Take_not_trans = 0; } } // 拍照结束 } else { //------- change state ------- CameraState.status = transfer; CameraState.OperateFlag = 0; // clear CameraState.TX_485const_Enable = 1; // 发送485 命令 _485_RXstatus._485_receiveflag = IDLE_485; memset(_485_content, 0, sizeof(_485_content)); _485_content_wr = 0; //rt_kprintf("\r\n One Packet Over!\r\n"); } DF_RELEASE; }
void Pic_Data_Process(void) { u8 tmp[40]; u8 pic_buf[600]; u16 i=0; // 1. Judge last package PackageLen=_485_content_wr; if(PackageLen<PageSIZE) last_package=1; else if((last_package==0)&&(_485_content[510]==0xFF)&&(_485_content[511]==0xD9)) { last_package=1; } // 2. Block ++ CameraState.block_counter++; // 3. Check first packet if(CameraState.create_Flag==1) // 如果是第一包则创建文件 hhmmss_x.jpg { CameraState.create_Flag=0; // clear memset(tmp,0,sizeof(tmp)); memset(PictureName,0,sizeof(PictureName)); //----------- 创建图片文件处理 ------------- /* 每张图片占32个page 其中第1个page 为图片索引,后边127个Page为图片内容 SST25 开辟个区域做图片缓存 */ DF_Read_RecordAdd(pic_write,pic_read,TYPE_PhotoAdd); //pic_current_page=(pic_write<<5)+PicStart_offset; //计算图片起始page if(Camera_Number==1) { pic_current_page=PicStart_offset; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_1); } else if(Camera_Number==2) { pic_current_page=PicStart_offset2; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_2); ; } else if(Camera_Number==3) { pic_current_page=PicStart_offset3; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_3); } else if(Camera_Number==4) { pic_current_page=PicStart_offset4; //起始page 固定为缓存起始地址 //擦除一个64K的区域用于图片存储 Api_DFdirectory_Delete(camera_4); } DF_delay_ms(150); WatchDog_Feed(); pic_current_page++; // 图片内容从 第二个page 开始 第一个Page 存储的是图片索引 pic_PageIn_offset=0; // 页内偏移清空 pic_size=0; // 清除图片大小 //------------------------------------------ memset(PictureName,0,sizeof(PictureName)); sprintf((char*)PictureName,"%d%d%d-%d.jpg",time_now.hour,time_now.min,time_now.sec,Camera_Number); rt_kprintf("\r\n 创建图片名称: %s \r\n 图片地址: %d ",PictureName,pic_write); WatchDog_Feed(); //----- TF ------- /*if(Udisk_Test_workState==1) { // creat_file(PictureName); //TF卡创建文件 rt_kprintf("\r\n udisk 创建文件成功!"); udisk_fd=open((const char*)PictureName, O_RDWR|O_CREAT, 0); // 创建U 盘文件 rt_kprintf(" \r\n udiskfile: %s open res=%d \r\n",PictureName, udisk_fd); } */ WatchDog_Feed(); // ----- 写图片索引 ------- Save_MediaIndex(0,PictureName,Camera_Number,0); } // 4. 填写存储图片内容数据 -------------------- WatchDog_Feed(); DF_WriteFlashDirect(pic_current_page,0,_485_content, PackageLen);// 写一次一个Page 512Bytes delay_ms(90); //rt_kprintf(" \r\n ---- write pic_current_page=%d \r\n",pic_current_page); rt_kprintf(" \r\n ---- packet=%d \r\n",CameraState.block_counter); //--- read compare memset(pic_buf,0,600); DF_ReadFlash(pic_current_page,0,pic_buf, PackageLen); delay_ms(30); for(i=0;i<PackageLen;i++) { if(pic_buf[i]!=_485_content[i]) { rt_kprintf(" \r\n ----read not equal write where i=%d Rd[i]=%2X WR[i]=%2X \r\n",i,pic_buf[i],_485_content[i]); DF_WriteFlashDirect(pic_current_page,0,_485_content, PackageLen);// 再写一次一个Page 512Bytes delay_ms(85); break; } } //----- TF ------- /* if((Udisk_Test_workState==1)&&(udisk_fd)) { fd_res=write(udisk_fd,_485_content, PackageLen); rt_kprintf("\r\n wr--1 :%s resualt=%d\r\n",PictureName,fd_res); if(fd_res<=0) close(udisk_fd); } */ pic_size+=PackageLen;// 图片大小累加 pic_current_page++; //写一页加一 // pic_PageIn_offset+=PackageLen; DF_delay_ms(50); // 5. 最后一包 ,即拍照结束 if(last_package==1) { //f_close(&FileCameraIn); // 拍照完成关闭图片文件 memset(_485_content,0,sizeof(_485_content)); _485_content_wr=0; //------------- 图片拍照结束 相关处理 ------------------------------------ // 1. 写图片索引 if(Camera_Number==1) pic_current_page=PicStart_offset; //计算图片起始page else if(Camera_Number==2) pic_current_page=PicStart_offset2; //计算图片起始page else if(Camera_Number==3) pic_current_page=PicStart_offset3; //计算图片起始page else if(Camera_Number==4) pic_current_page=PicStart_offset4; //计算图片起始page PictureName[18]=Camera_Number; memcpy(PictureName+19,(u8*)&pic_size,4); DF_WriteFlashDirect(pic_current_page,0,PictureName, 23); DF_delay_ms(8); // 5.1 更新图片读写记录 pic_write++; if(pic_write>=Max_PicNum) pic_write=0; DF_Write_RecordAdd(pic_write,pic_read,TYPE_PhotoAdd); //-------------------------------------------------------------------------- rt_kprintf("\r\n PicSize: %d Bytes\r\n Camera %d End\r\n",pic_size,Camera_Number); SingleCamra_TakeResualt_BD=0; // 单路摄像头拍照 SD_ACKflag.f_BD_CentreTakeAck_0805H=1; // 发送中心拍照命令应答 //---------- Normal process --------------------- End_Camera(); // 5.2 拍照完成后检查有没有多路 拍-----------Multi Take process-------------------- if(1==MultiTake.Taking) { switch(Camera_Number) { case 1: //-------- old process--------------- MultiTake.TakeResult[0]=Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry=0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- Camera_Number=2; //------------------------- Start_Camera(Camera_Number); break; case 2: //-------- old process--------------- MultiTake.TakeResult[1]=Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry=0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- Camera_Number=3; //------------------------- Start_Camera(Camera_Number); break; case 3: //-------- old process--------------- MultiTake.TakeResult[2]=Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry=0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; //----------拍照下一路摄像头----------- Camera_Number=4; //------------------------- Start_Camera(Camera_Number); break; case 4: //-------- old process--------------- MultiTake.TakeResult[3]=Take_Success; // 表示第一路摄像头拍照失败 //--------- new process------------- MultiTake.Take_retry=0; //------------------------------------------- if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路 break; break; default: MultiTake_End(); break; } } else if((0==MultiTake.Taking)&&(0==MultiTake.Transfering)) { //------ 判断车门开关拍照是否上传状态 ------ if((OpenDoor_StartTakeFlag==1)&&(Opendoor_transFLAG==0)) { MultiTake_End(); // 车门开关不上传 OpenDoor_StartTakeFlag=0; } else { rt_kprintf("\r\n Single Camera !\r\n"); if(Camera_Take_not_trans==0) Photo_send_start(Camera_Number); //在不是多路拍照的情况下拍完就可以上传了 else Camera_Take_not_trans=0; } } // 拍照结束 } else { //------- change state ------- CameraState.status=transfer; CameraState.OperateFlag=0; // clear TX_485const_Enable=1; // 发送485 命令 _485_RXstatus._485_receiveflag=IDLE_485; //rt_kprintf("\r\n Head info_len : %d\r\n",_485_content_wr); memset(_485_content,0,sizeof(_485_content)); _485_content_wr=0; //rt_kprintf("\r\n One Packet Over!\r\n"); } }