oki

Dependencies:   ChaNFS ChaNFSSD USBCDCMSC USBDevice2 mbed

main.cpp

Committer:
sherckuith
Date:
2013-09-17
Revision:
0:19676807c7f1

File content as of revision 0:19676807c7f1:

#include "mbed.h"
#include "USBCDCMSC.h"
#include "SDFileSystem.h"
#include <new>

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);
SDFileSystem sd(p5, p6, p7, p8, "sd");
USBCDCMSC cdcmsc(&sd);

extern "C"
void HardFault_Handler() {
    printf("Hard Fault!\n");
    exit(-1);
}

void no_memory () {
    printf("panic: can't allocate to memory!\r\n");
    exit(-1);
}

void listdir (Stream *st) {
#if 0
    // probrem: readdir() Hard Fault
    DIR *dir;
    struct dirent *ent;
    
    if ((dir = opendir("/sd")) != NULL) {
        st->printf("dir opened\r\n");
        while ((ent = readdir(dir)) != NULL) {
            st->printf("%s\r\n", ent->d_name);
        }
    } else {
        st->printf("dir open error\r\n");
    }
    closedir(dir);
#else
    // direct FatFs
    FILINFO fno;
    DIR_t dir;
    char *fn;
#if _USE_LFN
    static char lfn[_MAX_LFN + 1];
    fno.lfname = lfn;
    fno.lfsize = sizeof(lfn);
#endif

    if (f_opendir(&dir, "") == FR_OK) {
        for (;;) {
            if (f_readdir(&dir, &fno) != FR_OK) break;
            if (fno.fname[0] == 0) break;
#if _USE_LFN
            fn = *fno.lfname ? fno.lfname : fno.fname;
#else
            fn = fno.fname;
#endif
            st->printf("%s\r\n", fn);            
        }
    }
#endif
}

void readfile (char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp) {
        int c;
        pc.printf("file: ");
        for (;;) {
            c = fgetc(fp);
            if (feof(fp)) break;
            pc.printf("%c", c);
        }
        pc.printf("\r\n");
        fclose(fp); 
    }
}

int main() {
    int c, u = 0;
    Timer timer;

    set_new_handler(no_memory); // new handler function

    readfile("/sd/test.txt");

    timer.start();
    while(1) {
        if (timer.read_ms() > 500) {
            myled = myled ? 0 : 1;
            timer.reset();
        }
        
        if (u != cdcmsc.configured()) {
            u = cdcmsc.configured();
            printf("configured %d\r\n", u);
        }
    
        if (u && cdcmsc.available()) {
            // CDC -> pc serial
            c = cdcmsc.getc();
            if (c == '?') {
                listdir(&cdcmsc);
            } else {
                pc.putc(c);
            }
        }
        if (pc.readable()) {
            // PC serial -> CDC
            c = pc.getc();
            if (c == '?') {
                listdir(&pc);
            } else {
                if (u) {
                    cdcmsc.putc(c);
                } else {
                    pc.putc(c);
                }
            }
        }
    }
}