Example of Mbed filesystem using HeapBlockDevice

Dependents:   TemperatureButtonFile AccelleratorRead

Committer:
mbed_official
Date:
Fri Dec 15 11:15:18 2017 +0000
Revision:
1:2bfc377bcc2a
Parent:
0:8e251d9511b8
Child:
10:38d6b74b0eb7
Merge pull request #10 from ARMmbed/example-updates

Update example and docs based on feedback
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-filesystem

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:8e251d9511b8 1 /* mbed Microcontroller Library
mbed_official 0:8e251d9511b8 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 0:8e251d9511b8 3 *
mbed_official 0:8e251d9511b8 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:8e251d9511b8 5 * you may not use this file except in compliance with the License.
mbed_official 0:8e251d9511b8 6 * You may obtain a copy of the License at
mbed_official 0:8e251d9511b8 7 *
mbed_official 0:8e251d9511b8 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:8e251d9511b8 9 *
mbed_official 0:8e251d9511b8 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:8e251d9511b8 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:8e251d9511b8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:8e251d9511b8 13 * See the License for the specific language governing permissions and
mbed_official 0:8e251d9511b8 14 * limitations under the License.
mbed_official 0:8e251d9511b8 15 */
mbed_official 0:8e251d9511b8 16 #include "mbed.h"
mbed_official 0:8e251d9511b8 17 #include <stdio.h>
mbed_official 0:8e251d9511b8 18 #include <errno.h>
mbed_official 0:8e251d9511b8 19
mbed_official 0:8e251d9511b8 20 // Block devices
mbed_official 0:8e251d9511b8 21 #include "SPIFBlockDevice.h"
mbed_official 1:2bfc377bcc2a 22 #include "DataFlashBlockDevice.h"
mbed_official 0:8e251d9511b8 23 #include "SDBlockDevice.h"
mbed_official 0:8e251d9511b8 24 #include "HeapBlockDevice.h"
mbed_official 0:8e251d9511b8 25
mbed_official 0:8e251d9511b8 26 // File systems
mbed_official 0:8e251d9511b8 27 #include "LittleFileSystem.h"
mbed_official 0:8e251d9511b8 28 #include "FATFileSystem.h"
mbed_official 0:8e251d9511b8 29
mbed_official 0:8e251d9511b8 30
mbed_official 0:8e251d9511b8 31 // Physical block device, can be any device that supports the BlockDevice API
mbed_official 0:8e251d9511b8 32 SPIFBlockDevice bd(
mbed_official 0:8e251d9511b8 33 MBED_CONF_SPIF_DRIVER_SPI_MOSI,
mbed_official 0:8e251d9511b8 34 MBED_CONF_SPIF_DRIVER_SPI_MISO,
mbed_official 0:8e251d9511b8 35 MBED_CONF_SPIF_DRIVER_SPI_CLK,
mbed_official 0:8e251d9511b8 36 MBED_CONF_SPIF_DRIVER_SPI_CS);
mbed_official 0:8e251d9511b8 37
mbed_official 0:8e251d9511b8 38 // File system declaration
mbed_official 0:8e251d9511b8 39 LittleFileSystem fs("fs");
mbed_official 0:8e251d9511b8 40
mbed_official 0:8e251d9511b8 41
mbed_official 0:8e251d9511b8 42 // Set up the button to trigger an erase
mbed_official 0:8e251d9511b8 43 InterruptIn irq(BUTTON1);
mbed_official 0:8e251d9511b8 44 void erase() {
mbed_official 0:8e251d9511b8 45 printf("Initializing the block device... ");
mbed_official 0:8e251d9511b8 46 fflush(stdout);
mbed_official 0:8e251d9511b8 47 int err = bd.init();
mbed_official 0:8e251d9511b8 48 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 49 if (err) {
mbed_official 0:8e251d9511b8 50 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 51 }
mbed_official 0:8e251d9511b8 52
mbed_official 0:8e251d9511b8 53 printf("Erasing the block device... ");
mbed_official 0:8e251d9511b8 54 fflush(stdout);
mbed_official 0:8e251d9511b8 55 err = bd.erase(0, bd.size());
mbed_official 0:8e251d9511b8 56 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 57 if (err) {
mbed_official 0:8e251d9511b8 58 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 59 }
mbed_official 0:8e251d9511b8 60
mbed_official 0:8e251d9511b8 61 printf("Deinitializing the block device... ");
mbed_official 0:8e251d9511b8 62 fflush(stdout);
mbed_official 0:8e251d9511b8 63 err = bd.deinit();
mbed_official 0:8e251d9511b8 64 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 65 if (err) {
mbed_official 0:8e251d9511b8 66 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 67 }
mbed_official 0:8e251d9511b8 68 }
mbed_official 0:8e251d9511b8 69
mbed_official 0:8e251d9511b8 70
mbed_official 0:8e251d9511b8 71 // Entry point for the example
mbed_official 0:8e251d9511b8 72 int main() {
mbed_official 0:8e251d9511b8 73 printf("--- Mbed OS filesystem example ---\n");
mbed_official 0:8e251d9511b8 74
mbed_official 0:8e251d9511b8 75 // Setup the irq in case we want to use it
mbed_official 0:8e251d9511b8 76 irq.fall(erase);
mbed_official 0:8e251d9511b8 77
mbed_official 0:8e251d9511b8 78 // Try to mount the filesystem
mbed_official 0:8e251d9511b8 79 printf("Mounting the filesystem... ");
mbed_official 0:8e251d9511b8 80 fflush(stdout);
mbed_official 0:8e251d9511b8 81 int err = fs.mount(&bd);
mbed_official 0:8e251d9511b8 82 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 83 if (err) {
mbed_official 0:8e251d9511b8 84 // Reformat if we can't mount the filesystem
mbed_official 0:8e251d9511b8 85 // this should only happen on the first boot
mbed_official 0:8e251d9511b8 86 printf("No filesystem found, formatting... ");
mbed_official 0:8e251d9511b8 87 fflush(stdout);
mbed_official 0:8e251d9511b8 88 err = fs.reformat(&bd);
mbed_official 0:8e251d9511b8 89 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 90 if (err) {
mbed_official 0:8e251d9511b8 91 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 92 }
mbed_official 0:8e251d9511b8 93 }
mbed_official 0:8e251d9511b8 94
mbed_official 0:8e251d9511b8 95 // Open the numbers file
mbed_official 0:8e251d9511b8 96 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 97 fflush(stdout);
mbed_official 0:8e251d9511b8 98 FILE *f = fopen("/fs/numbers.txt", "r+");
mbed_official 0:8e251d9511b8 99 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 100 if (!f) {
mbed_official 0:8e251d9511b8 101 // Create the numbers file if it doesn't exist
mbed_official 0:8e251d9511b8 102 printf("No file found, creating a new file... ");
mbed_official 0:8e251d9511b8 103 fflush(stdout);
mbed_official 0:8e251d9511b8 104 f = fopen("/fs/numbers.txt", "w+");
mbed_official 0:8e251d9511b8 105 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 106 if (!f) {
mbed_official 0:8e251d9511b8 107 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 108 }
mbed_official 0:8e251d9511b8 109
mbed_official 0:8e251d9511b8 110 for (int i = 0; i < 10; i++) {
mbed_official 0:8e251d9511b8 111 printf("\rWriting numbers (%d/%d)... ", i, 10);
mbed_official 0:8e251d9511b8 112 fflush(stdout);
mbed_official 0:8e251d9511b8 113 err = fprintf(f, " %d\n", i);
mbed_official 0:8e251d9511b8 114 if (err < 0) {
mbed_official 0:8e251d9511b8 115 printf("Fail :(\n");
mbed_official 0:8e251d9511b8 116 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 117 }
mbed_official 0:8e251d9511b8 118 }
mbed_official 0:8e251d9511b8 119 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
mbed_official 0:8e251d9511b8 120
mbed_official 0:8e251d9511b8 121 printf("Seeking file... ");
mbed_official 0:8e251d9511b8 122 fflush(stdout);
mbed_official 0:8e251d9511b8 123 err = fseek(f, 0, SEEK_SET);
mbed_official 0:8e251d9511b8 124 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 125 if (err < 0) {
mbed_official 0:8e251d9511b8 126 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 127 }
mbed_official 0:8e251d9511b8 128 }
mbed_official 0:8e251d9511b8 129
mbed_official 0:8e251d9511b8 130 // Go through and increment the numbers
mbed_official 0:8e251d9511b8 131 for (int i = 0; i < 10; i++) {
mbed_official 0:8e251d9511b8 132 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
mbed_official 0:8e251d9511b8 133 fflush(stdout);
mbed_official 0:8e251d9511b8 134
mbed_official 0:8e251d9511b8 135 // Get current stream position
mbed_official 0:8e251d9511b8 136 long pos = ftell(f);
mbed_official 0:8e251d9511b8 137
mbed_official 0:8e251d9511b8 138 // Parse out the number and increment
mbed_official 0:8e251d9511b8 139 int32_t number;
mbed_official 0:8e251d9511b8 140 fscanf(f, "%d", &number);
mbed_official 0:8e251d9511b8 141 number += 1;
mbed_official 0:8e251d9511b8 142
mbed_official 0:8e251d9511b8 143 // Seek to beginning of number
mbed_official 0:8e251d9511b8 144 fseek(f, pos, SEEK_SET);
mbed_official 0:8e251d9511b8 145
mbed_official 0:8e251d9511b8 146 // Store number
mbed_official 0:8e251d9511b8 147 fprintf(f, " %d\n", number);
mbed_official 0:8e251d9511b8 148 }
mbed_official 0:8e251d9511b8 149 printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
mbed_official 0:8e251d9511b8 150
mbed_official 0:8e251d9511b8 151 // Close the file which also flushes any cached writes
mbed_official 0:8e251d9511b8 152 printf("Closing \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 153 fflush(stdout);
mbed_official 0:8e251d9511b8 154 err = fclose(f);
mbed_official 0:8e251d9511b8 155 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 156 if (err < 0) {
mbed_official 0:8e251d9511b8 157 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 158 }
mbed_official 0:8e251d9511b8 159
mbed_official 0:8e251d9511b8 160 // Display the root directory
mbed_official 0:8e251d9511b8 161 printf("Opening the root directory... ");
mbed_official 0:8e251d9511b8 162 fflush(stdout);
mbed_official 0:8e251d9511b8 163 DIR *d = opendir("/fs/");
mbed_official 0:8e251d9511b8 164 printf("%s\n", (!d ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 165 if (!d) {
mbed_official 0:8e251d9511b8 166 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 167 }
mbed_official 0:8e251d9511b8 168
mbed_official 0:8e251d9511b8 169 printf("root directory:\n");
mbed_official 0:8e251d9511b8 170 while (true) {
mbed_official 0:8e251d9511b8 171 struct dirent *e = readdir(d);
mbed_official 0:8e251d9511b8 172 if (!e) {
mbed_official 0:8e251d9511b8 173 break;
mbed_official 0:8e251d9511b8 174 }
mbed_official 0:8e251d9511b8 175
mbed_official 0:8e251d9511b8 176 printf(" %s\n", e->d_name);
mbed_official 0:8e251d9511b8 177 }
mbed_official 0:8e251d9511b8 178
mbed_official 0:8e251d9511b8 179 printf("Closing the root directory... ");
mbed_official 0:8e251d9511b8 180 fflush(stdout);
mbed_official 0:8e251d9511b8 181 err = closedir(d);
mbed_official 0:8e251d9511b8 182 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 183 if (err < 0) {
mbed_official 0:8e251d9511b8 184 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 185 }
mbed_official 0:8e251d9511b8 186
mbed_official 0:8e251d9511b8 187 // Display the numbers file
mbed_official 0:8e251d9511b8 188 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 189 fflush(stdout);
mbed_official 0:8e251d9511b8 190 f = fopen("/fs/numbers.txt", "r");
mbed_official 0:8e251d9511b8 191 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 192 if (!f) {
mbed_official 0:8e251d9511b8 193 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 194 }
mbed_official 0:8e251d9511b8 195
mbed_official 0:8e251d9511b8 196 printf("numbers:\n");
mbed_official 0:8e251d9511b8 197 while (!feof(f)) {
mbed_official 0:8e251d9511b8 198 int c = fgetc(f);
mbed_official 0:8e251d9511b8 199 printf("%c", c);
mbed_official 0:8e251d9511b8 200 }
mbed_official 0:8e251d9511b8 201
mbed_official 0:8e251d9511b8 202 printf("\rClosing \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 203 fflush(stdout);
mbed_official 0:8e251d9511b8 204 err = fclose(f);
mbed_official 0:8e251d9511b8 205 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 206 if (err < 0) {
mbed_official 0:8e251d9511b8 207 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 208 }
mbed_official 0:8e251d9511b8 209
mbed_official 0:8e251d9511b8 210 // Tidy up
mbed_official 0:8e251d9511b8 211 printf("Unmounting... ");
mbed_official 0:8e251d9511b8 212 fflush(stdout);
mbed_official 0:8e251d9511b8 213 err = fs.unmount();
mbed_official 0:8e251d9511b8 214 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 215 if (err < 0) {
mbed_official 0:8e251d9511b8 216 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 217 }
mbed_official 0:8e251d9511b8 218
mbed_official 0:8e251d9511b8 219 printf("Mbed OS filesystem example done!\n");
mbed_official 0:8e251d9511b8 220 }
mbed_official 0:8e251d9511b8 221