⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbparser.cpp

📁 AliEditor_Source code
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	BO_set_head_freeaddr(addr + 4);


	//change old head sector status ERASING
	BO_read_sec_info(header_sec, &sec_info);
	sec_info.status = BO_SS_ERASING;
	BO_set_sec_list(header_sec, sec_info);
	BO_write_sec_info(header_sec, &sec_info);

	//erase old header sector
	if(DB_SUCCES != BO_erase_sector(header_sec))
		return DBERR_RECLAIM;
	return DB_SUCCES;	
}
INT32 CDbParser::BO_read_sec_info(UINT8 sec_idx, struct BO_Sec_Info *sec_info)
{
	UINT32 sector_index = sec_idx;
	
	if(sec_idx == 0xFF)
		return -1;
	return BO_read_data((sector_index<<NODE_ADDR_OFFSET_BIT), sizeof(struct BO_Sec_Info), (UINT8 *)sec_info);
}
void CDbParser::BO_set_sec_list(UINT8 sec_idx, struct BO_Sec_Info sec_info)
{
	memcpy(&bo_sec_list[sec_idx], &sec_info, sizeof(struct BO_Sec_Info));
}
INT32 CDbParser::BO_write_sec_info(UINT8 sec_idx, struct BO_Sec_Info *sec_info)
{
	UINT32 sector_index = sec_idx;
	
	if(sec_idx == 0xFF)
		return -1;
	return BO_flash_write((UINT8 *)sec_info, sizeof(struct BO_Sec_Info), (sector_index<<NODE_ADDR_OFFSET_BIT));

}
INT32 CDbParser::BO_get_free_sector(UINT8 *sec_index)
{
	UINT8 sec_num = bo_free_sec_list[0];
	UINT8 i = 1;
	
	if(sec_num > BO_RECLAIM_THRESHOLD)
	{
		*sec_index = bo_free_sec_list[1];
		for(; i < sec_num; i++)
			bo_free_sec_list[i] = bo_free_sec_list[i+1];
		
		bo_free_sec_list[0] -= 1;
		return DB_SUCCES;
	}
	else 
		return DBERR_BO_THRESHOLD;

}
UINT8 CDbParser::BO_get_reserve_sec()
{
	UINT8 sec_idx, i;
	
	//if(bo_free_sec_list[0] == BO_RECLAIM_THRESHOLD)
	if(bo_free_sec_list[0] > 0)
	{
		sec_idx = bo_free_sec_list[1];
		for(i = 1; i < bo_free_sec_list[0]; i++)
			bo_free_sec_list[i] = bo_free_sec_list[i+1];
		
		bo_free_sec_list[0] -= 1;		
		return sec_idx;
	}
	else
	{
		ASSERT(0);

		return -1;
	}
}
INT32 CDbParser::BO_set_header_addr(UINT32 addr)
{
	if(addr != 0xFFFFFFFF)
	{
		bo_header_addr = addr;
		return DB_SUCCES;
	}
	else
		return DBERR_PARAM;
}

INT32 CDbParser::BO_set_head_freeaddr(UINT32 addr)
{
	if(addr != 0xFFFFFFFF)
	{
		bo_head_free_addr = addr;
		return DB_SUCCES;
	}
	else
		return DBERR_PARAM;
}

