MDX-20用の改造
Dependencies: FatFileSystemCpp
usbMemory.cpp@10:cce9366e2d73, 2018-10-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |