MDX-20用の改造

Dependencies:   FatFileSystemCpp

Committer:
suupen
Date:
Sun Oct 14 09:39:45 2018 +0000
Revision:
9:280ae971e7cb
Parent:
8:6e23bf867e38
Child:
10:cce9366e2d73
usbMemory.cpp???????????????

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 5:0ee37dbafd9a 29
suupen 8:6e23bf867e38 30 /** usb check
suupen 8:6e23bf867e38 31 * @return 0:OK 1:NG
suupen 8:6e23bf867e38 32 */
suupen 8:6e23bf867e38 33 int usbMemoryCheck(void)
suupen 5:0ee37dbafd9a 34 {
suupen 8:6e23bf867e38 35 return(msc.disk_usbCheck());
suupen 8:6e23bf867e38 36 }
suupen 8:6e23bf867e38 37
suupen 8:6e23bf867e38 38 /** usb memory initialize
suupen 8:6e23bf867e38 39 * @return 0:OK 1:NG
suupen 8:6e23bf867e38 40 */
suupen 8:6e23bf867e38 41 int usbMemoryInitialize(void)
suupen 8:6e23bf867e38 42 {
suupen 8:6e23bf867e38 43 return(msc.disk_initialize());
suupen 6:d407fe3e0c97 44 }
suupen 6:d407fe3e0c97 45
suupen 6:d407fe3e0c97 46 /** File check
suupen 6:d407fe3e0c97 47 * @para fileNumber : This number get filename 0,1:first 2: second ...
suupen 6:d407fe3e0c97 48 * @para *fileName : get filename
suupen 6:d407fe3e0c97 49 * @para *fileNumberMax : .prn file number
suupen 6:d407fe3e0c97 50 * @return
suupen 6:d407fe3e0c97 51 * false: non file true: file exists
suupen 6:d407fe3e0c97 52 */
suupen 6:d407fe3e0c97 53 int32_t fileDetect(int32_t fileNumber, char *fileName, int32_t *fileNumberMax)
suupen 6:d407fe3e0c97 54 {
suupen 6:d407fe3e0c97 55 uint32_t numMax = 0;
suupen 6:d407fe3e0c97 56 int32_t ans = false;
suupen 6:d407fe3e0c97 57
suupen 6:d407fe3e0c97 58 DIR *d;
suupen 6:d407fe3e0c97 59 struct dirent *p;
suupen 6:d407fe3e0c97 60
suupen 6:d407fe3e0c97 61 d = opendir("/" FSNAME);
suupen 5:0ee37dbafd9a 62
suupen 6:d407fe3e0c97 63 // directory check
suupen 6:d407fe3e0c97 64 if ( d != NULL ) {
suupen 6:d407fe3e0c97 65 while ( (p = readdir(d)) != NULL ) {
suupen 6:d407fe3e0c97 66 if(NULL != strstr(p->d_name, ".prn")) {
suupen 6:d407fe3e0c97 67 numMax++;
suupen 6:d407fe3e0c97 68 if(numMax == fileNumber) {
suupen 6:d407fe3e0c97 69 strcpy(fileName, p->d_name);
suupen 6:d407fe3e0c97 70 }
suupen 6:d407fe3e0c97 71 DEBUG_PRINT("detect = %s\n",fileName);
suupen 6:d407fe3e0c97 72 ans = true;
suupen 6:d407fe3e0c97 73 }
suupen 6:d407fe3e0c97 74 }
suupen 6:d407fe3e0c97 75 *fileNumberMax = numMax;
suupen 6:d407fe3e0c97 76 }
suupen 8:6e23bf867e38 77 closedir(d);
suupen 6:d407fe3e0c97 78 return ans;
suupen 6:d407fe3e0c97 79 }
suupen 6:d407fe3e0c97 80
suupen 8:6e23bf867e38 81 /** 指示したfileの行数を取得
suupen 8:6e23bf867e38 82 * @param *fileName : 指示するfile name
suupen 8:6e23bf867e38 83 * @param *numberLine : 取得した行数
suupen 8:6e23bf867e38 84 * @return false:行数取得できず true:処理成功
suupen 8:6e23bf867e38 85 */
suupen 8:6e23bf867e38 86 int32_t fileSelect(char *fileName, int32_t *numberLine)
suupen 4:dc14f62cb09f 87 {
suupen 5:0ee37dbafd9a 88 uint32_t numMax = 0;
suupen 4:dc14f62cb09f 89 int32_t ans = false;
suupen 4:dc14f62cb09f 90
suupen 8:6e23bf867e38 91 /*
suupen 8:6e23bf867e38 92 DIR *d;
suupen 8:6e23bf867e38 93 struct dirent *p;
suupen 4:dc14f62cb09f 94
suupen 8:6e23bf867e38 95 d = opendir("/" FSNAME);
suupen 8:6e23bf867e38 96 */
suupen 8:6e23bf867e38 97 // file check
suupen 8:6e23bf867e38 98 sprintf(buffer,"/msc/%s",fileName);
suupen 8:6e23bf867e38 99 fp = fopen( buffer, "r");
suupen 4:dc14f62cb09f 100
suupen 8:6e23bf867e38 101 if ( fp != NULL ) {
suupen 8:6e23bf867e38 102 char buf[256];
suupen 8:6e23bf867e38 103 while ( NULL != fgets(buf, sizeof(buf), fp) ) {
suupen 9:280ae971e7cb 104 // DEBUG_PRINT("%s", buf);
suupen 8:6e23bf867e38 105 numMax++;
suupen 8:6e23bf867e38 106 }
suupen 8:6e23bf867e38 107 *numberLine = numMax;
suupen 8:6e23bf867e38 108 ans = true;
suupen 7:a6b950d25e29 109
suupen 8:6e23bf867e38 110 } else {
suupen 8:6e23bf867e38 111 // Don't file open
suupen 8:6e23bf867e38 112 // nothing
suupen 8:6e23bf867e38 113 }
suupen 8:6e23bf867e38 114
suupen 8:6e23bf867e38 115 fclose(fp);
suupen 6:d407fe3e0c97 116 return ans;
suupen 4:dc14f62cb09f 117 }
suupen 4:dc14f62cb09f 118
suupen 8:6e23bf867e38 119 /** 指定した行のデータを取得
suupen 8:6e23bf867e38 120 * @param *fileNmae データを取得するfile Name
suupen 8:6e23bf867e38 121 * @param *data : 取得した行データを格納するバッファ
suupen 8:6e23bf867e38 122 * @param dataNumber : *dataのbyte数
suupen 8:6e23bf867e38 123 * @param numberLine : 取得する行数
suupen 8:6e23bf867e38 124 * @return false:失敗 true:成功
suupen 9:280ae971e7cb 125 *
suupen 9:280ae971e7cb 126 * 181014 数万行になると読み込みが遅くなるのでtempNumber行分バッファし、毎回指定行まで空回りさせないようにする
suupen 8:6e23bf867e38 127 */
suupen 8:6e23bf867e38 128 uint32_t fileOneLineRead(char *fileName, char *data, int32_t dataNumber, int32_t numberLine)
suupen 4:dc14f62cb09f 129 {
suupen 4:dc14f62cb09f 130 // static FILE *fp;
suupen 9:280ae971e7cb 131 uint32_t i;
suupen 4:dc14f62cb09f 132 int32_t ans = false;
suupen 9:280ae971e7cb 133
suupen 9:280ae971e7cb 134 #define tempNumber 600
suupen 9:280ae971e7cb 135 #define tempSize 30
suupen 9:280ae971e7cb 136 static char temp[tempNumber][tempSize]; // tempNumber行分のデータをバッファしておく
suupen 9:280ae971e7cb 137 static uint32_t tempLineStartNo = 0; // tempの先頭行番号
suupen 9:280ae971e7cb 138 static int32_t tempCheck = -1; // tempにデータがあるか判別 -1:なし それ以外あり
suupen 9:280ae971e7cb 139
suupen 6:d407fe3e0c97 140 #define bufferNumber 100
suupen 4:dc14f62cb09f 141 char buffer[bufferNumber];
suupen 6:d407fe3e0c97 142
suupen 9:280ae971e7cb 143
suupen 9:280ae971e7cb 144
suupen 9:280ae971e7cb 145 if (((numberLine / tempNumber) == (tempLineStartNo / tempNumber)) && (tempCheck != -1)){
suupen 9:280ae971e7cb 146 // tempにデータがあればそこから取り出す
suupen 9:280ae971e7cb 147 strcpy(data, &temp[numberLine % tempNumber][0]);
suupen 9:280ae971e7cb 148 ans = true;
suupen 9:280ae971e7cb 149 DEBUG_PRINT("temp numberLine = %d, tempNumber = %d\r\n",numberLine, (tempLineStartNo / tempNumber));
suupen 9:280ae971e7cb 150 }
suupen 9:280ae971e7cb 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 9:280ae971e7cb 165 if(NULL != fgets(&temp[i][0], tempSize, fp)){
suupen 9:280ae971e7cb 166 tempCheck = 1;
suupen 9:280ae971e7cb 167 }
suupen 9:280ae971e7cb 168 else {
suupen 9:280ae971e7cb 169 // fileにデータがなければ強制終了
suupen 9:280ae971e7cb 170 break;
suupen 9:280ae971e7cb 171 //i = tempNumber;
suupen 9:280ae971e7cb 172 }
suupen 9:280ae971e7cb 173 }
suupen 9:280ae971e7cb 174
suupen 9:280ae971e7cb 175 // fileから取り出した回もtempからデータを取得
suupen 9:280ae971e7cb 176 if((numberLine % tempNumber) <= i){
suupen 9:280ae971e7cb 177 strcpy(data, &temp[numberLine % tempNumber][0]);
suupen 9:280ae971e7cb 178 ans = true;
suupen 9:280ae971e7cb 179 DEBUG_PRINT("temp = %d\r\n",numberLine % tempNumber);
suupen 9:280ae971e7cb 180 }
suupen 9:280ae971e7cb 181 else{
suupen 9:280ae971e7cb 182 // nothing
suupen 9:280ae971e7cb 183 }
suupen 9:280ae971e7cb 184
suupen 9:280ae971e7cb 185 } else {
suupen 9:280ae971e7cb 186 // Don't file open
suupen 9:280ae971e7cb 187 // nothing
suupen 9:280ae971e7cb 188 }
suupen 9:280ae971e7cb 189 fclose(fp);
suupen 9:280ae971e7cb 190
suupen 9:280ae971e7cb 191 }
suupen 9:280ae971e7cb 192
suupen 9:280ae971e7cb 193 /* 181014変更前
suupen 6:d407fe3e0c97 194 fp = fopen( buffer, "r");
suupen 6:d407fe3e0c97 195 if ( fp != NULL ) {
suupen 6:d407fe3e0c97 196 for(uint32_t i = 0; i < numberLine; i++) {
suupen 6:d407fe3e0c97 197 fgets(buffer, sizeof(buffer), fp);
suupen 6:d407fe3e0c97 198 }
suupen 4:dc14f62cb09f 199
suupen 6:d407fe3e0c97 200 if(NULL != fgets(data, dataNumber, fp)) {
suupen 6:d407fe3e0c97 201 DEBUG_PRINT("line = %s\r\n", data);
suupen 6:d407fe3e0c97 202 ans = true;
suupen 6:d407fe3e0c97 203 } else {
suupen 6:d407fe3e0c97 204 // nothing
suupen 6:d407fe3e0c97 205 }
suupen 6:d407fe3e0c97 206 } else {
suupen 6:d407fe3e0c97 207 // Don't file open
suupen 6:d407fe3e0c97 208 // nothing
suupen 6:d407fe3e0c97 209 }
suupen 4:dc14f62cb09f 210
suupen 8:6e23bf867e38 211 fclose(fp);
suupen 9:280ae971e7cb 212 181014変更前 */
suupen 9:280ae971e7cb 213
suupen 4:dc14f62cb09f 214 return ans;
suupen 4:dc14f62cb09f 215 }
suupen 4:dc14f62cb09f 216