@@ -376,21 +376,33 @@ size_t VFSFileImpl::read(uint8_t* buf, size_t size)
376
376
if (_isDirectory || !_f || !buf || !size) {
377
377
return 0 ;
378
378
}
379
-
380
- // ERASE BYTEBUFFER and use read when size > READ_SIZE_SWITCH always
381
- if (size > READ_SIZE_SWITCH)
379
+
380
+ if (size > READ_SIZE_SWITCH) // to be tested -> switch between fread/read to optimize speeds (call sd status check only once for each read)
382
381
{
383
- // check some data in buffer exists –> clear buffer and move pointer to deleted data
384
382
size_t bytesinbuf = __fpending (_f);
385
- if (bytesinbuf && (bytesinbuf != 128 )) // buffer lenght is 128 bytes
383
+ size_t buf_size = __fbufsize (_f);
384
+
385
+ if (bytesinbuf && (bytesinbuf != buf_size)) // buffer size SD=128 , LittleFS=4096
386
386
{
387
+ fpos_t pointer = 0 ;
388
+ // clear buffer
387
389
fpurge (_f);
388
- lseek (fileno (_f),(-128 +bytesinbuf),SEEK_CUR);
390
+ // get file pointer
391
+ fgetpos (_f, &pointer);
392
+
393
+ if (pointer <= buf_size){
394
+ lseek (fileno (_f),(-pointer+bytesinbuf),SEEK_CUR);
395
+ }
396
+ else {
397
+ uint64_t modulo = pointer % buf_size;
398
+ lseek (fileno (_f),(-modulo+bytesinbuf),SEEK_CUR);
399
+ }
389
400
}
390
401
391
402
int res = ::read (fileno (_f), buf, size);
392
403
if (res < 0 ) {
393
404
// an error occurred
405
+ log_d (" FILE READ ERROR OCCURED" );
394
406
return 0 ;
395
407
}
396
408
return res;
@@ -416,8 +428,14 @@ bool VFSFileImpl::seek(uint32_t pos, SeekMode mode)
416
428
if (_isDirectory || !_f) {
417
429
return false ;
418
430
}
419
- auto rc = fseek (_f, pos, mode);
420
- return rc == 0 ;
431
+
432
+ off_t res = lseek (fileno (_f), pos, mode);
433
+ if (res < 0 ) {
434
+ // an error occurred
435
+ log_d (" FILE SEEK ERROR OCCURED" );
436
+ return 1 ; // return error -> for seek its all above 0
437
+ }
438
+ return 0 ; // return success -> for fseek its 0
421
439
}
422
440
423
441
size_t VFSFileImpl::position () const
0 commit comments