//! This function selects a file in EXPLORER mode //! //! @param b_direction direction of navigation (FS_FIND_NEXT or FS_FIND_PREV) //! @param options define extra modes for this function //! //! @return the status of the action //! static uint8_t navauto_mov_explorer_rec(bool b_direction, navauto_mov_options_t options) { navauto_mov_explorer_rec_t result; do { // Clear the WatchDog Timer. wdt_clear(); // If no file is selected - new directory if (!nav_filelist_validpos()) result = navauto_mov_explorer_new_dir(b_direction, options); else if (nav_file_isdir()) // If the selection is on a directory result = navauto_mov_explorer_is_dir(b_direction, options); else // The selection is set on a file result = navauto_mov_explorer_is_file(b_direction, options); } while(result == NAVAUTO_MOV_EXPLORER_RECURSIVE); // Translates returned values switch(result) { case NAVAUTO_MOV_EXPLORER_OK_LOOP: return NAVAUTO_MOV_OK_LOOP; case NAVAUTO_MOV_EXPLORER_OK: return NAVAUTO_MOV_OK; case NAVAUTO_MOV_EXPLORER_EMPTY: return NAVAUTO_MOV_EMPTY; default: return NAVAUTO_MOV_EXPLORER_ERROR; } }
//! This function jumps to the next or previous file in file list corresponding at a play list file //! //! @param b_direction jump direction (FS_FIND_NEXT or FS_FIND_PREV) //! //! @return The status of the action //! //! @verbatim //! This routine is not authorized then a play list file is not opened //! @endverbatim //! Navauto_mov_state navauto_mov_playlist( bool b_direction ) { bool b_endof_loop; b_endof_loop = false; Navauto_mov_state state; state.bitfield.all = 0; while( 1 ) { if( NAVAUTO_RAND_ON == g_navauto_rand ) { g_navauto_u16_pos = navauto_rand_choose(); if( 0 == g_navauto_u16_pos ) { // Loop finish, then reset random and choose other value if( b_endof_loop ) { state.status = NAVAUTO_MOV_DISKERROR; return state; } b_endof_loop = true; navauto_rand_init(); g_navauto_u16_pos = navauto_rand_choose(); } pl_nav_setpos( g_navauto_u16_pos ); } else { g_navauto_u16_pos += (FS_FIND_NEXT==b_direction)? 1 : -1; if( !pl_nav_setpos( g_navauto_u16_pos ) ) { // Loop finish or error if( b_endof_loop ) { state.status = NAVAUTO_MOV_DISKERROR; return state; } b_endof_loop = true; if( FS_FIND_NEXT == b_direction ) { g_navauto_u16_pos = 1-1; // end of list then go to the beginning }else{ g_navauto_u16_pos = pl_nav_getnbfile()+1; // beginning of list then go to the end } } } if( nav_filelist_validpos() ) break; // Here it is a DEAD path or to large for system memory } g_navauto_u16_pos = pl_nav_getpos(); if( b_endof_loop ) { state.status = NAVAUTO_MOV_OK_LOOP; return state; } state.status = NAVAUTO_MOV_OK; return state; }
//! This function tests the valid path in list //! //! @return false = path is not valid in list - DEAD //! bool pl_sel_isvalid( void ) { if(!pl_main_isopen()) return false; if(0 == pl_g_u16_list_sel) return false; return nav_filelist_validpos(); }
//! This function selects a file in EXPLORER mode //! //! @param b_direction direction of navigation (FS_FIND_NEXT or FS_FIND_PREV) //! @param options define extra modes for this function //! //! @return the status of the action //! static uint8_t navauto_mov_explorer_rec( bool b_direction, navauto_mov_options_t options ) { // If no file is selected - new directory if (!nav_filelist_validpos()) return navauto_mov_explorer_new_dir(b_direction, options); // If the selection is on a directory if (nav_file_isdir()) return navauto_mov_explorer_is_dir(b_direction, options); else // The selection is set on a file return navauto_mov_explorer_is_file(b_direction, options); }
//! This function jumps to the next or previous file in file list corresponding at a play list file //! //! @param b_direction jump direction (FS_FIND_NEXT or FS_FIND_PREV) //! //! @return The status of the action //! //! @verbatim //! This routine is not authorized then a play list file is not opened //! @endverbatim //! Navauto_mov_state navauto_mov_playlist( bool b_direction ) { bool b_endof_loop; b_endof_loop = false; Navauto_mov_state state; state.bitfield.all = 0; while( 1 ) { if( NAVAUTO_RAND_ON == g_navauto_rand ) { g_navauto_u16_pos = navauto_rand_choose(g_navauto_u16_pos, g_navauto_u16_nb); pl_nav_setpos( g_navauto_u16_pos + 1 ); } else { g_navauto_u16_pos += (FS_FIND_NEXT==b_direction)? 1 : -1; if( !pl_nav_setpos( g_navauto_u16_pos + 1 ) ) { // Loop finish or error if( b_endof_loop ) { state.status = NAVAUTO_MOV_DISKERROR; return state; } b_endof_loop = true; if( FS_FIND_NEXT == b_direction ) { g_navauto_u16_pos = (uint16_t) -1; // end of list then go to the beginning }else{ g_navauto_u16_pos = pl_nav_getnbfile(); // beginning of list then go to the end } continue; } } if (nav_filelist_validpos() && nav_file_checkext(g_navauto_filter)) break; // Here it is a DEAD path or to large for system memory } g_navauto_u16_pos = pl_nav_getpos() - 1; if( b_endof_loop ) { state.status = NAVAUTO_MOV_OK_LOOP; return state; } state.status = NAVAUTO_MOV_OK; return state; }
//! This function opens a file list at the current position in navigator //! //! @param b_playlist if true then the current selected file is a play list file to open //! else create a file list with files included in a disk part //! @param pos If b_playlist true, then position in the play list to start //! else folder level of the current position //! //! @return false, in case of error or file list empty //! bool navauto_open( bool b_playlist , uint16_t pos ) { Navauto_mov_state state; g_navauto_b_playlist = b_playlist; g_navauto_u16_dir_level_root = 0; g_navauto_u16_nb = 0; if( b_playlist ) { g_navauto_u16_pos = pos; if( !pl_main_open(false) ) return false; g_navauto_u16_nb = pl_nav_getnbfile(); if( 0 == g_navauto_u16_nb ) return false; if( NAVAUTO_RAND_OFF == navauto_getrand() ) { if( pl_nav_setpos( g_navauto_u16_pos )) { if( nav_filelist_validpos() ) return true; } }else{ navauto_rand_init(); } // Error position then restart at the beginning g_navauto_u16_pos = 0; } else { #if( FS_NAV_AUTOMATIC_NBFILE == ENABLE ) Fs_index index; Fs_index index2; Navauto_rand rand_mode; uint16_t u16_current_pos=0; index.u8_lun = 0xFF; // Reset index (by default no valid selected file) g_navauto_u16_dir_level = pos; rand_mode = navauto_getrand(); // Save random mode navauto_setrand( NAVAUTO_RAND_OFF ); // If no valid file then found the first valid file if( !nav_file_checkext( g_navauto_filter )) { // Go to previous position because "navauto_mov_explorer()" execute a next before search valid file if( !nav_filelist_set( 0 , FS_FIND_PREV ) ) nav_filelist_reset(); state = navauto_mov_explorer(FS_FIND_NEXT, NAVAUTO_MOV_OPTS_NONE); if((NAVAUTO_MOV_OK_LOOP != state.status) && (NAVAUTO_MOV_OK != state.status) ) { navauto_setrand(rand_mode); return false; // List empty } } index = nav_getindex(); // Compute the size of file list and search the position of selected file navauto_mov_explorer_reset(); // Go to beginning of loop // Note: the number of file is updated in navauto_mov_explorer() routine when the end of list is detected while( navauto_mov_explorer( FS_FIND_NEXT, NAVAUTO_MOV_OPTS_NONE ).status == NAVAUTO_MOV_OK ) { index2 = nav_getindex(); // Check the current position with the selected file if( (index.u8_lun == index2.u8_lun) && (index.u32_cluster_sel_dir == index2.u32_cluster_sel_dir) && (index.u16_entry_pos_sel_file == index2.u16_entry_pos_sel_file) ) { u16_current_pos = g_navauto_u16_pos; // Save the position number found g_navauto_u16_dir_level_root = g_navauto_u16_dir_level; } } navauto_setrand(rand_mode); // Restore random mode if( 0 == g_navauto_u16_nb ) return false; // loop empty // Go to a file from file list if( NAVAUTO_RAND_OFF == navauto_getrand() ) { if( 0xFF != index.u8_lun ) { // Reselect the file selected at startup nav_gotoindex( &index ); // Go to this one g_navauto_u16_dir_level = g_navauto_u16_dir_level_root; // Update position file g_navauto_u16_pos = u16_current_pos; // Update folder level corresponding at file } // Else, the first file is already selected at the end of "compute file list size" loop return true; }else{ navauto_rand_init(); } #else Fs_index index; Navauto_rand rand_mode; rand_mode = navauto_getrand(); navauto_setrand(NAVAUTO_RAND_OFF); // If no valid file then find the first valid file if( !nav_file_checkext( g_navauto_filter )) { // Go to previous position because "navauto_mov_explorer()" execute a next before search valid file if( !nav_filelist_set( 0 , FS_FIND_PREV ) ) nav_filelist_reset(); state = navauto_mov_explorer(FS_FIND_NEXT, NAVAUTO_MOV_OPTS_NONE); if((NAVAUTO_MOV_OK_LOOP != state.status) && (NAVAUTO_MOV_OK != state.status) ) { navauto_setrand(rand_mode); return false; // List empty } } index = nav_getindex(); navauto_setrand(rand_mode); navauto_mov_explorer_reset(); // Compute directory level g_navauto_u16_dir_level = 0; while(nav_dir_gotoparent()) g_navauto_u16_dir_level++; g_navauto_u16_dir_level_root = g_navauto_u16_dir_level; //g_navauto_u16_dir_level = pos; // Restore index nav_gotoindex(&index); g_navauto_u16_nb = 0xFFFF; if( NAVAUTO_RAND_OFF == navauto_getrand() ) navauto_rand_init(); if( nav_file_checkext( g_navauto_filter )) { // Valid file then update position with the first position but it is not the first ! g_navauto_u16_pos = 1; return true; } #endif } // Find first file or use the random feature state = navauto_mov(FS_FIND_NEXT, NAVAUTO_MOV_OPTS_NONE); if((NAVAUTO_MOV_OK_LOOP != state.status) && (NAVAUTO_MOV_OK != state.status) ) return false; // List empty return true; }
//! This function checks if a file is selected //! //! @return true if a file is selected //! @return false if no file is selected //! bool nav_flat_validpos( void ) { return nav_filelist_validpos(); }