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

📄 data_flash.c

📁 bf533平台图像采集程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	return ret;
}


//sent:		if has been sent out through gprs
int df_write_jpeg(jpeg_pack_t* jpeg_pack)
{
	jpeg_storage_t* jpeg = km29_ctrl->jpeg + km29_ctrl->jpeg_cur_index; 
	int last_block;
	
	jpeg->channel		= -1;
	jpeg->sent			= jpeg_pack->sent;	
	jpeg->size			= jpeg_pack->info.size;
	jpeg->pic_big		= jpeg_pack->info.pic_big;	
	jpeg->quality		= jpeg_pack->info.quality;
	jpeg->itime			= calc_itime(jpeg_pack->info.time);
	jpeg->start_block	= km29_ctrl->jpeg_cur_block;
	
	last_block = program_blocks(jpeg_pack->data, jpeg->size, km29_ctrl->jpeg_cur_block, 
		BLOCK_JPEG_START, BLOCK_JPEG_END);
	
	if(last_block < 0)
		return -1;

	jpeg->channel		= jpeg_pack->info.channel;
	jpeg->end_block		= last_block;
	
	//below reuse jpeg pointer
	while(1)	
	{
		jpeg_storage_t* j;
		j = km29_ctrl->jpeg + km29_ctrl->jpeg_start_index;
		
		if(km29_ctrl->jpeg_start_index == km29_ctrl->jpeg_cur_index)
			break;
		else			
		{
			int a0 = km29_ctrl->jpeg_cur_block, a1 = last_block;
			int b0 = j->start_block, b1 = j->end_block;
			int overlap = 0, tmp;
			int a[20], b[20], ac, bc, m, n;


			ac = 0;						
			while(a0 != a1)
			{
				a[ac++] = a0++;
				if(a0 >= BLOCK_JPEG_END) a0 = BLOCK_JPEG_START;
			}
			a[ac++] = a0++;
			
			bc = 0;						
			while(b0 != b1)
			{
				b[bc++] = b0++;
				if(b0 >= BLOCK_JPEG_END) b0 = BLOCK_JPEG_START;
			}
			b[bc++] = b0++;
			
			for(m = 0; m < ac; m++)
				for(n = 0; n < bc; n++)	
					if(a[m] == b[n]) overlap = 1;
			
			if(overlap)
			{
				j->channel = -1; //over write it
				km29_ctrl->jpeg_start_index++;
				km29_ctrl->jpeg_start_index %= MAX_JPEG;
			}
			else
				break;
		}
	}

	last_block++;
	if(last_block >= BLOCK_JPEG_END)
		last_block = BLOCK_JPEG_START;
		
	km29_ctrl->jpeg_cur_block = last_block;
	
	km29_ctrl->jpeg_cur_index++;
	km29_ctrl->jpeg_cur_index %= MAX_JPEG;
		
	km29_ctrl_updated = 1;
			
	return 0;
}

int next_block(int cur_block)
{
	while(1)
	{
		km29_ctrl->electricity_cur_block += 1;
		
		if(km29_ctrl->electricity_cur_block >= BLOCK_ELECTRICITY_END)
			km29_ctrl->electricity_cur_block = BLOCK_ELECTRICITY_START;
			
		if(km29_ctrl->electricity_cur_block == cur_block)
			return -1;
			
		if(km29_ctrl->block_invalid[km29_ctrl->electricity_cur_block] == 0)
			break;
	}
	
	km29_ctrl_updated = 1;
	return 0;	
}

int df_write_electricity(electricity_pack_t* electricity_pack)
{
	int ret, page, i;
	
	electricity_block_t* b = km29_ctrl->electricity;
	int size = sizeof(electricity_pack_t);
	int cur_block = km29_ctrl->electricity_cur_block;
	
	//获取目标blcok, page
	ret = read_block((char*)block_buf, BLOCK_SIZE, km29_ctrl->electricity_cur_block);
	if(ret < 0)
	{
		ret = erase_block(km29_ctrl->electricity_cur_block);
		if(ret < 0)
		{
			km29_ctrl->block_invalid[km29_ctrl->electricity_cur_block] = 1;
			ret = next_block(cur_block);
			if(ret < 0) return -1;
		}
		page = 0;
	}
	else
	{
		int* t;
		
		page = -1; //assume -1
		for(i = 0; i < PAGES_PER_BLOCK; i++)
		{
			t = (int*)(block_buf+i*BYTES_PER_PAGE);
			if((*t) == -1)
			{
				page = i;
				break;
			}
		}
		if(page == -1)	
		{
			ret = next_block(cur_block);
			if(ret < 0) return -1;
			page = 0;				
		}
	}
	//获得了目标block, page
	
	while(1)
	{
		ret = program_page((char*)electricity_pack, size, km29_ctrl->electricity_cur_block, page);
		if(ret == 0) 
		{
			if(page == 0)
			{
				b[km29_ctrl->electricity_cur_block-BLOCK_ELECTRICITY_START].have_elec = 1;
				b[km29_ctrl->electricity_cur_block-BLOCK_ELECTRICITY_START].itime = electricity_pack->itime;
				km29_ctrl_updated = 1;
			}
			if(electricity_pack->sent_fail)			
			{
				b[km29_ctrl->electricity_cur_block-BLOCK_ELECTRICITY_START].sent_fail_mark |= 1 << page;
				km29_ctrl_updated = 1;
			}
			if(page == PAGES_PER_BLOCK-1)
			{
				b[km29_ctrl->electricity_cur_block-BLOCK_ELECTRICITY_START].itime2 = electricity_pack->itime;
				ret = next_block(cur_block);
				if(ret < 0) return -1;		
				erase_block(km29_ctrl->electricity_cur_block);		
			}
			break;
		}
		else
		{
			km29_ctrl->block_invalid[km29_ctrl->electricity_cur_block] = 1;
			km29_ctrl_updated = 1;
			ret = next_block(cur_block);
			if(ret < 0) return -1;

			page = 0;
		}
	}
	
	return 0;
}
	
