function test USBMSD(as external strage for PC USB) and USBSerial. Switching between USBMSD and USBSerial(Not work simultaneously)
see /users/kenjiArai/notebook/usb-interface--usbhost-and-usbdevice/
main_another_way.cpp
- Committer:
- kenjiArai
- Date:
- 2020-04-30
- Revision:
- 1:7a568319eeb7
File content as of revision 1:7a568319eeb7:
/* * Mbed Application program * SD Card via USB on Mbed-os5 * * Copyright (c) 2019,'20 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * https://os.mbed.com/users/kenjiArai/ * Created: December 31st, 2019 * Revised: May 1st, 2020 */ /* * Tested on: * Nucleo-F446RE * FRDM-K64F --> does NOT work!! * nRF52840-DK --> does NOT work!! * PC: Windows10 64bit + Tera Term */ #if 0 // Include -------------------------------------------------------------------- #include "mbed.h" #include "USBMSD.h" #include "USBSerial.h" #include "SDBlockDevice.h" #include "FATFileSystem.h" #include "mon.h" // Definition ----------------------------------------------------------------- // Constructor ---------------------------------------------------------------- #if defined(TARGET_K64F) DigitalIn disconnect_sw(BUTTON2); SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20000000); #warning "This program does NOT work!!" #elif defined(TARGET_STM32F4) DigitalIn disconnect_sw(USER_BUTTON); SDBlockDevice sd(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS, 20000000); #elif defined(TARGET_MCU_NRF52840) #warning "This program does NOT work!!" DigitalIn disconnect_sw(BUTTON1); SDBlockDevice sd(D11, D12, D13, D10); #endif Serial pc(USBTX, USBRX, 115200); FATFileSystem *fs = NULL; USBMSD *usb_msd = NULL; USBSerial *usb_ser = NULL; // RAM ------------------------------------------------------------------------ // ROM / Constant data -------------------------------------------------------- const char *const opening_msg0 = "microSD Card test program"; const char *const opening_msg1 = " -> run on Mbed OS-5 multi-thread mode\r\n"; // Function prototypes -------------------------------------------------------- template <typename ... Args> void printf_usb(const char *format, Args const & ... args); char usb_ser_readable(void); char usb_ser_get_c(void); void usb_ser_put_c(char c); //------------------------------------------------------------------------------ // Control Program //------------------------------------------------------------------------------ int main() { char buf[128]; uint32_t step = 0; usb_ser = new USBSerial; printf_usb( "\r\n\r\nConnect the USB which is embedded on F446 CPU to your PC\r\n" ); printf_usb("-----STEP%d------> Start\r\n", step++); while(true) { printf_usb("Please see your new strage using the Explorer\r\n"); printf_usb("-----STEP%d------> Create USB MSD\r\n", step++); printf_usb( "If you want to disconnect the strage, please enter usr button\r\n" ); ThisThread::sleep_for(100); // we cannot use both MSD & Serial simultaneously!! delete usb_ser; // Start MSD usb_msd = new USBMSD(&sd); while(true) { usb_msd->process(); if (disconnect_sw == 0) { break; } } // Terminate MSD usb_msd->disconnect(); delete usb_msd; // Restart Serial usb_ser = new USBSerial; printf("line:%d\r\n", __LINE__); printf_usb("You cannot see F446 SD strage!\r\n Now open SD strage\r\n"); printf_usb("-----STEP%d------> Disconnect USB MSD\r\n", step++); // Init SD CARD reader sd.init(); fs = new FATFileSystem("fs"); fs->mount(&sd); printf_usb("-----STEP%d------> Create microSD file system\r\n", step++); // Get date & time time_t seconds = time(NULL); strftime(buf, 64, "DATE %H:%M:%S,%Y/%m/%d\r\n", localtime(&seconds)); // write data into SD FILE* fp = fopen("/fs/mydata.txt", "a"); if (fp != 0) { usb_ser->printf("%s%s", opening_msg0, opening_msg1); fprintf(fp,"%s%s", opening_msg0, opening_msg1); usb_ser->printf("%s", buf); // buf = date & time fprintf(fp, "%s", buf); fflush(fp); fclose(fp); } else { printf_usb("ERROR\r\n"); } printf_usb("-----STEP%d------> Start file monitor\r\n", step++); // goto monitor program to set date & time and so on mon(); fs->remove("fs"); fs->unmount(); printf_usb("-----STEP%d------> Terminate microSD\r\n", step++); while(true) { printf_usb("-----STEP%d------> Waiting restart\r\n", step); printf_usb("If you want to connect again, please enter 'y'\r\n>> "); while (usb_ser_readable() == 0) { ThisThread::sleep_for(100); } char c = usb_ser_get_c(); printf_usb("%c\r\n", c); if (c == 'y') { break; } } step = 1; } } template <typename ... Args> void printf_usb(const char *format, Args const & ... args) { if (usb_ser == NULL) { return; } else { pc.printf(format, args ...); if (usb_ser->connected() == true) { usb_ser->printf(format, args ...); } } } char usb_ser_readable() { if (usb_ser == NULL) { return 0; } else { return usb_ser->readable(); } } char usb_ser_get_c() { if (usb_ser == NULL) { return ' '; } else { return usb_ser->getc(); } } void usb_ser_put_c(char c) { if (usb_ser == NULL) { return; } else { usb_ser->putc(c); } } #endif