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

📄 dbparser.cpp

📁 AliEditor_Source code
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			bo_cur_data_sec_index = free_sec_idx;
			
			bo_sec_list[bo_head_sec_index].type = BO_TYPE_HEAD;
			bo_sec_list[bo_head_sec_index].status = BO_SS_VALID;
			if(BO_flash_write((UINT8 *)&bo_sec_list[bo_head_sec_index], sizeof(struct BO_Sec_Info), (UINT32)(bo_head_sec_index<<NODE_ADDR_OFFSET_BIT)) != DB_SUCCES)
			{
				//BO_PRINTF("BO_init(): set sector 0  to head failed!\n");
				return DBERR_BO_INIT;
			}
			bo_sec_list[bo_cur_data_sec_index].type = BO_TYPE_DATA;
			bo_sec_list[bo_cur_data_sec_index].status = BO_SS_VALID;
			bo_sec_list[bo_cur_data_sec_index].logic_number = 1;
			if(BO_flash_write((UINT8 *)&bo_sec_list[bo_cur_data_sec_index], sizeof(struct BO_Sec_Info), (UINT32)(bo_cur_data_sec_index<<NODE_ADDR_OFFSET_BIT)) != DB_SUCCES)
			{
				//BO_PRINTF("BO_init(): set sector 1  to data failed!\n");
				return DBERR_BO_INIT;
			}
			
		}
		else if(BO_get_max_logicnum(&bo_cur_data_sec_index) == 0xFFFFFFFF)
		{
			//BO_PRINTF("BO_init(): get current data sec index failed!\n");
			return DBERR_BO_INIT;
		}
#endif
	}

	/*addr init*/
	if(bo_head_free_addr == 0xFFFFFFFF)
	{
		if(BO_get_free_addr_in_sector(bo_head_sec_index, BO_SEARCH_OPERATION,BO_SEARCH_FROM_START, &head_free_addr) != DB_SUCCES)
		{
			//BO_PRINTF("BO_init(): init head free addr failed!\n");
			return DBERR_BO_INIT;
		}
		bo_head_free_addr = head_free_addr;

	}
	if(bo_data_free_addr == 0xFFFFFFFF)
	{
		if(m_nSectorNum == 1)
		{
			if(BO_get_free_addr_in_sector(bo_cur_data_sec_index, BO_SEARCH_DATA,BO_SEARCH_FROM_END, &data_free_addr) != DB_SUCCES)
			{
				//BO_PRINTF("BO_init(): init data free addr failed!\n");
				return DBERR_BO_INIT;
			}
		}
		else
		{
			if(BO_get_free_addr_in_sector(bo_cur_data_sec_index, BO_SEARCH_DATA,BO_SEARCH_FROM_START, &data_free_addr) != DB_SUCCES)
			{
				//BO_PRINTF("BO_init(): init data free addr failed!\n");
				return DBERR_BO_INIT;
			}
		}

		bo_data_free_addr = data_free_addr;
		
	}
	
	return DB_SUCCES;

}

INT32 CDbParser::BO_flash_write(UINT8 *data, UINT32 len, UINT32 addr)
{
//	INT32 ret = 0;
//	INT32 bytes_write = 0;
	
	if(addr+len > g_db_length)
	{
		//BO_PRINTF("BO_flash_write(): invalid addr!\n");	
		return -1;
	}
	memcpy((char *)g_db_base_addr + addr, data, len);

	return 0;
	
	//sto_dev = (struct sto_device *)dev_get_by_id(HLD_DEV_TYPE_STO, 0);
	/*	
	bytes_write = sto_put_data(sto_flash_dev, addr+g_db_base_addr, data, (INT32)len);
	if(bytes_write == (INT32)len)
		return DB_SUCCES;
	else
	{
		BO_PRINTF("BO_flash_write(): sto_write error at addr %x, %d bytes write!\n",addr,bytes_write);
		return DBERR_BO_WRITE;
	}
	*/
}