INT32 CDbParser::BO_set_header_sec(UINT8 sec_idx)
{
	if(sec_idx != 0xFF)
	{
		bo_head_sec_index = sec_idx;
		return DB_SUCCES;
	}
	else
		return DBERR_PARAM;
}
INT32 CDbParser::BO_erase_sector(UINT8 sec_index)
{
	//struct sto_device * sto_dev = NULL;
	struct BO_Sec_Info *sec_info = &bo_sec_list[sec_index];
	UINT32 sector_idx = sec_index;
	UINT32 sector_size = DB_SECTOR_SIZE;
	
	UINT32 param = (sector_idx <<NODE_ADDR_OFFSET_BIT) + g_db_base_addr;

	//param = (param << 10) + (sector_size >> 10);

	//sto_dev = (struct sto_device *)dev_get_by_id(HLD_DEV_TYPE_STO, 0);

	/*change the sector status to BO_SS_ERASING*/
	//sec_info->status = BO_SS_ERASING;
	//if(BO_flash_write((UINT8 *)sec_info, sizeof(struct BO_Sec_Info), (UINT32)(sec_index<<NODE_ADDR_OFFSET_BIT)) != DB_SUCCES)
	//{
	//	BO_PRINTF("BO_erase_sector(): change sector %d status to erasing failed!\n",sec_index);
	//	return DBERR_BO_ERASE;
	//}

	/*begin to erase*/
/*
	if(sto_io_control(sto_flash_dev, STO_DRIVER_SECTOR_ERASE, param) != SUCCESS)
	{
		BO_PRINTF("BO_erase_sector(): Erase flash sector %d failed!\n",sec_index);
		return DBERR_BO_ERASE;
	}
*/
	memset((void *)param, 0xff, sector_size);
	
	/*after erasing, change sector status and erase_count, set valid flag*/
	UINT32 erase_cnt = sec_info->erase_count;

	memset((UINT8 *)sec_info,0xFF,sizeof(struct BO_Sec_Info));
	sec_info->status = BO_SS_SPARE;
	sec_info->erase_count = erase_cnt+1;
	sec_info->valid_flag = BO_VALID_FLAG;
	if(BO_flash_write((UINT8 *)sec_info, sizeof(struct BO_Sec_Info), (UINT32)(sec_index<<NODE_ADDR_OFFSET_BIT)) != DB_SUCCES)
	{
		//BO_PRINTF("BO_erase_sector(): change sector %d status to spare failed!\n",sec_index);
		return DBERR_BO_ERASE;
	}

#if defined(DB_MULTI_SECTOR)
	/*add the erased sector into free list*/
	if(BO_add_to_free_list(sec_index) != DB_SUCCES)
	{
		//BO_PRINTF("BO_erase_sector(): add sector %d into free list failed!\n",sec_index);
		return DBERR_BO_ERASE;
	}
#endif
	return DB_SUCCES;
}
INT32 CDbParser::DO_set_table_node_length(INT32 len)
{
	db_table_node_length = len;
	return DB_SUCCES;
}
INT32 CDbParser::BO_get_free_addr_in_sector(UINT8 sec_index, UINT8 search_type,UINT8 mode, UINT32 *free_addr)
{
	UINT32 start_addr= 0;
	UINT32 end_addr= 0;
	UINT32 tmp;
	UINT32 sector_idx = sec_index;
	UINT32 tmp_free;
	UINT8 tmp2[4];
	UINT8 i;

	if(mode == BO_SEARCH_FROM_START)
	{
		start_addr = (sector_idx <<NODE_ADDR_OFFSET_BIT) + BO_SECTOR_INFO_SIZE;
		end_addr = ((sector_idx + 1) <<NODE_ADDR_OFFSET_BIT) -4;
	}
	else if(mode == BO_SEARCH_FROM_END)
	{
		start_addr = ((sector_idx + 1) <<NODE_ADDR_OFFSET_BIT) -4;
		end_addr = (sector_idx <<NODE_ADDR_OFFSET_BIT) + BO_SECTOR_INFO_SIZE;
	}

	if(mode == BO_SEARCH_FROM_START)
	{
		while(start_addr < end_addr)
		{
			if(BO_read_data(start_addr,4, (UINT8 *)&tmp) != DB_SUCCES)
				return DBERR_BO_READ;
			
			if(tmp == 0xFFFFFFFF)
			{
				tmp_free = start_addr;
				//check if tmp_free is at sector info end
				if((search_type == BO_SEARCH_OPERATION) &&
					(tmp_free-4 >= ((sector_idx<<NODE_ADDR_OFFSET_BIT)+BO_SECTOR_INFO_SIZE)))
				{
					//check if the 3 bytes before is 0xFF
					BO_read_data(tmp_free-4,4, tmp2);
					for(i = 0; i < 4; i++)
					{
						if(tmp2[3-i] != 0xFF)
						{
							*free_addr = tmp_free - i;
							return DB_SUCCES;
						}
					}
				}
				*free_addr = tmp_free;
				return DB_SUCCES;
			}
			else
				start_addr += 4;
		}
		*free_addr = end_addr;
		return DB_SUCCES;
	}
	else if(mode == BO_SEARCH_FROM_END)
	{
		while(start_addr > end_addr)
		{
			if(BO_read_data(start_addr,4, (UINT8 *)&tmp) != DB_SUCCES)
				return DBERR_BO_READ;
			
			if(tmp == 0xFFFFFFFF)
			{
				tmp_free = start_addr + 4;
				/*
				//check if the 3 bytes next is 0xFF
				BO_read_data(tmp_free,4, tmp2);
				for(i = 0; i < 4; i++)
				{
					if(tmp2[i] != 0xFF)
					{
						*free_addr = tmp_free + i;
						return DB_SUCCES;
					}
				}
				*/
				*free_addr = tmp_free;
				return DB_SUCCES;
			}
			else
				start_addr -= 4;
		}
		*free_addr = end_addr;
		return DB_SUCCES;
	}
	return DB_SUCCES;
}

