Kobayashi Akihiro / ActiveCaster

Dependents:   ActiveCaster_ ActiveCaster_2

Committer:
e5119053f6
Date:
Fri Jan 28 15:43:18 2022 +0000
Revision:
2:f206311600ee
Parent:
0:5e4f1e288e2a
DDSS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
e5119053f6 0:5e4f1e288e2a 1 #include "SDclass.h"
e5119053f6 0:5e4f1e288e2a 2
e5119053f6 0:5e4f1e288e2a 3 char REDpath[20] = "/fs/PATH_RED.txt";
e5119053f6 0:5e4f1e288e2a 4 char REDvel[20] = "/fs/VEL_RED.txt";
e5119053f6 0:5e4f1e288e2a 5 char BLUpath[20] = "/fs/PATH_BLU.txt";
e5119053f6 0:5e4f1e288e2a 6 char BLUvel[20] = "/fs/VEL_BLU.txt";
e5119053f6 0:5e4f1e288e2a 7
e5119053f6 0:5e4f1e288e2a 8 FATFileSystem fs("fs");
e5119053f6 0:5e4f1e288e2a 9 SDBlockDevice sd(P8_5, P8_6, P8_3, P8_4);
e5119053f6 0:5e4f1e288e2a 10
e5119053f6 0:5e4f1e288e2a 11 mySDclass::mySDclass() {}
e5119053f6 0:5e4f1e288e2a 12
e5119053f6 0:5e4f1e288e2a 13 /* SDカードの初期化 */
e5119053f6 0:5e4f1e288e2a 14 int mySDclass::init() {
e5119053f6 0:5e4f1e288e2a 15 printf("mySDclass");
e5119053f6 0:5e4f1e288e2a 16
e5119053f6 0:5e4f1e288e2a 17 if (fs.mount(&sd) == 0) {
e5119053f6 0:5e4f1e288e2a 18 sd.frequency(2000000);
e5119053f6 0:5e4f1e288e2a 19 SD_enable = true;
e5119053f6 0:5e4f1e288e2a 20 printf(" init done");
e5119053f6 0:5e4f1e288e2a 21 return 0;
e5119053f6 0:5e4f1e288e2a 22 }
e5119053f6 0:5e4f1e288e2a 23
e5119053f6 0:5e4f1e288e2a 24 printf(" init failure");
e5119053f6 0:5e4f1e288e2a 25 return -1;
e5119053f6 0:5e4f1e288e2a 26 }
e5119053f6 0:5e4f1e288e2a 27
e5119053f6 0:5e4f1e288e2a 28 /* ログデータ書き出し用ファイル名の設定 */
e5119053f6 0:5e4f1e288e2a 29 int mySDclass::make_logfile() {
e5119053f6 0:5e4f1e288e2a 30 // bool nameOK = false;
e5119053f6 0:5e4f1e288e2a 31 int file_num = 0;
e5119053f6 0:5e4f1e288e2a 32
e5119053f6 0:5e4f1e288e2a 33 DIR *d;
e5119053f6 0:5e4f1e288e2a 34 d = opendir("/fs");
e5119053f6 0:5e4f1e288e2a 35 if (d != NULL) {
e5119053f6 0:5e4f1e288e2a 36 while (readdir(d) != NULL) {
e5119053f6 0:5e4f1e288e2a 37 file_num++;
e5119053f6 0:5e4f1e288e2a 38 }
e5119053f6 0:5e4f1e288e2a 39 }
e5119053f6 0:5e4f1e288e2a 40
e5119053f6 0:5e4f1e288e2a 41 int keta = 0;
e5119053f6 0:5e4f1e288e2a 42 for(int tmp = file_num; (tmp /= 10) != 0; keta++);
e5119053f6 0:5e4f1e288e2a 43 logFileName = "/fs/LOG_";
e5119053f6 0:5e4f1e288e2a 44 for(int i = 0; i < (2 - keta); i++){
e5119053f6 0:5e4f1e288e2a 45 logFileName += "0";
e5119053f6 0:5e4f1e288e2a 46 }
e5119053f6 0:5e4f1e288e2a 47 logFileName += to_string(file_num);
e5119053f6 0:5e4f1e288e2a 48 logFileName += ".txt";
e5119053f6 0:5e4f1e288e2a 49 //c_logFileName = logFileName.c_str();
e5119053f6 0:5e4f1e288e2a 50
e5119053f6 0:5e4f1e288e2a 51 return file_num;
e5119053f6 0:5e4f1e288e2a 52 }
e5119053f6 0:5e4f1e288e2a 53
e5119053f6 0:5e4f1e288e2a 54 /* ログデータ書き出し用の関数 */
e5119053f6 0:5e4f1e288e2a 55 int mySDclass::write_logdata(string dataString) {
e5119053f6 0:5e4f1e288e2a 56 FILE *dataFile = fopen(logFileName.c_str(), "w");
e5119053f6 0:5e4f1e288e2a 57
e5119053f6 0:5e4f1e288e2a 58 if (dataFile) {
e5119053f6 0:5e4f1e288e2a 59 fprintf(dataFile, dataString.c_str());
e5119053f6 0:5e4f1e288e2a 60 fclose(dataFile);
e5119053f6 0:5e4f1e288e2a 61 // Serial.println(dataString);
e5119053f6 0:5e4f1e288e2a 62 return 0;
e5119053f6 0:5e4f1e288e2a 63 } else {
e5119053f6 0:5e4f1e288e2a 64 // Serial.println("error opening ");
e5119053f6 0:5e4f1e288e2a 65 return -1;
e5119053f6 0:5e4f1e288e2a 66 }
e5119053f6 0:5e4f1e288e2a 67 }
e5119053f6 0:5e4f1e288e2a 68
e5119053f6 0:5e4f1e288e2a 69 int mySDclass::path_read(int field, double Px[], double Py[], double vel[],
e5119053f6 0:5e4f1e288e2a 70 double angle[], int mode[], int count[],
e5119053f6 0:5e4f1e288e2a 71 double tbe[]) {
e5119053f6 0:5e4f1e288e2a 72 FILE *myFile;
e5119053f6 0:5e4f1e288e2a 73 char *pathFile;
e5119053f6 0:5e4f1e288e2a 74 char *velFile;
e5119053f6 0:5e4f1e288e2a 75 char tmpchar;
e5119053f6 0:5e4f1e288e2a 76 char tmpA[10], tmpB[10], tmpC[10], tmpD[10], tmpE[10];
e5119053f6 0:5e4f1e288e2a 77 bool file_end = false;
e5119053f6 0:5e4f1e288e2a 78 int numa = 0, numb = 0, numc = 0, numd = 0, nume = 0;
e5119053f6 0:5e4f1e288e2a 79 int path_num = 0, point_num = 0;
e5119053f6 0:5e4f1e288e2a 80
e5119053f6 0:5e4f1e288e2a 81 // 赤か青かで読み込むファイルを変更する
e5119053f6 0:5e4f1e288e2a 82 if (field == RED) {
e5119053f6 0:5e4f1e288e2a 83 pathFile = REDpath; // 赤ゾーンのパス設定ファイル
e5119053f6 0:5e4f1e288e2a 84 velFile = REDvel; // 赤ゾーンの速度と角度の設定ファイル
e5119053f6 0:5e4f1e288e2a 85 } else if (field == BLUE) {
e5119053f6 0:5e4f1e288e2a 86 pathFile = BLUpath; // 青ゾーンのパス設定ファイル
e5119053f6 0:5e4f1e288e2a 87 velFile = BLUvel; // 青ゾーンの速度と角度の設定ファイル
e5119053f6 0:5e4f1e288e2a 88 } else {
e5119053f6 0:5e4f1e288e2a 89 return -1;
e5119053f6 0:5e4f1e288e2a 90 }
e5119053f6 0:5e4f1e288e2a 91
e5119053f6 0:5e4f1e288e2a 92 // パス設定用ファイルからデータを読み込む
e5119053f6 0:5e4f1e288e2a 93 printf("openning... %s\n", pathFile);
e5119053f6 0:5e4f1e288e2a 94 myFile = fopen(pathFile, "r");
e5119053f6 0:5e4f1e288e2a 95
e5119053f6 0:5e4f1e288e2a 96 if (myFile) {
e5119053f6 0:5e4f1e288e2a 97 // read from the file until there's nothing else in it:
e5119053f6 0:5e4f1e288e2a 98 while (!file_end && !feof(myFile)) {
e5119053f6 0:5e4f1e288e2a 99 while ((tmpchar = fgetc(myFile)) != ',') { // カンマが来るまで繰り返し
e5119053f6 0:5e4f1e288e2a 100 tmpA[numa] = tmpchar; // 文字列に1文字ずつ格納していく
e5119053f6 0:5e4f1e288e2a 101 numa++;
e5119053f6 0:5e4f1e288e2a 102 }
e5119053f6 0:5e4f1e288e2a 103 *Px = str2double(tmpA, numa); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 104 // Serial.print(tmpA);
e5119053f6 0:5e4f1e288e2a 105 printf("%lf, ", *Px);
e5119053f6 0:5e4f1e288e2a 106 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 107 tmpA[i] = 0; // 文字列を初期化
e5119053f6 0:5e4f1e288e2a 108 numa = 0;
e5119053f6 0:5e4f1e288e2a 109 Px++;
e5119053f6 0:5e4f1e288e2a 110 while (((tmpchar = fgetc(myFile)) != '\r' && tmpchar != ';') && tmpchar != '/') { // 改行コードかセミコロン,スラッシュが来るまで繰り返し
e5119053f6 0:5e4f1e288e2a 111 tmpB[numb] = tmpchar;
e5119053f6 0:5e4f1e288e2a 112 numb++;
e5119053f6 0:5e4f1e288e2a 113 }
e5119053f6 0:5e4f1e288e2a 114 if (tmpchar == ';') {
e5119053f6 0:5e4f1e288e2a 115 file_end = true;
e5119053f6 0:5e4f1e288e2a 116 } else if (tmpchar == '/') { // コメントアウト対応
e5119053f6 0:5e4f1e288e2a 117 while ((tmpchar = fgetc(myFile)) != '\n');
e5119053f6 0:5e4f1e288e2a 118 } else {
e5119053f6 0:5e4f1e288e2a 119 fgetc(myFile); // "\n"を捨てるため
e5119053f6 0:5e4f1e288e2a 120 }
e5119053f6 0:5e4f1e288e2a 121 *Py = str2double(tmpB, numb); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 122 point_num++;
e5119053f6 0:5e4f1e288e2a 123
e5119053f6 0:5e4f1e288e2a 124 printf("%lf\n", *Py);
e5119053f6 0:5e4f1e288e2a 125 // Serial.println(tmpB);
e5119053f6 0:5e4f1e288e2a 126 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 127 tmpB[i] = 0;
e5119053f6 0:5e4f1e288e2a 128 numb = 0;
e5119053f6 0:5e4f1e288e2a 129 Py++;
e5119053f6 0:5e4f1e288e2a 130 }
e5119053f6 0:5e4f1e288e2a 131 // Serial.print("path done! ");
e5119053f6 0:5e4f1e288e2a 132 file_end = false;
e5119053f6 0:5e4f1e288e2a 133 // the file:
e5119053f6 0:5e4f1e288e2a 134 fclose(myFile);
e5119053f6 0:5e4f1e288e2a 135 } else {
e5119053f6 0:5e4f1e288e2a 136 // if the file didn't open, print an error:
e5119053f6 0:5e4f1e288e2a 137 // Serial.println("error opening test.txt");
e5119053f6 0:5e4f1e288e2a 138 return -2;
e5119053f6 0:5e4f1e288e2a 139 }
e5119053f6 0:5e4f1e288e2a 140 printf("point num: %d\n", point_num);
e5119053f6 0:5e4f1e288e2a 141
e5119053f6 0:5e4f1e288e2a 142 // 速度設定用ファイルからデータを読み込む
e5119053f6 0:5e4f1e288e2a 143 printf("openning... %s\n", velFile);
e5119053f6 0:5e4f1e288e2a 144 myFile = fopen(velFile, "r");
e5119053f6 0:5e4f1e288e2a 145 if (myFile) {
e5119053f6 0:5e4f1e288e2a 146 while (!file_end && !feof(myFile)) {
e5119053f6 0:5e4f1e288e2a 147 while ((tmpchar = fgetc(myFile)) != ',') {
e5119053f6 0:5e4f1e288e2a 148 tmpA[numa] = tmpchar;
e5119053f6 0:5e4f1e288e2a 149 numa++;
e5119053f6 0:5e4f1e288e2a 150 }
e5119053f6 0:5e4f1e288e2a 151 *vel = str2double(tmpA, numa); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 152 // Serial.print(tmpA);
e5119053f6 0:5e4f1e288e2a 153 printf("%lf, ", *vel);
e5119053f6 0:5e4f1e288e2a 154 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 155 tmpA[i] = 0;
e5119053f6 0:5e4f1e288e2a 156 numa = 0;
e5119053f6 0:5e4f1e288e2a 157 vel++;
e5119053f6 0:5e4f1e288e2a 158 //////////////////////////////////
e5119053f6 0:5e4f1e288e2a 159 while ((tmpchar = fgetc(myFile)) != ',') {
e5119053f6 0:5e4f1e288e2a 160 tmpB[numb] = tmpchar;
e5119053f6 0:5e4f1e288e2a 161 numb++;
e5119053f6 0:5e4f1e288e2a 162 }
e5119053f6 0:5e4f1e288e2a 163 *angle = str2double(tmpB, numb); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 164 // Serial.print(tmpA);
e5119053f6 0:5e4f1e288e2a 165 printf("%lf, ", *angle);
e5119053f6 0:5e4f1e288e2a 166 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 167 tmpB[i] = 0;
e5119053f6 0:5e4f1e288e2a 168 numb = 0;
e5119053f6 0:5e4f1e288e2a 169 angle++;
e5119053f6 0:5e4f1e288e2a 170 //////////////////////////////////
e5119053f6 0:5e4f1e288e2a 171 while ((tmpchar = fgetc(myFile)) != ',') {
e5119053f6 0:5e4f1e288e2a 172 tmpC[numc] = tmpchar;
e5119053f6 0:5e4f1e288e2a 173 numc++;
e5119053f6 0:5e4f1e288e2a 174 }
e5119053f6 0:5e4f1e288e2a 175 *mode = str2uint(tmpC, numc); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 176 // Serial.print(tmpA);
e5119053f6 0:5e4f1e288e2a 177 printf("%d, ", *mode);
e5119053f6 0:5e4f1e288e2a 178 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 179 tmpC[i] = 0;
e5119053f6 0:5e4f1e288e2a 180 numc = 0;
e5119053f6 0:5e4f1e288e2a 181 mode++;
e5119053f6 0:5e4f1e288e2a 182 //////////////////////////////////
e5119053f6 0:5e4f1e288e2a 183 while ((tmpchar = fgetc(myFile)) != ',') {
e5119053f6 0:5e4f1e288e2a 184 tmpD[numd] = tmpchar;
e5119053f6 0:5e4f1e288e2a 185 numd++;
e5119053f6 0:5e4f1e288e2a 186 }
e5119053f6 0:5e4f1e288e2a 187 *count = str2uint(tmpD, numd); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 188 // Serial.print(tmpA);
e5119053f6 0:5e4f1e288e2a 189 printf("%d, ", *count);
e5119053f6 0:5e4f1e288e2a 190 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 191 tmpD[i] = 0;
e5119053f6 0:5e4f1e288e2a 192 numd = 0;
e5119053f6 0:5e4f1e288e2a 193 count++;
e5119053f6 0:5e4f1e288e2a 194 //////////////////////////////////
e5119053f6 0:5e4f1e288e2a 195 while (((tmpchar = fgetc(myFile)) != '\r' && tmpchar != ';') &&
e5119053f6 0:5e4f1e288e2a 196 tmpchar != '/') {
e5119053f6 0:5e4f1e288e2a 197 tmpE[nume] = tmpchar;
e5119053f6 0:5e4f1e288e2a 198 nume++;
e5119053f6 0:5e4f1e288e2a 199 }
e5119053f6 0:5e4f1e288e2a 200 if (tmpchar == ';') {
e5119053f6 0:5e4f1e288e2a 201 file_end = true;
e5119053f6 0:5e4f1e288e2a 202 } else if (tmpchar == '/') { // コメントアウト対応
e5119053f6 0:5e4f1e288e2a 203 while ((tmpchar = fgetc(myFile)) != '\n');
e5119053f6 0:5e4f1e288e2a 204 } else {
e5119053f6 0:5e4f1e288e2a 205 fgetc(myFile); // "\n"を捨てるため
e5119053f6 0:5e4f1e288e2a 206 }
e5119053f6 0:5e4f1e288e2a 207 *tbe = str2double(tmpE, nume); //関数でdoubleに変換
e5119053f6 0:5e4f1e288e2a 208 path_num++;
e5119053f6 0:5e4f1e288e2a 209
e5119053f6 0:5e4f1e288e2a 210 // Serial.print(tmpB);
e5119053f6 0:5e4f1e288e2a 211 printf("%lf\n", *tbe);
e5119053f6 0:5e4f1e288e2a 212 for (int i = 0; i < 10; i++)
e5119053f6 0:5e4f1e288e2a 213 tmpE[i] = 0;
e5119053f6 0:5e4f1e288e2a 214 nume = 0;
e5119053f6 0:5e4f1e288e2a 215 tbe++;
e5119053f6 0:5e4f1e288e2a 216 }
e5119053f6 0:5e4f1e288e2a 217 // Serial.println("vel/angle done!");
e5119053f6 0:5e4f1e288e2a 218 // close the file:
e5119053f6 0:5e4f1e288e2a 219 fclose(myFile);
e5119053f6 0:5e4f1e288e2a 220 } else {
e5119053f6 0:5e4f1e288e2a 221 // if the file didn't open, print an error:
e5119053f6 0:5e4f1e288e2a 222 // Serial.println("error opening test.txt");
e5119053f6 0:5e4f1e288e2a 223 return -3;
e5119053f6 0:5e4f1e288e2a 224 }
e5119053f6 0:5e4f1e288e2a 225
e5119053f6 0:5e4f1e288e2a 226 if ((int)((point_num - 2) / 3) >= (path_num - 1)) {
e5119053f6 0:5e4f1e288e2a 227 return path_num - 1;
e5119053f6 0:5e4f1e288e2a 228 }
e5119053f6 0:5e4f1e288e2a 229 return -4;
e5119053f6 0:5e4f1e288e2a 230 }
e5119053f6 0:5e4f1e288e2a 231
e5119053f6 0:5e4f1e288e2a 232 double mySDclass::str2double(char *str, int num) {
e5119053f6 0:5e4f1e288e2a 233 double ret = 0.0;
e5119053f6 0:5e4f1e288e2a 234 bool minus = false;
e5119053f6 0:5e4f1e288e2a 235 int m = 0, keta;
e5119053f6 0:5e4f1e288e2a 236
e5119053f6 0:5e4f1e288e2a 237 // マイナス符号が付いているかチェック
e5119053f6 0:5e4f1e288e2a 238 if (str[0] == '-') {
e5119053f6 0:5e4f1e288e2a 239 minus = true;
e5119053f6 0:5e4f1e288e2a 240 m++;
e5119053f6 0:5e4f1e288e2a 241 }
e5119053f6 0:5e4f1e288e2a 242
e5119053f6 0:5e4f1e288e2a 243 // 何桁あるかを確認
e5119053f6 0:5e4f1e288e2a 244 keta = m;
e5119053f6 0:5e4f1e288e2a 245 while ((str[keta] != '.') && (keta < num)) {
e5119053f6 0:5e4f1e288e2a 246 keta++;
e5119053f6 0:5e4f1e288e2a 247 }
e5119053f6 0:5e4f1e288e2a 248 keta = keta - (m + 1);
e5119053f6 0:5e4f1e288e2a 249
e5119053f6 0:5e4f1e288e2a 250 // 整数部を変換
e5119053f6 0:5e4f1e288e2a 251 for (int i = m; i <= (keta + m); i++) {
e5119053f6 0:5e4f1e288e2a 252 if (str[i] >= 48 && str[i] <= 57) {
e5119053f6 0:5e4f1e288e2a 253 ret += (double)(str[i] - 48) * pow(10.0, keta - (i - m));
e5119053f6 0:5e4f1e288e2a 254 }
e5119053f6 0:5e4f1e288e2a 255 }
e5119053f6 0:5e4f1e288e2a 256
e5119053f6 0:5e4f1e288e2a 257 // 小数部を変換
e5119053f6 0:5e4f1e288e2a 258 int n = -1;
e5119053f6 0:5e4f1e288e2a 259 for (int i = keta + m + 2; i < num; i++) {
e5119053f6 0:5e4f1e288e2a 260 if (str[i] >= 48 && str[i] <= 57) {
e5119053f6 0:5e4f1e288e2a 261 ret += (double)(str[i] - 48) * pow(10.0, n);
e5119053f6 0:5e4f1e288e2a 262 n--;
e5119053f6 0:5e4f1e288e2a 263 }
e5119053f6 0:5e4f1e288e2a 264 }
e5119053f6 0:5e4f1e288e2a 265 if (minus)
e5119053f6 0:5e4f1e288e2a 266 return -1.0 * ret;
e5119053f6 0:5e4f1e288e2a 267 return ret;
e5119053f6 0:5e4f1e288e2a 268 }
e5119053f6 0:5e4f1e288e2a 269
e5119053f6 0:5e4f1e288e2a 270 int mySDclass::str2uint(char *str, int num) {
e5119053f6 0:5e4f1e288e2a 271 num--;
e5119053f6 0:5e4f1e288e2a 272 int ret = 0;
e5119053f6 0:5e4f1e288e2a 273 // bool minus = false;
e5119053f6 0:5e4f1e288e2a 274
e5119053f6 0:5e4f1e288e2a 275 // 整数部を変換
e5119053f6 0:5e4f1e288e2a 276 for (int i = 0; i <= num; i++) {
e5119053f6 0:5e4f1e288e2a 277 if (str[i] >= 48 && str[i] <= 57) {
e5119053f6 0:5e4f1e288e2a 278 ret += (double)(str[i] - 48) * pow(10.0, num - i);
e5119053f6 0:5e4f1e288e2a 279 }
e5119053f6 0:5e4f1e288e2a 280 }
e5119053f6 0:5e4f1e288e2a 281
e5119053f6 0:5e4f1e288e2a 282 return ret;
e5119053f6 0:5e4f1e288e2a 283 }