// проверка проекта с чтением из flash static BOOL validProjectALL(const BOOL flFlash) { BYTE CountFlash = 0; // check error load flash memset(&PROJ,0,sizeof(PROJ)); // чистим структуру проекта memset(&crc_idp,0,sizeof(crc_idp)); if(flFlash)CountFlash = 1; // read project flash_rd(FLASH_PROGRAM,sizeof(TPROJECT)*CountFlash,(unsigned char*)&PROJ[CUR_DK], sizeof(PROJ[CUR_DK])); // calcul crc32 const unsigned long crc=crc32_calc((unsigned char*)&PROJ[CUR_DK],sizeof(PROJ[CUR_DK])-sizeof(PROJ[CUR_DK].CRC32)); // read CRC32 programms unsigned long crc_progs; flash_rd(FLASH_PROGS,sizeof(TPROGRAMS)*(CUR_DK+1)-sizeof(crc_progs),(unsigned char*)&crc_progs,sizeof(crc_progs)); // check project if(PROJ[CUR_DK].ProjectSize == sizeof(PROJ[CUR_DK])){ if(crc==PROJ[CUR_DK].CRC32){ if(crc_progs==PROJ[CUR_DK].CRC32_programs){ // сохранить параметры IDP crc_idp.crc = PROJ[CUR_DK].IDP_CRC32; return true; } } } return false; }
//------------------------------------------------------------------------------ // fin_try==0 - последняя поппытка, можно и записать в журнал ерроры BOOL ligh_load_init(int fin_try) { // memset(&DK[CUR_DK],0,sizeof(DK[CUR_DK])); // clear crc memset(&crc_idp,0,sizeof(crc_idp)); // FLASH_PROGS flash_rd(FLASH_PROGRAM, sizeof(TPROJECT)*CUR_DK, (unsigned char*)&PROJ[CUR_DK], sizeof(PROJ[CUR_DK])); unsigned long crc=crc32_calc((unsigned char*)&PROJ[CUR_DK] , sizeof(PROJ[CUR_DK]) - sizeof(PROJ[CUR_DK].CRC32)); // unsigned long crc_progs; flash_rd(FLASH_PROGS, sizeof(TPROGRAMS)*(CUR_DK+1)-sizeof(crc_progs) , (unsigned char*)&crc_progs, sizeof(crc_progs)); // crc_idp.crc = crc_progs;// сохраним для передачи по UDP //i_size = sizeof(PROJ[CUR_DK]); if (PROJ[CUR_DK].ProjectSize ==sizeof(PROJ[CUR_DK])) { if ( crc == PROJ[CUR_DK].CRC32) { // if (crc_progs==PROJ[CUR_DK].CRC32_programs) { Init_DK(); DK[CUR_DK].proj_valid=true; DK[CUR_DK].work = true; DK[CUR_DK].progs_valid = true; return true; } else { dbg_printf("FAULT. CRC32 of progs invalid"); if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. программы (CRC)"); } } else { dbg_printf("FAULT. PROJ.CRC32"); if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. проект (CRC)."); } } else { if (CUR_DK==0) if (!fin_try) Event_Push_Str("Некорр. проект (размер)."); // dbg_printf("FAULT. PROJ.ProjectSize ==sizeof(PROJ)"); } return false; }