Simple RAM file system.

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

Revision:
0:befc17558de9
Child:
1:73a2c1814a34
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ram_fs.cpp	Thu May 04 13:15:20 2017 +0000
@@ -0,0 +1,121 @@
+#include "ram_fs.h"
+#include "WizziDebug.h"
+
+static ram_fs_file_t* g_fs = NULL;
+
+static void ram_fs_append(ram_fs_file_t** file, ram_fs_file_t* file_new)
+{
+    if (*file == NULL)
+    {
+        *file = file_new;
+        return;
+    }
+    
+    ram_fs_append((ram_fs_file_t**)&((*file)->next), file_new);
+}
+
+static ram_fs_file_t* ram_fs_get(ram_fs_file_t* file, uint8_t fid)
+{
+    if (file == NULL)
+    {
+        return NULL;
+    }
+    
+    if (file->file_id == fid)
+    {
+        return file;
+    }
+    
+    return ram_fs_get((ram_fs_file_t*)file->next, fid);
+}
+
+static bool ram_fs_remove(ram_fs_file_t** file, uint8_t fid)
+{
+    if (*file == NULL)
+    {
+        // File does nor exist
+        return true;
+    }
+    
+    if ((*file)->file_id == fid)
+    {
+        ram_fs_file_t* file_old = *file;
+        *file = (ram_fs_file_t*)file_old->next;
+        FREE(file_old);
+        return false;
+    }
+    
+    return ram_fs_remove((ram_fs_file_t**)&((*file)->next), fid);
+}
+
+void ram_fs_new(uint8_t file_id, uint8_t* header, uint8_t* data)
+{
+    ram_fs_file_t* file_new = (ram_fs_file_t*)MALLOC(sizeof(ram_fs_file_t));
+    
+    file_new->file_id = file_id;
+    file_new->header = header;
+    file_new->data = data;
+    file_new->next = NULL;
+    
+    ram_fs_append(&g_fs, file_new);
+}
+
+bool ram_fs_delete(uint8_t file_id)
+{
+    return ram_fs_remove(&g_fs, file_id);
+}
+
+bool ram_fs_write(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* content)
+{
+    ram_fs_file_t* file;
+        
+    DPRINT("WF %d\r\n", file_id);
+    
+    // Retrieve pointer to file
+    file = ram_fs_get(g_fs, file_id);
+        
+    if (file == NULL)
+    {
+        return true;
+    }
+    
+    // Write the new data
+    memcpy((void*)(file->data+offset), (void*)content, size);
+
+    return false;
+}
+
+bool ram_fs_read(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* buf)
+{
+    ram_fs_file_t* file;
+        
+    DPRINT("RF %d\r\n", file_id);
+    
+    // Retrieve pointer to file
+    file = ram_fs_get(g_fs, file_id);
+        
+    if (file == NULL)
+    {
+        return true;
+    }
+    
+    // Read data
+    memcpy((void*)buf, (void*)(file->data+offset), size);
+
+    return false;
+}
+
+void* ram_fs_get_header(uint8_t file_id)
+{
+    ram_fs_file_t* file;
+    
+    DPRINT("RH %d\r\n", file_id);
+    
+    // Retrieve pointer to file
+    file = ram_fs_get(g_fs, file_id);
+        
+    ASSERT(file != NULL, "File %d does not exist!\r\n", file_id);
+    
+    // Return header pointer
+    return file->header;
+}