Emulation of LocalFileSystem with virtual COM.

Dependencies:   USBDevice

Dependents:   KL46Z-lpc81isp lpcterm2

#include "USBLocalFileSystem.h"

int main() {
    USBLocalFileSystem* usb_local = new USBLocalFileSystem(); // RamDisk(64KB)

    while(1) {
        usb_local->lock(true);
        usb_local->remount();
        char filename[32];
        if (usb_local->find(filename, sizeof(filename), "*.TXT")) {
            FILE* fp = fopen(filename, "r");
            if (fp) {
                int c;
                while((c = fgetc(fp)) != EOF) {
                    usb_local->putc(c);
                }
                fclose(fp);
            }
        }    
        usb_local->lock(false);

        wait_ms(1000*5);
    }
}



Sample application:

Import programKL46Z-lpc81isp

ISP example program.

Import programlpcterm2

semihost server example program

Committer:
va009039
Date:
Sat Jun 21 22:39:59 2014 +0000
Revision:
6:528036abfb02
Parent:
4:8f6857784854
add LPC11U68

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:39eb4d5b97df 1 #include "Storage.h"
va009039 0:39eb4d5b97df 2 #include "FATFileSystem.h"
va009039 0:39eb4d5b97df 3 #include <ctype.h>
va009039 0:39eb4d5b97df 4
va009039 0:39eb4d5b97df 5 #if (DEBUG2 > 3)
va009039 0:39eb4d5b97df 6 #define STORAGE_DBG(...) do{fprintf(stderr,"[%s@%d] ",__PRETTY_FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);fprintf(stderr,"\r\n");} while(0);
va009039 0:39eb4d5b97df 7 #else
va009039 0:39eb4d5b97df 8 #define STORAGE_DBG(...)
va009039 0:39eb4d5b97df 9 #endif
va009039 0:39eb4d5b97df 10
va009039 0:39eb4d5b97df 11 LocalStorage::LocalStorage(StorageInterface* storage, const char* name)
va009039 0:39eb4d5b97df 12 : FATFileSystem(name),_storage(storage)
va009039 0:39eb4d5b97df 13 {
va009039 0:39eb4d5b97df 14 _name = name;
va009039 0:39eb4d5b97df 15 }
va009039 0:39eb4d5b97df 16
va009039 4:8f6857784854 17 static bool match1(const char* name, const char* pat) {
va009039 4:8f6857784854 18 while(1) {
va009039 4:8f6857784854 19 char c = *pat++;
va009039 4:8f6857784854 20 char d = *name++;
va009039 4:8f6857784854 21 if (c == '\0' && d == '\0') {
va009039 4:8f6857784854 22 return true;
va009039 4:8f6857784854 23 } else if (c == '\0' || d == '\0') {
va009039 4:8f6857784854 24 return false;
va009039 4:8f6857784854 25 }
va009039 4:8f6857784854 26 switch(c) {
va009039 4:8f6857784854 27 case '?':
va009039 4:8f6857784854 28 break;
va009039 4:8f6857784854 29 case '*':
va009039 4:8f6857784854 30 name--;
va009039 4:8f6857784854 31 while(*name) {
va009039 4:8f6857784854 32 if (*name == '.') {
va009039 4:8f6857784854 33 break;
va009039 4:8f6857784854 34 }
va009039 4:8f6857784854 35 name++;
va009039 4:8f6857784854 36 }
va009039 4:8f6857784854 37 break;
va009039 4:8f6857784854 38 default:
va009039 4:8f6857784854 39 if (toupper(d) != toupper(c)) {
va009039 4:8f6857784854 40 return false;
va009039 4:8f6857784854 41 }
va009039 4:8f6857784854 42 break;
va009039 4:8f6857784854 43 }
va009039 4:8f6857784854 44 }
va009039 4:8f6857784854 45 }
va009039 4:8f6857784854 46
va009039 4:8f6857784854 47 extern FILINFO FATDirHandle_finfo; // fat/FATDirHandle.cpp
va009039 4:8f6857784854 48 /* static */ bool LocalStorage::find(char* name, size_t size, const char* dirname, const char* pat)
va009039 0:39eb4d5b97df 49 {
va009039 4:8f6857784854 50 char dirpath[32];
va009039 4:8f6857784854 51 strcpy(dirpath, "/");
va009039 4:8f6857784854 52 if (strlen(dirname) >= sizeof(dirpath)-2) {
va009039 4:8f6857784854 53 return false;
va009039 4:8f6857784854 54 }
va009039 4:8f6857784854 55 strcat(dirpath, dirname);
va009039 4:8f6857784854 56 DIR *dir = ::opendir(dirpath);
va009039 0:39eb4d5b97df 57 if (dir == NULL) {
va009039 0:39eb4d5b97df 58 return false;
va009039 0:39eb4d5b97df 59 }
va009039 0:39eb4d5b97df 60 uint32_t fdatetime = 0;
va009039 0:39eb4d5b97df 61 bool found = false;
va009039 0:39eb4d5b97df 62 struct dirent *entry;
va009039 0:39eb4d5b97df 63 while ((entry = readdir(dir)) != NULL) {
va009039 4:8f6857784854 64 if (match1(entry->d_name, pat)) {
va009039 0:39eb4d5b97df 65 FILINFO* fi = &FATDirHandle_finfo;
va009039 0:39eb4d5b97df 66 uint32_t datetime = fi->ftime | (fi->fdate<<16);
va009039 0:39eb4d5b97df 67 STORAGE_DBG("datetime=%08x [%s]", datetime, entry->d_name);
va009039 0:39eb4d5b97df 68 if (datetime > fdatetime) {
va009039 0:39eb4d5b97df 69 fdatetime = datetime;
va009039 4:8f6857784854 70 if (strlen(dirpath) + 1 + strlen(entry->d_name) < size) {
va009039 4:8f6857784854 71 strcpy(name, dirpath);
va009039 4:8f6857784854 72 strcat(name, "/");
va009039 4:8f6857784854 73 strcat(name, entry->d_name);
va009039 4:8f6857784854 74 found = true;
va009039 4:8f6857784854 75 }
va009039 0:39eb4d5b97df 76 }
va009039 0:39eb4d5b97df 77 }
va009039 0:39eb4d5b97df 78 }
va009039 0:39eb4d5b97df 79 closedir(dir);
va009039 0:39eb4d5b97df 80 return found;
va009039 0:39eb4d5b97df 81 }
va009039 4:8f6857784854 82