Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2006-2013 ARM Limited
sahilmgandhi 18:6a4db94011d3 3 *
sahilmgandhi 18:6a4db94011d3 4 * Licensed under the Apache License, Version 2.0 (the "License");
sahilmgandhi 18:6a4db94011d3 5 * you may not use this file except in compliance with the License.
sahilmgandhi 18:6a4db94011d3 6 * You may obtain a copy of the License at
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * http://www.apache.org/licenses/LICENSE-2.0
sahilmgandhi 18:6a4db94011d3 9 *
sahilmgandhi 18:6a4db94011d3 10 * Unless required by applicable law or agreed to in writing, software
sahilmgandhi 18:6a4db94011d3 11 * distributed under the License is distributed on an "AS IS" BASIS,
sahilmgandhi 18:6a4db94011d3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sahilmgandhi 18:6a4db94011d3 13 * See the License for the specific language governing permissions and
sahilmgandhi 18:6a4db94011d3 14 * limitations under the License.
sahilmgandhi 18:6a4db94011d3 15 */
sahilmgandhi 18:6a4db94011d3 16 #include "drivers/LocalFileSystem.h"
sahilmgandhi 18:6a4db94011d3 17
sahilmgandhi 18:6a4db94011d3 18 #if DEVICE_LOCALFILESYSTEM
sahilmgandhi 18:6a4db94011d3 19
sahilmgandhi 18:6a4db94011d3 20 #include "platform/mbed_semihost_api.h"
sahilmgandhi 18:6a4db94011d3 21 #include <string.h>
sahilmgandhi 18:6a4db94011d3 22 #include <stdio.h>
sahilmgandhi 18:6a4db94011d3 23
sahilmgandhi 18:6a4db94011d3 24 namespace mbed {
sahilmgandhi 18:6a4db94011d3 25
sahilmgandhi 18:6a4db94011d3 26 /* Extension to FINFO type defined in RTL.h (in Keil RL) - adds 'create time'. */
sahilmgandhi 18:6a4db94011d3 27 typedef struct {
sahilmgandhi 18:6a4db94011d3 28 unsigned char hr; /* Hours [0..23] */
sahilmgandhi 18:6a4db94011d3 29 unsigned char min; /* Minutes [0..59] */
sahilmgandhi 18:6a4db94011d3 30 unsigned char sec; /* Seconds [0..59] */
sahilmgandhi 18:6a4db94011d3 31 unsigned char day; /* Day [1..31] */
sahilmgandhi 18:6a4db94011d3 32 unsigned char mon; /* Month [1..12] */
sahilmgandhi 18:6a4db94011d3 33 unsigned short year; /* Year [1980..2107] */
sahilmgandhi 18:6a4db94011d3 34 } FTIME;
sahilmgandhi 18:6a4db94011d3 35
sahilmgandhi 18:6a4db94011d3 36 typedef struct { /* File Search info record */
sahilmgandhi 18:6a4db94011d3 37 char name[32]; /* File name */
sahilmgandhi 18:6a4db94011d3 38 long size; /* File size in bytes */
sahilmgandhi 18:6a4db94011d3 39 int fileID; /* System File Identification */
sahilmgandhi 18:6a4db94011d3 40 FTIME create_time; /* Date & time file was created */
sahilmgandhi 18:6a4db94011d3 41 FTIME write_time; /* Date & time of last write */
sahilmgandhi 18:6a4db94011d3 42 } XFINFO;
sahilmgandhi 18:6a4db94011d3 43
sahilmgandhi 18:6a4db94011d3 44 #define RESERVED_FOR_USER_APPLICATIONS (0x100) /* 0x100 - 0x1ff */
sahilmgandhi 18:6a4db94011d3 45 #define USR_XFFIND (RESERVED_FOR_USER_APPLICATIONS + 0)
sahilmgandhi 18:6a4db94011d3 46
sahilmgandhi 18:6a4db94011d3 47 static int xffind (const char *pattern, XFINFO *info) {
sahilmgandhi 18:6a4db94011d3 48 unsigned param[4];
sahilmgandhi 18:6a4db94011d3 49
sahilmgandhi 18:6a4db94011d3 50 param[0] = (unsigned long)pattern;
sahilmgandhi 18:6a4db94011d3 51 param[1] = (unsigned long)strlen(pattern);
sahilmgandhi 18:6a4db94011d3 52 param[2] = (unsigned long)info;
sahilmgandhi 18:6a4db94011d3 53 param[3] = (unsigned long)sizeof(XFINFO);
sahilmgandhi 18:6a4db94011d3 54
sahilmgandhi 18:6a4db94011d3 55 return __semihost(USR_XFFIND, param);
sahilmgandhi 18:6a4db94011d3 56 }
sahilmgandhi 18:6a4db94011d3 57
sahilmgandhi 18:6a4db94011d3 58 #define OPEN_R 0
sahilmgandhi 18:6a4db94011d3 59 #define OPEN_B 1
sahilmgandhi 18:6a4db94011d3 60 #define OPEN_PLUS 2
sahilmgandhi 18:6a4db94011d3 61 #define OPEN_W 4
sahilmgandhi 18:6a4db94011d3 62 #define OPEN_A 8
sahilmgandhi 18:6a4db94011d3 63 #define OPEN_INVALID -1
sahilmgandhi 18:6a4db94011d3 64
sahilmgandhi 18:6a4db94011d3 65 int posix_to_semihost_open_flags(int flags) {
sahilmgandhi 18:6a4db94011d3 66 /* POSIX flags -> semihosting open mode */
sahilmgandhi 18:6a4db94011d3 67 int openmode;
sahilmgandhi 18:6a4db94011d3 68 if (flags & O_RDWR) {
sahilmgandhi 18:6a4db94011d3 69 /* a plus mode */
sahilmgandhi 18:6a4db94011d3 70 openmode = OPEN_PLUS;
sahilmgandhi 18:6a4db94011d3 71 if (flags & O_APPEND) {
sahilmgandhi 18:6a4db94011d3 72 openmode |= OPEN_A;
sahilmgandhi 18:6a4db94011d3 73 } else if (flags & O_TRUNC) {
sahilmgandhi 18:6a4db94011d3 74 openmode |= OPEN_W;
sahilmgandhi 18:6a4db94011d3 75 } else {
sahilmgandhi 18:6a4db94011d3 76 openmode |= OPEN_R;
sahilmgandhi 18:6a4db94011d3 77 }
sahilmgandhi 18:6a4db94011d3 78 } else if (flags & O_WRONLY) {
sahilmgandhi 18:6a4db94011d3 79 /* write or append */
sahilmgandhi 18:6a4db94011d3 80 if (flags & O_APPEND) {
sahilmgandhi 18:6a4db94011d3 81 openmode = OPEN_A;
sahilmgandhi 18:6a4db94011d3 82 } else {
sahilmgandhi 18:6a4db94011d3 83 openmode = OPEN_W;
sahilmgandhi 18:6a4db94011d3 84 }
sahilmgandhi 18:6a4db94011d3 85 } else if (flags == O_RDONLY) {
sahilmgandhi 18:6a4db94011d3 86 /* read mode */
sahilmgandhi 18:6a4db94011d3 87 openmode = OPEN_R;
sahilmgandhi 18:6a4db94011d3 88 } else {
sahilmgandhi 18:6a4db94011d3 89 /* invalid flags */
sahilmgandhi 18:6a4db94011d3 90 openmode = OPEN_INVALID;
sahilmgandhi 18:6a4db94011d3 91 }
sahilmgandhi 18:6a4db94011d3 92
sahilmgandhi 18:6a4db94011d3 93 return openmode;
sahilmgandhi 18:6a4db94011d3 94 }
sahilmgandhi 18:6a4db94011d3 95
sahilmgandhi 18:6a4db94011d3 96 FILEHANDLE local_file_open(const char* name, int flags) {
sahilmgandhi 18:6a4db94011d3 97 int openmode = posix_to_semihost_open_flags(flags);
sahilmgandhi 18:6a4db94011d3 98 if (openmode == OPEN_INVALID) {
sahilmgandhi 18:6a4db94011d3 99 return (FILEHANDLE)NULL;
sahilmgandhi 18:6a4db94011d3 100 }
sahilmgandhi 18:6a4db94011d3 101
sahilmgandhi 18:6a4db94011d3 102 FILEHANDLE fh = semihost_open(name, openmode);
sahilmgandhi 18:6a4db94011d3 103 if (fh == -1) {
sahilmgandhi 18:6a4db94011d3 104 return (FILEHANDLE)NULL;
sahilmgandhi 18:6a4db94011d3 105 }
sahilmgandhi 18:6a4db94011d3 106
sahilmgandhi 18:6a4db94011d3 107 return fh;
sahilmgandhi 18:6a4db94011d3 108 }
sahilmgandhi 18:6a4db94011d3 109
sahilmgandhi 18:6a4db94011d3 110 LocalFileHandle::LocalFileHandle(FILEHANDLE fh) : _fh(fh), pos(0) {
sahilmgandhi 18:6a4db94011d3 111 // No lock needed in constructor
sahilmgandhi 18:6a4db94011d3 112 }
sahilmgandhi 18:6a4db94011d3 113
sahilmgandhi 18:6a4db94011d3 114 int LocalFileHandle::close() {
sahilmgandhi 18:6a4db94011d3 115 int retval = semihost_close(_fh);
sahilmgandhi 18:6a4db94011d3 116 delete this;
sahilmgandhi 18:6a4db94011d3 117 return retval;
sahilmgandhi 18:6a4db94011d3 118 }
sahilmgandhi 18:6a4db94011d3 119
sahilmgandhi 18:6a4db94011d3 120 ssize_t LocalFileHandle::write(const void *buffer, size_t length) {
sahilmgandhi 18:6a4db94011d3 121 lock();
sahilmgandhi 18:6a4db94011d3 122 ssize_t n = semihost_write(_fh, (const unsigned char*)buffer, length, 0); // number of characters not written
sahilmgandhi 18:6a4db94011d3 123 n = length - n; // number of characters written
sahilmgandhi 18:6a4db94011d3 124 pos += n;
sahilmgandhi 18:6a4db94011d3 125 unlock();
sahilmgandhi 18:6a4db94011d3 126 return n;
sahilmgandhi 18:6a4db94011d3 127 }
sahilmgandhi 18:6a4db94011d3 128
sahilmgandhi 18:6a4db94011d3 129 ssize_t LocalFileHandle::read(void *buffer, size_t length) {
sahilmgandhi 18:6a4db94011d3 130 lock();
sahilmgandhi 18:6a4db94011d3 131 ssize_t n = semihost_read(_fh, (unsigned char*)buffer, length, 0); // number of characters not read
sahilmgandhi 18:6a4db94011d3 132 n = length - n; // number of characters read
sahilmgandhi 18:6a4db94011d3 133 pos += n;
sahilmgandhi 18:6a4db94011d3 134 unlock();
sahilmgandhi 18:6a4db94011d3 135 return n;
sahilmgandhi 18:6a4db94011d3 136 }
sahilmgandhi 18:6a4db94011d3 137
sahilmgandhi 18:6a4db94011d3 138 int LocalFileHandle::isatty() {
sahilmgandhi 18:6a4db94011d3 139 lock();
sahilmgandhi 18:6a4db94011d3 140 int ret = semihost_istty(_fh);
sahilmgandhi 18:6a4db94011d3 141 unlock();
sahilmgandhi 18:6a4db94011d3 142 return ret;
sahilmgandhi 18:6a4db94011d3 143 }
sahilmgandhi 18:6a4db94011d3 144
sahilmgandhi 18:6a4db94011d3 145 off_t LocalFileHandle::lseek(off_t position, int whence) {
sahilmgandhi 18:6a4db94011d3 146 lock();
sahilmgandhi 18:6a4db94011d3 147 if (whence == SEEK_CUR) {
sahilmgandhi 18:6a4db94011d3 148 position += pos;
sahilmgandhi 18:6a4db94011d3 149 } else if (whence == SEEK_END) {
sahilmgandhi 18:6a4db94011d3 150 position += semihost_flen(_fh);
sahilmgandhi 18:6a4db94011d3 151 } /* otherwise SEEK_SET, so position is fine */
sahilmgandhi 18:6a4db94011d3 152
sahilmgandhi 18:6a4db94011d3 153 /* Always seems to return -1, so just ignore for now. */
sahilmgandhi 18:6a4db94011d3 154 semihost_seek(_fh, position);
sahilmgandhi 18:6a4db94011d3 155 pos = position;
sahilmgandhi 18:6a4db94011d3 156 unlock();
sahilmgandhi 18:6a4db94011d3 157 return position;
sahilmgandhi 18:6a4db94011d3 158 }
sahilmgandhi 18:6a4db94011d3 159
sahilmgandhi 18:6a4db94011d3 160 int LocalFileHandle::fsync() {
sahilmgandhi 18:6a4db94011d3 161 lock();
sahilmgandhi 18:6a4db94011d3 162 int ret = semihost_ensure(_fh);
sahilmgandhi 18:6a4db94011d3 163 unlock();
sahilmgandhi 18:6a4db94011d3 164 return ret;
sahilmgandhi 18:6a4db94011d3 165 }
sahilmgandhi 18:6a4db94011d3 166
sahilmgandhi 18:6a4db94011d3 167 off_t LocalFileHandle::flen() {
sahilmgandhi 18:6a4db94011d3 168 lock();
sahilmgandhi 18:6a4db94011d3 169 off_t off = semihost_flen(_fh);
sahilmgandhi 18:6a4db94011d3 170 unlock();
sahilmgandhi 18:6a4db94011d3 171 return off;
sahilmgandhi 18:6a4db94011d3 172 }
sahilmgandhi 18:6a4db94011d3 173
sahilmgandhi 18:6a4db94011d3 174 void LocalFileHandle::lock() {
sahilmgandhi 18:6a4db94011d3 175 _mutex.lock();
sahilmgandhi 18:6a4db94011d3 176 }
sahilmgandhi 18:6a4db94011d3 177
sahilmgandhi 18:6a4db94011d3 178 void LocalFileHandle::unlock() {
sahilmgandhi 18:6a4db94011d3 179 _mutex.unlock();
sahilmgandhi 18:6a4db94011d3 180 }
sahilmgandhi 18:6a4db94011d3 181
sahilmgandhi 18:6a4db94011d3 182 class LocalDirHandle : public DirHandle {
sahilmgandhi 18:6a4db94011d3 183
sahilmgandhi 18:6a4db94011d3 184 public:
sahilmgandhi 18:6a4db94011d3 185 struct dirent cur_entry;
sahilmgandhi 18:6a4db94011d3 186 XFINFO info;
sahilmgandhi 18:6a4db94011d3 187
sahilmgandhi 18:6a4db94011d3 188 LocalDirHandle() : cur_entry(), info() {
sahilmgandhi 18:6a4db94011d3 189 }
sahilmgandhi 18:6a4db94011d3 190
sahilmgandhi 18:6a4db94011d3 191 virtual int closedir() {
sahilmgandhi 18:6a4db94011d3 192 // No lock can be used in destructor
sahilmgandhi 18:6a4db94011d3 193 delete this;
sahilmgandhi 18:6a4db94011d3 194 return 0;
sahilmgandhi 18:6a4db94011d3 195 }
sahilmgandhi 18:6a4db94011d3 196
sahilmgandhi 18:6a4db94011d3 197 virtual struct dirent *readdir() {
sahilmgandhi 18:6a4db94011d3 198 lock();
sahilmgandhi 18:6a4db94011d3 199 if (xffind("*", &info)!=0) {
sahilmgandhi 18:6a4db94011d3 200 unlock();
sahilmgandhi 18:6a4db94011d3 201 return NULL;
sahilmgandhi 18:6a4db94011d3 202 }
sahilmgandhi 18:6a4db94011d3 203 memcpy(cur_entry.d_name, info.name, sizeof(info.name));
sahilmgandhi 18:6a4db94011d3 204 unlock();
sahilmgandhi 18:6a4db94011d3 205 return &cur_entry;
sahilmgandhi 18:6a4db94011d3 206 }
sahilmgandhi 18:6a4db94011d3 207
sahilmgandhi 18:6a4db94011d3 208 virtual void rewinddir() {
sahilmgandhi 18:6a4db94011d3 209 lock();
sahilmgandhi 18:6a4db94011d3 210 info.fileID = 0;
sahilmgandhi 18:6a4db94011d3 211 unlock();
sahilmgandhi 18:6a4db94011d3 212 }
sahilmgandhi 18:6a4db94011d3 213
sahilmgandhi 18:6a4db94011d3 214 virtual off_t telldir() {
sahilmgandhi 18:6a4db94011d3 215 lock();
sahilmgandhi 18:6a4db94011d3 216 int fileId = info.fileID;
sahilmgandhi 18:6a4db94011d3 217 unlock();
sahilmgandhi 18:6a4db94011d3 218 return fileId;
sahilmgandhi 18:6a4db94011d3 219 }
sahilmgandhi 18:6a4db94011d3 220
sahilmgandhi 18:6a4db94011d3 221 virtual void seekdir(off_t offset) {
sahilmgandhi 18:6a4db94011d3 222 lock();
sahilmgandhi 18:6a4db94011d3 223 info.fileID = offset;
sahilmgandhi 18:6a4db94011d3 224 unlock();
sahilmgandhi 18:6a4db94011d3 225 }
sahilmgandhi 18:6a4db94011d3 226
sahilmgandhi 18:6a4db94011d3 227 protected:
sahilmgandhi 18:6a4db94011d3 228 PlatformMutex _mutex;
sahilmgandhi 18:6a4db94011d3 229
sahilmgandhi 18:6a4db94011d3 230 virtual void lock() {
sahilmgandhi 18:6a4db94011d3 231 _mutex.lock();
sahilmgandhi 18:6a4db94011d3 232 }
sahilmgandhi 18:6a4db94011d3 233
sahilmgandhi 18:6a4db94011d3 234 virtual void unlock() {
sahilmgandhi 18:6a4db94011d3 235 _mutex.unlock();
sahilmgandhi 18:6a4db94011d3 236 }
sahilmgandhi 18:6a4db94011d3 237 };
sahilmgandhi 18:6a4db94011d3 238
sahilmgandhi 18:6a4db94011d3 239 FileHandle *LocalFileSystem::open(const char* name, int flags) {
sahilmgandhi 18:6a4db94011d3 240 // No global state modified so function is thread safe
sahilmgandhi 18:6a4db94011d3 241
sahilmgandhi 18:6a4db94011d3 242 /* reject filenames with / in them */
sahilmgandhi 18:6a4db94011d3 243 for (const char *tmp = name; *tmp; tmp++) {
sahilmgandhi 18:6a4db94011d3 244 if (*tmp == '/') {
sahilmgandhi 18:6a4db94011d3 245 return NULL;
sahilmgandhi 18:6a4db94011d3 246 }
sahilmgandhi 18:6a4db94011d3 247 }
sahilmgandhi 18:6a4db94011d3 248
sahilmgandhi 18:6a4db94011d3 249 int openmode = posix_to_semihost_open_flags(flags);
sahilmgandhi 18:6a4db94011d3 250 if (openmode == OPEN_INVALID) {
sahilmgandhi 18:6a4db94011d3 251 return NULL;
sahilmgandhi 18:6a4db94011d3 252 }
sahilmgandhi 18:6a4db94011d3 253
sahilmgandhi 18:6a4db94011d3 254 FILEHANDLE fh = semihost_open(name, openmode);
sahilmgandhi 18:6a4db94011d3 255 if (fh == -1) {
sahilmgandhi 18:6a4db94011d3 256 return NULL;
sahilmgandhi 18:6a4db94011d3 257 }
sahilmgandhi 18:6a4db94011d3 258 return new LocalFileHandle(fh);
sahilmgandhi 18:6a4db94011d3 259 }
sahilmgandhi 18:6a4db94011d3 260
sahilmgandhi 18:6a4db94011d3 261 int LocalFileSystem::remove(const char *filename) {
sahilmgandhi 18:6a4db94011d3 262 // No global state modified so function is thread safe
sahilmgandhi 18:6a4db94011d3 263
sahilmgandhi 18:6a4db94011d3 264 return semihost_remove(filename);
sahilmgandhi 18:6a4db94011d3 265 }
sahilmgandhi 18:6a4db94011d3 266
sahilmgandhi 18:6a4db94011d3 267 DirHandle *LocalFileSystem::opendir(const char *name) {
sahilmgandhi 18:6a4db94011d3 268 // No global state modified so function is thread safe
sahilmgandhi 18:6a4db94011d3 269
sahilmgandhi 18:6a4db94011d3 270 return new LocalDirHandle();
sahilmgandhi 18:6a4db94011d3 271 }
sahilmgandhi 18:6a4db94011d3 272
sahilmgandhi 18:6a4db94011d3 273 } // namespace mbed
sahilmgandhi 18:6a4db94011d3 274
sahilmgandhi 18:6a4db94011d3 275 #endif