Bring metar helper into CMake world, and use new HTTP code.
This commit is contained in:
parent
8ef07230c4
commit
c5cbc57895
2 changed files with 78 additions and 1 deletions
|
@ -84,3 +84,13 @@ target_link_libraries(fgfs
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS fgfs RUNTIME DESTINATION bin)
|
install(TARGETS fgfs RUNTIME DESTINATION bin)
|
||||||
|
|
||||||
|
add_executable(metar metar_main.cxx)
|
||||||
|
target_link_libraries(metar
|
||||||
|
${SIMGEAR_LIBRARIES}
|
||||||
|
${SIMGEAR_CORE_LIBRARY_DEPENDENCIES}
|
||||||
|
${PLATFORM_LIBS}
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS metar RUNTIME DESTINATION bin)
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,54 @@
|
||||||
#include <simgear/environment/metar.hxx>
|
#include <simgear/environment/metar.hxx>
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
|
|
||||||
|
#include <simgear/io/HTTPClient.hxx>
|
||||||
|
#include <simgear/io/HTTPRequest.hxx>
|
||||||
|
#include <simgear/timing/timestamp.hxx>
|
||||||
|
#include <simgear/misc/sg_sleep.hxx>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
using namespace simgear;
|
||||||
|
|
||||||
|
class MetarRequest : public HTTP::Request
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool complete;
|
||||||
|
bool failed;
|
||||||
|
string metarData;
|
||||||
|
bool fromProxy;
|
||||||
|
|
||||||
|
MetarRequest(const std::string& stationId) :
|
||||||
|
HTTP::Request("http://weather.noaa.gov/pub/data/observations/metar/stations/" + stationId + ".TXT"),
|
||||||
|
complete(false),
|
||||||
|
failed(false)
|
||||||
|
{
|
||||||
|
fromProxy = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void responseHeader(const string& key, const string& value)
|
||||||
|
{
|
||||||
|
if (key == "x-metarproxy") {
|
||||||
|
fromProxy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void gotBodyData(const char* s, int n)
|
||||||
|
{
|
||||||
|
metarData += string(s, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void responseComplete()
|
||||||
|
{
|
||||||
|
if (responseCode() == 200) {
|
||||||
|
complete = true;
|
||||||
|
} else {
|
||||||
|
SG_LOG(SG_ENVIRONMENT, SG_WARN, "metar download failed:" << url() << ": reason:" << responseReason());
|
||||||
|
failed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// text color
|
// text color
|
||||||
#if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \
|
#if defined(__linux__) || defined(__sun) || defined(__CYGWIN__) \
|
||||||
|
@ -501,6 +548,9 @@ int main(int argc, char *argv[])
|
||||||
string proxy_host, proxy_port;
|
string proxy_host, proxy_port;
|
||||||
getproxy(proxy_host, proxy_port);
|
getproxy(proxy_host, proxy_port);
|
||||||
|
|
||||||
|
HTTP::Client http;
|
||||||
|
http.setProxy(proxy_host, atoi(proxy_port.c_str()));
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++) {
|
for (int i = 1; i < argc; i++) {
|
||||||
if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
|
if (!strcmp(argv[i], "-h") || !strcmp(argv[i], "--help"))
|
||||||
usage();
|
usage();
|
||||||
|
@ -525,7 +575,24 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SGMetar *m = new SGMetar(argv[i], proxy_host, proxy_port, "", time(0));
|
MetarRequest* mr = new MetarRequest(argv[i]);
|
||||||
|
http.makeRequest(mr);
|
||||||
|
|
||||||
|
// spin until the request completes, fails or times out
|
||||||
|
SGTimeStamp start(SGTimeStamp::now());
|
||||||
|
while (start.elapsedMSec() < 8000) {
|
||||||
|
http.update();
|
||||||
|
if (mr->complete || mr->failed) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleepForMSec(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mr->complete) {
|
||||||
|
throw sg_io_exception("metar download failed (or timed out)");
|
||||||
|
}
|
||||||
|
SGMetar *m = new SGMetar(mr->metarData);
|
||||||
|
|
||||||
//SGMetar *m = new SGMetar("2004/01/11 01:20\nLOWG 110120Z AUTO VRB01KT 0050 1600N R35/0600 FG M06/M06 Q1019 88//////\n");
|
//SGMetar *m = new SGMetar("2004/01/11 01:20\nLOWG 110120Z AUTO VRB01KT 0050 1600N R35/0600 FG M06/M06 Q1019 88//////\n");
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
|
|
Loading…
Reference in a new issue