MDX-20用の改造
Dependencies: FatFileSystemCpp
usbMemory.cpp@9:280ae971e7cb, 2018-10-14 (annotated)
- 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?
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 | 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 |