MDX-20用の改造
Dependencies: FatFileSystemCpp
Revision 10:cce9366e2d73, committed 2018-10-15
- Comitter:
- suupen
- Date:
- Mon Oct 15 23:04:07 2018 +0000
- Parent:
- 9:280ae971e7cb
- Commit message:
- file open?????????;
Changed in this revision
usbMemory.cpp | Show annotated file Show diff for this revision Revisions of this file |
usbMemory.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 280ae971e7cb -r cce9366e2d73 usbMemory.cpp --- a/usbMemory.cpp Sun Oct 14 09:39:45 2018 +0000 +++ b/usbMemory.cpp Mon Oct 15 23:04:07 2018 +0000 @@ -26,6 +26,7 @@ char fileName[20]; char buffer[50]; +int32_t C_lineReadNo; // fileLineRead()で1行づつ読み出したときに、読み出した行番号を記憶する 0:先頭行 1~その後の行 /** usb check * @return 0:OK 1:NG @@ -78,7 +79,7 @@ return ans; } -/** 指示したfileの行数を取得 +/** 指示したfileの行数を取得 * @param *fileName : 指示するfile name * @param *numberLine : 取得した行数 * @return false:行数取得できず true:処理成功 @@ -101,7 +102,7 @@ if ( fp != NULL ) { char buf[256]; while ( NULL != fgets(buf, sizeof(buf), fp) ) { - // DEBUG_PRINT("%s", buf); + // DEBUG_PRINT("%s", buf); numMax++; } *numberLine = numMax; @@ -116,39 +117,38 @@ return ans; } -/** 指定した行のデータを取得 +/** 指定した行のデータを取得 * @param *fileNmae データを取得するfile Name * @param *data : 取得した行データを格納するバッファ * @param dataNumber : *dataのbyte数 * @param numberLine : 取得する行数 * @return false:失敗 true:成功 * - * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする + * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする */ -uint32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine) +int32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine) { // static FILE *fp; uint32_t i; int32_t ans = false; - + #define tempNumber 600 #define tempSize 30 static char temp[tempNumber][tempSize]; // tempNumber行分のデータをバッファしておく static uint32_t tempLineStartNo = 0; // tempの先頭行番号 static int32_t tempCheck = -1; // tempにデータがあるか判別 -1:なし それ以外あり - + #define bufferNumber 100 char buffer[bufferNumber]; - if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)){ + if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)) { // tempにデータがあればそこから取り出す - strcpy(data, &temp[numberLine % tempNumber][0]); - ans = true; - DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber)); - } - else{ + strcpy(data, &temp[numberLine % tempNumber][0]); + ans = true; + DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber)); + } else { // tempにデータがなければUSBから取り出し、tempにも保存する sprintf(buffer,"/msc/%s",fileName); fp = fopen( buffer, "r"); @@ -162,23 +162,21 @@ // 目的の行からtempに保管していく for(i = 0; i < tempNumber ; i++) { - if(NULL != fgets(&temp[i][0], tempSize, fp)){ + if(NULL != fgets(&temp[i][0], tempSize, fp)) { tempCheck = 1; - } - else { + } else { // fileにデータがなければ強制終了 break; //i = tempNumber; } } - + // fileから取り出した回もtempからデータを取得 - if((numberLine % tempNumber) <= i){ + if((numberLine % tempNumber) <= i) { strcpy(data, &temp[numberLine % tempNumber][0]); ans = true; DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber); - } - else{ + } else { // nothing } @@ -188,29 +186,63 @@ } fclose(fp); - } + } + + return ans; +} -/* 181014変更前 +/** file open + * @param *fileName : 指示するfile name + * @return false:openできず true:処理成功 + */ +int32_t fileOpen(char *fileName) +{ + int32_t ans = false; + + sprintf(buffer,"/msc/%s",fileName); fp = fopen( buffer, "r"); + if ( fp != NULL ) { - for(uint32_t i = 0; i < numberLine; i++) { - fgets(buffer, sizeof(buffer), fp); - } - - if(NULL != fgets(data, dataNumber, fp)) { - DEBUG_PRINT("line = %s\r\n", data); - ans = true; - } else { - // nothing - } + C_lineReadNo = 0; // fileLineRead()で読み出したときの行番号 + ans = true; } else { // Don't file open // nothing } + return ans; +} + +/** file close + * @param *fileName : 指示するfile name (関数内で使用しないが、コール元での明示用に設定させる) + * @return (false:ありえない) true:処理成功 + */ +int32_t fileClose(char *fileName) +{ + int32_t ans = true; + fclose(fp); -181014変更前 */ - return ans; } +/** 順番に1行づつ読み出す + * @param *fileNmae データを取得するfile Name + * @param *data : 取得した行データを格納するバッファ + * @param dataNumber : *dataのbyte数 + * @param numberLine : 読み出した行番号(0:読み出し無し 読み出した行番号:1,2・・・) + * @return false:失敗 true:成功 + */ +int32_t fileLineRead(char *fileName, char *data, int32_t dataNumber, int32_t *numberLine) +{ + int32_t ans = false; + + if(NULL != fgets(data, dataNumber, fp)) { + *numberLine = C_lineReadNo; + C_lineReadNo++; + DEBUG_PRINT("line = %s\r\n", data); + ans = true; + } else { + // nothing + } + return ans; +} \ No newline at end of file
diff -r 280ae971e7cb -r cce9366e2d73 usbMemory.h --- a/usbMemory.h Sun Oct 14 09:39:45 2018 +0000 +++ b/usbMemory.h Mon Oct 15 23:04:07 2018 +0000 @@ -6,7 +6,14 @@ int32_t fileDetect(int32_t fileNumber, char *fileName, int32_t *fileNumberMax); int32_t fileSelect(char *fileName, int32_t *numberLine); -uint32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine); + +// 関数を呼ぶたびにfile openして指定行まで空回しするので時間がかかる。その代わりopen-closeを考える必要がない +int32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine); + +// fileをopenしっぱなしにして先頭から順番に読むときに使う関数郡(fileOneLineRead()を使うとストレス二なる場合に使う) +int32_t fileOpen(char *fileName); +int32_t fileClose(char *fileName); +int32_t fileLineRead(char *fileName, char *data, int32_t dataNumber, int32_t *numberLine); int usbMemoryCheck(void); @@ -14,4 +21,5 @@ + #endif // USBMEMORY_H \ No newline at end of file