Train status
tokyoMetro.cpp@0:a59f55690685, 2015-06-26 (annotated)
- Committer:
- takashikojo
- Date:
- Fri Jun 26 09:35:34 2015 +0000
- Revision:
- 0:a59f55690685
- Child:
- 1:26a0a9220f01
TransStat class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takashikojo | 0:a59f55690685 | 1 | #include "mbed.h" |
takashikojo | 0:a59f55690685 | 2 | #include "EthernetInterface.h" |
takashikojo | 0:a59f55690685 | 3 | #include "HTTPClient.h" |
takashikojo | 0:a59f55690685 | 4 | #include "vector" |
takashikojo | 0:a59f55690685 | 5 | #include "picojson.h" |
takashikojo | 0:a59f55690685 | 6 | |
takashikojo | 0:a59f55690685 | 7 | #include "AlarmClock.h" |
takashikojo | 0:a59f55690685 | 8 | |
takashikojo | 0:a59f55690685 | 9 | #define ACCESS_TOKEN "6d60c19c9497e9b2f5b847d31ab70cccce76269bbaf461b5ebd90dd16e71003c" |
takashikojo | 0:a59f55690685 | 10 | #define API_URL "https://api.tokyometroapp.jp:443/api/v2" |
takashikojo | 0:a59f55690685 | 11 | |
takashikojo | 0:a59f55690685 | 12 | #if 0 |
takashikojo | 0:a59f55690685 | 13 | //Enable debug |
takashikojo | 0:a59f55690685 | 14 | #define DBG(x, ...) std::printf("[HTTPClient : DBG]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 0:a59f55690685 | 15 | #define WARN(x, ...) std::printf("[HTTPClient : WARN]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 0:a59f55690685 | 16 | #else |
takashikojo | 0:a59f55690685 | 17 | //Disable debug |
takashikojo | 0:a59f55690685 | 18 | #define DBG(x, ...) |
takashikojo | 0:a59f55690685 | 19 | #define WARN(x, ...) |
takashikojo | 0:a59f55690685 | 20 | #endif |
takashikojo | 0:a59f55690685 | 21 | |
takashikojo | 0:a59f55690685 | 22 | #define ERR(x, ...) std::printf("[HTTPClient : ERR]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 0:a59f55690685 | 23 | |
takashikojo | 0:a59f55690685 | 24 | |
takashikojo | 0:a59f55690685 | 25 | extern AlarmClock alarmclock ; |
takashikojo | 0:a59f55690685 | 26 | static HTTPClient http; |
takashikojo | 0:a59f55690685 | 27 | |
takashikojo | 0:a59f55690685 | 28 | static picojson::value trainStat ; |
takashikojo | 0:a59f55690685 | 29 | |
takashikojo | 0:a59f55690685 | 30 | void TMetro_query(const char *type, const char *query, char *recv, unsigned int size) { |
takashikojo | 0:a59f55690685 | 31 | int ret ; |
takashikojo | 0:a59f55690685 | 32 | #define BUFF_SIZE 256 |
takashikojo | 0:a59f55690685 | 33 | char queryBuff[BUFF_SIZE] ; |
takashikojo | 0:a59f55690685 | 34 | sprintf(queryBuff, "%s/%s?rdf:type=%s&acl:consumerKey=%s", API_URL, type, query, ACCESS_TOKEN) ; |
takashikojo | 0:a59f55690685 | 35 | DBG(queryBuff) ; |
takashikojo | 0:a59f55690685 | 36 | ret = http.get(queryBuff, recv, size); |
takashikojo | 0:a59f55690685 | 37 | if (!ret) { |
takashikojo | 0:a59f55690685 | 38 | DBG("Result: %s\n", recv); |
takashikojo | 0:a59f55690685 | 39 | } else { |
takashikojo | 0:a59f55690685 | 40 | ERR("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode()); |
takashikojo | 0:a59f55690685 | 41 | } |
takashikojo | 0:a59f55690685 | 42 | } |
takashikojo | 0:a59f55690685 | 43 | |
takashikojo | 0:a59f55690685 | 44 | static std::map<std::string, string> lineTbl ; |
takashikojo | 0:a59f55690685 | 45 | void TMetro_initLine(void) { |
takashikojo | 0:a59f55690685 | 46 | lineTbl["odpt.Railway:TokyoMetro.Tozai"] = "東西線 " ; |
takashikojo | 0:a59f55690685 | 47 | lineTbl["odpt.Railway:TokyoMetro.Marunouchi"] = "丸の内線" ; |
takashikojo | 0:a59f55690685 | 48 | lineTbl["odpt.Railway:TokyoMetro.Namboku"] = "南北線 " ; |
takashikojo | 0:a59f55690685 | 49 | lineTbl["odpt.Railway:TokyoMetro.Hibiya"] = "日比谷線" ; |
takashikojo | 0:a59f55690685 | 50 | lineTbl["odpt.Railway:TokyoMetro.Fukutoshin"] = "副都心線" ; |
takashikojo | 0:a59f55690685 | 51 | lineTbl["odpt.Railway:TokyoMetro.Hanzomon"] = "半蔵門線" ; |
takashikojo | 0:a59f55690685 | 52 | lineTbl["odpt.Railway:TokyoMetro.Ginza"] = "銀座線 " ; |
takashikojo | 0:a59f55690685 | 53 | lineTbl["odpt.Railway:TokyoMetro.Yurakucho"] = "有楽町線" ; |
takashikojo | 0:a59f55690685 | 54 | lineTbl["odpt.Railway:TokyoMetro.Chiyoda"] = "千代田線" ; |
takashikojo | 0:a59f55690685 | 55 | } |
takashikojo | 0:a59f55690685 | 56 | |
takashikojo | 0:a59f55690685 | 57 | static string watchingLine = "" ; |
takashikojo | 0:a59f55690685 | 58 | |
takashikojo | 0:a59f55690685 | 59 | void TMetro_setLine(string name) { |
takashikojo | 0:a59f55690685 | 60 | map<string, string>::iterator it = lineTbl.begin(); ; |
takashikojo | 0:a59f55690685 | 61 | |
takashikojo | 0:a59f55690685 | 62 | DBG("TMetro_setLine\n") ; |
takashikojo | 0:a59f55690685 | 63 | for(it = lineTbl.begin(); it != lineTbl.end(); ++it) { |
takashikojo | 0:a59f55690685 | 64 | if(it->second == name){ |
takashikojo | 0:a59f55690685 | 65 | watchingLine = it->first ; |
takashikojo | 0:a59f55690685 | 66 | } |
takashikojo | 0:a59f55690685 | 67 | } |
takashikojo | 0:a59f55690685 | 68 | } |
takashikojo | 0:a59f55690685 | 69 | |
takashikojo | 0:a59f55690685 | 70 | static void printStat(const char *line, const char *stat) { |
takashikojo | 0:a59f55690685 | 71 | #define JST (9*60*60) |
takashikojo | 0:a59f55690685 | 72 | struct tm t; |
takashikojo | 0:a59f55690685 | 73 | time_t ctTime; |
takashikojo | 0:a59f55690685 | 74 | ctTime = time(NULL) + JST ; |
takashikojo | 0:a59f55690685 | 75 | t = *localtime(&ctTime); |
takashikojo | 0:a59f55690685 | 76 | |
takashikojo | 0:a59f55690685 | 77 | printf("%d月%d日%d時%d分:%sの運転状況:%s\n", |
takashikojo | 0:a59f55690685 | 78 | t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, line, stat) ; |
takashikojo | 0:a59f55690685 | 79 | } |
takashikojo | 0:a59f55690685 | 80 | |
takashikojo | 0:a59f55690685 | 81 | bool TMetro_getStat(const char *buff) { |
takashikojo | 0:a59f55690685 | 82 | |
takashikojo | 0:a59f55690685 | 83 | std::string err; |
takashikojo | 0:a59f55690685 | 84 | picojson::parse(trainStat, (const char *)buff, (const char *)buff+strlen(buff), &err); |
takashikojo | 0:a59f55690685 | 85 | if (!err.empty()) { |
takashikojo | 0:a59f55690685 | 86 | ERR("Metro Site Result ERROR: %s", err.c_str()); |
takashikojo | 0:a59f55690685 | 87 | return ; |
takashikojo | 0:a59f55690685 | 88 | } |
takashikojo | 0:a59f55690685 | 89 | picojson::array array = trainStat.get<picojson::array>(); |
takashikojo | 0:a59f55690685 | 90 | for (picojson::array::iterator it = array.begin(); it != array.end(); it++) |
takashikojo | 0:a59f55690685 | 91 | { |
takashikojo | 0:a59f55690685 | 92 | picojson::object& obj = it->get<picojson::object>(); |
takashikojo | 0:a59f55690685 | 93 | if(watchingLine == "") |
takashikojo | 0:a59f55690685 | 94 | printStat( |
takashikojo | 0:a59f55690685 | 95 | lineTbl[obj["odpt:railway"].get<std::string>()].c_str(), |
takashikojo | 0:a59f55690685 | 96 | obj["odpt:trainInformationText"].get<std::string>().c_str()); |
takashikojo | 0:a59f55690685 | 97 | else if(obj["odpt:railway"].get<std::string>()==watchingLine){ |
takashikojo | 0:a59f55690685 | 98 | printStat( |
takashikojo | 0:a59f55690685 | 99 | lineTbl[watchingLine].c_str(), |
takashikojo | 0:a59f55690685 | 100 | obj["odpt:trainInformationText"].get<std::string>().c_str()); |
takashikojo | 0:a59f55690685 | 101 | if(obj["odpt:trainInformationText"].get<std::string>().find("平常どおり") == std::string::npos) |
takashikojo | 0:a59f55690685 | 102 | return false ; |
takashikojo | 0:a59f55690685 | 103 | } |
takashikojo | 0:a59f55690685 | 104 | } |
takashikojo | 0:a59f55690685 | 105 | return true ; |
takashikojo | 0:a59f55690685 | 106 | } |