.

Committer:
mbed_official
Date:
Fri Nov 22 11:01:47 2019 +0000
Revision:
33:3a0681d09e16
Parent:
32:decaa56b2fd0
Merge pull request #94 from 0xc0170/fix_license

add contributing file
.
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 29:d28cf713107b 2 * Copyright (c) 2006-2019 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 26:06d3aa3eff55 20 #include "BlockDevice.h"
mbed_official 0:8e251d9511b8 21
mbed_official 32:decaa56b2fd0 22 // Maximum number of elements in buffer
mbed_official 32:decaa56b2fd0 23 #define BUFFER_MAX_LEN 10
mbed_official 32:decaa56b2fd0 24
mbed_official 28:bc8560ba955d 25 // This will take the system's default block device
mbed_official 28:bc8560ba955d 26 BlockDevice *bd = BlockDevice::get_default_instance();
mbed_official 28:bc8560ba955d 27
mbed_official 28:bc8560ba955d 28 // Instead of the default block device, you can define your own block device.
mbed_official 28:bc8560ba955d 29 // For example: HeapBlockDevice with size of 2048 bytes, read size 1, write size 1 and erase size 512.
mbed_official 28:bc8560ba955d 30 // #include "HeapBlockDevice.h"
mbed_official 28:bc8560ba955d 31 // BlockDevice *bd = new HeapBlockDevice(2048, 1, 1, 512);
mbed_official 0:8e251d9511b8 32
mbed_official 0:8e251d9511b8 33
mbed_official 28:bc8560ba955d 34 // This example uses LittleFileSystem as the default file system
mbed_official 28:bc8560ba955d 35 #include "LittleFileSystem.h"
mbed_official 28:bc8560ba955d 36 LittleFileSystem fs("fs");
mbed_official 0:8e251d9511b8 37
mbed_official 28:bc8560ba955d 38 // Uncomment the following two lines and comment the previous two to use FAT file system.
mbed_official 28:bc8560ba955d 39 // #include "FATFileSystem.h"
mbed_official 28:bc8560ba955d 40 // FATFileSystem fs("fs");
mbed_official 0:8e251d9511b8 41
mbed_official 0:8e251d9511b8 42
mbed_official 0:8e251d9511b8 43 // Set up the button to trigger an erase
mbed_official 0:8e251d9511b8 44 InterruptIn irq(BUTTON1);
mbed_official 0:8e251d9511b8 45 void erase() {
mbed_official 0:8e251d9511b8 46 printf("Initializing the block device... ");
mbed_official 0:8e251d9511b8 47 fflush(stdout);
mbed_official 26:06d3aa3eff55 48 int err = bd->init();
mbed_official 0:8e251d9511b8 49 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 50 if (err) {
mbed_official 0:8e251d9511b8 51 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 52 }
mbed_official 0:8e251d9511b8 53
mbed_official 0:8e251d9511b8 54 printf("Erasing the block device... ");
mbed_official 0:8e251d9511b8 55 fflush(stdout);
mbed_official 26:06d3aa3eff55 56 err = bd->erase(0, bd->size());
mbed_official 0:8e251d9511b8 57 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 58 if (err) {
mbed_official 0:8e251d9511b8 59 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 60 }
mbed_official 0:8e251d9511b8 61
mbed_official 0:8e251d9511b8 62 printf("Deinitializing the block device... ");
mbed_official 0:8e251d9511b8 63 fflush(stdout);
mbed_official 26:06d3aa3eff55 64 err = bd->deinit();
mbed_official 0:8e251d9511b8 65 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 66 if (err) {
mbed_official 0:8e251d9511b8 67 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 68 }
mbed_official 0:8e251d9511b8 69 }
mbed_official 0:8e251d9511b8 70
mbed_official 0:8e251d9511b8 71
mbed_official 0:8e251d9511b8 72 // Entry point for the example
mbed_official 0:8e251d9511b8 73 int main() {
mbed_official 0:8e251d9511b8 74 printf("--- Mbed OS filesystem example ---\n");
mbed_official 0:8e251d9511b8 75
mbed_official 12:a07d0af60cc6 76 // Setup the erase event on button press, use the event queue
mbed_official 12:a07d0af60cc6 77 // to avoid running in interrupt context
mbed_official 12:a07d0af60cc6 78 irq.fall(mbed_event_queue()->event(erase));
mbed_official 0:8e251d9511b8 79
mbed_official 0:8e251d9511b8 80 // Try to mount the filesystem
mbed_official 0:8e251d9511b8 81 printf("Mounting the filesystem... ");
mbed_official 0:8e251d9511b8 82 fflush(stdout);
mbed_official 26:06d3aa3eff55 83 int err = fs.mount(bd);
mbed_official 0:8e251d9511b8 84 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 85 if (err) {
mbed_official 0:8e251d9511b8 86 // Reformat if we can't mount the filesystem
mbed_official 0:8e251d9511b8 87 // this should only happen on the first boot
mbed_official 0:8e251d9511b8 88 printf("No filesystem found, formatting... ");
mbed_official 0:8e251d9511b8 89 fflush(stdout);
mbed_official 26:06d3aa3eff55 90 err = fs.reformat(bd);
mbed_official 0:8e251d9511b8 91 printf("%s\n", (err ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 92 if (err) {
mbed_official 0:8e251d9511b8 93 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 94 }
mbed_official 0:8e251d9511b8 95 }
mbed_official 0:8e251d9511b8 96
mbed_official 0:8e251d9511b8 97 // Open the numbers file
mbed_official 0:8e251d9511b8 98 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 99 fflush(stdout);
mbed_official 0:8e251d9511b8 100 FILE *f = fopen("/fs/numbers.txt", "r+");
mbed_official 0:8e251d9511b8 101 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 102 if (!f) {
mbed_official 0:8e251d9511b8 103 // Create the numbers file if it doesn't exist
mbed_official 0:8e251d9511b8 104 printf("No file found, creating a new file... ");
mbed_official 0:8e251d9511b8 105 fflush(stdout);
mbed_official 0:8e251d9511b8 106 f = fopen("/fs/numbers.txt", "w+");
mbed_official 0:8e251d9511b8 107 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 108 if (!f) {
mbed_official 0:8e251d9511b8 109 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 110 }
mbed_official 0:8e251d9511b8 111
mbed_official 0:8e251d9511b8 112 for (int i = 0; i < 10; i++) {
mbed_official 0:8e251d9511b8 113 printf("\rWriting numbers (%d/%d)... ", i, 10);
mbed_official 0:8e251d9511b8 114 fflush(stdout);
mbed_official 0:8e251d9511b8 115 err = fprintf(f, " %d\n", i);
mbed_official 0:8e251d9511b8 116 if (err < 0) {
mbed_official 0:8e251d9511b8 117 printf("Fail :(\n");
mbed_official 0:8e251d9511b8 118 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 119 }
mbed_official 0:8e251d9511b8 120 }
mbed_official 0:8e251d9511b8 121 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
mbed_official 0:8e251d9511b8 122
mbed_official 0:8e251d9511b8 123 printf("Seeking file... ");
mbed_official 0:8e251d9511b8 124 fflush(stdout);
mbed_official 0:8e251d9511b8 125 err = fseek(f, 0, SEEK_SET);
mbed_official 0:8e251d9511b8 126 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 127 if (err < 0) {
mbed_official 0:8e251d9511b8 128 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 129 }
mbed_official 0:8e251d9511b8 130 }
mbed_official 0:8e251d9511b8 131
mbed_official 0:8e251d9511b8 132 // Go through and increment the numbers
mbed_official 0:8e251d9511b8 133 for (int i = 0; i < 10; i++) {
mbed_official 0:8e251d9511b8 134 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
mbed_official 0:8e251d9511b8 135 fflush(stdout);
mbed_official 0:8e251d9511b8 136
mbed_official 0:8e251d9511b8 137 // Get current stream position
mbed_official 0:8e251d9511b8 138 long pos = ftell(f);
mbed_official 0:8e251d9511b8 139
mbed_official 0:8e251d9511b8 140 // Parse out the number and increment
mbed_official 32:decaa56b2fd0 141 char buf[BUFFER_MAX_LEN];
mbed_official 32:decaa56b2fd0 142 if (!fgets(buf, BUFFER_MAX_LEN, f)) {
mbed_official 32:decaa56b2fd0 143 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 32:decaa56b2fd0 144 }
mbed_official 32:decaa56b2fd0 145 char *endptr;
mbed_official 32:decaa56b2fd0 146 int32_t number = strtol(buf, &endptr, 10);
mbed_official 32:decaa56b2fd0 147 if (
mbed_official 32:decaa56b2fd0 148 (errno == ERANGE) || // The number is too small/large
mbed_official 32:decaa56b2fd0 149 (endptr == buf) || // No character was read
mbed_official 32:decaa56b2fd0 150 (*endptr && *endptr != '\n') // The whole input was not converted
mbed_official 32:decaa56b2fd0 151 ) {
mbed_official 32:decaa56b2fd0 152 continue;
mbed_official 32:decaa56b2fd0 153 }
mbed_official 0:8e251d9511b8 154 number += 1;
mbed_official 0:8e251d9511b8 155
mbed_official 0:8e251d9511b8 156 // Seek to beginning of number
mbed_official 0:8e251d9511b8 157 fseek(f, pos, SEEK_SET);
mbed_official 0:8e251d9511b8 158
mbed_official 0:8e251d9511b8 159 // Store number
mbed_official 0:8e251d9511b8 160 fprintf(f, " %d\n", number);
mbed_official 10:38d6b74b0eb7 161
mbed_official 10:38d6b74b0eb7 162 // Flush between write and read on same file
mbed_official 10:38d6b74b0eb7 163 fflush(f);
mbed_official 0:8e251d9511b8 164 }
mbed_official 0:8e251d9511b8 165 printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
mbed_official 0:8e251d9511b8 166
mbed_official 0:8e251d9511b8 167 // Close the file which also flushes any cached writes
mbed_official 0:8e251d9511b8 168 printf("Closing \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 169 fflush(stdout);
mbed_official 0:8e251d9511b8 170 err = fclose(f);
mbed_official 0:8e251d9511b8 171 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 172 if (err < 0) {
mbed_official 0:8e251d9511b8 173 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 174 }
mbed_official 0:8e251d9511b8 175
mbed_official 0:8e251d9511b8 176 // Display the root directory
mbed_official 0:8e251d9511b8 177 printf("Opening the root directory... ");
mbed_official 0:8e251d9511b8 178 fflush(stdout);
mbed_official 0:8e251d9511b8 179 DIR *d = opendir("/fs/");
mbed_official 0:8e251d9511b8 180 printf("%s\n", (!d ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 181 if (!d) {
mbed_official 0:8e251d9511b8 182 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 183 }
mbed_official 0:8e251d9511b8 184
mbed_official 0:8e251d9511b8 185 printf("root directory:\n");
mbed_official 0:8e251d9511b8 186 while (true) {
mbed_official 0:8e251d9511b8 187 struct dirent *e = readdir(d);
mbed_official 0:8e251d9511b8 188 if (!e) {
mbed_official 0:8e251d9511b8 189 break;
mbed_official 0:8e251d9511b8 190 }
mbed_official 0:8e251d9511b8 191
mbed_official 0:8e251d9511b8 192 printf(" %s\n", e->d_name);
mbed_official 0:8e251d9511b8 193 }
mbed_official 0:8e251d9511b8 194
mbed_official 0:8e251d9511b8 195 printf("Closing the root directory... ");
mbed_official 0:8e251d9511b8 196 fflush(stdout);
mbed_official 0:8e251d9511b8 197 err = closedir(d);
mbed_official 0:8e251d9511b8 198 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 199 if (err < 0) {
mbed_official 0:8e251d9511b8 200 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 201 }
mbed_official 0:8e251d9511b8 202
mbed_official 0:8e251d9511b8 203 // Display the numbers file
mbed_official 0:8e251d9511b8 204 printf("Opening \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 205 fflush(stdout);
mbed_official 0:8e251d9511b8 206 f = fopen("/fs/numbers.txt", "r");
mbed_official 0:8e251d9511b8 207 printf("%s\n", (!f ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 208 if (!f) {
mbed_official 0:8e251d9511b8 209 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 210 }
mbed_official 0:8e251d9511b8 211
mbed_official 0:8e251d9511b8 212 printf("numbers:\n");
mbed_official 0:8e251d9511b8 213 while (!feof(f)) {
mbed_official 0:8e251d9511b8 214 int c = fgetc(f);
mbed_official 0:8e251d9511b8 215 printf("%c", c);
mbed_official 0:8e251d9511b8 216 }
mbed_official 0:8e251d9511b8 217
mbed_official 0:8e251d9511b8 218 printf("\rClosing \"/fs/numbers.txt\"... ");
mbed_official 0:8e251d9511b8 219 fflush(stdout);
mbed_official 0:8e251d9511b8 220 err = fclose(f);
mbed_official 0:8e251d9511b8 221 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 222 if (err < 0) {
mbed_official 0:8e251d9511b8 223 error("error: %s (%d)\n", strerror(errno), -errno);
mbed_official 0:8e251d9511b8 224 }
mbed_official 0:8e251d9511b8 225
mbed_official 0:8e251d9511b8 226 // Tidy up
mbed_official 0:8e251d9511b8 227 printf("Unmounting... ");
mbed_official 0:8e251d9511b8 228 fflush(stdout);
mbed_official 0:8e251d9511b8 229 err = fs.unmount();
mbed_official 0:8e251d9511b8 230 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
mbed_official 0:8e251d9511b8 231 if (err < 0) {
mbed_official 0:8e251d9511b8 232 error("error: %s (%d)\n", strerror(-err), err);
mbed_official 0:8e251d9511b8 233 }
mbed_official 0:8e251d9511b8 234
mbed_official 0:8e251d9511b8 235 printf("Mbed OS filesystem example done!\n");
mbed_official 0:8e251d9511b8 236 }
mbed_official 0:8e251d9511b8 237