Get weather Information
Diff: WeatherHacks.cpp
- Revision:
- 0:6d53d6d34ac3
- Child:
- 1:8655f1720450
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WeatherHacks.cpp Sat Jun 27 10:34:38 2015 +0000 @@ -0,0 +1,127 @@ +#include <mbed.h> +#include "WeatherHacks.h" + +#include "EthernetInterface.h" +#include "HTTPClient.h" +#include "XMLaide.h" + +#define RSS_URL "http://weather.livedoor.com/forecast/rss/area/130010.xml" + +#if 0 +//Enable debug +#define DBG(x, ...) std::printf("[WeatherHacks : DBG]"x"\r\n", ##__VA_ARGS__); +#define WARN(x, ...) std::printf("[WeatherHacks : WARN]"x"\r\n", ##__VA_ARGS__); +#else +//Disable debug +#define DBG(x, ...) +#define WARN(x, ...) +#endif + +#define ERR(x, ...) std::printf("[WeatherHacks : ERR]"x"\r\n", ##__VA_ARGS__); + +static HTTPClient http; + +void WH_init(void) +{ + +} + +#define LINK_SIZE 100 +static void getLink(const char *buff, char *link) +{ + const char *p = buff ; + p = XML_getTag(p, "item") ; p = XML_getTag(p, "item") ; p = XML_getTag(p, "link") ; + p = XML_getElement(p, link, LINK_SIZE) ; +} + +static const char *getTodayP(const char *p) { + return XML_getTag(p, "table") ; +} + +static const char *getTomorrowP(const char *p) { + p = XML_getTag(p, "table") ; p = XML_getTag(p, "table") ; + return XML_getTag(p, "table") ; +} + +#define TEMP_SIZE 5 +static const char *getHiTemp(const char *p, char *hi) +{ + p = XML_getTag(p, "table") ; p = XML_getTag(p, "td") ; p = XML_getTag(p, "td") ; + p = XML_getTag(p, "span") ; + p = XML_getElement(p, hi, 2) ; + return p ; +} + +static const char *getLoTemp(const char *p, char *lo) +{ + p = XML_getTag(p, "tr") ; p = XML_getTag(p, "tr") ; + p = XML_getTag(p, "td") ; p = XML_getTag(p, "td") ; + p = XML_getTag(p, "span") ; + p = XML_getElement(p, lo, 2) ; + return p ; +} + +static const char *getPrec(const char *p, char *prec) +{ + p = XML_getTag(p, "th") ; p = XML_getTag(p, "th") ; + p = XML_getTag(p, "td") ; p = XML_getTag(p, "td") ; p = XML_getTag(p, "td") ; + p = XML_getElement(p, prec, 2) ; + if(strcmp(prec, "--") == 0)strcpy(prec, " 0") ; + return p ; +} + +static void getInfo(const char *buff, char *hi, char *lo, char *prec) +{ + #define JST (9*60*60) + struct tm t; + time_t ctTime; + ctTime = time(NULL) + JST ; + t = *localtime(&ctTime); + const char *p ; + + if(t.tm_hour >= 12) { + p = getTomorrowP(buff) ; + } else { + p = getTodayP(buff) ; + } + p = getHiTemp(p, hi) ; + p = getLoTemp(p, lo) ; + p = getPrec(p, prec) ; +} + +#define FREE(p) if(p)free(p) +#define BUFF_SIZE 1024*12 + +void WH_getInfo(void) +{ + int ret ; + + char *recv = (char *)malloc(BUFF_SIZE) ; + char *link = (char *)malloc(LINK_SIZE) ; + char hiTemp[TEMP_SIZE] ; + char loTemp[TEMP_SIZE] ; + char prec[TEMP_SIZE] ; + + if((recv == NULL) || (link == NULL)){ + FREE(recv) ; FREE(link) ; + ERR("No Memory, WH_getInfo") ; + return ; + } + + ret = http.get(RSS_URL, recv, BUFF_SIZE); + if (!ret) { + //DBG("Result: %s\n", recv); + } else { + ERR("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode()); + } + getLink(recv, link) ; DBG("link=%s", link) ; + ret = http.get(link, recv, BUFF_SIZE); + if (!ret) { + DBG("Result: %s\n", recv); + } else { + ERR("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode()); + } + getInfo(recv, hiTemp, loTemp, prec) ; + printf("Hi=%s, Lo=%s, Prec=%s\n", hiTemp, loTemp, prec) ; + FREE(recv) ; FREE(link) ; +}