Simple RAM file system.

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

Committer:
Jeej
Date:
Fri May 12 13:33:37 2017 +0000
Revision:
3:1bc9159847ab
Parent:
2:91473a2fac1c
Child:
4:58ee8b15988b
Update file when already in list.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:befc17558de9 1 #include "ram_fs.h"
Jeej 0:befc17558de9 2 #include "WizziDebug.h"
Jeej 0:befc17558de9 3
Jeej 2:91473a2fac1c 4 #if 0
Jeej 2:91473a2fac1c 5 #define RAM_FS_PRINT(...) PRINT(__VA_ARGS__)
Jeej 2:91473a2fac1c 6 #else
Jeej 2:91473a2fac1c 7 #define RAM_FS_PRINT(...);
Jeej 2:91473a2fac1c 8 #endif
Jeej 2:91473a2fac1c 9
Jeej 0:befc17558de9 10 static ram_fs_file_t* g_fs = NULL;
Jeej 0:befc17558de9 11
Jeej 3:1bc9159847ab 12 static void ram_fs_update(ram_fs_file_t** file, ram_fs_file_t* file_new)
Jeej 0:befc17558de9 13 {
Jeej 0:befc17558de9 14 if (*file == NULL)
Jeej 0:befc17558de9 15 {
Jeej 3:1bc9159847ab 16 // Append new file
Jeej 0:befc17558de9 17 *file = file_new;
Jeej 0:befc17558de9 18 return;
Jeej 0:befc17558de9 19 }
Jeej 0:befc17558de9 20
Jeej 3:1bc9159847ab 21 if ((*file)->file_id == file_new->file_id)
Jeej 3:1bc9159847ab 22 {
Jeej 3:1bc9159847ab 23 // Update existing file
Jeej 3:1bc9159847ab 24 (*file)->header = file_new->header;
Jeej 3:1bc9159847ab 25 (*file)->data = file_new->data;
Jeej 3:1bc9159847ab 26 (*file)->next = file_new->next;
Jeej 3:1bc9159847ab 27 FREE(file_new);
Jeej 3:1bc9159847ab 28 return;
Jeej 3:1bc9159847ab 29 }
Jeej 3:1bc9159847ab 30
Jeej 3:1bc9159847ab 31 ram_fs_update((ram_fs_file_t**)&((*file)->next), file_new);
Jeej 0:befc17558de9 32 }
Jeej 0:befc17558de9 33
Jeej 0:befc17558de9 34 static ram_fs_file_t* ram_fs_get(ram_fs_file_t* file, uint8_t fid)
Jeej 0:befc17558de9 35 {
Jeej 0:befc17558de9 36 if (file == NULL)
Jeej 0:befc17558de9 37 {
Jeej 0:befc17558de9 38 return NULL;
Jeej 0:befc17558de9 39 }
Jeej 0:befc17558de9 40
Jeej 0:befc17558de9 41 if (file->file_id == fid)
Jeej 0:befc17558de9 42 {
Jeej 0:befc17558de9 43 return file;
Jeej 0:befc17558de9 44 }
Jeej 0:befc17558de9 45
Jeej 0:befc17558de9 46 return ram_fs_get((ram_fs_file_t*)file->next, fid);
Jeej 0:befc17558de9 47 }
Jeej 0:befc17558de9 48
Jeej 0:befc17558de9 49 static bool ram_fs_remove(ram_fs_file_t** file, uint8_t fid)
Jeej 0:befc17558de9 50 {
Jeej 0:befc17558de9 51 if (*file == NULL)
Jeej 0:befc17558de9 52 {
Jeej 0:befc17558de9 53 // File does nor exist
Jeej 0:befc17558de9 54 return true;
Jeej 0:befc17558de9 55 }
Jeej 0:befc17558de9 56
Jeej 0:befc17558de9 57 if ((*file)->file_id == fid)
Jeej 0:befc17558de9 58 {
Jeej 0:befc17558de9 59 ram_fs_file_t* file_old = *file;
Jeej 0:befc17558de9 60 *file = (ram_fs_file_t*)file_old->next;
Jeej 0:befc17558de9 61 FREE(file_old);
Jeej 0:befc17558de9 62 return false;
Jeej 0:befc17558de9 63 }
Jeej 0:befc17558de9 64
Jeej 0:befc17558de9 65 return ram_fs_remove((ram_fs_file_t**)&((*file)->next), fid);
Jeej 0:befc17558de9 66 }
Jeej 0:befc17558de9 67
Jeej 0:befc17558de9 68 void ram_fs_new(uint8_t file_id, uint8_t* header, uint8_t* data)
Jeej 0:befc17558de9 69 {
Jeej 2:91473a2fac1c 70 RAM_FS_PRINT("NF(%d)\r\n", file_id);
Jeej 1:73a2c1814a34 71
Jeej 0:befc17558de9 72 ram_fs_file_t* file_new = (ram_fs_file_t*)MALLOC(sizeof(ram_fs_file_t));
Jeej 0:befc17558de9 73
Jeej 0:befc17558de9 74 file_new->file_id = file_id;
Jeej 0:befc17558de9 75 file_new->header = header;
Jeej 0:befc17558de9 76 file_new->data = data;
Jeej 0:befc17558de9 77 file_new->next = NULL;
Jeej 0:befc17558de9 78
Jeej 3:1bc9159847ab 79 ram_fs_update(&g_fs, file_new);
Jeej 0:befc17558de9 80 }
Jeej 0:befc17558de9 81
Jeej 0:befc17558de9 82 bool ram_fs_delete(uint8_t file_id)
Jeej 0:befc17558de9 83 {
Jeej 2:91473a2fac1c 84 RAM_FS_PRINT("DF(%d)\r\n", file_id);
Jeej 0:befc17558de9 85 return ram_fs_remove(&g_fs, file_id);
Jeej 0:befc17558de9 86 }
Jeej 0:befc17558de9 87
Jeej 0:befc17558de9 88 bool ram_fs_write(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* content)
Jeej 0:befc17558de9 89 {
Jeej 0:befc17558de9 90 ram_fs_file_t* file;
Jeej 0:befc17558de9 91
Jeej 2:91473a2fac1c 92 RAM_FS_PRINT("WF(%d)\r\n", file_id);
Jeej 0:befc17558de9 93
Jeej 0:befc17558de9 94 // Retrieve pointer to file
Jeej 0:befc17558de9 95 file = ram_fs_get(g_fs, file_id);
Jeej 0:befc17558de9 96
Jeej 0:befc17558de9 97 if (file == NULL)
Jeej 0:befc17558de9 98 {
Jeej 0:befc17558de9 99 return true;
Jeej 0:befc17558de9 100 }
Jeej 0:befc17558de9 101
Jeej 0:befc17558de9 102 // Write the new data
Jeej 0:befc17558de9 103 memcpy((void*)(file->data+offset), (void*)content, size);
Jeej 0:befc17558de9 104
Jeej 0:befc17558de9 105 return false;
Jeej 0:befc17558de9 106 }
Jeej 0:befc17558de9 107
Jeej 0:befc17558de9 108 bool ram_fs_read(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* buf)
Jeej 0:befc17558de9 109 {
Jeej 0:befc17558de9 110 ram_fs_file_t* file;
Jeej 0:befc17558de9 111
Jeej 2:91473a2fac1c 112 RAM_FS_PRINT("RF(%d)\r\n", file_id);
Jeej 0:befc17558de9 113
Jeej 0:befc17558de9 114 // Retrieve pointer to file
Jeej 0:befc17558de9 115 file = ram_fs_get(g_fs, file_id);
Jeej 0:befc17558de9 116
Jeej 0:befc17558de9 117 if (file == NULL)
Jeej 0:befc17558de9 118 {
Jeej 0:befc17558de9 119 return true;
Jeej 0:befc17558de9 120 }
Jeej 0:befc17558de9 121
Jeej 0:befc17558de9 122 // Read data
Jeej 0:befc17558de9 123 memcpy((void*)buf, (void*)(file->data+offset), size);
Jeej 0:befc17558de9 124
Jeej 0:befc17558de9 125 return false;
Jeej 0:befc17558de9 126 }
Jeej 0:befc17558de9 127
Jeej 0:befc17558de9 128 void* ram_fs_get_header(uint8_t file_id)
Jeej 0:befc17558de9 129 {
Jeej 0:befc17558de9 130 ram_fs_file_t* file;
Jeej 0:befc17558de9 131
Jeej 2:91473a2fac1c 132 RAM_FS_PRINT("RH(%d)\r\n", file_id);
Jeej 0:befc17558de9 133
Jeej 0:befc17558de9 134 // Retrieve pointer to file
Jeej 0:befc17558de9 135 file = ram_fs_get(g_fs, file_id);
Jeej 0:befc17558de9 136
Jeej 1:73a2c1814a34 137 //ASSERT(file != NULL, "File %d does not exist!\r\n", file_id);
Jeej 0:befc17558de9 138
Jeej 1:73a2c1814a34 139 if (file == NULL)
Jeej 1:73a2c1814a34 140 {
Jeej 1:73a2c1814a34 141 return NULL;
Jeej 1:73a2c1814a34 142 }
Jeej 1:73a2c1814a34 143 else
Jeej 1:73a2c1814a34 144 {
Jeej 1:73a2c1814a34 145 // Return header pointer
Jeej 1:73a2c1814a34 146 return file->header;
Jeej 1:73a2c1814a34 147 }
Jeej 0:befc17558de9 148 }