Add to 11U68 11E68

Dependencies:   DirectoryList MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Committer:
Hapi_Tech
Date:
Sat Jul 04 05:29:32 2015 +0000
Revision:
50:57ad8e04f063
Parent:
49:380e7be429ef
Adding LPC11U68,11E68.

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 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