INT32 CDbParser::BO_read_data(UINT32 addr, UINT32 len, UINT8 *data)
{

	if(addr + len > g_db_length)
	{
		//BO_PRINTF("BO_read_data(): invalid addr!\n");	
		return -1;
	}

	memcpy(data, (char *)g_db_base_addr + addr, len);

	return 0;
	/*
	if(sto_get_data(sto_flash_dev, data, addr+g_db_base_addr, (INT32)len) == (INT32)len)
		return 0;
	else
	{
		BO_PRINTF("BO_read_data(): sto_read error at addr %x\n",addr);
		return -1;
	}
	*/
}

INT32 CDbParser::BO_get_header(UINT32 *head_addr, UINT16 *node_num,UINT32 *free_addr)
{
	UINT32 start_addr= 0;
	UINT32 end_addr = 0;
	UINT32 tmp;
	UINT16 num = 0;
	UINT8 i, flag1;
	UINT32 head_start_flag = BO_HEADER_START;
	UINT32 head_end_flag = BO_HEADER_END;
	UINT32 sec_idx = bo_head_sec_index;

	if(bo_header_addr != 0xFFFFFFFF)
	{
		*head_addr = bo_header_addr;
		BO_read_data(bo_header_addr+4, 2, (UINT8 *)node_num);
		*free_addr = bo_head_free_addr;
		return 0;
	}


	start_addr = (sec_idx <<NODE_ADDR_OFFSET_BIT) + BO_SECTOR_INFO_SIZE;
	end_addr = bo_head_free_addr;

	if(end_addr == start_addr)
	{
		UINT8 empty_head[10];
		memcpy(empty_head, (UINT8 *)&head_start_flag,4);
		memset(&empty_head[4], 0, 2);
		memcpy(&empty_head[6], (UINT8 *)&head_end_flag,4);
		if(BO_flash_write(empty_head, 10, start_addr)!= DB_SUCCES)
			return -1;
		else
		{
			bo_head_free_addr = start_addr + 10;
			*head_addr = start_addr;
			*node_num = 0;
			*free_addr = bo_head_free_addr;
			return DB_SUCCES;
		}

	}

	while(start_addr < end_addr)
	{
		flag1 = 1;
		
		if(BO_read_data(start_addr,4, (UINT8 *)&tmp) != DB_SUCCES)
				return -1;
		for(i = 0;i < 4; i++)			
		{
			if(*((UINT8 *)&tmp + i) != *((UINT8 *)&head_start_flag + i))
			{
				flag1 = 0;
				break;
			}
		}

		if(flag1 == 1)
		{
			if(BO_read_data(start_addr+4, 2, (UINT8 *)&num) != DB_SUCCES)
				return -1;

			if(BO_read_data(start_addr+4+2+num*BO_HEADER_NODE_SIZE, 4, (UINT8 *)&tmp) != DB_SUCCES)
				return -1;

			if(tmp == BO_HEADER_END)
			{
				*head_addr = bo_header_addr = start_addr;
				*node_num = num;
				*free_addr = end_addr;
				return DB_SUCCES;
			}
		
		}
		else 
			start_addr++;
	}

	return -1;
}

UINT8 CDbParser::DO_get_node_type(UINT32 node_id)
{
	if(((node_id&SET_BIT_MASK) != 0) && ((node_id&TP_BIT_MASK) == 0) &&((node_id&PG_BIT_MASK) == 0))
		return TYPE_SAT_NODE;
	if(((node_id&TP_BIT_MASK) != 0) &&((node_id&PG_BIT_MASK) == 0))
		return TYPE_TP_NODE;
	else if(((node_id&TP_BIT_MASK) != 0) &&((node_id&PG_BIT_MASK) != 0))
		return TYPE_PROG_NODE;
	else
		return TYPE_UNKNOWN_NODE;	
}

