summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/ble/FSService.cpp96
-rw-r--r--src/components/ble/FSService.h20
-rw-r--r--src/components/fs/FS.cpp4
-rw-r--r--src/components/fs/FS.h1
4 files changed, 93 insertions, 28 deletions
diff --git a/src/components/ble/FSService.cpp b/src/components/ble/FSService.cpp
index 40679e5c..0cf2b937 100644
--- a/src/components/ble/FSService.cpp
+++ b/src/components/ble/FSService.cpp
@@ -63,64 +63,112 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) {
NRF_LOG_INFO("[FS_S] -> FSCommandHandler");
switch (command) {
+ case commands::DELETE: {
+ NRF_LOG_INFO("[FS_S] -> Delete");
+ auto* header = (DelHeader*)om->om_data;
+ uint16_t plen = header->pathlen;
+ char path[plen + 1] = {0};
+ struct lfs_info info = {};
+ DelResponse resp = {};
+ resp.command = commands::DELETE_STATUS;
+ int res = fs.Stat(path, &info);
+ // Get Info about path
+ // branch for DirDel of FileDelete
+ if (info.type == LFS_TYPE_DIR) {
+ res = fs.DirDelete(path);
+ } else {
+ res = fs.FileDelete(path);
+ }
+ switch (res) {
+ case LFS_ERR_OK:
+ resp.status = 0x01;
+ break;
+ default:
+ resp.status = 0x02;
+ break;
+ }
+ auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(DelResponse));
+ ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
+ break;
+ }
+ case commands::MKDIR: {
+ NRF_LOG_INFO("[FS_S] -> MKDir");
+ auto* header = (MKDirHeader*) om->om_data;
+ uint16_t plen = header->pathlen;
+ char path[plen + 1] = {0};
+ memcpy(path, header->pathstr, plen);
+ NRF_LOG_INFO("[FS_S] -> MKDIR %.10s", path);
+ MKDirResponse resp = {};
+ resp.command = commands::MKDIR_STATUS;
+ int res = fs.DirCreate(path);
+ switch (res) {
+ case LFS_ERR_OK:
+ resp.status = 0x01;
+ break;
+ default:
+ resp.status = 0x02;
+ break;
+ }
+ resp.modification_time = 0; // We should timestamp..but no
+ auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(MKDirResponse));
+ ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
+ break;
+ }
case commands::LISTDIR: {
NRF_LOG_INFO("[FS_S] -> ListDir");
- ListDirHeader *header = (ListDirHeader *)&om->om_data[0];
+ ListDirHeader* header = (ListDirHeader*)om->om_data;
uint16_t plen = header->pathlen;
- char path[plen+1] = {0};
+ char path[plen + 1] = {0};
memcpy(path, header->pathstr, plen);
NRF_LOG_INFO("[FS_S] -> DIR %.10s", path);
lfs_dir_t dir = {};
struct lfs_info info = {};
ListDirResponse resp = {};
- resp.command = 0x51; // LISTDIR_ENTRY;
- resp.status = 1; // TODO actually use res above!
+ resp.command = commands::LISTDIR_ENTRY;
+ resp.status = 1; // TODO actually use res above!
resp.totalentries = 0;
resp.entry = 0;
int res = fs.DirOpen(path, &dir);
-
+
NRF_LOG_INFO("[FS_S] ->diropen %d ", res);
while (fs.DirRead(&dir, &info)) {
resp.totalentries++;
-
}
NRF_LOG_INFO("[FS_S] -> %d ", resp.totalentries);
-
+
fs.DirRewind(&dir);
-
+
while (fs.DirRead(&dir, &info)) {
- switch(info.type){
- case LFS_TYPE_REG:
- {
+ switch (info.type) {
+ case LFS_TYPE_REG: {
resp.flags = 0;
resp.file_size = info.size;
break;
- }
- case LFS_TYPE_DIR:
- {
- resp.flags = 1;
- resp.file_size = 0;
- break;
+ }
+ case LFS_TYPE_DIR: {
+ resp.flags = 1;
+ resp.file_size = 0;
+ break;
}
}
resp.modification_time = 0; // TODO Does LFS actually support TS?
- strcpy(resp.path,info.name);
+ strcpy(resp.path, info.name);
resp.path_length = strlen(info.name);
NRF_LOG_INFO("[FS_S] ->Path %s ,", info.name);
- auto* om = ble_hs_mbuf_from_flat(&resp,sizeof(ListDirResponse));
- ble_gattc_notify_custom(connectionHandle,transferCharacteristicHandle,om);
- vTaskDelay(1); //Allow stuff to actually go out over the BLE conn
+ auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse));
+ ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
+ vTaskDelay(1); // Allow stuff to actually go out over the BLE conn
resp.entry++;
}
fs.DirClose(&dir);
resp.file_size = 0;
resp.path_length = 0;
resp.flags = 0;
- //Todo this better
- auto* om = ble_hs_mbuf_from_flat(&resp,sizeof(ListDirResponse)-70+resp.path_length);
- ble_gattc_notify_custom(connectionHandle,transferCharacteristicHandle,om);
+ // TODO Handle Size of response better.
+ auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse) - 70 + resp.path_length);
+ ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om);
NRF_LOG_INFO("[FS_S] -> done ");
break;
}
diff --git a/src/components/ble/FSService.h b/src/components/ble/FSService.h
index a1c42aa7..3ca6d934 100644
--- a/src/components/ble/FSService.h
+++ b/src/components/ble/FSService.h
@@ -66,14 +66,14 @@ namespace Pinetime {
};
using ListDirHeader = struct __attribute__((packed)) {
- uint8_t command;
+ commands command;
uint8_t padding;
uint16_t pathlen;
char pathstr[70];
};
using ListDirResponse = struct __attribute__((packed)) {
- uint8_t command;
+ commands command;
uint8_t status;
uint16_t path_length;
uint32_t entry;
@@ -85,7 +85,7 @@ namespace Pinetime {
};
using MKDirHeader = struct __attribute__((packed)) {
- uint8_t command;
+ commands command;
uint8_t padding;
uint16_t pathlen;
uint32_t padding2;
@@ -94,13 +94,25 @@ namespace Pinetime {
};
using MKDirResponse = struct __attribute__((packed)) {
- uint8_t command;
+ commands command;
uint8_t status;
uint32_t padding1;
uint16_t padding2;
uint64_t modification_time;
};
+ using DelHeader = struct __attribute__((packed)) {
+ commands command;
+ uint8_t padding;
+ uint16_t pathlen;
+ char pathstr[70];
+ };
+
+ using DelResponse = struct __attribute__((packed)) {
+ commands command;
+ uint8_t status;
+ };
+
};
}
}
diff --git a/src/components/fs/FS.cpp b/src/components/fs/FS.cpp
index 353193dc..d30b7373 100644
--- a/src/components/fs/FS.cpp
+++ b/src/components/fs/FS.cpp
@@ -96,6 +96,10 @@ int FS::DirCreate(const char* path) {
return lfs_mkdir(&lfs, path);
}
+int FS::Stat(const char* path, lfs_info* info){
+ return lfs_stat(&lfs,path,info);
+}
+
// Delete directory and all files inside
int FS::DirDelete(const char* path) {
diff --git a/src/components/fs/FS.h b/src/components/fs/FS.h
index ccff2409..e50ff10a 100644
--- a/src/components/fs/FS.h
+++ b/src/components/fs/FS.h
@@ -28,6 +28,7 @@ namespace Pinetime {
int DirCreate(const char* path);
int DirDelete(const char* path);
+ int Stat(const char* path, lfs_info* info);
void VerifyResource();
private: