Hi. This is the feed program for Cosm. (The previous name of the services is Pachube.)

Dependencies:   mbed ThermistorPack Pachube ConfigFile EthernetNetIf TextLCD HTTPClient_ToBeRemoved FatFileSystem SDFileSystem

Committer:
shintamainjp
Date:
Mon Aug 06 12:37:59 2012 +0000
Revision:
0:521ba375aa0f
Pachube renamed to Cosm.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:521ba375aa0f 1 /**
shintamainjp 0:521ba375aa0f 2 * =============================================================================
shintamainjp 0:521ba375aa0f 3 * TORAGI 2011/04 : WEB Data Logger
shintamainjp 0:521ba375aa0f 4 * =============================================================================
shintamainjp 0:521ba375aa0f 5 * Copyright (c) 2010-2011 Shinichiro Nakamura
shintamainjp 0:521ba375aa0f 6 *
shintamainjp 0:521ba375aa0f 7 * Permission is hereby granted, free of charge, to any person obtaining a copy
shintamainjp 0:521ba375aa0f 8 * of this software and associated documentation files (the "Software"), to deal
shintamainjp 0:521ba375aa0f 9 * in the Software without restriction, including without limitation the rights
shintamainjp 0:521ba375aa0f 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
shintamainjp 0:521ba375aa0f 11 * copies of the Software, and to permit persons to whom the Software is
shintamainjp 0:521ba375aa0f 12 * furnished to do so, subject to the following conditions:
shintamainjp 0:521ba375aa0f 13 *
shintamainjp 0:521ba375aa0f 14 * The above copyright notice and this permission notice shall be included in
shintamainjp 0:521ba375aa0f 15 * all copies or substantial portions of the Software.
shintamainjp 0:521ba375aa0f 16 *
shintamainjp 0:521ba375aa0f 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
shintamainjp 0:521ba375aa0f 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
shintamainjp 0:521ba375aa0f 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
shintamainjp 0:521ba375aa0f 20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
shintamainjp 0:521ba375aa0f 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
shintamainjp 0:521ba375aa0f 22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
shintamainjp 0:521ba375aa0f 23 * THE SOFTWARE.
shintamainjp 0:521ba375aa0f 24 * =============================================================================
shintamainjp 0:521ba375aa0f 25 */
shintamainjp 0:521ba375aa0f 26
shintamainjp 0:521ba375aa0f 27 #include "mbed.h"
shintamainjp 0:521ba375aa0f 28 #include "PachubeV2CSV.h"
shintamainjp 0:521ba375aa0f 29 #include "EthernetNetIf.h"
shintamainjp 0:521ba375aa0f 30 #include "HTTPClient.h"
shintamainjp 0:521ba375aa0f 31 #include "ThermistorMCP9701.h"
shintamainjp 0:521ba375aa0f 32 #include "TextLCD.h"
shintamainjp 0:521ba375aa0f 33 #include "appconf.h"
shintamainjp 0:521ba375aa0f 34 #include "SDFileSystem.h"
shintamainjp 0:521ba375aa0f 35
shintamainjp 0:521ba375aa0f 36 /*
shintamainjp 0:521ba375aa0f 37 * Definitions for a configuration file.
shintamainjp 0:521ba375aa0f 38 */
shintamainjp 0:521ba375aa0f 39 #define CONFIG_FILENAME "/local/PACHUBE.CFG"
shintamainjp 0:521ba375aa0f 40 #define DATACSV_FILENAME "/sd/DATA.CSV"
shintamainjp 0:521ba375aa0f 41 const int PACHUBE_CODE_OK = 200;
shintamainjp 0:521ba375aa0f 42
shintamainjp 0:521ba375aa0f 43 LocalFileSystem localfs("local");
shintamainjp 0:521ba375aa0f 44 SDFileSystem sdfs(p5, p6, p7, p8, "sd");
shintamainjp 0:521ba375aa0f 45 TextLCD lcd(p24, p26, p27, p28, p29, p30);
shintamainjp 0:521ba375aa0f 46 EthernetNetIf netif;
shintamainjp 0:521ba375aa0f 47 BusOut led(LED1, LED2, LED3, LED4);
shintamainjp 0:521ba375aa0f 48 ThermistorMCP9701 thermistor1(p16);
shintamainjp 0:521ba375aa0f 49 ThermistorMCP9701 thermistor2(p17);
shintamainjp 0:521ba375aa0f 50 ThermistorMCP9701 thermistor3(p18);
shintamainjp 0:521ba375aa0f 51 ThermistorMCP9701 thermistor4(p19);
shintamainjp 0:521ba375aa0f 52 ThermistorMCP9701 thermistor5(p20);
shintamainjp 0:521ba375aa0f 53 static appconf_t appconf;
shintamainjp 0:521ba375aa0f 54
shintamainjp 0:521ba375aa0f 55 /**
shintamainjp 0:521ba375aa0f 56 * Display a splash screen.
shintamainjp 0:521ba375aa0f 57 */
shintamainjp 0:521ba375aa0f 58 void splash(void) {
shintamainjp 0:521ba375aa0f 59 lcd.cls();
shintamainjp 0:521ba375aa0f 60 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 61 lcd.printf(" TORAGI 2012/08 ");
shintamainjp 0:521ba375aa0f 62 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 63 lcd.printf("WEB Data Logger ");
shintamainjp 0:521ba375aa0f 64 wait(2);
shintamainjp 0:521ba375aa0f 65
shintamainjp 0:521ba375aa0f 66 lcd.cls();
shintamainjp 0:521ba375aa0f 67 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 68 lcd.printf(" Starting up... ");
shintamainjp 0:521ba375aa0f 69 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 70 lcd.printf(" Wait a moment. ");
shintamainjp 0:521ba375aa0f 71 wait(2);
shintamainjp 0:521ba375aa0f 72 }
shintamainjp 0:521ba375aa0f 73
shintamainjp 0:521ba375aa0f 74 /**
shintamainjp 0:521ba375aa0f 75 * Convert double to char.
shintamainjp 0:521ba375aa0f 76 *
shintamainjp 0:521ba375aa0f 77 * @param val Value.
shintamainjp 0:521ba375aa0f 78 * @param buf A pointer to a buffer.
shintamainjp 0:521ba375aa0f 79 * @param bufsiz The buffer size.
shintamainjp 0:521ba375aa0f 80 */
shintamainjp 0:521ba375aa0f 81 void convertDoubleToChar(double val, char *buf, size_t bufsiz) {
shintamainjp 0:521ba375aa0f 82 snprintf(buf, bufsiz, "%f", val);
shintamainjp 0:521ba375aa0f 83 }
shintamainjp 0:521ba375aa0f 84
shintamainjp 0:521ba375aa0f 85 /**
shintamainjp 0:521ba375aa0f 86 * Post to the feed on Pachube.
shintamainjp 0:521ba375aa0f 87 *
shintamainjp 0:521ba375aa0f 88 * @param web Pointer to a Pachube object.
shintamainjp 0:521ba375aa0f 89 * @param feed_id Feed ID.
shintamainjp 0:521ba375aa0f 90 * @param stream_no Stream number.
shintamainjp 0:521ba375aa0f 91 * @param value value.
shintamainjp 0:521ba375aa0f 92 *
shintamainjp 0:521ba375aa0f 93 * @return Pachube code.
shintamainjp 0:521ba375aa0f 94 */
shintamainjp 0:521ba375aa0f 95 int web_post(PachubeV2CSV *web, int feed_id, int stream_no, double value) {
shintamainjp 0:521ba375aa0f 96 char value_text[16];
shintamainjp 0:521ba375aa0f 97 convertDoubleToChar(value, value_text, sizeof(value_text));
shintamainjp 0:521ba375aa0f 98 char stream_no_text[8];
shintamainjp 0:521ba375aa0f 99 stream_no_text[0] = "0123456789"[stream_no];
shintamainjp 0:521ba375aa0f 100 stream_no_text[1] = '\0';
shintamainjp 0:521ba375aa0f 101 return web->updateDataStream(feed_id, stream_no_text, std::string(value_text));
shintamainjp 0:521ba375aa0f 102 }
shintamainjp 0:521ba375aa0f 103
shintamainjp 0:521ba375aa0f 104 /**
shintamainjp 0:521ba375aa0f 105 * Write to the file.
shintamainjp 0:521ba375aa0f 106 *
shintamainjp 0:521ba375aa0f 107 * @param v1 value no. 1.
shintamainjp 0:521ba375aa0f 108 * @param v2 value no. 2.
shintamainjp 0:521ba375aa0f 109 * @param v3 value no. 3.
shintamainjp 0:521ba375aa0f 110 * @param v4 value no. 4.
shintamainjp 0:521ba375aa0f 111 * @param v5 value no. 5.
shintamainjp 0:521ba375aa0f 112 *
shintamainjp 0:521ba375aa0f 113 * @return Return 0 if it succeed.
shintamainjp 0:521ba375aa0f 114 */
shintamainjp 0:521ba375aa0f 115 int file_write(int v1, int v2, int v3, int v4, int v5) {
shintamainjp 0:521ba375aa0f 116 FILE *fp = fopen(DATACSV_FILENAME, "a");
shintamainjp 0:521ba375aa0f 117 if (fp == NULL) {
shintamainjp 0:521ba375aa0f 118 return -1;
shintamainjp 0:521ba375aa0f 119 }
shintamainjp 0:521ba375aa0f 120 fprintf(fp, "%d, %d, %d, %d, %d\n", v1, v2, v3, v4, v5);
shintamainjp 0:521ba375aa0f 121 fclose(fp);
shintamainjp 0:521ba375aa0f 122 return 0;
shintamainjp 0:521ba375aa0f 123 }
shintamainjp 0:521ba375aa0f 124
shintamainjp 0:521ba375aa0f 125 /**
shintamainjp 0:521ba375aa0f 126 * Entry point.
shintamainjp 0:521ba375aa0f 127 */
shintamainjp 0:521ba375aa0f 128 int main() {
shintamainjp 0:521ba375aa0f 129
shintamainjp 0:521ba375aa0f 130 /*
shintamainjp 0:521ba375aa0f 131 * Splash.
shintamainjp 0:521ba375aa0f 132 */
shintamainjp 0:521ba375aa0f 133 splash();
shintamainjp 0:521ba375aa0f 134 wait(5);
shintamainjp 0:521ba375aa0f 135
shintamainjp 0:521ba375aa0f 136 /*
shintamainjp 0:521ba375aa0f 137 * Initialize ethernet interface.
shintamainjp 0:521ba375aa0f 138 */
shintamainjp 0:521ba375aa0f 139 lcd.cls();
shintamainjp 0:521ba375aa0f 140 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 141 lcd.printf("Initializing...");
shintamainjp 0:521ba375aa0f 142 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 143 lcd.printf("Ethernet: ");
shintamainjp 0:521ba375aa0f 144 EthernetErr ethErr = netif.setup();
shintamainjp 0:521ba375aa0f 145 if (ethErr) {
shintamainjp 0:521ba375aa0f 146 lcd.printf("[NG]");
shintamainjp 0:521ba375aa0f 147 error("Ethernet setup failed. Done with code %d.\n", ethErr);
shintamainjp 0:521ba375aa0f 148 }
shintamainjp 0:521ba375aa0f 149 lcd.printf("[OK]");
shintamainjp 0:521ba375aa0f 150 wait(3);
shintamainjp 0:521ba375aa0f 151
shintamainjp 0:521ba375aa0f 152 /*
shintamainjp 0:521ba375aa0f 153 * Read configuration variables from a file.
shintamainjp 0:521ba375aa0f 154 */
shintamainjp 0:521ba375aa0f 155 lcd.cls();
shintamainjp 0:521ba375aa0f 156 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 157 lcd.printf("Reading...");
shintamainjp 0:521ba375aa0f 158 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 159 lcd.printf("Setup: ");
shintamainjp 0:521ba375aa0f 160 appconf_init(&appconf);
shintamainjp 0:521ba375aa0f 161 if (appconf_read(CONFIG_FILENAME, &appconf) != 0) {
shintamainjp 0:521ba375aa0f 162 lcd.printf("[NG]");
shintamainjp 0:521ba375aa0f 163 error("Failure to read a configuration file.\n");
shintamainjp 0:521ba375aa0f 164 }
shintamainjp 0:521ba375aa0f 165 lcd.printf("[OK]");
shintamainjp 0:521ba375aa0f 166 wait(3);
shintamainjp 0:521ba375aa0f 167
shintamainjp 0:521ba375aa0f 168 /*
shintamainjp 0:521ba375aa0f 169 * Initialize objects.
shintamainjp 0:521ba375aa0f 170 */
shintamainjp 0:521ba375aa0f 171 PachubeV2CSV web(appconf.apikey);
shintamainjp 0:521ba375aa0f 172 const int feed_id = atoi(appconf.feedid);
shintamainjp 0:521ba375aa0f 173
shintamainjp 0:521ba375aa0f 174 /*
shintamainjp 0:521ba375aa0f 175 * Check the pachube feautures.
shintamainjp 0:521ba375aa0f 176 */
shintamainjp 0:521ba375aa0f 177 {
shintamainjp 0:521ba375aa0f 178 lcd.cls();
shintamainjp 0:521ba375aa0f 179 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 180 lcd.printf("Checking Pachube");
shintamainjp 0:521ba375aa0f 181 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 182 lcd.printf("Status:");
shintamainjp 0:521ba375aa0f 183 int errcnt = 0;
shintamainjp 0:521ba375aa0f 184 if (web_post(&web, feed_id, 0, thermistor1.read()) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 185 lcd.printf("o");
shintamainjp 0:521ba375aa0f 186 } else {
shintamainjp 0:521ba375aa0f 187 lcd.printf("x");
shintamainjp 0:521ba375aa0f 188 errcnt++;
shintamainjp 0:521ba375aa0f 189 }
shintamainjp 0:521ba375aa0f 190 if (web_post(&web, feed_id, 1, thermistor2.read()) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 191 lcd.printf("o");
shintamainjp 0:521ba375aa0f 192 } else {
shintamainjp 0:521ba375aa0f 193 lcd.printf("x");
shintamainjp 0:521ba375aa0f 194 errcnt++;
shintamainjp 0:521ba375aa0f 195 }
shintamainjp 0:521ba375aa0f 196 if (web_post(&web, feed_id, 2, thermistor3.read()) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 197 lcd.printf("o");
shintamainjp 0:521ba375aa0f 198 } else {
shintamainjp 0:521ba375aa0f 199 lcd.printf("x");
shintamainjp 0:521ba375aa0f 200 errcnt++;
shintamainjp 0:521ba375aa0f 201 }
shintamainjp 0:521ba375aa0f 202 if (web_post(&web, feed_id, 3, thermistor4.read()) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 203 lcd.printf("o");
shintamainjp 0:521ba375aa0f 204 } else {
shintamainjp 0:521ba375aa0f 205 lcd.printf("x");
shintamainjp 0:521ba375aa0f 206 errcnt++;
shintamainjp 0:521ba375aa0f 207 }
shintamainjp 0:521ba375aa0f 208 if (web_post(&web, feed_id, 4, thermistor5.read()) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 209 lcd.printf("o");
shintamainjp 0:521ba375aa0f 210 } else {
shintamainjp 0:521ba375aa0f 211 lcd.printf("x");
shintamainjp 0:521ba375aa0f 212 errcnt++;
shintamainjp 0:521ba375aa0f 213 }
shintamainjp 0:521ba375aa0f 214 if (errcnt == 5) {
shintamainjp 0:521ba375aa0f 215 lcd.printf("[NG]");
shintamainjp 0:521ba375aa0f 216 error("Inavlid pachube configuration.\n");
shintamainjp 0:521ba375aa0f 217 }
shintamainjp 0:521ba375aa0f 218 lcd.printf("[OK]");
shintamainjp 0:521ba375aa0f 219 wait(3);
shintamainjp 0:521ba375aa0f 220 }
shintamainjp 0:521ba375aa0f 221
shintamainjp 0:521ba375aa0f 222 int cnt = 0;
shintamainjp 0:521ba375aa0f 223 do {
shintamainjp 0:521ba375aa0f 224 /*
shintamainjp 0:521ba375aa0f 225 * Sense.
shintamainjp 0:521ba375aa0f 226 */
shintamainjp 0:521ba375aa0f 227 lcd.cls();
shintamainjp 0:521ba375aa0f 228 double v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0;
shintamainjp 0:521ba375aa0f 229 for (int i = 0; i < appconf.interval; i++) {
shintamainjp 0:521ba375aa0f 230 led = 1 << (i % 4);
shintamainjp 0:521ba375aa0f 231 // printf("%d/%d\n", i + 1, appconf.interval);
shintamainjp 0:521ba375aa0f 232 v1 += thermistor1.read();
shintamainjp 0:521ba375aa0f 233 v2 += thermistor2.read();
shintamainjp 0:521ba375aa0f 234 v3 += thermistor3.read();
shintamainjp 0:521ba375aa0f 235 v4 += thermistor4.read();
shintamainjp 0:521ba375aa0f 236 v5 += thermistor5.read();
shintamainjp 0:521ba375aa0f 237 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 238 lcd.printf("| 0| 1| 2| 3| 4|");
shintamainjp 0:521ba375aa0f 239 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 240 lcd.printf("|%-2.0f|%-2.0f|%-2.0f|%-2.0f|%-2.0f|",
shintamainjp 0:521ba375aa0f 241 v1 / (i + 1),
shintamainjp 0:521ba375aa0f 242 v2 / (i + 1),
shintamainjp 0:521ba375aa0f 243 v3 / (i + 1),
shintamainjp 0:521ba375aa0f 244 v4 / (i + 1),
shintamainjp 0:521ba375aa0f 245 v5 / (i + 1));
shintamainjp 0:521ba375aa0f 246 wait(1);
shintamainjp 0:521ba375aa0f 247 }
shintamainjp 0:521ba375aa0f 248 v1 /= appconf.interval;
shintamainjp 0:521ba375aa0f 249 v2 /= appconf.interval;
shintamainjp 0:521ba375aa0f 250 v3 /= appconf.interval;
shintamainjp 0:521ba375aa0f 251 v4 /= appconf.interval;
shintamainjp 0:521ba375aa0f 252 v5 /= appconf.interval;
shintamainjp 0:521ba375aa0f 253 cnt++;
shintamainjp 0:521ba375aa0f 254
shintamainjp 0:521ba375aa0f 255 /*
shintamainjp 0:521ba375aa0f 256 * Post.
shintamainjp 0:521ba375aa0f 257 */
shintamainjp 0:521ba375aa0f 258 lcd.cls();
shintamainjp 0:521ba375aa0f 259 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 260 lcd.printf("Posting No.%d", cnt);
shintamainjp 0:521ba375aa0f 261 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 262 lcd.printf("Status:");
shintamainjp 0:521ba375aa0f 263 int errcnt = 0;
shintamainjp 0:521ba375aa0f 264 if (web_post(&web, feed_id, 0, v1) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 265 lcd.printf("o");
shintamainjp 0:521ba375aa0f 266 } else {
shintamainjp 0:521ba375aa0f 267 lcd.printf("x");
shintamainjp 0:521ba375aa0f 268 errcnt++;
shintamainjp 0:521ba375aa0f 269 }
shintamainjp 0:521ba375aa0f 270 if (web_post(&web, feed_id, 1, v2) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 271 lcd.printf("o");
shintamainjp 0:521ba375aa0f 272 } else {
shintamainjp 0:521ba375aa0f 273 lcd.printf("x");
shintamainjp 0:521ba375aa0f 274 errcnt++;
shintamainjp 0:521ba375aa0f 275 }
shintamainjp 0:521ba375aa0f 276 if (web_post(&web, feed_id, 2, v3) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 277 lcd.printf("o");
shintamainjp 0:521ba375aa0f 278 } else {
shintamainjp 0:521ba375aa0f 279 lcd.printf("x");
shintamainjp 0:521ba375aa0f 280 errcnt++;
shintamainjp 0:521ba375aa0f 281 }
shintamainjp 0:521ba375aa0f 282 if (web_post(&web, feed_id, 3, v4) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 283 lcd.printf("o");
shintamainjp 0:521ba375aa0f 284 } else {
shintamainjp 0:521ba375aa0f 285 lcd.printf("x");
shintamainjp 0:521ba375aa0f 286 errcnt++;
shintamainjp 0:521ba375aa0f 287 }
shintamainjp 0:521ba375aa0f 288 if (web_post(&web, feed_id, 4, v5) == PACHUBE_CODE_OK) {
shintamainjp 0:521ba375aa0f 289 lcd.printf("o");
shintamainjp 0:521ba375aa0f 290 } else {
shintamainjp 0:521ba375aa0f 291 lcd.printf("x");
shintamainjp 0:521ba375aa0f 292 errcnt++;
shintamainjp 0:521ba375aa0f 293 }
shintamainjp 0:521ba375aa0f 294 if (errcnt == 5) {
shintamainjp 0:521ba375aa0f 295 lcd.printf("[NG]");
shintamainjp 0:521ba375aa0f 296 }
shintamainjp 0:521ba375aa0f 297 lcd.printf("[OK]");
shintamainjp 0:521ba375aa0f 298 wait(1);
shintamainjp 0:521ba375aa0f 299
shintamainjp 0:521ba375aa0f 300 /*
shintamainjp 0:521ba375aa0f 301 * Write.
shintamainjp 0:521ba375aa0f 302 */
shintamainjp 0:521ba375aa0f 303 lcd.cls();
shintamainjp 0:521ba375aa0f 304 lcd.locate(0, 0);
shintamainjp 0:521ba375aa0f 305 lcd.printf("Writing No.%d", cnt);
shintamainjp 0:521ba375aa0f 306 lcd.locate(0, 1);
shintamainjp 0:521ba375aa0f 307 lcd.printf("Status: ");
shintamainjp 0:521ba375aa0f 308 if (file_write(v1, v2, v3, v4, v5) == 0) {
shintamainjp 0:521ba375aa0f 309 lcd.printf("[OK]");
shintamainjp 0:521ba375aa0f 310 } else {
shintamainjp 0:521ba375aa0f 311 lcd.printf("[NG]");
shintamainjp 0:521ba375aa0f 312 }
shintamainjp 0:521ba375aa0f 313 wait(1);
shintamainjp 0:521ba375aa0f 314 } while (1);
shintamainjp 0:521ba375aa0f 315 }