From a7712146bec622169a2ff8ae70e067e110efd197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Apr 2022 10:23:13 +0200 Subject: [PATCH 1/4] BUGFIX - file read and seek edit --- libraries/FS/src/vfs_api.cpp | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 9e200a1500b..e0706603666 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -376,21 +376,33 @@ size_t VFSFileImpl::read(uint8_t* buf, size_t size) if(_isDirectory || !_f || !buf || !size) { return 0; } - - //ERASE BYTEBUFFER and use read when size > READ_SIZE_SWITCH always - if(size > READ_SIZE_SWITCH) + + if(size > READ_SIZE_SWITCH) //to be tested -> switch between fread/read to optimize speeds (call sd status check only once for each read) { - //check some data in buffer exists –> clear buffer and move pointer to deleted data size_t bytesinbuf = __fpending(_f); - if (bytesinbuf && (bytesinbuf != 128)) //buffer lenght is 128 bytes + size_t buf_size = __fbufsize(_f); + + if (bytesinbuf && (bytesinbuf != buf_size)) //buffer size SD=128 , LittleFS=4096 { + fpos_t pointer = 0; + //clear buffer fpurge(_f); - lseek(fileno(_f),(-128+bytesinbuf),SEEK_CUR); + //get file pointer + fgetpos(_f, &pointer); + + if(pointer <= buf_size){ + lseek(fileno(_f),(-pointer+bytesinbuf),SEEK_CUR); + } + else{ + uint64_t modulo = pointer % buf_size; + lseek(fileno(_f),(-modulo+bytesinbuf),SEEK_CUR); + } } int res = ::read(fileno(_f), buf, size); if (res < 0) { // an error occurred + log_d("FILE READ ERROR OCCURED"); return 0; } return res; @@ -416,8 +428,14 @@ bool VFSFileImpl::seek(uint32_t pos, SeekMode mode) if(_isDirectory || !_f) { return false; } - auto rc = fseek(_f, pos, mode); - return rc == 0; + + off_t res = lseek(fileno(_f), pos, mode); + if (res < 0) { + // an error occurred + log_d("FILE SEEK ERROR OCCURED"); + return 1; //return error -> for seek its all above 0 + } + return 0; //return success -> for fseek its 0 } size_t VFSFileImpl::position() const From fe8fe18f3b091e89abbf67eb32edaa12bf1098bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Apr 2022 13:12:36 +0200 Subject: [PATCH 2/4] VFSFileImpl::seek - edit to call both lseek and fseek --- libraries/FS/src/vfs_api.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index e0706603666..66cb0d303ee 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -435,7 +435,11 @@ bool VFSFileImpl::seek(uint32_t pos, SeekMode mode) log_d("FILE SEEK ERROR OCCURED"); return 1; //return error -> for seek its all above 0 } - return 0; //return success -> for fseek its 0 + //return 0; //return success -> for fseek its 0 + + //Call fseek to adjust pointer in fstruct + auto rc = fseek(_f, pos, mode); + return rc == 0; } size_t VFSFileImpl::position() const From 1ce89e395966478d186945ee1a0b1de8299fce31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Apr 2022 16:43:41 +0200 Subject: [PATCH 3/4] Added fpurge before seeking file position --- libraries/FS/src/vfs_api.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 66cb0d303ee..807ad17aee4 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -429,17 +429,14 @@ bool VFSFileImpl::seek(uint32_t pos, SeekMode mode) return false; } + fpurge(_f); //clear the file internal buffer -> no longer valid when changing file position off_t res = lseek(fileno(_f), pos, mode); if (res < 0) { // an error occurred log_d("FILE SEEK ERROR OCCURED"); return 1; //return error -> for seek its all above 0 } - //return 0; //return success -> for fseek its 0 - - //Call fseek to adjust pointer in fstruct - auto rc = fseek(_f, pos, mode); - return rc == 0; + return 0; //return success -> for fseek its 0 } size_t VFSFileImpl::position() const From b6b87639a707eedd2d2450694839bd351bd21b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 5 Apr 2022 20:31:29 +0200 Subject: [PATCH 4/4] Fixed seek returns + edited position to use lseek. --- libraries/FS/src/vfs_api.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp index 807ad17aee4..184abecdf7a 100644 --- a/libraries/FS/src/vfs_api.cpp +++ b/libraries/FS/src/vfs_api.cpp @@ -434,9 +434,9 @@ bool VFSFileImpl::seek(uint32_t pos, SeekMode mode) if (res < 0) { // an error occurred log_d("FILE SEEK ERROR OCCURED"); - return 1; //return error -> for seek its all above 0 + return 0; //return error -> for lseek its all above 0 } - return 0; //return success -> for fseek its 0 + return 1; //return success -> for fseek its 0 } size_t VFSFileImpl::position() const @@ -444,7 +444,8 @@ size_t VFSFileImpl::position() const if(_isDirectory || !_f) { return 0; } - return ftell(_f); + return lseek(fileno(_f), 0, SEEK_CUR); + //return ftell(_f); // old implementation } size_t VFSFileImpl::size() const