Simple RAM file system.

Dependents:   modem_ref_helper_for_v5_3_217 modem_ref_helper

Committer:
Jeej
Date:
Thu May 04 13:15:20 2017 +0000
Revision:
0:befc17558de9
Child:
1:73a2c1814a34
Added error status return.

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 0:befc17558de9 4 static ram_fs_file_t* g_fs = NULL;
Jeej 0:befc17558de9 5
Jeej 0:befc17558de9 6 static void ram_fs_append(ram_fs_file_t** file, ram_fs_file_t* file_new)
Jeej 0:befc17558de9 7 {
Jeej 0:befc17558de9 8 if (*file == NULL)
Jeej 0:befc17558de9 9 {
Jeej 0:befc17558de9 10 *file = file_new;
Jeej 0:befc17558de9 11 return;
Jeej 0:befc17558de9 12 }
Jeej 0:befc17558de9 13
Jeej 0:befc17558de9 14 ram_fs_append((ram_fs_file_t**)&((*file)->next), file_new);
Jeej 0:befc17558de9 15 }
Jeej 0:befc17558de9 16
Jeej 0:befc17558de9 17 static ram_fs_file_t* ram_fs_get(ram_fs_file_t* file, uint8_t fid)
Jeej 0:befc17558de9 18 {
Jeej 0:befc17558de9 19 if (file == NULL)
Jeej 0:befc17558de9 20 {
Jeej 0:befc17558de9 21 return NULL;
Jeej 0:befc17558de9 22 }
Jeej 0:befc17558de9 23
Jeej 0:befc17558de9 24 if (file->file_id == fid)
Jeej 0:befc17558de9 25 {
Jeej 0:befc17558de9 26 return file;
Jeej 0:befc17558de9 27 }
Jeej 0:befc17558de9 28
Jeej 0:befc17558de9 29 return ram_fs_get((ram_fs_file_t*)file->next, fid);
Jeej 0:befc17558de9 30 }
Jeej 0:befc17558de9 31
Jeej 0:befc17558de9 32 static bool ram_fs_remove(ram_fs_file_t** file, uint8_t fid)
Jeej 0:befc17558de9 33 {
Jeej 0:befc17558de9 34 if (*file == NULL)
Jeej 0:befc17558de9 35 {
Jeej 0:befc17558de9 36 // File does nor exist
Jeej 0:befc17558de9 37 return true;
Jeej 0:befc17558de9 38 }
Jeej 0:befc17558de9 39
Jeej 0:befc17558de9 40 if ((*file)->file_id == fid)
Jeej 0:befc17558de9 41 {
Jeej 0:befc17558de9 42 ram_fs_file_t* file_old = *file;
Jeej 0:befc17558de9 43 *file = (ram_fs_file_t*)file_old->next;
Jeej 0:befc17558de9 44 FREE(file_old);
Jeej 0:befc17558de9 45 return false;
Jeej 0:befc17558de9 46 }
Jeej 0:befc17558de9 47
Jeej 0:befc17558de9 48 return ram_fs_remove((ram_fs_file_t**)&((*file)->next), fid);
Jeej 0:befc17558de9 49 }
Jeej 0:befc17558de9 50
Jeej 0:befc17558de9 51 void ram_fs_new(uint8_t file_id, uint8_t* header, uint8_t* data)
Jeej 0:befc17558de9 52 {
Jeej 0:befc17558de9 53 ram_fs_file_t* file_new = (ram_fs_file_t*)MALLOC(sizeof(ram_fs_file_t));
Jeej 0:befc17558de9 54
Jeej 0:befc17558de9 55 file_new->file_id = file_id;
Jeej 0:befc17558de9 56 file_new->header = header;
Jeej 0:befc17558de9 57 file_new->data = data;
Jeej 0:befc17558de9 58 file_new->next = NULL;
Jeej 0:befc17558de9 59
Jeej 0:befc17558de9 60 ram_fs_append(&g_fs, file_new);
Jeej 0:befc17558de9 61 }
Jeej 0:befc17558de9 62
Jeej 0:befc17558de9 63 bool ram_fs_delete(uint8_t file_id)
Jeej 0:befc17558de9 64 {
Jeej 0:befc17558de9 65 return ram_fs_remove(&g_fs, file_id);
Jeej 0:befc17558de9 66 }
Jeej 0:befc17558de9 67
Jeej 0:befc17558de9 68 bool ram_fs_write(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* content)
Jeej 0:befc17558de9 69 {
Jeej 0:befc17558de9 70 ram_fs_file_t* file;
Jeej 0:befc17558de9 71
Jeej 0:befc17558de9 72 DPRINT("WF %d\r\n", file_id);
Jeej 0:befc17558de9 73
Jeej 0:befc17558de9 74 // Retrieve pointer to file
Jeej 0:befc17558de9 75 file = ram_fs_get(g_fs, file_id);
Jeej 0:befc17558de9 76
Jeej 0:befc17558de9 77 if (file == NULL)
Jeej 0:befc17558de9 78 {
Jeej 0:befc17558de9 79 return true;
Jeej 0:befc17558de9 80 }
Jeej 0:befc17558de9 81
Jeej 0:befc17558de9 82 // Write the new data
Jeej 0:befc17558de9 83 memcpy((void*)(file->data+offset), (void*)content, size);
Jeej 0:befc17558de9 84
Jeej 0:befc17558de9 85 return false;
Jeej 0:befc17558de9 86 }
Jeej 0:befc17558de9 87
Jeej 0:befc17558de9 88 bool ram_fs_read(uint8_t file_id, uint16_t offset, uint16_t size, uint8_t* buf)
Jeej 0:befc17558de9 89 {
Jeej 0:befc17558de9 90 ram_fs_file_t* file;
Jeej 0:befc17558de9 91
Jeej 0:befc17558de9 92 DPRINT("RF %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 // Read data
Jeej 0:befc17558de9 103 memcpy((void*)buf, (void*)(file->data+offset), size);
Jeej 0:befc17558de9 104
Jeej 0:befc17558de9 105 return false;
Jeej 0:befc17558de9 106 }
Jeej 0:befc17558de9 107
Jeej 0:befc17558de9 108 void* ram_fs_get_header(uint8_t file_id)
Jeej 0:befc17558de9 109 {
Jeej 0:befc17558de9 110 ram_fs_file_t* file;
Jeej 0:befc17558de9 111
Jeej 0:befc17558de9 112 DPRINT("RH %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 ASSERT(file != NULL, "File %d does not exist!\r\n", file_id);
Jeej 0:befc17558de9 118
Jeej 0:befc17558de9 119 // Return header pointer
Jeej 0:befc17558de9 120 return file->header;
Jeej 0:befc17558de9 121 }