Write works
This commit is contained in:
parent
8fb99471c3
commit
c1aa5a5ea7
|
@ -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");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -63,6 +66,7 @@ namespace Pinetime {
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue