예제 #1
0
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;
}
예제 #2
0
//=============================================================================
// 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);
	}
}