Train status

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?

UserRevisionLine numberNew 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 }