MDX-20用の改造

Dependencies:   FatFileSystemCpp

Files at this revision

API Documentation at this revision

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