Code to load a LPC1114 over tx/rx. I have only tested with a 1114 chip but it should work with other LPC uControllers
Dependencies: DirectoryList MODSERIAL mbed
Fork of ika_shouyu_poppoyaki by
dir_handling/dir_handling.cpp@49:380e7be429ef, 2015-06-05 (annotated)
- Committer:
- okano
- Date:
- Fri Jun 05 13:37:38 2015 +0000
- Revision:
- 49:380e7be429ef
- Parent:
- 48:99cfe3a929ea
fixed: compilation error when it build with mbed-lib rev.100.
Who changed what in which revision?
User | Revision | Line number | New 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 | 49:380e7be429ef | 38 | std::transform( file_name.begin(), file_name.end(), file_name.begin(), (int (*)(int))std::toupper ); |
okano | 49:380e7be429ef | 39 | // "toupper" function cast had been done for latest mbed-lib (checked with rev.100). |
okano | 49:380e7be429ef | 40 | // see --> http://stackoverflow.com/questions/7131858/stdtransform-and-toupper-no-matching-function |
okano | 48:99cfe3a929ea | 41 | |
okano | 48:99cfe3a929ea | 42 | DirectoryList dir( path_name ); |
okano | 48:99cfe3a929ea | 43 | std::vector<std::string> list; |
okano | 48:99cfe3a929ea | 44 | |
okano | 48:99cfe3a929ea | 45 | for ( int i = 0; i < dir.size(); i++ ) { |
okano | 48:99cfe3a929ea | 46 | if ( dir[ i ] == file_name ) { |
okano | 48:99cfe3a929ea | 47 | return ( default_path ); |
okano | 48:99cfe3a929ea | 48 | } |
okano | 48:99cfe3a929ea | 49 | |
okano | 48:99cfe3a929ea | 50 | if ( *suffix == '*' ) { |
okano | 48:99cfe3a929ea | 51 | list = dir; |
okano | 48:99cfe3a929ea | 52 | } else { |
okano | 48:99cfe3a929ea | 53 | //printf( "-- [%s][%d]\r\n", dir[ i ].c_str(), dir[ i ].find( ".BIN" ) ); |
okano | 48:99cfe3a929ea | 54 | //if ( (8 == dir[ i ].find( ".BIN" )) && (0 != dir[ i ].find( "IKA" )) ) { |
okano | 48:99cfe3a929ea | 55 | if ( (9 == dir[ i ].find( suffix )) ) { |
okano | 48:99cfe3a929ea | 56 | list.push_back( dir[ i ] ); |
okano | 48:99cfe3a929ea | 57 | } |
okano | 48:99cfe3a929ea | 58 | } |
okano | 48:99cfe3a929ea | 59 | } |
okano | 48:99cfe3a929ea | 60 | |
okano | 48:99cfe3a929ea | 61 | led_blink.attach( &user_action_waiting_indicator, 0.05 ); |
okano | 48:99cfe3a929ea | 62 | |
okano | 48:99cfe3a929ea | 63 | printf( "\r\n WARNING : No file which has name of \"%s\" was found.\r\n", default_path.c_str() ); |
okano | 48:99cfe3a929ea | 64 | printf( " now showing \"%s\" directory to select a source file.\r\n\r\n", path_name.c_str() ); |
okano | 48:99cfe3a929ea | 65 | |
okano | 48:99cfe3a929ea | 66 | if ( !list.size() ) { |
okano | 48:99cfe3a929ea | 67 | printf( " WARNING : No file which has suffix of \"%s\" was found.\r\n", suffix ); |
okano | 48:99cfe3a929ea | 68 | default_path.clear(); |
okano | 48:99cfe3a929ea | 69 | return ( default_path ); |
okano | 48:99cfe3a929ea | 70 | } |
okano | 48:99cfe3a929ea | 71 | |
okano | 48:99cfe3a929ea | 72 | #define FORMAT_FOR_SELECTED_FILE_NAME " selected file : [%3d] : \"%-12s\" \r" |
okano | 48:99cfe3a929ea | 73 | |
okano | 48:99cfe3a929ea | 74 | //printf( " ==== directory by \"%s/*.%s\" (excluding \"%s/ika*.bin\") ====\r\n", path_name.c_str(), suffix, path_name.c_str() ); |
okano | 48:99cfe3a929ea | 75 | printf( " ==== directory by \"%s/*.%s\", %d files ====\r\n", path_name.c_str(), suffix, list.size() ); |
okano | 48:99cfe3a929ea | 76 | |
okano | 48:99cfe3a929ea | 77 | show_file_list( list ); |
okano | 48:99cfe3a929ea | 78 | |
okano | 48:99cfe3a929ea | 79 | int done = false; |
okano | 48:99cfe3a929ea | 80 | int index = 0; |
okano | 48:99cfe3a929ea | 81 | int c; |
okano | 48:99cfe3a929ea | 82 | |
okano | 48:99cfe3a929ea | 83 | printf( FORMAT_FOR_SELECTED_FILE_NAME, index, list[ index ].c_str() ); |
okano | 48:99cfe3a929ea | 84 | fflush( stdout ); |
okano | 48:99cfe3a929ea | 85 | |
okano | 48:99cfe3a929ea | 86 | while ( !done ) { |
okano | 48:99cfe3a929ea | 87 | if ( pc.readable() ) { |
okano | 48:99cfe3a929ea | 88 | switch ( c = pc.getc() ) { |
okano | 48:99cfe3a929ea | 89 | case '\r' : |
okano | 48:99cfe3a929ea | 90 | case '\n' : |
okano | 48:99cfe3a929ea | 91 | done = true; |
okano | 48:99cfe3a929ea | 92 | break; |
okano | 48:99cfe3a929ea | 93 | |
okano | 48:99cfe3a929ea | 94 | case 'e' : |
okano | 48:99cfe3a929ea | 95 | case 'E' : |
okano | 48:99cfe3a929ea | 96 | printf( "\r\n Erasing the flash memory\r\n" ); |
okano | 48:99cfe3a929ea | 97 | default_path = "\xFF"; |
okano | 48:99cfe3a929ea | 98 | return ( default_path ); |
okano | 48:99cfe3a929ea | 99 | //break; |
okano | 48:99cfe3a929ea | 100 | |
okano | 48:99cfe3a929ea | 101 | case 'a' : |
okano | 48:99cfe3a929ea | 102 | case 'A' : |
okano | 48:99cfe3a929ea | 103 | case 'c' : |
okano | 48:99cfe3a929ea | 104 | case 'C' : |
okano | 48:99cfe3a929ea | 105 | printf( "\r\n Aborted to cancel the ISP execution\r\n" ); |
okano | 48:99cfe3a929ea | 106 | default_path.clear(); |
okano | 48:99cfe3a929ea | 107 | return ( default_path ); |
okano | 48:99cfe3a929ea | 108 | //break; |
okano | 48:99cfe3a929ea | 109 | |
okano | 48:99cfe3a929ea | 110 | case '0' : |
okano | 48:99cfe3a929ea | 111 | case '1' : |
okano | 48:99cfe3a929ea | 112 | case '2' : |
okano | 48:99cfe3a929ea | 113 | case '3' : |
okano | 48:99cfe3a929ea | 114 | case '4' : |
okano | 48:99cfe3a929ea | 115 | case '5' : |
okano | 48:99cfe3a929ea | 116 | case '6' : |
okano | 48:99cfe3a929ea | 117 | case '7' : |
okano | 48:99cfe3a929ea | 118 | case '8' : |
okano | 48:99cfe3a929ea | 119 | case '9' : |
okano | 48:99cfe3a929ea | 120 | index = c - '0'; |
okano | 48:99cfe3a929ea | 121 | index = ( (list.size() - 1) < index ) ? (list.size() - 1) : index; |
okano | 48:99cfe3a929ea | 122 | break; |
okano | 48:99cfe3a929ea | 123 | case '?' : |
okano | 48:99cfe3a929ea | 124 | show_file_list( list ); |
okano | 48:99cfe3a929ea | 125 | break; |
okano | 48:99cfe3a929ea | 126 | |
okano | 48:99cfe3a929ea | 127 | |
okano | 48:99cfe3a929ea | 128 | case 0x1B : |
okano | 48:99cfe3a929ea | 129 | if ( 0x5B == pc.getc() ) |
okano | 48:99cfe3a929ea | 130 | // arrow key pressed |
okano | 48:99cfe3a929ea | 131 | switch ( c = pc.getc() ) { |
okano | 48:99cfe3a929ea | 132 | case 0x41 : |
okano | 48:99cfe3a929ea | 133 | case 0x43 : |
okano | 48:99cfe3a929ea | 134 | index += ( index == (list.size() - 1) ) ? 0 : 1; |
okano | 48:99cfe3a929ea | 135 | break; |
okano | 48:99cfe3a929ea | 136 | case 0x42 : |
okano | 48:99cfe3a929ea | 137 | case 0x44 : |
okano | 48:99cfe3a929ea | 138 | index -= ( index == 0 ) ? 0 : 1; |
okano | 48:99cfe3a929ea | 139 | break; |
okano | 48:99cfe3a929ea | 140 | default : |
okano | 48:99cfe3a929ea | 141 | break; |
okano | 48:99cfe3a929ea | 142 | } |
okano | 48:99cfe3a929ea | 143 | } |
okano | 48:99cfe3a929ea | 144 | |
okano | 48:99cfe3a929ea | 145 | printf( FORMAT_FOR_SELECTED_FILE_NAME, index, list[ index ].c_str() ); |
okano | 48:99cfe3a929ea | 146 | fflush( stdout ); |
okano | 48:99cfe3a929ea | 147 | } |
okano | 48:99cfe3a929ea | 148 | } |
okano | 48:99cfe3a929ea | 149 | |
okano | 48:99cfe3a929ea | 150 | default_path.clear(); |
okano | 48:99cfe3a929ea | 151 | default_path = path_name + "/" + list[ index ]; |
okano | 48:99cfe3a929ea | 152 | |
okano | 48:99cfe3a929ea | 153 | printf( "\r\n flash writing source file : \"%s\"\r\n\r\n", default_path.c_str() ); |
okano | 48:99cfe3a929ea | 154 | |
okano | 48:99cfe3a929ea | 155 | return ( default_path ); |
okano | 48:99cfe3a929ea | 156 | } |
okano | 48:99cfe3a929ea | 157 | |
okano | 48:99cfe3a929ea | 158 | void show_file_list( std::vector<std::string> list ) |
okano | 48:99cfe3a929ea | 159 | { |
okano | 48:99cfe3a929ea | 160 | int width; |
okano | 48:99cfe3a929ea | 161 | int height; |
okano | 48:99cfe3a929ea | 162 | int d_i; |
okano | 48:99cfe3a929ea | 163 | |
okano | 48:99cfe3a929ea | 164 | width = (list.size() / 5) + 1; |
okano | 48:99cfe3a929ea | 165 | width = (4 < width) ? 4 : width; |
okano | 48:99cfe3a929ea | 166 | height = (list.size() + (width - 1)) / width; |
okano | 48:99cfe3a929ea | 167 | |
okano | 48:99cfe3a929ea | 168 | for ( int i = 0; i < height; i++ ) { |
okano | 48:99cfe3a929ea | 169 | for ( int j = 0; j < width; j++ ) { |
okano | 48:99cfe3a929ea | 170 | |
okano | 48:99cfe3a929ea | 171 | d_i = i + j * height; |
okano | 48:99cfe3a929ea | 172 | |
okano | 48:99cfe3a929ea | 173 | if ( list.size() <= d_i ) |
okano | 48:99cfe3a929ea | 174 | break; |
okano | 48:99cfe3a929ea | 175 | |
okano | 48:99cfe3a929ea | 176 | printf( " %3d : %-12s", d_i, list[ d_i ].c_str() ); |
okano | 48:99cfe3a929ea | 177 | } |
okano | 48:99cfe3a929ea | 178 | printf( "\r\n" ); |
okano | 48:99cfe3a929ea | 179 | } |
okano | 48:99cfe3a929ea | 180 | printf( "\r\n" ); |
okano | 48:99cfe3a929ea | 181 | printf( " ** Use arrow key (up/down or left/right) to select a file\r\n" ); |
okano | 48:99cfe3a929ea | 182 | printf( " ** or ..\r\n" ); |
okano | 48:99cfe3a929ea | 183 | printf( " ** press [a] key for abort and go to serial through mode\r\n" ); |
okano | 48:99cfe3a929ea | 184 | printf( " ** press [e] key for erasing flash\r\n" ); |
okano | 48:99cfe3a929ea | 185 | printf( " ** press [?] key to display this message again\r\n\r\n" ); |
okano | 48:99cfe3a929ea | 186 | } |
okano | 48:99cfe3a929ea | 187 | |
okano | 48:99cfe3a929ea | 188 | |
okano | 48:99cfe3a929ea | 189 | void user_action_waiting_indicator() |
okano | 48:99cfe3a929ea | 190 | { |
okano | 48:99cfe3a929ea | 191 | static int i = 0; |
okano | 48:99cfe3a929ea | 192 | |
okano | 48:99cfe3a929ea | 193 | if ( (i == 0) || (i == 3) ) |
okano | 48:99cfe3a929ea | 194 | leds = 0xF; |
okano | 48:99cfe3a929ea | 195 | else |
okano | 48:99cfe3a929ea | 196 | leds = 0x0; |
okano | 48:99cfe3a929ea | 197 | |
okano | 48:99cfe3a929ea | 198 | i++; |
okano | 48:99cfe3a929ea | 199 | i &= 0xF; |
okano | 48:99cfe3a929ea | 200 | } |
okano | 48:99cfe3a929ea | 201 | |
okano | 48:99cfe3a929ea | 202 | |
okano | 48:99cfe3a929ea | 203 |