suu pen / MSCUsbHost_MDX-20

Dependencies:   FatFileSystemCpp

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers usbMemory.cpp Source File

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 }