diff --git a/cxx/CMakeLists.txt b/cxx/CMakeLists.txt index e0542c1..37bc5f3 100644 --- a/cxx/CMakeLists.txt +++ b/cxx/CMakeLists.txt @@ -114,10 +114,10 @@ set(CNTR_PROTO_LIB_SRC set(CNTR_PROTO_LIB comm_proto) add_library(${CNTR_PROTO_LIB} STATIC ${CNTR_PROTO_LIB_SRC}) -set(MOUNT_SERVER_APP_SRC mount.h mount_server.cpp comm_server.h comm_server_endpoint.h mount_astrom.h) +set(MOUNT_SERVER_APP_SRC mount.h mount_server.cpp comm_server.h comm_server_endpoint.h comm_server_configfile.h mount_astrom.h + mount_astrom_default.h) set(MOUNT_SERVER_APP mount_server) -add_executable(${MOUNT_SERVER_APP} ${MOUNT_SERVER_APP_SRC} - comm_server_configfile.h) +add_executable(${MOUNT_SERVER_APP} ${MOUNT_SERVER_APP_SRC}) target_link_libraries(${MOUNT_SERVER_APP} ${CNTR_PROTO_LIB} spdlog::spdlog_header_only) if (WITH_TESTS) diff --git a/cxx/mount.h b/cxx/mount.h index 6ba41df..62dfa4b 100644 --- a/cxx/mount.h +++ b/cxx/mount.h @@ -6,11 +6,14 @@ #include #include #include +#include #include #include #include "spdlog/sinks/null_sink.h" +#include "mcc_spdlog.h" #include "mount_astrom.h" +#include "mount_astrom_default.h" // low-level functions namespace lowlevel @@ -23,8 +26,8 @@ namespace lowlevel namespace mcc { -enum class MccMountType : uint8_t { GERMAN_TYPE, FORK_TYPE, CROSSAXIS_TYPE, ALTAZ_TYPE }; - +namespace traits +{ // mount state type concept template @@ -35,22 +38,24 @@ concept mcc_mount_state_c = requires(T t, const T t_const) { { t.exit() } -> std::same_as; }; +} // namespace traits -// meteo parameters (to compute refraction) + +/* SOME BASIC DATA STRUCTURES DEFINITIONS */ + +// meteo parameters (e.g. to compute refraction) struct MccMountMeteo { - typedef double temp_t; // Temperature in C - typedef double humid_t; // humidity in % - typedef double press_t; // atmospheric presure in hPa=mB + typedef double temp_t; + typedef double humid_t; + typedef double press_t; - temp_t temperature; - humid_t humidity; - press_t pressure; + temp_t temperature; // Temperature in C + humid_t humidity; // humidity in % + press_t pressure; // atmospheric presure in hPa=mB }; // mount current position and related quantities -class MccMountPosition -{ -public: +struct MccMountPosition { typedef double mnt_coord_t; typedef double mnt_speed_t; typedef double time_point_t; @@ -81,31 +86,16 @@ public: // PCS (pointing correction system) corrections mnt_coord_t pcsX, pcsY; // X - HA, Y - DEC for equatorial-type mount; X - AZ, Y - ZD for horizontal-type one - - bool update(const std::chrono::system_clock::time_point& utc_time) - { - // - - astro::mcc_julday(utc_time, mjd); - - return true; - } - -protected: - bool updateTime(const std::chrono::system_clock::time_point& utc_time) - { - // UTC to TAI - double tai; - - return true; - } }; +/* MOUNT BASE TEMPLATED CLASS WITH BASIC FUNCTIONALITY */ + +enum class MccMountType : uint8_t { GERMAN_TYPE, FORK_TYPE, CROSSAXIS_TYPE, ALTAZ_TYPE }; // implements a Finite State Machine Pattern template -class MccMount +class MccMount : public utils::MccSpdlogLogger { typedef double mnt_coord_t; typedef double mnt_speed_t; @@ -114,11 +104,6 @@ class MccMount public: static constexpr MccMountType mountType = MOUNT_TYPE; - /* low-level hardware related constants */ - - // number of attempts to get low-level hardware data before emit an error - static constexpr uint8_t LOWLEVEL_HW_POLL_ATTEMPTS = 10; - /* mount main-cycle variable quantities (mount orientation) */ struct mount_orient_t { // time-related @@ -151,19 +136,99 @@ public: struct mount_config_t { - uint8_t hw_poll_attempts = LOWLEVEL_HW_POLL_ATTEMPTS; + std::string leap_seconds_filename{}; // empty to use hardcoded default value! + std::string earth_orient_filename{}; // empty to use hardcoded default value! }; + /* Constructors and destructor */ - MccMount(std::shared_ptr logger = spdlog::null_logger_mt("NULL")) - : _mountLogger(logger), _exitCurrentState([]() {}) + MccMount(traits::mcc_input_char_range auto const& logger_mark = "[MOUNT]", + std::shared_ptr logger = spdlog::null_logger_mt("NULL")) + : utils::MccSpdlogLogger(logger), _exitCurrentState([]() {}) { + std::istringstream strst; + + addMarkToPatternIdx(logger_mark); + + + logDebug("Create MccMount class instance: thread = {}", std::this_thread::get_id()); + + + // init time scales related databases to default (pre-defined) state + + logInfo("initializing leap seconds database to default state ..."); + strst.str(defaults::MCC_DEFAULT_LEAP_SECONDS_FILE); + _leapSecondsDB = astro::mcc_parse_leapsecs(strst); + logInfo("leap seconds default database expired date: {}", _leapSecondsDB.expireDate); + + logInfo("initializing Earth orientation (pole coordinates, UT1-UTC) database to default state ..."); + strst.clear(); + strst.str(defaults::MCC_DEFAULT_IERS_BULLETIN_A_FILE); + _earthOrientDB = astro::mcc_parse_bulletinA(strst); + logInfo("Earth orientation default database (Bulletin A) date: {}", _earthOrientDB.bulletinDate); + + // load time scales relates databases from files + std::ifstream fst; + + logInfo("Load leap seconds and Earth orientation databases ..."); + + auto time_db_loader = [&fst, this](const std::string& filename, std::string_view type, auto& db) { + if (filename.empty()) { + logWarn("An empty {} filename! Skip and keep default values!", type); + return; + } + + fst.open(filename); + if (!fst.is_open()) { + logError("CANNOT open {} file '{}'!", type, filename); + logWarn("Keep {} database in default state!", type); + return; + } + + if constexpr (std::same_as>) { + db = astro::mcc_parse_leapsecs(fst); + } else if constexpr (std::same_as>) { + db = astro::mcc_parse_bulletinA(fst); + } else { + static_assert(false, "INVALID DATABASE TYPE!!!"); + } + + if (db.state != astro::IERS_DB_STATE_OK) { + logError("CANNOT parse {} file '{}'!", type, filename); + logWarn("Keep {} database in default state!", type); + } else { + logInfo("{} database was successfully loaded from '{}' file", type, filename); + } + + fst.close(); + }; + + astro::leapsecond_db_t ldb; + astro::earth_orient_db_t edb; + + time_db_loader(_mountCurrentConfig.leap_seconds_filename, "leap seconds", ldb); + if (ldb.state == astro::IERS_DB_STATE_OK) { + _leapSecondsDB = std::move(ldb); + logInfo("leap seconds default database expired date: {}", _leapSecondsDB.expireDate); + } + + time_db_loader(_mountCurrentConfig.earth_orient_filename, "Earth orientation", edb); + if (edb.state == astro::IERS_DB_STATE_OK) { + _earthOrientDB = std::move(edb); + logInfo("Earth orientation default database (Bulletin A) date: {}", _earthOrientDB.bulletinDate); + } } - virtual ~MccMount() {} + virtual ~MccMount() + { + logDebug("Delete MccMount class instance: thread = {}", std::this_thread::get_id()); + } - template + + /* Public methods */ + + template void setMountState(StateT& state) { _exitCurrentState(); // exit from current state @@ -188,34 +253,16 @@ public: protected: mount_config_t _mountCurrentConfig; - std::shared_ptr _mountLogger; + // std::shared_ptr _mountLogger; std::function _exitCurrentState; + // time scales related databases + astro::leapsecond_db_t _leapSecondsDB; + astro::earth_orient_db_t _earthOrientDB; + std::atomic _currentMountOrient; std::atomic _currentMeteo; - - void updateMountState() - { - mount_orient_t orient; - lowlevel::mountdata_t hw_mdata; - - // get data from encoders - decltype(mount_config_t::hw_poll_attempts) n_attempts = 0; - do { - auto ret_code = lowlevel::Mount.getMountData(&hw_mdata); - if (ret_code != lowlevel::MCC_E_OK) { - ++n_attempts; - } - } while (n_attempts < _mountCurrentConfig.hw_poll_attempts); - - if (n_attempts >= _mountCurrentConfig.hw_poll_attempts) { - // log error heres - return; - } - - _currentMountOrient.store(orient); - } }; } // namespace mcc diff --git a/cxx/mount_astrom.h b/cxx/mount_astrom.h index 112dec2..faa1d9c 100644 --- a/cxx/mount_astrom.h +++ b/cxx/mount_astrom.h @@ -7,7 +7,6 @@ *********************************/ #include -#include #include #include "utils.h" @@ -136,6 +135,9 @@ static int mcc_julday(const std::chrono::system_clock::time_point& start_time, /* * angles are in degrees or sexagimal string form + * + * returns + * NaN if object is non-rising or "alt_limit" < 0, Inf is circumpolar */ template ::quiet_NaN(); + } + if constexpr (std::floating_point) { ra = RA * utils::deg2radCoeff; } else { @@ -180,6 +186,16 @@ double mcc_time_to_alt_limit(const AT& alt_limit, lat *= utils::deg2radCoeff; } + if (lat >= 0.0) { // north hemisphere + if (dec < (lat - std::numbers::pi / 2.0)) { // never rises above horizont + return std::numeric_limits::quiet_NaN(); + } + } else { // south hemisphere + if (dec > (lat + std::numbers::pi / 2.0)) { // never rises above horizont + return std::numeric_limits::quiet_NaN(); + } + } + double cos_ha = (std::sin(alt) - std::sin(dec) * std::sin(lat)) / std::cos(dec) / std::cos(lat); if (std::abs(cos_ha) > 1.0) { // circumpolar (it never sets below horizon) return std::numeric_limits::infinity(); @@ -199,6 +215,8 @@ double mcc_time_to_alt_limit(const AT& alt_limit, * */ +enum iers_db_state_t { IERS_DB_STATE_UNINITIALIZED, IERS_DB_STATE_OK, IERS_DB_STATE_PARSE_ERROR }; + struct leapsecond_db_elem_t { double mjd; unsigned day, month; @@ -207,30 +225,13 @@ struct leapsecond_db_elem_t { double tai_utc; // TAI-UTC in seconds }; -// typedef std::vector leapsecond_db_t; - struct leapsecond_db_t { - std::chrono::system_clock::time_point expireDate; - std::vector db; + iers_db_state_t state = IERS_DB_STATE_UNINITIALIZED; + std::chrono::system_clock::time_point expireDate{}; + std::vector db{}; }; -// init to some known state -static leapsecond_db_t CURRENT_LEAPSECONDS_DB; -// = { -// {41317.0, 1, 1, 1972, 10}, {41499.0, 1, 7, 1972, 11}, {41683.0, 1, 1, 1973, 12}, -// {42048.0, 1, 1, 1974, 13}, {42413.0, 1, 1, 1975, 14}, {42778.0, 1, 1, 1976, 15}, -// {43144.0, 1, 1, 1977, 16}, {43509.0, 1, 1, 1978, 17}, {43874.0, 1, 1, 1979, 18}, -// {44239.0, 1, 1, 1980, 19}, {44786.0, 1, 7, 1981, 20}, {45151.0, 1, 7, 1982, 21}, -// {45516.0, 1, 7, 1983, 22}, {46247.0, 1, 7, 1985, 23}, {47161.0, 1, 1, 1988, 24}, -// {47892.0, 1, 1, 1990, 25}, {48257.0, 1, 1, 1991, 26}, {48804.0, 1, 7, 1992, 27}, -// {49169.0, 1, 7, 1993, 28}, {49534.0, 1, 7, 1994, 29}, {50083.0, 1, 1, 1996, 30}, -// {50630.0, 1, 7, 1997, 31}, {51179.0, 1, 1, 1999, 32}, {53736.0, 1, 1, 2006, 33}, -// {54832.0, 1, 1, 2009, 34}, {56109.0, 1, 7, 2012, 35}, {57204.0, 1, 7, 2015, 36}, -// {57754.0, 1, 1, 2017, 37} - -// }; - struct earth_orient_db_elem_t { int year; @@ -242,19 +243,23 @@ struct earth_orient_db_elem_t { struct earth_orient_db_t { + iers_db_state_t state = IERS_DB_STATE_UNINITIALIZED; std::chrono::system_clock::time_point bulletinDate{}; + double tt_tai = 0.0; // TT-TAI std::vector db{}; }; -static earth_orient_db_t CURRENT_EARTH_ORIENT_DB; -static bool mcc_parse_bulletinA(std::derived_from> auto& stream, char comment_sym = '*') +static earth_orient_db_t mcc_parse_bulletinA(std::derived_from> auto& stream, + char comment_sym = '*') { const std::regex bull_date_rx{ "^ *[0-9]{1,2} +(January|February|March|April|May|June|July|August|September|October|November|December) " "+[0-9]{4,} +Vol\\. +[XMLCDVI]+ +No\\. +[0-9]+ *$"}; + const std::regex bull_tt_tai_rx{"^ *TT += +TAI +\\+ +[0-9]+\\.[0-9]+ +seconds *$"}; + const std::regex bull_tab_title_rx{"^ *MJD +x\\(arcsec\\) +y\\(arcsec\\) +UT1-UTC\\(sec\\) *$"}; // 2025 3 7 60741 0.0663 0.3341 0.04348 @@ -302,6 +307,13 @@ static bool mcc_parse_bulletinA(std::derived_from> auto continue; } + if (std::regex_match(sv.begin(), sv.end(), bull_tt_tai_rx)) { + is.str({sv.begin(), sv.end()}); + std::string dummy; + is >> dummy >> dummy >> dummy >> dummy >> db.tt_tai; + continue; + } + if (std::regex_match(sv.begin(), sv.end(), bull_tab_title_rx)) { tab_state = TAB_STATE_START; continue; @@ -313,16 +325,17 @@ static bool mcc_parse_bulletinA(std::derived_from> auto } if (db.db.empty()) { - return false; + db.state = IERS_DB_STATE_PARSE_ERROR; + } else { + db.state = IERS_DB_STATE_OK; } - CURRENT_EARTH_ORIENT_DB = std::move(db); - - return true; + return db; } -static bool mcc_parse_leapsecs(std::derived_from> auto& stream, char comment_sym = '#') +static leapsecond_db_t mcc_parse_leapsecs(std::derived_from> auto& stream, + char comment_sym = '#') { // # File expires on 28 December 2025 const std::regex expr_date_rx{ @@ -369,12 +382,12 @@ static bool mcc_parse_leapsecs(std::derived_from> auto& } if (db.db.empty()) { - return false; + db.state = IERS_DB_STATE_PARSE_ERROR; + } else { + db.state = IERS_DB_STATE_OK; } - CURRENT_LEAPSECONDS_DB = std::move(db); - - return true; + return db; } diff --git a/cxx/mount_astrom_default.h b/cxx/mount_astrom_default.h new file mode 100644 index 0000000..bbbd9b3 --- /dev/null +++ b/cxx/mount_astrom_default.h @@ -0,0 +1,538 @@ +#pragma once + +#include + +namespace mcc::defaults +{ + +// https://hpiers.obspm.fr/iers/bul/bulc/Leap_Second.dat +static std::string MCC_DEFAULT_LEAP_SECONDS_FILE = R"--( +# Value of TAI-UTC in second valid beetween the initial value until +# the epoch given on the next line. The last line reads that NO +# leap second was introduced since the corresponding date +# Updated through IERS Bulletin 69 issued in January 2025 +# +# +# File expires on 28 December 2025 +# +# +# MJD Date TAI-UTC (s) +# day month year +# --- -------------- ------ +# + 41317.0 1 1 1972 10 + 41499.0 1 7 1972 11 + 41683.0 1 1 1973 12 + 42048.0 1 1 1974 13 + 42413.0 1 1 1975 14 + 42778.0 1 1 1976 15 + 43144.0 1 1 1977 16 + 43509.0 1 1 1978 17 + 43874.0 1 1 1979 18 + 44239.0 1 1 1980 19 + 44786.0 1 7 1981 20 + 45151.0 1 7 1982 21 + 45516.0 1 7 1983 22 + 46247.0 1 7 1985 23 + 47161.0 1 1 1988 24 + 47892.0 1 1 1990 25 + 48257.0 1 1 1991 26 + 48804.0 1 7 1992 27 + 49169.0 1 7 1993 28 + 49534.0 1 7 1994 29 + 50083.0 1 1 1996 30 + 50630.0 1 7 1997 31 + 51179.0 1 1 1999 32 + 53736.0 1 1 2006 33 + 54832.0 1 1 2009 34 + 56109.0 1 7 2012 35 + 57204.0 1 7 2015 36 + 57754.0 1 1 2017 37 +)--"; + + +// https://datacenter.iers.org/data/latestVersion/bulletinA.txt +static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--( + + ********************************************************************** + * * + * I E R S B U L L E T I N - A * + * * + * Rapid Service/Prediction of Earth Orientation * + ********************************************************************** + 13 March 2025 Vol. XXXVIII No. 011 + ______________________________________________________________________ + GENERAL INFORMATION: + MJD = Julian Date - 2 400 000.5 days + UT2-UT1 = 0.022 sin(2*pi*T) - 0.012 cos(2*pi*T) + - 0.006 sin(4*pi*T) + 0.007 cos(4*pi*T) + where pi = 3.14159265... and T is the date in Besselian years. + TT = TAI + 32.184 seconds + DUT1= (UT1-UTC) transmitted with time signals + = 0.0 seconds beginning 26 December 2024 at 0000 UTC + Beginning 1 January 2017: + TAI-UTC = 37.000 000 seconds + *********************************************************************** + * ANNOUNCEMENTS: * + * * + * There will NOT be a leap second introduced in UTC * + * at the end of June 2025. * + * * + * The primary source for IERS Rapid Service/Prediction Center (RS/PC) * + * data products is the official IERS RS/PC website: * + * https://maia.usno.navy.mil * + * * + * IERS RS/PC products are also available from: * + * NASA CDDIS: https://cddis.nasa.gov/archive/products/iers/ * + * NASA CDDIS: ftps://gdc.cddis.eosdis.nasa.gov/products/iers/ * + * IERS Central Bureau: https://datacenter.iers.org/eop.php * + * * + * Questions about IERS RS/PC products can be emailed to: * + * eopcp@us.navy.mil * + * * + * Distribution statement A: * + * Approved for public release: distribution unlimited. * + * * + *********************************************************************** + ________________________________________________________________________ + The contributed observations used in the preparation of this Bulletin + are available at . The contributed analysis results are based + on data from Very Long Baseline Interferometry (VLBI), Satellite Laser + Ranging (SLR), the Global Positioning System (GPS) satellites, Lunar + Laser Ranging (LLR), and meteorological predictions of variations in + Atmospheric Angular Momentum (AAM). + ________________________________________________________________________ + + COMBINED EARTH ORIENTATION PARAMETERS: + + IERS Rapid Service + MJD x error y error UT1-UTC error + " " " " s s + 25 3 7 60741 0.06613 .00009 0.33411 .00009 0.043363 0.000018 + 25 3 8 60742 0.06541 .00009 0.33548 .00009 0.043670 0.000018 + 25 3 9 60743 0.06488 .00009 0.33683 .00009 0.044040 0.000018 + 25 3 10 60744 0.06460 .00009 0.33840 .00009 0.044258 0.000015 + 25 3 11 60745 0.06431 .00009 0.34031 .00009 0.044286 0.000014 + 25 3 12 60746 0.06374 .00009 0.34237 .00009 0.044161 0.000014 + 25 3 13 60747 0.06312 .00009 0.34454 .00009 0.043830 0.000009 + + _______________________________________________________________________ + + PREDICTIONS: + The following formulas will not reproduce the predictions given below, + but may be used to extend the predictions beyond the end of this table. + + x = 0.1229 - 0.1349 cos A + 0.0114 sin A + 0.0748 cos C - 0.0406 sin C + y = 0.3776 + 0.0082 cos A + 0.1190 sin A - 0.0406 cos C - 0.0748 sin C + UT1-UTC = 0.0554 + 0.00014 (MJD - 60755) - (UT2-UT1) + + where A = 2*pi*(MJD-60747)/365.25 and C = 2*pi*(MJD-60747)/435. + + TAI-UTC(MJD 60748) = 37.0 + The accuracy may be estimated from the expressions: + S x,y = 0.00068 (MJD-60747)**0.80 S t = 0.00025 (MJD-60747)**0.75 + Estimated accuracies are: Predictions 10 d 20 d 30 d 40 d + Polar coord's 0.004 0.007 0.010 0.013 + UT1-UTC 0.0014 0.0024 0.0032 0.0040 + + MJD x(arcsec) y(arcsec) UT1-UTC(sec) + 2025 3 14 60748 0.0624 0.3463 0.04336 + 2025 3 15 60749 0.0619 0.3482 0.04285 + 2025 3 16 60750 0.0614 0.3498 0.04240 + 2025 3 17 60751 0.0610 0.3512 0.04205 + 2025 3 18 60752 0.0608 0.3526 0.04184 + 2025 3 19 60753 0.0607 0.3539 0.04178 + 2025 3 20 60754 0.0607 0.3552 0.04187 + 2025 3 21 60755 0.0608 0.3565 0.04211 + 2025 3 22 60756 0.0608 0.3578 0.04244 + 2025 3 23 60757 0.0609 0.3590 0.04283 + 2025 3 24 60758 0.0611 0.3603 0.04315 + 2025 3 25 60759 0.0612 0.3616 0.04326 + 2025 3 26 60760 0.0614 0.3628 0.04307 + 2025 3 27 60761 0.0616 0.3641 0.04253 + 2025 3 28 60762 0.0618 0.3653 0.04167 + 2025 3 29 60763 0.0621 0.3665 0.04061 + 2025 3 30 60764 0.0624 0.3677 0.03954 + 2025 3 31 60765 0.0627 0.3690 0.03864 + 2025 4 1 60766 0.0630 0.3702 0.03805 + 2025 4 2 60767 0.0634 0.3714 0.03778 + 2025 4 3 60768 0.0637 0.3726 0.03779 + 2025 4 4 60769 0.0641 0.3738 0.03795 + 2025 4 5 60770 0.0646 0.3750 0.03815 + 2025 4 6 60771 0.0650 0.3762 0.03827 + 2025 4 7 60772 0.0655 0.3773 0.03823 + 2025 4 8 60773 0.0660 0.3785 0.03800 + 2025 4 9 60774 0.0665 0.3797 0.03760 + 2025 4 10 60775 0.0671 0.3808 0.03706 + 2025 4 11 60776 0.0676 0.3820 0.03644 + 2025 4 12 60777 0.0682 0.3831 0.03584 + 2025 4 13 60778 0.0688 0.3843 0.03531 + 2025 4 14 60779 0.0695 0.3854 0.03493 + 2025 4 15 60780 0.0701 0.3865 0.03472 + 2025 4 16 60781 0.0708 0.3876 0.03469 + 2025 4 17 60782 0.0715 0.3887 0.03484 + 2025 4 18 60783 0.0723 0.3898 0.03512 + 2025 4 19 60784 0.0730 0.3908 0.03547 + 2025 4 20 60785 0.0738 0.3919 0.03579 + 2025 4 21 60786 0.0746 0.3929 0.03599 + 2025 4 22 60787 0.0754 0.3940 0.03595 + 2025 4 23 60788 0.0762 0.3950 0.03562 + 2025 4 24 60789 0.0771 0.3960 0.03496 + 2025 4 25 60790 0.0780 0.3970 0.03405 + 2025 4 26 60791 0.0789 0.3980 0.03301 + 2025 4 27 60792 0.0798 0.3989 0.03205 + 2025 4 28 60793 0.0807 0.3999 0.03132 + 2025 4 29 60794 0.0817 0.4008 0.03093 + 2025 4 30 60795 0.0826 0.4017 0.03087 + 2025 5 1 60796 0.0836 0.4027 0.03103 + 2025 5 2 60797 0.0846 0.4035 0.03127 + 2025 5 3 60798 0.0857 0.4044 0.03146 + 2025 5 4 60799 0.0867 0.4053 0.03151 + 2025 5 5 60800 0.0878 0.4061 0.03138 + 2025 5 6 60801 0.0889 0.4070 0.03108 + 2025 5 7 60802 0.0899 0.4078 0.03066 + 2025 5 8 60803 0.0911 0.4086 0.03019 + 2025 5 9 60804 0.0922 0.4093 0.02971 + 2025 5 10 60805 0.0933 0.4101 0.02932 + 2025 5 11 60806 0.0945 0.4109 0.02906 + 2025 5 12 60807 0.0956 0.4116 0.02899 + 2025 5 13 60808 0.0968 0.4123 0.02912 + 2025 5 14 60809 0.0980 0.4130 0.02945 + 2025 5 15 60810 0.0992 0.4136 0.02993 + 2025 5 16 60811 0.1005 0.4143 0.03049 + 2025 5 17 60812 0.1017 0.4149 0.03106 + 2025 5 18 60813 0.1029 0.4155 0.03154 + 2025 5 19 60814 0.1042 0.4161 0.03184 + 2025 5 20 60815 0.1055 0.4167 0.03190 + 2025 5 21 60816 0.1068 0.4173 0.03169 + 2025 5 22 60817 0.1080 0.4178 0.03124 + 2025 5 23 60818 0.1093 0.4183 0.03064 + 2025 5 24 60819 0.1107 0.4188 0.03006 + 2025 5 25 60820 0.1120 0.4193 0.02966 + 2025 5 26 60821 0.1133 0.4197 0.02956 + 2025 5 27 60822 0.1146 0.4202 0.02981 + 2025 5 28 60823 0.1160 0.4206 0.03035 + 2025 5 29 60824 0.1173 0.4210 0.03106 + 2025 5 30 60825 0.1187 0.4213 0.03177 + 2025 5 31 60826 0.1201 0.4217 0.03239 + 2025 6 1 60827 0.1214 0.4220 0.03284 + 2025 6 2 60828 0.1228 0.4223 0.03313 + 2025 6 3 60829 0.1242 0.4226 0.03330 + 2025 6 4 60830 0.1256 0.4228 0.03341 + 2025 6 5 60831 0.1270 0.4231 0.03352 + 2025 6 6 60832 0.1284 0.4233 0.03371 + 2025 6 7 60833 0.1298 0.4235 0.03402 + 2025 6 8 60834 0.1312 0.4237 0.03451 + 2025 6 9 60835 0.1326 0.4238 0.03519 + 2025 6 10 60836 0.1340 0.4239 0.03606 + 2025 6 11 60837 0.1354 0.4241 0.03710 + 2025 6 12 60838 0.1368 0.4241 0.03824 + 2025 6 13 60839 0.1382 0.4242 0.03940 + 2025 6 14 60840 0.1396 0.4242 0.04049 + 2025 6 15 60841 0.1410 0.4243 0.04144 + 2025 6 16 60842 0.1424 0.4243 0.04216 + 2025 6 17 60843 0.1438 0.4242 0.04263 + 2025 6 18 60844 0.1453 0.4242 0.04287 + 2025 6 19 60845 0.1467 0.4241 0.04295 + 2025 6 20 60846 0.1481 0.4240 0.04300 + 2025 6 21 60847 0.1495 0.4239 0.04316 + 2025 6 22 60848 0.1509 0.4238 0.04356 + 2025 6 23 60849 0.1522 0.4236 0.04427 + 2025 6 24 60850 0.1536 0.4234 0.04526 + 2025 6 25 60851 0.1550 0.4232 0.04645 + 2025 6 26 60852 0.1564 0.4230 0.04769 + 2025 6 27 60853 0.1578 0.4227 0.04885 + 2025 6 28 60854 0.1591 0.4225 0.04985 + 2025 6 29 60855 0.1605 0.4222 0.05065 + 2025 6 30 60856 0.1618 0.4219 0.05131 + 2025 7 1 60857 0.1632 0.4215 0.05187 + 2025 7 2 60858 0.1645 0.4212 0.05241 + 2025 7 3 60859 0.1658 0.4208 0.05300 + 2025 7 4 60860 0.1671 0.4204 0.05371 + 2025 7 5 60861 0.1685 0.4200 0.05457 + 2025 7 6 60862 0.1698 0.4195 0.05562 + 2025 7 7 60863 0.1710 0.4191 0.05685 + 2025 7 8 60864 0.1723 0.4186 0.05825 + 2025 7 9 60865 0.1736 0.4181 0.05975 + 2025 7 10 60866 0.1748 0.4176 0.06129 + 2025 7 11 60867 0.1761 0.4170 0.06276 + 2025 7 12 60868 0.1773 0.4165 0.06407 + 2025 7 13 60869 0.1785 0.4159 0.06515 + 2025 7 14 60870 0.1798 0.4153 0.06596 + 2025 7 15 60871 0.1809 0.4146 0.06652 + 2025 7 16 60872 0.1821 0.4140 0.06692 + 2025 7 17 60873 0.1833 0.4133 0.06726 + 2025 7 18 60874 0.1844 0.4127 0.06768 + 2025 7 19 60875 0.1856 0.4120 0.06829 + 2025 7 20 60876 0.1867 0.4113 0.06918 + 2025 7 21 60877 0.1878 0.4105 0.07033 + 2025 7 22 60878 0.1889 0.4098 0.07169 + 2025 7 23 60879 0.1900 0.4090 0.07312 + 2025 7 24 60880 0.1910 0.4082 0.07449 + 2025 7 25 60881 0.1921 0.4074 0.07570 + 2025 7 26 60882 0.1931 0.4066 0.07670 + 2025 7 27 60883 0.1941 0.4058 0.07749 + 2025 7 28 60884 0.1951 0.4049 0.07813 + 2025 7 29 60885 0.1961 0.4041 0.07870 + 2025 7 30 60886 0.1970 0.4032 0.07928 + 2025 7 31 60887 0.1980 0.4023 0.07995 + 2025 8 1 60888 0.1989 0.4014 0.08076 + 2025 8 2 60889 0.1998 0.4004 0.08174 + 2025 8 3 60890 0.2006 0.3995 0.08289 + 2025 8 4 60891 0.2015 0.3985 0.08420 + 2025 8 5 60892 0.2023 0.3976 0.08562 + 2025 8 6 60893 0.2032 0.3966 0.08709 + 2025 8 7 60894 0.2039 0.3956 0.08850 + 2025 8 8 60895 0.2047 0.3946 0.08976 + 2025 8 9 60896 0.2055 0.3936 0.09078 + 2025 8 10 60897 0.2062 0.3925 0.09151 + 2025 8 11 60898 0.2069 0.3915 0.09194 + 2025 8 12 60899 0.2076 0.3904 0.09215 + 2025 8 13 60900 0.2083 0.3894 0.09226 + 2025 8 14 60901 0.2089 0.3883 0.09242 + 2025 8 15 60902 0.2095 0.3872 0.09277 + 2025 8 16 60903 0.2101 0.3861 0.09337 + 2025 8 17 60904 0.2107 0.3850 0.09424 + 2025 8 18 60905 0.2112 0.3839 0.09532 + 2025 8 19 60906 0.2118 0.3827 0.09648 + 2025 8 20 60907 0.2123 0.3816 0.09762 + 2025 8 21 60908 0.2128 0.3805 0.09861 + 2025 8 22 60909 0.2132 0.3793 0.09938 + 2025 8 23 60910 0.2136 0.3781 0.09992 + 2025 8 24 60911 0.2140 0.3770 0.10027 + 2025 8 25 60912 0.2144 0.3758 0.10050 + 2025 8 26 60913 0.2148 0.3746 0.10070 + 2025 8 27 60914 0.2151 0.3734 0.10095 + 2025 8 28 60915 0.2154 0.3722 0.10132 + 2025 8 29 60916 0.2157 0.3710 0.10185 + 2025 8 30 60917 0.2160 0.3698 0.10255 + 2025 8 31 60918 0.2162 0.3686 0.10341 + 2025 9 1 60919 0.2164 0.3674 0.10439 + 2025 9 2 60920 0.2166 0.3662 0.10542 + 2025 9 3 60921 0.2168 0.3650 0.10643 + 2025 9 4 60922 0.2169 0.3637 0.10732 + 2025 9 5 60923 0.2170 0.3625 0.10800 + 2025 9 6 60924 0.2171 0.3613 0.10837 + 2025 9 7 60925 0.2172 0.3601 0.10843 + 2025 9 8 60926 0.2172 0.3588 0.10819 + 2025 9 9 60927 0.2172 0.3576 0.10779 + 2025 9 10 60928 0.2172 0.3564 0.10738 + 2025 9 11 60929 0.2171 0.3551 0.10713 + 2025 9 12 60930 0.2171 0.3539 0.10714 + 2025 9 13 60931 0.2170 0.3527 0.10745 + 2025 9 14 60932 0.2169 0.3514 0.10801 + 2025 9 15 60933 0.2167 0.3502 0.10870 + 2025 9 16 60934 0.2165 0.3490 0.10940 + 2025 9 17 60935 0.2164 0.3477 0.10998 + 2025 9 18 60936 0.2161 0.3465 0.11038 + 2025 9 19 60937 0.2159 0.3453 0.11056 + 2025 9 20 60938 0.2156 0.3441 0.11054 + 2025 9 21 60939 0.2153 0.3429 0.11038 + 2025 9 22 60940 0.2150 0.3417 0.11015 + 2025 9 23 60941 0.2147 0.3405 0.10994 + 2025 9 24 60942 0.2143 0.3393 0.10981 + 2025 9 25 60943 0.2139 0.3381 0.10983 + 2025 9 26 60944 0.2135 0.3369 0.11001 + 2025 9 27 60945 0.2130 0.3357 0.11037 + 2025 9 28 60946 0.2126 0.3345 0.11087 + 2025 9 29 60947 0.2121 0.3333 0.11145 + 2025 9 30 60948 0.2116 0.3322 0.11205 + 2025 10 1 60949 0.2110 0.3310 0.11257 + 2025 10 2 60950 0.2105 0.3299 0.11293 + 2025 10 3 60951 0.2099 0.3287 0.11305 + 2025 10 4 60952 0.2093 0.3276 0.11287 + 2025 10 5 60953 0.2087 0.3265 0.11239 + 2025 10 6 60954 0.2080 0.3254 0.11169 + 2025 10 7 60955 0.2073 0.3243 0.11090 + 2025 10 8 60956 0.2066 0.3232 0.11020 + 2025 10 9 60957 0.2059 0.3221 0.10974 + 2025 10 10 60958 0.2052 0.3210 0.10960 + 2025 10 11 60959 0.2044 0.3200 0.10976 + 2025 10 12 60960 0.2036 0.3189 0.11010 + 2025 10 13 60961 0.2028 0.3179 0.11050 + 2025 10 14 60962 0.2020 0.3169 0.11082 + 2025 10 15 60963 0.2011 0.3158 0.11097 + 2025 10 16 60964 0.2003 0.3148 0.11091 + 2025 10 17 60965 0.1994 0.3139 0.11066 + 2025 10 18 60966 0.1985 0.3129 0.11025 + 2025 10 19 60967 0.1975 0.3119 0.10977 + 2025 10 20 60968 0.1966 0.3110 0.10927 + 2025 10 21 60969 0.1956 0.3100 0.10886 + 2025 10 22 60970 0.1946 0.3091 0.10859 + 2025 10 23 60971 0.1936 0.3082 0.10849 + 2025 10 24 60972 0.1926 0.3073 0.10861 + 2025 10 25 60973 0.1916 0.3065 0.10892 + 2025 10 26 60974 0.1905 0.3056 0.10935 + 2025 10 27 60975 0.1895 0.3048 0.10978 + 2025 10 28 60976 0.1884 0.3040 0.11025 + 2025 10 29 60977 0.1873 0.3032 0.11058 + 2025 10 30 60978 0.1861 0.3024 0.11071 + 2025 10 31 60979 0.1850 0.3016 0.11050 + 2025 11 1 60980 0.1838 0.3008 0.11003 + 2025 11 2 60981 0.1827 0.3001 0.10928 + 2025 11 3 60982 0.1815 0.2994 0.10839 + 2025 11 4 60983 0.1803 0.2987 0.10748 + 2025 11 5 60984 0.1791 0.2980 0.10672 + 2025 11 6 60985 0.1779 0.2974 0.10615 + 2025 11 7 60986 0.1766 0.2967 0.10589 + 2025 11 8 60987 0.1754 0.2961 0.10585 + 2025 11 9 60988 0.1741 0.2955 0.10581 + 2025 11 10 60989 0.1728 0.2949 0.10574 + 2025 11 11 60990 0.1715 0.2943 0.10560 + 2025 11 12 60991 0.1702 0.2938 0.10528 + 2025 11 13 60992 0.1689 0.2933 0.10474 + 2025 11 14 60993 0.1676 0.2928 0.10409 + 2025 11 15 60994 0.1663 0.2923 0.10341 + 2025 11 16 60995 0.1649 0.2918 0.10272 + 2025 11 17 60996 0.1636 0.2914 0.10207 + 2025 11 18 60997 0.1622 0.2909 0.10157 + 2025 11 19 60998 0.1609 0.2905 0.10128 + 2025 11 20 60999 0.1595 0.2902 0.10111 + 2025 11 21 61000 0.1581 0.2898 0.10109 + 2025 11 22 61001 0.1567 0.2895 0.10126 + 2025 11 23 61002 0.1553 0.2891 0.10147 + 2025 11 24 61003 0.1539 0.2888 0.10174 + 2025 11 25 61004 0.1525 0.2886 0.10196 + 2025 11 26 61005 0.1511 0.2883 0.10209 + 2025 11 27 61006 0.1497 0.2881 0.10200 + 2025 11 28 61007 0.1483 0.2879 0.10179 + 2025 11 29 61008 0.1469 0.2877 0.10139 + 2025 11 30 61009 0.1454 0.2875 0.10083 + 2025 12 1 61010 0.1440 0.2874 0.10023 + 2025 12 2 61011 0.1426 0.2873 0.09972 + 2025 12 3 61012 0.1412 0.2872 0.09946 + 2025 12 4 61013 0.1397 0.2871 0.09945 + 2025 12 5 61014 0.1383 0.2871 0.09980 + 2025 12 6 61015 0.1368 0.2870 0.10029 + 2025 12 7 61016 0.1354 0.2870 0.10078 + 2025 12 8 61017 0.1340 0.2870 0.10111 + 2025 12 9 61018 0.1325 0.2871 0.10128 + 2025 12 10 61019 0.1311 0.2871 0.10122 + 2025 12 11 61020 0.1297 0.2872 0.10095 + 2025 12 12 61021 0.1282 0.2873 0.10058 + 2025 12 13 61022 0.1268 0.2874 0.10030 + 2025 12 14 61023 0.1254 0.2876 0.10010 + 2025 12 15 61024 0.1240 0.2878 0.10002 + 2025 12 16 61025 0.1225 0.2880 0.10014 + 2025 12 17 61026 0.1211 0.2882 0.10046 + 2025 12 18 61027 0.1197 0.2884 0.10090 + 2025 12 19 61028 0.1183 0.2887 0.10151 + 2025 12 20 61029 0.1169 0.2890 0.10227 + 2025 12 21 61030 0.1155 0.2893 0.10306 + 2025 12 22 61031 0.1141 0.2896 0.10381 + 2025 12 23 61032 0.1128 0.2899 0.10433 + 2025 12 24 61033 0.1114 0.2903 0.10460 + 2025 12 25 61034 0.1100 0.2907 0.10461 + 2025 12 26 61035 0.1087 0.2911 0.10444 + 2025 12 27 61036 0.1073 0.2916 0.10402 + 2025 12 28 61037 0.1060 0.2920 0.10333 + 2025 12 29 61038 0.1047 0.2925 0.10261 + 2025 12 30 61039 0.1034 0.2930 0.10209 + 2025 12 31 61040 0.1020 0.2935 0.10180 + 2026 1 1 61041 0.1008 0.2940 0.10174 + 2026 1 2 61042 0.0995 0.2946 0.10186 + 2026 1 3 61043 0.0982 0.2952 0.10206 + 2026 1 4 61044 0.0969 0.2958 0.10214 + 2026 1 5 61045 0.0957 0.2964 0.10199 + 2026 1 6 61046 0.0945 0.2970 0.10164 + 2026 1 7 61047 0.0932 0.2977 0.10115 + 2026 1 8 61048 0.0920 0.2984 0.10052 + 2026 1 9 61049 0.0908 0.2991 0.09986 + 2026 1 10 61050 0.0896 0.2998 0.09927 + 2026 1 11 61051 0.0885 0.3005 0.09879 + 2026 1 12 61052 0.0873 0.3013 0.09846 + 2026 1 13 61053 0.0862 0.3021 0.09837 + 2026 1 14 61054 0.0851 0.3029 0.09845 + 2026 1 15 61055 0.0840 0.3037 0.09869 + 2026 1 16 61056 0.0829 0.3045 0.09907 + 2026 1 17 61057 0.0818 0.3053 0.09946 + 2026 1 18 61058 0.0808 0.3062 0.09980 + 2026 1 19 61059 0.0797 0.3071 0.10003 + 2026 1 20 61060 0.0787 0.3080 0.10009 + 2026 1 21 61061 0.0777 0.3089 0.09997 + 2026 1 22 61062 0.0768 0.3098 0.09963 + 2026 1 23 61063 0.0758 0.3107 0.09910 + 2026 1 24 61064 0.0749 0.3117 0.09850 + 2026 1 25 61065 0.0739 0.3127 0.09785 + 2026 1 26 61066 0.0730 0.3137 0.09733 + 2026 1 27 61067 0.0722 0.3147 0.09707 + 2026 1 28 61068 0.0713 0.3157 0.09707 + 2026 1 29 61069 0.0705 0.3167 0.09732 + 2026 1 30 61070 0.0697 0.3177 0.09776 + 2026 1 31 61071 0.0689 0.3188 0.09820 + 2026 2 1 61072 0.0681 0.3199 0.09846 + 2026 2 2 61073 0.0673 0.3210 0.09849 + 2026 2 3 61074 0.0666 0.3221 0.09826 + 2026 2 4 61075 0.0659 0.3232 0.09784 + 2026 2 5 61076 0.0652 0.3243 0.09737 + 2026 2 6 61077 0.0646 0.3254 0.09699 + 2026 2 7 61078 0.0639 0.3265 0.09675 + 2026 2 8 61079 0.0633 0.3277 0.09669 + 2026 2 9 61080 0.0627 0.3289 0.09675 + 2026 2 10 61081 0.0621 0.3300 0.09697 + 2026 2 11 61082 0.0616 0.3312 0.09741 + 2026 2 12 61083 0.0611 0.3324 0.09793 + 2026 2 13 61084 0.0606 0.3336 0.09847 + 2026 2 14 61085 0.0601 0.3348 0.09894 + 2026 2 15 61086 0.0597 0.3360 0.09931 + 2026 2 16 61087 0.0592 0.3372 0.09950 + 2026 2 17 61088 0.0588 0.3385 0.09944 + 2026 2 18 61089 0.0585 0.3397 0.09914 + 2026 2 19 61090 0.0581 0.3409 0.09863 + 2026 2 20 61091 0.0578 0.3422 0.09802 + 2026 2 21 61092 0.0575 0.3434 0.09745 + 2026 2 22 61093 0.0572 0.3447 0.09702 + 2026 2 23 61094 0.0570 0.3460 0.09688 + 2026 2 24 61095 0.0568 0.3472 0.09691 + 2026 2 25 61096 0.0566 0.3485 0.09716 + 2026 2 26 61097 0.0564 0.3498 0.09754 + 2026 2 27 61098 0.0563 0.3511 0.09790 + 2026 2 28 61099 0.0562 0.3523 0.09820 + 2026 3 1 61100 0.0561 0.3536 0.09830 + 2026 3 2 61101 0.0560 0.3549 0.09818 + 2026 3 3 61102 0.0560 0.3562 0.09786 + 2026 3 4 61103 0.0560 0.3575 0.09743 + 2026 3 5 61104 0.0560 0.3588 0.09701 + 2026 3 6 61105 0.0560 0.3601 0.09667 + 2026 3 7 61106 0.0561 0.3614 0.09648 + 2026 3 8 61107 0.0562 0.3627 0.09646 + 2026 3 9 61108 0.0563 0.3639 0.09656 + 2026 3 10 61109 0.0564 0.3652 0.09675 + 2026 3 11 61110 0.0566 0.3665 0.09700 + 2026 3 12 61111 0.0568 0.3678 0.09726 + 2026 3 13 61112 0.0570 0.3691 0.09747 + These predictions are based on all announced leap seconds. + + CELESTIAL POLE OFFSET SERIES: + NEOS Celestial Pole Offset Series + MJD dpsi error deps error + (msec. of arc) + 60725 -111.67 1.26 -7.68 0.22 + 60726 -111.71 1.26 -7.88 0.22 + 60727 -111.65 1.26 -8.21 0.22 + 60728 -111.46 1.28 -8.53 0.18 + 60729 -111.26 1.21 -8.69 0.18 + 60730 -111.26 1.21 -8.72 0.18 + 60731 -111.55 1.00 -8.79 0.19 + 60732 -111.84 0.89 -8.92 0.27 + 60733 -111.81 0.89 -8.93 0.27 + 60734 -111.52 0.89 -8.69 0.27 + + IAU2000A Celestial Pole Offset Series + MJD dX error dY error + (msec. of arc) + 60725 0.495 0.501 -0.202 0.220 + 60726 0.490 0.501 -0.208 0.220 + 60727 0.480 0.501 -0.215 0.220 + 60728 0.465 0.511 -0.223 0.180 + 60729 0.445 0.483 -0.233 0.184 + 60730 0.420 0.483 -0.244 0.184 + 60731 0.393 0.397 -0.258 0.192 + 60732 0.362 0.353 -0.273 0.266 + 60733 0.330 0.353 -0.290 0.266 + 60734 0.296 0.353 -0.308 0.266 +)--"; + + +} // namespace mcc::defaults diff --git a/cxx/tests/astrom_test.cpp b/cxx/tests/astrom_test.cpp index a234c8a..4309860 100644 --- a/cxx/tests/astrom_test.cpp +++ b/cxx/tests/astrom_test.cpp @@ -64,15 +64,16 @@ int main(int argc, char* argv[]) exit(1); } - bool ok = mcc::astro::mcc_parse_bulletinA(ist); + auto db_a = mcc::astro::mcc_parse_bulletinA(ist); - if (!ok) { + if (db_a.state != mcc::astro::IERS_DB_STATE_OK) { std::cout << "Cannot parse input IERS Bulletin A file!\n"; ecode = 1; } else { std::cout << "IERS Bulletin A data:\n"; - std::cout << "Date: " << mcc::astro::CURRENT_EARTH_ORIENT_DB.bulletinDate << "\n"; - for (auto& el : mcc::astro::CURRENT_EARTH_ORIENT_DB.db) { + std::cout << "Date: " << db_a.bulletinDate << "\n"; + std::cout << "TT-TAI: " << db_a.tt_tai << "\n"; + for (auto& el : db_a.db) { std::cout << "MJD: " << el.mjd << "\tDUT1 = " << el.dut1 << "\n"; } } @@ -82,15 +83,15 @@ int main(int argc, char* argv[]) std::cout << "\n\n\n"; std::istringstream isst(leap_secs_file); - ok = mcc::astro::mcc_parse_leapsecs(isst); + auto db_ls = mcc::astro::mcc_parse_leapsecs(isst); - if (!ok) { + if (db_ls.state != mcc::astro::IERS_DB_STATE_OK) { std::cout << "Cannot parse input IERS leap seconds file!\n"; ecode = 1; } else { std::cout << "IERS leap seconds data:\n"; - std::cout << "Expire date: " << mcc::astro::CURRENT_LEAPSECONDS_DB.expireDate << "\n"; - for (auto& el : mcc::astro::CURRENT_LEAPSECONDS_DB.db) { + std::cout << "Expire date: " << db_ls.expireDate << "\n"; + for (auto& el : db_ls.db) { std::cout << "MJD: " << el.mjd << "\tTAI-UTC = " << el.tai_utc << "\n"; } }