INT32 CDbParser::BO_add_to_free_list(UINT8 sec_index)
{
	UINT8 sec_num = bo_free_sec_list[0];

	if(sec_index >= m_nSectorNum)
	{
		//BO_PRINTF("BO_add_to_free_list(): invalid param!\n");
		return DBERR_PARAM;
	}

	bo_free_sec_list[sec_num+1] = sec_index;
	bo_free_sec_list[0] += 1;
	return DB_SUCCES;

}

INT32 CDbParser::BO_sector_diagnose( UINT8 sec_idx, struct BO_Sec_Info *sec_info)
{
	UINT32 i, addr, tmp;
	INT32 ret = DB_SUCCES;
	UINT32 sector_idx = sec_idx;
	UINT8 sector_err = 0;
	
	if(((sec_info->status == BO_SS_VALID) || (sec_info->status == BO_SS_SPARE)) && (sec_info->valid_flag == BO_VALID_FLAG))
	{
		return DB_SUCCES;
	}
	//be selected as reclaim source sector, then maybe power loss
	else if((sec_info->status == BO_SS_SELECT)&& (sec_info->valid_flag == BO_VALID_FLAG))
	{
		//BO_PRINTF("BO_sector_diagnose():power loss after change sector %d status to select, now change its status back to valid!\n ",sector_idx);
		return DB_SUCCES;
	}
	//as reclaim dest sector, during data copying, maybe power loss
	else if((sec_info->status == BO_SS_COPYING) && (sec_info->valid_flag == BO_VALID_FLAG))
	{
		//BO_PRINTF("BO_sector_diagnose(): power loss during copy data to sector %d, now erase it!\n",sector_idx);
		ret = BO_erase_sector(sector_idx);
	}
	else if(sec_info->type == BO_TYPE_UNKNOWN &&sec_info->status == BO_SS_UNKNOWN
					&& sec_info->logic_number == 0xFFFFFFFF 
					&& sec_info->erase_count == 0xFFFFFFFF
					&& sec_info->valid_flag == 0xFF)
	{	//check last 16 bytes of the sector 
		addr = ((sector_idx+1)<<NODE_ADDR_OFFSET_BIT)-16;
		for(i = 0; i < 16; i += 4)
		{	
			BO_read_data(addr+i, 4, (UINT8 *)&tmp);
			if(tmp != 0xFFFFFFFF)
			{	
				sector_err = 1;
				break;
			}
		}
		//power loss during erasing
		if(sector_err == 1)
		{
			//BO_PRINTF("BO_sector_diagnose():power loss during erase sector %d, now erase it!\n ",sector_idx);
			ret = BO_erase_sector(sector_idx);
		}
		//first init after buring flash
		else
		{
			sec_info->status = BO_SS_SPARE;
			sec_info->erase_count = 0;
			sec_info->valid_flag = BO_VALID_FLAG;
			ret = BO_flash_write((UINT8 *)sec_info, sizeof(struct BO_Sec_Info), sector_idx<<NODE_ADDR_OFFSET_BIT);
		}
	}
	//other errors
	else
	{
		//BO_PRINTF("BO_sector_diagnose(): unknown error in sector %d, now erase it!\n",sector_idx);
		ret = BO_erase_sector(sector_idx);
	}
	return ret;
}

UINT32 CDbParser::BO_get_max_logicnum(UINT8 *sec_index)
{
	UINT32 max_logic_num = 0;
	UINT8 i = 0;
			
	for(;i < m_nSectorNum; i++)
	{
		if((bo_sec_list[i].type == BO_TYPE_DATA) && (bo_sec_list[i].status == BO_SS_VALID ||bo_sec_list[i].status == BO_SS_SELECT)
			&& (bo_sec_list[i].logic_number > max_logic_num))				
			max_logic_num = bo_sec_list[i].logic_number;
	}
	if(max_logic_num > 0)
	{
		for(i = 0;i < m_nSectorNum; i++)
		{
			if(max_logic_num == bo_sec_list[i].logic_number)
			break;
		}
		*sec_index = i ;
		return max_logic_num;

	}
	else
	{
		*sec_index = 0xFF;
		return 0xFFFFFFFF;
	}

}

INT32 CDbParser::BO_reset( )
{
	bo_header_addr = 0xFFFFFFFF;
	bo_head_free_addr = 0xFFFFFFFF;
	bo_data_free_addr = 0xFFFFFFFF;
	m_nSectorNum = 0;

	if(bo_sec_list != NULL)
	{	
		free(bo_sec_list);
		bo_sec_list = NULL;
	}
	
#if defined(DB_MULTI_SECTOR)
	bo_cur_data_sec_index = 0xFF;
	bo_head_sec_index = 0xFF;
#endif

	return DB_SUCCES;

}