int df_get_electricity(electricity_pack_t* epack, char* start_time, char* end_time, 
		electricity_search_index_t* si, int max_cnt)
{
	int stime, etime, i, page, cnt = 0;
	electricity_pack_t* p;
	
	electricity_block_t* eb = km29_ctrl->electricity;
	
	stime = calc_itime(start_time);
	etime = calc_itime(end_time);
	
	i = si->array_index;
	page = si->page;
	
	for(; i < MAX_ELECTRICITY; i++)
	{
		if(km29_ctrl->block_invalid[i+BLOCK_ELECTRICITY_START] == 1 
			|| eb[i].have_elec == 0)
			continue;
			
		if((eb[i].itime >= stime && eb[i].itime <= etime)
			|| (eb[i].itime2 >= stime && eb[i].itime2 <= etime))
		{
			read_block((char*)block_buf, BLOCK_SIZE, i+BLOCK_ELECTRICITY_START);
			for(; page < PAGES_PER_BLOCK; page++)
			{
				p = (electricity_pack_t*)(block_buf+page*BYTES_PER_PAGE);
				if(p->cnt != 3)
					return cnt;
				
				if(p->itime >= stime && p->itime <= etime)
				{
					if(page + 1 >= PAGES_PER_BLOCK)
					{
						si->array_index = i + 1;
						si->page = 0;
					}
					else
					{
						si->array_index = i;
						si->page = page+1;
					}
					
					*epack++ = *p;
					if(++cnt >= max_cnt)
						return cnt;
				}
			}
			page = 0;
		}
	}
	
	return cnt;
}


//return: records count
int df_get_electricity_sent_fail(electricity_pack_t* epack, int max_cnt, 
		electricity_search_index_t* si, electricity_search_index_t* items)
{
	int i, j, page, ret, cnt = 0;
	char buf[BYTES_PER_PAGE];
	
	electricity_pack_t* epage = (electricity_pack_t*) buf;
	electricity_block_t* eb = km29_ctrl->electricity;
	
	i = si->array_index;
	page = si->page;
			
	for(; i < MAX_ELECTRICITY; i++)
	{
		if(km29_ctrl->block_invalid[i+BLOCK_ELECTRICITY_START] == 1
			|| eb[i].have_elec != 1)
			continue;
			
		for(; page < PAGES_PER_BLOCK; page++)
		{
			if( eb[i].sent_fail_mark & (1<<page) )
			{
				ret = read_page(buf, 0, i+BLOCK_ELECTRICITY_START, page);
				if(ret < 0)
				{
					eb[i].sent_fail_mark &= ~(1<<page); //read data error, ignore this record
					continue;
				}

				*epack++ = *epage;
				
				//fill search struct
				items[cnt].array_index = i;
				items[cnt].page = page;
				
				if(++cnt >= max_cnt)
				{
					if(page >= PAGES_PER_BLOCK-1)
					{
						si->array_index = i + 1;
						si->page = 0;
					}
					else
					{
						si->array_index = i;
						si->page = page+1;
					}
					return cnt;
				}
			}
		}
		
		page = 0;
	}
	
	return cnt;
}

int df_electricity_sent(electricity_search_index_t* items, int cnt)
{
	int i;
	electricity_block_t* eb = km29_ctrl->electricity;
	
	for(i = 0; i < cnt; i++)
	{
		eb[items[i].array_index].sent_fail_mark &= ~(1<<items[i].page);
	}
	
	km29_ctrl_updated = 1;
	return 0;
}
*/

 
void GPRS_INFO_INIT(GPRS_INFORMATION_T *gprs_info)
{
	
	strcpy(gprs_info->passwords, "12345678");
	strcpy(gprs_info->administrator,"13750849639");
	strcpy(gprs_info->arbiter,"13750849639");
	strcpy(gprs_info->server_number, "13757174774" );
	gprs_info->camera_switch = 1<<3;
	gprs_info->pic_size = '0';
	gprs_info->pic_Q[0] = '8';
	gprs_info->pic_Q[1] = '0';
	gprs_info->auto_detect_open = '0';
	
}

