mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-19 23:22:16 +03:00
commit
45a1860447
23
boards.txt
23
boards.txt
@ -65,13 +65,18 @@ generic.menu.UploadSpeed.512000.upload.speed=512000
|
|||||||
generic.menu.UploadSpeed.921600=921600
|
generic.menu.UploadSpeed.921600=921600
|
||||||
generic.menu.UploadSpeed.921600.upload.speed=921600
|
generic.menu.UploadSpeed.921600.upload.speed=921600
|
||||||
|
|
||||||
generic.menu.FlashSize.512K=512K (64K SPIFFS)
|
generic.menu.FlashSize.512K64=512K (64K SPIFFS)
|
||||||
generic.menu.FlashSize.512K.build.flash_size=512K
|
generic.menu.FlashSize.512K64.build.flash_size=512K
|
||||||
generic.menu.FlashSize.512K.build.flash_ld=eagle.flash.512k.ld
|
generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
|
||||||
generic.menu.FlashSize.512K.build.spiffs_start=0x6B000
|
generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
|
||||||
generic.menu.FlashSize.512K.build.spiffs_end=0x7B000
|
generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
|
||||||
generic.menu.FlashSize.512K.build.spiffs_blocksize=4096
|
generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
|
||||||
generic.menu.FlashSize.512K.upload.maximum_size=434160
|
generic.menu.FlashSize.512K64.upload.maximum_size=434160
|
||||||
|
|
||||||
|
generic.menu.FlashSize.512K0=512K (no SPIFFS)
|
||||||
|
generic.menu.FlashSize.512K0.build.flash_size=512K
|
||||||
|
generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
|
||||||
|
generic.menu.FlashSize.512K0.upload.maximum_size=499696
|
||||||
|
|
||||||
generic.menu.FlashSize.1M512=1M (512K SPIFFS)
|
generic.menu.FlashSize.1M512=1M (512K SPIFFS)
|
||||||
generic.menu.FlashSize.1M512.build.flash_size=1M
|
generic.menu.FlashSize.1M512.build.flash_size=1M
|
||||||
@ -410,7 +415,7 @@ thing.build.variant=thing
|
|||||||
thing.build.flash_mode=qio
|
thing.build.flash_mode=qio
|
||||||
# flash chip: AT25SF041 (512 kbyte, 4Mbit)
|
# flash chip: AT25SF041 (512 kbyte, 4Mbit)
|
||||||
thing.build.flash_size=512K
|
thing.build.flash_size=512K
|
||||||
thing.build.flash_ld=eagle.flash.512k.ld
|
thing.build.flash_ld=eagle.flash.512k64.ld
|
||||||
thing.build.flash_freq=40
|
thing.build.flash_freq=40
|
||||||
thing.build.spiffs_start=0x6B000
|
thing.build.spiffs_start=0x6B000
|
||||||
thing.build.spiffs_end=0x7B000
|
thing.build.spiffs_end=0x7B000
|
||||||
@ -526,7 +531,7 @@ esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
|
|||||||
# wifio.build.flash_mode=qio
|
# wifio.build.flash_mode=qio
|
||||||
# wifio.build.flash_size=512K
|
# wifio.build.flash_size=512K
|
||||||
# wifio.build.flash_freq=40
|
# wifio.build.flash_freq=40
|
||||||
# wifio.build.flash_ld=eagle.flash.512k.ld
|
# wifio.build.flash_ld=eagle.flash.512k64.ld
|
||||||
# wifio.build.spiffs_start=0x6B000
|
# wifio.build.spiffs_start=0x6B000
|
||||||
# wifio.build.spiffs_end=0x7B000
|
# wifio.build.spiffs_end=0x7B000
|
||||||
#
|
#
|
||||||
|
@ -174,6 +174,13 @@ bool FS::format() {
|
|||||||
return _impl->format();
|
return _impl->format();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FS::info(uint32_t *total, uint32_t *used){
|
||||||
|
if (!_impl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return _impl->info(total,used);
|
||||||
|
}
|
||||||
|
|
||||||
File FS::open(const String& path, const char* mode) {
|
File FS::open(const String& path, const char* mode) {
|
||||||
return open(path.c_str(), mode);
|
return open(path.c_str(), mode);
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,7 @@ public:
|
|||||||
bool begin();
|
bool begin();
|
||||||
|
|
||||||
bool format();
|
bool format();
|
||||||
|
bool info(uint32_t *total, uint32_t *used);
|
||||||
|
|
||||||
File open(const char* path, const char* mode);
|
File open(const char* path, const char* mode);
|
||||||
File open(const String& path, const char* mode);
|
File open(const String& path, const char* mode);
|
||||||
|
@ -64,6 +64,7 @@ class FSImpl {
|
|||||||
public:
|
public:
|
||||||
virtual bool begin() = 0;
|
virtual bool begin() = 0;
|
||||||
virtual bool format() = 0;
|
virtual bool format() = 0;
|
||||||
|
virtual bool info(uint32_t *total, uint32_t *used) = 0;
|
||||||
virtual FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) = 0;
|
virtual FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) = 0;
|
||||||
virtual bool exists(const char* path) = 0;
|
virtual bool exists(const char* path) = 0;
|
||||||
virtual DirImplPtr openDir(const char* path) = 0;
|
virtual DirImplPtr openDir(const char* path) = 0;
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
* Author: petera
|
* Author: petera
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef SPIFFS_H_
|
#ifndef SPIFFS_H_
|
||||||
#define SPIFFS_H_
|
#define SPIFFS_H_
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
@ -186,6 +184,11 @@ typedef struct {
|
|||||||
// logical size of a page, must be at least
|
// logical size of a page, must be at least
|
||||||
// log_block_size / 8
|
// log_block_size / 8
|
||||||
u32_t log_page_size;
|
u32_t log_page_size;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#if SPIFFS_FILEHDL_OFFSET
|
||||||
|
// an integer offset added to each file handle
|
||||||
|
u16_t fh_ix_offset;
|
||||||
#endif
|
#endif
|
||||||
} spiffs_config;
|
} spiffs_config;
|
||||||
|
|
||||||
@ -310,7 +313,7 @@ void SPIFFS_unmount(spiffs *fs);
|
|||||||
* @param path the path of the new file
|
* @param path the path of the new file
|
||||||
* @param mode ignored, for posix compliance
|
* @param mode ignored, for posix compliance
|
||||||
*/
|
*/
|
||||||
s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode);
|
s32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens/creates a file.
|
* Opens/creates a file.
|
||||||
@ -321,7 +324,7 @@ s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode);
|
|||||||
* SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT
|
* SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT
|
||||||
* @param mode ignored, for posix compliance
|
* @param mode ignored, for posix compliance
|
||||||
*/
|
*/
|
||||||
spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode mode);
|
spiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -360,13 +363,14 @@ s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len);
|
|||||||
s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len);
|
s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the read/write file offset
|
* Moves the read/write file offset. Resulting offset is returned or negative if error.
|
||||||
|
* lseek(fs, fd, 0, SPIFFS_SEEK_CUR) will thus return current offset.
|
||||||
* @param fs the file system struct
|
* @param fs the file system struct
|
||||||
* @param fh the filehandle
|
* @param fh the filehandle
|
||||||
* @param offs how much/where to move the offset
|
* @param offs how much/where to move the offset
|
||||||
* @param whence if SPIFFS_SEEK_SET, the file offset shall be set to offset bytes
|
* @param whence if SPIFFS_SEEK_SET, the file offset shall be set to offset bytes
|
||||||
* if SPIFFS_SEEK_CUR, the file offset shall be set to its current location plus offset
|
* if SPIFFS_SEEK_CUR, the file offset shall be set to its current location plus offset
|
||||||
* if SPIFFS_SEEK_END, the file offset shall be set to the size of the file plus offset
|
* if SPIFFS_SEEK_END, the file offset shall be set to the size of the file plus offse, which should be negative
|
||||||
*/
|
*/
|
||||||
s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence);
|
s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence);
|
||||||
|
|
||||||
@ -375,7 +379,7 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence);
|
|||||||
* @param fs the file system struct
|
* @param fs the file system struct
|
||||||
* @param path the path of the file to remove
|
* @param path the path of the file to remove
|
||||||
*/
|
*/
|
||||||
s32_t SPIFFS_remove(spiffs *fs, char *path);
|
s32_t SPIFFS_remove(spiffs *fs, const char *path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes a file by filehandle
|
* Removes a file by filehandle
|
||||||
@ -390,7 +394,7 @@ s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh);
|
|||||||
* @param path the path of the file to stat
|
* @param path the path of the file to stat
|
||||||
* @param s the stat struct to populate
|
* @param s the stat struct to populate
|
||||||
*/
|
*/
|
||||||
s32_t SPIFFS_stat(spiffs *fs, char *path, spiffs_stat *s);
|
s32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets file status by filehandle
|
* Gets file status by filehandle
|
||||||
@ -420,7 +424,7 @@ s32_t SPIFFS_close(spiffs *fs, spiffs_file fh);
|
|||||||
* @param old path of file to rename
|
* @param old path of file to rename
|
||||||
* @param newPath new path of file
|
* @param newPath new path of file
|
||||||
*/
|
*/
|
||||||
s32_t SPIFFS_rename(spiffs *fs, char *old, char *newPath);
|
s32_t SPIFFS_rename(spiffs *fs, const char *old, const char *newPath);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns last error of last file operation.
|
* Returns last error of last file operation.
|
||||||
@ -443,7 +447,7 @@ void SPIFFS_clearerr(spiffs *fs);
|
|||||||
* @param name the name of the directory
|
* @param name the name of the directory
|
||||||
* @param d pointer the directory stream to be populated
|
* @param d pointer the directory stream to be populated
|
||||||
*/
|
*/
|
||||||
spiffs_DIR *SPIFFS_opendir(spiffs *fs, char *name, spiffs_DIR *d);
|
spiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes a directory stream
|
* Closes a directory stream
|
||||||
@ -544,6 +548,20 @@ s32_t SPIFFS_gc_quick(spiffs *fs, u16_t max_free_pages);
|
|||||||
*/
|
*/
|
||||||
s32_t SPIFFS_gc(spiffs *fs, u32_t size);
|
s32_t SPIFFS_gc(spiffs *fs, u32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if EOF reached.
|
||||||
|
* @param fs the file system struct
|
||||||
|
* @param fh the filehandle of the file to check
|
||||||
|
*/
|
||||||
|
s32_t SPIFFS_eof(spiffs *fs, spiffs_file fh);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get position in file.
|
||||||
|
* @param fs the file system struct
|
||||||
|
* @param fh the filehandle of the file to check
|
||||||
|
*/
|
||||||
|
s32_t SPIFFS_tell(spiffs *fs, spiffs_file fh);
|
||||||
|
|
||||||
#if SPIFFS_TEST_VISUALISATION
|
#if SPIFFS_TEST_VISUALISATION
|
||||||
/**
|
/**
|
||||||
* Prints out a visualization of the filesystem.
|
* Prints out a visualization of the filesystem.
|
||||||
|
@ -440,9 +440,9 @@ static s32_t spiffs_lookup_check_validate(spiffs *fs, spiffs_obj_id lu_obj_id, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
static s32_t spiffs_lookup_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, int cur_entry,
|
static s32_t spiffs_lookup_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, int cur_entry,
|
||||||
u32_t user_data, void *user_p) {
|
const void *user_const_p, void *user_var_p) {
|
||||||
(void)user_data;
|
(void)user_const_p;
|
||||||
(void)user_p;
|
(void)user_var_p;
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
spiffs_page_header p_hdr;
|
spiffs_page_header p_hdr;
|
||||||
spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry);
|
spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry);
|
||||||
@ -873,11 +873,11 @@ static int spiffs_object_index_search(spiffs *fs, spiffs_obj_id obj_id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static s32_t spiffs_object_index_consistency_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block,
|
static s32_t spiffs_object_index_consistency_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block,
|
||||||
int cur_entry, u32_t user_data, void *user_p) {
|
int cur_entry, const void *user_const_p, void *user_var_p) {
|
||||||
(void)user_data;
|
(void)user_const_p;
|
||||||
s32_t res_c = SPIFFS_VIS_COUNTINUE;
|
s32_t res_c = SPIFFS_VIS_COUNTINUE;
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
u32_t *log_ix = (u32_t *)user_p;
|
u32_t *log_ix = (u32_t*)user_var_p;
|
||||||
spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work;
|
spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work;
|
||||||
|
|
||||||
CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS,
|
CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS,
|
||||||
@ -977,8 +977,8 @@ s32_t spiffs_object_index_consistency_check(spiffs *fs) {
|
|||||||
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
||||||
u32_t obj_id_log_ix = 0;
|
u32_t obj_id_log_ix = 0;
|
||||||
CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 0, 0);
|
CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 0, 0);
|
||||||
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_object_index_consistency_check_v, 0, &obj_id_log_ix,
|
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_object_index_consistency_check_v, &obj_id_log_ix,
|
||||||
0, 0);
|
0, 0, 0);
|
||||||
if (res == SPIFFS_VIS_END) {
|
if (res == SPIFFS_VIS_END) {
|
||||||
res = SPIFFS_OK;
|
res = SPIFFS_OK;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#define c_printf ets_printf
|
#define c_printf ets_printf
|
||||||
#define c_memset memset
|
#define c_memset memset
|
||||||
|
|
||||||
typedef signed short file_t;
|
typedef int16_t file_t;
|
||||||
typedef int32_t s32_t;
|
typedef int32_t s32_t;
|
||||||
typedef uint32_t u32_t;
|
typedef uint32_t u32_t;
|
||||||
typedef int16_t s16_t;
|
typedef int16_t s16_t;
|
||||||
@ -46,20 +46,20 @@ typedef uint8_t u8_t;
|
|||||||
// compile time switches
|
// compile time switches
|
||||||
|
|
||||||
// Set generic spiffs debug output call.
|
// Set generic spiffs debug output call.
|
||||||
#ifndef SPIFFS_DGB
|
#ifndef SPIFFS_DBG
|
||||||
#define SPIFFS_DBG(...) //c_printf(__VA_ARGS__)
|
#define SPIFFS_DBG(...) //printf(__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
// Set spiffs debug output call for garbage collecting.
|
// Set spiffs debug output call for garbage collecting.
|
||||||
#ifndef SPIFFS_GC_DGB
|
#ifndef SPIFFS_GC_DBG
|
||||||
#define SPIFFS_GC_DBG(...) //c_printf(__VA_ARGS__)
|
#define SPIFFS_GC_DBG(...) //printf(__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
// Set spiffs debug output call for caching.
|
// Set spiffs debug output call for caching.
|
||||||
#ifndef SPIFFS_CACHE_DGB
|
#ifndef SPIFFS_CACHE_DBG
|
||||||
#define SPIFFS_CACHE_DBG(...) //c_printf(__VA_ARGS__)
|
#define SPIFFS_CACHE_DBG(...) //printf(__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
// Set spiffs debug output call for system consistency checks.
|
// Set spiffs debug output call for system consistency checks.
|
||||||
#ifndef SPIFFS_CHECK_DGB
|
#ifndef SPIFFS_CHECK_DBG
|
||||||
#define SPIFFS_CHECK_DBG(...) //c_printf(__VA_ARGS__)
|
#define SPIFFS_CHECK_DBG(...) //printf(__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Enable/disable API functions to determine exact number of bytes
|
// Enable/disable API functions to determine exact number of bytes
|
||||||
@ -189,6 +189,21 @@ typedef uint8_t u8_t;
|
|||||||
#define SPIFFS_ALIGNED_OBJECT_INDEX_TABLES 1
|
#define SPIFFS_ALIGNED_OBJECT_INDEX_TABLES 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enable this if you want the HAL callbacks to be called with the spiffs struct
|
||||||
|
#ifndef SPIFFS_HAL_CALLBACK_EXTRA
|
||||||
|
#define SPIFFS_HAL_CALLBACK_EXTRA 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Enable this if you want to add an integer offset to all file handles
|
||||||
|
// (spiffs_file). This is useful if running multiple instances of spiffs on
|
||||||
|
// same target, in order to recognise to what spiffs instance a file handle
|
||||||
|
// belongs.
|
||||||
|
// NB: This adds config field fh_ix_offset in the configuration struct when
|
||||||
|
// mounting, which must be defined.
|
||||||
|
#ifndef SPIFFS_FILEHDL_OFFSET
|
||||||
|
#define SPIFFS_FILEHDL_OFFSET 0
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set SPIFFS_TEST_VISUALISATION to non-zero to enable SPIFFS_vis function
|
// Set SPIFFS_TEST_VISUALISATION to non-zero to enable SPIFFS_vis function
|
||||||
// in the api. This function will visualize all filesystem using given printf
|
// in the api. This function will visualize all filesystem using given printf
|
||||||
// function.
|
// function.
|
||||||
|
@ -36,7 +36,7 @@ s32_t spiffs_gc_quick(
|
|||||||
int cur_entry = 0;
|
int cur_entry = 0;
|
||||||
spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;
|
spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;
|
||||||
|
|
||||||
SPIFFS_GC_DBG("gc_quick: running\n", cur_block);
|
SPIFFS_GC_DBG("gc_quick: running\n");
|
||||||
#if SPIFFS_GC_STATS
|
#if SPIFFS_GC_STATS
|
||||||
fs->stats_gc_runs++;
|
fs->stats_gc_runs++;
|
||||||
#endif
|
#endif
|
||||||
@ -255,7 +255,7 @@ s32_t spiffs_gc_find_candidate(
|
|||||||
// align cand_scores on s32_t boundary
|
// align cand_scores on s32_t boundary
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
#pragma GCC diagnostic ignored "-Wpointer-to-int-cast"
|
||||||
cand_scores = (s32_t*)(((u32_t)cand_scores + sizeof(s32_t) - 1) & ~(sizeof(s32_t) - 1));
|
cand_scores = (s32_t*)(((ptrdiff_t)cand_scores + sizeof(ptrdiff_t) - 1) & ~(sizeof(ptrdiff_t) - 1));
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
*block_candidates = cand_blocks;
|
*block_candidates = cand_blocks;
|
||||||
|
@ -8,6 +8,14 @@
|
|||||||
#include "spiffs.h"
|
#include "spiffs.h"
|
||||||
#include "spiffs_nucleus.h"
|
#include "spiffs_nucleus.h"
|
||||||
|
|
||||||
|
#if SPIFFS_FILEHDL_OFFSET
|
||||||
|
#define SPIFFS_FH_OFFS(fs, fh) ((fh) != 0 ? ((fh) + (fs)->cfg.fh_ix_offset) : 0)
|
||||||
|
#define SPIFFS_FH_UNOFFS(fs, fh) ((fh) != 0 ? ((fh) - (fs)->cfg.fh_ix_offset) : 0)
|
||||||
|
#else
|
||||||
|
#define SPIFFS_FH_OFFS(fs, fh) (fh)
|
||||||
|
#define SPIFFS_FH_UNOFFS(fs, fh) (fh)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if SPIFFS_CACHE == 1
|
#if SPIFFS_CACHE == 1
|
||||||
static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh);
|
static s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh);
|
||||||
#endif
|
#endif
|
||||||
@ -57,9 +65,12 @@ s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
|
|||||||
u8_t *fd_space, u32_t fd_space_size,
|
u8_t *fd_space, u32_t fd_space_size,
|
||||||
void *cache, u32_t cache_size,
|
void *cache, u32_t cache_size,
|
||||||
spiffs_check_callback check_cb_f) {
|
spiffs_check_callback check_cb_f) {
|
||||||
|
void *user_data;
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
|
user_data = fs->user_data;
|
||||||
memset(fs, 0, sizeof(spiffs));
|
memset(fs, 0, sizeof(spiffs));
|
||||||
memcpy(&fs->cfg, config, sizeof(spiffs_config));
|
memcpy(&fs->cfg, config, sizeof(spiffs_config));
|
||||||
|
fs->user_data = user_data;
|
||||||
fs->block_count = SPIFFS_CFG_PHYS_SZ(fs) / SPIFFS_CFG_LOG_BLOCK_SZ(fs);
|
fs->block_count = SPIFFS_CFG_PHYS_SZ(fs) / SPIFFS_CFG_LOG_BLOCK_SZ(fs);
|
||||||
fs->work = &work[0];
|
fs->work = &work[0];
|
||||||
fs->lu_work = &work[SPIFFS_CFG_LOG_PAGE_SZ(fs)];
|
fs->lu_work = &work[SPIFFS_CFG_LOG_PAGE_SZ(fs)];
|
||||||
@ -155,7 +166,7 @@ void SPIFFS_clearerr(spiffs *fs) {
|
|||||||
fs->err_code = SPIFFS_OK;
|
fs->err_code = SPIFFS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode) {
|
s32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode) {
|
||||||
(void)mode;
|
(void)mode;
|
||||||
SPIFFS_API_CHECK_CFG(fs);
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
SPIFFS_API_CHECK_MOUNT(fs);
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
@ -163,15 +174,15 @@ s32_t SPIFFS_creat(spiffs *fs, char *path, spiffs_mode mode) {
|
|||||||
spiffs_obj_id obj_id;
|
spiffs_obj_id obj_id;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
|
|
||||||
res = spiffs_obj_lu_find_free_obj_id(fs, &obj_id, (u8_t *)path);
|
res = spiffs_obj_lu_find_free_obj_id(fs, &obj_id, (const u8_t*)path);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
res = spiffs_object_create(fs, obj_id, (u8_t *)path, SPIFFS_TYPE_FILE, 0);
|
res = spiffs_object_create(fs, obj_id, (const u8_t*)path, SPIFFS_TYPE_FILE, 0);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
SPIFFS_UNLOCK(fs);
|
SPIFFS_UNLOCK(fs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode mode) {
|
spiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode) {
|
||||||
(void)mode;
|
(void)mode;
|
||||||
SPIFFS_API_CHECK_CFG(fs);
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
SPIFFS_API_CHECK_MOUNT(fs);
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
@ -183,7 +194,7 @@ spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode
|
|||||||
s32_t res = spiffs_fd_find_new(fs, &fd);
|
s32_t res = spiffs_fd_find_new(fs, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)path, &pix);
|
res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t*)path, &pix);
|
||||||
if ((flags & SPIFFS_CREAT) == 0) {
|
if ((flags & SPIFFS_CREAT) == 0) {
|
||||||
if (res < SPIFFS_OK) {
|
if (res < SPIFFS_OK) {
|
||||||
spiffs_fd_return(fs, fd->file_nbr);
|
spiffs_fd_return(fs, fd->file_nbr);
|
||||||
@ -207,7 +218,7 @@ spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode
|
|||||||
spiffs_fd_return(fs, fd->file_nbr);
|
spiffs_fd_return(fs, fd->file_nbr);
|
||||||
}
|
}
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
res = spiffs_object_create(fs, obj_id, (u8_t*)path, SPIFFS_TYPE_FILE, &pix);
|
res = spiffs_object_create(fs, obj_id, (const u8_t*)path, SPIFFS_TYPE_FILE, &pix);
|
||||||
if (res < SPIFFS_OK) {
|
if (res < SPIFFS_OK) {
|
||||||
spiffs_fd_return(fs, fd->file_nbr);
|
spiffs_fd_return(fs, fd->file_nbr);
|
||||||
}
|
}
|
||||||
@ -236,7 +247,7 @@ spiffs_file SPIFFS_open(spiffs *fs, char *path, spiffs_flags flags, spiffs_mode
|
|||||||
|
|
||||||
SPIFFS_UNLOCK(fs);
|
SPIFFS_UNLOCK(fs);
|
||||||
|
|
||||||
return fd->file_nbr;
|
return SPIFFS_FH_OFFS(fs, fd->file_nbr);
|
||||||
}
|
}
|
||||||
|
|
||||||
spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode) {
|
spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode) {
|
||||||
@ -266,7 +277,7 @@ spiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_fl
|
|||||||
|
|
||||||
SPIFFS_UNLOCK(fs);
|
SPIFFS_UNLOCK(fs);
|
||||||
|
|
||||||
return fd->file_nbr;
|
return SPIFFS_FH_OFFS(fs, fd->file_nbr);
|
||||||
}
|
}
|
||||||
|
|
||||||
s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
||||||
@ -277,6 +288,7 @@ s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
|||||||
spiffs_fd *fd;
|
spiffs_fd *fd;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fd_get(fs, fh, &fd);
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
@ -285,6 +297,12 @@ s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
|||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fd->size == SPIFFS_UNDEFINED_LEN && len > 0) {
|
||||||
|
// special case for zero sized files
|
||||||
|
res = SPIFFS_ERR_END_OF_OBJECT;
|
||||||
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
}
|
||||||
|
|
||||||
#if SPIFFS_CACHE_WR
|
#if SPIFFS_CACHE_WR
|
||||||
spiffs_fflush_cache(fs, fh);
|
spiffs_fflush_cache(fs, fh);
|
||||||
#endif
|
#endif
|
||||||
@ -347,6 +365,7 @@ s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len) {
|
|||||||
s32_t res;
|
s32_t res;
|
||||||
u32_t offset;
|
u32_t offset;
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fd_get(fs, fh, &fd);
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
@ -464,6 +483,7 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) {
|
|||||||
|
|
||||||
spiffs_fd *fd;
|
spiffs_fd *fd;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fd_get(fs, fh, &fd);
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
SPIFFS_API_CHECK_RES(fs, res);
|
SPIFFS_API_CHECK_RES(fs, res);
|
||||||
|
|
||||||
@ -502,7 +522,7 @@ s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence) {
|
|||||||
return offs;
|
return offs;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32_t SPIFFS_remove(spiffs *fs, char *path) {
|
s32_t SPIFFS_remove(spiffs *fs, const char *path) {
|
||||||
SPIFFS_API_CHECK_CFG(fs);
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
SPIFFS_API_CHECK_MOUNT(fs);
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
@ -514,7 +534,7 @@ s32_t SPIFFS_remove(spiffs *fs, char *path) {
|
|||||||
res = spiffs_fd_find_new(fs, &fd);
|
res = spiffs_fd_find_new(fs, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
res = spiffs_object_find_object_index_header_by_name(fs, (u8_t *)path, &pix);
|
res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t*)path, &pix);
|
||||||
if (res != SPIFFS_OK) {
|
if (res != SPIFFS_OK) {
|
||||||
spiffs_fd_return(fs, fd->file_nbr);
|
spiffs_fd_return(fs, fd->file_nbr);
|
||||||
}
|
}
|
||||||
@ -543,6 +563,7 @@ s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh) {
|
|||||||
|
|
||||||
spiffs_fd *fd;
|
spiffs_fd *fd;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fd_get(fs, fh, &fd);
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
@ -586,7 +607,7 @@ static s32_t spiffs_stat_pix(spiffs *fs, spiffs_page_ix pix, spiffs_file fh, spi
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32_t SPIFFS_stat(spiffs *fs, char *path, spiffs_stat *s) {
|
s32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s) {
|
||||||
SPIFFS_API_CHECK_CFG(fs);
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
SPIFFS_API_CHECK_MOUNT(fs);
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
@ -594,7 +615,7 @@ s32_t SPIFFS_stat(spiffs *fs, char *path, spiffs_stat *s) {
|
|||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_page_ix pix;
|
spiffs_page_ix pix;
|
||||||
|
|
||||||
res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)path, &pix);
|
res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t*)path, &pix);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
res = spiffs_stat_pix(fs, pix, 0, s);
|
res = spiffs_stat_pix(fs, pix, 0, s);
|
||||||
@ -612,6 +633,7 @@ s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s) {
|
|||||||
spiffs_fd *fd;
|
spiffs_fd *fd;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fd_get(fs, fh, &fd);
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
@ -669,6 +691,7 @@ s32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh) {
|
|||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
#if SPIFFS_CACHE_WR
|
#if SPIFFS_CACHE_WR
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
res = spiffs_fflush_cache(fs, fh);
|
res = spiffs_fflush_cache(fs, fh);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs,res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs,res);
|
||||||
SPIFFS_UNLOCK(fs);
|
SPIFFS_UNLOCK(fs);
|
||||||
@ -684,6 +707,7 @@ s32_t SPIFFS_close(spiffs *fs, spiffs_file fh) {
|
|||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
#if SPIFFS_CACHE
|
#if SPIFFS_CACHE
|
||||||
res = spiffs_fflush_cache(fs, fh);
|
res = spiffs_fflush_cache(fs, fh);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
@ -696,7 +720,7 @@ s32_t SPIFFS_close(spiffs *fs, spiffs_file fh) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
s32_t SPIFFS_rename(spiffs *fs, const char *old, const char *new) {
|
||||||
SPIFFS_API_CHECK_CFG(fs);
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
SPIFFS_API_CHECK_MOUNT(fs);
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
SPIFFS_LOCK(fs);
|
SPIFFS_LOCK(fs);
|
||||||
@ -704,10 +728,10 @@ s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|||||||
spiffs_page_ix pix_old, pix_dummy;
|
spiffs_page_ix pix_old, pix_dummy;
|
||||||
spiffs_fd *fd;
|
spiffs_fd *fd;
|
||||||
|
|
||||||
s32_t res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)old, &pix_old);
|
s32_t res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t*)old, &pix_old);
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
res = spiffs_object_find_object_index_header_by_name(fs, (u8_t*)new, &pix_dummy);
|
res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t*)new, &pix_dummy);
|
||||||
if (res == SPIFFS_ERR_NOT_FOUND) {
|
if (res == SPIFFS_ERR_NOT_FOUND) {
|
||||||
res = SPIFFS_OK;
|
res = SPIFFS_OK;
|
||||||
} else if (res == SPIFFS_OK) {
|
} else if (res == SPIFFS_OK) {
|
||||||
@ -724,7 +748,7 @@ s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|||||||
}
|
}
|
||||||
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, (u8_t*)new,
|
res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, (const u8_t*)new,
|
||||||
0, &pix_dummy);
|
0, &pix_dummy);
|
||||||
|
|
||||||
spiffs_fd_return(fs, fd->file_nbr);
|
spiffs_fd_return(fs, fd->file_nbr);
|
||||||
@ -736,7 +760,7 @@ s32_t SPIFFS_rename(spiffs *fs, char *old, char *new) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
spiffs_DIR *SPIFFS_opendir(spiffs *fs, char *name, spiffs_DIR *d) {
|
spiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d) {
|
||||||
(void)name;
|
(void)name;
|
||||||
|
|
||||||
if (!SPIFFS_CHECK_CFG((fs))) {
|
if (!SPIFFS_CHECK_CFG((fs))) {
|
||||||
@ -760,9 +784,9 @@ static s32_t spiffs_read_dir_v(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_block_ix bix,
|
spiffs_block_ix bix,
|
||||||
int ix_entry,
|
int ix_entry,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p) {
|
void *user_var_p) {
|
||||||
(void)user_data;
|
(void)user_const_p;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_page_object_ix_header objix_hdr;
|
spiffs_page_object_ix_header objix_hdr;
|
||||||
if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED ||
|
if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED ||
|
||||||
@ -778,7 +802,7 @@ static s32_t spiffs_read_dir_v(
|
|||||||
objix_hdr.p_hdr.span_ix == 0 &&
|
objix_hdr.p_hdr.span_ix == 0 &&
|
||||||
(objix_hdr.p_hdr.flags& (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
(objix_hdr.p_hdr.flags& (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
||||||
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
||||||
struct spiffs_dirent *e = (struct spiffs_dirent *)user_p;
|
struct spiffs_dirent *e = (struct spiffs_dirent*)user_var_p;
|
||||||
e->obj_id = obj_id;
|
e->obj_id = obj_id;
|
||||||
strcpy((char *)e->name, (char *)objix_hdr.name);
|
strcpy((char *)e->name, (char *)objix_hdr.name);
|
||||||
e->type = objix_hdr.type;
|
e->type = objix_hdr.type;
|
||||||
@ -898,6 +922,52 @@ s32_t SPIFFS_gc(spiffs *fs, u32_t size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32_t SPIFFS_eof(spiffs *fs, spiffs_file fh) {
|
||||||
|
s32_t res;
|
||||||
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
|
SPIFFS_LOCK(fs);
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
|
|
||||||
|
spiffs_fd *fd;
|
||||||
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
|
#if SPIFFS_CACHE_WR
|
||||||
|
res = spiffs_fflush_cache(fs, fh);
|
||||||
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
res = (fd->fdoffset == fd->size);
|
||||||
|
|
||||||
|
SPIFFS_UNLOCK(fs);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32_t SPIFFS_tell(spiffs *fs, spiffs_file fh) {
|
||||||
|
s32_t res;
|
||||||
|
SPIFFS_API_CHECK_CFG(fs);
|
||||||
|
SPIFFS_API_CHECK_MOUNT(fs);
|
||||||
|
SPIFFS_LOCK(fs);
|
||||||
|
|
||||||
|
fh = SPIFFS_FH_UNOFFS(fs, fh);
|
||||||
|
|
||||||
|
spiffs_fd *fd;
|
||||||
|
res = spiffs_fd_get(fs, fh, &fd);
|
||||||
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
|
||||||
|
#if SPIFFS_CACHE_WR
|
||||||
|
res = spiffs_fflush_cache(fs, fh);
|
||||||
|
SPIFFS_API_CHECK_RES_UNLOCK(fs, res);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
res = fd->fdoffset;
|
||||||
|
|
||||||
|
SPIFFS_UNLOCK(fs);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if SPIFFS_TEST_VISUALISATION
|
#if SPIFFS_TEST_VISUALISATION
|
||||||
s32_t SPIFFS_vis(spiffs *fs) {
|
s32_t SPIFFS_vis(spiffs *fs) {
|
||||||
|
@ -101,7 +101,7 @@ s32_t spiffs_phys_cpy(
|
|||||||
|
|
||||||
// Find object lookup entry containing given id with visitor.
|
// Find object lookup entry containing given id with visitor.
|
||||||
// Iterate over object lookup pages in each block until a given object id entry is found.
|
// Iterate over object lookup pages in each block until a given object id entry is found.
|
||||||
// When found, the visitor function is called with block index, entry index and user_data.
|
// When found, the visitor function is called with block index, entry index and user data.
|
||||||
// If visitor returns SPIFFS_VIS_CONTINUE, the search goes on. Otherwise, the search will be
|
// If visitor returns SPIFFS_VIS_CONTINUE, the search goes on. Otherwise, the search will be
|
||||||
// ended and visitor's return code is returned to caller.
|
// ended and visitor's return code is returned to caller.
|
||||||
// If no visitor is given (0) the search returns on first entry with matching object id.
|
// If no visitor is given (0) the search returns on first entry with matching object id.
|
||||||
@ -113,8 +113,8 @@ s32_t spiffs_phys_cpy(
|
|||||||
// SPIFFS_VIS_NO_WRAP
|
// SPIFFS_VIS_NO_WRAP
|
||||||
// @param obj_id argument object id
|
// @param obj_id argument object id
|
||||||
// @param v visitor callback function
|
// @param v visitor callback function
|
||||||
// @param user_data any data, passed to the callback visitor function
|
// @param user_const_p any const pointer, passed to the callback visitor function
|
||||||
// @param user_p any pointer, passed to the callback visitor function
|
// @param user_var_p any pointer, passed to the callback visitor function
|
||||||
// @param block_ix reported block index where match was found
|
// @param block_ix reported block index where match was found
|
||||||
// @param lu_entry reported look up index where match was found
|
// @param lu_entry reported look up index where match was found
|
||||||
s32_t spiffs_obj_lu_find_entry_visitor(
|
s32_t spiffs_obj_lu_find_entry_visitor(
|
||||||
@ -124,8 +124,8 @@ s32_t spiffs_obj_lu_find_entry_visitor(
|
|||||||
u8_t flags,
|
u8_t flags,
|
||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_visitor_f v,
|
spiffs_visitor_f v,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p,
|
void *user_var_p,
|
||||||
spiffs_block_ix *block_ix,
|
spiffs_block_ix *block_ix,
|
||||||
int *lu_entry) {
|
int *lu_entry) {
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
@ -175,8 +175,8 @@ s32_t spiffs_obj_lu_find_entry_visitor(
|
|||||||
(flags & SPIFFS_VIS_CHECK_PH) ? obj_id : obj_lu_buf[cur_entry-entry_offset],
|
(flags & SPIFFS_VIS_CHECK_PH) ? obj_id : obj_lu_buf[cur_entry-entry_offset],
|
||||||
cur_block,
|
cur_block,
|
||||||
cur_entry,
|
cur_entry,
|
||||||
user_data,
|
user_const_p,
|
||||||
user_p);
|
user_var_p);
|
||||||
if (res == SPIFFS_VIS_COUNTINUE || res == SPIFFS_VIS_COUNTINUE_RELOAD) {
|
if (res == SPIFFS_VIS_COUNTINUE || res == SPIFFS_VIS_COUNTINUE_RELOAD) {
|
||||||
if (res == SPIFFS_VIS_COUNTINUE_RELOAD) {
|
if (res == SPIFFS_VIS_COUNTINUE_RELOAD) {
|
||||||
res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,
|
res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,
|
||||||
@ -264,11 +264,11 @@ static s32_t spiffs_obj_lu_scan_v(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_block_ix bix,
|
spiffs_block_ix bix,
|
||||||
int ix_entry,
|
int ix_entry,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p) {
|
void *user_var_p) {
|
||||||
(void)bix;
|
(void)bix;
|
||||||
(void)user_data;
|
(void)user_const_p;
|
||||||
(void)user_p;
|
(void)user_var_p;
|
||||||
if (obj_id == SPIFFS_OBJ_ID_FREE) {
|
if (obj_id == SPIFFS_OBJ_ID_FREE) {
|
||||||
if (ix_entry == 0) {
|
if (ix_entry == 0) {
|
||||||
fs->free_blocks++;
|
fs->free_blocks++;
|
||||||
@ -409,11 +409,11 @@ s32_t spiffs_obj_lu_find_free(
|
|||||||
fs->free_blocks--;
|
fs->free_blocks--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (res == SPIFFS_VIS_END) {
|
if (res == SPIFFS_ERR_FULL) {
|
||||||
SPIFFS_DBG("fs full\n");
|
SPIFFS_DBG("fs full\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return res == SPIFFS_VIS_END ? SPIFFS_ERR_FULL : res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find object lookup entry containing given id
|
// Find object lookup entry containing given id
|
||||||
@ -439,8 +439,8 @@ static s32_t spiffs_obj_lu_find_id_and_span_v(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_block_ix bix,
|
spiffs_block_ix bix,
|
||||||
int ix_entry,
|
int ix_entry,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p) {
|
void *user_var_p) {
|
||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_page_header ph;
|
spiffs_page_header ph;
|
||||||
spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);
|
spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);
|
||||||
@ -448,10 +448,10 @@ static s32_t spiffs_obj_lu_find_id_and_span_v(
|
|||||||
SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_header), (u8_t *)&ph);
|
SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_header), (u8_t *)&ph);
|
||||||
SPIFFS_CHECK_RES(res);
|
SPIFFS_CHECK_RES(res);
|
||||||
if (ph.obj_id == obj_id &&
|
if (ph.obj_id == obj_id &&
|
||||||
ph.span_ix == (spiffs_span_ix)user_data &&
|
ph.span_ix == *((spiffs_span_ix*)user_var_p) &&
|
||||||
(ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET &&
|
(ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET &&
|
||||||
!((obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (ph.flags & SPIFFS_PH_FLAG_IXDELE) == 0 && ph.span_ix == 0) &&
|
!((obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (ph.flags & SPIFFS_PH_FLAG_IXDELE) == 0 && ph.span_ix == 0) &&
|
||||||
(user_p == 0 || *((spiffs_page_ix *)user_p) != pix)) {
|
(user_const_p == 0 || *((const spiffs_page_ix*)user_const_p) != pix)) {
|
||||||
return SPIFFS_OK;
|
return SPIFFS_OK;
|
||||||
} else {
|
} else {
|
||||||
return SPIFFS_VIS_COUNTINUE;
|
return SPIFFS_VIS_COUNTINUE;
|
||||||
@ -476,8 +476,8 @@ s32_t spiffs_obj_lu_find_id_and_span(
|
|||||||
SPIFFS_VIS_CHECK_ID,
|
SPIFFS_VIS_CHECK_ID,
|
||||||
obj_id,
|
obj_id,
|
||||||
spiffs_obj_lu_find_id_and_span_v,
|
spiffs_obj_lu_find_id_and_span_v,
|
||||||
(u32_t)spix,
|
|
||||||
exclusion_pix ? &exclusion_pix : 0,
|
exclusion_pix ? &exclusion_pix : 0,
|
||||||
|
&spix,
|
||||||
&bix,
|
&bix,
|
||||||
&entry);
|
&entry);
|
||||||
|
|
||||||
@ -515,8 +515,8 @@ s32_t spiffs_obj_lu_find_id_and_span_by_phdr(
|
|||||||
SPIFFS_VIS_CHECK_PH,
|
SPIFFS_VIS_CHECK_PH,
|
||||||
obj_id,
|
obj_id,
|
||||||
spiffs_obj_lu_find_id_and_span_v,
|
spiffs_obj_lu_find_id_and_span_v,
|
||||||
(u32_t)spix,
|
|
||||||
exclusion_pix ? &exclusion_pix : 0,
|
exclusion_pix ? &exclusion_pix : 0,
|
||||||
|
&spix,
|
||||||
&bix,
|
&bix,
|
||||||
&entry);
|
&entry);
|
||||||
|
|
||||||
@ -690,7 +690,7 @@ s32_t spiffs_page_delete(
|
|||||||
s32_t spiffs_object_create(
|
s32_t spiffs_object_create(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
spiffs_obj_type type,
|
spiffs_obj_type type,
|
||||||
spiffs_page_ix *objix_hdr_pix) {
|
spiffs_page_ix *objix_hdr_pix) {
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
@ -721,7 +721,7 @@ s32_t spiffs_object_create(
|
|||||||
oix_hdr.p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED);
|
oix_hdr.p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED);
|
||||||
oix_hdr.type = type;
|
oix_hdr.type = type;
|
||||||
oix_hdr.size = SPIFFS_UNDEFINED_LEN; // keep ones so we can update later without wasting this page
|
oix_hdr.size = SPIFFS_UNDEFINED_LEN; // keep ones so we can update later without wasting this page
|
||||||
strncpy((char *)&oix_hdr.name, (char *)name, SPIFFS_OBJ_NAME_LEN);
|
strncpy((char*)&oix_hdr.name, (const char*)name, SPIFFS_OBJ_NAME_LEN);
|
||||||
|
|
||||||
|
|
||||||
// update page
|
// update page
|
||||||
@ -748,7 +748,7 @@ s32_t spiffs_object_update_index_hdr(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_page_ix objix_hdr_pix,
|
spiffs_page_ix objix_hdr_pix,
|
||||||
u8_t *new_objix_hdr_data,
|
u8_t *new_objix_hdr_data,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
u32_t size,
|
u32_t size,
|
||||||
spiffs_page_ix *new_pix) {
|
spiffs_page_ix *new_pix) {
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
@ -772,7 +772,7 @@ s32_t spiffs_object_update_index_hdr(
|
|||||||
|
|
||||||
// change name
|
// change name
|
||||||
if (name) {
|
if (name) {
|
||||||
strncpy((char *)objix_hdr->name, (char *)name, SPIFFS_OBJ_NAME_LEN);
|
strncpy((char*)objix_hdr->name, (const char*)name, SPIFFS_OBJ_NAME_LEN);
|
||||||
}
|
}
|
||||||
if (size) {
|
if (size) {
|
||||||
objix_hdr->size = size;
|
objix_hdr->size = size;
|
||||||
@ -1335,9 +1335,9 @@ static s32_t spiffs_object_find_object_index_header_by_name_v(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_block_ix bix,
|
spiffs_block_ix bix,
|
||||||
int ix_entry,
|
int ix_entry,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p) {
|
void *user_var_p) {
|
||||||
(void)user_data;
|
(void)user_var_p;
|
||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_page_object_ix_header objix_hdr;
|
spiffs_page_object_ix_header objix_hdr;
|
||||||
spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);
|
spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);
|
||||||
@ -1351,7 +1351,7 @@ static s32_t spiffs_object_find_object_index_header_by_name_v(
|
|||||||
if (objix_hdr.p_hdr.span_ix == 0 &&
|
if (objix_hdr.p_hdr.span_ix == 0 &&
|
||||||
(objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
(objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
||||||
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
||||||
if (strcmp((char *)user_p, (char *)objix_hdr.name) == 0) {
|
if (strcmp((const char*)user_const_p, (char*)objix_hdr.name) == 0) {
|
||||||
return SPIFFS_OK;
|
return SPIFFS_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1362,7 +1362,7 @@ static s32_t spiffs_object_find_object_index_header_by_name_v(
|
|||||||
// Finds object index header page by name
|
// Finds object index header page by name
|
||||||
s32_t spiffs_object_find_object_index_header_by_name(
|
s32_t spiffs_object_find_object_index_header_by_name(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
spiffs_page_ix *pix) {
|
spiffs_page_ix *pix) {
|
||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_block_ix bix;
|
spiffs_block_ix bix;
|
||||||
@ -1374,8 +1374,8 @@ s32_t spiffs_object_find_object_index_header_by_name(
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
spiffs_object_find_object_index_header_by_name_v,
|
spiffs_object_find_object_index_header_by_name_v,
|
||||||
0,
|
|
||||||
name,
|
name,
|
||||||
|
0,
|
||||||
&bix,
|
&bix,
|
||||||
&entry);
|
&entry);
|
||||||
|
|
||||||
@ -1402,7 +1402,8 @@ s32_t spiffs_object_truncate(
|
|||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
spiffs *fs = fd->fs;
|
spiffs *fs = fd->fs;
|
||||||
|
|
||||||
res = spiffs_gc_check(fs, remove ? 0 : SPIFFS_DATA_PAGE_SIZE(fs));
|
// need 2 pages if not removing: object index page + possibly chopped data page
|
||||||
|
res = spiffs_gc_check(fs, remove ? 0 : SPIFFS_DATA_PAGE_SIZE(fs) * 2);
|
||||||
SPIFFS_CHECK_RES(res);
|
SPIFFS_CHECK_RES(res);
|
||||||
|
|
||||||
spiffs_page_ix objix_pix = fd->objix_hdr_pix;
|
spiffs_page_ix objix_pix = fd->objix_hdr_pix;
|
||||||
@ -1482,7 +1483,7 @@ s32_t spiffs_object_truncate(
|
|||||||
|
|
||||||
SPIFFS_DBG("truncate: got data pix %04x\n", data_pix);
|
SPIFFS_DBG("truncate: got data pix %04x\n", data_pix);
|
||||||
|
|
||||||
if (cur_size - SPIFFS_DATA_PAGE_SIZE(fs) >= new_size) {
|
if (new_size == 0 || remove || cur_size - new_size >= SPIFFS_DATA_PAGE_SIZE(fs)) {
|
||||||
// delete full data page
|
// delete full data page
|
||||||
res = spiffs_page_data_check(fs, fd, data_pix, data_spix);
|
res = spiffs_page_data_check(fs, fd, data_pix, data_spix);
|
||||||
if (res != SPIFFS_ERR_DELETED && res != SPIFFS_OK && res != SPIFFS_ERR_INDEX_REF_FREE) {
|
if (res != SPIFFS_ERR_DELETED && res != SPIFFS_OK && res != SPIFFS_ERR_INDEX_REF_FREE) {
|
||||||
@ -1701,10 +1702,10 @@ typedef struct {
|
|||||||
} spiffs_free_obj_id_state;
|
} spiffs_free_obj_id_state;
|
||||||
|
|
||||||
static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
||||||
u32_t user_data, void *user_p) {
|
const void *user_const_p, void *user_var_p) {
|
||||||
if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED) {
|
if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED) {
|
||||||
spiffs_obj_id min_obj_id = user_data;
|
spiffs_obj_id min_obj_id = *((spiffs_obj_id*)user_var_p);
|
||||||
u8_t *conflicting_name = (u8_t *)user_p;
|
const u8_t *conflicting_name = (const u8_t*)user_const_p;
|
||||||
|
|
||||||
// if conflicting name parameter is given, also check if this name is found in object index hdrs
|
// if conflicting name parameter is given, also check if this name is found in object index hdrs
|
||||||
if (conflicting_name && (id & SPIFFS_OBJ_ID_IX_FLAG)) {
|
if (conflicting_name && (id & SPIFFS_OBJ_ID_IX_FLAG)) {
|
||||||
@ -1717,7 +1718,7 @@ static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id i
|
|||||||
if (objix_hdr.p_hdr.span_ix == 0 &&
|
if (objix_hdr.p_hdr.span_ix == 0 &&
|
||||||
(objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
(objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==
|
||||||
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) {
|
||||||
if (strcmp((char *)user_p, (char *)objix_hdr.name) == 0) {
|
if (strcmp((const char*)user_const_p, (char*)objix_hdr.name) == 0) {
|
||||||
return SPIFFS_ERR_CONFLICTING_NAME;
|
return SPIFFS_ERR_CONFLICTING_NAME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1734,11 +1735,11 @@ static s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id i
|
|||||||
}
|
}
|
||||||
|
|
||||||
static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
||||||
u32_t user_data, void *user_p) {
|
const void *user_const_p, void *user_var_p) {
|
||||||
(void)user_data;
|
(void)user_var_p;
|
||||||
if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED && (id & SPIFFS_OBJ_ID_IX_FLAG)) {
|
if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED && (id & SPIFFS_OBJ_ID_IX_FLAG)) {
|
||||||
s32_t res;
|
s32_t res;
|
||||||
spiffs_free_obj_id_state *state = (spiffs_free_obj_id_state *)user_p;
|
const spiffs_free_obj_id_state *state = (const spiffs_free_obj_id_state*)user_const_p;
|
||||||
spiffs_page_object_ix_header objix_hdr;
|
spiffs_page_object_ix_header objix_hdr;
|
||||||
|
|
||||||
res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,
|
res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,
|
||||||
@ -1766,10 +1767,10 @@ static s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id
|
|||||||
// Scans thru all object lookup for object index header pages. If total possible number of
|
// Scans thru all object lookup for object index header pages. If total possible number of
|
||||||
// object ids cannot fit into a work buffer, these are grouped. When a group containing free
|
// object ids cannot fit into a work buffer, these are grouped. When a group containing free
|
||||||
// object ids is found, the object lu is again scanned for object ids within group and bitmasked.
|
// object ids is found, the object lu is again scanned for object ids within group and bitmasked.
|
||||||
// Finally, the bitmasked is searched for a free id
|
// Finally, the bitmask is searched for a free id
|
||||||
s32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id, u8_t *conflicting_name) {
|
s32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id, const u8_t *conflicting_name) {
|
||||||
s32_t res = SPIFFS_OK;
|
s32_t res = SPIFFS_OK;
|
||||||
u32_t max_objects = (SPIFFS_CFG_PHYS_SZ(fs) / (u32_t)SPIFFS_CFG_LOG_PAGE_SZ(fs)) / 2;
|
u32_t max_objects = (fs->block_count * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) / 2;
|
||||||
spiffs_free_obj_id_state state;
|
spiffs_free_obj_id_state state;
|
||||||
spiffs_obj_id free_obj_id = SPIFFS_OBJ_ID_FREE;
|
spiffs_obj_id free_obj_id = SPIFFS_OBJ_ID_FREE;
|
||||||
state.min_obj_id = 1;
|
state.min_obj_id = 1;
|
||||||
@ -1786,8 +1787,8 @@ s32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id, u8_t *co
|
|||||||
SPIFFS_DBG("free_obj_id: BITM min:%04x max:%04x\n", state.min_obj_id, state.max_obj_id);
|
SPIFFS_DBG("free_obj_id: BITM min:%04x max:%04x\n", state.min_obj_id, state.max_obj_id);
|
||||||
|
|
||||||
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
||||||
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_bitmap_v, state.min_obj_id,
|
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_bitmap_v,
|
||||||
conflicting_name, 0, 0);
|
conflicting_name, &state.min_obj_id, 0, 0);
|
||||||
if (res == SPIFFS_VIS_END) res = SPIFFS_OK;
|
if (res == SPIFFS_VIS_END) res = SPIFFS_OK;
|
||||||
SPIFFS_CHECK_RES(res);
|
SPIFFS_CHECK_RES(res);
|
||||||
// traverse bitmask until found free obj_id
|
// traverse bitmask until found free obj_id
|
||||||
@ -1851,7 +1852,7 @@ s32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id, u8_t *co
|
|||||||
SPIFFS_DBG("free_obj_id: COMP min:%04x max:%04x compact:%i\n", state.min_obj_id, state.max_obj_id, state.compaction);
|
SPIFFS_DBG("free_obj_id: COMP min:%04x max:%04x compact:%i\n", state.min_obj_id, state.max_obj_id, state.compaction);
|
||||||
|
|
||||||
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));
|
||||||
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_compact_v, 0, &state, 0, 0);
|
res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_compact_v, &state, 0, 0, 0);
|
||||||
if (res == SPIFFS_VIS_END) res = SPIFFS_OK;
|
if (res == SPIFFS_VIS_END) res = SPIFFS_OK;
|
||||||
SPIFFS_CHECK_RES(res);
|
SPIFFS_CHECK_RES(res);
|
||||||
state.conflicting_name = 0; // searched for conflicting name once, no need to do it again
|
state.conflicting_name = 0; // searched for conflicting name once, no need to do it again
|
||||||
|
@ -460,7 +460,7 @@ typedef struct __attribute(( packed )) {
|
|||||||
|
|
||||||
// callback func for object lookup visitor
|
// callback func for object lookup visitor
|
||||||
typedef s32_t (*spiffs_visitor_f)(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
typedef s32_t (*spiffs_visitor_f)(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,
|
||||||
u32_t user_data, void *user_p);
|
const void *user_const_p, void *user_var_p);
|
||||||
|
|
||||||
|
|
||||||
#if SPIFFS_CACHE
|
#if SPIFFS_CACHE
|
||||||
@ -521,8 +521,8 @@ s32_t spiffs_obj_lu_find_entry_visitor(
|
|||||||
u8_t flags,
|
u8_t flags,
|
||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_visitor_f v,
|
spiffs_visitor_f v,
|
||||||
u32_t user_data,
|
const void *user_const_p,
|
||||||
void *user_p,
|
void *user_var_p,
|
||||||
spiffs_block_ix *block_ix,
|
spiffs_block_ix *block_ix,
|
||||||
int *lu_entry);
|
int *lu_entry);
|
||||||
|
|
||||||
@ -538,7 +538,7 @@ s32_t spiffs_obj_lu_scan(
|
|||||||
s32_t spiffs_obj_lu_find_free_obj_id(
|
s32_t spiffs_obj_lu_find_free_obj_id(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
spiffs_obj_id *obj_id,
|
spiffs_obj_id *obj_id,
|
||||||
u8_t *conflicting_name);
|
const u8_t *conflicting_name);
|
||||||
|
|
||||||
s32_t spiffs_obj_lu_find_free(
|
s32_t spiffs_obj_lu_find_free(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
@ -599,7 +599,7 @@ s32_t spiffs_page_delete(
|
|||||||
s32_t spiffs_object_create(
|
s32_t spiffs_object_create(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
spiffs_obj_type type,
|
spiffs_obj_type type,
|
||||||
spiffs_page_ix *objix_hdr_pix);
|
spiffs_page_ix *objix_hdr_pix);
|
||||||
|
|
||||||
@ -609,7 +609,7 @@ s32_t spiffs_object_update_index_hdr(
|
|||||||
spiffs_obj_id obj_id,
|
spiffs_obj_id obj_id,
|
||||||
spiffs_page_ix objix_hdr_pix,
|
spiffs_page_ix objix_hdr_pix,
|
||||||
u8_t *new_objix_hdr_data,
|
u8_t *new_objix_hdr_data,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
u32_t size,
|
u32_t size,
|
||||||
spiffs_page_ix *new_pix);
|
spiffs_page_ix *new_pix);
|
||||||
|
|
||||||
@ -661,7 +661,7 @@ s32_t spiffs_object_truncate(
|
|||||||
|
|
||||||
s32_t spiffs_object_find_object_index_header_by_name(
|
s32_t spiffs_object_find_object_index_header_by_name(
|
||||||
spiffs *fs,
|
spiffs *fs,
|
||||||
u8_t name[SPIFFS_OBJ_NAME_LEN],
|
const u8_t name[SPIFFS_OBJ_NAME_LEN],
|
||||||
spiffs_page_ix *pix);
|
spiffs_page_ix *pix);
|
||||||
|
|
||||||
// ---------------
|
// ---------------
|
||||||
|
@ -63,11 +63,7 @@ public:
|
|||||||
DirImplPtr openDir(const char* path) override;
|
DirImplPtr openDir(const char* path) override;
|
||||||
|
|
||||||
bool rename(const char* pathFrom, const char* pathTo) override {
|
bool rename(const char* pathFrom, const char* pathTo) override {
|
||||||
char tmpNameFrom[SPIFFS_OBJ_NAME_LEN];
|
auto rc = SPIFFS_rename(&_fs, pathFrom, pathTo);
|
||||||
strlcpy(tmpNameFrom, pathFrom, sizeof(tmpNameFrom));
|
|
||||||
char tmpNameTo[SPIFFS_OBJ_NAME_LEN];
|
|
||||||
strlcpy(tmpNameTo, pathTo, sizeof(tmpNameTo));
|
|
||||||
auto rc = SPIFFS_rename(&_fs, tmpNameFrom, tmpNameTo);
|
|
||||||
if (rc != SPIFFS_OK) {
|
if (rc != SPIFFS_OK) {
|
||||||
DEBUGV("SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n", rc,
|
DEBUGV("SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n", rc,
|
||||||
pathFrom, pathTo);
|
pathFrom, pathTo);
|
||||||
@ -76,10 +72,17 @@ public:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool info(uint32_t *total, uint32_t *used) override{
|
||||||
|
auto rc = SPIFFS_info(&_fs, total, used);
|
||||||
|
if (rc != SPIFFS_OK) {
|
||||||
|
DEBUGV("SPIFFS_format: rc=%d, err=%d\r\n", rc, _fs.err_code);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool remove(const char* path) override {
|
bool remove(const char* path) override {
|
||||||
char tmpName[SPIFFS_OBJ_NAME_LEN];
|
auto rc = SPIFFS_remove(&_fs, path);
|
||||||
strlcpy(tmpName, path, sizeof(tmpName));
|
|
||||||
auto rc = SPIFFS_remove(&_fs, tmpName);
|
|
||||||
if (rc != SPIFFS_OK) {
|
if (rc != SPIFFS_OK) {
|
||||||
DEBUGV("SPIFFS_remove: rc=%d path=`%s`\r\n", rc, path);
|
DEBUGV("SPIFFS_remove: rc=%d path=`%s`\r\n", rc, path);
|
||||||
return false;
|
return false;
|
||||||
@ -91,6 +94,10 @@ public:
|
|||||||
if (SPIFFS_mounted(&_fs) != 0) {
|
if (SPIFFS_mounted(&_fs) != 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (_size == 0) {
|
||||||
|
DEBUGV("SPIFFS size is zero");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (_tryMount()) {
|
if (_tryMount()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -103,6 +110,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool format() override {
|
bool format() override {
|
||||||
|
if (_size == 0) {
|
||||||
|
DEBUGV("SPIFFS size is zero");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool wasMounted = (SPIFFS_mounted(&_fs) != 0);
|
bool wasMounted = (SPIFFS_mounted(&_fs) != 0);
|
||||||
|
|
||||||
if (_tryMount()) {
|
if (_tryMount()) {
|
||||||
@ -393,9 +405,7 @@ protected:
|
|||||||
|
|
||||||
FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode accessMode) {
|
FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode accessMode) {
|
||||||
int mode = getSpiffsMode(openMode, accessMode);
|
int mode = getSpiffsMode(openMode, accessMode);
|
||||||
char tmpName[SPIFFS_OBJ_NAME_LEN];
|
int fd = SPIFFS_open(&_fs, path, mode, 0);
|
||||||
strlcpy(tmpName, path, sizeof(tmpName));
|
|
||||||
int fd = SPIFFS_open(&_fs, tmpName, mode, 0);
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
DEBUGV("SPIFFSImpl::open: fd=%d path=`%s` openMode=%d accessMode=%d err=%d\r\n",
|
DEBUGV("SPIFFSImpl::open: fd=%d path=`%s` openMode=%d accessMode=%d err=%d\r\n",
|
||||||
fd, path, openMode, accessMode, _fs.err_code);
|
fd, path, openMode, accessMode, _fs.err_code);
|
||||||
@ -405,18 +415,14 @@ FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode acc
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool SPIFFSImpl::exists(const char* path) {
|
bool SPIFFSImpl::exists(const char* path) {
|
||||||
char tmpName[SPIFFS_OBJ_NAME_LEN];
|
|
||||||
strlcpy(tmpName, path, sizeof(tmpName));
|
|
||||||
spiffs_stat stat;
|
spiffs_stat stat;
|
||||||
int rc = SPIFFS_stat(&_fs, tmpName, &stat);
|
int rc = SPIFFS_stat(&_fs, path, &stat);
|
||||||
return rc == SPIFFS_OK;
|
return rc == SPIFFS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
DirImplPtr SPIFFSImpl::openDir(const char* path) {
|
DirImplPtr SPIFFSImpl::openDir(const char* path) {
|
||||||
spiffs_DIR dir;
|
spiffs_DIR dir;
|
||||||
char tmpName[SPIFFS_OBJ_NAME_LEN];
|
spiffs_DIR* result = SPIFFS_opendir(&_fs, path, &dir);
|
||||||
strlcpy(tmpName, path, sizeof(tmpName));
|
|
||||||
spiffs_DIR* result = SPIFFS_opendir(&_fs, tmpName, &dir);
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
DEBUGV("SPIFFSImpl::openDir: path=`%s` err=%d\r\n", path, _fs.err_code);
|
DEBUGV("SPIFFSImpl::openDir: path=`%s` err=%d\r\n", path, _fs.err_code);
|
||||||
return DirImplPtr();
|
return DirImplPtr();
|
||||||
|
@ -109,10 +109,11 @@ int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (addr < alignedBegin) {
|
if (addr < alignedBegin) {
|
||||||
uint32_t nb = alignedBegin - addr;
|
uint32_t ofs = alignedBegin - addr;
|
||||||
uint32_t tmp = 0xffffffff;
|
uint32_t nb = (size < ofs) ? size : ofs;
|
||||||
memcpy(((uint8_t* )&tmp) + 4 - nb, src, nb);
|
uint8_t tmp[4] __attribute__((aligned(4))) = {0xff, 0xff, 0xff, 0xff};
|
||||||
if (!ESP.flashWrite(alignedBegin - 4, &tmp, 4)) {
|
memcpy(tmp + 4 - ofs, src, nb);
|
||||||
|
if (!ESP.flashWrite(alignedBegin - 4, (uint32_t*) tmp, 4)) {
|
||||||
DEBUGV("_spif_write(%d) addr=%x size=%x ab=%x ae=%x\r\n",
|
DEBUGV("_spif_write(%d) addr=%x size=%x ab=%x ae=%x\r\n",
|
||||||
__LINE__, addr, size, alignedBegin, alignedEnd);
|
__LINE__, addr, size, alignedBegin, alignedEnd);
|
||||||
return SPIFFS_ERR_INTERNAL;
|
return SPIFFS_ERR_INTERNAL;
|
||||||
|
@ -67,7 +67,7 @@ void ArduinoOTA::handle() {
|
|||||||
|
|
||||||
WiFiUDP::stopAll();
|
WiFiUDP::stopAll();
|
||||||
|
|
||||||
if(!Update.begin(size)){
|
if(!Update.begin(size, cmd)){
|
||||||
if (_serial_debug)
|
if (_serial_debug)
|
||||||
Serial.println("Update Begin Error");
|
Serial.println("Update Begin Error");
|
||||||
if (_error_callback) _error_callback();
|
if (_error_callback) _error_callback();
|
||||||
|
@ -0,0 +1,126 @@
|
|||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <WiFiClient.h>
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
|
||||||
|
const char* ssid = "........";
|
||||||
|
const char* password = "........";
|
||||||
|
|
||||||
|
ESP8266WebServer server(80);
|
||||||
|
|
||||||
|
//Check if header is present and correct
|
||||||
|
bool is_authentified(){
|
||||||
|
Serial.println("Enter is_authentified");
|
||||||
|
if (server.hasHeader("Cookie")){
|
||||||
|
Serial.print("Found cookie: ");
|
||||||
|
String cookie = server.header("Cookie");
|
||||||
|
Serial.println(cookie);
|
||||||
|
if (cookie.indexOf("ESPSESSIONID=1") != -1) {
|
||||||
|
Serial.println("Authentification Successful");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Serial.println("Authentification Failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//login page, also called for disconnect
|
||||||
|
void handleLogin(){
|
||||||
|
String msg;
|
||||||
|
if (server.hasHeader("Cookie")){
|
||||||
|
Serial.print("Found cookie: ");
|
||||||
|
String cookie = server.header("Cookie");
|
||||||
|
Serial.println(cookie);
|
||||||
|
}
|
||||||
|
if (server.hasArg("DISCONNECT")){
|
||||||
|
Serial.println("Disconnection");
|
||||||
|
String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
|
||||||
|
server.sendContent(header);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
|
||||||
|
if (server.arg("USERNAME") == "admin" && server.arg("PASSWORD") == "admin" ){
|
||||||
|
String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
|
||||||
|
server.sendContent(header);
|
||||||
|
Serial.println("Log in Successful");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
msg = "Wrong username/password! try again.";
|
||||||
|
Serial.println("Log in Failed");
|
||||||
|
}
|
||||||
|
String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
|
||||||
|
content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
|
||||||
|
content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
|
||||||
|
content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
|
||||||
|
content += "You also can go <a href='/inline'>here</a></body></html>";
|
||||||
|
server.send(200, "text/html", content);
|
||||||
|
}
|
||||||
|
|
||||||
|
//root page can be accessed only if authentification is ok
|
||||||
|
void handleRoot(){
|
||||||
|
Serial.println("Enter handleRoot");
|
||||||
|
String header;
|
||||||
|
if (!is_authentified()){
|
||||||
|
String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
|
||||||
|
server.sendContent(header);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>";
|
||||||
|
if (server.hasHeader("User-Agent")){
|
||||||
|
content += "the user agent used is : " + server.header("User-Agent") + "<br><br>";
|
||||||
|
}
|
||||||
|
content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>";
|
||||||
|
server.send(200, "text/html", content);
|
||||||
|
}
|
||||||
|
|
||||||
|
//no need authentification
|
||||||
|
void handleNotFound(){
|
||||||
|
String message = "File Not Found\n\n";
|
||||||
|
message += "URI: ";
|
||||||
|
message += server.uri();
|
||||||
|
message += "\nMethod: ";
|
||||||
|
message += (server.method() == HTTP_GET)?"GET":"POST";
|
||||||
|
message += "\nArguments: ";
|
||||||
|
message += server.args();
|
||||||
|
message += "\n";
|
||||||
|
for (uint8_t i=0; i<server.args(); i++){
|
||||||
|
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
|
||||||
|
}
|
||||||
|
server.send(404, "text/plain", message);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup(void){
|
||||||
|
Serial.begin(115200);
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
Serial.println("");
|
||||||
|
|
||||||
|
// Wait for connection
|
||||||
|
while (WiFi.status() != WL_CONNECTED) {
|
||||||
|
delay(500);
|
||||||
|
Serial.print(".");
|
||||||
|
}
|
||||||
|
Serial.println("");
|
||||||
|
Serial.print("Connected to ");
|
||||||
|
Serial.println(ssid);
|
||||||
|
Serial.print("IP address: ");
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
|
||||||
|
|
||||||
|
server.on("/", handleRoot);
|
||||||
|
server.on("/login", handleLogin);
|
||||||
|
server.on("/inline", [](){
|
||||||
|
server.send(200, "text/plain", "this works without need of authentification");
|
||||||
|
});
|
||||||
|
|
||||||
|
server.onNotFound(handleNotFound);
|
||||||
|
//here the list of headers to be recorded
|
||||||
|
const char * headerkeys[] = {"User-Agent","Cookie"} ;
|
||||||
|
size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
|
||||||
|
//ask server to track these headers
|
||||||
|
server.collectHeaders(headerkeys, headerkeyssize );
|
||||||
|
server.begin();
|
||||||
|
Serial.println("HTTP server started");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void){
|
||||||
|
server.handleClient();
|
||||||
|
}
|
@ -37,10 +37,15 @@ ESP8266WebServer::ESP8266WebServer(int port)
|
|||||||
, _lastHandler(0)
|
, _lastHandler(0)
|
||||||
, _currentArgCount(0)
|
, _currentArgCount(0)
|
||||||
, _currentArgs(0)
|
, _currentArgs(0)
|
||||||
|
,_headerKeysCount(0)
|
||||||
|
,_currentHeaders(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ESP8266WebServer::~ESP8266WebServer() {
|
ESP8266WebServer::~ESP8266WebServer() {
|
||||||
|
if (_currentHeaders)
|
||||||
|
delete[]_currentHeaders;
|
||||||
|
_headerKeysCount = 0;
|
||||||
if (!_firstHandler)
|
if (!_firstHandler)
|
||||||
return;
|
return;
|
||||||
RequestHandler* handler = _firstHandler;
|
RequestHandler* handler = _firstHandler;
|
||||||
@ -283,6 +288,48 @@ bool ESP8266WebServer::hasArg(const char* name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String ESP8266WebServer::header(const char* name) {
|
||||||
|
for (int i = 0; i < _headerKeysCount; ++i) {
|
||||||
|
if (_currentHeaders[i].key == name)
|
||||||
|
return _currentHeaders[i].value;
|
||||||
|
}
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ESP8266WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) {
|
||||||
|
_headerKeysCount = headerKeysCount;
|
||||||
|
if (_currentHeaders)
|
||||||
|
delete[]_currentHeaders;
|
||||||
|
_currentHeaders = new RequestArgument[_headerKeysCount];
|
||||||
|
for (int i = 0; i < _headerKeysCount; i++){
|
||||||
|
_currentHeaders[i].key = headerKeys[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String ESP8266WebServer::header(int i) {
|
||||||
|
if (i < _headerKeysCount)
|
||||||
|
return _currentHeaders[i].value;
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
|
||||||
|
String ESP8266WebServer::headerName(int i) {
|
||||||
|
if (i < _headerKeysCount)
|
||||||
|
return _currentHeaders[i].key;
|
||||||
|
return String();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ESP8266WebServer::headers() {
|
||||||
|
return _headerKeysCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ESP8266WebServer::hasHeader(const char* name) {
|
||||||
|
for (int i = 0; i < _headerKeysCount; ++i) {
|
||||||
|
if ((_currentHeaders[i].key == name) && (_currentHeaders[i].value.length() > 0))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
String ESP8266WebServer::hostHeader() {
|
String ESP8266WebServer::hostHeader() {
|
||||||
return _hostHeader;
|
return _hostHeader;
|
||||||
}
|
}
|
||||||
|
@ -83,6 +83,12 @@ public:
|
|||||||
String argName(int i); // get request argument name by number
|
String argName(int i); // get request argument name by number
|
||||||
int args(); // get arguments count
|
int args(); // get arguments count
|
||||||
bool hasArg(const char* name); // check if argument exists
|
bool hasArg(const char* name); // check if argument exists
|
||||||
|
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); // set the request headers to collect
|
||||||
|
String header(const char* name); // get request header value by name
|
||||||
|
String header(int i); // get request header value by number
|
||||||
|
String headerName(int i); // get request header name by number
|
||||||
|
int headers(); // get header count
|
||||||
|
bool hasHeader(const char* name); // check if header exists
|
||||||
|
|
||||||
String hostHeader(); // get request host header if available or empty String if not
|
String hostHeader(); // get request host header if available or empty String if not
|
||||||
|
|
||||||
@ -124,6 +130,7 @@ protected:
|
|||||||
void _uploadWriteByte(uint8_t b);
|
void _uploadWriteByte(uint8_t b);
|
||||||
uint8_t _uploadReadByte(WiFiClient& client);
|
uint8_t _uploadReadByte(WiFiClient& client);
|
||||||
void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength);
|
void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength);
|
||||||
|
bool _collectHeader(const char* headerName, const char* headerValue);
|
||||||
|
|
||||||
struct RequestArgument {
|
struct RequestArgument {
|
||||||
String key;
|
String key;
|
||||||
@ -140,6 +147,8 @@ protected:
|
|||||||
RequestArgument* _currentArgs;
|
RequestArgument* _currentArgs;
|
||||||
HTTPUpload _currentUpload;
|
HTTPUpload _currentUpload;
|
||||||
|
|
||||||
|
RequestArgument* _currentHeaders;
|
||||||
|
size_t _headerKeysCount;
|
||||||
size_t _contentLength;
|
size_t _contentLength;
|
||||||
String _responseHeaders;
|
String _responseHeaders;
|
||||||
|
|
||||||
|
@ -31,6 +31,10 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
|
|||||||
// Read the first line of HTTP request
|
// Read the first line of HTTP request
|
||||||
String req = client.readStringUntil('\r');
|
String req = client.readStringUntil('\r');
|
||||||
client.readStringUntil('\n');
|
client.readStringUntil('\n');
|
||||||
|
//reset header value
|
||||||
|
for (int i = 0; i < _headerKeysCount; ++i) {
|
||||||
|
_currentHeaders[i].value =String();
|
||||||
|
}
|
||||||
|
|
||||||
// First line of HTTP request looks like "GET /path HTTP/1.1"
|
// First line of HTTP request looks like "GET /path HTTP/1.1"
|
||||||
// Retrieve the "/path" part by finding the spaces
|
// Retrieve the "/path" part by finding the spaces
|
||||||
@ -96,6 +100,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
|
|||||||
}
|
}
|
||||||
headerName = req.substring(0, headerDiv);
|
headerName = req.substring(0, headerDiv);
|
||||||
headerValue = req.substring(headerDiv + 2);
|
headerValue = req.substring(headerDiv + 2);
|
||||||
|
_collectHeader(headerName.c_str(),headerValue.c_str());
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
DEBUG_OUTPUT.print("headerName: ");
|
DEBUG_OUTPUT.print("headerName: ");
|
||||||
@ -161,6 +166,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
|
|||||||
}
|
}
|
||||||
headerName = req.substring(0, headerDiv);
|
headerName = req.substring(0, headerDiv);
|
||||||
headerValue = req.substring(headerDiv + 2);
|
headerValue = req.substring(headerDiv + 2);
|
||||||
|
_collectHeader(headerName.c_str(),headerValue.c_str());
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
DEBUG_OUTPUT.print("headerName: ");
|
DEBUG_OUTPUT.print("headerName: ");
|
||||||
@ -187,6 +193,15 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) {
|
||||||
|
for (size_t i = 0; i < _headerKeysCount; i++) {
|
||||||
|
if (_currentHeaders[i].key==headerName) {
|
||||||
|
_currentHeaders[i].value=headerValue;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void ESP8266WebServer::_parseArguments(String data) {
|
void ESP8266WebServer::_parseArguments(String data) {
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -2,15 +2,22 @@
|
|||||||
* @file OTA-mDNS-SPIFFS.ino
|
* @file OTA-mDNS-SPIFFS.ino
|
||||||
*
|
*
|
||||||
* @author Pascal Gollor (http://www.pgollor.de/cms/)
|
* @author Pascal Gollor (http://www.pgollor.de/cms/)
|
||||||
* @data 2015-09-18
|
* @date 2015-09-18
|
||||||
|
*
|
||||||
|
* changelog:
|
||||||
|
* 2015-10-22:
|
||||||
|
* - Use new ArduinoOTA library.
|
||||||
|
* - loadConfig function can handle different line endings
|
||||||
|
* - remove mDNS studd. ArduinoOTA handle it.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// includes
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266mDNS.h>
|
#include <ESP8266mDNS.h>
|
||||||
#include <WiFiUdp.h>
|
#include <WiFiUdp.h>
|
||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
|
#include <ArduinoOTA.h>
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,7 +25,6 @@
|
|||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
#define HOSTNAME "ESP8266-OTA-" ///< Hostename. The setup function adds the Chip ID at the end.
|
#define HOSTNAME "ESP8266-OTA-" ///< Hostename. The setup function adds the Chip ID at the end.
|
||||||
#define APORT 8266 ///< Port for OTA update
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,8 +35,11 @@ const char* ap_default_ssid = "esp8266"; ///< Default SSID.
|
|||||||
const char* ap_default_psk = "esp8266esp8266"; ///< Default PSK.
|
const char* ap_default_psk = "esp8266esp8266"; ///< Default PSK.
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
/// OTA Update UDP server handle.
|
/// Uncomment the next line for verbose output over UART.
|
||||||
WiFiUDP OTA;
|
//#define SERIAL_VERBOSE
|
||||||
|
|
||||||
|
/// OTA server handle.
|
||||||
|
ArduinoOTA ota_server;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,7 +50,7 @@ WiFiUDP OTA;
|
|||||||
*
|
*
|
||||||
* The config file have to containt the WiFi SSID in the first line
|
* The config file have to containt the WiFi SSID in the first line
|
||||||
* and the WiFi PSK in the second line.
|
* and the WiFi PSK in the second line.
|
||||||
* Line seperator have to be \r\n (CR LF).
|
* Line seperator can be \r\n (CR LF) \r or \n.
|
||||||
*/
|
*/
|
||||||
bool loadConfig(String *ssid, String *pass)
|
bool loadConfig(String *ssid, String *pass)
|
||||||
{
|
{
|
||||||
@ -61,8 +70,21 @@ bool loadConfig(String *ssid, String *pass)
|
|||||||
content.trim();
|
content.trim();
|
||||||
|
|
||||||
// Check if ther is a second line available.
|
// Check if ther is a second line available.
|
||||||
uint8_t pos = content.indexOf("\r\n");
|
int8_t pos = content.indexOf("\r\n");
|
||||||
if (pos == 0)
|
uint8_t le = 2;
|
||||||
|
// check for linux and mac line ending.
|
||||||
|
if (pos == -1)
|
||||||
|
{
|
||||||
|
le = 1;
|
||||||
|
pos = content.indexOf("\n");
|
||||||
|
if (pos == -1)
|
||||||
|
{
|
||||||
|
pos = content.indexOf("\r");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there is no second line: Some information is missing.
|
||||||
|
if (pos == -1)
|
||||||
{
|
{
|
||||||
Serial.println("Infvalid content.");
|
Serial.println("Infvalid content.");
|
||||||
Serial.println(content);
|
Serial.println(content);
|
||||||
@ -72,7 +94,18 @@ bool loadConfig(String *ssid, String *pass)
|
|||||||
|
|
||||||
// Store SSID and PSK into string vars.
|
// Store SSID and PSK into string vars.
|
||||||
*ssid = content.substring(0, pos);
|
*ssid = content.substring(0, pos);
|
||||||
*pass = content.substring(pos + 2);
|
*pass = content.substring(pos + le);
|
||||||
|
|
||||||
|
ssid->trim();
|
||||||
|
pass->trim();
|
||||||
|
|
||||||
|
#ifdef SERIAL_VERBOSE
|
||||||
|
Serial.println("----- file content -----");
|
||||||
|
Serial.println(content);
|
||||||
|
Serial.println("----- file content -----");
|
||||||
|
Serial.println("ssid: " + *ssid);
|
||||||
|
Serial.println("psk: " + *pass);
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} // loadConfig
|
} // loadConfig
|
||||||
@ -105,91 +138,6 @@ bool saveConfig(String *ssid, String *pass)
|
|||||||
} // saveConfig
|
} // saveConfig
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handle OTA update stuff.
|
|
||||||
*
|
|
||||||
* This function comes from ESP8266 Arduino example:
|
|
||||||
* https://github.com/esp8266/Arduino/blob/esp8266/hardware/esp8266com/esp8266/libraries/ESP8266mDNS/examples/DNS_SD_Arduino_OTA/DNS_SD_Arduino_OTA.ino
|
|
||||||
*
|
|
||||||
* Modification for uploading SPIFFS images from Pascal Gollor.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static inline void ota_handle(void)
|
|
||||||
{
|
|
||||||
bool spiffs = false;
|
|
||||||
|
|
||||||
if (! OTA.parsePacket())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get remote IP
|
|
||||||
IPAddress remote = OTA.remoteIP();
|
|
||||||
|
|
||||||
// Get command
|
|
||||||
int cmd = OTA.parseInt();
|
|
||||||
Serial.print("command: ");
|
|
||||||
Serial.println(cmd);
|
|
||||||
if (cmd == U_SPIFFS)
|
|
||||||
{
|
|
||||||
spiffs = true;
|
|
||||||
Serial.println("Get SPIFFS image.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get remote port
|
|
||||||
int port = OTA.parseInt();
|
|
||||||
|
|
||||||
// Get sketch size.
|
|
||||||
int sketch_size = OTA.parseInt();
|
|
||||||
|
|
||||||
// Output stuff
|
|
||||||
Serial.print("Update Start: ip:");
|
|
||||||
Serial.print(remote);
|
|
||||||
Serial.printf(", port:%d, size:%d\r\n", port, sketch_size);
|
|
||||||
|
|
||||||
// Stop all UDP connections.
|
|
||||||
WiFiUDP::stopAll();
|
|
||||||
|
|
||||||
// OTA start Time
|
|
||||||
uint32_t startTime = millis();
|
|
||||||
|
|
||||||
// Start Updateing.
|
|
||||||
if(!Update.begin(sketch_size, cmd))
|
|
||||||
{
|
|
||||||
Serial.println("Update Begin Error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WiFiClient client;
|
|
||||||
if (client.connect(remote, port))
|
|
||||||
{
|
|
||||||
uint32_t written;
|
|
||||||
while(!Update.isFinished())
|
|
||||||
{
|
|
||||||
written = Update.write(client);
|
|
||||||
if(written > 0) client.print(written, DEC);
|
|
||||||
}
|
|
||||||
Serial.setDebugOutput(false);
|
|
||||||
|
|
||||||
if(Update.end())
|
|
||||||
{
|
|
||||||
client.println("OK");
|
|
||||||
Serial.printf("Update Success: %u\nRebooting...\n", (unsigned int)(millis() - startTime));
|
|
||||||
ESP.restart();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Update.printError(client);
|
|
||||||
Update.printError(Serial);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Serial.printf("Connect Failed: %u\n", (unsigned int)(millis() - startTime));
|
|
||||||
}
|
|
||||||
} // ota_handle
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Arduino setup function.
|
* @brief Arduino setup function.
|
||||||
*/
|
*/
|
||||||
@ -212,8 +160,8 @@ void setup()
|
|||||||
WiFi.hostname(hostname);
|
WiFi.hostname(hostname);
|
||||||
|
|
||||||
// Print hostname.
|
// Print hostname.
|
||||||
Serial.print("hostname: ");
|
Serial.println("Hostname: " + hostname);
|
||||||
Serial.println(WiFi.hostname());
|
//Serial.println(WiFi.hostname());
|
||||||
|
|
||||||
|
|
||||||
// Initialize file system.
|
// Initialize file system.
|
||||||
@ -295,14 +243,8 @@ void setup()
|
|||||||
Serial.println(WiFi.softAPIP());
|
Serial.println(WiFi.softAPIP());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize mDNS service.
|
// Start OTA server.
|
||||||
MDNS.begin(hostname.c_str());
|
ota_server.setup();
|
||||||
|
|
||||||
// ... Add OTA service.
|
|
||||||
MDNS.addService("arduino", "tcp", APORT);
|
|
||||||
|
|
||||||
// Open OTA Server.
|
|
||||||
OTA.begin(APORT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -311,7 +253,8 @@ void setup()
|
|||||||
*/
|
*/
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
// Handle OTA update.
|
// Handle OTA server.
|
||||||
ota_handle();
|
ota_server.handle();
|
||||||
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +77,10 @@ recipe.objcopy.eep.pattern=
|
|||||||
|
|
||||||
recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
|
recipe.objcopy.hex.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
|
||||||
|
|
||||||
|
## Save hex
|
||||||
|
recipe.output.tmp_file={build.project_name}.bin
|
||||||
|
recipe.output.save_file={build.project_name}.{build.variant}.bin
|
||||||
|
|
||||||
## Compute size
|
## Compute size
|
||||||
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
|
recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf"
|
||||||
recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
|
recipe.size.regex=^(?:\.irom0\.text|\.text|\.data|\.rodata|)\s+([0-9]+).*
|
||||||
|
18
tools/sdk/ld/eagle.flash.512k0.ld
Normal file
18
tools/sdk/ld/eagle.flash.512k0.ld
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/* Flash Split for 512K chips, no SPIFFS */
|
||||||
|
/* sketch 487KB */
|
||||||
|
/* eeprom 20KB */
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
dport0_0_seg : org = 0x3FF00000, len = 0x10
|
||||||
|
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
|
||||||
|
iram1_0_seg : org = 0x40100000, len = 0x8000
|
||||||
|
irom0_0_seg : org = 0x40201010, len = 0x79ff0
|
||||||
|
}
|
||||||
|
|
||||||
|
PROVIDE ( _SPIFFS_start = 0 );
|
||||||
|
PROVIDE ( _SPIFFS_end = 0 );
|
||||||
|
PROVIDE ( _SPIFFS_page = 0 );
|
||||||
|
PROVIDE ( _SPIFFS_block = 0 );
|
||||||
|
|
||||||
|
INCLUDE "../ld/eagle.app.v6.common.ld"
|
Loading…
x
Reference in New Issue
Block a user