Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
okano
Date:
Thu Jan 29 10:48:57 2015 +0000
Revision:
48:99cfe3a929ea
Child:
49:380e7be429ef
file selector interface implemented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 48:99cfe3a929ea 1 #include "mbed.h"
okano 48:99cfe3a929ea 2 #include "dir_handling.h"
okano 48:99cfe3a929ea 3 #include "_user_settings.h"
okano 48:99cfe3a929ea 4 #include "DirectoryList.h"
okano 48:99cfe3a929ea 5 #include "isp.h"
okano 48:99cfe3a929ea 6
okano 48:99cfe3a929ea 7 #include <iostream>
okano 48:99cfe3a929ea 8 #include <string>
okano 48:99cfe3a929ea 9 #include <cctype>
okano 48:99cfe3a929ea 10 #include <algorithm>
okano 48:99cfe3a929ea 11
okano 48:99cfe3a929ea 12 extern Serial pc;
okano 48:99cfe3a929ea 13 extern BusOut leds;
okano 48:99cfe3a929ea 14
okano 48:99cfe3a929ea 15 void show_file_list( std::vector<std::string> list );
okano 48:99cfe3a929ea 16 void user_action_waiting_indicator();
okano 48:99cfe3a929ea 17
okano 48:99cfe3a929ea 18
okano 48:99cfe3a929ea 19 std::string get_file_name( std::string &default_path, const char *suffix )
okano 48:99cfe3a929ea 20 {
okano 48:99cfe3a929ea 21 Ticker led_blink;
okano 48:99cfe3a929ea 22 int last_slash;
okano 48:99cfe3a929ea 23
okano 48:99cfe3a929ea 24 last_slash = (int)default_path.rfind( "/" );
okano 48:99cfe3a929ea 25
okano 48:99cfe3a929ea 26 if ( last_slash == std::string::npos ) {
okano 48:99cfe3a929ea 27 default_path.clear();
okano 48:99cfe3a929ea 28 return ( default_path );
okano 48:99cfe3a929ea 29 }
okano 48:99cfe3a929ea 30
okano 48:99cfe3a929ea 31 string file_name( default_path.c_str() + last_slash + 1 );
okano 48:99cfe3a929ea 32 string path_name( default_path.c_str(), default_path.c_str() + last_slash );
okano 48:99cfe3a929ea 33
okano 48:99cfe3a929ea 34 //printf( "path_name : %s\r\n", path_name.c_str() );
okano 48:99cfe3a929ea 35 //printf( "file_name : %s\r\n", file_name.c_str() );
okano 48:99cfe3a929ea 36
okano 48:99cfe3a929ea 37 file_name.push_back( '.' );
okano 48:99cfe3a929ea 38 std::transform( file_name.begin(), file_name.end(), file_name.begin(), toupper );
okano 48:99cfe3a929ea 39
okano 48:99cfe3a929ea 40 DirectoryList dir( path_name );
okano 48:99cfe3a929ea 41 std::vector<std::string> list;
okano 48:99cfe3a929ea 42
okano 48:99cfe3a929ea 43 for ( int i = 0; i < dir.size(); i++ ) {
okano 48:99cfe3a929ea 44 if ( dir[ i ] == file_name ) {
okano 48:99cfe3a929ea 45 return ( default_path );
okano 48:99cfe3a929ea 46 }
okano 48:99cfe3a929ea 47
okano 48:99cfe3a929ea 48 if ( *suffix == '*' ) {
okano 48:99cfe3a929ea 49 list = dir;
okano 48:99cfe3a929ea 50 } else {
okano 48:99cfe3a929ea 51 //printf( "-- [%s][%d]\r\n", dir[ i ].c_str(), dir[ i ].find( ".BIN" ) );
okano 48:99cfe3a929ea 52 //if ( (8 == dir[ i ].find( ".BIN" )) && (0 != dir[ i ].find( "IKA" )) ) {
okano 48:99cfe3a929ea 53 if ( (9 == dir[ i ].find( suffix )) ) {
okano 48:99cfe3a929ea 54 list.push_back( dir[ i ] );
okano 48:99cfe3a929ea 55 }
okano 48:99cfe3a929ea 56 }
okano 48:99cfe3a929ea 57 }
okano 48:99cfe3a929ea 58
okano 48:99cfe3a929ea 59 led_blink.attach( &user_action_waiting_indicator, 0.05 );
okano 48:99cfe3a929ea 60
okano 48:99cfe3a929ea 61 printf( "\r\n WARNING : No file which has name of \"%s\" was found.\r\n", default_path.c_str() );
okano 48:99cfe3a929ea 62 printf( " now showing \"%s\" directory to select a source file.\r\n\r\n", path_name.c_str() );
okano 48:99cfe3a929ea 63
okano 48:99cfe3a929ea 64 if ( !list.size() ) {
okano 48:99cfe3a929ea 65 printf( " WARNING : No file which has suffix of \"%s\" was found.\r\n", suffix );
okano 48:99cfe3a929ea 66 default_path.clear();
okano 48:99cfe3a929ea 67 return ( default_path );
okano 48:99cfe3a929ea 68 }
okano 48:99cfe3a929ea 69
okano 48:99cfe3a929ea 70 #define FORMAT_FOR_SELECTED_FILE_NAME " selected file : [%3d] : \"%-12s\" \r"
okano 48:99cfe3a929ea 71
okano 48:99cfe3a929ea 72 //printf( " ==== directory by \"%s/*.%s\" (excluding \"%s/ika*.bin\") ====\r\n", path_name.c_str(), suffix, path_name.c_str() );
okano 48:99cfe3a929ea 73 printf( " ==== directory by \"%s/*.%s\", %d files ====\r\n", path_name.c_str(), suffix, list.size() );
okano 48:99cfe3a929ea 74
okano 48:99cfe3a929ea 75 show_file_list( list );
okano 48:99cfe3a929ea 76
okano 48:99cfe3a929ea 77 int done = false;
okano 48:99cfe3a929ea 78 int index = 0;
okano 48:99cfe3a929ea 79 int c;
okano 48:99cfe3a929ea 80
okano 48:99cfe3a929ea 81 printf( FORMAT_FOR_SELECTED_FILE_NAME, index, list[ index ].c_str() );
okano 48:99cfe3a929ea 82 fflush( stdout );
okano 48:99cfe3a929ea 83
okano 48:99cfe3a929ea 84 while ( !done ) {
okano 48:99cfe3a929ea 85 if ( pc.readable() ) {
okano 48:99cfe3a929ea 86 switch ( c = pc.getc() ) {
okano 48:99cfe3a929ea 87 case '\r' :
okano 48:99cfe3a929ea 88 case '\n' :
okano 48:99cfe3a929ea 89 done = true;
okano 48:99cfe3a929ea 90 break;
okano 48:99cfe3a929ea 91
okano 48:99cfe3a929ea 92 case 'e' :
okano 48:99cfe3a929ea 93 case 'E' :
okano 48:99cfe3a929ea 94 printf( "\r\n Erasing the flash memory\r\n" );
okano 48:99cfe3a929ea 95 default_path = "\xFF";
okano 48:99cfe3a929ea 96 return ( default_path );
okano 48:99cfe3a929ea 97 //break;
okano 48:99cfe3a929ea 98
okano 48:99cfe3a929ea 99 case 'a' :
okano 48:99cfe3a929ea 100 case 'A' :
okano 48:99cfe3a929ea 101 case 'c' :
okano 48:99cfe3a929ea 102 case 'C' :
okano 48:99cfe3a929ea 103 printf( "\r\n Aborted to cancel the ISP execution\r\n" );
okano 48:99cfe3a929ea 104 default_path.clear();
okano 48:99cfe3a929ea 105 return ( default_path );
okano 48:99cfe3a929ea 106 //break;
okano 48:99cfe3a929ea 107
okano 48:99cfe3a929ea 108 case '0' :
okano 48:99cfe3a929ea 109 case '1' :
okano 48:99cfe3a929ea 110 case '2' :
okano 48:99cfe3a929ea 111 case '3' :
okano 48:99cfe3a929ea 112 case '4' :
okano 48:99cfe3a929ea 113 case '5' :
okano 48:99cfe3a929ea 114 case '6' :
okano 48:99cfe3a929ea 115 case '7' :
okano 48:99cfe3a929ea 116 case '8' :
okano 48:99cfe3a929ea 117 case '9' :
okano 48:99cfe3a929ea 118 index = c - '0';
okano 48:99cfe3a929ea 119 index = ( (list.size() - 1) < index ) ? (list.size() - 1) : index;
okano 48:99cfe3a929ea 120 break;
okano 48:99cfe3a929ea 121 case '?' :
okano 48:99cfe3a929ea 122 show_file_list( list );
okano 48:99cfe3a929ea 123 break;
okano 48:99cfe3a929ea 124
okano 48:99cfe3a929ea 125
okano 48:99cfe3a929ea 126 case 0x1B :
okano 48:99cfe3a929ea 127 if ( 0x5B == pc.getc() )
okano 48:99cfe3a929ea 128 // arrow key pressed
okano 48:99cfe3a929ea 129 switch ( c = pc.getc() ) {
okano 48:99cfe3a929ea 130 case 0x41 :
okano 48:99cfe3a929ea 131 case 0x43 :
okano 48:99cfe3a929ea 132 index += ( index == (list.size() - 1) ) ? 0 : 1;
okano 48:99cfe3a929ea 133 break;
okano 48:99cfe3a929ea 134 case 0x42 :
okano 48:99cfe3a929ea 135 case 0x44 :
okano 48:99cfe3a929ea 136 index -= ( index == 0 ) ? 0 : 1;
okano 48:99cfe3a929ea 137 break;
okano 48:99cfe3a929ea 138 default :
okano 48:99cfe3a929ea 139 break;
okano 48:99cfe3a929ea 140 }
okano 48:99cfe3a929ea 141 }
okano 48:99cfe3a929ea 142
okano 48:99cfe3a929ea 143 printf( FORMAT_FOR_SELECTED_FILE_NAME, index, list[ index ].c_str() );
okano 48:99cfe3a929ea 144 fflush( stdout );
okano 48:99cfe3a929ea 145 }
okano 48:99cfe3a929ea 146 }
okano 48:99cfe3a929ea 147
okano 48:99cfe3a929ea 148 default_path.clear();
okano 48:99cfe3a929ea 149 default_path = path_name + "/" + list[ index ];
okano 48:99cfe3a929ea 150
okano 48:99cfe3a929ea 151 printf( "\r\n flash writing source file : \"%s\"\r\n\r\n", default_path.c_str() );
okano 48:99cfe3a929ea 152
okano 48:99cfe3a929ea 153 return ( default_path );
okano 48:99cfe3a929ea 154 }
okano 48:99cfe3a929ea 155
okano 48:99cfe3a929ea 156 void show_file_list( std::vector<std::string> list )
okano 48:99cfe3a929ea 157 {
okano 48:99cfe3a929ea 158 int width;
okano 48:99cfe3a929ea 159 int height;
okano 48:99cfe3a929ea 160 int d_i;
okano 48:99cfe3a929ea 161
okano 48:99cfe3a929ea 162 width = (list.size() / 5) + 1;
okano 48:99cfe3a929ea 163 width = (4 < width) ? 4 : width;
okano 48:99cfe3a929ea 164 height = (list.size() + (width - 1)) / width;
okano 48:99cfe3a929ea 165
okano 48:99cfe3a929ea 166 for ( int i = 0; i < height; i++ ) {
okano 48:99cfe3a929ea 167 for ( int j = 0; j < width; j++ ) {
okano 48:99cfe3a929ea 168
okano 48:99cfe3a929ea 169 d_i = i + j * height;
okano 48:99cfe3a929ea 170
okano 48:99cfe3a929ea 171 if ( list.size() <= d_i )
okano 48:99cfe3a929ea 172 break;
okano 48:99cfe3a929ea 173
okano 48:99cfe3a929ea 174 printf( " %3d : %-12s", d_i, list[ d_i ].c_str() );
okano 48:99cfe3a929ea 175 }
okano 48:99cfe3a929ea 176 printf( "\r\n" );
okano 48:99cfe3a929ea 177 }
okano 48:99cfe3a929ea 178 printf( "\r\n" );
okano 48:99cfe3a929ea 179 printf( " ** Use arrow key (up/down or left/right) to select a file\r\n" );
okano 48:99cfe3a929ea 180 printf( " ** or ..\r\n" );
okano 48:99cfe3a929ea 181 printf( " ** press [a] key for abort and go to serial through mode\r\n" );
okano 48:99cfe3a929ea 182 printf( " ** press [e] key for erasing flash\r\n" );
okano 48:99cfe3a929ea 183 printf( " ** press [?] key to display this message again\r\n\r\n" );
okano 48:99cfe3a929ea 184 }
okano 48:99cfe3a929ea 185
okano 48:99cfe3a929ea 186
okano 48:99cfe3a929ea 187 void user_action_waiting_indicator()
okano 48:99cfe3a929ea 188 {
okano 48:99cfe3a929ea 189 static int i = 0;
okano 48:99cfe3a929ea 190
okano 48:99cfe3a929ea 191 if ( (i == 0) || (i == 3) )
okano 48:99cfe3a929ea 192 leds = 0xF;
okano 48:99cfe3a929ea 193 else
okano 48:99cfe3a929ea 194 leds = 0x0;
okano 48:99cfe3a929ea 195
okano 48:99cfe3a929ea 196 i++;
okano 48:99cfe3a929ea 197 i &= 0xF;
okano 48:99cfe3a929ea 198 }
okano 48:99cfe3a929ea 199
okano 48:99cfe3a929ea 200
okano 48:99cfe3a929ea 201