Marco Mayer / Mbed OS Queue
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /* mbed Microcontroller Library
demayer 0:6bf0743ece18 2 * Copyright (c) 2006-2012 ARM Limited
demayer 0:6bf0743ece18 3 *
demayer 0:6bf0743ece18 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
demayer 0:6bf0743ece18 5 * of this software and associated documentation files (the "Software"), to deal
demayer 0:6bf0743ece18 6 * in the Software without restriction, including without limitation the rights
demayer 0:6bf0743ece18 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
demayer 0:6bf0743ece18 8 * copies of the Software, and to permit persons to whom the Software is
demayer 0:6bf0743ece18 9 * furnished to do so, subject to the following conditions:
demayer 0:6bf0743ece18 10 *
demayer 0:6bf0743ece18 11 * The above copyright notice and this permission notice shall be included in
demayer 0:6bf0743ece18 12 * all copies or substantial portions of the Software.
demayer 0:6bf0743ece18 13 *
demayer 0:6bf0743ece18 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
demayer 0:6bf0743ece18 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
demayer 0:6bf0743ece18 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
demayer 0:6bf0743ece18 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
demayer 0:6bf0743ece18 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
demayer 0:6bf0743ece18 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
demayer 0:6bf0743ece18 20 * SOFTWARE.
demayer 0:6bf0743ece18 21 */
demayer 0:6bf0743ece18 22 #ifndef MBED_FATFILESYSTEM_H
demayer 0:6bf0743ece18 23 #define MBED_FATFILESYSTEM_H
demayer 0:6bf0743ece18 24
demayer 0:6bf0743ece18 25 #include "FileSystem.h"
demayer 0:6bf0743ece18 26 #include "BlockDevice.h"
demayer 0:6bf0743ece18 27 #include "FileHandle.h"
demayer 0:6bf0743ece18 28 #include "ff.h"
demayer 0:6bf0743ece18 29 #include <stdint.h>
demayer 0:6bf0743ece18 30 #include "PlatformMutex.h"
demayer 0:6bf0743ece18 31
demayer 0:6bf0743ece18 32 using namespace mbed;
demayer 0:6bf0743ece18 33
demayer 0:6bf0743ece18 34 /**
demayer 0:6bf0743ece18 35 * FATFileSystem based on ChaN's Fat Filesystem library v0.8
demayer 0:6bf0743ece18 36 */
demayer 0:6bf0743ece18 37 class FATFileSystem : public FileSystem {
demayer 0:6bf0743ece18 38 public:
demayer 0:6bf0743ece18 39 /** Lifetime of the FATFileSystem
demayer 0:6bf0743ece18 40 *
demayer 0:6bf0743ece18 41 * @param name Name to add filesystem to tree as
demayer 0:6bf0743ece18 42 * @param bd BlockDevice to mount, may be passed instead to mount call
demayer 0:6bf0743ece18 43 */
demayer 0:6bf0743ece18 44 FATFileSystem(const char *name = NULL, BlockDevice *bd = NULL);
demayer 0:6bf0743ece18 45 virtual ~FATFileSystem();
demayer 0:6bf0743ece18 46
demayer 0:6bf0743ece18 47 /** Formats a logical drive, FDISK partitioning rule.
demayer 0:6bf0743ece18 48 *
demayer 0:6bf0743ece18 49 * The block device to format should be mounted when this function is called.
demayer 0:6bf0743ece18 50 *
demayer 0:6bf0743ece18 51 * @param bd
demayer 0:6bf0743ece18 52 * This is the block device that will be formatted.
demayer 0:6bf0743ece18 53 *
demayer 0:6bf0743ece18 54 * @param cluster_size
demayer 0:6bf0743ece18 55 * This is the number of bytes per cluster. A larger cluster size will decrease
demayer 0:6bf0743ece18 56 * the overhead of the FAT table, but also increase the minimum file size. The
demayer 0:6bf0743ece18 57 * cluster_size must be a multiple of the underlying device's allocation unit
demayer 0:6bf0743ece18 58 * and is currently limited to a max of 32,768 bytes. If zero, a cluster size
demayer 0:6bf0743ece18 59 * will be determined from the device's allocation unit. Defaults to zero.
demayer 0:6bf0743ece18 60 *
demayer 0:6bf0743ece18 61 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 62 */
demayer 0:6bf0743ece18 63 static int format(BlockDevice *bd, bd_size_t cluster_size = 0);
demayer 0:6bf0743ece18 64
demayer 0:6bf0743ece18 65 /** Mounts a filesystem to a block device
demayer 0:6bf0743ece18 66 *
demayer 0:6bf0743ece18 67 * @param bd BlockDevice to mount to
demayer 0:6bf0743ece18 68 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 69 */
demayer 0:6bf0743ece18 70 virtual int mount(BlockDevice *bd);
demayer 0:6bf0743ece18 71
demayer 0:6bf0743ece18 72 /** Unmounts a filesystem from the underlying block device
demayer 0:6bf0743ece18 73 *
demayer 0:6bf0743ece18 74 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 75 */
demayer 0:6bf0743ece18 76 virtual int unmount();
demayer 0:6bf0743ece18 77
demayer 0:6bf0743ece18 78 /** Reformats a filesystem, results in an empty and mounted filesystem
demayer 0:6bf0743ece18 79 *
demayer 0:6bf0743ece18 80 * @param bd
demayer 0:6bf0743ece18 81 * BlockDevice to reformat and mount. If NULL, the mounted
demayer 0:6bf0743ece18 82 * block device will be used.
demayer 0:6bf0743ece18 83 * Note: if mount fails, bd must be provided.
demayer 0:6bf0743ece18 84 * Default: NULL
demayer 0:6bf0743ece18 85 *
demayer 0:6bf0743ece18 86 * @param allocation_unit
demayer 0:6bf0743ece18 87 * This is the number of bytes per cluster size. The valid value is N
demayer 0:6bf0743ece18 88 * times the sector size. N is a power of 2 from 1 to 128 for FAT
demayer 0:6bf0743ece18 89 * volume and upto 16MiB for exFAT volume. If zero is given,
demayer 0:6bf0743ece18 90 * the default allocation unit size is selected by the underlying
demayer 0:6bf0743ece18 91 * filesystem, which depends on the volume size.
demayer 0:6bf0743ece18 92 *
demayer 0:6bf0743ece18 93 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 94 */
demayer 0:6bf0743ece18 95 virtual int reformat(BlockDevice *bd, int allocation_unit);
demayer 0:6bf0743ece18 96
demayer 0:6bf0743ece18 97 /** Reformats a filesystem, results in an empty and mounted filesystem
demayer 0:6bf0743ece18 98 *
demayer 0:6bf0743ece18 99 * @param bd BlockDevice to reformat and mount. If NULL, the mounted
demayer 0:6bf0743ece18 100 * block device will be used.
demayer 0:6bf0743ece18 101 * Note: if mount fails, bd must be provided.
demayer 0:6bf0743ece18 102 * Default: NULL
demayer 0:6bf0743ece18 103 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 104 */
demayer 0:6bf0743ece18 105 virtual int reformat(BlockDevice *bd = NULL)
demayer 0:6bf0743ece18 106 {
demayer 0:6bf0743ece18 107 // required for virtual inheritance shenanigans
demayer 0:6bf0743ece18 108 return reformat(bd, 0);
demayer 0:6bf0743ece18 109 }
demayer 0:6bf0743ece18 110
demayer 0:6bf0743ece18 111 /** Remove a file from the filesystem.
demayer 0:6bf0743ece18 112 *
demayer 0:6bf0743ece18 113 * @param path The name of the file to remove.
demayer 0:6bf0743ece18 114 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 115 */
demayer 0:6bf0743ece18 116 virtual int remove(const char *path);
demayer 0:6bf0743ece18 117
demayer 0:6bf0743ece18 118 /** Rename a file in the filesystem.
demayer 0:6bf0743ece18 119 *
demayer 0:6bf0743ece18 120 * @param path The name of the file to rename.
demayer 0:6bf0743ece18 121 * @param newpath The name to rename it to
demayer 0:6bf0743ece18 122 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 123 */
demayer 0:6bf0743ece18 124 virtual int rename(const char *path, const char *newpath);
demayer 0:6bf0743ece18 125
demayer 0:6bf0743ece18 126 /** Store information about the file in a stat structure
demayer 0:6bf0743ece18 127 *
demayer 0:6bf0743ece18 128 * @param path The name of the file to find information about
demayer 0:6bf0743ece18 129 * @param st The stat buffer to write to
demayer 0:6bf0743ece18 130 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 131 */
demayer 0:6bf0743ece18 132 virtual int stat(const char *path, struct stat *st);
demayer 0:6bf0743ece18 133
demayer 0:6bf0743ece18 134 /** Create a directory in the filesystem.
demayer 0:6bf0743ece18 135 *
demayer 0:6bf0743ece18 136 * @param path The name of the directory to create.
demayer 0:6bf0743ece18 137 * @param mode The permissions with which to create the directory
demayer 0:6bf0743ece18 138 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 139 */
demayer 0:6bf0743ece18 140 virtual int mkdir(const char *path, mode_t mode);
demayer 0:6bf0743ece18 141
demayer 0:6bf0743ece18 142 protected:
demayer 0:6bf0743ece18 143 /** Open a file on the filesystem
demayer 0:6bf0743ece18 144 *
demayer 0:6bf0743ece18 145 * @param file Destination for the handle to a newly created file
demayer 0:6bf0743ece18 146 * @param path The name of the file to open
demayer 0:6bf0743ece18 147 * @param flags The flags to open the file in, one of O_RDONLY, O_WRONLY, O_RDWR,
demayer 0:6bf0743ece18 148 * bitwise or'd with one of O_CREAT, O_TRUNC, O_APPEND
demayer 0:6bf0743ece18 149 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 150 */
demayer 0:6bf0743ece18 151 virtual int file_open(fs_file_t *file, const char *path, int flags);
demayer 0:6bf0743ece18 152
demayer 0:6bf0743ece18 153 /** Close a file
demayer 0:6bf0743ece18 154 *
demayer 0:6bf0743ece18 155 * @param file File handle
demayer 0:6bf0743ece18 156 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 157 */
demayer 0:6bf0743ece18 158 virtual int file_close(fs_file_t file);
demayer 0:6bf0743ece18 159
demayer 0:6bf0743ece18 160 /** Read the contents of a file into a buffer
demayer 0:6bf0743ece18 161 *
demayer 0:6bf0743ece18 162 * @param file File handle
demayer 0:6bf0743ece18 163 * @param buffer The buffer to read in to
demayer 0:6bf0743ece18 164 * @param len The number of bytes to read
demayer 0:6bf0743ece18 165 * @return The number of bytes read, 0 at end of file, negative error on failure
demayer 0:6bf0743ece18 166 */
demayer 0:6bf0743ece18 167 virtual ssize_t file_read(fs_file_t file, void *buffer, size_t len);
demayer 0:6bf0743ece18 168
demayer 0:6bf0743ece18 169 /** Write the contents of a buffer to a file
demayer 0:6bf0743ece18 170 *
demayer 0:6bf0743ece18 171 * @param file File handle
demayer 0:6bf0743ece18 172 * @param buffer The buffer to write from
demayer 0:6bf0743ece18 173 * @param len The number of bytes to write
demayer 0:6bf0743ece18 174 * @return The number of bytes written, negative error on failure
demayer 0:6bf0743ece18 175 */
demayer 0:6bf0743ece18 176 virtual ssize_t file_write(fs_file_t file, const void *buffer, size_t len);
demayer 0:6bf0743ece18 177
demayer 0:6bf0743ece18 178 /** Flush any buffers associated with the file
demayer 0:6bf0743ece18 179 *
demayer 0:6bf0743ece18 180 * @param file File handle
demayer 0:6bf0743ece18 181 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 182 */
demayer 0:6bf0743ece18 183 virtual int file_sync(fs_file_t file);
demayer 0:6bf0743ece18 184
demayer 0:6bf0743ece18 185 /** Move the file position to a given offset from from a given location
demayer 0:6bf0743ece18 186 *
demayer 0:6bf0743ece18 187 * @param file File handle
demayer 0:6bf0743ece18 188 * @param offset The offset from whence to move to
demayer 0:6bf0743ece18 189 * @param whence The start of where to seek
demayer 0:6bf0743ece18 190 * SEEK_SET to start from beginning of file,
demayer 0:6bf0743ece18 191 * SEEK_CUR to start from current position in file,
demayer 0:6bf0743ece18 192 * SEEK_END to start from end of file
demayer 0:6bf0743ece18 193 * @return The new offset of the file
demayer 0:6bf0743ece18 194 */
demayer 0:6bf0743ece18 195 virtual off_t file_seek(fs_file_t file, off_t offset, int whence);
demayer 0:6bf0743ece18 196
demayer 0:6bf0743ece18 197 /** Get the file position of the file
demayer 0:6bf0743ece18 198 *
demayer 0:6bf0743ece18 199 * @param file File handle
demayer 0:6bf0743ece18 200 * @return The current offset in the file
demayer 0:6bf0743ece18 201 */
demayer 0:6bf0743ece18 202 virtual off_t file_tell(fs_file_t file);
demayer 0:6bf0743ece18 203
demayer 0:6bf0743ece18 204 /** Get the size of the file
demayer 0:6bf0743ece18 205 *
demayer 0:6bf0743ece18 206 * @param file File handle
demayer 0:6bf0743ece18 207 * @return Size of the file in bytes
demayer 0:6bf0743ece18 208 */
demayer 0:6bf0743ece18 209 virtual off_t file_size(fs_file_t file);
demayer 0:6bf0743ece18 210
demayer 0:6bf0743ece18 211 /** Open a directory on the filesystem
demayer 0:6bf0743ece18 212 *
demayer 0:6bf0743ece18 213 * @param dir Destination for the handle to the directory
demayer 0:6bf0743ece18 214 * @param path Name of the directory to open
demayer 0:6bf0743ece18 215 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 216 */
demayer 0:6bf0743ece18 217 virtual int dir_open(fs_dir_t *dir, const char *path);
demayer 0:6bf0743ece18 218
demayer 0:6bf0743ece18 219 /** Close a directory
demayer 0:6bf0743ece18 220 *
demayer 0:6bf0743ece18 221 * @param dir Dir handle
demayer 0:6bf0743ece18 222 * @return 0 on success, negative error code on failure
demayer 0:6bf0743ece18 223 */
demayer 0:6bf0743ece18 224 virtual int dir_close(fs_dir_t dir);
demayer 0:6bf0743ece18 225
demayer 0:6bf0743ece18 226 /** Read the next directory entry
demayer 0:6bf0743ece18 227 *
demayer 0:6bf0743ece18 228 * @param dir Dir handle
demayer 0:6bf0743ece18 229 * @param ent The directory entry to fill out
demayer 0:6bf0743ece18 230 * @return 1 on reading a filename, 0 at end of directory, negative error on failure
demayer 0:6bf0743ece18 231 */
demayer 0:6bf0743ece18 232 virtual ssize_t dir_read(fs_dir_t dir, struct dirent *ent);
demayer 0:6bf0743ece18 233
demayer 0:6bf0743ece18 234 /** Set the current position of the directory
demayer 0:6bf0743ece18 235 *
demayer 0:6bf0743ece18 236 * @param dir Dir handle
demayer 0:6bf0743ece18 237 * @param offset Offset of the location to seek to,
demayer 0:6bf0743ece18 238 * must be a value returned from dir_tell
demayer 0:6bf0743ece18 239 */
demayer 0:6bf0743ece18 240 virtual void dir_seek(fs_dir_t dir, off_t offset);
demayer 0:6bf0743ece18 241
demayer 0:6bf0743ece18 242 /** Get the current position of the directory
demayer 0:6bf0743ece18 243 *
demayer 0:6bf0743ece18 244 * @param dir Dir handle
demayer 0:6bf0743ece18 245 * @return Position of the directory that can be passed to dir_rewind
demayer 0:6bf0743ece18 246 */
demayer 0:6bf0743ece18 247 virtual off_t dir_tell(fs_dir_t dir);
demayer 0:6bf0743ece18 248
demayer 0:6bf0743ece18 249 /** Rewind the current position to the beginning of the directory
demayer 0:6bf0743ece18 250 *
demayer 0:6bf0743ece18 251 * @param dir Dir handle
demayer 0:6bf0743ece18 252 */
demayer 0:6bf0743ece18 253 virtual void dir_rewind(fs_dir_t dir);
demayer 0:6bf0743ece18 254
demayer 0:6bf0743ece18 255 private:
demayer 0:6bf0743ece18 256 FATFS _fs; // Work area (file system object) for logical drive
demayer 0:6bf0743ece18 257 char _fsid[sizeof("0:")];
demayer 0:6bf0743ece18 258 int _id;
demayer 0:6bf0743ece18 259
demayer 0:6bf0743ece18 260 protected:
demayer 0:6bf0743ece18 261 virtual void lock();
demayer 0:6bf0743ece18 262 virtual void unlock();
demayer 0:6bf0743ece18 263 virtual int mount(BlockDevice *bd, bool mount);
demayer 0:6bf0743ece18 264 };
demayer 0:6bf0743ece18 265
demayer 0:6bf0743ece18 266 #endif