This is the firmware for the LaOS - Laser Open Source project. You can use it to drive a laser cutter. For hardware and more information, look at our wiki: http://wiki.laoslaser.org

Dependencies:   EthernetNetIf mbed

Committer:
fablabtruck
Date:
Fri Jun 08 09:26:40 2012 +0000
Revision:
0:3852426a5068
svn revision 379

Who changed what in which revision?

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