s32 TERMINAL_PrintSdCardInfo(void *_output_function) { void (*out)(char *format, ...) = _output_function; FRESULT res; FILINFO fno; DIR dir; char *fn; char str_buffer[128]; MUTEX_MIDIOUT_TAKE; out("SD Card Informations\n"); out("====================\n"); #if !defined(MIOS32_FAMILY_EMULATION) // this yield ensures, that Debug Messages are sent before we continue the execution // Since MIOS Studio displays the time at which the messages arrived, this allows // us to measure the delay of following operations taskYIELD(); MUTEX_SDCARD_TAKE; FILE_PrintSDCardInfos(); MUTEX_SDCARD_GIVE; #endif out("\n"); out("Reading Root Directory\n"); out("======================\n"); taskYIELD(); if( !FILE_SDCardAvailable() ) { sprintf(str_buffer, "not connected"); } else if( !FILE_VolumeAvailable() ) { sprintf(str_buffer, "Invalid FAT"); } else { out("Retrieving SD Card informations - please wait!\n"); MUTEX_MIDIOUT_GIVE; MUTEX_SDCARD_TAKE; FILE_UpdateFreeBytes(); MUTEX_SDCARD_GIVE; MUTEX_MIDIOUT_TAKE; sprintf(str_buffer, "'%s': %u of %u MB free", FILE_VolumeLabel(), (unsigned int)(FILE_VolumeBytesFree()/1000000), (unsigned int)(FILE_VolumeBytesTotal()/1000000)); } out("SD Card: %s\n", str_buffer); taskYIELD(); #if _USE_LFN static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif MUTEX_SDCARD_TAKE; if( (res=f_opendir(&dir, "/")) != FR_OK ) { out("Failed to open root directory - error status: %d\n", res); } else { while( (f_readdir(&dir, &fno) == FR_OK) && fno.fname[0] ) { #if _USE_LFN fn = *fno.lfname ? fno.lfname : fno.fname; #else fn = fno.fname; #endif char date[10]; ShowFatDate(fno.fdate,(char*)&date); char time[12]; ShowFatTime(fno.ftime,(char*)&time); out("[%s%s%s%s%s%s%s] %s %s %s %u %s\n", (fno.fattrib & AM_RDO ) ? "r" : ".", (fno.fattrib & AM_HID ) ? "h" : ".", (fno.fattrib & AM_SYS ) ? "s" : ".", (fno.fattrib & AM_VOL ) ? "v" : ".", (fno.fattrib & AM_LFN ) ? "l" : ".", (fno.fattrib & AM_DIR ) ? "d" : ".", (fno.fattrib & AM_ARC ) ? "a" : ".", date,time, (fno.fattrib & AM_DIR) ? "<DIR>" : " ", fno.fsize,fn); } } MUTEX_SDCARD_GIVE; taskYIELD(); out("done.\n"); MUTEX_MIDIOUT_GIVE; return 0; // no error }
s32 SEQ_TERMINAL_PrintSdCardInfo(void *_output_function) { void (*out)(char *format, ...) = _output_function; FRESULT res; FILINFO fno; DIR dir; char *fn; char str_buffer[128]; MUTEX_MIDIOUT_TAKE; out("SD Card Informations\n"); out("====================\n"); #if !defined(MIOS32_FAMILY_EMULATION) // this yield ensures, that Debug Messages are sent before we continue the execution // Since MIOS Studio displays the time at which the messages arrived, this allows // us to measure the delay of following operations taskYIELD(); MUTEX_SDCARD_TAKE; SEQ_FILE_PrintSDCardInfos(); MUTEX_SDCARD_GIVE; #endif out("\n"); out("Reading Root Directory\n"); out("======================\n"); taskYIELD(); if( !SEQ_FILE_SDCardAvailable() ) { sprintf(str_buffer, "not connected"); } else if( !SEQ_FILE_VolumeAvailable() ) { sprintf(str_buffer, "Invalid FAT"); } else { out("Retrieving SD Card informations - please wait!\n"); MUTEX_MIDIOUT_GIVE; MUTEX_SDCARD_TAKE; SEQ_FILE_UpdateFreeBytes(); MUTEX_SDCARD_GIVE; MUTEX_MIDIOUT_TAKE; sprintf(str_buffer, "'%s': %u of %u MB free", SEQ_FILE_VolumeLabel(), (unsigned int)(SEQ_FILE_VolumeBytesFree()/1000000), (unsigned int)(SEQ_FILE_VolumeBytesTotal()/1000000)); } out("SD Card: %s\n", str_buffer); taskYIELD(); #if _USE_LFN static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1]; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif MUTEX_SDCARD_TAKE; if( (res=f_opendir(&dir, "/")) != FR_OK ) { out("Failed to open root directory - error status: %d\n", res); } else { while( (f_readdir(&dir, &fno) == FR_OK) && fno.fname[0] ) { #if _USE_LFN fn = *fno.lfname ? fno.lfname : fno.fname; #else fn = fno.fname; #endif char date[10]; ShowFatDate(fno.fdate,(char*)&date); char time[12]; ShowFatTime(fno.ftime,(char*)&time); out("[%s%s%s%s%s%s%s] %s %s %s %u %s\n", (fno.fattrib & AM_RDO ) ? "r" : ".", (fno.fattrib & AM_HID ) ? "h" : ".", (fno.fattrib & AM_SYS ) ? "s" : ".", (fno.fattrib & AM_VOL ) ? "v" : ".", (fno.fattrib & AM_LFN ) ? "l" : ".", (fno.fattrib & AM_DIR ) ? "d" : ".", (fno.fattrib & AM_ARC ) ? "a" : ".", date,time, (fno.fattrib & AM_DIR) ? "<DIR>" : " ", fno.fsize,fn); } } MUTEX_SDCARD_GIVE; taskYIELD(); out("\n"); out("Checking SD Card at application layer\n"); out("=====================================\n"); out("Current session: /SESSIONS/%s\n", seq_file_session_name); { u8 bank; for(bank=0; bank<SEQ_FILE_B_NUM_BANKS; ++bank) { int num_patterns = SEQ_FILE_B_NumPatterns(bank); if( num_patterns ) out("File /SESSIONS/%s/MBSEQ_B%d.V4: valid (%d patterns)\n", seq_file_session_name, bank+1, num_patterns); else out("File /SESSIONS/%s/MBSEQ_B%d.V4: doesn't exist\n", seq_file_session_name, bank+1, num_patterns); } int num_maps = SEQ_FILE_M_NumMaps(); if( num_maps ) out("File /SESSIONS/%sMBSEQ_M.V4: valid (%d mixer maps)\n", seq_file_session_name, num_maps); else out("File /SESSIONS/%s/MBSEQ_M.V4: doesn't exist\n", seq_file_session_name); int num_songs = SEQ_FILE_S_NumSongs(); if( num_songs ) out("File /SESSIONS/%s/MBSEQ_S.V4: valid (%d songs)\n", seq_file_session_name, num_songs); else out("File /SESSIONS/%s/MBSEQ_S.V4: doesn't exist\n", seq_file_session_name); if( SEQ_FILE_G_Valid() ) out("File /SESSIONS/%s/MBSEQ_G.V4: valid\n", seq_file_session_name); else out("File /SESSIONS/%s/MBSEQ_G.V4: doesn't exist\n", seq_file_session_name); if( SEQ_FILE_C_Valid() ) out("File /SESSIONS/%s/MBSEQ_C.V4: valid\n", seq_file_session_name); else out("File /SESSIONS/%s/MBSEQ_C.V4: doesn't exist\n", seq_file_session_name); if( SEQ_FILE_HW_Valid() ) out("File /SESSIONS/%s/MBSEQ_HW.V4: valid\n", seq_file_session_name); else out("File /SESSIONS/%s/MBSEQ_HW.V4: doesn't exist or hasn't been re-loaded\n", seq_file_session_name); } out("done.\n"); MUTEX_MIDIOUT_GIVE; return 0; // no error }