INT32 CDbParser::DO_t_process_operation(OP_PARAM param, UINT8 *temp_buf)
{
	UINT16 i = 0;
	DB_TABLE *t_attr = (DB_TABLE *)&db_table[0];
	UINT32 node_id = 0;
	UINT8 node_type = TYPE_UNKNOWN_NODE;
	//UINT8 *temp_buf = NULL;//give a block of memory , maybe frame buffer

	/* not compute node length in this function
	INT32 table_node_len = DO_get_table_node_length();
	INT32 del_node_len;
	UINT8 tmp[4];
	UINT32 node_addr = 0;
	UINT8 node_len1, node_len2;
	*/

	memcpy((UINT8 *)&node_id, param.node_id, NODE_ID_SIZE);
	if( node_id == 0 )
		return -1;
	node_type = DO_get_node_type(node_id);
	if(param.valid_flag != OP_VALID_FLAG || node_type == TYPE_UNKNOWN_NODE)
	{
		//DO_PRINTF("DO_t_process_operation():invalid operation or unnknown node type !\n");
		return -1;
	}
	//for add operation
	if(param.op_type == OPERATION_ADD)
	{
		//DO_PRINTF("ADD operation: add node by id %d\n",node_id);
		//if node num to max cnt, rearrange table
		if(t_attr[node_type].node_num >= t_attr[node_type].max_cnt)
			DO_table_rearrange(&t_attr[node_type], temp_buf);
		
		memcpy((UINT8 *)&(t_attr[node_type].table_buf[t_attr[node_type].node_num]), (UINT8 *)&param + 1, BO_HEADER_NODE_SIZE);
		t_attr[node_type].node_num++;
		/* not compute node length here
		MEMCPY((UINT8 *)&node_addr, param.node_addr, NODE_ADDR_SIZE);
		BO_read_data(node_addr,4, tmp);
		table_node_len += (INT32)tmp[NODE_ID_SIZE] + NODE_ID_SIZE;
		*/
	}
	//for edit operation
	else if(param.op_type == OPERATION_EDIT)
	{
		for(i = 0; i < t_attr[node_type].node_num; i++)
		{
			if(0 == memcmp((UINT8 *)&t_attr[node_type].table_buf[i], param.node_id, NODE_ID_SIZE))
				break;
		}
		if(i == t_attr[node_type].node_num)
		{
			//DO_PRINTF("EDIT operation not find node by id %d\n",node_id);
			return -1;	
		}
		/* not compute node length here
		MEMCPY((UINT8 *)&node_addr, t_attr[node_type].table_buf[i].node_addr, NODE_ADDR_SIZE);
		BO_read_data(node_addr, 4, tmp);
		node_len1 = tmp[NODE_ID_SIZE];
		MEMCPY((UINT8 *)&node_addr, param.node_addr, NODE_ADDR_SIZE);							
		BO_read_data(node_addr,4, tmp);
		node_len2 = tmp[NODE_ID_SIZE];		
		table_node_len += (INT32)(node_len2 - node_len1);
		*/
		//DO_PRINTF("EDIT operation: modify node by id %d at pos %d\n",node_id, i);
		memcpy((UINT8 *)&(t_attr[node_type].table_buf[i]), (UINT8 *)&param + 1, BO_HEADER_NODE_SIZE);
		
	}
	//for del operation
	else if(param.op_type == OPERATION_DEL)
	{
		//del a set, first flag its pg id  invalid, then the tp id
		if(node_type == TYPE_SAT_NODE)
		{
			//DO_PRINTF("DEL operation: del a set by id %d\n",node_id);
			//for del operation, the node_addr[3] stores the data length under this node id
			if(param.node_addr[0] != 0 || param.node_addr[1] != 0 || param.node_addr[2] != 0)
			{
				for(i = 0; i < t_attr[TYPE_PROG_NODE].node_num; i++)
				{
					if(param.node_id[NODE_ID_SIZE-1] == t_attr[TYPE_PROG_NODE].table_buf[i].node_id[NODE_ID_SIZE-1]) 
					{	
						t_attr[TYPE_PROG_NODE].table_buf[i].node_id[NODE_ID_SIZE-1] = 0xFF;
						
					}
				}
			
				for(i = 0; i < t_attr[TYPE_TP_NODE].node_num; i++)
				{
					if(param.node_id[NODE_ID_SIZE-1] == t_attr[TYPE_TP_NODE].table_buf[i].node_id[NODE_ID_SIZE-1]) 
					{
						t_attr[TYPE_TP_NODE].table_buf[i].node_id[NODE_ID_SIZE-1] = 0xFF;
						
					}
				}	
			}

		}
		//del a tp, flag its pg id  invalid
		else if(node_type == TYPE_TP_NODE)
		{
			//for del operation, the node_addr[3] stores the data length under this node id
			if(param.node_addr[0] != 0 || param.node_addr[1] != 0 || param.node_addr[2] != 0)
			{
				for(i = 0; i < t_attr[TYPE_PROG_NODE].node_num; i++)
				{
					if((param.node_id[NODE_ID_SIZE-1]==t_attr[TYPE_PROG_NODE].table_buf[i].node_id[NODE_ID_SIZE-1]) &&
						(param.node_id[NODE_ID_SIZE-2]==t_attr[TYPE_PROG_NODE].table_buf[i].node_id[NODE_ID_SIZE-2]))
						{
							t_attr[TYPE_PROG_NODE].table_buf[i].node_id[NODE_ID_SIZE-1] = 0xFF;
						
						}
				}
			}
		}

		for(i = 0; i < t_attr[node_type].node_num; i++)
		{
			if(0 == memcmp((UINT8 *)&t_attr[node_type].table_buf[i], param.node_id, NODE_ID_SIZE))
				break;
		}
		if(i == t_attr[node_type].node_num)
		{
			//DO_PRINTF("DEL operation not find node by id %d\n",node_id);
			return -1;	
		}
		//flag the node itself id invalid
		t_attr[node_type].table_buf[i].node_id[NODE_ID_SIZE-1] = 0xFF;
		/* not compute node length here
		del_node_len = 0;
		MEMCPY((UINT8 *)&del_node_len, t_attr[node_type].table_buf[i].node_addr, NODE_ADDR_SIZE);
		table_node_len -= del_node_len ;
		*/			
	}
	
	return DB_SUCCES;
}