int CDbParser::_create_empty_header(db_header_t *pdbhead)
{
	memcpy(&pdbhead->head_prefix, T_HEADER_ID_PREFIX, 4);
	pdbhead->head_prefix[4] = 0;

	pdbhead->version = 0;

	pdbhead->field_num = 0;

	if(pdbhead->pfield) delete[] pdbhead->pfield;
	pdbhead->pfield = NULL;

//	pdbhead->rec_num = 0;
	pdbhead->rec_length = 0;

	if(pdbhead->precord) delete[] pdbhead->precord;
	pdbhead->precord = NULL;

	pdbhead->end_flag = T_WRITE_END_FLAG;
	
	return 0;
}
int CDbParser::InitDb3Header()//init_parser()
{
	free_all_db3_headers();
	
//	g_table_base_addr = 0;
//	g_table_info_len = 0;

	memset(&m_tpheader, 0, sizeof(m_tpheader));
	memset(&m_satheader, 0, sizeof(m_satheader));
	memset(&m_progheader, 0, sizeof(m_progheader));

	return 0;
}
int CDbParser::free_all_db3_headers()//free_all_headers()
{
	free_db3_header(&m_progheader);
	free_db3_header(&m_satheader);
	free_db3_header(&m_tpheader);
	
	return 0;
}
int CDbParser::free_db3_header(db_header_t *pdbhead)//free_header(db_header_t *pdbhead)
{
	if(pdbhead->pfield) delete[] pdbhead->pfield;

	if(pdbhead->precord) delete[] pdbhead->precord;
	
	return 0;
}
int	CDbParser::db4_to_db3_header()
{
	int ret;

	ret = _db4_2_db3_header(&db_table[TYPE_SAT_NODE], &m_satheader);

	ASSERT(ret != -1);
	if(ret == -1) return -1;
	ret = _db4_2_db3_header(&db_table[TYPE_TP_NODE], &m_tpheader);

	ASSERT(ret != -1);
	if(ret == -1) return -1;

	ret = _db4_2_db3_header(&db_table[TYPE_PROG_NODE], &m_progheader);

	ASSERT(ret != -1);
	if(ret == -1) return -1;

	return 0;
}
int CDbParser::_db4_2_db3_header(DB_TABLE *pdb_table,db_header_t *pdbhead)
{
	int i;
	if(!pdb_table || !pdbhead) return -1;

	//pdbhead->rec_length = pdbhead->rec_num = pdb_table->node_num;
	pdbhead->rec_length = pdb_table->node_num;
	if(!pdbhead->rec_length) return 0;

	if(pdbhead->precord) delete []pdbhead->precord;
	pdbhead->precord = new UINT32[pdb_table->node_num];

	memset(pdbhead->precord, -1, sizeof(UINT32) * pdb_table->node_num);

	for(i = 0; i < pdb_table->node_num; i++)
	{
		pdbhead->precord[i] = 0;
		
		memcpy(&pdbhead->precord[i], pdb_table->table_buf[i].node_addr, sizeof(pdb_table->table_buf->node_addr));
	}

	return 0;
}
BOOL CDbParser::DB4_to_DB3_transfer()
{
	CStringLines *pScripter = &((CMainFrame*)AfxGetMainWnd())->GetEditorView()->m_strlines;
	int bRet;
	
	int i;//, tmp_addr;
	int prog_node_size, tp_node_size, sat_node_size;
	
	char *pdatabuf = m_pdatabuf;
	if(!pdatabuf) return FALSE;

	tp_node_size = pScripter->GetNodeSize(TP_NODE);
	sat_node_size = pScripter->GetNodeSize(SAT_NODE);
	prog_node_size = pScripter->GetNodeSize(PROG_NODE);

	if(!tp_node_size || !sat_node_size || !prog_node_size) return FALSE;

	char *backup_buf = new char[DATA_LIMIT_LEN];
	if(!backup_buf) return FALSE;
	
	memset(backup_buf, -1, DATA_LIMIT_LEN);

	db_header_t *pdbheader  = &m_satheader;//for sat node

	int free_addr = 0;

	//skip -1
	for(i = 0; i < pdbheader->rec_length; i++)
	{
		if(pdbheader->precord[i] == -1) continue;

		bRet = UnpackNode(SAT_NODE, backup_buf + free_addr, pdatabuf + pdbheader->precord[i]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -