MDX-20用の改造

Dependencies:   FatFileSystemCpp

Committer:
suupen
Date:
Mon Oct 15 23:04:07 2018 +0000
Revision:
10:cce9366e2d73
Parent:
9:280ae971e7cb
file open?????????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 4:dc14f62cb09f 1 #include "mbed.h"
suupen 4:dc14f62cb09f 2 #include "MSCFileSystem.h"
suupen 4:dc14f62cb09f 3 //#include <stat.h>
suupen 4:dc14f62cb09f 4 #include "string.h"
suupen 4:dc14f62cb09f 5
suupen 4:dc14f62cb09f 6 /*
suupen 4:dc14f62cb09f 7 **************************************************************************************************************
suupen 4:dc14f62cb09f 8 * PRINT CONFIGURATION
suupen 4:dc14f62cb09f 9 **************************************************************************************************************
suupen 4:dc14f62cb09f 10 */
suupen 4:dc14f62cb09f 11
suupen 4:dc14f62cb09f 12 //#define DEBUG
suupen 4:dc14f62cb09f 13 #ifdef DEBUG
suupen 4:dc14f62cb09f 14 #define DEBUG_PRINT(...) printf(__VA_ARGS__)
suupen 4:dc14f62cb09f 15 #else
suupen 4:dc14f62cb09f 16 #define DEBUG_PRINT(...)
suupen 4:dc14f62cb09f 17 #endif // DEBUG
suupen 4:dc14f62cb09f 18
suupen 4:dc14f62cb09f 19
suupen 4:dc14f62cb09f 20 #define FSNAME "msc"
suupen 4:dc14f62cb09f 21 MSCFileSystem msc(FSNAME);
suupen 4:dc14f62cb09f 22 FILE *fp;
suupen 4:dc14f62cb09f 23
suupen 4:dc14f62cb09f 24
suupen 4:dc14f62cb09f 25
suupen 4:dc14f62cb09f 26 char fileName[20];
suupen 4:dc14f62cb09f 27 char buffer[50];
suupen 4:dc14f62cb09f 28
suupen 10:cce9366e2d73 29 int32_t C_lineReadNo; // fileLineRead()で1行づつ読み出したときに、読み出した行番号を記憶する 0:先頭行 1~その後の行
suupen 5:0ee37dbafd9a 30
suupen 8:6e23bf867e38 31 /** usb check
suupen 8:6e23bf867e38 32 * @return 0:OK 1:NG
suupen 8:6e23bf867e38 33 */
suupen 8:6e23bf867e38 34 int usbMemoryCheck(void)
suupen 5:0ee37dbafd9a 35 {
suupen 8:6e23bf867e38 36 return(msc.disk_usbCheck());
suupen 8:6e23bf867e38 37 }
suupen 8:6e23bf867e38 38
suupen 8:6e23bf867e38 39 /** usb memory initialize
suupen 8:6e23bf867e38 40 * @return 0:OK 1:NG
suupen 8:6e23bf867e38 41 */
suupen 8:6e23bf867e38 42 int usbMemoryInitialize(void)
suupen 8:6e23bf867e38 43 {
suupen 8:6e23bf867e38 44 return(msc.disk_initialize());
suupen 6:d407fe3e0c97 45 }
suupen 6:d407fe3e0c97 46
suupen 6:d407fe3e0c97 47 /** File check
suupen 6:d407fe3e0c97 48 * @para fileNumber : This number get filename 0,1:first 2: second ...
suupen 6:d407fe3e0c97 49 * @para *fileName : get filename
suupen 6:d407fe3e0c97 50 * @para *fileNumberMax : .prn file number
suupen 6:d407fe3e0c97 51 * @return
suupen 6:d407fe3e0c97 52 * false: non file true: file exists
suupen 6:d407fe3e0c97 53 */
suupen 6:d407fe3e0c97 54 int32_t fileDetect(int32_t fileNumber, char *fileName, int32_t *fileNumberMax)
suupen 6:d407fe3e0c97 55 {
suupen 6:d407fe3e0c97 56 uint32_t numMax = 0;
suupen 6:d407fe3e0c97 57 int32_t ans = false;
suupen 6:d407fe3e0c97 58
suupen 6:d407fe3e0c97 59 DIR *d;
suupen 6:d407fe3e0c97 60 struct dirent *p;
suupen 6:d407fe3e0c97 61
suupen 6:d407fe3e0c97 62 d = opendir("/" FSNAME);
suupen 5:0ee37dbafd9a 63
suupen 6:d407fe3e0c97 64 // directory check
suupen 6:d407fe3e0c97 65 if ( d != NULL ) {
suupen 6:d407fe3e0c97 66 while ( (p = readdir(d)) != NULL ) {
suupen 6:d407fe3e0c97 67 if(NULL != strstr(p->d_name, ".prn")) {
suupen 6:d407fe3e0c97 68 numMax++;
suupen 6:d407fe3e0c97 69 if(numMax == fileNumber) {
suupen 6:d407fe3e0c97 70 strcpy(fileName, p->d_name);
suupen 6:d407fe3e0c97 71 }
suupen 6:d407fe3e0c97 72 DEBUG_PRINT("detect = %s\n",fileName);
suupen 6:d407fe3e0c97 73 ans = true;
suupen 6:d407fe3e0c97 74 }
suupen 6:d407fe3e0c97 75 }
suupen 6:d407fe3e0c97 76 *fileNumberMax = numMax;
suupen 6:d407fe3e0c97 77 }
suupen 8:6e23bf867e38 78 closedir(d);
suupen 6:d407fe3e0c97 79 return ans;
suupen 6:d407fe3e0c97 80 }
suupen 6:d407fe3e0c97 81
suupen 10:cce9366e2d73 82 /** 指示したfileの行数を取得
suupen 8:6e23bf867e38 83 * @param *fileName : 指示するfile name
suupen 8:6e23bf867e38 84 * @param *numberLine : 取得した行数
suupen 8:6e23bf867e38 85 * @return false:行数取得できず true:処理成功
suupen 8:6e23bf867e38 86 */
suupen 8:6e23bf867e38 87 int32_t fileSelect(char *fileName, int32_t *numberLine)
suupen 4:dc14f62cb09f 88 {
suupen 5:0ee37dbafd9a 89 uint32_t numMax = 0;
suupen 4:dc14f62cb09f 90 int32_t ans = false;
suupen 4:dc14f62cb09f 91
suupen 8:6e23bf867e38 92 /*
suupen 8:6e23bf867e38 93 DIR *d;
suupen 8:6e23bf867e38 94 struct dirent *p;
suupen 4:dc14f62cb09f 95
suupen 8:6e23bf867e38 96 d = opendir("/" FSNAME);
suupen 8:6e23bf867e38 97 */
suupen 8:6e23bf867e38 98 // file check
suupen 8:6e23bf867e38 99 sprintf(buffer,"/msc/%s",fileName);
suupen 8:6e23bf867e38 100 fp = fopen( buffer, "r");
suupen 4:dc14f62cb09f 101
suupen 8:6e23bf867e38 102 if ( fp != NULL ) {
suupen 8:6e23bf867e38 103 char buf[256];
suupen 8:6e23bf867e38 104 while ( NULL != fgets(buf, sizeof(buf), fp) ) {
suupen 10:cce9366e2d73 105 // DEBUG_PRINT("%s", buf);
suupen 8:6e23bf867e38 106 numMax++;
suupen 8:6e23bf867e38 107 }
suupen 8:6e23bf867e38 108 *numberLine = numMax;
suupen 8:6e23bf867e38 109 ans = true;
suupen 7:a6b950d25e29 110
suupen 8:6e23bf867e38 111 } else {
suupen 8:6e23bf867e38 112 // Don't file open
suupen 8:6e23bf867e38 113 // nothing
suupen 8:6e23bf867e38 114 }
suupen 8:6e23bf867e38 115
suupen 8:6e23bf867e38 116 fclose(fp);
suupen 6:d407fe3e0c97 117 return ans;
suupen 4:dc14f62cb09f 118 }
suupen 4:dc14f62cb09f 119
suupen 10:cce9366e2d73 120 /** 指定した行のデータを取得
suupen 8:6e23bf867e38 121 * @param *fileNmae データを取得するfile Name
suupen 8:6e23bf867e38 122 * @param *data : 取得した行データを格納するバッファ
suupen 8:6e23bf867e38 123 * @param dataNumber : *dataのbyte数
suupen 8:6e23bf867e38 124 * @param numberLine : 取得する行数
suupen 8:6e23bf867e38 125 * @return false:失敗 true:成功
suupen 9:280ae971e7cb 126 *
suupen 10:cce9366e2d73 127 * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする
suupen 8:6e23bf867e38 128 */
suupen 10:cce9366e2d73 129 int32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine)
suupen 4:dc14f62cb09f 130 {
suupen 4:dc14f62cb09f 131 // static FILE *fp;
suupen 9:280ae971e7cb 132 uint32_t i;
suupen 4:dc14f62cb09f 133 int32_t ans = false;
suupen 10:cce9366e2d73 134
suupen 9:280ae971e7cb 135 #define tempNumber 600
suupen 9:280ae971e7cb 136 #define tempSize 30
suupen 9:280ae971e7cb 137 static char temp[tempNumber][tempSize]; // tempNumber行分のデータをバッファしておく
suupen 9:280ae971e7cb 138 static uint32_t tempLineStartNo = 0; // tempの先頭行番号
suupen 9:280ae971e7cb 139 static int32_t tempCheck = -1; // tempにデータがあるか判別 -1:なし それ以外あり
suupen 10:cce9366e2d73 140
suupen 6:d407fe3e0c97 141 #define bufferNumber 100
suupen 4:dc14f62cb09f 142 char buffer[bufferNumber];
suupen 6:d407fe3e0c97 143
suupen 9:280ae971e7cb 144
suupen 9:280ae971e7cb 145
suupen 10:cce9366e2d73 146 if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)) {
suupen 9:280ae971e7cb 147 // tempにデータがあればそこから取り出す
suupen 10:cce9366e2d73 148 strcpy(data, &temp[numberLine % tempNumber][0]);
suupen 10:cce9366e2d73 149 ans = true;
suupen 10:cce9366e2d73 150 DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber));
suupen 10:cce9366e2d73 151 } else {
suupen 9:280ae971e7cb 152 // tempにデータがなければUSBから取り出し、tempにも保存する
suupen 9:280ae971e7cb 153 sprintf(buffer,"/msc/%s",fileName);
suupen 9:280ae971e7cb 154 fp = fopen( buffer, "r");
suupen 9:280ae971e7cb 155 if ( fp != NULL ) {
suupen 9:280ae971e7cb 156 tempLineStartNo = (numberLine /tempNumber) * tempNumber;
suupen 9:280ae971e7cb 157
suupen 9:280ae971e7cb 158 // 目的の行まで空回し
suupen 9:280ae971e7cb 159 for(i = 0; i < ((numberLine / tempNumber) * tempNumber) ; i++) {
suupen 9:280ae971e7cb 160 fgets(buffer, sizeof(buffer), fp);
suupen 9:280ae971e7cb 161 }
suupen 6:d407fe3e0c97 162
suupen 9:280ae971e7cb 163 // 目的の行からtempに保管していく
suupen 9:280ae971e7cb 164 for(i = 0; i < tempNumber ; i++) {
suupen 10:cce9366e2d73 165 if(NULL != fgets(&temp[i][0], tempSize, fp)) {
suupen 9:280ae971e7cb 166 tempCheck = 1;
suupen 10:cce9366e2d73 167 } else {
suupen 9:280ae971e7cb 168 // fileにデータがなければ強制終了
suupen 9:280ae971e7cb 169 break;
suupen 9:280ae971e7cb 170 //i = tempNumber;
suupen 9:280ae971e7cb 171 }
suupen 9:280ae971e7cb 172 }
suupen 10:cce9366e2d73 173
suupen 9:280ae971e7cb 174 // fileから取り出した回もtempからデータを取得
suupen 10:cce9366e2d73 175 if((numberLine % tempNumber) <= i) {
suupen 9:280ae971e7cb 176 strcpy(data, &temp[numberLine % tempNumber][0]);
suupen 9:280ae971e7cb 177 ans = true;
suupen 9:280ae971e7cb 178 DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber);
suupen 10:cce9366e2d73 179 } else {
suupen 9:280ae971e7cb 180 // nothing
suupen 9:280ae971e7cb 181 }
suupen 9:280ae971e7cb 182
suupen 9:280ae971e7cb 183 } else {
suupen 9:280ae971e7cb 184 // Don't file open
suupen 9:280ae971e7cb 185 // nothing
suupen 9:280ae971e7cb 186 }
suupen 9:280ae971e7cb 187 fclose(fp);
suupen 9:280ae971e7cb 188
suupen 10:cce9366e2d73 189 }
suupen 10:cce9366e2d73 190
suupen 10:cce9366e2d73 191 return ans;
suupen 10:cce9366e2d73 192 }
suupen 9:280ae971e7cb 193
suupen 10:cce9366e2d73 194 /** file open
suupen 10:cce9366e2d73 195 * @param *fileName : 指示するfile name
suupen 10:cce9366e2d73 196 * @return false:openできず true:処理成功
suupen 10:cce9366e2d73 197 */
suupen 10:cce9366e2d73 198 int32_t fileOpen(char *fileName)
suupen 10:cce9366e2d73 199 {
suupen 10:cce9366e2d73 200 int32_t ans = false;
suupen 10:cce9366e2d73 201
suupen 10:cce9366e2d73 202 sprintf(buffer,"/msc/%s",fileName);
suupen 6:d407fe3e0c97 203 fp = fopen( buffer, "r");
suupen 10:cce9366e2d73 204
suupen 6:d407fe3e0c97 205 if ( fp != NULL ) {
suupen 10:cce9366e2d73 206 C_lineReadNo = 0; // fileLineRead()で読み出したときの行番号
suupen 10:cce9366e2d73 207 ans = true;
suupen 6:d407fe3e0c97 208 } else {
suupen 6:d407fe3e0c97 209 // Don't file open
suupen 6:d407fe3e0c97 210 // nothing
suupen 6:d407fe3e0c97 211 }
suupen 4:dc14f62cb09f 212
suupen 10:cce9366e2d73 213 return ans;
suupen 10:cce9366e2d73 214 }
suupen 10:cce9366e2d73 215
suupen 10:cce9366e2d73 216 /** file close
suupen 10:cce9366e2d73 217 * @param *fileName : 指示するfile name (関数内で使用しないが、コール元での明示用に設定させる)
suupen 10:cce9366e2d73 218 * @return (false:ありえない) true:処理成功
suupen 10:cce9366e2d73 219 */
suupen 10:cce9366e2d73 220 int32_t fileClose(char *fileName)
suupen 10:cce9366e2d73 221 {
suupen 10:cce9366e2d73 222 int32_t ans = true;
suupen 10:cce9366e2d73 223
suupen 8:6e23bf867e38 224 fclose(fp);
suupen 4:dc14f62cb09f 225 return ans;
suupen 4:dc14f62cb09f 226 }
suupen 4:dc14f62cb09f 227
suupen 10:cce9366e2d73 228 /** 順番に1行づつ読み出す
suupen 10:cce9366e2d73 229 * @param *fileNmae データを取得するfile Name
suupen 10:cce9366e2d73 230 * @param *data : 取得した行データを格納するバッファ
suupen 10:cce9366e2d73 231 * @param dataNumber : *dataのbyte数
suupen 10:cce9366e2d73 232 * @param numberLine : 読み出した行番号(0:読み出し無し 読み出した行番号:1,2・・・)
suupen 10:cce9366e2d73 233 * @return false:失敗 true:成功
suupen 10:cce9366e2d73 234 */
suupen 10:cce9366e2d73 235 int32_t fileLineRead(char *fileName, char *data, int32_t dataNumber, int32_t *numberLine)
suupen 10:cce9366e2d73 236 {
suupen 10:cce9366e2d73 237 int32_t ans = false;
suupen 10:cce9366e2d73 238
suupen 10:cce9366e2d73 239 if(NULL != fgets(data, dataNumber, fp)) {
suupen 10:cce9366e2d73 240 *numberLine = C_lineReadNo;
suupen 10:cce9366e2d73 241 C_lineReadNo++;
suupen 10:cce9366e2d73 242 DEBUG_PRINT("line = %s\r\n", data);
suupen 10:cce9366e2d73 243 ans = true;
suupen 10:cce9366e2d73 244 } else {
suupen 10:cce9366e2d73 245 // nothing
suupen 10:cce9366e2d73 246 }
suupen 10:cce9366e2d73 247 return ans;
suupen 10:cce9366e2d73 248 }