void ASCHandler::chunking(std::vector<std::string> path) { total_file_num = path.size(); // SysOperation::remove_file("/tmp/asc_handler"); get_seg_size(Chunker::min_chunk_size, Chunker::avg_chunk_size, Chunker::max_chunk_size); Chunker::keep_buf = 1; //classify path_vec.clear(); for(int i = 0; i < path.size(); i++) { std::string m_type = SysOperation::get_type(path[i]); int m_size = SysOperation::get_size(path[i]); if(m_size) { total_origin_size += m_size; max_type_len = Util::max(max_type_len, m_type.size()); origin_size.insert(std::make_pair(m_type, 0)).first->second += m_size; if(path_vec.find(m_type) == path_vec.end()) { std::vector<std::string> vec; path_vec.insert(make_pair(m_type, vec)); seg_exp_size.insert(std::make_pair(m_type, Chunker::avg_chunk_size)); } path_vec[m_type].push_back(path[i]); } } //find exp size int done = 0; for(std::map<std::string, std::vector<std::string> >::iterator it = path_vec.begin(); it != path_vec.end(); ++it) { m_der_rate.insert(make_pair(it->first, 1.0)); bool div_two = false; while((Chunker::avg_chunk_size = seg_exp_size[it->first]) >= 512) { //init std::string path = "/tmp/asc_handler_" + it->first; SysOperation::remove_file(path); type.insert(std::make_pair(it->first, 0)).first->second = 0; //chunk for(int i = 0; i < it->second.size(); i++) { chunk_file(it->second[i]); } //update double der_rate = get_der_rate(it->first); // std::cout << it->first << "\t" << Chunker::avg_chunk_size << "\t" << der_rate << std::endl; if(der_rate > m_der_rate[it->first]) { m_der_rate[it->first] = der_rate; seg_exp_size[it->first] /= 2; div_two = true; } else break; } if(div_two) { seg_exp_size[it->first] *= 2; Chunker::avg_chunk_size = seg_exp_size[it->first]; std::string path = "/tmp/asc_handler_" + it->first; SysOperation::remove_file(path); type[it->first] = 0; //chunk for(int i = 0; i < it->second.size(); i++) { chunk_file(it->second[i]); } } total_seg_num += type[it->first]; done += it->second.size(); // std::cout << done << std::endl; loadbar(done, path.size()); // std::cout << "end" << std::endl; // std::cout << Util::currentTimeinString() << // ", Type: " << it->first << // ", exp size: " << seg_exp_size[it->first] << // ", ASC Der Rate: " << m_der_rate[it->first] << std::endl; } std::cout << std::endl; }
//============================================================================= // call_user_start //----------------------------------------------------------------------------- void call_user_start(void) { struct SPIFlashHead sfh; // заголовок flash struct StoreWifiHdr wifihdr; // заголовок из последнего сектора flash с индексом на сохранение последней конфигурации WiFi struct BootConfig bootcfg; // начало блока сохранения последней конфигурации WiFi, часть с boot параметрами ets_printf("\n2nd boot version : 1.2\n"); SPIRead(0, &sfh, sizeof(sfh)); ets_printf(" SPI Speed : "); switch (sfh.hsz.spi_freg) { case SPEED_40MHZ: ets_printf("40MHz\n"); break; case SPEED_26MHZ: ets_printf("26.7MHz\n"); break; case SPEED_20MHZ: ets_printf("20MHz\n"); break; case SPEED_80MHZ: ets_printf("80MHz\n"); break; } ets_printf(" SPI Mode : "); switch (sfh.spi_interface) { case MODE_QIO: ets_printf("QIO\n"); break; case MODE_QOUT: ets_printf("QOUT\n"); break; case MODE_DIO: ets_printf("DIO\n"); break; case MODE_DOUT: ets_printf("DOUT\n"); break; } ets_printf(" SPI Flash Size : "); uint32 sector; switch (sfh.hsz.flash_size) { case SIZE_4MBIT: ets_printf("4Mbit\n"); sector = 128-4; break; case SIZE_2MBIT: ets_printf("2Mbit\n"); sector = 64-4; break; case SIZE_8MBIT: ets_printf("8Mbit\n"); sector = 256-4; break; case SIZE_16MBIT: ets_printf("16Mbit\n"); sector = 512-4; break; case SIZE_32MBIT: ets_printf("32Mbit\n"); sector = 1024-4; break; default: ets_printf("4Mbit\n"); sector = 128-4; break; } uint32 addr = sector * FSECTOR_SIZE; SPIRead(addr + 3 * FSECTOR_SIZE, &wifihdr.bank, sizeof(wifihdr)); if(wifihdr.bank == 0) { SPIRead(addr + FSECTOR_SIZE, &bootcfg, sizeof(bootcfg)); } else { SPIRead(addr + 2 * FSECTOR_SIZE, &bootcfg, sizeof(bootcfg)); } if(bootcfg.boot_version == 0xff) { bootcfg.boot_number = 0; } if(bootcfg.boot_version != 2) { bootcfg.boot_version = 2; if(wifihdr.bank == 0) wifihdr.bank = 1; else wifihdr.bank = 0; SPIEraseSector(sector+wifihdr.bank+1); SPIWrite((sector+wifihdr.bank+1) * FSECTOR_SIZE, &bootcfg, sizeof(bootcfg)); SPIEraseSector(sector+3); SPIWrite(addr + 3 * FSECTOR_SIZE, &wifihdr.bank, sizeof(wifihdr)); } ets_memcpy((void *)0x4010800, &code_blk, size_code_blk); // загрузчик не прикреплен! ets_printf("jump to run user"); switch(bootcfg.boot_number & 0x0f) { case 0: ets_printf("1\n\n"); uint32 seg_size = get_seg_size(FSECTOR_SIZE); if(seg_size == 0xffffffff) return; if(seg_size == 0) { 0x4010800C(FSECTOR_SIZE); } else { 0x4010800C(seg_size + 0x1010); } break; case 1: ets_printf("2\n\n"); if(sector == 512 - 4 || sector == 1024 - 4) sector = 256 - 4; get_seg_size(((sector + 4)>>1)*FSECTOR_SIZE + FSECTOR_SIZE); if(seg_size == 0xffffffff) return; if(seg_size == 0) { 0x4010800C(FSECTOR_SIZE); } else { 0x4010800C(seg_size + 0x1010); } break; default: ets_printf("error user bin flag, flag = %x\n", bootcfg.boot_number & 0x0f); } }