53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
#include "config.h"
|
|
#include "sd_reader_task.h"
|
|
|
|
sd_reader_task::sd_reader_task() : task("SD reader", SD_READER_STACKSIZE),
|
|
_fs(nullptr),
|
|
_file(nullptr),
|
|
_req_buff(nullptr),
|
|
_req_btr(0),
|
|
_req_br(nullptr),
|
|
_req_result(FatFs::FR_OK),
|
|
_eof(false),
|
|
_force_eof(false),
|
|
_execute(false)
|
|
{ }
|
|
|
|
void sd_reader_task::start(FatFs * fs, FatFs::FILE * file) {
|
|
_fs = fs;
|
|
_file = file;
|
|
_eof = false;
|
|
_force_eof = false;
|
|
_execute = false;
|
|
task::start();
|
|
}
|
|
|
|
FatFs::FRESULT sd_reader_task::read_data(uint8_t* buff, uint16_t btr, uint16_t* br) {
|
|
// Copy request parameters
|
|
_req_buff = buff;
|
|
_req_btr = btr;
|
|
_req_br = br;
|
|
// Trigger task execution
|
|
_execute_mutex.lock();
|
|
_execute = true;
|
|
_execute_mutex.unlock();
|
|
_execute_cv.notify_one();
|
|
// Wait for execution to complete
|
|
_caller_cv.wait(_caller_mutex, [this]() {return !_execute;});
|
|
// Return the result of the execution
|
|
return _req_result;
|
|
}
|
|
|
|
void sd_reader_task::run() {
|
|
do {
|
|
// Wait for a new request
|
|
_execute_cv.wait(_execute_mutex, [this]() {return _execute;});
|
|
// Read in the requested bytes
|
|
_req_result = _fs->read(_file, _req_buff, _req_btr, _req_br);
|
|
_eof = f_eof (_file);
|
|
// Notify end of execution
|
|
_execute = false;
|
|
_caller_cv.notify_one();
|
|
} while (!_eof && !_force_eof);
|
|
}
|