Actually fix memory corruption, seems stable now
ListDir MKDIR delete all seem to work Co-authored-by: Iambian <Iambian@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									6393a17d74
								
							
						
					
					
						commit
						faa05eb57b
					
				| @ -69,8 +69,9 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) { | ||||
|   while (systemTask.IsSleeping()) { | ||||
|     vTaskDelay(100); // 50ms
 | ||||
|   } | ||||
|   lfs_dir_t dir; | ||||
|   lfs_info info; | ||||
|   switch (command) { | ||||
|     /*
 | ||||
|     case commands::READ: { | ||||
|       NRF_LOG_INFO("[FS_S] -> Read"); | ||||
|       if (state != FSState::IDLE) { | ||||
| @ -151,31 +152,15 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) { | ||||
|         return -1; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     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 = {}; | ||||
|       char path[plen + 1] {0}; | ||||
|       memcpy(path, header->pathstr, plen); | ||||
|       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; | ||||
|       } | ||||
|       resp.status = fs.FileDelete(path) ? 0x02 : 0x01; | ||||
|       auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(DelResponse)); | ||||
|       ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om); | ||||
|       break; | ||||
| @ -184,57 +169,43 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) { | ||||
|       NRF_LOG_INFO("[FS_S] -> MKDir"); | ||||
|       auto* header = (MKDirHeader*) 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] -> MKDIR %.10s", path); | ||||
|       MKDirResponse resp = {}; | ||||
|       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
 | ||||
|       resp.modification_time = 0; | ||||
|       resp.status = fs.DirCreate(path) ? 0x02 : 0x01; | ||||
|       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; | ||||
|       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 {}; | ||||
| 
 | ||||
|       ListDirResponse resp = {}; | ||||
|       resp.command = commands::LISTDIR_ENTRY; | ||||
|       resp.status = 1; // TODO actually use res above!
 | ||||
|       resp.status = 1; | ||||
|       resp.totalentries = 0; | ||||
|       resp.entry = 0; | ||||
| 
 | ||||
|       if (fs.DirOpen(path, &dir)) { | ||||
|         return 0; | ||||
|       } | ||||
| 
 | ||||
|       // NRF_LOG_INFO("[FS_S] ->diropen %d ", res);
 | ||||
|       resp.modification_time = 0; // TODO Does LFS actually support TS?
 | ||||
|       if (fs.DirOpen(path, &dir) != 0) { | ||||
|         resp.status = 0x02; | ||||
|         auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse)); | ||||
|         ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om); | ||||
|         break; | ||||
|       }; | ||||
|       // Count Total files in directory.
 | ||||
|       while (fs.DirRead(&dir, &info)) { | ||||
|         resp.totalentries++; | ||||
|       } | ||||
|       NRF_LOG_INFO("[FS_S] -> %d ", resp.totalentries); | ||||
| 
 | ||||
|       fs.DirRewind(&dir); | ||||
| 
 | ||||
|       // NRF_LOG_INFO("[FS_S] ->diropen %d ", res);
 | ||||
| 
 | ||||
|       while (resp.entry < resp.totalentries) { | ||||
|       while (true) { | ||||
|         int res = fs.DirRead(&dir, &info); | ||||
|         if (res <= 0) { | ||||
|           break; | ||||
| @ -251,35 +222,39 @@ int FSService::FSCommandHandler(uint16_t connectionHandle, os_mbuf* om) { | ||||
|             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) + resp.path_length); | ||||
|         NRF_LOG_INFO("[FS_S] -> DIR %.10s", path); | ||||
|         auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse)); | ||||
|         os_mbuf_append(om,info.name,resp.path_length); | ||||
|         ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om); | ||||
|         /*
 | ||||
|         * Todo Figure out how to know when the previous Notify was TX'd | ||||
|         * For now just delay 100ms to make sure that the data went out... | ||||
|         */ | ||||
|         vTaskDelay(100); // Allow stuff to actually go out over the BLE conn
 | ||||
|         resp.entry++; | ||||
|       } | ||||
| 
 | ||||
|       if (fs.DirClose(&dir)) { | ||||
|         return 0; | ||||
|       } | ||||
|       assert(fs.DirClose(&dir) == 0); | ||||
|       resp.file_size = 0; | ||||
|       resp.path_length = 0; | ||||
|       resp.flags = 0; | ||||
|       // TODO Handle Size of response better.
 | ||||
|       auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse) + resp.path_length); | ||||
|       auto* om = ble_hs_mbuf_from_flat(&resp, sizeof(ListDirResponse)); | ||||
|       ble_gattc_notify_custom(connectionHandle, transferCharacteristicHandle, om); | ||||
|       NRF_LOG_INFO("[FS_S] -> done "); | ||||
|       break; | ||||
|     } | ||||
|     default: | ||||
|       break; | ||||
|   } | ||||
|   NRF_LOG_INFO("[FS_S] -> done "); | ||||
|   systemTask.PushMessage(Pinetime::System::Messages::StopFileTransfer); | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| // Loads resp with file data given a valid filepath header and resp
 | ||||
| void FSService::prepareReadDataResp(ReadHeader* header, ReadResponse* resp) { | ||||
|   uint16_t plen = header->pathlen; | ||||
|   // uint16_t plen = header->pathlen;
 | ||||
|   resp->command = commands::READ_DATA; | ||||
|   resp->chunkoff = header->chunkoff; | ||||
|   resp->status = 0x01; | ||||
|  | ||||
| @ -29,7 +29,7 @@ namespace Pinetime { | ||||
|       static constexpr uint16_t fsVersionId {0x0100}; | ||||
|       static constexpr uint16_t fsTransferId {0x0200}; | ||||
|       uint16_t fsVersion = {0x0004}; | ||||
|       static constexpr uint8_t maxpathlen = 100; | ||||
|       static constexpr uint16_t maxpathlen = 256; | ||||
|       static constexpr ble_uuid16_t fsServiceUuid { | ||||
|         .u {.type = BLE_UUID_TYPE_16}, | ||||
|         .value = {0xFEBB}}; // {0x72, 0x65, 0x66, 0x73, 0x6e, 0x61, 0x72, 0x54, 0x65, 0x6c, 0x69, 0x46, 0xBB, 0xFE, 0xAF, 0xAD}};
 | ||||
| @ -47,6 +47,9 @@ namespace Pinetime { | ||||
|       uint16_t versionCharacteristicHandle; | ||||
|       uint16_t transferCharacteristicHandle; | ||||
| 
 | ||||
|       // lfs_dir_t dir;
 | ||||
|       // lfs_info info;
 | ||||
| 
 | ||||
|       enum class commands : uint8_t { | ||||
|         INVALID = 0x00, | ||||
|         READ = 0x10, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user