USB Memory control program using USBHost library

Dependencies:   USBHOST

see /users/kenjiArai/notebook/usb-interface--usbhost-and-usbdevice/

main.cpp

Committer:
kenjiArai
Date:
2020-01-04
Revision:
0:a1ca40de3f45

File content as of revision 0:a1ca40de3f45:

/*
 * Mbed Application program
 *      USB Memory control
 *
 * Copyright (c) 2019,'20 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Created:    March     14th, 2019
 *      Revised:    January    5th, 2020
 */

/*
    Tested board on OS5.14.2
        Nucleo-F401RE, -F411RE, -F446RE, -F446ZE
        DISCO-F469NI
 */
 
//  Include --------------------------------------------------------------------
#include "mbed.h"
#include "USBHostMSD.h"
#include "mon.h"

//  Definition -----------------------------------------------------------------
#define     USER_SW_ON      0
#define     LOOP_TIME       50      // 50mS

#define DEBUG_PRINT  0
#if DEBUG_PRINT
#define DBG(...)    pc.printf(__VA_ARGS__)
#else
#define DBG(...)    {;}
#endif

//  Object ---------------------------------------------------------------------
DigitalIn user_sw(BUTTON1, PullUp);
Serial pc(USBTX, USBRX, 115200);
Timer tmr;

//  RAM ------------------------------------------------------------------------

//  ROM / Constant data --------------------------------------------------------

//  Function prototypes --------------------------------------------------------
void no_good_and_wait_reset(void);

//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
int main()
{
    uint32_t data0 = 10000U;
    uint32_t data1 = 20000U;
    uint32_t data2 = 30000U;
    uint32_t data3 = 40000U;
    uint32_t data4 = 50000U;
    uint32_t data5 = 60000U;

    DBG("line:%d\r\n", __LINE__);
    while (pc.readable()) {
        pc.getc();
    }
    pc.printf("\r\n\r\nPlease connect USB memory!  ");
    pc.printf("If you have connected it, please hit any key to go next.\r\n");
    while (pc.readable() == 0) {
        ThisThread::sleep_for(100);
    }
    pc.getc();
    pc.printf("\nStart USB memory test.\r\n");

    USBHostMSD  msd;
    DBG("line:%d\r\n", __LINE__);
    msd.init();

    uint32_t out = 50;
    DBG("line:%d\r\n", __LINE__);
    while(!msd.connect()) {
        if (--out == 0) {
            DBG("line:%d\r\n", __LINE__);
            pc.printf("Cannot detect USB memory!! \r\n");
            break;
        }
        pc.putc('.');
        ThisThread::sleep_for(1000);
    }
    if (out != 0) {
        pc.printf("\r\nDetect USB memory on USB connector.\r\n");
    } else {
        DBG("line:%d\r\n", __LINE__);
        no_good_and_wait_reset();
    }
    FATFileSystem fs("usb");
    DBG("line:%d\r\n", __LINE__);
    FILE *fp;
    time_t seconds;

    if (fs.mount(&msd) == 0) {
        DBG("line:%d\r\n", __LINE__);
        fp = fopen("/usb/mydata.txt", "a");
        DBG("line:%d\r\n", __LINE__);
        if (fp == 0) {
            pc.printf("Cannot write a file into USB memory.\r\n");
            no_good_and_wait_reset();
        } else {
            pc.printf("Succeed file open, write and close.\r\n");
            fclose(fp);
        }
    }
    DBG("line:%d\r\n", __LINE__);
    while(pc.readable()) {
        DBG("line:%d\r\n", __LINE__);
        pc.getc();
    }
    pc.printf("Start contunuos file write.\r\n");
    pc.printf("If you want to stop, please hit any key!\r\n");
    uint32_t num = 0;
    char buf[64];
    while (pc.readable() == 0) {
        ThisThread::sleep_for(100);
    }
    pc.getc();
    pc.printf("Time[mS]:     ");
    while(true) {
        tmr.reset();
        tmr.start();
        uint32_t size_disk = get_disk_freespace();
        uint32_t size_file = get_data_file_size("mydata.txt");
        pc.printf("free disk:%10u, file:%8u  ", size_disk, size_file);
        fp = fopen("/usb/mydata.txt", "a");
        if(fp != 0) {
            char tmp[64];
            DBG("line:%d\r\n", __LINE__);
            seconds = time(NULL);
            strftime(tmp, 64, "DATE %H:%M:%S,%Y/%m/%d,", localtime(&seconds));
            pc.printf("%s", tmp);
            fprintf(fp, "%s", tmp);
            pc.printf("%08d;%08d;%08d;%08d;%08d;%08d\r\n",
                      ++data0, ++data1, ++data2, ++data3, ++data4, ++data5);
            fprintf(fp, "%08d;%08d;%08d;%08d;%08d;%08d\r\n",
                        data0,   data1,   data2,   data3,   data4,   data5);
            fclose(fp);
        } else {
            pc.printf("ERROR\r\n");
        }
        uint32_t time_sd = tmr.read_ms();
        pc.printf("Time[mS]:%4d ", time_sd);
        if (time_sd < LOOP_TIME -2){
            ThisThread::sleep_for(LOOP_TIME - time_sd);
        }
        if (user_sw == USER_SW_ON) {
            break;
        }
        if (pc.readable()) {
            break;
        }
    }
    pc.getc();
    pc.printf("\r\nStop file write.\r\n");
    pc.printf("Do you want to check detail?\r\n");
    pc.printf("If so, please enter 'y'.\r\n");
    if (pc.getc() == 'y') {
        mon();
    }
    pc.printf("If you want to tray again, ");
    no_good_and_wait_reset();
}

void no_good_and_wait_reset()
{
    pc.printf("Please enter [Alt]+B for re-start.\r\n");
    while(true) {
        ThisThread::sleep_for(1000);
    }
}