LoRa Access Point 1.5.2018

Dependencies:   mbed ds3231 SX1276Lib_LoRa_Access_Point

Committer:
lukas_formanek
Date:
Wed Feb 13 18:03:44 2019 +0000
Revision:
8:5d99fbf255d6
13.2.2019 - working SD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lukas_formanek 8:5d99fbf255d6 1 /*
lukas_formanek 8:5d99fbf255d6 2 * mbed Application program for the mbed
lukas_formanek 8:5d99fbf255d6 3 * FatFs Check program / monitor part
lukas_formanek 8:5d99fbf255d6 4 *
lukas_formanek 8:5d99fbf255d6 5 * Copyright (c) 2015,'18 Kenji Arai / JH1PJL
lukas_formanek 8:5d99fbf255d6 6 * http://www.page.sannet.ne.jp/kenjia/index.html
lukas_formanek 8:5d99fbf255d6 7 * https://os.mbed.com/users/kenjiArai/
lukas_formanek 8:5d99fbf255d6 8 * Created: May 5th, 2015
lukas_formanek 8:5d99fbf255d6 9 * Revised: June 14th, 2015
lukas_formanek 8:5d99fbf255d6 10 * Revised: April 7th, 2018
lukas_formanek 8:5d99fbf255d6 11 */
lukas_formanek 8:5d99fbf255d6 12
lukas_formanek 8:5d99fbf255d6 13 /*
lukas_formanek 8:5d99fbf255d6 14 *---------------- REFERENCE ---------------------------------------------------
lukas_formanek 8:5d99fbf255d6 15 * Original Source Information
lukas_formanek 8:5d99fbf255d6 16 * FatFs sample program
lukas_formanek 8:5d99fbf255d6 17 * ChaN FatFs http://elm-chan.org/
lukas_formanek 8:5d99fbf255d6 18 * http://elm-chan.org/fsw/ff/00index_e.html
lukas_formanek 8:5d99fbf255d6 19 */
lukas_formanek 8:5d99fbf255d6 20 /*----------------------------------------------------------------------*/
lukas_formanek 8:5d99fbf255d6 21 /* FAT file system sample project for FatFs (C)ChaN, 2016 */
lukas_formanek 8:5d99fbf255d6 22 /*----------------------------------------------------------------------*/
lukas_formanek 8:5d99fbf255d6 23
lukas_formanek 8:5d99fbf255d6 24 // Include --------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 25 #include "mbed.h"
lukas_formanek 8:5d99fbf255d6 26 #if (MBED_MAJOR_VERSION == 2)
lukas_formanek 8:5d99fbf255d6 27 #include "SDFileSystem.h"
lukas_formanek 8:5d99fbf255d6 28 #elif (MBED_MAJOR_VERSION == 5)
lukas_formanek 8:5d99fbf255d6 29 #include "FATFileSystem.h"
lukas_formanek 8:5d99fbf255d6 30 #endif
lukas_formanek 8:5d99fbf255d6 31 #include "ff.h"
lukas_formanek 8:5d99fbf255d6 32 #include "ffconf.h"
lukas_formanek 8:5d99fbf255d6 33 #include "diskio.h"
lukas_formanek 8:5d99fbf255d6 34 #include "mon.h"
lukas_formanek 8:5d99fbf255d6 35
lukas_formanek 8:5d99fbf255d6 36 // Definition -----------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 37 #define DO_DEBUG 0
lukas_formanek 8:5d99fbf255d6 38
lukas_formanek 8:5d99fbf255d6 39 #if DO_DEBUG
lukas_formanek 8:5d99fbf255d6 40 #define DEBUG_LINE pc.printf("line:%d\r\n", __LINE__);
lukas_formanek 8:5d99fbf255d6 41 #else
lukas_formanek 8:5d99fbf255d6 42 #define DEBUG_LINE {;}
lukas_formanek 8:5d99fbf255d6 43 #endif
lukas_formanek 8:5d99fbf255d6 44
lukas_formanek 8:5d99fbf255d6 45 // Com
lukas_formanek 8:5d99fbf255d6 46 #if 1
lukas_formanek 8:5d99fbf255d6 47 #define BAUD(x) pc.baud(x)
lukas_formanek 8:5d99fbf255d6 48 #define GETC(x) pc.getc(x)
lukas_formanek 8:5d99fbf255d6 49 #define PUTC(x) pc.putc(x)
lukas_formanek 8:5d99fbf255d6 50 #define PUTS(x) pc.puts(x)
lukas_formanek 8:5d99fbf255d6 51 #define PRINTF(...) pc.printf(__VA_ARGS__)
lukas_formanek 8:5d99fbf255d6 52 #define READABLE(x) pc.readable(x)
lukas_formanek 8:5d99fbf255d6 53 #else
lukas_formanek 8:5d99fbf255d6 54 #define BAUD(x) {;}
lukas_formanek 8:5d99fbf255d6 55 #define GETC(x) {;}
lukas_formanek 8:5d99fbf255d6 56 #define PUTC(x) {;}
lukas_formanek 8:5d99fbf255d6 57 #define PRINTF(...) {;}
lukas_formanek 8:5d99fbf255d6 58 #define READABLE(x) {;}
lukas_formanek 8:5d99fbf255d6 59 #endif
lukas_formanek 8:5d99fbf255d6 60
lukas_formanek 8:5d99fbf255d6 61 #define UTC_JST_OFFSET (32400) // +9 hours
lukas_formanek 8:5d99fbf255d6 62
lukas_formanek 8:5d99fbf255d6 63 // from ffconf.h
lukas_formanek 8:5d99fbf255d6 64 #define _VOLUMES 1
lukas_formanek 8:5d99fbf255d6 65 #define FF_USE_LFN 0
lukas_formanek 8:5d99fbf255d6 66
lukas_formanek 8:5d99fbf255d6 67 #if !defined(FF_FS_RPATH)
lukas_formanek 8:5d99fbf255d6 68 #define FF_FS_RPATH 0
lukas_formanek 8:5d99fbf255d6 69 #endif
lukas_formanek 8:5d99fbf255d6 70
lukas_formanek 8:5d99fbf255d6 71 #define DW_CHAR sizeof(char)
lukas_formanek 8:5d99fbf255d6 72 #define DW_SHORT sizeof(short)
lukas_formanek 8:5d99fbf255d6 73 #define DW_LONG sizeof(long)
lukas_formanek 8:5d99fbf255d6 74
lukas_formanek 8:5d99fbf255d6 75 /* These types must be 16-bit, 32-bit or larger integer */
lukas_formanek 8:5d99fbf255d6 76 typedef int INT;
lukas_formanek 8:5d99fbf255d6 77 typedef unsigned int UINT;
lukas_formanek 8:5d99fbf255d6 78
lukas_formanek 8:5d99fbf255d6 79 /* These types must be 8-bit integer */
lukas_formanek 8:5d99fbf255d6 80 typedef char CHAR;
lukas_formanek 8:5d99fbf255d6 81 typedef unsigned char UCHAR;
lukas_formanek 8:5d99fbf255d6 82 typedef unsigned char BYTE;
lukas_formanek 8:5d99fbf255d6 83
lukas_formanek 8:5d99fbf255d6 84 /* These types must be 16-bit integer */
lukas_formanek 8:5d99fbf255d6 85 typedef short SHORT;
lukas_formanek 8:5d99fbf255d6 86 typedef unsigned short USHORT;
lukas_formanek 8:5d99fbf255d6 87 typedef unsigned short WORD;
lukas_formanek 8:5d99fbf255d6 88 typedef unsigned short WCHAR;
lukas_formanek 8:5d99fbf255d6 89
lukas_formanek 8:5d99fbf255d6 90 /* These types must be 32-bit integer */
lukas_formanek 8:5d99fbf255d6 91 typedef long LONG;
lukas_formanek 8:5d99fbf255d6 92 typedef unsigned long ULONG;
lukas_formanek 8:5d99fbf255d6 93 typedef unsigned long DWORD;
lukas_formanek 8:5d99fbf255d6 94 /* by Kenji Arai / JH1PJL September 10th, 2012 */
lukas_formanek 8:5d99fbf255d6 95 typedef unsigned long long DDWORD;
lukas_formanek 8:5d99fbf255d6 96
lukas_formanek 8:5d99fbf255d6 97 // RAM ------------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 98 BYTE Buff[4096];
lukas_formanek 8:5d99fbf255d6 99 char Linebuf[128]; // Console input buffer
lukas_formanek 8:5d99fbf255d6 100 FATFS Fatfs[_VOLUMES]; // File system object for each logical drive
lukas_formanek 8:5d99fbf255d6 101 FIL File1, File2; // File objects
lukas_formanek 8:5d99fbf255d6 102 FATFS_DIR* Dirx;
lukas_formanek 8:5d99fbf255d6 103 FILINFO Finfo;
lukas_formanek 8:5d99fbf255d6 104 #if FF_USE_LFN
lukas_formanek 8:5d99fbf255d6 105 //inside of FILINFO
lukas_formanek 8:5d99fbf255d6 106 char Lfname[512];
lukas_formanek 8:5d99fbf255d6 107 #endif
lukas_formanek 8:5d99fbf255d6 108 DWORD AccSize; // Work register for fs command
lukas_formanek 8:5d99fbf255d6 109 WORD AccFiles, AccDirs;
lukas_formanek 8:5d99fbf255d6 110
lukas_formanek 8:5d99fbf255d6 111 // ROM / Constant data --------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 112 char *const monmsg0 = "Start monitor program for FatFs File System\r\n";
lukas_formanek 8:5d99fbf255d6 113 char *const monmsg1 = " <Please press any key to start the monitor>";
lukas_formanek 8:5d99fbf255d6 114
lukas_formanek 8:5d99fbf255d6 115 static const char HelpMsg0[] =
lukas_formanek 8:5d99fbf255d6 116 "dir <full_pass>\r\n"
lukas_formanek 8:5d99fbf255d6 117 "type <file_name>\r\n"
lukas_formanek 8:5d99fbf255d6 118 "vol\r\n"
lukas_formanek 8:5d99fbf255d6 119 "ren <org_file_name> <new_file_name>\r\n"
lukas_formanek 8:5d99fbf255d6 120 "copy <file_name> <file_name>\r\n"
lukas_formanek 8:5d99fbf255d6 121 "mkdir <dir_name>\r\n"
lukas_formanek 8:5d99fbf255d6 122 "cd <dir_name>\r\n"
lukas_formanek 8:5d99fbf255d6 123 "x extend commands mode\r\n"
lukas_formanek 8:5d99fbf255d6 124 "q Return to main\r\n"
lukas_formanek 8:5d99fbf255d6 125 "t Show current time or Adjust time\r\n"
lukas_formanek 8:5d99fbf255d6 126 " e.g. t 18 3 28 14 48 20 -> 2018-03-28 14:48:20\r\n"
lukas_formanek 8:5d99fbf255d6 127 "? Help/You know the command\r\n"
lukas_formanek 8:5d99fbf255d6 128 "\r\n";
lukas_formanek 8:5d99fbf255d6 129
lukas_formanek 8:5d99fbf255d6 130 static const char HelpMsg1[] =
lukas_formanek 8:5d99fbf255d6 131 "[File system controls]\r\n"
lukas_formanek 8:5d99fbf255d6 132 " fi <ld#> [<mount>]- Force initialized the volume\r\n"
lukas_formanek 8:5d99fbf255d6 133 " fs [<path>] - Show volume status\r\n"
lukas_formanek 8:5d99fbf255d6 134 " fl [<path>] - Show a directory\r\n"
lukas_formanek 8:5d99fbf255d6 135 " fo <mode> <file> - Open a file\r\n"
lukas_formanek 8:5d99fbf255d6 136 " <mode> Read=1, Write=2\r\n"
lukas_formanek 8:5d99fbf255d6 137 " fc - Close the file\r\n"
lukas_formanek 8:5d99fbf255d6 138 " fe <ofs> - Move fp in normal seek\r\n"
lukas_formanek 8:5d99fbf255d6 139 " fd <len> - Read and dump the file\r\n"
lukas_formanek 8:5d99fbf255d6 140 " fr <len> - Read the file\r\n"
lukas_formanek 8:5d99fbf255d6 141 " fw <len> <val> - Write to the file\r\n"
lukas_formanek 8:5d99fbf255d6 142 " fn <org.name> <new.name> - Rename an object\r\n"
lukas_formanek 8:5d99fbf255d6 143 " fu <name> - Unlink an object\r\n"
lukas_formanek 8:5d99fbf255d6 144 " fv - Truncate the file at current fp\r\n"
lukas_formanek 8:5d99fbf255d6 145 " fk <name> - Create a directory\r\n"
lukas_formanek 8:5d99fbf255d6 146 " fa <atrr> <mask> <object name> - Change attribute of an object\r\n"
lukas_formanek 8:5d99fbf255d6 147 " ft <year> <month> <day> <hour> <min> <sec> <name>"
lukas_formanek 8:5d99fbf255d6 148 " - Change timestamp of an object\r\n"
lukas_formanek 8:5d99fbf255d6 149 " fx <src.file> <dst.file> - Copy a file\r\n"
lukas_formanek 8:5d99fbf255d6 150 " fg <path> - Change current directory\r\n"
lukas_formanek 8:5d99fbf255d6 151 " fq - Show current directory\r\n"
lukas_formanek 8:5d99fbf255d6 152 " fb <name> - Set volume label\r\n"
lukas_formanek 8:5d99fbf255d6 153 " fm <ld#> <type> <csize> - Create file system\r\n"
lukas_formanek 8:5d99fbf255d6 154 " fz [<len>] - Change/Show R/W length for fr/fw/fx command\r\n"
lukas_formanek 8:5d99fbf255d6 155 "[Disk contorls]\r\n"
lukas_formanek 8:5d99fbf255d6 156 " di <pd#> - Initialize disk\r\n"
lukas_formanek 8:5d99fbf255d6 157 " dd [<pd#> <lba>] - Dump a secrtor\r\n"
lukas_formanek 8:5d99fbf255d6 158 " ds <pd#> - Show disk status\r\n"
lukas_formanek 8:5d99fbf255d6 159 "[Buffer controls]\r\n"
lukas_formanek 8:5d99fbf255d6 160 " bd <ofs> - Dump working buffer\r\n"
lukas_formanek 8:5d99fbf255d6 161 " be <ofs> [<data>] ... - Edit working buffer\r\n"
lukas_formanek 8:5d99fbf255d6 162 " br <pd#> <lba> [<count>] - Read disk into working buffer\r\n"
lukas_formanek 8:5d99fbf255d6 163 " bw <pd#> <lba> [<count>] - Write working buffer into disk\r\n"
lukas_formanek 8:5d99fbf255d6 164 " bf <val> - Fill working buffer\r\n"
lukas_formanek 8:5d99fbf255d6 165 "[Misc commands]\r\n"
lukas_formanek 8:5d99fbf255d6 166 " q Return\r\n"
lukas_formanek 8:5d99fbf255d6 167 " ? Help\r\n"
lukas_formanek 8:5d99fbf255d6 168 "\r\n";
lukas_formanek 8:5d99fbf255d6 169
lukas_formanek 8:5d99fbf255d6 170 // Function prototypes --------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 171 #if (MBED_MAJOR_VERSION == 2)
lukas_formanek 8:5d99fbf255d6 172 extern SDFileSystem fs;
lukas_formanek 8:5d99fbf255d6 173 #elif (MBED_MAJOR_VERSION == 5)
lukas_formanek 8:5d99fbf255d6 174 extern HeapBlockDevice bd;
lukas_formanek 8:5d99fbf255d6 175 extern FATFileSystem fs;
lukas_formanek 8:5d99fbf255d6 176 #endif
lukas_formanek 8:5d99fbf255d6 177
lukas_formanek 8:5d99fbf255d6 178 static void extended_mon( char *ptr );
lukas_formanek 8:5d99fbf255d6 179 static void v_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 180 static void d_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 181 static void c_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 182 static void m_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 183 static void r_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 184 static void t_next( char *ptr );
lukas_formanek 8:5d99fbf255d6 185 static void memory_inf(char *ptr);
lukas_formanek 8:5d99fbf255d6 186 static void disk_inf(char *ptr);
lukas_formanek 8:5d99fbf255d6 187
lukas_formanek 8:5d99fbf255d6 188 static void crlf( void );
lukas_formanek 8:5d99fbf255d6 189 static FRESULT scan_files( char* path );
lukas_formanek 8:5d99fbf255d6 190 static void put_rc( FRESULT rc );
lukas_formanek 8:5d99fbf255d6 191 static void file_inf( char *ptr );
lukas_formanek 8:5d99fbf255d6 192 static void put_dump( void* buff, unsigned long addr, int len, int width );
lukas_formanek 8:5d99fbf255d6 193 static void chk_and_set_time(char *ptr);
lukas_formanek 8:5d99fbf255d6 194 static int xatoi ( char **str, long *res );
lukas_formanek 8:5d99fbf255d6 195
lukas_formanek 8:5d99fbf255d6 196 void get_line (char *buff, int len);
lukas_formanek 8:5d99fbf255d6 197
lukas_formanek 8:5d99fbf255d6 198 // Object ---------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 199 extern Serial pc;
lukas_formanek 8:5d99fbf255d6 200 Timer t;
lukas_formanek 8:5d99fbf255d6 201
lukas_formanek 8:5d99fbf255d6 202 //------------------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 203 // Control Program
lukas_formanek 8:5d99fbf255d6 204 //------------------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 205 // Monitor program for File control
lukas_formanek 8:5d99fbf255d6 206 void mon ()
lukas_formanek 8:5d99fbf255d6 207 {
lukas_formanek 8:5d99fbf255d6 208 char *ptr;
lukas_formanek 8:5d99fbf255d6 209
lukas_formanek 8:5d99fbf255d6 210 Dirx = new FATFS_DIR;
lukas_formanek 8:5d99fbf255d6 211 /* Open Uart to communicate with Host PC */
lukas_formanek 8:5d99fbf255d6 212 PUTS(monmsg0);
lukas_formanek 8:5d99fbf255d6 213 PUTS(monmsg1);
lukas_formanek 8:5d99fbf255d6 214 crlf();
lukas_formanek 8:5d99fbf255d6 215 #if FF_USE_LFN
lukas_formanek 8:5d99fbf255d6 216 // no needs because FILINFO structure is changed
lukas_formanek 8:5d99fbf255d6 217 Finfo.lfname = Lfname;
lukas_formanek 8:5d99fbf255d6 218 Finfo.lfsize = sizeof Lfname;
lukas_formanek 8:5d99fbf255d6 219 #endif
lukas_formanek 8:5d99fbf255d6 220 for (;;) {
lukas_formanek 8:5d99fbf255d6 221 DEBUG_LINE
lukas_formanek 8:5d99fbf255d6 222 PUTC('>');
lukas_formanek 8:5d99fbf255d6 223 ptr = Linebuf;
lukas_formanek 8:5d99fbf255d6 224 get_line( ptr, sizeof(Linebuf) );
lukas_formanek 8:5d99fbf255d6 225 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 226 // vol
lukas_formanek 8:5d99fbf255d6 227 case 'v' :
lukas_formanek 8:5d99fbf255d6 228 v_next(ptr);
lukas_formanek 8:5d99fbf255d6 229 break;
lukas_formanek 8:5d99fbf255d6 230 // dir
lukas_formanek 8:5d99fbf255d6 231 case 'd' :
lukas_formanek 8:5d99fbf255d6 232 d_next(ptr);
lukas_formanek 8:5d99fbf255d6 233 break;
lukas_formanek 8:5d99fbf255d6 234 // cd, copy
lukas_formanek 8:5d99fbf255d6 235 case 'c' :
lukas_formanek 8:5d99fbf255d6 236 c_next(ptr);
lukas_formanek 8:5d99fbf255d6 237 break;
lukas_formanek 8:5d99fbf255d6 238 // mkdir
lukas_formanek 8:5d99fbf255d6 239 case 'm' :
lukas_formanek 8:5d99fbf255d6 240 m_next(ptr);
lukas_formanek 8:5d99fbf255d6 241 break;
lukas_formanek 8:5d99fbf255d6 242 // ren
lukas_formanek 8:5d99fbf255d6 243 case 'r' :
lukas_formanek 8:5d99fbf255d6 244 r_next(ptr);
lukas_formanek 8:5d99fbf255d6 245 break;
lukas_formanek 8:5d99fbf255d6 246 case 't' :
lukas_formanek 8:5d99fbf255d6 247 t_next(ptr);
lukas_formanek 8:5d99fbf255d6 248 break;
lukas_formanek 8:5d99fbf255d6 249 case 'x' :
lukas_formanek 8:5d99fbf255d6 250 extended_mon(ptr);
lukas_formanek 8:5d99fbf255d6 251 break;
lukas_formanek 8:5d99fbf255d6 252 // Help
lukas_formanek 8:5d99fbf255d6 253 case '?' :
lukas_formanek 8:5d99fbf255d6 254 PUTS(HelpMsg0);
lukas_formanek 8:5d99fbf255d6 255 break;
lukas_formanek 8:5d99fbf255d6 256 // Exit monitor (return to main())
lukas_formanek 8:5d99fbf255d6 257 case 'q' :
lukas_formanek 8:5d99fbf255d6 258 PUTS("Return to main\r\n");
lukas_formanek 8:5d99fbf255d6 259 return;
lukas_formanek 8:5d99fbf255d6 260 // Not a command
lukas_formanek 8:5d99fbf255d6 261 default:
lukas_formanek 8:5d99fbf255d6 262 PUTS("? [HELP]=?");
lukas_formanek 8:5d99fbf255d6 263 crlf();
lukas_formanek 8:5d99fbf255d6 264 break;
lukas_formanek 8:5d99fbf255d6 265 }
lukas_formanek 8:5d99fbf255d6 266 }
lukas_formanek 8:5d99fbf255d6 267 }
lukas_formanek 8:5d99fbf255d6 268
lukas_formanek 8:5d99fbf255d6 269 uint32_t get_disk_freespace(void)
lukas_formanek 8:5d99fbf255d6 270 {
lukas_formanek 8:5d99fbf255d6 271 long p1;
lukas_formanek 8:5d99fbf255d6 272 UINT s1, s2;
lukas_formanek 8:5d99fbf255d6 273 FATFS *fs;
lukas_formanek 8:5d99fbf255d6 274 BYTE res;
lukas_formanek 8:5d99fbf255d6 275
lukas_formanek 8:5d99fbf255d6 276 if (Dirx == NULL){
lukas_formanek 8:5d99fbf255d6 277 Dirx = new FATFS_DIR;
lukas_formanek 8:5d99fbf255d6 278 }
lukas_formanek 8:5d99fbf255d6 279 char p = NULL;
lukas_formanek 8:5d99fbf255d6 280 res = f_opendir(Dirx, &p);
lukas_formanek 8:5d99fbf255d6 281 if (res) {
lukas_formanek 8:5d99fbf255d6 282 return 0;
lukas_formanek 8:5d99fbf255d6 283 }
lukas_formanek 8:5d99fbf255d6 284 p1 = s1 = s2 = 0;
lukas_formanek 8:5d99fbf255d6 285 for(;;) {
lukas_formanek 8:5d99fbf255d6 286 res = f_readdir(Dirx, &Finfo);
lukas_formanek 8:5d99fbf255d6 287 if ((res != FR_OK) || !Finfo.fname[0]) break;
lukas_formanek 8:5d99fbf255d6 288 if (Finfo.fattrib & AM_DIR) {
lukas_formanek 8:5d99fbf255d6 289 s2++;
lukas_formanek 8:5d99fbf255d6 290 } else {
lukas_formanek 8:5d99fbf255d6 291 s1++;
lukas_formanek 8:5d99fbf255d6 292 p1 += Finfo.fsize;
lukas_formanek 8:5d99fbf255d6 293 }
lukas_formanek 8:5d99fbf255d6 294 }
lukas_formanek 8:5d99fbf255d6 295 res = f_getfree(&p, (DWORD*)&p1, &fs);
lukas_formanek 8:5d99fbf255d6 296 uint32_t size = p1 * fs->csize * 512;
lukas_formanek 8:5d99fbf255d6 297 if (res == FR_OK) {
lukas_formanek 8:5d99fbf255d6 298 return size;
lukas_formanek 8:5d99fbf255d6 299 } else {
lukas_formanek 8:5d99fbf255d6 300 return 0;
lukas_formanek 8:5d99fbf255d6 301 }
lukas_formanek 8:5d99fbf255d6 302 }
lukas_formanek 8:5d99fbf255d6 303
lukas_formanek 8:5d99fbf255d6 304 static void extended_mon( char *ptr )
lukas_formanek 8:5d99fbf255d6 305 {
lukas_formanek 8:5d99fbf255d6 306 PUTS(HelpMsg1);
lukas_formanek 8:5d99fbf255d6 307 while(true) {
lukas_formanek 8:5d99fbf255d6 308 PUTS("e>");
lukas_formanek 8:5d99fbf255d6 309 ptr = Linebuf;
lukas_formanek 8:5d99fbf255d6 310 get_line( ptr, sizeof(Linebuf) );
lukas_formanek 8:5d99fbf255d6 311 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 312 case 'f' :
lukas_formanek 8:5d99fbf255d6 313 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 314 file_inf(ptr);
lukas_formanek 8:5d99fbf255d6 315 break;
lukas_formanek 8:5d99fbf255d6 316 case 'd' :
lukas_formanek 8:5d99fbf255d6 317 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 318 disk_inf(ptr);
lukas_formanek 8:5d99fbf255d6 319 break;
lukas_formanek 8:5d99fbf255d6 320 case 'm' :
lukas_formanek 8:5d99fbf255d6 321 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 322 memory_inf(ptr);
lukas_formanek 8:5d99fbf255d6 323 break;
lukas_formanek 8:5d99fbf255d6 324 case '?' :
lukas_formanek 8:5d99fbf255d6 325 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 326 PUTS(HelpMsg1);
lukas_formanek 8:5d99fbf255d6 327 break;
lukas_formanek 8:5d99fbf255d6 328 case 'q' :
lukas_formanek 8:5d99fbf255d6 329 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 330 return;
lukas_formanek 8:5d99fbf255d6 331 default:
lukas_formanek 8:5d99fbf255d6 332 PUTS( "?\r\n" );
lukas_formanek 8:5d99fbf255d6 333 }
lukas_formanek 8:5d99fbf255d6 334 }
lukas_formanek 8:5d99fbf255d6 335 }
lukas_formanek 8:5d99fbf255d6 336
lukas_formanek 8:5d99fbf255d6 337 //------------------------------------------------------------------------------
lukas_formanek 8:5d99fbf255d6 338 // General monitor functions
lukas_formanek 8:5d99fbf255d6 339 static void v_next( char *ptr )
lukas_formanek 8:5d99fbf255d6 340 {
lukas_formanek 8:5d99fbf255d6 341 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 342 case 'o' :
lukas_formanek 8:5d99fbf255d6 343 if (*ptr == 'l') {
lukas_formanek 8:5d99fbf255d6 344 *ptr = 's';
lukas_formanek 8:5d99fbf255d6 345 file_inf(ptr); // fs [<path>] - Show volume status
lukas_formanek 8:5d99fbf255d6 346 }
lukas_formanek 8:5d99fbf255d6 347 break;
lukas_formanek 8:5d99fbf255d6 348 default:
lukas_formanek 8:5d99fbf255d6 349 PUTS( "?\r\n" );
lukas_formanek 8:5d99fbf255d6 350 }
lukas_formanek 8:5d99fbf255d6 351 }
lukas_formanek 8:5d99fbf255d6 352
lukas_formanek 8:5d99fbf255d6 353 static void d_next(char *ptr)
lukas_formanek 8:5d99fbf255d6 354 {
lukas_formanek 8:5d99fbf255d6 355 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 356 case 'i' :
lukas_formanek 8:5d99fbf255d6 357 if (*ptr == 'r') {
lukas_formanek 8:5d99fbf255d6 358 *ptr = 'l';
lukas_formanek 8:5d99fbf255d6 359 file_inf(ptr); // fl [<path>] - Directory listing
lukas_formanek 8:5d99fbf255d6 360 }
lukas_formanek 8:5d99fbf255d6 361 break;
lukas_formanek 8:5d99fbf255d6 362 default:
lukas_formanek 8:5d99fbf255d6 363 PUTS( "?\r\n" );
lukas_formanek 8:5d99fbf255d6 364 }
lukas_formanek 8:5d99fbf255d6 365 }
lukas_formanek 8:5d99fbf255d6 366
lukas_formanek 8:5d99fbf255d6 367 static void c_next(char *ptr)
lukas_formanek 8:5d99fbf255d6 368 {
lukas_formanek 8:5d99fbf255d6 369 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 370 case 'o' :
lukas_formanek 8:5d99fbf255d6 371 if ((*ptr == 'p') && (*(ptr + 1) == 'y')) {
lukas_formanek 8:5d99fbf255d6 372 ptr++;
lukas_formanek 8:5d99fbf255d6 373 *ptr = 'x';
lukas_formanek 8:5d99fbf255d6 374 file_inf(ptr); // fx <src_name> <dst_name> - Copy file
lukas_formanek 8:5d99fbf255d6 375 }
lukas_formanek 8:5d99fbf255d6 376 break;
lukas_formanek 8:5d99fbf255d6 377 case 'd' :
lukas_formanek 8:5d99fbf255d6 378 *ptr = 'g';
lukas_formanek 8:5d99fbf255d6 379 file_inf(ptr); // fx <src_name> <dst_name> - Copy file
lukas_formanek 8:5d99fbf255d6 380 break;
lukas_formanek 8:5d99fbf255d6 381 default:
lukas_formanek 8:5d99fbf255d6 382 PUTS( "?\r\n" );
lukas_formanek 8:5d99fbf255d6 383 }
lukas_formanek 8:5d99fbf255d6 384 }
lukas_formanek 8:5d99fbf255d6 385
lukas_formanek 8:5d99fbf255d6 386 static void m_next(char *ptr)
lukas_formanek 8:5d99fbf255d6 387 {
lukas_formanek 8:5d99fbf255d6 388 switch ( *ptr++ ) {
lukas_formanek 8:5d99fbf255d6 389 case 'k' :
lukas_formanek 8:5d99fbf255d6 390 if ((*ptr == 'd') && (*(ptr + 1) == 'i') && (*(ptr + 2) == 'r')) {
lukas_formanek 8:5d99fbf255d6 391 ptr += 2;
lukas_formanek 8:5d99fbf255d6 392 *ptr = 'k';
lukas_formanek 8:5d99fbf255d6 393 file_inf(ptr); // fk <name> - Create a directory
lukas_formanek 8:5d99fbf255d6 394 }
lukas_formanek 8:5d99fbf255d6 395 break;
lukas_formanek 8:5d99fbf255d6 396 default:
lukas_formanek 8:5d99fbf255d6 397 PUTS("?\r\n");
lukas_formanek 8:5d99fbf255d6 398 }
lukas_formanek 8:5d99fbf255d6 399 }
lukas_formanek 8:5d99fbf255d6 400
lukas_formanek 8:5d99fbf255d6 401 static void r_next(char *ptr)
lukas_formanek 8:5d99fbf255d6 402 {
lukas_formanek 8:5d99fbf255d6 403 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 404 case 'e' :
lukas_formanek 8:5d99fbf255d6 405 if (*ptr == 'n') {
lukas_formanek 8:5d99fbf255d6 406 // fn <old_name> <new_name> - Change file/dir name
lukas_formanek 8:5d99fbf255d6 407 file_inf(ptr);
lukas_formanek 8:5d99fbf255d6 408 }
lukas_formanek 8:5d99fbf255d6 409 break;
lukas_formanek 8:5d99fbf255d6 410 default:
lukas_formanek 8:5d99fbf255d6 411 PUTS("?\r\n");
lukas_formanek 8:5d99fbf255d6 412 }
lukas_formanek 8:5d99fbf255d6 413 }
lukas_formanek 8:5d99fbf255d6 414
lukas_formanek 8:5d99fbf255d6 415 static void t_next(char *ptr)
lukas_formanek 8:5d99fbf255d6 416 {
lukas_formanek 8:5d99fbf255d6 417 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 418 case ' ' :
lukas_formanek 8:5d99fbf255d6 419 case 0x0d:
lukas_formanek 8:5d99fbf255d6 420 chk_and_set_time(ptr);
lukas_formanek 8:5d99fbf255d6 421 case 'y' :
lukas_formanek 8:5d99fbf255d6 422 if ((*ptr == 'p') && (*(ptr + 1) == 'e')) {
lukas_formanek 8:5d99fbf255d6 423 ptr++;
lukas_formanek 8:5d99fbf255d6 424 *ptr = '&';
lukas_formanek 8:5d99fbf255d6 425 file_inf(ptr);
lukas_formanek 8:5d99fbf255d6 426 }
lukas_formanek 8:5d99fbf255d6 427 break;
lukas_formanek 8:5d99fbf255d6 428 default:
lukas_formanek 8:5d99fbf255d6 429 PUTS("?\r\n");
lukas_formanek 8:5d99fbf255d6 430 }
lukas_formanek 8:5d99fbf255d6 431 }
lukas_formanek 8:5d99fbf255d6 432
lukas_formanek 8:5d99fbf255d6 433 static FRESULT scan_files (
lukas_formanek 8:5d99fbf255d6 434 char* path /* Pointer to the path name working buffer */
lukas_formanek 8:5d99fbf255d6 435 )
lukas_formanek 8:5d99fbf255d6 436 {
lukas_formanek 8:5d99fbf255d6 437 FATFS_DIR dirs;
lukas_formanek 8:5d99fbf255d6 438 FRESULT res;
lukas_formanek 8:5d99fbf255d6 439 BYTE i;
lukas_formanek 8:5d99fbf255d6 440 char *fn;
lukas_formanek 8:5d99fbf255d6 441
lukas_formanek 8:5d99fbf255d6 442 if ((res = f_opendir(&dirs, path)) == FR_OK) {
lukas_formanek 8:5d99fbf255d6 443 i = strlen(path);
lukas_formanek 8:5d99fbf255d6 444 PRINTF("path: %s, n=%u\r\n", path, i);
lukas_formanek 8:5d99fbf255d6 445 while (((res = f_readdir(&dirs, &Finfo)) == FR_OK) && Finfo.fname[0]) {
lukas_formanek 8:5d99fbf255d6 446 if (FF_FS_RPATH && Finfo.fname[0] == '.') {
lukas_formanek 8:5d99fbf255d6 447 continue;
lukas_formanek 8:5d99fbf255d6 448 }
lukas_formanek 8:5d99fbf255d6 449 #if FF_USE_LFN
lukas_formanek 8:5d99fbf255d6 450 //fn = *Finfo.lfname ? Finfo.lfname : Finfo.fname;
lukas_formanek 8:5d99fbf255d6 451 if (Finfo.altname[0] == 0) {
lukas_formanek 8:5d99fbf255d6 452 fn = Finfo.fname;
lukas_formanek 8:5d99fbf255d6 453 } else {
lukas_formanek 8:5d99fbf255d6 454 fn = Finfo.altname;
lukas_formanek 8:5d99fbf255d6 455 }
lukas_formanek 8:5d99fbf255d6 456 #else
lukas_formanek 8:5d99fbf255d6 457 fn = Finfo.fname;
lukas_formanek 8:5d99fbf255d6 458 #endif
lukas_formanek 8:5d99fbf255d6 459 if (Finfo.fattrib & AM_DIR) {
lukas_formanek 8:5d99fbf255d6 460 AccDirs++;
lukas_formanek 8:5d99fbf255d6 461 *(path+i) = '/';
lukas_formanek 8:5d99fbf255d6 462 strcpy(path+i+1, fn);
lukas_formanek 8:5d99fbf255d6 463 res = scan_files(path);
lukas_formanek 8:5d99fbf255d6 464 *(path+i) = '\0';
lukas_formanek 8:5d99fbf255d6 465 if (res != FR_OK) break;
lukas_formanek 8:5d99fbf255d6 466 } else {
lukas_formanek 8:5d99fbf255d6 467 PRINTF("%s/%s\r\n", path, fn);
lukas_formanek 8:5d99fbf255d6 468 AccFiles++;
lukas_formanek 8:5d99fbf255d6 469 AccSize += Finfo.fsize;
lukas_formanek 8:5d99fbf255d6 470 }
lukas_formanek 8:5d99fbf255d6 471 }
lukas_formanek 8:5d99fbf255d6 472 }
lukas_formanek 8:5d99fbf255d6 473 return res;
lukas_formanek 8:5d99fbf255d6 474 }
lukas_formanek 8:5d99fbf255d6 475
lukas_formanek 8:5d99fbf255d6 476 static void put_rc (FRESULT rc)
lukas_formanek 8:5d99fbf255d6 477 {
lukas_formanek 8:5d99fbf255d6 478 const char *str =
lukas_formanek 8:5d99fbf255d6 479 "OK\0" "DISK_ERR\0" "INT_ERR\0" "NOT_READY\0" "NO_FILE\0" "NO_PATH\0"
lukas_formanek 8:5d99fbf255d6 480 "INVALID_NAME\0" "DENIED\0" "EXIST\0" "INVALID_OBJECT\0"
lukas_formanek 8:5d99fbf255d6 481 "WRITE_PROTECTED\0" "INVALID_DRIVE\0" "NOT_ENABLED\0"
lukas_formanek 8:5d99fbf255d6 482 "NO_FILE_SYSTEM\0" "MKFS_ABORTED\0" "TIMEOUT\0"
lukas_formanek 8:5d99fbf255d6 483 "LOCKED\0" "NOT_ENOUGH_CORE\0" "TOO_MANY_OPEN_FILES\0";
lukas_formanek 8:5d99fbf255d6 484 int i;
lukas_formanek 8:5d99fbf255d6 485
lukas_formanek 8:5d99fbf255d6 486 for ( i = 0; i != rc && *str; i++ ) {
lukas_formanek 8:5d99fbf255d6 487 while ( *str++ ) {
lukas_formanek 8:5d99fbf255d6 488 ;
lukas_formanek 8:5d99fbf255d6 489 }
lukas_formanek 8:5d99fbf255d6 490 }
lukas_formanek 8:5d99fbf255d6 491 PRINTF( "rc=%u FR_%s\r\n", (UINT)rc, str );
lukas_formanek 8:5d99fbf255d6 492 }
lukas_formanek 8:5d99fbf255d6 493
lukas_formanek 8:5d99fbf255d6 494 static void file_inf(char *ptr)
lukas_formanek 8:5d99fbf255d6 495 {
lukas_formanek 8:5d99fbf255d6 496 long p1, p2, p3;
lukas_formanek 8:5d99fbf255d6 497 CHAR *ptr2;
lukas_formanek 8:5d99fbf255d6 498 BYTE f_res;
lukas_formanek 8:5d99fbf255d6 499 UINT s1, s2, cnt, blen = sizeof Buff;
lukas_formanek 8:5d99fbf255d6 500 FATFS *fs;
lukas_formanek 8:5d99fbf255d6 501 static const BYTE ft[] = {0, 12, 16, 32};
lukas_formanek 8:5d99fbf255d6 502 BYTE res;
lukas_formanek 8:5d99fbf255d6 503 DWORD ofs = 0;
lukas_formanek 8:5d99fbf255d6 504 uint32_t tim;
lukas_formanek 8:5d99fbf255d6 505
lukas_formanek 8:5d99fbf255d6 506 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 507 case '&' :
lukas_formanek 8:5d99fbf255d6 508 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 509 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 510 /* Open a file */
lukas_formanek 8:5d99fbf255d6 511 f_res = f_open(&File1, ptr, FA_READ);
lukas_formanek 8:5d99fbf255d6 512 if ( f_res ) {
lukas_formanek 8:5d99fbf255d6 513 put_rc((FRESULT)f_res);
lukas_formanek 8:5d99fbf255d6 514 break;
lukas_formanek 8:5d99fbf255d6 515 }
lukas_formanek 8:5d99fbf255d6 516 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 517 /* Read all lines and display it */
lukas_formanek 8:5d99fbf255d6 518 while(true) {
lukas_formanek 8:5d99fbf255d6 519 f_res = f_read(&File1, (TCHAR*)Buff, blen, &cnt);
lukas_formanek 8:5d99fbf255d6 520 if ( f_res ) {
lukas_formanek 8:5d99fbf255d6 521 put_rc((FRESULT)f_res);
lukas_formanek 8:5d99fbf255d6 522 break;
lukas_formanek 8:5d99fbf255d6 523 }
lukas_formanek 8:5d99fbf255d6 524 for (s1 = 0; s1 < cnt; s1++) {
lukas_formanek 8:5d99fbf255d6 525 PUTC(Buff[s1]);
lukas_formanek 8:5d99fbf255d6 526 }
lukas_formanek 8:5d99fbf255d6 527 if (cnt != blen) {
lukas_formanek 8:5d99fbf255d6 528 break;
lukas_formanek 8:5d99fbf255d6 529 }
lukas_formanek 8:5d99fbf255d6 530 }
lukas_formanek 8:5d99fbf255d6 531 DEBUG_LINE;
lukas_formanek 8:5d99fbf255d6 532 /* Close the file */
lukas_formanek 8:5d99fbf255d6 533 f_close(&File1);
lukas_formanek 8:5d99fbf255d6 534 break;
lukas_formanek 8:5d99fbf255d6 535
lukas_formanek 8:5d99fbf255d6 536 case 'i' : /* fi [<opt>]- Initialize logical drive */
lukas_formanek 8:5d99fbf255d6 537 if ( !xatoi(&ptr, &p1) ) {
lukas_formanek 8:5d99fbf255d6 538 break;
lukas_formanek 8:5d99fbf255d6 539 }
lukas_formanek 8:5d99fbf255d6 540 if (!xatoi(&ptr, &p2)) p2 = 0;
lukas_formanek 8:5d99fbf255d6 541 put_rc(f_mount(&Fatfs[p1], (const TCHAR*)p1, 0));
lukas_formanek 8:5d99fbf255d6 542 break;
lukas_formanek 8:5d99fbf255d6 543
lukas_formanek 8:5d99fbf255d6 544 case 's' : /* fs [<path>] - Show volume status */
lukas_formanek 8:5d99fbf255d6 545 f_res = f_getfree( ptr, (DWORD*)&p2, &fs );
lukas_formanek 8:5d99fbf255d6 546 if ( f_res ) {
lukas_formanek 8:5d99fbf255d6 547 put_rc((FRESULT)f_res);
lukas_formanek 8:5d99fbf255d6 548 break;
lukas_formanek 8:5d99fbf255d6 549 }
lukas_formanek 8:5d99fbf255d6 550 PRINTF
lukas_formanek 8:5d99fbf255d6 551 (
lukas_formanek 8:5d99fbf255d6 552 "\rFAT type = FAT%u\r\nBytes/Cluster"
lukas_formanek 8:5d99fbf255d6 553 " = %lu\r\nNumber of FATs = %u\r\n"
lukas_formanek 8:5d99fbf255d6 554 "Root DIR entries = %u\r\n"
lukas_formanek 8:5d99fbf255d6 555 "Sectors/FAT = %lu\r\n"
lukas_formanek 8:5d99fbf255d6 556 "Number of clusters = %lu\r\n"
lukas_formanek 8:5d99fbf255d6 557 "FAT start (lba) = %lu\r\n"
lukas_formanek 8:5d99fbf255d6 558 "DIR start (lba,clustor) = %lu\r\n"
lukas_formanek 8:5d99fbf255d6 559 "Data start (lba) = %lu\r\n",
lukas_formanek 8:5d99fbf255d6 560 ft[fs->fs_type & 3], (DWORD)fs->csize * 512, fs->n_fats,
lukas_formanek 8:5d99fbf255d6 561 fs->n_rootdir, fs->fsize, (DWORD)fs->n_fatent - 2,
lukas_formanek 8:5d99fbf255d6 562 fs->fatbase, fs->dirbase, fs->database
lukas_formanek 8:5d99fbf255d6 563 );
lukas_formanek 8:5d99fbf255d6 564 AccSize = AccFiles = AccDirs = 0;
lukas_formanek 8:5d99fbf255d6 565 break;
lukas_formanek 8:5d99fbf255d6 566 case 'l' : /* fl [<path>] - Directory listing */
lukas_formanek 8:5d99fbf255d6 567 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 568 res = f_opendir(Dirx, ptr);
lukas_formanek 8:5d99fbf255d6 569 if (res) {
lukas_formanek 8:5d99fbf255d6 570 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 571 break;
lukas_formanek 8:5d99fbf255d6 572 }
lukas_formanek 8:5d99fbf255d6 573 p1 = s1 = s2 = 0;
lukas_formanek 8:5d99fbf255d6 574 for(;;) {
lukas_formanek 8:5d99fbf255d6 575 res = f_readdir(Dirx, &Finfo);
lukas_formanek 8:5d99fbf255d6 576 if ((res != FR_OK) || !Finfo.fname[0]) break;
lukas_formanek 8:5d99fbf255d6 577 if (Finfo.fattrib & AM_DIR) {
lukas_formanek 8:5d99fbf255d6 578 s2++;
lukas_formanek 8:5d99fbf255d6 579 } else {
lukas_formanek 8:5d99fbf255d6 580 s1++;
lukas_formanek 8:5d99fbf255d6 581 p1 += Finfo.fsize;
lukas_formanek 8:5d99fbf255d6 582 }
lukas_formanek 8:5d99fbf255d6 583 PRINTF("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu %s\r\n",
lukas_formanek 8:5d99fbf255d6 584 (Finfo.fattrib & AM_DIR) ? 'D' : '-',
lukas_formanek 8:5d99fbf255d6 585 (Finfo.fattrib & AM_RDO) ? 'R' : '-',
lukas_formanek 8:5d99fbf255d6 586 (Finfo.fattrib & AM_HID) ? 'H' : '-',
lukas_formanek 8:5d99fbf255d6 587 (Finfo.fattrib & AM_SYS) ? 'S' : '-',
lukas_formanek 8:5d99fbf255d6 588 (Finfo.fattrib & AM_ARC) ? 'A' : '-',
lukas_formanek 8:5d99fbf255d6 589 (Finfo.fdate >> 9) + 1980, (Finfo.fdate >> 5) & 15,
lukas_formanek 8:5d99fbf255d6 590 Finfo.fdate & 31,
lukas_formanek 8:5d99fbf255d6 591 (Finfo.ftime >> 11), (Finfo.ftime >> 5) & 63,
lukas_formanek 8:5d99fbf255d6 592 Finfo.fsize, Finfo.fname);
lukas_formanek 8:5d99fbf255d6 593 }
lukas_formanek 8:5d99fbf255d6 594 #if 0 // f_getfree cannnot count under Dir, subdirectory area
lukas_formanek 8:5d99fbf255d6 595 PRINTF("%4u File(s),%10lu bytes total\r\n%4u Dir(s)", s1, p1, s2);
lukas_formanek 8:5d99fbf255d6 596 res = f_getfree(ptr, (DWORD*)&p1, &fs);
lukas_formanek 8:5d99fbf255d6 597 if (res == FR_OK)
lukas_formanek 8:5d99fbf255d6 598 PRINTF(", %10lu bytes free\r\n", p1 * fs->csize * 512);
lukas_formanek 8:5d99fbf255d6 599 else
lukas_formanek 8:5d99fbf255d6 600 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 601 #else
lukas_formanek 8:5d99fbf255d6 602 PRINTF("%4u File(s) = %10lu bytes total, %4u Dir(s)\r\n",
lukas_formanek 8:5d99fbf255d6 603 s1, p1, s2);
lukas_formanek 8:5d99fbf255d6 604 #endif
lukas_formanek 8:5d99fbf255d6 605 break;
lukas_formanek 8:5d99fbf255d6 606
lukas_formanek 8:5d99fbf255d6 607 case 'o' : /* fo <mode> <file> - Open a file */
lukas_formanek 8:5d99fbf255d6 608 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 609 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 610 put_rc(f_open(&File1, ptr, (BYTE)p1));
lukas_formanek 8:5d99fbf255d6 611 #if 0
lukas_formanek 8:5d99fbf255d6 612 put_rc(f_open(&File1, "savedata.txt", 1));
lukas_formanek 8:5d99fbf255d6 613 PRINTF("Open savedata.txt as read mode\r\n");
lukas_formanek 8:5d99fbf255d6 614 #endif
lukas_formanek 8:5d99fbf255d6 615 break;
lukas_formanek 8:5d99fbf255d6 616
lukas_formanek 8:5d99fbf255d6 617 case 'c' : /* fc - Close a file */
lukas_formanek 8:5d99fbf255d6 618 put_rc(f_close(&File1));
lukas_formanek 8:5d99fbf255d6 619 break;
lukas_formanek 8:5d99fbf255d6 620
lukas_formanek 8:5d99fbf255d6 621 case 'e' : /* fe - Seek file pointer */
lukas_formanek 8:5d99fbf255d6 622 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 623 res = f_lseek(&File1, p1);
lukas_formanek 8:5d99fbf255d6 624 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 625 if (res == FR_OK)
lukas_formanek 8:5d99fbf255d6 626 PRINTF("fptr=%lu(0x%lX)\r\n", File1.fptr, File1.fptr);
lukas_formanek 8:5d99fbf255d6 627 break;
lukas_formanek 8:5d99fbf255d6 628
lukas_formanek 8:5d99fbf255d6 629 case 'd' : /* fd <len> - read and dump file from current fp */
lukas_formanek 8:5d99fbf255d6 630 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 631 ofs = File1.fptr;
lukas_formanek 8:5d99fbf255d6 632 while (p1) {
lukas_formanek 8:5d99fbf255d6 633 if ((UINT)p1 >= 16) {
lukas_formanek 8:5d99fbf255d6 634 cnt = 16;
lukas_formanek 8:5d99fbf255d6 635 p1 -= 16;
lukas_formanek 8:5d99fbf255d6 636 } else {
lukas_formanek 8:5d99fbf255d6 637 cnt = p1;
lukas_formanek 8:5d99fbf255d6 638 p1 = 0;
lukas_formanek 8:5d99fbf255d6 639 }
lukas_formanek 8:5d99fbf255d6 640 res = f_read(&File1, Buff, cnt, &cnt);
lukas_formanek 8:5d99fbf255d6 641 if (res != FR_OK) {
lukas_formanek 8:5d99fbf255d6 642 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 643 break;
lukas_formanek 8:5d99fbf255d6 644 }
lukas_formanek 8:5d99fbf255d6 645 if (!cnt) break;
lukas_formanek 8:5d99fbf255d6 646 put_dump(Buff, ofs, cnt, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 647 ofs += 16;
lukas_formanek 8:5d99fbf255d6 648 }
lukas_formanek 8:5d99fbf255d6 649 break;
lukas_formanek 8:5d99fbf255d6 650
lukas_formanek 8:5d99fbf255d6 651 case 'r' : /* fr <len> - read file */
lukas_formanek 8:5d99fbf255d6 652 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 653 p2 = 0;
lukas_formanek 8:5d99fbf255d6 654 t.reset();
lukas_formanek 8:5d99fbf255d6 655 t.start();
lukas_formanek 8:5d99fbf255d6 656 while (p1) {
lukas_formanek 8:5d99fbf255d6 657 if ((UINT)p1 >= blen) {
lukas_formanek 8:5d99fbf255d6 658 cnt = blen;
lukas_formanek 8:5d99fbf255d6 659 p1 -= blen;
lukas_formanek 8:5d99fbf255d6 660 } else {
lukas_formanek 8:5d99fbf255d6 661 cnt = p1;
lukas_formanek 8:5d99fbf255d6 662 p1 = 0;
lukas_formanek 8:5d99fbf255d6 663 }
lukas_formanek 8:5d99fbf255d6 664 res = f_read(&File1, Buff, cnt, &s2);
lukas_formanek 8:5d99fbf255d6 665 if (res != FR_OK) {
lukas_formanek 8:5d99fbf255d6 666 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 667 break;
lukas_formanek 8:5d99fbf255d6 668 }
lukas_formanek 8:5d99fbf255d6 669 p2 += s2;
lukas_formanek 8:5d99fbf255d6 670 if (cnt != s2) break;
lukas_formanek 8:5d99fbf255d6 671 }
lukas_formanek 8:5d99fbf255d6 672 tim = t.read_ms();
lukas_formanek 8:5d99fbf255d6 673 PRINTF("%lu bytes read with %lu kB/sec.\r\n",
lukas_formanek 8:5d99fbf255d6 674 p2, tim ? (p2 / tim) : 0);
lukas_formanek 8:5d99fbf255d6 675 break;
lukas_formanek 8:5d99fbf255d6 676
lukas_formanek 8:5d99fbf255d6 677 case 'w' : /* fw <len> <val> - write file */
lukas_formanek 8:5d99fbf255d6 678 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2)) break;
lukas_formanek 8:5d99fbf255d6 679 memset(Buff, (BYTE)p2, blen);
lukas_formanek 8:5d99fbf255d6 680 p2 = 0;
lukas_formanek 8:5d99fbf255d6 681 t.reset();
lukas_formanek 8:5d99fbf255d6 682 t.start();
lukas_formanek 8:5d99fbf255d6 683 while (p1) {
lukas_formanek 8:5d99fbf255d6 684 if ((UINT)p1 >= blen) {
lukas_formanek 8:5d99fbf255d6 685 cnt = blen;
lukas_formanek 8:5d99fbf255d6 686 p1 -= blen;
lukas_formanek 8:5d99fbf255d6 687 } else {
lukas_formanek 8:5d99fbf255d6 688 cnt = p1;
lukas_formanek 8:5d99fbf255d6 689 p1 = 0;
lukas_formanek 8:5d99fbf255d6 690 }
lukas_formanek 8:5d99fbf255d6 691 res = f_write(&File1, Buff, cnt, &s2);
lukas_formanek 8:5d99fbf255d6 692 if (res != FR_OK) {
lukas_formanek 8:5d99fbf255d6 693 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 694 break;
lukas_formanek 8:5d99fbf255d6 695 }
lukas_formanek 8:5d99fbf255d6 696 p2 += s2;
lukas_formanek 8:5d99fbf255d6 697 if (cnt != s2) break;
lukas_formanek 8:5d99fbf255d6 698 }
lukas_formanek 8:5d99fbf255d6 699 tim = t.read_ms();
lukas_formanek 8:5d99fbf255d6 700 PRINTF("%lu bytes written with %lu kB/sec.\r\n",
lukas_formanek 8:5d99fbf255d6 701 p2, tim ? (p2 / tim) : 0);
lukas_formanek 8:5d99fbf255d6 702 break;
lukas_formanek 8:5d99fbf255d6 703
lukas_formanek 8:5d99fbf255d6 704 case 'n' : /* fn <org.name> <new.name> - Change name of an object */
lukas_formanek 8:5d99fbf255d6 705 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 706 ptr2 = strchr(ptr, ' ');
lukas_formanek 8:5d99fbf255d6 707 if (!ptr2) break;
lukas_formanek 8:5d99fbf255d6 708 *ptr2++ = 0;
lukas_formanek 8:5d99fbf255d6 709 while (*ptr2 == ' ') ptr2++;
lukas_formanek 8:5d99fbf255d6 710 put_rc(f_rename(ptr, ptr2));
lukas_formanek 8:5d99fbf255d6 711 break;
lukas_formanek 8:5d99fbf255d6 712
lukas_formanek 8:5d99fbf255d6 713 case 'u' : /* fu <name> - Unlink an object */
lukas_formanek 8:5d99fbf255d6 714 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 715 put_rc(f_unlink(ptr));
lukas_formanek 8:5d99fbf255d6 716 break;
lukas_formanek 8:5d99fbf255d6 717
lukas_formanek 8:5d99fbf255d6 718 case 'v' : /* fv - Truncate file */
lukas_formanek 8:5d99fbf255d6 719 put_rc(f_truncate(&File1));
lukas_formanek 8:5d99fbf255d6 720 break;
lukas_formanek 8:5d99fbf255d6 721
lukas_formanek 8:5d99fbf255d6 722 case 'k' : /* fk <name> - Create a directory */
lukas_formanek 8:5d99fbf255d6 723 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 724 put_rc(f_mkdir(ptr));
lukas_formanek 8:5d99fbf255d6 725 break;
lukas_formanek 8:5d99fbf255d6 726 #if 0
lukas_formanek 8:5d99fbf255d6 727 case 'a' : /* fa <atrr> <mask> <name> - Change attribute of an object */
lukas_formanek 8:5d99fbf255d6 728 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2)) break;
lukas_formanek 8:5d99fbf255d6 729 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 730 put_rc(f_chmod(ptr, p1, p2));
lukas_formanek 8:5d99fbf255d6 731 break;
lukas_formanek 8:5d99fbf255d6 732 #endif
lukas_formanek 8:5d99fbf255d6 733 #if 0
lukas_formanek 8:5d99fbf255d6 734 /* ft <year> <month> <day> <hour> <min> <sec> <name>
lukas_formanek 8:5d99fbf255d6 735 - Change timestamp of an object */
lukas_formanek 8:5d99fbf255d6 736 case 't' :
lukas_formanek 8:5d99fbf255d6 737 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
lukas_formanek 8:5d99fbf255d6 738 break;
lukas_formanek 8:5d99fbf255d6 739 }
lukas_formanek 8:5d99fbf255d6 740 Finfo.fdate = ((p1 - 1980) << 9) | ((p2 & 15) << 5) | (p3 & 31);
lukas_formanek 8:5d99fbf255d6 741 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
lukas_formanek 8:5d99fbf255d6 742 break;
lukas_formanek 8:5d99fbf255d6 743 }
lukas_formanek 8:5d99fbf255d6 744 Finfo.ftime =
lukas_formanek 8:5d99fbf255d6 745 ((p1 & 31) << 11) | ((p2 & 63) << 5) | ((p3 >> 1) & 31);
lukas_formanek 8:5d99fbf255d6 746 put_rc(f_utime(ptr, &Finfo));
lukas_formanek 8:5d99fbf255d6 747 break;
lukas_formanek 8:5d99fbf255d6 748 #endif
lukas_formanek 8:5d99fbf255d6 749 #if FILCPY_NOTUSE == 0
lukas_formanek 8:5d99fbf255d6 750 case 'x' : /* fx <src_name> <dst_name> - Copy file */
lukas_formanek 8:5d99fbf255d6 751 while ( *ptr == ' ' ) {
lukas_formanek 8:5d99fbf255d6 752 ptr++;
lukas_formanek 8:5d99fbf255d6 753 }
lukas_formanek 8:5d99fbf255d6 754 ptr2 = strchr( ptr, ' ' );
lukas_formanek 8:5d99fbf255d6 755 if ( !ptr2 ) {
lukas_formanek 8:5d99fbf255d6 756 break;
lukas_formanek 8:5d99fbf255d6 757 }
lukas_formanek 8:5d99fbf255d6 758 *ptr2++ = 0;
lukas_formanek 8:5d99fbf255d6 759 while ( *ptr2 == ' ' ) {
lukas_formanek 8:5d99fbf255d6 760 ptr2++;
lukas_formanek 8:5d99fbf255d6 761 }
lukas_formanek 8:5d99fbf255d6 762 f_res = f_open( &File1, ptr, FA_OPEN_EXISTING | FA_READ );
lukas_formanek 8:5d99fbf255d6 763 PRINTF("Opening %s \r\n", ptr);
lukas_formanek 8:5d99fbf255d6 764 if ( f_res ) {
lukas_formanek 8:5d99fbf255d6 765 put_rc( (FRESULT)f_res );
lukas_formanek 8:5d99fbf255d6 766 break;
lukas_formanek 8:5d99fbf255d6 767 }
lukas_formanek 8:5d99fbf255d6 768 f_res = f_open( &File2, ptr2, FA_CREATE_ALWAYS | FA_WRITE );
lukas_formanek 8:5d99fbf255d6 769 PRINTF(" Creating %s \r\n", ptr2);
lukas_formanek 8:5d99fbf255d6 770 if ( f_res ) {
lukas_formanek 8:5d99fbf255d6 771 put_rc( (FRESULT)f_res );
lukas_formanek 8:5d99fbf255d6 772 f_close( &File1 );
lukas_formanek 8:5d99fbf255d6 773 break;
lukas_formanek 8:5d99fbf255d6 774 }
lukas_formanek 8:5d99fbf255d6 775 PRINTF("Copying file...");
lukas_formanek 8:5d99fbf255d6 776 p1 = 0;
lukas_formanek 8:5d99fbf255d6 777 for ( ;; ) {
lukas_formanek 8:5d99fbf255d6 778 f_res = f_read( &File1, Buff, blen, &s1 );
lukas_formanek 8:5d99fbf255d6 779 if ( f_res || s1 == 0 ) {
lukas_formanek 8:5d99fbf255d6 780 break; /* error or eof */
lukas_formanek 8:5d99fbf255d6 781 }
lukas_formanek 8:5d99fbf255d6 782 f_res = f_write( &File2, Buff, s1, &s2 );
lukas_formanek 8:5d99fbf255d6 783 p1 += s2;
lukas_formanek 8:5d99fbf255d6 784 if ( f_res || s2 < s1 ) {
lukas_formanek 8:5d99fbf255d6 785 break; /* error or disk full */
lukas_formanek 8:5d99fbf255d6 786 }
lukas_formanek 8:5d99fbf255d6 787 }
lukas_formanek 8:5d99fbf255d6 788 f_close( &File1 );
lukas_formanek 8:5d99fbf255d6 789 f_close( &File2 );
lukas_formanek 8:5d99fbf255d6 790 crlf();
lukas_formanek 8:5d99fbf255d6 791 break;
lukas_formanek 8:5d99fbf255d6 792 #endif
lukas_formanek 8:5d99fbf255d6 793 #if 0
lukas_formanek 8:5d99fbf255d6 794 case 'x' : /* fx <src.name> <dst.name> - Copy a file */
lukas_formanek 8:5d99fbf255d6 795 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 796 ptr2 = strchr(ptr, ' ');
lukas_formanek 8:5d99fbf255d6 797 if (!ptr2) break;
lukas_formanek 8:5d99fbf255d6 798 *ptr2++ = 0;
lukas_formanek 8:5d99fbf255d6 799 while (*ptr2 == ' ') ptr2++;
lukas_formanek 8:5d99fbf255d6 800 PRINTF("Opening \"%s\"", ptr);
lukas_formanek 8:5d99fbf255d6 801 res = f_open(&File1, ptr, FA_OPEN_EXISTING | FA_READ);
lukas_formanek 8:5d99fbf255d6 802 PUTS("\r\n");
lukas_formanek 8:5d99fbf255d6 803 if (res) {
lukas_formanek 8:5d99fbf255d6 804 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 805 break;
lukas_formanek 8:5d99fbf255d6 806 }
lukas_formanek 8:5d99fbf255d6 807 PRINTF("Creating \"%s\"", ptr2);
lukas_formanek 8:5d99fbf255d6 808 res = f_open(&File1, ptr2, FA_CREATE_ALWAYS | FA_WRITE);
lukas_formanek 8:5d99fbf255d6 809 PUTS("\r\n");
lukas_formanek 8:5d99fbf255d6 810 if (res) {
lukas_formanek 8:5d99fbf255d6 811 put_rc((FRESULT)res);
lukas_formanek 8:5d99fbf255d6 812 f_close(&File1);
lukas_formanek 8:5d99fbf255d6 813 break;
lukas_formanek 8:5d99fbf255d6 814 }
lukas_formanek 8:5d99fbf255d6 815 PRINTF("Copying file...");
lukas_formanek 8:5d99fbf255d6 816 t.reset();
lukas_formanek 8:5d99fbf255d6 817 t.start();
lukas_formanek 8:5d99fbf255d6 818 p1 = 0;
lukas_formanek 8:5d99fbf255d6 819 for (;;) {
lukas_formanek 8:5d99fbf255d6 820 res = f_read(&File1, Buff, blen, &s1);
lukas_formanek 8:5d99fbf255d6 821 if (res || s1 == 0) break; /* error or eof */
lukas_formanek 8:5d99fbf255d6 822 res = f_write(&File2, Buff, s1, &s2);
lukas_formanek 8:5d99fbf255d6 823 p1 += s2;
lukas_formanek 8:5d99fbf255d6 824 if (res || s2 < s1) break; /* error or disk full */
lukas_formanek 8:5d99fbf255d6 825 }
lukas_formanek 8:5d99fbf255d6 826 tim = t.read_ms();
lukas_formanek 8:5d99fbf255d6 827 PRINTF("\r\n%lu bytes copied with %lu kB/sec.\r\n",
lukas_formanek 8:5d99fbf255d6 828 p1, tim ? (p1 / tim) : 0);
lukas_formanek 8:5d99fbf255d6 829 f_close(&File1);
lukas_formanek 8:5d99fbf255d6 830 f_close(&File2);
lukas_formanek 8:5d99fbf255d6 831 break;
lukas_formanek 8:5d99fbf255d6 832 #endif
lukas_formanek 8:5d99fbf255d6 833 #if FF_FS_RPATH
lukas_formanek 8:5d99fbf255d6 834 case 'g' : /* fg <path> - Change current directory */
lukas_formanek 8:5d99fbf255d6 835 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 836 put_rc(f_chdir(ptr));
lukas_formanek 8:5d99fbf255d6 837 break;
lukas_formanek 8:5d99fbf255d6 838 #if FF_FS_RPATH >= 2
lukas_formanek 8:5d99fbf255d6 839 case 'q' : /* fq - Show current dir path */
lukas_formanek 8:5d99fbf255d6 840 res = f_getcwd(Linebuf, sizeof Linebuf);
lukas_formanek 8:5d99fbf255d6 841 if (res)
lukas_formanek 8:5d99fbf255d6 842 put_rc(res);
lukas_formanek 8:5d99fbf255d6 843 else
lukas_formanek 8:5d99fbf255d6 844 PRINTF("%s\r\n", Linebuf);
lukas_formanek 8:5d99fbf255d6 845 break;
lukas_formanek 8:5d99fbf255d6 846 #endif
lukas_formanek 8:5d99fbf255d6 847 #endif
lukas_formanek 8:5d99fbf255d6 848 #if FF_USE_LABEL
lukas_formanek 8:5d99fbf255d6 849 case 'b' : /* fb <name> - Set volume label */
lukas_formanek 8:5d99fbf255d6 850 while (*ptr == ' ') ptr++;
lukas_formanek 8:5d99fbf255d6 851 put_rc(f_setlabel(ptr));
lukas_formanek 8:5d99fbf255d6 852 break;
lukas_formanek 8:5d99fbf255d6 853 #endif /* FF_USE_LABEL */
lukas_formanek 8:5d99fbf255d6 854 #if FF_USE_MKFS
lukas_formanek 8:5d99fbf255d6 855 case 'm' : /* fm <type> <csize> - Create file system */
lukas_formanek 8:5d99fbf255d6 856 if (!xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) break;
lukas_formanek 8:5d99fbf255d6 857 PRINTF("The volume will be formatted. Are you sure? (Y/n)=");
lukas_formanek 8:5d99fbf255d6 858 get_line(Linebuf, sizeof Linebuf);
lukas_formanek 8:5d99fbf255d6 859 if (Linebuf[0] == 'Y')
lukas_formanek 8:5d99fbf255d6 860 put_rc(f_mkfs("", (BYTE)p2, (DWORD)p3, Buff, sizeof Buff));
lukas_formanek 8:5d99fbf255d6 861 break;
lukas_formanek 8:5d99fbf255d6 862 #endif /* FF_USE_MKFS */
lukas_formanek 8:5d99fbf255d6 863 /* fz [<size>] - Change/Show R/W length for fr/fw/fx command */
lukas_formanek 8:5d99fbf255d6 864 case 'z' :
lukas_formanek 8:5d99fbf255d6 865 if (xatoi(&ptr, &p1) && p1 >= 1 && p1 <= (long)sizeof Buff)
lukas_formanek 8:5d99fbf255d6 866 blen = p1;
lukas_formanek 8:5d99fbf255d6 867 PRINTF("blen=%u\r\n", blen);
lukas_formanek 8:5d99fbf255d6 868 break;
lukas_formanek 8:5d99fbf255d6 869 }
lukas_formanek 8:5d99fbf255d6 870 }
lukas_formanek 8:5d99fbf255d6 871
lukas_formanek 8:5d99fbf255d6 872 static void memory_inf(char *ptr)
lukas_formanek 8:5d99fbf255d6 873 {
lukas_formanek 8:5d99fbf255d6 874 long p1, p2, p3;
lukas_formanek 8:5d99fbf255d6 875
lukas_formanek 8:5d99fbf255d6 876 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 877 case 'd' : /* md[b|h|w] <address> [<count>] - Dump memory */
lukas_formanek 8:5d99fbf255d6 878 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 879 case 'w':
lukas_formanek 8:5d99fbf255d6 880 p3 = DW_LONG;
lukas_formanek 8:5d99fbf255d6 881 break;
lukas_formanek 8:5d99fbf255d6 882 case 'h':
lukas_formanek 8:5d99fbf255d6 883 p3 = DW_SHORT;
lukas_formanek 8:5d99fbf255d6 884 break;
lukas_formanek 8:5d99fbf255d6 885 default:
lukas_formanek 8:5d99fbf255d6 886 p3 = DW_CHAR;
lukas_formanek 8:5d99fbf255d6 887 }
lukas_formanek 8:5d99fbf255d6 888 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 889 if (!xatoi(&ptr, &p2)) p2 = 128 / p3;
lukas_formanek 8:5d99fbf255d6 890 for (ptr = (char*)p1; p2 >= 16 / p3; ptr += 16, p2 -= 16 / p3)
lukas_formanek 8:5d99fbf255d6 891 put_dump(ptr, (DWORD)ptr, 16 / p3, p3);
lukas_formanek 8:5d99fbf255d6 892 if (p2) put_dump((BYTE*)ptr, (UINT)ptr, p2, p3);
lukas_formanek 8:5d99fbf255d6 893 break;
lukas_formanek 8:5d99fbf255d6 894 case 'f' : /* mf <address> <value> <count> - Fill memory */
lukas_formanek 8:5d99fbf255d6 895 if (!xatoi(&ptr, &p1) || !xatoi(&ptr, &p2) || !xatoi(&ptr, &p3)) {
lukas_formanek 8:5d99fbf255d6 896 break;
lukas_formanek 8:5d99fbf255d6 897 }
lukas_formanek 8:5d99fbf255d6 898 while (p3--) {
lukas_formanek 8:5d99fbf255d6 899 *(BYTE*)p1 = (BYTE)p2;
lukas_formanek 8:5d99fbf255d6 900 p1++;
lukas_formanek 8:5d99fbf255d6 901 }
lukas_formanek 8:5d99fbf255d6 902 break;
lukas_formanek 8:5d99fbf255d6 903 case 'e' : /* me[b|h|w] <address> [<value> ...] - Edit memory */
lukas_formanek 8:5d99fbf255d6 904 switch (*ptr++) { /* Get data width */
lukas_formanek 8:5d99fbf255d6 905 case 'w':
lukas_formanek 8:5d99fbf255d6 906 p3 = DW_LONG;
lukas_formanek 8:5d99fbf255d6 907 break;
lukas_formanek 8:5d99fbf255d6 908 case 'h':
lukas_formanek 8:5d99fbf255d6 909 p3 = DW_SHORT;
lukas_formanek 8:5d99fbf255d6 910 break;
lukas_formanek 8:5d99fbf255d6 911 default:
lukas_formanek 8:5d99fbf255d6 912 p3 = DW_CHAR;
lukas_formanek 8:5d99fbf255d6 913 }
lukas_formanek 8:5d99fbf255d6 914 if (!xatoi(&ptr, &p1)) break; /* Get start address */
lukas_formanek 8:5d99fbf255d6 915 if (xatoi(&ptr, &p2)) { /* 2nd parameter is given (direct mode) */
lukas_formanek 8:5d99fbf255d6 916 do {
lukas_formanek 8:5d99fbf255d6 917 switch (p3) {
lukas_formanek 8:5d99fbf255d6 918 case DW_LONG:
lukas_formanek 8:5d99fbf255d6 919 *(DWORD*)p1 = (DWORD)p2;
lukas_formanek 8:5d99fbf255d6 920 break;
lukas_formanek 8:5d99fbf255d6 921 case DW_SHORT:
lukas_formanek 8:5d99fbf255d6 922 *(WORD*)p1 = (WORD)p2;
lukas_formanek 8:5d99fbf255d6 923 break;
lukas_formanek 8:5d99fbf255d6 924 default:
lukas_formanek 8:5d99fbf255d6 925 *(BYTE*)p1 = (BYTE)p2;
lukas_formanek 8:5d99fbf255d6 926 }
lukas_formanek 8:5d99fbf255d6 927 p1 += p3;
lukas_formanek 8:5d99fbf255d6 928 } while (xatoi(&ptr, &p2)); /* Get next value */
lukas_formanek 8:5d99fbf255d6 929 break;
lukas_formanek 8:5d99fbf255d6 930 }
lukas_formanek 8:5d99fbf255d6 931 for (;;) { /* 2nd parameter is not given (interactive mode) */
lukas_formanek 8:5d99fbf255d6 932 switch (p3) {
lukas_formanek 8:5d99fbf255d6 933 case DW_LONG:
lukas_formanek 8:5d99fbf255d6 934 PRINTF("%08X 0x%08X-", p1, *(DWORD*)p1);
lukas_formanek 8:5d99fbf255d6 935 break;
lukas_formanek 8:5d99fbf255d6 936 case DW_SHORT:
lukas_formanek 8:5d99fbf255d6 937 PRINTF("%08X 0x%04X-", p1, *(WORD*)p1);
lukas_formanek 8:5d99fbf255d6 938 break;
lukas_formanek 8:5d99fbf255d6 939 default:
lukas_formanek 8:5d99fbf255d6 940 PRINTF("%08X 0x%02X-", p1, *(BYTE*)p1);
lukas_formanek 8:5d99fbf255d6 941 }
lukas_formanek 8:5d99fbf255d6 942 ptr = Linebuf;
lukas_formanek 8:5d99fbf255d6 943 get_line(ptr, sizeof Linebuf);
lukas_formanek 8:5d99fbf255d6 944 if (*ptr == '.') break;
lukas_formanek 8:5d99fbf255d6 945 if ((BYTE)*ptr >= ' ') {
lukas_formanek 8:5d99fbf255d6 946 if (!xatoi(&ptr, &p2)) continue;
lukas_formanek 8:5d99fbf255d6 947 switch (p3) {
lukas_formanek 8:5d99fbf255d6 948 case DW_LONG:
lukas_formanek 8:5d99fbf255d6 949 *(DWORD*)p1 = (DWORD)p2;
lukas_formanek 8:5d99fbf255d6 950 break;
lukas_formanek 8:5d99fbf255d6 951 case DW_SHORT:
lukas_formanek 8:5d99fbf255d6 952 *(WORD*)p1 = (WORD)p2;
lukas_formanek 8:5d99fbf255d6 953 break;
lukas_formanek 8:5d99fbf255d6 954 default:
lukas_formanek 8:5d99fbf255d6 955 *(BYTE*)p1 = (BYTE)p2;
lukas_formanek 8:5d99fbf255d6 956 }
lukas_formanek 8:5d99fbf255d6 957 }
lukas_formanek 8:5d99fbf255d6 958 p1 += p3;
lukas_formanek 8:5d99fbf255d6 959 }
lukas_formanek 8:5d99fbf255d6 960 }
lukas_formanek 8:5d99fbf255d6 961 }
lukas_formanek 8:5d99fbf255d6 962
lukas_formanek 8:5d99fbf255d6 963 static void disk_inf(char *ptr)
lukas_formanek 8:5d99fbf255d6 964 {
lukas_formanek 8:5d99fbf255d6 965 long p1, p2;
lukas_formanek 8:5d99fbf255d6 966 UINT s1;
lukas_formanek 8:5d99fbf255d6 967 BYTE res, b, drv = 0;
lukas_formanek 8:5d99fbf255d6 968 DWORD ofs = 0, sect = 0, blk[2];
lukas_formanek 8:5d99fbf255d6 969
lukas_formanek 8:5d99fbf255d6 970 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 971 case 'd' : /* dd [<pd#> <sect>] - Dump secrtor */
lukas_formanek 8:5d99fbf255d6 972 if (!xatoi(&ptr, &p1)) {
lukas_formanek 8:5d99fbf255d6 973 p1 = drv;
lukas_formanek 8:5d99fbf255d6 974 p2 = sect;
lukas_formanek 8:5d99fbf255d6 975 } else {
lukas_formanek 8:5d99fbf255d6 976 if (!xatoi(&ptr, &p2)) break;
lukas_formanek 8:5d99fbf255d6 977 }
lukas_formanek 8:5d99fbf255d6 978 drv = (BYTE)p1;
lukas_formanek 8:5d99fbf255d6 979 sect = p2;
lukas_formanek 8:5d99fbf255d6 980 res = disk_read(drv, Buff, sect, 1);
lukas_formanek 8:5d99fbf255d6 981 if (res) {
lukas_formanek 8:5d99fbf255d6 982 PRINTF("rc=%d\r\n", (WORD)res);
lukas_formanek 8:5d99fbf255d6 983 break;
lukas_formanek 8:5d99fbf255d6 984 }
lukas_formanek 8:5d99fbf255d6 985 PRINTF("PD#:%u LBA:%lu\r\n", drv, sect++);
lukas_formanek 8:5d99fbf255d6 986 for (ptr=(char*)Buff, ofs = 0; ofs < 0x200; ptr += 16, ofs += 16)
lukas_formanek 8:5d99fbf255d6 987 put_dump((BYTE*)ptr, ofs, 16, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 988 break;
lukas_formanek 8:5d99fbf255d6 989
lukas_formanek 8:5d99fbf255d6 990 case 'i' : /* di <pd#> - Initialize disk */
lukas_formanek 8:5d99fbf255d6 991 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 992 PRINTF("rc=%d\r\n", (WORD)disk_initialize((BYTE)p1));
lukas_formanek 8:5d99fbf255d6 993 break;
lukas_formanek 8:5d99fbf255d6 994
lukas_formanek 8:5d99fbf255d6 995 case 's' : /* ds <pd#> - Show disk status */
lukas_formanek 8:5d99fbf255d6 996 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 997 if (disk_ioctl((BYTE)p1, GET_SECTOR_COUNT, &p2) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 998 PRINTF("Drive size: %lu sectors\r\n", p2);
lukas_formanek 8:5d99fbf255d6 999 }
lukas_formanek 8:5d99fbf255d6 1000 if (disk_ioctl((BYTE)p1, GET_BLOCK_SIZE, &p2) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1001 PRINTF("Block size: %lu sectors\r\n", p2);
lukas_formanek 8:5d99fbf255d6 1002 }
lukas_formanek 8:5d99fbf255d6 1003 if (disk_ioctl((BYTE)p1, MMC_GET_TYPE, &b) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1004 PRINTF("Media type: %u\r\n", b);
lukas_formanek 8:5d99fbf255d6 1005 }
lukas_formanek 8:5d99fbf255d6 1006 if (disk_ioctl((BYTE)p1, MMC_GET_CSD, Buff) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1007 PUTS("CSD:\r\n");
lukas_formanek 8:5d99fbf255d6 1008 put_dump(Buff, 0, 16, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 1009 }
lukas_formanek 8:5d99fbf255d6 1010 if (disk_ioctl((BYTE)p1, MMC_GET_CID, Buff) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1011 PUTS("CID:\r\n");
lukas_formanek 8:5d99fbf255d6 1012 put_dump(Buff, 0, 16, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 1013 }
lukas_formanek 8:5d99fbf255d6 1014 if (disk_ioctl((BYTE)p1, MMC_GET_OCR, Buff) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1015 PUTS("OCR:\r\n");
lukas_formanek 8:5d99fbf255d6 1016 put_dump(Buff, 0, 4, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 1017 }
lukas_formanek 8:5d99fbf255d6 1018 if (disk_ioctl((BYTE)p1, MMC_GET_SDSTAT, Buff) == RES_OK) {
lukas_formanek 8:5d99fbf255d6 1019 PUTS("SD Status:\r\n");
lukas_formanek 8:5d99fbf255d6 1020 for (s1 = 0; s1 < 64; s1 += 16) {
lukas_formanek 8:5d99fbf255d6 1021 put_dump(Buff+s1, s1, 16, DW_CHAR);
lukas_formanek 8:5d99fbf255d6 1022 }
lukas_formanek 8:5d99fbf255d6 1023 }
lukas_formanek 8:5d99fbf255d6 1024 break;
lukas_formanek 8:5d99fbf255d6 1025
lukas_formanek 8:5d99fbf255d6 1026 case 'c' : /* Disk ioctl */
lukas_formanek 8:5d99fbf255d6 1027 switch (*ptr++) {
lukas_formanek 8:5d99fbf255d6 1028 case 's' : /* dcs <pd#> - CTRL_SYNC */
lukas_formanek 8:5d99fbf255d6 1029 if (!xatoi(&ptr, &p1)) break;
lukas_formanek 8:5d99fbf255d6 1030 PRINTF("rc=%d\r\n", disk_ioctl((BYTE)p1, CTRL_SYNC, 0));
lukas_formanek 8:5d99fbf255d6 1031 break;
lukas_formanek 8:5d99fbf255d6 1032 case 'e' : /* dce <pd#> <s.lba> <e.lba> - CTRL_TRIM */
lukas_formanek 8:5d99fbf255d6 1033 if (!xatoi(&ptr, &p1) ||
lukas_formanek 8:5d99fbf255d6 1034 !xatoi(&ptr, (long*)&blk[0]) ||
lukas_formanek 8:5d99fbf255d6 1035 !xatoi(&ptr, (long*)&blk[1])) {
lukas_formanek 8:5d99fbf255d6 1036 break;
lukas_formanek 8:5d99fbf255d6 1037 }
lukas_formanek 8:5d99fbf255d6 1038 PRINTF("rc=%d\r\n", disk_ioctl((BYTE)p1, CTRL_TRIM, blk));
lukas_formanek 8:5d99fbf255d6 1039 break;
lukas_formanek 8:5d99fbf255d6 1040 }
lukas_formanek 8:5d99fbf255d6 1041 }
lukas_formanek 8:5d99fbf255d6 1042 }
lukas_formanek 8:5d99fbf255d6 1043
lukas_formanek 8:5d99fbf255d6 1044 void put_dump (
lukas_formanek 8:5d99fbf255d6 1045 void* buff, /* Pointer to the array to be dumped */
lukas_formanek 8:5d99fbf255d6 1046 unsigned long addr, /* Heading address value */
lukas_formanek 8:5d99fbf255d6 1047 int len, /* Number of items to be dumped */
lukas_formanek 8:5d99fbf255d6 1048 int width /* Size of the items (DW_CHAR, DW_SHORT, DW_LONG) */
lukas_formanek 8:5d99fbf255d6 1049 )
lukas_formanek 8:5d99fbf255d6 1050 {
lukas_formanek 8:5d99fbf255d6 1051 int i;
lukas_formanek 8:5d99fbf255d6 1052 unsigned char *bp;
lukas_formanek 8:5d99fbf255d6 1053 unsigned short *sp;
lukas_formanek 8:5d99fbf255d6 1054 unsigned long *lp;
lukas_formanek 8:5d99fbf255d6 1055
lukas_formanek 8:5d99fbf255d6 1056 PRINTF( "%08lx ", addr ); /* address */
lukas_formanek 8:5d99fbf255d6 1057 switch ( width ) {
lukas_formanek 8:5d99fbf255d6 1058 case DW_CHAR:
lukas_formanek 8:5d99fbf255d6 1059 bp = (unsigned char *)buff;
lukas_formanek 8:5d99fbf255d6 1060 for ( i = 0; i < len; i++ ) { /* Hexdecimal dump */
lukas_formanek 8:5d99fbf255d6 1061 PRINTF( " %02x", bp[i] );
lukas_formanek 8:5d99fbf255d6 1062 }
lukas_formanek 8:5d99fbf255d6 1063 PUTC(' ');
lukas_formanek 8:5d99fbf255d6 1064 for ( i = 0; i < len; i++ ) { /* ASCII dump */
lukas_formanek 8:5d99fbf255d6 1065 PUTC( (bp[i] >= ' ' && bp[i] <= '~') ? bp[i] : '.' );
lukas_formanek 8:5d99fbf255d6 1066 }
lukas_formanek 8:5d99fbf255d6 1067 break;
lukas_formanek 8:5d99fbf255d6 1068 case DW_SHORT:
lukas_formanek 8:5d99fbf255d6 1069 sp = (unsigned short *)buff;
lukas_formanek 8:5d99fbf255d6 1070 do { /* Hexdecimal dump */
lukas_formanek 8:5d99fbf255d6 1071 PRINTF( " %04x", *sp++ );
lukas_formanek 8:5d99fbf255d6 1072 } while ( --len );
lukas_formanek 8:5d99fbf255d6 1073 break;
lukas_formanek 8:5d99fbf255d6 1074 case DW_LONG:
lukas_formanek 8:5d99fbf255d6 1075 lp = (unsigned long *)buff;
lukas_formanek 8:5d99fbf255d6 1076 do { /* Hexdecimal dump */
lukas_formanek 8:5d99fbf255d6 1077 PRINTF( " %08lx", *lp++ );
lukas_formanek 8:5d99fbf255d6 1078 } while ( --len );
lukas_formanek 8:5d99fbf255d6 1079 break;
lukas_formanek 8:5d99fbf255d6 1080 }
lukas_formanek 8:5d99fbf255d6 1081 PUTS( "\r\n" );
lukas_formanek 8:5d99fbf255d6 1082 }
lukas_formanek 8:5d99fbf255d6 1083
lukas_formanek 8:5d99fbf255d6 1084 // RTC related subroutines
lukas_formanek 8:5d99fbf255d6 1085 void chk_and_set_time(char *ptr)
lukas_formanek 8:5d99fbf255d6 1086 {
lukas_formanek 8:5d99fbf255d6 1087 char buf[64];
lukas_formanek 8:5d99fbf255d6 1088
lukas_formanek 8:5d99fbf255d6 1089 long p1;
lukas_formanek 8:5d99fbf255d6 1090 struct tm t;
lukas_formanek 8:5d99fbf255d6 1091 time_t seconds;
lukas_formanek 8:5d99fbf255d6 1092
lukas_formanek 8:5d99fbf255d6 1093 if (xatoi(&ptr, &p1)) {
lukas_formanek 8:5d99fbf255d6 1094 t.tm_year = (uint8_t)p1 + 100;
lukas_formanek 8:5d99fbf255d6 1095 pc.printf("Year:%d ",p1);
lukas_formanek 8:5d99fbf255d6 1096 xatoi( &ptr, &p1 );
lukas_formanek 8:5d99fbf255d6 1097 t.tm_mon = (uint8_t)p1 - 1;
lukas_formanek 8:5d99fbf255d6 1098 pc.printf("Month:%d ",p1);
lukas_formanek 8:5d99fbf255d6 1099 xatoi( &ptr, &p1 );
lukas_formanek 8:5d99fbf255d6 1100 t.tm_mday = (uint8_t)p1;
lukas_formanek 8:5d99fbf255d6 1101 pc.printf("Day:%d ",p1);
lukas_formanek 8:5d99fbf255d6 1102 xatoi( &ptr, &p1 );
lukas_formanek 8:5d99fbf255d6 1103 t.tm_hour = (uint8_t)p1;
lukas_formanek 8:5d99fbf255d6 1104 pc.printf("Hour:%d ",p1);
lukas_formanek 8:5d99fbf255d6 1105 xatoi( &ptr, &p1 );
lukas_formanek 8:5d99fbf255d6 1106 t.tm_min = (uint8_t)p1;
lukas_formanek 8:5d99fbf255d6 1107 pc.printf("Min:%d ",p1);
lukas_formanek 8:5d99fbf255d6 1108 xatoi( &ptr, &p1 );
lukas_formanek 8:5d99fbf255d6 1109 t.tm_sec = (uint8_t)p1;
lukas_formanek 8:5d99fbf255d6 1110 pc.printf("Sec: %d \r\n",p1);
lukas_formanek 8:5d99fbf255d6 1111 seconds = mktime(&t);
lukas_formanek 8:5d99fbf255d6 1112 set_time(seconds);
lukas_formanek 8:5d99fbf255d6 1113 } else {
lukas_formanek 8:5d99fbf255d6 1114 seconds = time(NULL);
lukas_formanek 8:5d99fbf255d6 1115 }
lukas_formanek 8:5d99fbf255d6 1116 strftime(buf, 50, " %B %d,'%y, %H:%M:%S\r\n", localtime(&seconds));
lukas_formanek 8:5d99fbf255d6 1117 pc.printf("[Time] %s", buf);
lukas_formanek 8:5d99fbf255d6 1118 }
lukas_formanek 8:5d99fbf255d6 1119
lukas_formanek 8:5d99fbf255d6 1120 // Get key input data
lukas_formanek 8:5d99fbf255d6 1121 void get_line (char *buff, int len)
lukas_formanek 8:5d99fbf255d6 1122 {
lukas_formanek 8:5d99fbf255d6 1123 char c;
lukas_formanek 8:5d99fbf255d6 1124 int idx = 0;
lukas_formanek 8:5d99fbf255d6 1125
lukas_formanek 8:5d99fbf255d6 1126 for (;;) {
lukas_formanek 8:5d99fbf255d6 1127 c = GETC();
lukas_formanek 8:5d99fbf255d6 1128 // Added by Kenji Arai / JH1PJL May 9th, 2010
lukas_formanek 8:5d99fbf255d6 1129 if (c == '\r') {
lukas_formanek 8:5d99fbf255d6 1130 buff[idx++] = c;
lukas_formanek 8:5d99fbf255d6 1131 break;
lukas_formanek 8:5d99fbf255d6 1132 }
lukas_formanek 8:5d99fbf255d6 1133 if ((c == '\b') && idx) {
lukas_formanek 8:5d99fbf255d6 1134 idx--;
lukas_formanek 8:5d99fbf255d6 1135 PUTC(c);
lukas_formanek 8:5d99fbf255d6 1136 PUTC(' ');
lukas_formanek 8:5d99fbf255d6 1137 PUTC(c);
lukas_formanek 8:5d99fbf255d6 1138 }
lukas_formanek 8:5d99fbf255d6 1139 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
lukas_formanek 8:5d99fbf255d6 1140 buff[idx++] = c;
lukas_formanek 8:5d99fbf255d6 1141 PUTC(c);
lukas_formanek 8:5d99fbf255d6 1142 }
lukas_formanek 8:5d99fbf255d6 1143 }
lukas_formanek 8:5d99fbf255d6 1144 buff[idx] = 0;
lukas_formanek 8:5d99fbf255d6 1145 PUTS("\r\n");
lukas_formanek 8:5d99fbf255d6 1146 }
lukas_formanek 8:5d99fbf255d6 1147
lukas_formanek 8:5d99fbf255d6 1148 /* Outpur LF & CR */
lukas_formanek 8:5d99fbf255d6 1149 void crlf( void )
lukas_formanek 8:5d99fbf255d6 1150 {
lukas_formanek 8:5d99fbf255d6 1151 PRINTF( "\r\n" );
lukas_formanek 8:5d99fbf255d6 1152 }
lukas_formanek 8:5d99fbf255d6 1153
lukas_formanek 8:5d99fbf255d6 1154 /* Check key input */
lukas_formanek 8:5d99fbf255d6 1155 unsigned int check_hit_key (void)
lukas_formanek 8:5d99fbf255d6 1156 {
lukas_formanek 8:5d99fbf255d6 1157 return ( READABLE() );
lukas_formanek 8:5d99fbf255d6 1158 }
lukas_formanek 8:5d99fbf255d6 1159
lukas_formanek 8:5d99fbf255d6 1160 /*----------------------------------------------*/
lukas_formanek 8:5d99fbf255d6 1161 /* Get a value of the string */
lukas_formanek 8:5d99fbf255d6 1162 /*----------------------------------------------*/
lukas_formanek 8:5d99fbf255d6 1163 /* "123 -5 0x3ff 0b1111 0377 w "
lukas_formanek 8:5d99fbf255d6 1164 ^ 1st call returns 123 and next ptr
lukas_formanek 8:5d99fbf255d6 1165 ^ 2nd call returns -5 and next ptr
lukas_formanek 8:5d99fbf255d6 1166 ^ 3rd call returns 1023 and next ptr
lukas_formanek 8:5d99fbf255d6 1167 ^ 4th call returns 15 and next ptr
lukas_formanek 8:5d99fbf255d6 1168 ^ 5th call returns 255 and next ptr
lukas_formanek 8:5d99fbf255d6 1169 ^ 6th call fails and returns 0
lukas_formanek 8:5d99fbf255d6 1170 */
lukas_formanek 8:5d99fbf255d6 1171 int xatoi ( /* 0:Failed, 1:Successful */
lukas_formanek 8:5d99fbf255d6 1172 char **str, /* Pointer to pointer to the string */
lukas_formanek 8:5d99fbf255d6 1173 long *res /* Pointer to the valiable to store the value */
lukas_formanek 8:5d99fbf255d6 1174 )
lukas_formanek 8:5d99fbf255d6 1175 {
lukas_formanek 8:5d99fbf255d6 1176 unsigned long val;
lukas_formanek 8:5d99fbf255d6 1177 unsigned char c, r, s = 0;
lukas_formanek 8:5d99fbf255d6 1178
lukas_formanek 8:5d99fbf255d6 1179 *res = 0;
lukas_formanek 8:5d99fbf255d6 1180 while ( (c = **str) == ' ' ) {
lukas_formanek 8:5d99fbf255d6 1181 (*str)++; /* Skip leading spaces */
lukas_formanek 8:5d99fbf255d6 1182 }
lukas_formanek 8:5d99fbf255d6 1183 if ( c == '-' ) { /* negative? */
lukas_formanek 8:5d99fbf255d6 1184 s = 1;
lukas_formanek 8:5d99fbf255d6 1185 c = *(++(*str));
lukas_formanek 8:5d99fbf255d6 1186 }
lukas_formanek 8:5d99fbf255d6 1187 if ( c == '0' ) {
lukas_formanek 8:5d99fbf255d6 1188 c = *(++(*str));
lukas_formanek 8:5d99fbf255d6 1189 switch (c) {
lukas_formanek 8:5d99fbf255d6 1190 case 'x': /* hexdecimal */
lukas_formanek 8:5d99fbf255d6 1191 r = 16;
lukas_formanek 8:5d99fbf255d6 1192 c = *(++(*str));
lukas_formanek 8:5d99fbf255d6 1193 break;
lukas_formanek 8:5d99fbf255d6 1194 case 'b': /* binary */
lukas_formanek 8:5d99fbf255d6 1195 r = 2;
lukas_formanek 8:5d99fbf255d6 1196 c = *(++(*str));
lukas_formanek 8:5d99fbf255d6 1197 break;
lukas_formanek 8:5d99fbf255d6 1198 default:
lukas_formanek 8:5d99fbf255d6 1199 if ( c <= ' ' ) return 1; /* single zero */
lukas_formanek 8:5d99fbf255d6 1200 if ( c < '0' || c > '9' ) return 0; /* invalid char */
lukas_formanek 8:5d99fbf255d6 1201 r = 8; /* octal */
lukas_formanek 8:5d99fbf255d6 1202 }
lukas_formanek 8:5d99fbf255d6 1203 } else {
lukas_formanek 8:5d99fbf255d6 1204 if ( c < '0' || c > '9' ) return 0; /* EOL or invalid char */
lukas_formanek 8:5d99fbf255d6 1205 r = 10; /* decimal */
lukas_formanek 8:5d99fbf255d6 1206 }
lukas_formanek 8:5d99fbf255d6 1207 val = 0;
lukas_formanek 8:5d99fbf255d6 1208 while ( c > ' ' ) {
lukas_formanek 8:5d99fbf255d6 1209 if ( c >= 'a' ) {
lukas_formanek 8:5d99fbf255d6 1210 c -= 0x20;
lukas_formanek 8:5d99fbf255d6 1211 }
lukas_formanek 8:5d99fbf255d6 1212 c -= '0';
lukas_formanek 8:5d99fbf255d6 1213 if ( c >= 17 ) {
lukas_formanek 8:5d99fbf255d6 1214 c -= 7;
lukas_formanek 8:5d99fbf255d6 1215 if ( c <= 9 ) {
lukas_formanek 8:5d99fbf255d6 1216 return 0; /* invalid char */
lukas_formanek 8:5d99fbf255d6 1217 }
lukas_formanek 8:5d99fbf255d6 1218 }
lukas_formanek 8:5d99fbf255d6 1219 if ( c >= r ) {
lukas_formanek 8:5d99fbf255d6 1220 return 0; /* invalid char for current radix */
lukas_formanek 8:5d99fbf255d6 1221 }
lukas_formanek 8:5d99fbf255d6 1222 val = val * r + c;
lukas_formanek 8:5d99fbf255d6 1223 c = *(++(*str));
lukas_formanek 8:5d99fbf255d6 1224 }
lukas_formanek 8:5d99fbf255d6 1225 if (s) val = 0 - val; /* apply sign if needed */
lukas_formanek 8:5d99fbf255d6 1226 *res = val;
lukas_formanek 8:5d99fbf255d6 1227 return 1;
lukas_formanek 8:5d99fbf255d6 1228 }