///////////////////////////////////////////////////////////////////////////// // This task is called periodically each mS when USB MSD access is enabled ///////////////////////////////////////////////////////////////////////////// static void TASK_MSD(void *pvParameters) { u8 lun_available = 0; while( 1 ) { // using vTaskDelay instead of vTaskDelayUntil, since a periodical execution // isn't required, and this task could be invoked too often if it was blocked // for a long time vTaskDelay(1 / portTICK_RATE_MS); // MSD driver handling if( msd_state != MSD_DISABLED ) { MUTEX_SDCARD_TAKE; switch( msd_state ) { case MSD_SHUTDOWN: // switch back to USB MIDI MIOS32_USB_Init(1); msd_state = MSD_DISABLED; MUTEX_SDCARD_GIVE; vTaskSuspend(NULL); // will be resumed from TASK_MSD_EnableSet() MUTEX_SDCARD_TAKE; break; case MSD_INIT: // LUN not mounted yet lun_available = 0; // enable MSD USB driver if( MSD_Init(0) >= 0 ) msd_state = MSD_READY; else msd_state = MSD_SHUTDOWN; break; case MSD_READY: // service MSD USB driver MSD_Periodic_mS(); // this mechanism shuts down the MSD driver if SD card has been unmounted by OS if( lun_available && !MSD_LUN_AvailableGet(0) ) msd_state = MSD_SHUTDOWN; else if( !lun_available && MSD_LUN_AvailableGet(0) ) lun_available = 1; break; } MUTEX_SDCARD_GIVE; } } }
static void TaskSDCard(void *pvParameters) { uint16_t second_delay_ctr = 0; portTickType xLastExecutionTime; /* Initialise the xLastExecutionTime variable on task entry */ xLastExecutionTime = xTaskGetTickCount(); for(;;) { vTaskDelayUntil(&xLastExecutionTime, 1 / portTICK_RATE_MS); /* Each second: */ /* Check if SD card is available */ /* High-speed access if SD card was previously available */ if(++second_delay_ctr >= 1000) { second_delay_ctr = 0; uint8_t prev_sdcard_available = sdcard_available; sdcard_available = PIOS_SDCARD_CheckAvailable(prev_sdcard_available); if(sdcard_available && !prev_sdcard_available) { /* SD Card has been connected! */ /* Switch to mass storage device */ MSD_Init(0); } else if(!sdcard_available && prev_sdcard_available) { /* Re-init USB for HID */ PIOS_USB_Init(1); /* SD Card disconnected! */ } } /* Each millisecond: */ /* Handle USB access if device is available */ if(sdcard_available) { MSD_Periodic_mS(); } } }
///////////////////////////////////////////////////////////////////////////// //! This task is running endless in background ///////////////////////////////////////////////////////////////////////////// void APP_Background(void) { const u16 sdcard_check_delay = 1000; u16 sdcard_check_ctr = 0; u8 lun_available = 0; static u8 isInMainPage = 1; SCS_DisplayUpdateInMainPage(0); MBNG_LCD_SpecialCharsReInit(); u32 last_timestamp = MIOS32_TIMESTAMP_Get(); while( 1 ) { //vTaskDelay(1 / portTICK_RATE_MS); // Background task: use timestamp mechanism to generate delay while( MIOS32_TIMESTAMP_Get() == last_timestamp ); last_timestamp = MIOS32_TIMESTAMP_Get(); // call SCS handler MUTEX_LCD_TAKE; MIOS32_LCD_FontInit((u8 *)GLCD_FONT_NORMAL); SCS_Tick(); SCS_DisplayUpdateInMainPage((MBNG_EVENT_MidiLearnModeGet() || MBNG_EVENT_EventLearnIdGet()) ? 1 : 0); // LCD output in mainpage if( SCS_MenuStateGet() == SCS_MENU_STATE_MAINPAGE && !MBNG_EVENT_MidiLearnModeGet() && !MBNG_EVENT_EventLearnIdGet() ) { u8 force = isInMainPage == 0; if( force ) { // page change MBNG_LCD_SpecialCharsReInit(); MBNG_LCD_CursorSet(SCS_LCD_DeviceGet(), SCS_LCD_OffsetXGet(), SCS_LCD_OffsetYGet() + 0); MBNG_LCD_PrintSpaces(SCS_NumMenuItemsGet()*SCS_MENU_ITEM_WIDTH); MBNG_LCD_CursorSet(SCS_LCD_DeviceGet(), SCS_LCD_OffsetXGet(), SCS_LCD_OffsetYGet() + 1); MBNG_LCD_PrintSpaces(SCS_NumMenuItemsGet()*SCS_MENU_ITEM_WIDTH); } MBNG_EVENT_UpdateLCD(force); // handles .NGR file execution MBNG_FILE_R_CheckRequest(); isInMainPage = 1; // static reminder } else { if( isInMainPage && (MBNG_EVENT_MidiLearnModeGet() || MBNG_EVENT_EventLearnIdGet()) ) { SCS_LCD_Update(1); // force display update when learn mode is entered in mainpage } isInMainPage = 0; // static reminder } // handles .NGR file execution MBNG_FILE_R_CheckRequest(); MUTEX_LCD_GIVE; // -> keyboard handler KEYBOARD_Periodic_1mS(); // MIDI In/Out monitor MIDI_PORT_Period1mS(); // call MIDI event tick MBNG_EVENT_Tick(); // each second: check if SD Card (still) available if( msd_state == MSD_DISABLED && ++sdcard_check_ctr >= sdcard_check_delay ) { sdcard_check_ctr = 0; MUTEX_SDCARD_TAKE; s32 status = FILE_CheckSDCard(); if( status == 1 ) { DEBUG_MSG("SD Card connected: %s\n", FILE_VolumeLabel()); // stop sequencer SEQ_BPM_Stop(); // load all file infos MBNG_FILE_LoadAllFiles(1); // including HW info // select the first bank MBNG_EVENT_SelectedBankSet(1); // immediately go to next step sdcard_check_ctr = sdcard_check_delay; } else if( status == 2 ) { DEBUG_MSG("SD Card disconnected\n"); // invalidate all file infos MBNG_FILE_UnloadAllFiles(); // stop sequencer SEQ_BPM_Stop(); // change status MBNG_FILE_StatusMsgSet("No SD Card"); MUTEX_LCD_TAKE; MBNG_LCD_CursorSet(0, 0, 0); MBNG_LCD_PrintString("*** No SD Card *** "); MBNG_LCD_ClearScreenOnNextMessage(); MUTEX_LCD_GIVE; } else if( status == 3 ) { if( !FILE_SDCardAvailable() ) { DEBUG_MSG("SD Card not found\n"); MBNG_FILE_StatusMsgSet("No SD Card"); MUTEX_LCD_TAKE; MBNG_LCD_CursorSet(0, 0, 0); MBNG_LCD_PrintString("*** No SD Card *** "); MBNG_LCD_ClearScreenOnNextMessage(); MUTEX_LCD_GIVE; } else if( !FILE_VolumeAvailable() ) { DEBUG_MSG("ERROR: SD Card contains invalid FAT!\n"); MBNG_FILE_StatusMsgSet("No FAT"); MUTEX_LCD_TAKE; MBNG_LCD_CursorSet(0, 0, 0); MBNG_LCD_PrintString("* No FAT on SD Card * "); MBNG_LCD_ClearScreenOnNextMessage(); MUTEX_LCD_GIVE; } else { MBNG_FILE_StatusMsgSet(NULL); // create the default files if they don't exist on SD Card MBNG_FILE_CreateDefaultFiles(); } hw_enabled = 1; // enable hardware after first read... } MUTEX_SDCARD_GIVE; } // MSD driver if( msd_state != MSD_DISABLED ) { MUTEX_SDCARD_TAKE; switch( msd_state ) { case MSD_SHUTDOWN: // switch back to USB MIDI MIOS32_USB_Init(1); msd_state = MSD_DISABLED; break; case MSD_INIT: // LUN not mounted yet lun_available = 0; // enable MSD USB driver MUTEX_J16_TAKE; if( MSD_Init(0) >= 0 ) msd_state = MSD_READY; else msd_state = MSD_SHUTDOWN; MUTEX_J16_GIVE; break; case MSD_READY: // service MSD USB driver MSD_Periodic_mS(); // this mechanism shuts down the MSD driver if SD card has been unmounted by OS if( lun_available && !MSD_LUN_AvailableGet(0) ) msd_state = MSD_SHUTDOWN; else if( !lun_available && MSD_LUN_AvailableGet(0) ) lun_available = 1; break; } MUTEX_SDCARD_GIVE; } } }