//init once
//return: -1 error, bad flash chip; 2 success
int DF_First_init()
{
	int i, ret;
	char buf[20];
	char identifier[24] = "xbwang020@hotmail.com";
	
	
	memset((char*)data_flash,0,sizeof(DATA_FLASH_T));
	
	memcpy(data_flash->identifier, identifier, strlen(identifier));

	memcpy(data_flash->time_base, "20060101000000", 14);
	
	GPRS_INFO_INIT(&(data_flash->gprs_info));
	
	data_flash->jpeg_cur_block				= BLOCK_JPEG_START;
	data_flash->Pic_Total_Number				= 0;
	data_flash->Pic_Cur_Num			= 0;


	for(i = 0; i < TOTAL_BLOCK; i++)
	{
		data_flash->block_invalid[i] = 0; //assume valid
		
		ret = read_page(buf, 1, i, 0);
		if(buf[5] == 0xff || ret < 0)
			data_flash->block_invalid[i] = 1;
			
		ret = read_page(buf, 1, i, 1);
		if(buf[5] == 0xff || ret < 0)
			data_flash->block_invalid[i] = 1;
	}
	
	if(data_flash->block_invalid[0] == 1||data_flash->block_invalid[1] == 1||
		data_flash->block_invalid[2] == 1)
		return -1;
/*		
 typedef struct
{
	unsigned char time[14];		//图像的采集时间
	char channel;				//哪一路图像, -1 invalid data
	char sent_flag;				//是否发送成功的标志
	char sys_status;			//图片的状态,"1"报警图像,"0"正常图像
	char pic_size;				//图像的大小
	char pic_Q;             	//图像的质量
	unsigned short start_block;	//图像数据的起始块
	unsigned short end_block;	//图像数据的结束块
	int size;				       //图像的数据长度
	char receive_num[11];		//保存接收方的手机,便于以后分析
} JPEG_STORAGE_T;//40byte

*/	
	for(i = 0; i < MAX_PIC_NUM; i++)
	{
		data_flash->jpeg[i].channel		= -1;
		data_flash->jpeg[i].sent_flag	= -1;
		data_flash->jpeg[i].sys_status	= -1;	
		data_flash->jpeg[i].pic_size	= -1;	
		data_flash->jpeg[i].pic_Q		= -1;		
		data_flash->jpeg[i].start_block	= 0xffff;
		data_flash->jpeg[i].end_block	= 0xffff;
		data_flash->jpeg[i].size			= -1;
	}
	
	ret = program_blocks((char*)data_flash, sizeof(DATA_FLASH_T), 0,BLOCK_GPRS_INFO_START, BLOCK_GPRS_INFO_END);
	return ret;
}

//0 df工作正常且已初始化,1 df工作正常但未初始化, -1 df硬件错误
int data_flash_init()
{
	int ret;
	int i;
	

 
	data_flash=&Data_Info;



	jpeg_storage=&jpeg_store;

	
	for(i = BLOCK_GPRS_INFO_START;i<BLOCK_GPRS_INFO_END;i++)
			data_flash->block_invalid[i] = 0; //assume the first block is good, for read_data will check it


	*pFIO_DIR		|= (1 << 6); //output
	
//	sys_params = &km29_ctrl->sys_params;
//	sys_params2 = &km29_ctrl->sys_params2;
	
	ret = read_id();
	if(ret < 0)
		return -1;
	
	//memset((char*)data_flash,0,sizeof(DATA_FLASH_T));
	delay(100);
	ret = read_data((char*)data_flash, sizeof(DATA_FLASH_T), 0, BLOCK_GPRS_INFO_START, BLOCK_GPRS_INFO_END);


	
	//wd();	
	if(ret == 2)	
	{
		if(memcmp(data_flash->identifier, "xbwang020@hotmail.com", strlen("xbwang020@hotmail.com")) == 0)
			ret = 0;
		else
		{
			ret = DF_First_init();
			if(ret == 2)
				ret = 1;
		}
	}
	
	return ret;
}

int df_updated()
{
	if(data_flash_updated)
	{
		data_flash_updated = 0;
		delay(100);
		return program_blocks((char*)data_flash, sizeof(DATA_FLASH_T), 0, BLOCK_GPRS_INFO_START, BLOCK_GPRS_INFO_END);
	}
	
	return 0;
}

int updated_flag()
{
	data_flash_updated = 1;
	return 0;
}

/*
int df_log_error(char* error)
{	
	if(km29_ctrl->error_msg_len + strlen(error) > MAX_ERROR_MSG_LEN-1)
	{
		strcpy(km29_ctrl->error_msg, error);
		km29_ctrl->error_msg_len = strlen(error);
	}
	else
	{
		strcat(km29_ctrl->error_msg, error);
		km29_ctrl->error_msg_len += strlen(error);
	}
	
	km29_ctrl_updated = 1;
	
	df_uninit();
	
	return 0;
}
*/

⌨️ 快捷键说明

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