Fork of LaOS. https://github.com/LaosLaser/Firmware

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Sat Mar 08 17:55:59 2014 -0800
Revision:
2:609dd3a73f33
Parent:
1:f5ac63519541
Update.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1 /*
Michael J. Spencer 1:f5ac63519541 2 *
Michael J. Spencer 1:f5ac63519541 3 * LaosFilesystem.cpp
Michael J. Spencer 1:f5ac63519541 4 * Simple Long Filename system on top of SDFilesystem.h
Michael J. Spencer 1:f5ac63519541 5 *
Michael J. Spencer 1:f5ac63519541 6 * Copyright (c) 2011 Jaap Vermaas
Michael J. Spencer 1:f5ac63519541 7 *
Michael J. Spencer 1:f5ac63519541 8 * This file is part of the LaOS project (see: http://wiki.laoslaser.org
Michael J. Spencer 1:f5ac63519541 9 *
Michael J. Spencer 1:f5ac63519541 10 * LaOS is free software: you can redistribute it and/or modify
Michael J. Spencer 1:f5ac63519541 11 * it under the terms of the GNU General Public License as published by
Michael J. Spencer 1:f5ac63519541 12 * the Free Software Foundation, either version 3 of the License, or
Michael J. Spencer 1:f5ac63519541 13 * (at your option) any later version.
Michael J. Spencer 1:f5ac63519541 14 *
Michael J. Spencer 1:f5ac63519541 15 * LaOS is distributed in the hope that it will be useful,
Michael J. Spencer 1:f5ac63519541 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Michael J. Spencer 1:f5ac63519541 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Michael J. Spencer 1:f5ac63519541 18 * GNU General Public License for more details.
Michael J. Spencer 1:f5ac63519541 19 *
Michael J. Spencer 1:f5ac63519541 20 * You should have received a copy of the GNU General Public License
Michael J. Spencer 1:f5ac63519541 21 * along with LaOS. If not, see <http://www.gnu.org/licenses/>.
Michael J. Spencer 1:f5ac63519541 22 *
Michael J. Spencer 1:f5ac63519541 23 */
Michael J. Spencer 1:f5ac63519541 24 #include "laosfilesystem.h"
Michael J. Spencer 1:f5ac63519541 25
Michael J. Spencer 1:f5ac63519541 26 LaosFileSystem::LaosFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
Michael J. Spencer 1:f5ac63519541 27 : SDFileSystem(mosi, miso, sclk, cs, name) {
Michael J. Spencer 1:f5ac63519541 28 sprintf(tablename, "/%s/%s", name, _LAOSFILE_TRANSTABLE);
Michael J. Spencer 1:f5ac63519541 29 sprintf(pathname, "/%s/", name);
Michael J. Spencer 1:f5ac63519541 30 }
Michael J. Spencer 1:f5ac63519541 31
Michael J. Spencer 1:f5ac63519541 32 LaosFileSystem::~LaosFileSystem() {
Michael J. Spencer 1:f5ac63519541 33 }
Michael J. Spencer 1:f5ac63519541 34
Michael J. Spencer 1:f5ac63519541 35 FILE* LaosFileSystem::openfile(char *name, char* iom) {
Michael J. Spencer 1:f5ac63519541 36 if (islegalname(name)) { // check length and chars in name
Michael J. Spencer 1:f5ac63519541 37
Michael J. Spencer 1:f5ac63519541 38 char shortname[SHORTFILESIZE] = "";
Michael J. Spencer 1:f5ac63519541 39 getshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 40 char fullname[MAXFILESIZE+SHORTFILESIZE+1];
Michael J. Spencer 1:f5ac63519541 41 if (strstr(iom, "r")) { // open file for reading
Michael J. Spencer 1:f5ac63519541 42 if (strlen(shortname)!=0) {
Michael J. Spencer 1:f5ac63519541 43 sprintf(fullname, "%s%s", pathname, shortname);
Michael J. Spencer 1:f5ac63519541 44 return fopen(fullname, iom);
Michael J. Spencer 1:f5ac63519541 45 } else { // no file exists
Michael J. Spencer 1:f5ac63519541 46 return NULL;
Michael J. Spencer 1:f5ac63519541 47 }
Michael J. Spencer 1:f5ac63519541 48 } else { // open file for writng
Michael J. Spencer 1:f5ac63519541 49 if (strlen(shortname)!=0) {
Michael J. Spencer 1:f5ac63519541 50 sprintf(fullname, "%s%s", pathname, shortname);
Michael J. Spencer 1:f5ac63519541 51 return fopen(fullname, iom);
Michael J. Spencer 1:f5ac63519541 52 } else { // create a new file
Michael J. Spencer 1:f5ac63519541 53 makeshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 54 sprintf(fullname, "%s%s", pathname, shortname);
Michael J. Spencer 1:f5ac63519541 55 return fopen(fullname, iom);
Michael J. Spencer 1:f5ac63519541 56 }
Michael J. Spencer 1:f5ac63519541 57 }
Michael J. Spencer 1:f5ac63519541 58 } else { // (islegalname(name))
Michael J. Spencer 1:f5ac63519541 59 return NULL;
Michael J. Spencer 1:f5ac63519541 60 }
Michael J. Spencer 1:f5ac63519541 61 }
Michael J. Spencer 1:f5ac63519541 62
Michael J. Spencer 1:f5ac63519541 63 void LaosFileSystem::getlongname(char *result, char *searchname) {
Michael J. Spencer 1:f5ac63519541 64 FILE *fp = fopen(tablename, "r");
Michael J. Spencer 1:f5ac63519541 65 if (fp) {
Michael J. Spencer 1:f5ac63519541 66 char longname[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 67 char shortname[SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 68 while (dirread(longname, shortname, fp))
Michael J. Spencer 1:f5ac63519541 69 if (! strcmp(shortname, searchname))
Michael J. Spencer 1:f5ac63519541 70 break;
Michael J. Spencer 1:f5ac63519541 71 if (strcmp(shortname, searchname))
Michael J. Spencer 1:f5ac63519541 72 strcpy(result, searchname);
Michael J. Spencer 1:f5ac63519541 73 else
Michael J. Spencer 1:f5ac63519541 74 strcpy(result, longname);
Michael J. Spencer 1:f5ac63519541 75 fclose(fp);
Michael J. Spencer 1:f5ac63519541 76 } else {
Michael J. Spencer 1:f5ac63519541 77 strcpy(result, searchname);
Michael J. Spencer 1:f5ac63519541 78 }
Michael J. Spencer 1:f5ac63519541 79 }
Michael J. Spencer 1:f5ac63519541 80
Michael J. Spencer 1:f5ac63519541 81 int LaosFileSystem::islegalname(char* name) {
Michael J. Spencer 1:f5ac63519541 82 if (( strlen(name) > MAXFILESIZE-1 ) || (strlen(name) == 0))
Michael J. Spencer 1:f5ac63519541 83 return 0;
Michael J. Spencer 1:f5ac63519541 84 int legal = 1;
Michael J. Spencer 1:f5ac63519541 85 char nochar[] = "?*,;=+#>|[]/\\";
Michael J. Spencer 1:f5ac63519541 86 int x = 0;
Michael J. Spencer 1:f5ac63519541 87 while (legal && (name[x] != 0)) {
Michael J. Spencer 1:f5ac63519541 88 legal *= (name[x] > 32) && (name[x] < 126);
Michael J. Spencer 1:f5ac63519541 89 int y = 0;
Michael J. Spencer 1:f5ac63519541 90 while (legal && (nochar[y] != 0))
Michael J. Spencer 1:f5ac63519541 91 legal *= name[x] != nochar[y++];
Michael J. Spencer 1:f5ac63519541 92 x++;
Michael J. Spencer 1:f5ac63519541 93 }
Michael J. Spencer 1:f5ac63519541 94 return legal;
Michael J. Spencer 1:f5ac63519541 95 }
Michael J. Spencer 1:f5ac63519541 96
Michael J. Spencer 1:f5ac63519541 97 int LaosFileSystem::isshortname(char* name) {
Michael J. Spencer 1:f5ac63519541 98 int len = strlen(name);
Michael J. Spencer 1:f5ac63519541 99 for (int x=0; x<len; x++)
Michael J. Spencer 1:f5ac63519541 100 if (name[x] == ' ') return 0; // spaces not allowed in shortname
Michael J. Spencer 1:f5ac63519541 101
Michael J. Spencer 1:f5ac63519541 102 char myname[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 103 strcpy(myname, name);
Michael J. Spencer 1:f5ac63519541 104 char *basename = NULL;
Michael J. Spencer 1:f5ac63519541 105 if (len <= SHORTFILESIZE-1) {
Michael J. Spencer 1:f5ac63519541 106 basename = strtok(myname, ".");
Michael J. Spencer 1:f5ac63519541 107 if (strlen(basename) > 8) {
Michael J. Spencer 1:f5ac63519541 108 return 0; // basename was too long
Michael J. Spencer 1:f5ac63519541 109 } else {
Michael J. Spencer 1:f5ac63519541 110 if (char *ext_name = strtok(NULL, ".")) { //
Michael J. Spencer 1:f5ac63519541 111 if ((strlen(basename)+strlen(ext_name)+1) == len) {
Michael J. Spencer 1:f5ac63519541 112 if (strlen(ext_name)<4) {
Michael J. Spencer 1:f5ac63519541 113 return 1; // filename is in 8.3 format
Michael J. Spencer 1:f5ac63519541 114 } else {
Michael J. Spencer 1:f5ac63519541 115 return 0; // extension too long
Michael J. Spencer 1:f5ac63519541 116 }
Michael J. Spencer 1:f5ac63519541 117 } else {
Michael J. Spencer 1:f5ac63519541 118 return 0; // there was more then one dot
Michael J. Spencer 1:f5ac63519541 119 }
Michael J. Spencer 1:f5ac63519541 120 } else {
Michael J. Spencer 1:f5ac63519541 121 return 1; // filename of max 8 chars, no extension (OK)
Michael J. Spencer 1:f5ac63519541 122 }
Michael J. Spencer 1:f5ac63519541 123 }
Michael J. Spencer 1:f5ac63519541 124 } else {
Michael J. Spencer 1:f5ac63519541 125 return 0; // total filename too long
Michael J. Spencer 1:f5ac63519541 126 }
Michael J. Spencer 1:f5ac63519541 127 }
Michael J. Spencer 1:f5ac63519541 128
Michael J. Spencer 1:f5ac63519541 129 void LaosFileSystem::removespaces(char* name) {
Michael J. Spencer 1:f5ac63519541 130 int spaces = 1;
Michael J. Spencer 1:f5ac63519541 131 while (spaces) {
Michael J. Spencer 1:f5ac63519541 132 spaces = 0;
Michael J. Spencer 1:f5ac63519541 133 int x = 0;
Michael J. Spencer 1:f5ac63519541 134 while ((name[x] != ' ') && (x<strlen(name))) x++;
Michael J. Spencer 1:f5ac63519541 135 if (name[x] == ' ') {
Michael J. Spencer 1:f5ac63519541 136 spaces = 1;
Michael J. Spencer 1:f5ac63519541 137 for (int y = x; x<(strlen(name)-1); y++)
Michael J. Spencer 1:f5ac63519541 138 name[y] = name[y+1];
Michael J. Spencer 1:f5ac63519541 139 }
Michael J. Spencer 1:f5ac63519541 140 }
Michael J. Spencer 1:f5ac63519541 141 }
Michael J. Spencer 1:f5ac63519541 142
Michael J. Spencer 1:f5ac63519541 143 void LaosFileSystem::getshortname(char* shortname, char* name) {
Michael J. Spencer 1:f5ac63519541 144 // * open filename translation table
Michael J. Spencer 1:f5ac63519541 145 // * and see if a file with that name exists
Michael J. Spencer 1:f5ac63519541 146 if (isshortname(name)) {
Michael J. Spencer 1:f5ac63519541 147 strcpy(shortname, name);
Michael J. Spencer 1:f5ac63519541 148 } else {
Michael J. Spencer 1:f5ac63519541 149 int found = 0;
Michael J. Spencer 1:f5ac63519541 150 char longname[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 151 FILE *fp = fopen(tablename, "r");
Michael J. Spencer 1:f5ac63519541 152 if (fp) {
Michael J. Spencer 1:f5ac63519541 153 while (dirread(longname, shortname, fp)) {
Michael J. Spencer 1:f5ac63519541 154 if (!strcmp(longname, name)) {
Michael J. Spencer 1:f5ac63519541 155 found = 1;
Michael J. Spencer 1:f5ac63519541 156 break;
Michael J. Spencer 1:f5ac63519541 157 }
Michael J. Spencer 1:f5ac63519541 158 }
Michael J. Spencer 1:f5ac63519541 159 if (! found) strcpy(shortname, "");
Michael J. Spencer 1:f5ac63519541 160 fclose(fp);
Michael J. Spencer 1:f5ac63519541 161 }
Michael J. Spencer 1:f5ac63519541 162 }
Michael J. Spencer 1:f5ac63519541 163 }
Michael J. Spencer 1:f5ac63519541 164
Michael J. Spencer 1:f5ac63519541 165 void LaosFileSystem::makeshortname(char* shortname, char* name) {
Michael J. Spencer 1:f5ac63519541 166 char *tmpname = new char[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 167 strcpy(tmpname, name);
Michael J. Spencer 1:f5ac63519541 168 removespaces(tmpname);
Michael J. Spencer 1:f5ac63519541 169 shorten(tmpname, SHORTFILESIZE);
Michael J. Spencer 1:f5ac63519541 170 char *basename = strtok(tmpname, ".");
Michael J. Spencer 1:f5ac63519541 171 char *ext_name = strtok(NULL, ".");
Michael J. Spencer 1:f5ac63519541 172 strtolower(basename);
Michael J. Spencer 1:f5ac63519541 173 strtolower(ext_name);
Michael J. Spencer 1:f5ac63519541 174 int cnt = 1;
Michael J. Spencer 1:f5ac63519541 175 char fullname[MAXFILESIZE+SHORTFILESIZE+2];
Michael J. Spencer 1:f5ac63519541 176 FILE *fp = NULL;
Michael J. Spencer 1:f5ac63519541 177 do {
Michael J. Spencer 1:f5ac63519541 178 if (fp != NULL) fclose(fp);
Michael J. Spencer 1:f5ac63519541 179 while ((cnt/10+strlen(basename)+2) > 8)
Michael J. Spencer 1:f5ac63519541 180 basename[strlen(basename)-1] = 0;
Michael J. Spencer 1:f5ac63519541 181 if (strlen(ext_name) > 0) {
Michael J. Spencer 1:f5ac63519541 182 sprintf(shortname, "%s~%d.%s", basename, cnt++, ext_name);
Michael J. Spencer 1:f5ac63519541 183 } else {
Michael J. Spencer 1:f5ac63519541 184 sprintf(shortname, "%s~%d", basename, cnt++);
Michael J. Spencer 1:f5ac63519541 185 }
Michael J. Spencer 1:f5ac63519541 186 sprintf(fullname, "%s%s", pathname, shortname);
Michael J. Spencer 1:f5ac63519541 187 fp = fopen(fullname, "rb");
Michael J. Spencer 1:f5ac63519541 188 } while (fp!=NULL);
Michael J. Spencer 1:f5ac63519541 189
Michael J. Spencer 1:f5ac63519541 190 FILE *tfp = fopen(tablename, "ab");
Michael J. Spencer 1:f5ac63519541 191 dirwrite(name, shortname, tfp);
Michael J. Spencer 1:f5ac63519541 192 fclose(tfp);
Michael J. Spencer 1:f5ac63519541 193
Michael J. Spencer 1:f5ac63519541 194 delete(tmpname);
Michael J. Spencer 1:f5ac63519541 195 }
Michael J. Spencer 1:f5ac63519541 196
Michael J. Spencer 1:f5ac63519541 197 void LaosFileSystem::cleanlist() {
Michael J. Spencer 1:f5ac63519541 198 // * open filename translation table
Michael J. Spencer 1:f5ac63519541 199 char longname[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 200 char shortname[SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 201 char tabletmpname[MAXFILESIZE+SHORTFILESIZE+1];
Michael J. Spencer 1:f5ac63519541 202 strcpy (tabletmpname, tablename);
Michael J. Spencer 1:f5ac63519541 203 tabletmpname[strlen(tabletmpname)-1] = '~';
Michael J. Spencer 1:f5ac63519541 204
Michael J. Spencer 1:f5ac63519541 205 // make a full copy of the table
Michael J. Spencer 1:f5ac63519541 206 FILE* fp1 = fopen(tablename, "rb");
Michael J. Spencer 1:f5ac63519541 207 if (fp1 == NULL) return;
Michael J. Spencer 1:f5ac63519541 208 FILE* fp2 = fopen(tabletmpname, "wb");
Michael J. Spencer 1:f5ac63519541 209 if (fp2 == NULL) return;
Michael J. Spencer 1:f5ac63519541 210 while (dirread(longname, shortname, fp1))
Michael J. Spencer 1:f5ac63519541 211 dirwrite(longname, shortname, fp2);
Michael J. Spencer 1:f5ac63519541 212 fclose(fp1);
Michael J. Spencer 1:f5ac63519541 213 fclose(fp2);
Michael J. Spencer 1:f5ac63519541 214
Michael J. Spencer 1:f5ac63519541 215 fp1 = fopen(tablename, "wb");
Michael J. Spencer 1:f5ac63519541 216 if (fp1 == NULL) return;
Michael J. Spencer 1:f5ac63519541 217 fp2 = fopen(tabletmpname, "rb");
Michael J. Spencer 1:f5ac63519541 218 if (fp2 == NULL) return;
Michael J. Spencer 1:f5ac63519541 219 FILE* fp;
Michael J. Spencer 1:f5ac63519541 220 while (dirread(longname, shortname, fp2)) {
Michael J. Spencer 1:f5ac63519541 221 char fullname[MAXFILESIZE+SHORTFILESIZE+1];
Michael J. Spencer 1:f5ac63519541 222 sprintf(fullname, "%s%s", pathname, shortname);
Michael J. Spencer 1:f5ac63519541 223 fp = fopen(fullname, "rb");
Michael J. Spencer 1:f5ac63519541 224 if (fp != NULL) {
Michael J. Spencer 1:f5ac63519541 225 fclose(fp);
Michael J. Spencer 1:f5ac63519541 226 dirwrite(longname, shortname, fp1);
Michael J. Spencer 1:f5ac63519541 227 }
Michael J. Spencer 1:f5ac63519541 228 }
Michael J. Spencer 1:f5ac63519541 229 fclose(fp1);
Michael J. Spencer 1:f5ac63519541 230 fclose(fp2);
Michael J. Spencer 1:f5ac63519541 231 }
Michael J. Spencer 1:f5ac63519541 232
Michael J. Spencer 1:f5ac63519541 233 void LaosFileSystem::shorten(char* name, int max) {
Michael J. Spencer 1:f5ac63519541 234 int len = 0;
Michael J. Spencer 1:f5ac63519541 235 while (name[len++] != 0); /* end of string */
Michael J. Spencer 1:f5ac63519541 236 len--;
Michael J. Spencer 1:f5ac63519541 237 if (len > max-1) {
Michael J. Spencer 1:f5ac63519541 238 int ext = len;
Michael J. Spencer 1:f5ac63519541 239 while (name[--ext] != '.'); /* begin of extension */
Michael J. Spencer 1:f5ac63519541 240 int baselen, extlen;
Michael J. Spencer 1:f5ac63519541 241 baselen = ext;
Michael J. Spencer 1:f5ac63519541 242 extlen = len-ext-1;
Michael J. Spencer 1:f5ac63519541 243 while ((baselen > max-5) && (baselen+extlen+1 > max-1))
Michael J. Spencer 1:f5ac63519541 244 baselen--;
Michael J. Spencer 1:f5ac63519541 245 name[baselen++] = '.';
Michael J. Spencer 1:f5ac63519541 246 while ((ext<len) && (baselen < max-1))
Michael J. Spencer 1:f5ac63519541 247 name[baselen++] = name[++ext];
Michael J. Spencer 1:f5ac63519541 248 name[baselen] = 0;
Michael J. Spencer 1:f5ac63519541 249 }
Michael J. Spencer 1:f5ac63519541 250 }
Michael J. Spencer 1:f5ac63519541 251
Michael J. Spencer 1:f5ac63519541 252 size_t LaosFileSystem::dirread(char* longname, char* shortname, FILE *fp) {
Michael J. Spencer 1:f5ac63519541 253 char buff[MAXFILESIZE+SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 254 size_t result = fread(buff, 1, MAXFILESIZE+SHORTFILESIZE, fp);
Michael J. Spencer 1:f5ac63519541 255 if (result) {
Michael J. Spencer 1:f5ac63519541 256 strncpy(longname, buff, MAXFILESIZE);
Michael J. Spencer 1:f5ac63519541 257 longname[MAXFILESIZE-1] = 0;
Michael J. Spencer 1:f5ac63519541 258 int cnt = MAXFILESIZE-2;
Michael J. Spencer 1:f5ac63519541 259 while (longname[cnt]==' ') longname[cnt--] = 0;
Michael J. Spencer 1:f5ac63519541 260
Michael J. Spencer 1:f5ac63519541 261 strncpy(shortname, &buff[MAXFILESIZE], SHORTFILESIZE);
Michael J. Spencer 1:f5ac63519541 262 shortname[SHORTFILESIZE-1] = 0;
Michael J. Spencer 1:f5ac63519541 263 cnt = SHORTFILESIZE-2;
Michael J. Spencer 1:f5ac63519541 264 while (shortname[cnt]==' ') shortname[cnt--] = 0;
Michael J. Spencer 1:f5ac63519541 265 }
Michael J. Spencer 1:f5ac63519541 266 return result;
Michael J. Spencer 1:f5ac63519541 267 }
Michael J. Spencer 1:f5ac63519541 268
Michael J. Spencer 1:f5ac63519541 269 size_t LaosFileSystem::dirwrite(char* longname, char* shortname, FILE* fp) {
Michael J. Spencer 1:f5ac63519541 270 char buff[MAXFILESIZE+SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 271 int x=0;
Michael J. Spencer 1:f5ac63519541 272 while (longname[x] != 0) buff[x++] = longname[x];
Michael J. Spencer 1:f5ac63519541 273 while (x<MAXFILESIZE-1) buff[x++] = ' ';
Michael J. Spencer 1:f5ac63519541 274 buff[x++] = '\t';
Michael J. Spencer 1:f5ac63519541 275 while (shortname[x-MAXFILESIZE] != 0) buff[x++] = shortname[x-MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 276 while (x<MAXFILESIZE+SHORTFILESIZE-1) buff[x++] = ' ';
Michael J. Spencer 1:f5ac63519541 277 buff[x++] = '\n';
Michael J. Spencer 1:f5ac63519541 278
Michael J. Spencer 1:f5ac63519541 279 return fwrite(buff, 1, MAXFILESIZE+SHORTFILESIZE, fp);
Michael J. Spencer 1:f5ac63519541 280 }
Michael J. Spencer 1:f5ac63519541 281
Michael J. Spencer 1:f5ac63519541 282 void showfile() {
Michael J. Spencer 1:f5ac63519541 283 char buff[35];
Michael J. Spencer 1:f5ac63519541 284 FILE *fp = fopen("/sd/longname.sys","rb");
Michael J. Spencer 1:f5ac63519541 285 if (fp) {
Michael J. Spencer 1:f5ac63519541 286 printf("Contents of longname.sys\n\r");
Michael J. Spencer 1:f5ac63519541 287 while (fread(buff, 1, MAXFILESIZE+SHORTFILESIZE, fp))
Michael J. Spencer 1:f5ac63519541 288 printf("> %s\r", buff);
Michael J. Spencer 1:f5ac63519541 289 fclose(fp);
Michael J. Spencer 1:f5ac63519541 290 printf("\n\r");
Michael J. Spencer 1:f5ac63519541 291 }
Michael J. Spencer 1:f5ac63519541 292 }
Michael J. Spencer 1:f5ac63519541 293
Michael J. Spencer 1:f5ac63519541 294 void cleandir() {
Michael J. Spencer 1:f5ac63519541 295 DIR *d;
Michael J. Spencer 1:f5ac63519541 296 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 297 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 298 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 299 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 300 char fullname[MAXFILESIZE+SHORTFILESIZE+2];
Michael J. Spencer 1:f5ac63519541 301 sprintf(fullname, "/sd/%s", p->d_name);
Michael J. Spencer 1:f5ac63519541 302 remove(fullname);
Michael J. Spencer 1:f5ac63519541 303 }
Michael J. Spencer 1:f5ac63519541 304 } else {
Michael J. Spencer 1:f5ac63519541 305 error("Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 306 }
Michael J. Spencer 1:f5ac63519541 307 }
Michael J. Spencer 1:f5ac63519541 308
Michael J. Spencer 1:f5ac63519541 309 void printdir() {
Michael J. Spencer 1:f5ac63519541 310 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 311 printf("List of files in /sd\n\r");
Michael J. Spencer 1:f5ac63519541 312 DIR *d;
Michael J. Spencer 1:f5ac63519541 313 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 314 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 315 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 316 // printf("...\n\r");
Michael J. Spencer 1:f5ac63519541 317 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 318 // printf("Short %s\n\r", p->d_name);
Michael J. Spencer 1:f5ac63519541 319 if (strncmp(p->d_name, "longname.sy",11)) {
Michael J. Spencer 1:f5ac63519541 320 char longname[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 321 // printf("Getlongname\n\r");
Michael J. Spencer 1:f5ac63519541 322 sd.getlongname(longname, p->d_name);
Michael J. Spencer 1:f5ac63519541 323 printf(" - %s (short: %s)\n\r", longname, p->d_name);
Michael J. Spencer 1:f5ac63519541 324 }
Michael J. Spencer 1:f5ac63519541 325 }
Michael J. Spencer 1:f5ac63519541 326 } else {
Michael J. Spencer 1:f5ac63519541 327 printf("Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 328 }
Michael J. Spencer 1:f5ac63519541 329 }
Michael J. Spencer 1:f5ac63519541 330
Michael J. Spencer 1:f5ac63519541 331 void getprevjob(char *name) {
Michael J. Spencer 1:f5ac63519541 332 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 333 char shortname[SHORTFILESIZE], last[SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 334 strcpy(last, "");
Michael J. Spencer 1:f5ac63519541 335 sd.getshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 336 DIR *d;
Michael J. Spencer 1:f5ac63519541 337 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 338 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 339 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 340 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 341 if (strncmp(p->d_name, "longname.sy",11)) { // skip longname.sy*
Michael J. Spencer 1:f5ac63519541 342 if (! strcmp(shortname, p->d_name)) { // shortname = current entry
Michael J. Spencer 1:f5ac63519541 343 if (strcmp(last, "")) {
Michael J. Spencer 1:f5ac63519541 344 sd.getlongname(name, last); // return entry before
Michael J. Spencer 1:f5ac63519541 345 } else {
Michael J. Spencer 1:f5ac63519541 346 sd.getlongname(name, p->d_name); // last="", so current = first
Michael J. Spencer 1:f5ac63519541 347 }
Michael J. Spencer 1:f5ac63519541 348 closedir(d);
Michael J. Spencer 1:f5ac63519541 349 return;
Michael J. Spencer 1:f5ac63519541 350 }
Michael J. Spencer 1:f5ac63519541 351 strcpy(last, p->d_name);
Michael J. Spencer 1:f5ac63519541 352 }
Michael J. Spencer 1:f5ac63519541 353 } // while
Michael J. Spencer 1:f5ac63519541 354 closedir(d);
Michael J. Spencer 1:f5ac63519541 355 } else {
Michael J. Spencer 1:f5ac63519541 356 printf("Getfilename: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 357 }
Michael J. Spencer 1:f5ac63519541 358 sd.getlongname(name, last); // name not found (return last)
Michael J. Spencer 1:f5ac63519541 359 // or no file found (return "")
Michael J. Spencer 1:f5ac63519541 360 }
Michael J. Spencer 1:f5ac63519541 361
Michael J. Spencer 1:f5ac63519541 362 void getnextjob(char *name) {
Michael J. Spencer 1:f5ac63519541 363 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 364 char shortname[SHORTFILESIZE], last[SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 365 strcpy(last, "");
Michael J. Spencer 1:f5ac63519541 366 sd.getshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 367 DIR *d;
Michael J. Spencer 1:f5ac63519541 368 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 369 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 370 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 371 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 372 if (strncmp(p->d_name, "longname.sy",11)) { // skip longname.sy*
Michael J. Spencer 1:f5ac63519541 373 if (! strcmp(shortname, last)) { // if last was shortname
Michael J. Spencer 1:f5ac63519541 374 sd.getlongname(name, p->d_name); // return current
Michael J. Spencer 1:f5ac63519541 375 closedir(d);
Michael J. Spencer 1:f5ac63519541 376 return;
Michael J. Spencer 1:f5ac63519541 377 }
Michael J. Spencer 1:f5ac63519541 378 strcpy(last, p->d_name);
Michael J. Spencer 1:f5ac63519541 379 }
Michael J. Spencer 1:f5ac63519541 380 } // while
Michael J. Spencer 1:f5ac63519541 381 closedir(d);
Michael J. Spencer 1:f5ac63519541 382 } else {
Michael J. Spencer 1:f5ac63519541 383 printf("Getfilename: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 384 }
Michael J. Spencer 1:f5ac63519541 385 sd.getlongname(name, last); // if last file was match, return the last
Michael J. Spencer 1:f5ac63519541 386 // if filename not found, return last
Michael J. Spencer 1:f5ac63519541 387 // if no file in directory, return ""
Michael J. Spencer 1:f5ac63519541 388 }
Michael J. Spencer 1:f5ac63519541 389
Michael J. Spencer 1:f5ac63519541 390 /*
Michael J. Spencer 1:f5ac63519541 391 void getfilename(char *name, int filenr) {
Michael J. Spencer 1:f5ac63519541 392 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 393 int cnt=0;
Michael J. Spencer 1:f5ac63519541 394 DIR *d;
Michael J. Spencer 1:f5ac63519541 395 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 396 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 397 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 398 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 399 if (strncmp(p->d_name, "longname.sy",11)) {
Michael J. Spencer 1:f5ac63519541 400 if (cnt++ == filenr) {
Michael J. Spencer 1:f5ac63519541 401 sd.getlongname(name, p->d_name);
Michael J. Spencer 1:f5ac63519541 402 closedir(d);
Michael J. Spencer 1:f5ac63519541 403 return;
Michael J. Spencer 1:f5ac63519541 404 }
Michael J. Spencer 1:f5ac63519541 405 }
Michael J. Spencer 1:f5ac63519541 406 } // while
Michael J. Spencer 1:f5ac63519541 407 strcpy(name, "");
Michael J. Spencer 1:f5ac63519541 408 closedir(d);
Michael J. Spencer 1:f5ac63519541 409 } else {
Michael J. Spencer 1:f5ac63519541 410 printf("Getfilename: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 411 }
Michael J. Spencer 1:f5ac63519541 412 }
Michael J. Spencer 1:f5ac63519541 413
Michael J. Spencer 1:f5ac63519541 414 int getfilenum(char *name) {
Michael J. Spencer 1:f5ac63519541 415 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 416 char shortname[SHORTFILESIZE];
Michael J. Spencer 1:f5ac63519541 417 getshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 418 int cnt=0;
Michael J. Spencer 1:f5ac63519541 419 DIR *d;
Michael J. Spencer 1:f5ac63519541 420 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 421 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 422 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 423 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 424 if (strncmp(p->d_name, "longname.sy",11)) {
Michael J. Spencer 1:f5ac63519541 425 if (!strcmp(shortname, name)) {
Michael J. Spencer 1:f5ac63519541 426 closedir(d);
Michael J. Spencer 1:f5ac63519541 427 return cnt;
Michael J. Spencer 1:f5ac63519541 428 }
Michael J. Spencer 1:f5ac63519541 429 cnt++;
Michael J. Spencer 1:f5ac63519541 430 }
Michael J. Spencer 1:f5ac63519541 431 } // while
Michael J. Spencer 1:f5ac63519541 432 closedir(d);
Michael J. Spencer 1:f5ac63519541 433 return 0;
Michael J. Spencer 1:f5ac63519541 434 } else {
Michael J. Spencer 1:f5ac63519541 435 printf("Getfilename: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 436 }
Michael J. Spencer 1:f5ac63519541 437 return 0;
Michael J. Spencer 1:f5ac63519541 438 }
Michael J. Spencer 1:f5ac63519541 439 */
Michael J. Spencer 1:f5ac63519541 440
Michael J. Spencer 1:f5ac63519541 441 void writefile(char *myfile) {
Michael J. Spencer 1:f5ac63519541 442 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 443 printf("Writing file %s\n\r", myfile);
Michael J. Spencer 1:f5ac63519541 444 FILE *fp = sd.openfile(myfile, "wb");
Michael J. Spencer 1:f5ac63519541 445 if (fp) {
Michael J. Spencer 1:f5ac63519541 446 fclose(fp);
Michael J. Spencer 1:f5ac63519541 447 }
Michael J. Spencer 1:f5ac63519541 448 }
Michael J. Spencer 1:f5ac63519541 449
Michael J. Spencer 1:f5ac63519541 450 void removefile(char *name) {
Michael J. Spencer 1:f5ac63519541 451 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 452 char shortname[SHORTFILESIZE] = "";
Michael J. Spencer 1:f5ac63519541 453 sd.getshortname(shortname, name);
Michael J. Spencer 1:f5ac63519541 454 if (strlen(shortname) != 0) {
Michael J. Spencer 1:f5ac63519541 455 char fullname[MAXFILESIZE+SHORTFILESIZE+1];
Michael J. Spencer 1:f5ac63519541 456 sprintf(fullname, "%s%s", sd.pathname, shortname);
Michael J. Spencer 1:f5ac63519541 457 if (remove(fullname) < 0)
Michael J. Spencer 1:f5ac63519541 458 printf("Error while removing file %s\n\r", fullname);
Michael J. Spencer 1:f5ac63519541 459 sd.cleanlist();
Michael J. Spencer 1:f5ac63519541 460 }
Michael J. Spencer 1:f5ac63519541 461 }
Michael J. Spencer 1:f5ac63519541 462
Michael J. Spencer 1:f5ac63519541 463 // Read an integer from file
Michael J. Spencer 1:f5ac63519541 464 int readint(FILE *fp)
Michael J. Spencer 1:f5ac63519541 465 {
Michael J. Spencer 1:f5ac63519541 466 unsigned short int i=0;
Michael J. Spencer 1:f5ac63519541 467 int sign=1;
Michael J. Spencer 1:f5ac63519541 468 char c, str[16];
Michael J. Spencer 1:f5ac63519541 469
Michael J. Spencer 1:f5ac63519541 470 while( !feof(fp) )
Michael J. Spencer 1:f5ac63519541 471 {
Michael J. Spencer 1:f5ac63519541 472 fread(&c, sizeof(c),1,fp);
Michael J. Spencer 1:f5ac63519541 473
Michael J. Spencer 1:f5ac63519541 474 switch(c)
Michael J. Spencer 1:f5ac63519541 475 {
Michael J. Spencer 1:f5ac63519541 476 case '0': case '1': case '2': case '3': case '4':
Michael J. Spencer 1:f5ac63519541 477 case '5': case '6': case '7': case '8': case '9':
Michael J. Spencer 1:f5ac63519541 478 if ( i < sizeof(str))
Michael J. Spencer 1:f5ac63519541 479 str[i++] = (char)c;
Michael J. Spencer 1:f5ac63519541 480 break;
Michael J. Spencer 1:f5ac63519541 481 case '-': sign = -1; break;
Michael J. Spencer 1:f5ac63519541 482 case ';': while ((!feof(fp)) && (c != '\n')) {
Michael J. Spencer 1:f5ac63519541 483 fread(&c, sizeof(c),1,fp);
Michael J. Spencer 1:f5ac63519541 484 }
Michael J. Spencer 1:f5ac63519541 485 break;
Michael J. Spencer 1:f5ac63519541 486 case ' ': case '\t': case '\r': case '\n':
Michael J. Spencer 1:f5ac63519541 487 if ( i )
Michael J. Spencer 1:f5ac63519541 488 {
Michael J. Spencer 1:f5ac63519541 489 int val=0, d=1;
Michael J. Spencer 1:f5ac63519541 490 while(i)
Michael J. Spencer 1:f5ac63519541 491 {
Michael J. Spencer 1:f5ac63519541 492 if ( str[i-1] == '-' )
Michael J. Spencer 1:f5ac63519541 493 d *= -1;
Michael J. Spencer 1:f5ac63519541 494 else
Michael J. Spencer 1:f5ac63519541 495 val += (str[i-1]-'0') * d;
Michael J. Spencer 1:f5ac63519541 496 d *= 10;
Michael J. Spencer 1:f5ac63519541 497 i--;
Michael J. Spencer 1:f5ac63519541 498 }
Michael J. Spencer 1:f5ac63519541 499 val *= sign;
Michael J. Spencer 1:f5ac63519541 500 return val;
Michael J. Spencer 1:f5ac63519541 501 }
Michael J. Spencer 1:f5ac63519541 502 break;
Michael J. Spencer 1:f5ac63519541 503 } // Switch
Michael J. Spencer 1:f5ac63519541 504 } // while
Michael J. Spencer 1:f5ac63519541 505 return 0;
Michael J. Spencer 1:f5ac63519541 506 } // read integer
Michael J. Spencer 1:f5ac63519541 507
Michael J. Spencer 1:f5ac63519541 508 void strtolower(char *name) {
Michael J. Spencer 1:f5ac63519541 509 for(int i = 0; i < strlen(name); i++)
Michael J. Spencer 1:f5ac63519541 510 name[i] = tolower(name[i]);
Michael J. Spencer 1:f5ac63519541 511 }
Michael J. Spencer 1:f5ac63519541 512
Michael J. Spencer 1:f5ac63519541 513 int isFirmware(char *filename) {
Michael J. Spencer 1:f5ac63519541 514 char name[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 515 strcpy(name, filename);
Michael J. Spencer 1:f5ac63519541 516 strtolower(name);
Michael J. Spencer 1:f5ac63519541 517 int x = strlen(name);
Michael J. Spencer 1:f5ac63519541 518 if ((tolower(filename[--x])=='n') && (tolower(filename[--x])=='i') && (tolower(filename[--x])=='b') && (filename[--x]=='.'))
Michael J. Spencer 1:f5ac63519541 519 return 1;
Michael J. Spencer 1:f5ac63519541 520 else
Michael J. Spencer 1:f5ac63519541 521 return 0;
Michael J. Spencer 1:f5ac63519541 522 }
Michael J. Spencer 1:f5ac63519541 523
Michael J. Spencer 1:f5ac63519541 524 void installFirmware(char *filename) {
Michael J. Spencer 1:f5ac63519541 525 removeFirmware();
Michael J. Spencer 1:f5ac63519541 526 char buff[512];
Michael J. Spencer 1:f5ac63519541 527 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 528 //printf("Copy firmware file %s\n\r", filename);
Michael J. Spencer 1:f5ac63519541 529 FILE *fp = sd.openfile(filename, "rb");
Michael J. Spencer 1:f5ac63519541 530 if (fp) {
Michael J. Spencer 1:f5ac63519541 531 FILE *fp2 = fopen("/local/firmware.bin", "wb");
Michael J. Spencer 1:f5ac63519541 532 while (!feof(fp)) {
Michael J. Spencer 1:f5ac63519541 533 int size = fread(buff, 1, 512, fp);
Michael J. Spencer 1:f5ac63519541 534 fwrite(buff, 1, size, fp2);
Michael J. Spencer 1:f5ac63519541 535 }
Michael J. Spencer 1:f5ac63519541 536 fclose(fp);
Michael J. Spencer 1:f5ac63519541 537 fclose(fp2);
Michael J. Spencer 1:f5ac63519541 538 }
Michael J. Spencer 1:f5ac63519541 539 removefile(filename);
Michael J. Spencer 1:f5ac63519541 540 }
Michael J. Spencer 1:f5ac63519541 541
Michael J. Spencer 1:f5ac63519541 542 void removeFirmware() { // remove old firmware from SD
Michael J. Spencer 1:f5ac63519541 543 DIR *d;
Michael J. Spencer 1:f5ac63519541 544 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 545 d = opendir("/local");
Michael J. Spencer 1:f5ac63519541 546 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 547 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 548 if (isFirmware(p->d_name)) {
Michael J. Spencer 1:f5ac63519541 549 char name[32];
Michael J. Spencer 1:f5ac63519541 550 sprintf(name, "/local/%s", p->d_name);
Michael J. Spencer 1:f5ac63519541 551 remove(name);
Michael J. Spencer 1:f5ac63519541 552 }
Michael J. Spencer 1:f5ac63519541 553 }
Michael J. Spencer 1:f5ac63519541 554 } else {
Michael J. Spencer 1:f5ac63519541 555 printf("removeFirmware: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 556 }
Michael J. Spencer 1:f5ac63519541 557 }
Michael J. Spencer 1:f5ac63519541 558
Michael J. Spencer 1:f5ac63519541 559 int SDcheckFirmware() {
Michael J. Spencer 1:f5ac63519541 560 extern LaosFileSystem sd;
Michael J. Spencer 1:f5ac63519541 561 DIR *d;
Michael J. Spencer 1:f5ac63519541 562 struct dirent *p;
Michael J. Spencer 1:f5ac63519541 563 d = opendir("/sd");
Michael J. Spencer 1:f5ac63519541 564 if(d != NULL) {
Michael J. Spencer 1:f5ac63519541 565 while((p = readdir(d)) != NULL) {
Michael J. Spencer 1:f5ac63519541 566 if (strncmp(p->d_name, "longname.sy",11)) {
Michael J. Spencer 1:f5ac63519541 567 if (isFirmware(p->d_name)) {
Michael J. Spencer 1:f5ac63519541 568 installFirmware(p->d_name);
Michael J. Spencer 1:f5ac63519541 569 return 1;
Michael J. Spencer 1:f5ac63519541 570 }
Michael J. Spencer 1:f5ac63519541 571 }
Michael J. Spencer 1:f5ac63519541 572 }
Michael J. Spencer 1:f5ac63519541 573 } else {
Michael J. Spencer 1:f5ac63519541 574 printf("SDcheckFirmware: Could not open directory!\n\r");
Michael J. Spencer 1:f5ac63519541 575 }
Michael J. Spencer 1:f5ac63519541 576 return 0;
Michael J. Spencer 1:f5ac63519541 577 }
Michael J. Spencer 1:f5ac63519541 578
Michael J. Spencer 1:f5ac63519541 579 int isLaosFile(char *filename) {
Michael J. Spencer 1:f5ac63519541 580 char name[MAXFILESIZE];
Michael J. Spencer 1:f5ac63519541 581 strcpy(name, filename);
Michael J. Spencer 1:f5ac63519541 582 strtolower(name);
Michael J. Spencer 1:f5ac63519541 583 int x = strlen(name);
Michael J. Spencer 1:f5ac63519541 584 if ((tolower(filename[--x])=='c') && (tolower(filename[--x])=='g') && (tolower(filename[--x])=='l') && (filename[--x]=='.'))
Michael J. Spencer 1:f5ac63519541 585 return 1;
Michael J. Spencer 1:f5ac63519541 586 else
Michael J. Spencer 1:f5ac63519541 587 return 0;
Michael J. Spencer 1:f5ac63519541 588 }