//***************************************************************************** // // The "Up" button widget callback function. // // This function is called whenever someone presses the "Up" button. // //***************************************************************************** void OnBtnUp(tWidget *pWidget) { uint32_t ui32Reason; FRESULT fresult; // // Change up one directory. // fresult = ChangeToDirectory("..", &ui32Reason); if(fresult != FR_OK) { // // Update the status display to show the error. // PrintfStatus("Error changing directory."); PrintfStatus((char *)StringFromFresult(fresult)); } else { // // Update the directory name and the list box contents. // WidgetPaint((tWidget *)&g_sPWD); PopulateFileListBox(true); // // If we are now in the root directory, hide the "Up" button. // if((strlen(g_cCwdBuf) == 1) && (g_cCwdBuf[0] == '/')) { WidgetRemove((tWidget *)&g_sUpBtn); } else { WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); } // // Disable the CD button since re-populating the list removes the // selection. // WidgetRemove((tWidget *)&g_sCDBtn); // // Tell the user what happened. // PrintfStatus("Changed to %s", g_cCwdBuf); // // Repaint the buttons. // WidgetPaint((tWidget *)&g_sUpBackground); WidgetPaint((tWidget *)&g_sCDBackground); } }
// // Cmd_cd - This function implements the "cd" command. It takes an argument // that specifies the directory to make the current working directory. // Path separators must use a forward slash "/". The argument to cd // can be one of the following: // * root ("/") // * a fully specified path ("/my/path/to/mydir") // * a single directory name that is in the current directory("mydir") // * parent directory ("..") // It does not understand relative paths, so dont try something like // this: ("../my/new/path") // Once the new directory is specified, it attempts to open the // directory to make sure it exists. If the new path is opened // successfully, then the current working directory (cwd) is changed // to the new path. // int Cmd_cd(int argc, char *argv[]) { unsigned long ulReason; FRESULT fresult; // // Try to change to the directory provided on the command line. // fresult = ChangeToDirectory(argv[1], &ulReason); // // If an error was reported, try to offer some helpful information. // if(fresult != FR_OK) { switch(ulReason) { case OPENDIR_ERROR: UARTprintf("Error opening new directory.\n"); break; case NAME_TOO_LONG_ERROR: UARTprintf("Resulting path name is too long.\n"); break; default: UARTprintf("An unrecognized error was reported.\n"); break; } } // // Return the appropriate error code. // return(fresult); }
//***************************************************************************** // // This function performs actions that are common whenever the directory // level is changed up or down. It populates the correct menu structure with // the list of files in the directory. // //***************************************************************************** static bool ProcessDirChange(char *pcDir, uint32_t ui32Level) { FRESULT fresult; uint32_t ui32Reason; uint32_t ui32FileCount; // // Attempt to change to the new directory. // fresult = ChangeToDirectory(pcDir, &ui32Reason); // // If the directory change was successful, populate the // list of files for the new subdirectory. // if((fresult == FR_OK) && (ui32Level < MAX_SUBDIR_DEPTH)) { // // Get a pointer to the current menu for this CWD. // tSlideMenu *psMenu = &g_psFileMenus[ui32Level]; // // Populate the menu items with the file list for the new CWD. // ui32FileCount = PopulateFileList(ui32Level); // // Initialize the file menu with the list of menu items, // which are just files and dirs in the root directory // psMenu->psSlideMenuItems = g_psFileMenuItems[ui32Level & 1]; psMenu->ui32Items = ui32FileCount; // // Set the parent directory, if there is one. If at level 0 // (CWD is root), then there is no parent directory. // if(ui32Level) { psMenu->psParent = &g_psFileMenus[ui32Level - 1]; } else { psMenu->psParent = 0; } // // If we are descending into a new subdir, then initialize the other // menu item fields to default values. // if(ui32Level > g_ui32Level) { psMenu->ui32CenterIndex = 0; psMenu->ui32FocusIndex = 0; psMenu->bMultiSelectable = 0; } // // Return a success indication // return(true); } // // Directory change was not successful // else { // // Return failure indication // return(false); } }
//***************************************************************************** // // The "CD" button widget callback function. // // This function is called whenever someone presses the "CD" button. // //***************************************************************************** void OnBtnCD(tWidget *pWidget) { int16_t i16Selected; uint32_t ui32Reason; FRESULT fresult; // // Get the current selection from the list box. // i16Selected = ListBoxSelectionGet(&g_sDirList); // // Is there any selection? // if(i16Selected == -1) { return; } else { // // Is the selection a directory name? // if(g_pcFilenames[i16Selected][1] == 'D') { // // Yes - change to the new directory. // fresult = ChangeToDirectory(&g_pcFilenames[i16Selected][4], &ui32Reason); if(fresult != FR_OK) { // // Update the status display to show the error. // PrintfStatus("Error changing directory."); PrintfStatus((char *)StringFromFresult(fresult)); } else { // // Tell the user what happened. // PrintfStatus("Changed to %s", g_cCwdBuf); // // Update the directory name and the list box contents. // PopulateFileListBox(true); WidgetPaint((tWidget *)&g_sPWD); // // Enable the "Up" button and disable the "CD" button. // WidgetAdd((tWidget *)&g_sUpBackground, (tWidget *)&g_sUpBtn); WidgetRemove((tWidget *)&g_sCDBtn); // // Make sure the buttons are repainted correctly. // WidgetPaint((tWidget *)&g_sUpBtn); WidgetPaint((tWidget *)&g_sCDBackground); } } } }