Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FatFileSystemCpp
usbMemory.cpp
00001 #include "mbed.h" 00002 #include "MSCFileSystem.h" 00003 //#include <stat.h> 00004 #include "string.h" 00005 00006 /* 00007 ************************************************************************************************************** 00008 * PRINT CONFIGURATION 00009 ************************************************************************************************************** 00010 */ 00011 00012 //#define DEBUG 00013 #ifdef DEBUG 00014 #define DEBUG_PRINT(...) printf(__VA_ARGS__) 00015 #else 00016 #define DEBUG_PRINT(...) 00017 #endif // DEBUG 00018 00019 00020 #define FSNAME "msc" 00021 MSCFileSystem msc(FSNAME); 00022 FILE *fp; 00023 00024 00025 00026 char fileName[20]; 00027 char buffer[50]; 00028 00029 int32_t C_lineReadNo; // fileLineRead()で1行づつ読み出したときに、読み出した行番号を記憶する 0:先頭行 1~その後の行 00030 00031 /** usb check 00032 * @return 0:OK 1:NG 00033 */ 00034 int usbMemoryCheck(void) 00035 { 00036 return(msc.disk_usbCheck()); 00037 } 00038 00039 /** usb memory initialize 00040 * @return 0:OK 1:NG 00041 */ 00042 int usbMemoryInitialize(void) 00043 { 00044 return(msc.disk_initialize()); 00045 } 00046 00047 /** File check 00048 * @para fileNumber : This number get filename 0,1:first 2: second ... 00049 * @para *fileName : get filename 00050 * @para *fileNumberMax : .prn file number 00051 * @return 00052 * false: non file true: file exists 00053 */ 00054 int32_t fileDetect(int32_t fileNumber, char *fileName, int32_t *fileNumberMax) 00055 { 00056 uint32_t numMax = 0; 00057 int32_t ans = false; 00058 00059 DIR *d; 00060 struct dirent *p; 00061 00062 d = opendir("/" FSNAME); 00063 00064 // directory check 00065 if ( d != NULL ) { 00066 while ( (p = readdir(d)) != NULL ) { 00067 if(NULL != strstr(p->d_name, ".prn")) { 00068 numMax++; 00069 if(numMax == fileNumber) { 00070 strcpy(fileName, p->d_name); 00071 } 00072 DEBUG_PRINT("detect = %s\n",fileName); 00073 ans = true; 00074 } 00075 } 00076 *fileNumberMax = numMax; 00077 } 00078 closedir(d); 00079 return ans; 00080 } 00081 00082 /** 指示したfileの行数を取得 00083 * @param *fileName : 指示するfile name 00084 * @param *numberLine : 取得した行数 00085 * @return false:行数取得できず true:処理成功 00086 */ 00087 int32_t fileSelect(char *fileName, int32_t *numberLine) 00088 { 00089 uint32_t numMax = 0; 00090 int32_t ans = false; 00091 00092 /* 00093 DIR *d; 00094 struct dirent *p; 00095 00096 d = opendir("/" FSNAME); 00097 */ 00098 // file check 00099 sprintf(buffer,"/msc/%s",fileName); 00100 fp = fopen( buffer, "r"); 00101 00102 if ( fp != NULL ) { 00103 char buf[256]; 00104 while ( NULL != fgets(buf, sizeof(buf), fp) ) { 00105 // DEBUG_PRINT("%s", buf); 00106 numMax++; 00107 } 00108 *numberLine = numMax; 00109 ans = true; 00110 00111 } else { 00112 // Don't file open 00113 // nothing 00114 } 00115 00116 fclose(fp); 00117 return ans; 00118 } 00119 00120 /** 指定した行のデータを取得 00121 * @param *fileNmae データを取得するfile Name 00122 * @param *data : 取得した行データを格納するバッファ 00123 * @param dataNumber : *dataのbyte数 00124 * @param numberLine : 取得する行数 00125 * @return false:失敗 true:成功 00126 * 00127 * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする 00128 */ 00129 int32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine) 00130 { 00131 // static FILE *fp; 00132 uint32_t i; 00133 int32_t ans = false; 00134 00135 #define tempNumber 600 00136 #define tempSize 30 00137 static char temp[tempNumber][tempSize]; // tempNumber行分のデータをバッファしておく 00138 static uint32_t tempLineStartNo = 0; // tempの先頭行番号 00139 static int32_t tempCheck = -1; // tempにデータがあるか判別 -1:なし それ以外あり 00140 00141 #define bufferNumber 100 00142 char buffer[bufferNumber]; 00143 00144 00145 00146 if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)) { 00147 // tempにデータがあればそこから取り出す 00148 strcpy(data, &temp[numberLine % tempNumber][0]); 00149 ans = true; 00150 DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber)); 00151 } else { 00152 // tempにデータがなければUSBから取り出し、tempにも保存する 00153 sprintf(buffer,"/msc/%s",fileName); 00154 fp = fopen( buffer, "r"); 00155 if ( fp != NULL ) { 00156 tempLineStartNo = (numberLine /tempNumber) * tempNumber; 00157 00158 // 目的の行まで空回し 00159 for(i = 0; i < ((numberLine / tempNumber) * tempNumber) ; i++) { 00160 fgets(buffer, sizeof(buffer), fp); 00161 } 00162 00163 // 目的の行からtempに保管していく 00164 for(i = 0; i < tempNumber ; i++) { 00165 if(NULL != fgets(&temp[i][0], tempSize, fp)) { 00166 tempCheck = 1; 00167 } else { 00168 // fileにデータがなければ強制終了 00169 break; 00170 //i = tempNumber; 00171 } 00172 } 00173 00174 // fileから取り出した回もtempからデータを取得 00175 if((numberLine % tempNumber) <= i) { 00176 strcpy(data, &temp[numberLine % tempNumber][0]); 00177 ans = true; 00178 DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber); 00179 } else { 00180 // nothing 00181 } 00182 00183 } else { 00184 // Don't file open 00185 // nothing 00186 } 00187 fclose(fp); 00188 00189 } 00190 00191 return ans; 00192 } 00193 00194 /** file open 00195 * @param *fileName : 指示するfile name 00196 * @return false:openできず true:処理成功 00197 */ 00198 int32_t fileOpen(char *fileName) 00199 { 00200 int32_t ans = false; 00201 00202 sprintf(buffer,"/msc/%s",fileName); 00203 fp = fopen( buffer, "r"); 00204 00205 if ( fp != NULL ) { 00206 C_lineReadNo = 0; // fileLineRead()で読み出したときの行番号 00207 ans = true; 00208 } else { 00209 // Don't file open 00210 // nothing 00211 } 00212 00213 return ans; 00214 } 00215 00216 /** file close 00217 * @param *fileName : 指示するfile name (関数内で使用しないが、コール元での明示用に設定させる) 00218 * @return (false:ありえない) true:処理成功 00219 */ 00220 int32_t fileClose(char *fileName) 00221 { 00222 int32_t ans = true; 00223 00224 fclose(fp); 00225 return ans; 00226 } 00227 00228 /** 順番に1行づつ読み出す 00229 * @param *fileNmae データを取得するfile Name 00230 * @param *data : 取得した行データを格納するバッファ 00231 * @param dataNumber : *dataのbyte数 00232 * @param numberLine : 読み出した行番号(0:読み出し無し 読み出した行番号:1,2・・・) 00233 * @return false:失敗 true:成功 00234 */ 00235 int32_t fileLineRead(char *fileName, char *data, int32_t dataNumber, int32_t *numberLine) 00236 { 00237 int32_t ans = false; 00238 00239 if(NULL != fgets(data, dataNumber, fp)) { 00240 *numberLine = C_lineReadNo; 00241 C_lineReadNo++; 00242 DEBUG_PRINT("line = %s\r\n", data); 00243 ans = true; 00244 } else { 00245 // nothing 00246 } 00247 return ans; 00248 }
Generated on Sat Jul 16 2022 23:40:55 by
1.7.2