INT32 CDbParser::DO_table_rearrange(DB_TABLE *t, UINT8 *buf)
{
	UINT16 i;
	UINT16 node_num = 0;

	//DO_PRINTF("DO_table_rearrange():before rearrange node num = %d!\n", t->node_num);
	
	for(i = 0; i < t->node_num; i++)
	{
		if(t->table_buf[i].node_id[NODE_ID_SIZE-1] != 0xFF)
		{
			memcpy(buf+node_num*sizeof(NODE_IDX_PARAM), (UINT8 *)&t->table_buf[i],  sizeof(NODE_IDX_PARAM));
			node_num++;
		}

	}
	//DO_PRINTF("after table rearrange ,valid node num = %d!\n", node_num);
	memcpy((UINT8 *)t->table_buf, buf, node_num*sizeof(NODE_IDX_PARAM));
	t->node_num = node_num;

	return DB_SUCCES;

}

INT32 CDbParser::DB_reclaim_write_header()
{
	UINT32 tmp;
	UINT16 node_num = 0;
	UINT16 i;
	DB_TABLE *table = (DB_TABLE *)&db_table[0];
	UINT8 head_sec, tmp_sec;
	INT32 ret = DB_SUCCES;
	UINT32 addr = 0;
	UINT32 old_head_addr, old_free_addr;
	UINT16 old_node_num;
	
	for(i = 0; i < DB_TABLE_NUM; i++)
	{
		node_num += table[i].node_num;

	}
	BO_get_header(&old_head_addr,&old_node_num,&old_free_addr);
	head_sec = BO_get_header_sec();
	tmp_sec = (UINT8)((old_free_addr + node_num * BO_HEADER_NODE_SIZE+ 10)>>NODE_ADDR_OFFSET_BIT);
	if(tmp_sec != head_sec)
	{
		ret = DB_reclaim_operation();
		if(ret != DB_SUCCES)
		{
			//RECLAIM_PRINTF("DB_reclaim_write_header() failed!\n");
			return DBERR_RECLAIM;
		}
		return ret;
	
	}
	else
	{
		//BO_get_header(&old_head_addr,&old_node_num,&old_free_addr);
		addr = old_free_addr;
		BO_set_header_addr(addr);
		tmp = BO_HEADER_START;
		BO_flash_write((UINT8 *)&tmp, 4, addr);
		addr += 4;
		BO_flash_write((UINT8 *)&node_num, 2, addr);
		addr += 2;
		for(i = 0; i < DB_TABLE_NUM; i++)
		{
			BO_flash_write((UINT8 *)table[i].table_buf,  table[i].node_num*sizeof(NODE_IDX_PARAM), addr);
			addr += table[i].node_num*sizeof(NODE_IDX_PARAM);
		}
		tmp = BO_HEADER_END;
		BO_flash_write((UINT8 *)&tmp, 4, addr);
		BO_set_head_freeaddr(addr + 4);

		tmp = 0;
		BO_flash_write((UINT8 *)&tmp, 4, old_head_addr);
		BO_flash_write((UINT8 *)&tmp, 4, old_head_addr+old_node_num*BO_HEADER_NODE_SIZE+6);

		return DB_SUCCES;
	}
}

