Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 0:87642278ede6
- Child:
- 1:9a5f06e7969e
diff -r 000000000000 -r 87642278ede6 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Feb 06 18:46:53 2019 +0000
@@ -0,0 +1,227 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "mbed.h"
+#include <stdio.h>
+#include <errno.h>
+
+// Block devices
+//#include "SPIFBlockDevice.h"
+//#include "DataFlashBlockDevice.h"
+#include "SDBlockDevice.h"
+//#include "HeapBlockDevice.h"
+
+// File systems
+
+//#include "LittleFileSystem.h"
+#include "FATFileSystem.h"
+
+// Physical block device, can be any device that supports the BlockDevice API
+SDBlockDevice blockDevice(p5, p6, p7, p8);
+
+// File system declaration
+FATFileSystem fileSystem("fs");
+
+// Set up the button to trigger an erase
+InterruptIn btnErase(p11);
+
+void erase()
+{
+ printf("Initializing the block device... ");
+ fflush(stdout);
+
+ int err = blockDevice.init();
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ error("error: %s (%d)\n", strerror(-err), err);
+ }
+
+ printf("Erasing the block device... ");
+ fflush(stdout);
+ err = blockDevice.erase(0, blockDevice.size());
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ error("error: %s (%d)\n", strerror(-err), err);
+ }
+
+ printf("Deinitializing the block device... ");
+ fflush(stdout);
+ err = blockDevice.deinit();
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ error("error: %s (%d)\n", strerror(-err), err);
+ }
+}
+
+// Entry point for the example
+int main()
+{
+ printf("--- Mbed OS filesystem example ---\n");
+
+ // Setup the erase event on button press, use the event queue
+ // to avoid running in interrupt context
+ btnErase.fall(mbed_event_queue()->event(erase));
+
+ // Try to mount the filesystem
+ printf("Mounting the filesystem... ");
+ fflush(stdout);
+
+ int err = fileSystem.mount(&blockDevice);
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ // Reformat if we can't mount the filesystem
+ // this should only happen on the first boot
+ printf("No filesystem found, formatting... ");
+ fflush(stdout);
+ err = fileSystem.reformat(&blockDevice);
+ printf("%s\n", (err ? "Fail :(" : "OK"));
+ if (err) {
+ error("error: %s (%d)\n", strerror(-err), err);
+ }
+ }
+
+ // Open the numbers file
+ printf("Opening \"/fs/numbers.txt\"... ");
+ fflush(stdout);
+
+ FILE* f = fopen("/fs/numbers.txt", "r+");
+ printf("%s\n", (!f ? "Fail :(" : "OK"));
+ if (!f) {
+ // Create the numbers file if it doesn't exist
+ printf("No file found, creating a new file... ");
+ fflush(stdout);
+ f = fopen("/fs/numbers.txt", "w+");
+ printf("%s\n", (!f ? "Fail :(" : "OK"));
+ if (!f) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ for (int i = 0; i < 10; i++) {
+ printf("\rWriting numbers (%d/%d)... ", i, 10);
+ fflush(stdout);
+ err = fprintf(f, " %d\n", i);
+ if (err < 0) {
+ printf("Fail :(\n");
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+ }
+
+ printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
+
+ printf("Seeking file... ");
+ fflush(stdout);
+ err = fseek(f, 0, SEEK_SET);
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+ if (err < 0) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+ }
+
+ // Go through and increment the numbers
+ for (int i = 0; i < 10; i++) {
+ printf("\rIncrementing numbers (%d/%d)... ", i, 10);
+ fflush(stdout);
+
+ // Get current stream position
+ long pos = ftell(f);
+
+ // Parse out the number and increment
+ int32_t number;
+ fscanf(f, "%ld", &number);
+ number += 1;
+
+ // Seek to beginning of number
+ fseek(f, pos, SEEK_SET);
+
+ // Store number
+ fprintf(f, " %ld\n", number);
+
+ // Flush between write and read on same file
+ fflush(f);
+ }
+
+ printf("\rIncrementing numbers (%d/%d)... OK\n", 10, 10);
+
+ // Close the file which also flushes any cached writes
+ printf("Closing \"/fs/numbers.txt\"... ");
+ fflush(stdout);
+ err = fclose(f);
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+ if (err < 0) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ // Display the root directory
+ printf("Opening the root directory... ");
+ fflush(stdout);
+
+ DIR* d = opendir("/fs/");
+ printf("%s\n", (!d ? "Fail :(" : "OK"));
+ if (!d) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ printf("root directory:\n");
+ while (true) {
+ struct dirent* e = readdir(d);
+ if (!e) {
+ break;
+ }
+
+ printf(" %s\n", e->d_name);
+ }
+
+ printf("Closing the root directory... ");
+ fflush(stdout);
+ err = closedir(d);
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+ if (err < 0) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ // Display the numbers file
+ printf("Opening \"/fs/numbers.txt\"... ");
+ fflush(stdout);
+ f = fopen("/fs/numbers.txt", "r");
+ printf("%s\n", (!f ? "Fail :(" : "OK"));
+ if (!f) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ printf("numbers:\n");
+ while (!feof(f)) {
+ int c = fgetc(f);
+ printf("%c", c);
+ }
+
+ printf("\rClosing \"/fs/numbers.txt\"... ");
+ fflush(stdout);
+ err = fclose(f);
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+ if (err < 0) {
+ error("error: %s (%d)\n", strerror(errno), -errno);
+ }
+
+ // Tidy up
+ printf("Unmounting... ");
+ fflush(stdout);
+ err = fileSystem.unmount();
+ printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
+ if (err < 0) {
+ error("error: %s (%d)\n", strerror(-err), err);
+ }
+
+ printf("Mbed OS filesystem example done!\n");
+}