MDX-20用の改造

Dependencies:   FatFileSystemCpp

Files at this revision

API Documentation at this revision

Comitter:
suupen
Date:
Sun Oct 14 09:39:45 2018 +0000
Parent:
8:6e23bf867e38
Child:
10:cce9366e2d73
Commit message:
usbMemory.cpp???????????????

Changed in this revision

MSCFileSystem.cpp Show annotated file Show diff for this revision Revisions of this file
usbMemory.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/MSCFileSystem.cpp	Sun Dec 18 08:29:59 2016 +0000
+++ b/MSCFileSystem.cpp	Sun Oct 14 09:39:45 2018 +0000
@@ -18,7 +18,7 @@
 *                                        PRINT CONFIGURATION
 **************************************************************************************************************
 */
-#define DEBUG
+//#define DEBUG
 #ifdef DEBUG
 #define DEBUG_PRINT(...) printf(__VA_ARGS__)
 #else
--- a/usbMemory.cpp	Sun Dec 18 08:29:59 2016 +0000
+++ b/usbMemory.cpp	Sun Oct 14 09:39:45 2018 +0000
@@ -101,7 +101,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;
@@ -122,16 +122,75 @@
  * @param dataNumber : *dataのbyte数
  * @param numberLine : 取得する行数
  * @return false:失敗 true:成功
+ *
+ * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする 
  */
 uint32_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];
 
-    sprintf(buffer,"/msc/%s",fileName);
+
+
+    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{
+        // tempにデータがなければUSBから取り出し、tempにも保存する
+        sprintf(buffer,"/msc/%s",fileName);
+        fp = fopen( buffer, "r");
+        if ( fp != NULL ) {
+            tempLineStartNo = (numberLine /tempNumber) * tempNumber;
+
+            // 目的の行まで空回し
+            for(i = 0; i < ((numberLine / tempNumber) * tempNumber) ; i++) {
+                fgets(buffer, sizeof(buffer), fp);
+            }
 
+            // 目的の行からtempに保管していく
+            for(i = 0; i < tempNumber ; i++) {
+                if(NULL != fgets(&temp[i][0], tempSize, fp)){
+                    tempCheck = 1;
+                }
+                else {
+                    // fileにデータがなければ強制終了
+                    break;
+                    //i = tempNumber;
+                }
+            }
+            
+            // fileから取り出した回もtempからデータを取得
+            if((numberLine % tempNumber) <= i){
+                strcpy(data, &temp[numberLine % tempNumber][0]);
+                ans = true;
+                DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber);
+            }
+            else{
+                // nothing
+            }
+
+        } else {
+            // Don't file open
+            // nothing
+        }
+        fclose(fp);
+
+    }    
+
+/* 181014変更前
     fp = fopen( buffer, "r");
     if ( fp != NULL ) {
         for(uint32_t i = 0; i < numberLine; i++) {
@@ -150,6 +209,8 @@
     }
 
     fclose(fp);
+181014変更前 */
+
     return ans;
 }