Nuvoton
/
NuMaker-mbed-SD-FileSystem-example
NuMaker SD-File-System with SD mode
main.cpp
- Committer:
- ccli8
- Date:
- 2022-03-11
- Revision:
- 27:48b42429011a
- Parent:
- 25:1d348ccfc209
File content as of revision 27:48b42429011a:
/* mbed Microcontroller Library * Copyright (c) 2006-2019 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> #include "NuSDBlockDevice.h" #include "FlashSimBlockDevice.h" // Maximum number of elements in buffer #define BUFFER_MAX_LEN 10 // NUSD for block device NuSDBlockDevice *bd_ = new NuSDBlockDevice(); // Add flash-simulate layer on top of NUSD not implementing "erase" characteristic FlashSimBlockDevice *bd = new FlashSimBlockDevice(bd_); // Instead of the default block device, you can define your own block device. // For example: HeapBlockDevice with size of 2048 bytes, read size 1, write size 1 and erase size 512. // #include "HeapBlockDevice.h" // BlockDevice *bd = new HeapBlockDevice(2048, 1, 1, 512); // This example uses FAT file system as the default. #include "FATFileSystem.h" FATFileSystem fs("fs"); // Uncomment in the following two lines and comment out the previous two to use Little file system. //#include "LittleFileSystem.h" //LittleFileSystem fs("fs"); // Set up the button to trigger an erase InterruptIn irq(BUTTON1); void erase() { printf("Initializing the block device... "); fflush(stdout); int err = bd->init(); printf("%s\n", (err ? "Fail :(" : "OK")); if (err) { error("error: %s (%d)\n", strerror(-err), err); } printf("Erasing the block device... "); fflush(stdout); // Whole erase takes too long for SD/NUSD. Just erase the front so that // it will recognize as invalid file system format. //err = bd->erase(0, bd->size()); err = bd->erase(0, 1024*64); printf("%s\n", (err ? "Fail :(" : "OK")); if (err) { error("error: %s (%d)\n", strerror(-err), err); } printf("Deinitializing the block device... "); fflush(stdout); err = bd->deinit(); printf("%s\n", (err ? "Fail :(" : "OK")); if (err) { error("error: %s (%d)\n", strerror(-err), err); } } #if MBED_MAJOR_VERSION >= 6 static auto erase_event = mbed_event_queue()->make_user_allocated_event(erase); #endif // Entry point for the example int main() { #ifdef MBED_MAJOR_VERSION printf("Mbed OS version %d.%d.%d\r\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION); #endif printf("--- Mbed OS filesystem example ---\n"); // Setup the erase event on button press, use the event queue // to avoid running in interrupt context #if MBED_MAJOR_VERSION >= 6 irq.fall(std::ref(erase_event)); #else irq.fall(mbed_event_queue()->event(erase)); #endif // Try to mount the filesystem printf("Mounting the filesystem... "); fflush(stdout); int err = fs.mount(bd); 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 = fs.reformat(bd); 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 char buf[BUFFER_MAX_LEN]; if (!fgets(buf, BUFFER_MAX_LEN, f)) { error("error: %s (%d)\n", strerror(errno), -errno); } char *endptr; int32_t number = strtol(buf, &endptr, 10); if ( (errno == ERANGE) || // The number is too small/large (endptr == buf) || // No character was read (*endptr && *endptr != '\n') // The whole input was not converted ) { continue; } number += 1; // Seek to beginning of number fseek(f, pos, SEEK_SET); // Store number fprintf(f, " %d\n", (int)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 = fs.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"); }