📄 filesystem.c
字号:
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 + -