UINT8 CDbParser::BO_get_header_sec()
{
	return bo_head_sec_index;
}

INT32 CDbParser::DB_reclaim_operation()
{
	struct BO_Sec_Info sec_info;
	UINT8 header_sec, reclaim_sec;
	INT32 ret = DB_SUCCES;
	UINT32 addr;
	UINT32 tmp;
	UINT16 node_num = 0;
	UINT16 i;
	DB_TABLE *table = (DB_TABLE *)&db_table[0];
	

	//get header sector, change its status
	/*
	header_sec = BO_get_header_sec();
	if(header_sec == 0xFF)
	{
		RECLAIM_PRINTF("DB_reclaim_operation(): header sector index invalid!\n");
		return DBERR_RECLAIM;
	}
	*/
	//RECLAIM_PRINTF("DB_reclaim_operation()!\n");
	
	header_sec = BO_get_header_sec();
	BO_read_sec_info(header_sec, &sec_info);
	sec_info.status = BO_SS_SELECT;
	BO_set_sec_list(header_sec, sec_info);
	ret = BO_write_sec_info(header_sec, &sec_info);
	if(ret != DB_SUCCES)
	{
		//RECLAIM_PRINTF("write header sector %d info to SELECT failed!\n",header_sec);
		return -1;
	}

	//find reclaim sector, change its type,status
	if(DBERR_BO_THRESHOLD == BO_get_free_sector(&reclaim_sec))
		reclaim_sec = BO_get_reserve_sec();
	BO_read_sec_info(reclaim_sec, &sec_info);
	sec_info.type = BO_TYPE_HEAD;
	sec_info.status = BO_SS_COPYING;
	BO_set_sec_list(reclaim_sec, sec_info);
	ret = BO_write_sec_info(reclaim_sec, &sec_info);
	if(ret != DB_SUCCES)
	{
		//RECLAIM_PRINTF("write reclaim sector %d info to COPYING failed!\n",reclaim_sec);
		return DBERR_RECLAIM;
	}

	//write table header into flash
	//RECLAIM_PRINTF("begin to write all table header to flash!\n");
	tmp = reclaim_sec;
	addr = (tmp<<NODE_ADDR_OFFSET_BIT) + BO_SECTOR_INFO_SIZE;

	BO_set_header_addr(addr);
	tmp = BO_HEADER_START;
	BO_flash_write((UINT8 *)&tmp, 4, addr);
	addr += 4;
	for(i = 0; i < DB_TABLE_NUM; i++)
	{
		node_num += table[i].node_num;
	}
	BO_flash_write((UINT8 *)&node_num, 2, addr);
	addr += 2;
	
	for(i = 0; i < DB_TABLE_NUM; i++)
	{
		BO_flash_write((UINT8 *)table[i].table_buf,  table[i].node_num*sizeof(NODE_IDX_PARAM), addr);
		addr += table[i].node_num*sizeof(NODE_IDX_PARAM);
	}
	tmp = BO_HEADER_END;
	BO_flash_write((UINT8 *)&tmp, 4, addr);

	//change reclaim sector status VALID
	BO_read_sec_info(reclaim_sec, &sec_info);
	sec_info.status = BO_SS_VALID;
	BO_set_sec_list(reclaim_sec, sec_info);
	BO_write_sec_info(reclaim_sec, &sec_info);
	BO_set_header_sec(reclaim_sec);

⌨️ 快捷键说明

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