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

📄 filesystem.c

📁 ENC28J60 System HTTP
💻 C
📖 第 1 页 / 共 3 页
字号:
						break;				}				softuart_putnewline();				#endif			}		}	}	#if FILESYSTEM_DEBUG	softuart_putnewline();	softuart_putnewline();	#endif}*/unsigned char filesystem_filename_to_buffer(unsigned char *buffer, unsigned int fnpos){	unsigned int pos = 0;	unsigned char k;	//add filename	for (k=0; k<8; k++){		buffer[pos] = dataflash_read_buffer(fnpos*24 + FILESYSTEM_FTABLE_FILENAME_START + k, 0);				if (buffer[pos] == 0)			break;				pos++;	}	//add '.'	buffer[pos++] = '.';	for (k=0; k<3; k++){		buffer[pos] = dataflash_read_buffer(fnpos*24 + FILESYSTEM_FTABLE_FILENAME_START + 8 + k, 0);				if (buffer[pos] == 0)			break;				pos++;	}	return pos;}//generate filesystem indexunsigned int filesystem_generate_index(unsigned char *buffer, unsigned int datapos, unsigned int *len, unsigned int *offset){	unsigned int i;	unsigned char j,k;	unsigned int tmp;	unsigned int id;	//every entry looks like:	//IIIII_SSSSS_<a href="/fs/FFFFFFFF.EEE">FFFFFFFF.EEE</a><br>	//-> 5+1+5+1+8+1+3+4 +25 +6= 28+25+6 bytes	//unsigned int  skip_files = 0;	//while((*offset) >= 59){	//	(*offset) = (*offset) - 59;	//	skip_files++;	//}	//file entry buffer:	unsigned char list_entry[60];	unsigned char list_pos = 0;	//search all filesystem table entries:	//-> slow !! we always walk through the whole list!! -> FIXME	for(i=0; i<FILESYSTEM_TABLE_SIZE; i++){		//copy page i to dataflash buffer 0		dataflash_copy_page_to_buffer(i, 0);		//now read 11 filesystem entries:		for(j=0; j<11; j++){			//check if there is already a file with our id:			id  = dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_ID_HI, 0)<<8;			id |= dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_ID_LO, 0);			if (id != 0x0000){				//if (skip_files == 0){					#if FILESYSTEM_DEBUG					softuart_puts_progmem("FS  : found id ");					softuart_put_uint16(id);					#endif					//we expect this file -> print info!					//intitialise entry buffer pos					list_pos = 0;					//add file id					//string_uint16_to_buffer(&list_entry[list_pos], id);					//list_pos += 5;					string_progmem_to_buffer(PSTR("<img src=\"/site/ficon.gif\" align=middle> "), &list_entry[list_pos], 41);					list_pos += 41;					//add <a href="/fs/					string_progmem_to_buffer(PSTR("<a href=\"/fs/"), &list_entry[list_pos], 13);					list_pos += 13;					//now copy requested data from list_entry buffer to 					//tcp buffer:					//if (list_pos>=60) softuart_puts_progmem("FS: OVERFLOW: ");softuart_put_uint8(list_pos);					for(k=0; k<list_pos; k++){						if ((*offset) > 0){							(*offset)--;						}else{							buffer[datapos++] = list_entry[k];							(*len)--;							if ((*len) == 0)								return 0;						}					}					list_pos = 0;					//add filename					list_pos += filesystem_filename_to_buffer(&list_entry[list_pos], j);					//add ">					string_progmem_to_buffer(PSTR("\">"), &list_entry[list_pos], 2);					list_pos += 2;					//add filename again					list_pos += filesystem_filename_to_buffer(&list_entry[list_pos], j);					//add </a><br> 					string_progmem_to_buffer(PSTR("</a>"), &list_entry[list_pos], 4);					list_pos += 4;					//add ' '					list_entry[list_pos++] = ' ';										tmp  = dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_BLOCK_COUNT_HI, 0)<<8;					tmp += dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_BLOCK_COUNT_LO, 0);					//convert to kbyte					tmp  = tmp / 4; //*256/1024 = /4					if (tmp == 0)						tmp = 1;					//add file size					string_uint16_to_buffer(&list_entry[list_pos], tmp); 					list_pos += 5;									//add ' '					string_progmem_to_buffer(PSTR("KB "), &list_entry[list_pos], 3);					list_pos += 3;					//now copy requested data from list_entry buffer to 					//tcp buffer:					//if (list_pos>=60) softuart_puts_progmem("FS: OVERFLOW: ");softuart_put_uint8(list_pos);					for(k=0; k<list_pos; k++){						if ((*offset) > 0){							(*offset)--;						}else{							buffer[datapos++] = list_entry[k];							(*len)--;							if ((*len) == 0)								return 0;						}					}					//now add next data, reuse buffer, we do not want to use another 59byte buf ! 					list_pos = 0;					//add a href part of remove file link:					string_progmem_to_buffer(PSTR(" <a href=\"/adm/rm/"), &list_entry[list_pos], 18);					list_pos += 18;					//add filename					//list_pos += filesystem_filename_to_buffer(&list_entry[list_pos], j);					//add file id:					string_uint16_to_buffer(&list_entry[list_pos], id);					list_pos += 5;					//add rest of href:					string_progmem_to_buffer(PSTR("\">remove</a><br>"), &list_entry[list_pos], 16);					list_pos += 16;					//now copy requested data from list_entry buffer to 					//tcp buffer:					//if (list_pos>=60) softuart_puts_progmem("FS: OVERFLOW: ");softuart_put_uint8(list_pos);					for(k=0; k<list_pos; k++){						if ((*offset) > 0){							(*offset)--;						}else{							buffer[datapos++] = list_entry[k];							(*len)--;							if ((*len) == 0)								return 0;						}					}					#if FILESYSTEM_DEBUG					softuart_puts_progmem(" data created.\r\n");					#endif				//}else{				//	skip_files--;				//}			}		}	}	return datapos;}//read next byte to data ptr !//return: 0 if eof file//        1 otherwiseunsigned char filesystem_get_next_byte(unsigned char *data){	//unsigned int tmp;	//copy flash to buffer	if (filesystem_file_pos == 0){		dataflash_copy_page_to_buffer(filesystem_current_block, 0);		for(unsigned char p=0; p<255; p++)			filesystem_buffer[p] = dataflash_read_buffer(p,0);	}	*data = filesystem_buffer[filesystem_file_pos];	filesystem_file_pos++;	//block end or end of file ?!	if ((filesystem_file_pos == 255)){		filesystem_file_pos = 0;		//load next block:				filesystem_current_block  = dataflash_read_buffer(FILESYSTEM_FILE_NEXT_HI, 0)<<8;		filesystem_current_block |= dataflash_read_buffer(FILESYSTEM_FILE_NEXT_LO, 0);		#if FILESYSTEM_DEBUG		//softuart_puts_progmem("FS  : next block read: ");		//softuart_put_uint16(filesystem_current_block);		//softuart_putnewline();		#endif		if (filesystem_current_block == 0x0000)			return 0; //eof file	}	return 1;}unsigned int filesystem_get_data_startat(unsigned char *buffer, unsigned int datapos, unsigned int len, unsigned int *data_ptr, unsigned int inside_block_pos){// 	sunsigned int tmp;	unsigned int count;	//unsigned int pos;	unsigned int i;	while (*data_ptr != 0x0000){		//copy block to buffer0:		dataflash_copy_page_to_buffer(*data_ptr, 0);		//get bytes used inside this block:		count = dataflash_read_buffer(FILESYSTEM_FILE_BLOCK_USAGE,0)+1;		//dump block:		i=0;		//calc first startbyte:		if (inside_block_pos != 0){			count = count - inside_block_pos;			i = inside_block_pos;			inside_block_pos = 0;		}		if ((count == 256) && (i == 0) && (len >=256)){			dataflash_read_n_to_buffer(&buffer[datapos], 0);			datapos += 256;			len -= 256;			//i+=...			if (len == 0)				return 0;		}else{			while (count > 0){				buffer[datapos++] = dataflash_read_buffer(i,0);				len--;				//no more data allowed				if (len == 0)					return 0;				count--;				i++;			}		}		//calc next block:		*data_ptr  = dataflash_read_buffer(FILESYSTEM_FILE_NEXT_HI, 0)<<8;		*data_ptr  = (*data_ptr) | dataflash_read_buffer(FILESYSTEM_FILE_NEXT_LO, 0);				//tmp should be zero if this is the last block. but we have a flag for last block, too:		if (dataflash_read_buffer(FILESYSTEM_FILE_BLOCKTAG,0) == 0xEE)			*data_ptr = 0x0000; //last block!	}	return datapos;}unsigned int filesystem_get_data(unsigned char *buffer, unsigned int datapos, unsigned int len, unsigned long streampos, unsigned int fileid, unsigned int *data_ptr){	//file was requested, search file:	//unsigned int tmp;	unsigned int count;	unsigned int pos;	//invalid fileid ?	if (fileid == 0){		#if FILESYSTEM_DEBUG		softuart_puts_progmem("FS  : file not found.");		softuart_putnewline();		#endif		return datapos;	}	//copy lookuptable page to dataflash buffer 0	dataflash_copy_page_to_buffer(((fileid-1)/11), 0);		//pos inside page is ?	pos = 24*((fileid-1) % 11);	#if FILESYSTEM_DEBUG	softuart_puts_progmem("FS  : requested fid ");	softuart_put_uint16(fileid);	softuart_puts_progmem(", loc on block ");	softuart_put_uint16((fileid-1)/11);	softuart_puts_progmem(", pos ");	softuart_put_uint8(pos);	softuart_putnewline();	#endif	//get first block:	*data_ptr  = dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_HI, 0)<<8;	*data_ptr  = (*data_ptr) | dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_LO, 0);	if (*data_ptr == 0x0000){		buffer[datapos++] = '4';		buffer[datapos++] = '0';		buffer[datapos++] = '4';		return datapos;	}	while (*data_ptr != 0x0000){		//copy block to buffer0:		dataflash_copy_page_to_buffer(*data_ptr, 0);		//is this block requested ?		if (streampos < 255){			//get bytes used inside this block:			count = dataflash_read_buffer(FILESYSTEM_FILE_BLOCK_USAGE,0)+1;				//dump block:			unsigned int i=0;			//calc first startbyte:			if (streampos != 0){				count = count - streampos;				i += streampos;				streampos = 0;			}						while (count > 0){				//if (streampos > 0){				//	//FIXME: could be done muuuch faster (calculate skip count etc...) FIXME				//	streampos--;				//}else{					buffer[datapos++] = dataflash_read_buffer(i,0);					len--;					//no more data allowed					if (len == 0)						return 0;				//}				count--;				i++;			}		}else{			//we skip this block -> decrease streampos:			streampos -= 256;		}		//calc next block:		*data_ptr  = dataflash_read_buffer(FILESYSTEM_FILE_NEXT_HI, 0)<<8;		*data_ptr  = (*data_ptr) | dataflash_read_buffer(FILESYSTEM_FILE_NEXT_LO, 0);				//tmp should be zero if this is the last block. but we have a flag for last block, too:		if (dataflash_read_buffer(FILESYSTEM_FILE_BLOCKTAG,0) == 0xEE)			*data_ptr = 0x0000; //last block!	}	#if FILESYSTEM_DEBUG	softuart_puts_progmem("FS  : file sent.");	softuart_putnewline();	#endif	return datapos;}//search file table for the next free file id:unsigned int filesystem_allocate_fileid(){	unsigned int id;	unsigned int tmp;	unsigned char i,j;	//start with invalid file id 	id = 0;	#if FILESYSTEM_DEBUG	softuart_puts_progmem("FS: searching free id...");	#endif	//search all filesystem table entries:	for(i=0; i<FILESYSTEM_TABLE_SIZE; i++){		//copy page i to dataflash buffer 0		dataflash_copy_page_to_buffer(i, 0);		//now read 11 filesystem entries:		for(j=0; j<11; j++){			//check if there is already a file with our id:			tmp  = dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_ID_HI, 0)<<8;			tmp |= dataflash_read_buffer(j*24 + FILESYSTEM_FTABLE_ID_LO, 0);						//if current file has an id of 0 -> this slot is empty -> use this id !			if (tmp == 0){				id = 1 + i*11 + j; //fileid valid from 1...50*11-1 = 1...549				#if FILESYSTEM_DEBUG				softuart_puts_progmem(" found id ");				softuart_put_uint16(id);				softuart_putnewline();				#endif				return id;			}		}		}	#if FILESYSTEM_DEBUG	softuart_puts_progmem(" failed. FS FULL!");	softuart_putnewline();	#endif	return 0; //FAILED}

⌨️ 快捷键说明

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