diff --git a/setup.py b/setup.py index 603a89c..a45a27d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from pybind11 import get_cmake_dir from pybind11.setup_helpers import Pybind11Extension, build_ext from setuptools import setup -__version__ = "0.1.1" +__version__ = "0.1.2" ext_modules = [ Pybind11Extension( diff --git a/src/main.cpp b/src/main.cpp index 033e20a..1c33a49 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "stormpci.h" #define STRINGIFY(x) #x @@ -18,6 +20,26 @@ typedef struct { } BlockBinary; +double haversine(double angle){ + return sin(angle / 2.0)*sin(angle / 2.0); +} + +double inverse_haversine(double value){ + return 2.0 * asin(sqrt(value)); +} + + +double distance(double lat1, double lon1, double lat2, double lon2) +{ + double theta = (lon2 - lon1) * M_PI / 180; + double phi1 = lat1 * M_PI / 180; + double phi2 = lat2 * M_PI / 180; + double curve = inverse_haversine(haversine(phi1 - phi2) + + cos(phi1) * cos(phi2) * haversine(theta)); + return curve * 6'371'000; +} + + class BlockReader { public: @@ -155,6 +177,43 @@ PYBIND11_MODULE(stormpci_bin_reader, m) { .def_readonly("EastPol", &StrikeData::EastPol) .def_readonly("EFieldPol", &StrikeData::EFieldPol) .def_readonly("lts2_data", &StrikeData::lts2_data) + .def_property_readonly("_timestamp_ns", [](const StrikeData &strike) { + + std::tm tm {}; + + tm.tm_year = (int)strike.lts2_data.year - 1900; + tm.tm_mon = (int)strike.lts2_data.month - 1; + tm.tm_mday = (int)strike.lts2_data.day; + tm.tm_hour = (int)strike.lts2_data.hours; + tm.tm_min = (int)strike.lts2_data.minutes; + tm.tm_sec = (int)strike.lts2_data.seconds; + tm.tm_isdst = 0; + + std::time_t epoch_s = std::mktime(&tm); + unsigned long long oscillator_ns = ((unsigned long long)strike.lts2_data.TS_time*1'000'000'000)/(unsigned long long)strike.lts2_data.TS_Osc; + unsigned long long timestamp_ns = epoch_s*1'000'000'000 + oscillator_ns; + + return timestamp_ns; + }) + .def_property_readonly("_station_coords", [](const StrikeData &strike) { + + double lat = (double)strike.lts2_data.latitude_mas / 324000000 * 90; + double lon = (double)strike.lts2_data.longitude_mas / 648000000 * 180; + + switch(strike.lts2_data.latitude_ns) + { + case 'N': break; + case 'S': lat = -lat; break; + } + switch(strike.lts2_data.longitude_ew) + { + case 'E': break; + case 'W': lon = -lon; break; + } + return std::pair(lat, lon); + }) + + ;