Write works

This commit is contained in:
Tim Keller 2021-10-25 03:02:02 +00:00
parent 8fb99471c3
commit c1aa5a5ea7
4 changed files with 77 additions and 18 deletions

View file

@ -83,6 +83,7 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) {
memcpy(filepath, header->pathstr, plen); memcpy(filepath, header->pathstr, plen);
filepath[plen + 1] = 0; // Copy and null teminate string filepath[plen + 1] = 0; // Copy and null teminate string
ReadResponse resp; ReadResponse resp;
os_mbuf* om;
resp.command = commands::READ_DATA; resp.command = commands::READ_DATA;
resp.status = 0x01; resp.status = 0x01;
resp.chunkoff = header->chunkoff; resp.chunkoff = header->chunkoff;
@ -91,23 +92,19 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) {
resp.status = 0x03; resp.status = 0x03;
resp.chunklen = 0; resp.chunklen = 0;
resp.totallen = 0; resp.totallen = 0;
om = ble_hs_mbuf_from_flat(&resp, sizeof(ReadResponse));
} else { } else {
resp.chunklen = std::min(header->chunksize, info.size); // TODO add mtu somehow resp.chunklen = std::min(header->chunksize, info.size); // TODO add mtu somehow
resp.totallen = info.size; resp.totallen = info.size;
fs.FileOpen(&f, filepath, LFS_O_RDONLY); fs.FileOpen(&f, filepath, LFS_O_RDONLY);
fs.FileSeek(&f, header->chunkoff); fs.FileSeek(&f, header->chunkoff);
}
os_mbuf* om;
if (resp.chunklen > 0) {
uint8_t fileData[resp.chunklen] {0}; uint8_t fileData[resp.chunklen] {0};
resp.chunklen = fs.FileRead(&f, fileData, resp.chunklen); resp.chunklen = fs.FileRead(&f, fileData, resp.chunklen);
om = ble_hs_mbuf_from_flat(&resp, sizeof(ReadResponse)); om = ble_hs_mbuf_from_flat(&resp, sizeof(ReadResponse));
os_mbuf_append(om, fileData, resp.chunklen); os_mbuf_append(om, fileData, resp.chunklen);
} else { fs.FileClose(&f);
resp.chunklen = 0;
om = ble_hs_mbuf_from_flat(&resp, sizeof(ReadResponse));
} }
fs.FileClose(&f);
ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om); ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
break; break;
} }
@ -145,14 +142,45 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) {
break; break;
} }
case commands::WRITE: { case commands::WRITE: {
if (state != FSState::IDLE) { lfs_file f;
NRF_LOG_INFO("[FS_S] -> Write");
auto* header = (WriteHeader*) om->om_data;
uint16_t plen = header->pathlen;
if (plen > maxpathlen) { //> counts for null term
return -1; return -1;
} }
memcpy(filepath, header->pathstr, plen);
filepath[plen + 1] = 0; // Copy and null teminate string
fileSize = header->totalSize;
WriteResponse resp;
resp.command = commands::WRITE_PACING;
resp.offset = header->offset;
resp.modTime = 0;
int res = fs.FileOpen(&f, filepath, LFS_O_RDWR | LFS_O_CREAT);
resp.status = res ? 0x02 : 0x01;
fs.FileClose(&f);
resp.freespace = std::min(fs.getSize() - (fs.GetFSSize() * fs.getBlockSize()), fileSize - header->offset);
auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(WriteResponse));
ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
break;
} }
case commands::WRITE_PACING: { case commands::WRITE_DATA: {
if (state != FSState::WRITE) { lfs_file f;
return -1; NRF_LOG_INFO("[FS_S] -> WriteData");
} auto* header = (WritePacing*) om->om_data;
WriteResponse resp;
resp.command = commands::WRITE_PACING;
resp.offset = header->offset;
int res = fs.FileOpen(&f, filepath, LFS_O_RDWR | LFS_O_CREAT);
resp.status = res ? 0x02 : 0x01;
fs.FileSeek(&f, header->offset);
fs.FileWrite(&f, header->data, header->dataSize);
fs.FileClose(&f);
resp.freespace = std::min(fs.getSize() - (fs.GetFSSize() * fs.getBlockSize()), fileSize - header->offset);
// NRF_LOG_INFO('[FS_S] Used Blocks -> %u',resp.freespace);
auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(WriteResponse));
ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
break;
} }
case commands::DELETE: { case commands::DELETE: {
NRF_LOG_INFO("[FS_S] -> Delete"); NRF_LOG_INFO("[FS_S] -> Delete");

View file

@ -47,9 +47,6 @@ namespace Pinetime {
uint16_t versionCharacteristicHandle; uint16_t versionCharacteristicHandle;
uint16_t transferCharacteristicHandle; uint16_t transferCharacteristicHandle;
// lfs_dir_t dir;
// lfs_info info;
enum class commands : uint8_t { enum class commands : uint8_t {
INVALID = 0x00, INVALID = 0x00,
READ = 0x10, READ = 0x10,
@ -74,6 +71,7 @@ namespace Pinetime {
}; };
FSState state; FSState state;
char filepath[maxpathlen]; // TODO ..ugh fixed filepath len char filepath[maxpathlen]; // TODO ..ugh fixed filepath len
int fileSize;
using ReadHeader = struct __attribute__((packed)) { using ReadHeader = struct __attribute__((packed)) {
commands command; commands command;
uint8_t padding; uint8_t padding;
@ -100,6 +98,33 @@ namespace Pinetime {
uint32_t chunksize; uint32_t chunksize;
}; };
using WriteHeader = struct __attribute__((packed)) {
commands command;
uint8_t padding;
uint16_t pathlen;
uint32_t offset;
uint64_t modTime;
uint32_t totalSize;
char pathstr[];
};
using WriteResponse = struct __attribute__((packed)) {
commands command;
uint8_t status;
uint16_t padding;
uint32_t offset;
uint64_t modTime;
uint32_t freespace;
};
using WritePacing = struct __attribute__((packed)) {
commands command;
uint8_t status;
uint16_t padding;
uint32_t offset;
uint32_t dataSize;
uint8_t data[];
};
using ListDirHeader = struct __attribute__((packed)) { using ListDirHeader = struct __attribute__((packed)) {
commands command; commands command;
uint8_t padding; uint8_t padding;

View file

@ -107,7 +107,9 @@ int FS::DirCreate(const char* path) {
int FS::Stat(const char* path, lfs_info* info) { int FS::Stat(const char* path, lfs_info* info) {
return lfs_stat(&lfs, path, info); return lfs_stat(&lfs, path, info);
} }
lfs_ssize_t FS::GetFSSize(){
return lfs_fs_size(&lfs);
}
// Delete directory and all files inside // Delete directory and all files inside
int FS::DirDelete(const char* path) { int FS::DirDelete(const char* path) {

View file

@ -10,6 +10,8 @@ namespace Pinetime {
public: public:
FS(Pinetime::Drivers::SpiNorFlash&); FS(Pinetime::Drivers::SpiNorFlash&);
void Init(); void Init();
void LVGLFileSystemInit(); void LVGLFileSystemInit();
@ -30,10 +32,11 @@ namespace Pinetime {
int DirRewind(lfs_dir_t* dir); int DirRewind(lfs_dir_t* dir);
int DirCreate(const char* path); int DirCreate(const char* path);
int DirDelete(const char* path); int DirDelete(const char* path);
lfs_ssize_t GetFSSize();
int Stat(const char* path, lfs_info* info); int Stat(const char* path, lfs_info* info);
void VerifyResource(); void VerifyResource();
static size_t getSize(){return size;}
static size_t getBlockSize(){return blockSize;}
private: private:
Pinetime::Drivers::SpiNorFlash& flashDriver; Pinetime::Drivers::SpiNorFlash& flashDriver;
@ -62,6 +65,7 @@ namespace Pinetime {
static constexpr size_t startAddress = 0x0B4000; static constexpr size_t startAddress = 0x0B4000;
static constexpr size_t size = 0x34C000; static constexpr size_t size = 0x34C000;
static constexpr size_t blockSize = 4096; static constexpr size_t blockSize = 4096;
bool resourcesValid = false; bool resourcesValid = false;
const struct lfs_config lfsConfig; const struct lfs_config lfsConfig;