USB Memory Control program for DISCO-F469NI

Dependencies:   FatFs_Mon USBHOST

main.cpp

Committer:
kenjiArai
Date:
2018-04-30
Revision:
0:2661952973e6

File content as of revision 0:2661952973e6:

/*
 * Mbed Application program
 *
 * Copyright (c) 2018 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Modify:     March     21st, 2018
 *      Revised:    April     30th, 2018
 */

//  Include --------------------------------------------------------------------
#include    "mbed.h"
#include    "USBHostMSD.h"
#include    "FATFileSystem.h"
#include    "mon.h"
#include    <stdlib.h>

//  Definition -----------------------------------------------------------------

//  Object ---------------------------------------------------------------------
DigitalOut  led(LED1);
DigitalIn   user_sw(USER_BUTTON);
Serial      pc(USBTX,USBRX);
USBHostMSD  msd;
DigitalOut  usb_5v_line(PB_2, 1);

//  RAM ------------------------------------------------------------------------
uint8_t     usb_memory_status;
time_t      seconds;
// ADC
float       v5;
float       v3r3;

bool running = true;

//  ROM / Constant data --------------------------------------------------------
char *const opngmsg =
    ""__FILE__ "\r\n"__DATE__ " " __TIME__ " (UTC)\r\n""\r\n";

//  Function prototypes --------------------------------------------------------
void save_logging_data(uint8_t flg);
void msd_task(void const *);
void mon(void);

//------------------------------------------------------------------------------
//  Control Program
//------------------------------------------------------------------------------
int main()
{
    pc.puts(opngmsg);
    Thread msdTask(msd_task, NULL, osPriorityNormal, 1024 * 4);
    while(true) {
        led=!led;
        Thread::wait(500);
        if (running == false) {
            mon();
            NVIC_SystemReset();
        }
    }
}

void msd_task(void const *)
{
    int i = 0;
    FATFileSystem fs("usb");
    int err;

    pc.printf("wait for usb memory stick insertion\r\n");
    while(1) {

        // try to connect a MSD device
        while(!msd.connect()) {
            Thread::wait(500);
        }
        if (fs.mount(&msd) != 0) {
            continue;
        } else {
            pc.printf("file system mounted\r\n");
        }
        if  (!msd.connect()) {
            continue;
        }
        running = true;
        // if device disconnected, try to connect again
        while (msd.connected()) {
            save_logging_data(1);
            if (user_sw == 1) {
                break;
            }
            if (pc.readable()) {
                char c = pc.getc(); // dummy read
                mon();
            }
            Thread::wait(500);
        }
        running = false;
        while (msd.connected()) {
            Thread::wait(500);
        }
        while (fs.unmount() < 0) {
            Thread::wait(500);
            pc.printf("unmount\r\n");
        }
    }
}

// Save several data into the USB Memory
void save_logging_data(uint8_t flg)
{
    char buf[64];   // data buffer for text
    FILE *fp;

    if (!msd.connect()) {
        error("USB Flash drive not found.\r\n");
        usb_memory_status = 1;
    }
    fp = fopen("/usb/mydata.txt", "a");
    if (flg) {
        pc.printf("/usb/mydata.txt\r\n");
    }
    if(fp == NULL) {
        usb_memory_status = 1;
        if (flg) {
            pc.printf( "\r\n Could not open file for write\r\n");
        }
    }
    for (int i = 0; 16 > i; i++) {
        uint32_t size = get_disk_freespace();
        pc.printf("free %u kB, ", size);
        //v3r3 = VREF_VOLT / a_vref.read();
        v3r3 = 3.321f;
        //v5 = a_5v.read() * v3r3 * FCT_V5;
        v5 = 5.012f;
        sprintf(buf, "$DATA0,");
        fprintf(fp,buf);
        // RTC
        seconds = time(NULL);
        strftime(buf, 64, "RTC,%H:%M:%S,%Y/%m/%d,", localtime(&seconds));
        if (flg) {
            pc.printf("%s", buf);
        }
        fprintf(fp,buf);
        // Write speration ',' into the file
        //            123456789012345678901234567890
        sprintf(buf, ",,,,,,,,,,,,,,,,,,,,,,,,,,,,");
        fprintf(fp,buf);
        // Write data into the file
        sprintf(buf, "5V,%6.3f,V3R3,%6.3f,", v5, v3r3);
        fprintf(fp,buf);
        if (flg) {
            pc.printf("Volt, %s", buf);
        }
        sprintf(buf, "GPS,%d,USB,%d,CAM,%d,CNT,%04d\r\n",
                0, usb_memory_status, 1, i);
        fprintf(fp,buf);
        fprintf(fp,buf);
        if (flg) {
            pc.printf("%s", buf);
        }
    }
    fclose(fp);
    if (flg) {
        pc.printf("\r\n");
    }
}