This commit is contained in:
Timur A. Fatkhullin 2025-08-04 22:23:26 +03:00
parent f661dfad44
commit 864e257884
8 changed files with 554 additions and 633 deletions

View File

@ -50,12 +50,16 @@ struct AsibFM700MountControls {
AsibFM700PointingErrorCorrection PEC; AsibFM700PointingErrorCorrection PEC;
AsibFM700Hardware hardware; AsibFM700Hardware hardware;
AsibFM700Telemetry telemetry{astrometryEngine, PEC, hardware}; AsibFM700Telemetry telemetry{astrometryEngine, PEC, hardware};
AsibFM700SlewModel<LoggerT> slewModel;
AsibFM700GuidingModel<LoggerT> guidingModel;
std::tuple<mcc::MccAltLimitPZ<mcc::MccAltLimitKind::MIN_ALT_LIMIT>> prohibitedZones; std::tuple<mcc::MccAltLimitPZ<mcc::MccAltLimitKind::MIN_ALT_LIMIT>> prohibitedZones;
AsibFM700SlewModel<LoggerT> slewModel{PEC, hardware, prohibitedZones};
AsibFM700GuidingModel<LoggerT> guidingModel{PEC, hardware, prohibitedZones};
}; };
static_assert(mcc::traits::mcc_mount_controls_c<AsibFM700MountControls<mcc::utils::MccSpdlogLogger>>);
// global mount configuration // global mount configuration
struct AsibFM700Config { struct AsibFM700Config {

View File

@ -15,10 +15,10 @@ static std::string MCC_DEFAULT_LEAP_SECONDS_FILE = R"--(
# Value of TAI-UTC in second valid beetween the initial value until # 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 # the epoch given on the next line. The last line reads that NO
# leap second was introduced since the corresponding date # leap second was introduced since the corresponding date
# Updated through IERS Bulletin 69 issued in January 2025 # Updated through IERS Bulletin 70 issued in July 2025
# #
# #
# File expires on 28 December 2025 # File expires on 28 June 2026
# #
# #
# MJD Date TAI-UTC (s) # MJD Date TAI-UTC (s)
@ -67,7 +67,7 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
* * * *
* Rapid Service/Prediction of Earth Orientation * * Rapid Service/Prediction of Earth Orientation *
********************************************************************** **********************************************************************
3 July 2025 Vol. XXXVIII No. 027 31 July 2025 Vol. XXXVIII No. 031
______________________________________________________________________ ______________________________________________________________________
GENERAL INFORMATION: GENERAL INFORMATION:
MJD = Julian Date - 2 400 000.5 days MJD = Julian Date - 2 400 000.5 days
@ -76,13 +76,15 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
where pi = 3.14159265... and T is the date in Besselian years. where pi = 3.14159265... and T is the date in Besselian years.
TT = TAI + 32.184 seconds TT = TAI + 32.184 seconds
DUT1= (UT1-UTC) transmitted with time signals DUT1= (UT1-UTC) transmitted with time signals
= 0.0 seconds beginning 26 December 2024 at 0000 UTC
= +0.1 seconds beginning 10 July 2025 at 0000 UTC = +0.1 seconds beginning 10 July 2025 at 0000 UTC
Beginning 1 January 2017: Beginning 1 January 2017:
TAI-UTC = 37.000 000 seconds TAI-UTC = 37.000 000 seconds
*********************************************************************** ***********************************************************************
* ANNOUNCEMENTS: * * ANNOUNCEMENTS: *
* * * *
* There will NOT be a leap second introduced in UTC *
* at the end of December 2025. *
* *
* The primary source for IERS Rapid Service/Prediction Center (RS/PC) * * The primary source for IERS Rapid Service/Prediction Center (RS/PC) *
* data products is the official IERS RS/PC website: * * data products is the official IERS RS/PC website: *
* https://maia.usno.navy.mil * * https://maia.usno.navy.mil *
@ -114,48 +116,13 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
IERS Rapid Service IERS Rapid Service
MJD x error y error UT1-UTC error MJD x error y error UT1-UTC error
" " " " s s " " " " s s
25 6 27 60853 0.15472 .00009 0.44036 .00009 0.040354 0.000022 25 7 25 60881 0.19849 .00009 0.43231 .00009 0.060664 0.000023
25 6 28 60854 0.15644 .00009 0.44013 .00009 0.041389 0.000023 25 7 26 60882 0.19962 .00009 0.43171 .00009 0.061061 0.000018
25 6 29 60855 0.15844 .00009 0.44006 .00009 0.042204 0.000024 25 7 27 60883 0.20063 .00009 0.43095 .00009 0.061275 0.000018
25 6 30 60856 0.16029 .00009 0.44003 .00009 0.042854 0.000016 25 7 28 60884 0.20201 .00009 0.43031 .00009 0.061376 0.000016
25 7 1 60857 0.16204 .00009 0.43988 .00009 0.043427 0.000013 25 7 29 60885 0.20393 .00009 0.42977 .00009 0.061481 0.000016
25 7 2 60858 0.16365 .00009 0.43965 .00009 0.043890 0.000012 25 7 30 60886 0.20609 .00009 0.42900 .00009 0.061552 0.000012
25 7 3 60859 0.16516 .00009 0.43931 .00009 0.044366 0.000009 25 7 31 60887 0.20824 .00009 0.42803 .00009 0.061682 0.000006
IERS Final Values
MJD x y UT1-UTC
" " s
25 5 2 60797 0.0865 0.4180 0.03007
25 5 3 60798 0.0873 0.4191 0.03031
25 5 4 60799 0.0882 0.4202 0.03039
25 5 5 60800 0.0889 0.4212 0.03031
25 5 6 60801 0.0898 0.4221 0.03006
25 5 7 60802 0.0907 0.4232 0.02970
25 5 8 60803 0.0915 0.4238 0.02932
25 5 9 60804 0.0925 0.4244 0.02898
25 5 10 60805 0.0939 0.4247 0.02874
25 5 11 60806 0.0955 0.4251 0.02855
25 5 12 60807 0.0970 0.4259 0.02849
25 5 13 60808 0.0980 0.4268 0.02857
25 5 14 60809 0.0990 0.4277 0.02880
25 5 15 60810 0.1001 0.4288 0.02915
25 5 16 60811 0.1008 0.4299 0.02958
25 5 17 60812 0.1012 0.4309 0.02999
25 5 18 60813 0.1016 0.4316 0.03034
25 5 19 60814 0.1027 0.4318 0.03056
25 5 20 60815 0.1040 0.4321 0.03061
25 5 21 60816 0.1052 0.4328 0.03042
25 5 22 60817 0.1063 0.4338 0.02998
25 5 23 60818 0.1073 0.4346 0.02931
25 5 24 60819 0.1081 0.4356 0.02856
25 5 25 60820 0.1086 0.4365 0.02791
25 5 26 60821 0.1096 0.4368 0.02748
25 5 27 60822 0.1106 0.4373 0.02744
25 5 28 60823 0.1114 0.4375 0.02772
25 5 29 60824 0.1116 0.4380 0.02813
25 5 30 60825 0.1120 0.4375 0.02851
25 5 31 60826 0.1127 0.4374 0.02881
25 6 1 60827 0.1132 0.4377 0.02899
_______________________________________________________________________ _______________________________________________________________________
@ -163,486 +130,401 @@ static std::string MCC_DEFAULT_IERS_BULLETIN_A_FILE = R"--(
The following formulas will not reproduce the predictions given below, The following formulas will not reproduce the predictions given below,
but may be used to extend the predictions beyond the end of this table. but may be used to extend the predictions beyond the end of this table.
x = 0.1314 + 0.0400 cos A + 0.1547 sin A - 0.0075 cos C - 0.0886 sin C x = 0.1419 + 0.0946 cos A + 0.1166 sin A - 0.0303 cos C - 0.0701 sin C
y = 0.3810 + 0.1454 cos A - 0.0330 sin A - 0.0886 cos C + 0.0075 sin C y = 0.3863 + 0.1145 cos A - 0.0825 sin A - 0.0701 cos C + 0.0303 sin C
UT1-UTC = 0.0606 + 0.00011 (MJD - 60867) - (UT2-UT1) UT1-UTC = 0.0464 + 0.00010 (MJD - 60895) - (UT2-UT1)
where A = 2*pi*(MJD-60859)/365.25 and C = 2*pi*(MJD-60859)/435. where A = 2*pi*(MJD-60887)/365.25 and C = 2*pi*(MJD-60887)/435.
TAI-UTC(MJD 60860) = 37.0 TAI-UTC(MJD 60888) = 37.0
The accuracy may be estimated from the expressions: The accuracy may be estimated from the expressions:
S x,y = 0.00068 (MJD-60859)**0.80 S t = 0.00025 (MJD-60859)**0.75 S x,y = 0.00068 (MJD-60887)**0.80 S t = 0.00025 (MJD-60887)**0.75
Estimated accuracies are: Predictions 10 d 20 d 30 d 40 d Estimated accuracies are: Predictions 10 d 20 d 30 d 40 d
Polar coord's 0.004 0.007 0.010 0.013 Polar coord's 0.004 0.007 0.010 0.013
UT1-UTC 0.0014 0.0024 0.0032 0.0040 UT1-UTC 0.0014 0.0024 0.0032 0.0040
MJD x(arcsec) y(arcsec) UT1-UTC(sec) MJD x(arcsec) y(arcsec) UT1-UTC(sec)
2025 7 4 60860 0.1666 0.4389 0.04491 2025 8 1 60888 0.2101 0.4272 0.06205
2025 7 5 60861 0.1680 0.4385 0.04561 2025 8 2 60889 0.2119 0.4263 0.06269
2025 7 6 60862 0.1694 0.4380 0.04651 2025 8 3 60890 0.2133 0.4254 0.06357
2025 7 7 60863 0.1708 0.4375 0.04762 2025 8 4 60891 0.2145 0.4244 0.06468
2025 7 8 60864 0.1721 0.4369 0.04889 2025 8 5 60892 0.2156 0.4234 0.06594
2025 7 9 60865 0.1734 0.4364 0.05025 2025 8 6 60893 0.2167 0.4224 0.06727
2025 7 10 60866 0.1747 0.4359 0.05163 2025 8 7 60894 0.2177 0.4213 0.06856
2025 7 11 60867 0.1760 0.4353 0.05295 2025 8 8 60895 0.2187 0.4202 0.06970
2025 7 12 60868 0.1772 0.4347 0.05411 2025 8 9 60896 0.2197 0.4190 0.07060
2025 7 13 60869 0.1785 0.4341 0.05505 2025 8 10 60897 0.2206 0.4177 0.07120
2025 7 14 60870 0.1797 0.4335 0.05573 2025 8 11 60898 0.2215 0.4164 0.07146
2025 7 15 60871 0.1809 0.4329 0.05615 2025 8 12 60899 0.2224 0.4152 0.07142
2025 7 16 60872 0.1821 0.4322 0.05641 2025 8 13 60900 0.2232 0.4139 0.07120
2025 7 17 60873 0.1832 0.4315 0.05666 2025 8 14 60901 0.2240 0.4127 0.07098
2025 7 18 60874 0.1844 0.4308 0.05701 2025 8 15 60902 0.2248 0.4114 0.07091
2025 7 19 60875 0.1855 0.4301 0.05759 2025 8 16 60903 0.2255 0.4101 0.07106
2025 7 20 60876 0.1867 0.4294 0.05843 2025 8 17 60904 0.2262 0.4089 0.07146
2025 7 21 60877 0.1878 0.4286 0.05953 2025 8 18 60905 0.2269 0.4076 0.07208
2025 7 22 60878 0.1889 0.4278 0.06082 2025 8 19 60906 0.2275 0.4063 0.07281
2025 7 23 60879 0.1899 0.4271 0.06216 2025 8 20 60907 0.2281 0.4049 0.07354
2025 7 24 60880 0.1910 0.4263 0.06342 2025 8 21 60908 0.2286 0.4036 0.07414
2025 7 25 60881 0.1920 0.4254 0.06451 2025 8 22 60909 0.2291 0.4023 0.07454
2025 7 26 60882 0.1931 0.4246 0.06536 2025 8 23 60910 0.2296 0.4009 0.07474
2025 7 27 60883 0.1941 0.4237 0.06600 2025 8 24 60911 0.2301 0.3996 0.07478
2025 7 28 60884 0.1951 0.4229 0.06647 2025 8 25 60912 0.2305 0.3982 0.07473
2025 7 29 60885 0.1960 0.4220 0.06686 2025 8 26 60913 0.2309 0.3968 0.07466
2025 7 30 60886 0.1970 0.4211 0.06726 2025 8 27 60914 0.2313 0.3954 0.07467
2025 7 31 60887 0.1979 0.4201 0.06774 2025 8 28 60915 0.2316 0.3941 0.07483
2025 8 1 60888 0.1988 0.4192 0.06835 2025 8 29 60916 0.2320 0.3927 0.07516
2025 8 2 60889 0.1997 0.4182 0.06912 2025 8 30 60917 0.2322 0.3913 0.07569
2025 8 3 60890 0.2006 0.4173 0.07005 2025 8 31 60918 0.2325 0.3899 0.07639
2025 8 4 60891 0.2015 0.4163 0.07113 2025 9 1 60919 0.2327 0.3885 0.07722
2025 8 5 60892 0.2023 0.4153 0.07233 2025 9 2 60920 0.2330 0.3871 0.07811
2025 8 6 60893 0.2031 0.4143 0.07357 2025 9 3 60921 0.2331 0.3857 0.07897
2025 8 7 60894 0.2039 0.4132 0.07478 2025 9 4 60922 0.2333 0.3843 0.07971
2025 8 8 60895 0.2047 0.4122 0.07584 2025 9 5 60923 0.2334 0.3828 0.08022
2025 8 9 60896 0.2054 0.4111 0.07666 2025 9 6 60924 0.2335 0.3814 0.08044
2025 8 10 60897 0.2062 0.4101 0.07718 2025 9 7 60925 0.2336 0.3800 0.08033
2025 8 11 60898 0.2069 0.4090 0.07742 2025 9 8 60926 0.2336 0.3786 0.07993
2025 8 12 60899 0.2075 0.4079 0.07746 2025 9 9 60927 0.2336 0.3772 0.07935
2025 8 13 60900 0.2082 0.4068 0.07741 2025 9 10 60928 0.2336 0.3757 0.07876
2025 8 14 60901 0.2089 0.4057 0.07742 2025 9 11 60929 0.2336 0.3743 0.07832
2025 8 15 60902 0.2095 0.4045 0.07762 2025 9 12 60930 0.2335 0.3729 0.07814
2025 8 16 60903 0.2101 0.4034 0.07809 2025 9 13 60931 0.2334 0.3715 0.07825
2025 8 17 60904 0.2106 0.4022 0.07884 2025 9 14 60932 0.2333 0.3701 0.07859
2025 8 18 60905 0.2112 0.4011 0.07981 2025 9 15 60933 0.2331 0.3686 0.07906
2025 8 19 60906 0.2117 0.3999 0.08088 2025 9 16 60934 0.2329 0.3672 0.07952
2025 8 20 60907 0.2122 0.3987 0.08193 2025 9 17 60935 0.2327 0.3658 0.07987
2025 8 21 60908 0.2127 0.3975 0.08285 2025 9 18 60936 0.2325 0.3644 0.08003
2025 8 22 60909 0.2132 0.3963 0.08355 2025 9 19 60937 0.2322 0.3630 0.07996
2025 8 23 60910 0.2136 0.3951 0.08403 2025 9 20 60938 0.2319 0.3616 0.07969
2025 8 24 60911 0.2140 0.3939 0.08432 2025 9 21 60939 0.2316 0.3602 0.07928
2025 8 25 60912 0.2144 0.3927 0.08451 2025 9 22 60940 0.2313 0.3588 0.07881
2025 8 26 60913 0.2147 0.3915 0.08467 2025 9 23 60941 0.2309 0.3574 0.07837
2025 8 27 60914 0.2151 0.3902 0.08488 2025 9 24 60942 0.2305 0.3560 0.07804
2025 8 28 60915 0.2154 0.3890 0.08522 2025 9 25 60943 0.2301 0.3546 0.07786
2025 8 29 60916 0.2157 0.3877 0.08573 2025 9 26 60944 0.2297 0.3532 0.07787
2025 8 30 60917 0.2159 0.3865 0.08641 2025 9 27 60945 0.2292 0.3518 0.07805
2025 8 31 60918 0.2162 0.3852 0.08727 2025 9 28 60946 0.2287 0.3505 0.07838
2025 9 1 60919 0.2164 0.3840 0.08825 2025 9 29 60947 0.2282 0.3491 0.07880
2025 9 2 60920 0.2165 0.3827 0.08931 2025 9 30 60948 0.2276 0.3478 0.07924
2025 9 3 60921 0.2167 0.3814 0.09034 2025 10 1 60949 0.2270 0.3464 0.07962
2025 9 4 60922 0.2168 0.3802 0.09125 2025 10 2 60950 0.2264 0.3451 0.07983
2025 9 5 60923 0.2169 0.3789 0.09195 2025 10 3 60951 0.2258 0.3438 0.07978
2025 9 6 60924 0.2170 0.3776 0.09236 2025 10 4 60952 0.2252 0.3424 0.07944
2025 9 7 60925 0.2171 0.3763 0.09245 2025 10 5 60953 0.2245 0.3411 0.07878
2025 9 8 60926 0.2171 0.3750 0.09226 2025 10 6 60954 0.2238 0.3398 0.07790
2025 9 9 60927 0.2171 0.3738 0.09190 2025 10 7 60955 0.2231 0.3386 0.07692
2025 9 10 60928 0.2171 0.3725 0.09154 2025 10 8 60956 0.2223 0.3373 0.07603
2025 9 11 60929 0.2171 0.3712 0.09134 2025 10 9 60957 0.2215 0.3360 0.07538
2025 9 12 60930 0.2170 0.3699 0.09141 2025 10 10 60958 0.2207 0.3348 0.07506
2025 9 13 60931 0.2169 0.3686 0.09178 2025 10 11 60959 0.2199 0.3335 0.07504
2025 9 14 60932 0.2168 0.3673 0.09239 2025 10 12 60960 0.2191 0.3323 0.07523
2025 9 15 60933 0.2167 0.3661 0.09314 2025 10 13 60961 0.2182 0.3311 0.07547
2025 9 16 60934 0.2165 0.3648 0.09389 2025 10 14 60962 0.2173 0.3299 0.07564
2025 9 17 60935 0.2163 0.3635 0.09452 2025 10 15 60963 0.2164 0.3287 0.07565
2025 9 18 60936 0.2161 0.3622 0.09495 2025 10 16 60964 0.2155 0.3275 0.07545
2025 9 19 60937 0.2158 0.3609 0.09516 2025 10 17 60965 0.2145 0.3263 0.07507
2025 9 20 60938 0.2156 0.3597 0.09517 2025 10 18 60966 0.2136 0.3252 0.07454
2025 9 21 60939 0.2153 0.3584 0.09503 2025 10 19 60967 0.2126 0.3241 0.07396
2025 9 22 60940 0.2150 0.3571 0.09484 2025 10 20 60968 0.2116 0.3229 0.07339
2025 9 23 60941 0.2146 0.3559 0.09466 2025 10 21 60969 0.2105 0.3218 0.07290
2025 9 24 60942 0.2142 0.3546 0.09458 2025 10 22 60970 0.2095 0.3207 0.07257
2025 9 25 60943 0.2139 0.3534 0.09465 2025 10 23 60971 0.2084 0.3197 0.07242
2025 9 26 60944 0.2134 0.3521 0.09489 2025 10 24 60972 0.2073 0.3186 0.07246
2025 9 27 60945 0.2130 0.3509 0.09530 2025 10 25 60973 0.2062 0.3176 0.07267
2025 9 28 60946 0.2125 0.3497 0.09585 2025 10 26 60974 0.2050 0.3166 0.07299
2025 9 29 60947 0.2120 0.3484 0.09649 2025 10 27 60975 0.2039 0.3156 0.07336
2025 9 30 60948 0.2115 0.3472 0.09713 2025 10 28 60976 0.2027 0.3146 0.07370
2025 10 1 60949 0.2110 0.3460 0.09770 2025 10 29 60977 0.2015 0.3136 0.07393
2025 10 2 60950 0.2104 0.3448 0.09809 2025 10 30 60978 0.2003 0.3126 0.07395
2025 10 3 60951 0.2099 0.3436 0.09823 2025 10 31 60979 0.1991 0.3117 0.07371
2025 10 4 60952 0.2093 0.3424 0.09807 2025 11 1 60980 0.1979 0.3108 0.07317
2025 10 5 60953 0.2086 0.3412 0.09759 2025 11 2 60981 0.1966 0.3099 0.07238
2025 10 6 60954 0.2080 0.3401 0.09687 2025 11 3 60982 0.1953 0.3090 0.07144
2025 10 7 60955 0.2073 0.3389 0.09605 2025 11 4 60983 0.1941 0.3082 0.07049
2025 10 8 60956 0.2066 0.3378 0.09532 2025 11 5 60984 0.1928 0.3073 0.06970
2025 10 9 60957 0.2059 0.3366 0.09483 2025 11 6 60985 0.1914 0.3065 0.06920
2025 10 10 60958 0.2052 0.3355 0.09464 2025 11 7 60986 0.1901 0.3057 0.06903
2025 10 11 60959 0.2044 0.3344 0.09475 2025 11 8 60987 0.1888 0.3050 0.06912
2025 10 12 60960 0.2036 0.3333 0.09504 2025 11 9 60988 0.1874 0.3042 0.06933
2025 10 13 60961 0.2028 0.3322 0.09538 2025 11 10 60989 0.1860 0.3035 0.06951
2025 10 14 60962 0.2020 0.3311 0.09563 2025 11 11 60990 0.1847 0.3028 0.06956
2025 10 15 60963 0.2012 0.3300 0.09571 2025 11 12 60991 0.1833 0.3021 0.06941
2025 10 16 60964 0.2003 0.3290 0.09557 2025 11 13 60992 0.1819 0.3014 0.06907
2025 10 17 60965 0.1994 0.3280 0.09524 2025 11 14 60993 0.1804 0.3008 0.06861
2025 10 18 60966 0.1985 0.3269 0.09475 2025 11 15 60994 0.1790 0.3001 0.06809
2025 10 19 60967 0.1976 0.3259 0.09419 2025 11 16 60995 0.1776 0.2995 0.06758
2025 10 20 60968 0.1967 0.3249 0.09361 2025 11 17 60996 0.1761 0.2989 0.06707
2025 10 21 60969 0.1957 0.3239 0.09312 2025 11 18 60997 0.1747 0.2984 0.06669
2025 10 22 60970 0.1947 0.3230 0.09276 2025 11 19 60998 0.1732 0.2979 0.06650
2025 10 23 60971 0.1937 0.3220 0.09259 2025 11 20 60999 0.1717 0.2973 0.06650
2025 10 24 60972 0.1927 0.3211 0.09259 2025 11 21 61000 0.1702 0.2969 0.06668
2025 10 25 60973 0.1917 0.3202 0.09276 2025 11 22 61001 0.1687 0.2964 0.06699
2025 10 26 60974 0.1906 0.3193 0.09305 2025 11 23 61002 0.1672 0.2959 0.06738
2025 10 27 60975 0.1896 0.3184 0.09337 2025 11 24 61003 0.1657 0.2955 0.06776
2025 10 28 60976 0.1885 0.3175 0.09366 2025 11 25 61004 0.1642 0.2951 0.06806
2025 10 29 60977 0.1874 0.3166 0.09383 2025 11 26 61005 0.1627 0.2948 0.06820
2025 10 30 60978 0.1863 0.3158 0.09380 2025 11 27 61006 0.1612 0.2944 0.06812
2025 10 31 60979 0.1851 0.3150 0.09350 2025 11 28 61007 0.1596 0.2941 0.06779
2025 11 1 60980 0.1840 0.3142 0.09291 2025 11 29 61008 0.1581 0.2938 0.06722
2025 11 2 60981 0.1828 0.3134 0.09206 2025 11 30 61009 0.1566 0.2935 0.06647
2025 11 3 60982 0.1817 0.3126 0.09105 2025 12 1 61010 0.1550 0.2933 0.06567
2025 11 4 60983 0.1805 0.3119 0.09004 2025 12 2 61011 0.1535 0.2930 0.06495
2025 11 5 60984 0.1793 0.3112 0.08919 2025 12 3 61012 0.1519 0.2928 0.06445
2025 11 6 60985 0.1781 0.3105 0.08864 2025 12 4 61013 0.1504 0.2926 0.06426
2025 11 7 60986 0.1768 0.3098 0.08841 2025 12 5 61014 0.1488 0.2925 0.06435
2025 11 8 60987 0.1756 0.3091 0.08843 2025 12 6 61015 0.1473 0.2924 0.06463
2025 11 9 60988 0.1743 0.3085 0.08858 2025 12 7 61016 0.1457 0.2923 0.06493
2025 11 10 60989 0.1731 0.3078 0.08870 2025 12 8 61017 0.1441 0.2922 0.06513
2025 11 11 60990 0.1718 0.3072 0.08868 2025 12 9 61018 0.1426 0.2921 0.06512
2025 11 12 60991 0.1705 0.3066 0.08847 2025 12 10 61019 0.1410 0.2921 0.06492
2025 11 13 60992 0.1692 0.3061 0.08807 2025 12 11 61020 0.1395 0.2921 0.06456
2025 11 14 60993 0.1679 0.3055 0.08754 2025 12 12 61021 0.1379 0.2921 0.06414
2025 11 15 60994 0.1666 0.3050 0.08696 2025 12 13 61022 0.1364 0.2921 0.06372
2025 11 16 60995 0.1652 0.3045 0.08638 2025 12 14 61023 0.1348 0.2922 0.06339
2025 11 17 60996 0.1639 0.3040 0.08589 2025 12 15 61024 0.1333 0.2923 0.06320
2025 11 18 60997 0.1626 0.3035 0.08554 2025 12 16 61025 0.1318 0.2924 0.06318
2025 11 19 60998 0.1612 0.3031 0.08537 2025 12 17 61026 0.1302 0.2925 0.06335
2025 11 20 60999 0.1598 0.3027 0.08539 2025 12 18 61027 0.1287 0.2927 0.06371
2025 11 21 61000 0.1585 0.3023 0.08559 2025 12 19 61028 0.1272 0.2929 0.06421
2025 11 22 61001 0.1571 0.3019 0.08593 2025 12 20 61029 0.1256 0.2931 0.06480
2025 11 23 61002 0.1557 0.3015 0.08634 2025 12 21 61030 0.1241 0.2933 0.06540
2025 11 24 61003 0.1543 0.3012 0.08675 2025 12 22 61031 0.1226 0.2936 0.06593
2025 11 25 61004 0.1529 0.3009 0.08707 2025 12 23 61032 0.1211 0.2939 0.06631
2025 11 26 61005 0.1515 0.3006 0.08724 2025 12 24 61033 0.1196 0.2942 0.06648
2025 11 27 61006 0.1501 0.3004 0.08718 2025 12 25 61034 0.1181 0.2945 0.06642
2025 11 28 61007 0.1487 0.3001 0.08688 2025 12 26 61035 0.1166 0.2948 0.06614
2025 11 29 61008 0.1473 0.2999 0.08634 2025 12 27 61036 0.1152 0.2952 0.06567
2025 11 30 61009 0.1459 0.2997 0.08562 2025 12 28 61037 0.1137 0.2956 0.06513
2025 12 1 61010 0.1445 0.2995 0.08484 2025 12 29 61038 0.1122 0.2960 0.06463
2025 12 2 61011 0.1431 0.2994 0.08414 2025 12 30 61039 0.1108 0.2965 0.06430
2025 12 3 61012 0.1417 0.2993 0.08368 2025 12 31 61040 0.1094 0.2970 0.06422
2025 12 4 61013 0.1402 0.2991 0.08352 2026 1 1 61041 0.1079 0.2974 0.06441
2025 12 5 61014 0.1388 0.2991 0.08365 2026 1 2 61042 0.1065 0.2980 0.06480
2025 12 6 61015 0.1374 0.2990 0.08395 2026 1 3 61043 0.1051 0.2985 0.06526
2025 12 7 61016 0.1360 0.2990 0.08429 2026 1 4 61044 0.1037 0.2991 0.06565
2025 12 8 61017 0.1345 0.2990 0.08452 2026 1 5 61045 0.1024 0.2996 0.06585
2025 12 9 61018 0.1331 0.2990 0.08456 2026 1 6 61046 0.1010 0.3002 0.06581
2025 12 10 61019 0.1317 0.2990 0.08439 2026 1 7 61047 0.0996 0.3009 0.06558
2025 12 11 61020 0.1303 0.2991 0.08408 2026 1 8 61048 0.0983 0.3015 0.06522
2025 12 12 61021 0.1288 0.2991 0.08369 2026 1 9 61049 0.0970 0.3022 0.06485
2025 12 13 61022 0.1274 0.2993 0.08332 2026 1 10 61050 0.0957 0.3029 0.06455
2025 12 14 61023 0.1260 0.2994 0.08304 2026 1 11 61051 0.0944 0.3036 0.06438
2025 12 15 61024 0.1246 0.2995 0.08289 2026 1 12 61052 0.0931 0.3043 0.06439
2025 12 16 61025 0.1232 0.2997 0.08293 2026 1 13 61053 0.0918 0.3051 0.06459
2025 12 17 61026 0.1218 0.2999 0.08316 2026 1 14 61054 0.0906 0.3058 0.06498
2025 12 18 61027 0.1204 0.3001 0.08357 2026 1 15 61055 0.0893 0.3066 0.06552
2025 12 19 61028 0.1190 0.3004 0.08414 2026 1 16 61056 0.0881 0.3074 0.06616
2025 12 20 61029 0.1176 0.3006 0.08479 2026 1 17 61057 0.0869 0.3083 0.06682
2025 12 21 61030 0.1162 0.3009 0.08546 2026 1 18 61058 0.0858 0.3091 0.06743
2025 12 22 61031 0.1149 0.3012 0.08606 2026 1 19 61059 0.0846 0.3100 0.06790
2025 12 23 61032 0.1135 0.3016 0.08651 2026 1 20 61060 0.0834 0.3109 0.06816
2025 12 24 61033 0.1121 0.3019 0.08676 2026 1 21 61061 0.0823 0.3118 0.06818
2025 12 25 61034 0.1108 0.3023 0.08678 2026 1 22 61062 0.0812 0.3127 0.06797
2025 12 26 61035 0.1094 0.3027 0.08657 2026 1 23 61063 0.0801 0.3136 0.06757
2025 12 27 61036 0.1081 0.3031 0.08620 2026 1 24 61064 0.0791 0.3146 0.06710
2025 12 28 61037 0.1068 0.3035 0.08575 2026 1 25 61065 0.0780 0.3156 0.06666
2025 12 29 61038 0.1055 0.3040 0.08535 2026 1 26 61066 0.0770 0.3166 0.06637
2025 12 30 61039 0.1042 0.3045 0.08513 2026 1 27 61067 0.0760 0.3176 0.06631
2025 12 31 61040 0.1029 0.3050 0.08516 2026 1 28 61068 0.0750 0.3186 0.06653
2026 1 1 61041 0.1016 0.3055 0.08548 2026 1 29 61069 0.0740 0.3196 0.06698
2026 1 2 61042 0.1003 0.3061 0.08601 2026 1 30 61070 0.0731 0.3207 0.06754
2026 1 3 61043 0.0990 0.3067 0.08663 2026 1 31 61071 0.0721 0.3218 0.06810
2026 1 4 61044 0.0978 0.3072 0.08720 2026 2 1 61072 0.0712 0.3229 0.06853
2026 1 5 61045 0.0966 0.3079 0.08759 2026 2 2 61073 0.0704 0.3240 0.06874
2026 1 6 61046 0.0953 0.3085 0.08776 2026 2 3 61074 0.0695 0.3251 0.06875
2026 1 7 61047 0.0941 0.3091 0.08775 2026 2 4 61075 0.0687 0.3262 0.06861
2026 1 8 61048 0.0929 0.3098 0.08763 2026 2 5 61076 0.0678 0.3273 0.06843
2026 1 9 61049 0.0917 0.3105 0.08749 2026 2 6 61077 0.0671 0.3285 0.06830
2026 1 10 61050 0.0906 0.3112 0.08742 2026 2 7 61078 0.0663 0.3297 0.06830
2026 1 11 61051 0.0894 0.3120 0.08746 2026 2 8 61079 0.0655 0.3309 0.06846
2026 1 12 61052 0.0883 0.3127 0.08766 2026 2 9 61080 0.0648 0.3321 0.06880
2026 1 13 61053 0.0871 0.3135 0.08801 2026 2 10 61081 0.0641 0.3333 0.06930
2026 1 14 61054 0.0860 0.3143 0.08852 2026 2 11 61082 0.0635 0.3345 0.06993
2026 1 15 61055 0.0849 0.3151 0.08915 2026 2 12 61083 0.0628 0.3357 0.07063
2026 1 16 61056 0.0838 0.3159 0.08984 2026 2 13 61084 0.0622 0.3370 0.07134
2026 1 17 61057 0.0828 0.3168 0.09052 2026 2 14 61085 0.0616 0.3382 0.07197
2026 1 18 61058 0.0817 0.3176 0.09108 2026 2 15 61086 0.0610 0.3395 0.07244
2026 1 19 61059 0.0807 0.3185 0.09145 2026 2 16 61087 0.0605 0.3407 0.07269
2026 1 20 61060 0.0797 0.3194 0.09156 2026 2 17 61088 0.0599 0.3420 0.07266
2026 1 21 61061 0.0787 0.3203 0.09138 2026 2 18 61089 0.0594 0.3433 0.07235
2026 1 22 61062 0.0777 0.3212 0.09092 2026 2 19 61090 0.0590 0.3446 0.07181
2026 1 23 61063 0.0768 0.3222 0.09023 2026 2 20 61091 0.0585 0.3459 0.07115
2026 1 24 61064 0.0758 0.3232 0.08943 2026 2 21 61092 0.0581 0.3472 0.07049
2026 1 25 61065 0.0749 0.3241 0.08864 2026 2 22 61093 0.0577 0.3485 0.06996
2026 1 26 61066 0.0740 0.3251 0.08797 2026 2 23 61094 0.0573 0.3499 0.06966
2026 1 27 61067 0.0731 0.3261 0.08752 2026 2 24 61095 0.0570 0.3512 0.06961
2026 1 28 61068 0.0723 0.3272 0.08730 2026 2 25 61096 0.0567 0.3525 0.06978
2026 1 29 61069 0.0715 0.3282 0.08730 2026 2 26 61097 0.0564 0.3539 0.07006
2026 1 30 61070 0.0706 0.3293 0.08740 2026 2 27 61098 0.0561 0.3552 0.07033
2026 1 31 61071 0.0698 0.3303 0.08748 2026 2 28 61099 0.0559 0.3566 0.07045
2026 2 1 61072 0.0691 0.3314 0.08742 2026 3 1 61100 0.0557 0.3579 0.07033
2026 2 2 61073 0.0683 0.3325 0.08715 2026 3 2 61101 0.0555 0.3593 0.06993
2026 2 3 61074 0.0676 0.3336 0.08668 2026 3 3 61102 0.0553 0.3607 0.06927
2026 2 4 61075 0.0669 0.3347 0.08606 2026 3 4 61103 0.0552 0.3620 0.06843
2026 2 5 61076 0.0662 0.3359 0.08538 2026 3 5 61104 0.0551 0.3634 0.06752
2026 2 6 61077 0.0655 0.3370 0.08476 2026 3 6 61105 0.0550 0.3648 0.06663
2026 2 7 61078 0.0649 0.3381 0.08430 2026 3 7 61106 0.0550 0.3662 0.06588
2026 2 8 61079 0.0643 0.3393 0.08405 2026 3 8 61107 0.0549 0.3675 0.06529
2026 2 9 61080 0.0637 0.3405 0.08401 2026 3 9 61108 0.0549 0.3689 0.06488
2026 2 10 61081 0.0631 0.3417 0.08423 2026 3 10 61109 0.0550 0.3703 0.06460
2026 2 11 61082 0.0625 0.3429 0.08462 2026 3 11 61110 0.0550 0.3717 0.06447
2026 2 12 61083 0.0620 0.3441 0.08513 2026 3 12 61111 0.0551 0.3731 0.06446
2026 2 13 61084 0.0615 0.3453 0.08570 2026 3 13 61112 0.0552 0.3744 0.06443
2026 2 14 61085 0.0610 0.3465 0.08618 2026 3 14 61113 0.0554 0.3758 0.06436
2026 2 15 61086 0.0606 0.3478 0.08646 2026 3 15 61114 0.0555 0.3772 0.06408
2026 2 16 61087 0.0601 0.3490 0.08651 2026 3 16 61115 0.0557 0.3786 0.06349
2026 2 17 61088 0.0597 0.3502 0.08629 2026 3 17 61116 0.0559 0.3799 0.06259
2026 2 18 61089 0.0594 0.3515 0.08575 2026 3 18 61117 0.0562 0.3813 0.06141
2026 2 19 61090 0.0590 0.3528 0.08502 2026 3 19 61118 0.0564 0.3827 0.06005
2026 2 20 61091 0.0587 0.3540 0.08419 2026 3 20 61119 0.0567 0.3840 0.05860
2026 2 21 61092 0.0584 0.3553 0.08335 2026 3 21 61120 0.0570 0.3854 0.05727
2026 2 22 61093 0.0581 0.3566 0.08261 2026 3 22 61121 0.0574 0.3867 0.05618
2026 2 23 61094 0.0578 0.3579 0.08206 2026 3 23 61122 0.0577 0.3881 0.05536
2026 2 24 61095 0.0576 0.3592 0.08182 2026 3 24 61123 0.0581 0.3894 0.05478
2026 2 25 61096 0.0574 0.3605 0.08174 2026 3 25 61124 0.0586 0.3907 0.05438
2026 2 26 61097 0.0572 0.3618 0.08178 2026 3 26 61125 0.0590 0.3921 0.05402
2026 2 27 61098 0.0570 0.3631 0.08189 2026 3 27 61126 0.0595 0.3934 0.05356
2026 2 28 61099 0.0569 0.3644 0.08189 2026 3 28 61127 0.0600 0.3947 0.05298
2026 3 1 61100 0.0568 0.3657 0.08172 2026 3 29 61128 0.0605 0.3960 0.05224
2026 3 2 61101 0.0567 0.3670 0.08136 2026 3 30 61129 0.0610 0.3973 0.05131
2026 3 3 61102 0.0567 0.3683 0.08079 2026 3 31 61130 0.0616 0.3986 0.05030
2026 3 4 61103 0.0566 0.3697 0.08008 2026 4 1 61131 0.0622 0.3999 0.04920
2026 3 5 61104 0.0566 0.3710 0.07935 2026 4 2 61132 0.0628 0.4012 0.04819
2026 3 6 61105 0.0567 0.3723 0.07875 2026 4 3 61133 0.0635 0.4024 0.04731
2026 3 7 61106 0.0567 0.3736 0.07836 2026 4 4 61134 0.0641 0.4037 0.04672
2026 3 8 61107 0.0568 0.3749 0.07813 2026 4 5 61135 0.0648 0.4050 0.04635
2026 3 9 61108 0.0569 0.3763 0.07808 2026 4 6 61136 0.0656 0.4062 0.04618
2026 3 10 61109 0.0570 0.3776 0.07827 2026 4 7 61137 0.0663 0.4074 0.04628
2026 3 11 61110 0.0571 0.3789 0.07855 2026 4 8 61138 0.0671 0.4086 0.04646
2026 3 12 61111 0.0573 0.3802 0.07886 2026 4 9 61139 0.0678 0.4098 0.04671
2026 3 13 61112 0.0575 0.3815 0.07917 2026 4 10 61140 0.0686 0.4110 0.04691
2026 3 14 61113 0.0577 0.3828 0.07941 2026 4 11 61141 0.0695 0.4122 0.04694
2026 3 15 61114 0.0580 0.3841 0.07945 2026 4 12 61142 0.0703 0.4134 0.04670
2026 3 16 61115 0.0583 0.3855 0.07926 2026 4 13 61143 0.0712 0.4145 0.04619
2026 3 17 61116 0.0586 0.3868 0.07879 2026 4 14 61144 0.0721 0.4157 0.04540
2026 3 18 61117 0.0589 0.3881 0.07805 2026 4 15 61145 0.0730 0.4168 0.04436
2026 3 19 61118 0.0592 0.3893 0.07714 2026 4 16 61146 0.0739 0.4179 0.04323
2026 3 20 61119 0.0596 0.3906 0.07617 2026 4 17 61147 0.0749 0.4190 0.04215
2026 3 21 61120 0.0600 0.3919 0.07528 2026 4 18 61148 0.0759 0.4201 0.04125
2026 3 22 61121 0.0604 0.3932 0.07457 2026 4 19 61149 0.0768 0.4211 0.04060
2026 3 23 61122 0.0609 0.3945 0.07407 2026 4 20 61150 0.0779 0.4222 0.04022
2026 3 24 61123 0.0614 0.3957 0.07389 2026 4 21 61151 0.0789 0.4232 0.04012
2026 3 25 61124 0.0619 0.3970 0.07393 2026 4 22 61152 0.0799 0.4242 0.04007
2026 3 26 61125 0.0624 0.3982 0.07404 2026 4 23 61153 0.0810 0.4253 0.03998
2026 3 27 61126 0.0629 0.3995 0.07410 2026 4 24 61154 0.0821 0.4262 0.03981
2026 3 28 61127 0.0635 0.4007 0.07400 2026 4 25 61155 0.0832 0.4272 0.03945
2026 3 29 61128 0.0641 0.4020 0.07359 2026 4 26 61156 0.0843 0.4282 0.03896
2026 3 30 61129 0.0647 0.4032 0.07292 2026 4 27 61157 0.0855 0.4291 0.03839
2026 3 31 61130 0.0653 0.4044 0.07215 2026 4 28 61158 0.0866 0.4300 0.03777
2026 4 1 61131 0.0660 0.4056 0.07125 2026 4 29 61159 0.0878 0.4309 0.03717
2026 4 2 61132 0.0667 0.4068 0.07037 2026 4 30 61160 0.0890 0.4318 0.03670
2026 4 3 61133 0.0674 0.4080 0.06956 2026 5 1 61161 0.0902 0.4327 0.03647
2026 4 4 61134 0.0681 0.4091 0.06893 2026 5 2 61162 0.0914 0.4335 0.03650
2026 4 5 61135 0.0689 0.4103 0.06842 2026 5 3 61163 0.0927 0.4343 0.03671
2026 4 6 61136 0.0697 0.4114 0.06812 2026 5 4 61164 0.0939 0.4351 0.03710
2026 4 7 61137 0.0705 0.4126 0.06802 2026 5 5 61165 0.0952 0.4359 0.03768
2026 4 8 61138 0.0713 0.4137 0.06814 2026 5 6 61166 0.0965 0.4367 0.03826
2026 4 9 61139 0.0721 0.4148 0.06828 2026 5 7 61167 0.0978 0.4374 0.03880
2026 4 10 61140 0.0730 0.4159 0.06842 2026 5 8 61168 0.0991 0.4382 0.03926
2026 4 11 61141 0.0739 0.4170 0.06844 2026 5 9 61169 0.1004 0.4389 0.03960
2026 4 12 61142 0.0748 0.4180 0.06820 2026 5 10 61170 0.1017 0.4396 0.03969
2026 4 13 61143 0.0757 0.4191 0.06770 2026 5 11 61171 0.1030 0.4402 0.03958
2026 4 14 61144 0.0766 0.4201 0.06699 2026 5 12 61172 0.1044 0.4409 0.03924
2026 4 15 61145 0.0776 0.4212 0.06611 2026 5 13 61173 0.1058 0.4415 0.03874
2026 4 16 61146 0.0786 0.4222 0.06511 2026 5 14 61174 0.1071 0.4421 0.03822
2026 4 17 61147 0.0796 0.4232 0.06423 2026 5 15 61175 0.1085 0.4427 0.03781
2026 4 18 61148 0.0806 0.4242 0.06358 2026 5 16 61176 0.1099 0.4432 0.03762
2026 4 19 61149 0.0816 0.4251 0.06321 2026 5 17 61177 0.1113 0.4438 0.03770
2026 4 20 61150 0.0827 0.4261 0.06322 2026 5 18 61178 0.1127 0.4443 0.03797
2026 4 21 61151 0.0837 0.4270 0.06337 2026 5 19 61179 0.1141 0.4448 0.03848
2026 4 22 61152 0.0848 0.4279 0.06356 2026 5 20 61180 0.1156 0.4453 0.03905
2026 4 23 61153 0.0859 0.4288 0.06364 2026 5 21 61181 0.1170 0.4457 0.03952
2026 4 24 61154 0.0871 0.4297 0.06349 2026 5 22 61182 0.1185 0.4461 0.03983
2026 4 25 61155 0.0882 0.4306 0.06314 2026 5 23 61183 0.1199 0.4465 0.03997
2026 4 26 61156 0.0894 0.4314 0.06257 2026 5 24 61184 0.1214 0.4469 0.03987
2026 4 27 61157 0.0905 0.4322 0.06185 2026 5 25 61185 0.1228 0.4473 0.03969
2026 4 28 61158 0.0917 0.4331 0.06111 2026 5 26 61186 0.1243 0.4476 0.03958
2026 4 29 61159 0.0929 0.4339 0.06040 2026 5 27 61187 0.1257 0.4479 0.03953
2026 4 30 61160 0.0941 0.4346 0.05980 2026 5 28 61188 0.1272 0.4482 0.03962
2026 5 1 61161 0.0954 0.4354 0.05946 2026 5 29 61189 0.1287 0.4485 0.03986
2026 5 2 61162 0.0966 0.4361 0.05933 2026 5 30 61190 0.1302 0.4487 0.04031
2026 5 3 61163 0.0979 0.4368 0.05942 2026 5 31 61191 0.1317 0.4489 0.04088
2026 5 4 61164 0.0991 0.4375 0.05971 2026 6 1 61192 0.1331 0.4491 0.04159
2026 5 5 61165 0.1004 0.4382 0.06017 2026 6 2 61193 0.1346 0.4493 0.04244
2026 5 6 61166 0.1017 0.4388 0.06065 2026 6 3 61194 0.1361 0.4494 0.04341
2026 5 7 61167 0.1030 0.4395 0.06110 2026 6 4 61195 0.1376 0.4496 0.04430
2026 5 8 61168 0.1043 0.4401 0.06146 2026 6 5 61196 0.1391 0.4497 0.04511
2026 5 9 61169 0.1057 0.4407 0.06171 2026 6 6 61197 0.1406 0.4497 0.04574
2026 5 10 61170 0.1070 0.4413 0.06171 2026 6 7 61198 0.1421 0.4498 0.04612
2026 5 11 61171 0.1084 0.4418 0.06155 2026 6 8 61199 0.1436 0.4498 0.04627
2026 5 12 61172 0.1097 0.4423 0.06119 2026 6 9 61200 0.1451 0.4498 0.04633
2026 5 13 61173 0.1111 0.4428 0.06070 2026 6 10 61201 0.1465 0.4498 0.04635
2026 5 14 61174 0.1125 0.4433 0.06014 2026 6 11 61202 0.1480 0.4498 0.04643
2026 5 15 61175 0.1139 0.4438 0.05964 2026 6 12 61203 0.1495 0.4497 0.04676
2026 5 16 61176 0.1153 0.4442 0.05948 2026 6 13 61204 0.1510 0.4496 0.04741
2026 5 17 61177 0.1167 0.4446 0.05963 2026 6 14 61205 0.1525 0.4495 0.04834
2026 5 18 61178 0.1181 0.4450 0.06010 2026 6 15 61206 0.1539 0.4494 0.04956
2026 5 19 61179 0.1195 0.4454 0.06068 2026 6 16 61207 0.1554 0.4492 0.05075
2026 5 20 61180 0.1209 0.4458 0.06123 2026 6 17 61208 0.1568 0.4490 0.05178
2026 5 21 61181 0.1224 0.4461 0.06169 2026 6 18 61209 0.1583 0.4488 0.05255
2026 5 22 61182 0.1238 0.4464 0.06196 2026 6 19 61210 0.1597 0.4486 0.05301
2026 5 23 61183 0.1252 0.4467 0.06208 2026 6 20 61211 0.1612 0.4483 0.05328
2026 5 24 61184 0.1267 0.4469 0.06202 2026 6 21 61212 0.1626 0.4481 0.05345
2026 5 25 61185 0.1281 0.4472 0.06187 2026 6 22 61213 0.1640 0.4478 0.05361
2026 5 26 61186 0.1296 0.4474 0.06184 2026 6 23 61214 0.1655 0.4474 0.05393
2026 5 27 61187 0.1311 0.4476 0.06187 2026 6 24 61215 0.1669 0.4471 0.05442
2026 5 28 61188 0.1325 0.4477 0.06209 2026 6 25 61216 0.1683 0.4467 0.05512
2026 5 29 61189 0.1340 0.4479 0.06251 2026 6 26 61217 0.1697 0.4463 0.05611
2026 5 30 61190 0.1355 0.4480 0.06313 2026 6 27 61218 0.1711 0.4459 0.05729
2026 5 31 61191 0.1369 0.4481 0.06394 2026 6 28 61219 0.1724 0.4455 0.05868
2026 6 1 61192 0.1384 0.4482 0.06487 2026 6 29 61220 0.1738 0.4450 0.06008
2026 6 2 61193 0.1399 0.4482 0.06591 2026 6 30 61221 0.1751 0.4446 0.06159
2026 6 3 61194 0.1413 0.4482 0.06694 2026 7 1 61222 0.1765 0.4441 0.06300
2026 6 4 61195 0.1428 0.4482 0.06790 2026 7 2 61223 0.1778 0.4435 0.06426
2026 6 5 61196 0.1443 0.4482 0.06877 2026 7 3 61224 0.1791 0.4430 0.06534
2026 6 6 61197 0.1457 0.4482 0.06950 2026 7 4 61225 0.1804 0.4424 0.06625
2026 6 7 61198 0.1472 0.4481 0.07002 2026 7 5 61226 0.1817 0.4418 0.06692
2026 6 8 61199 0.1487 0.4480 0.07030 2026 7 6 61227 0.1830 0.4412 0.06750
2026 6 9 61200 0.1501 0.4479 0.07051 2026 7 7 61228 0.1843 0.4406 0.06802
2026 6 10 61201 0.1516 0.4477 0.07062 2026 7 8 61229 0.1855 0.4400 0.06856
2026 6 11 61202 0.1530 0.4476 0.07078 2026 7 9 61230 0.1868 0.4393 0.06919
2026 6 12 61203 0.1545 0.4474 0.07103 2026 7 10 61231 0.1880 0.4386 0.06998
2026 6 13 61204 0.1559 0.4472 0.07158 2026 7 11 61232 0.1892 0.4379 0.07112
2026 6 14 61205 0.1574 0.4469 0.07239 2026 7 12 61233 0.1904 0.4372 0.07248
2026 6 15 61206 0.1588 0.4467 0.07343 2026 7 13 61234 0.1916 0.4364 0.07398
2026 6 16 61207 0.1602 0.4464 0.07452 2026 7 14 61235 0.1927 0.4357 0.07539
2026 6 17 61208 0.1616 0.4461 0.07551 2026 7 15 61236 0.1939 0.4349 0.07656
2026 6 18 61209 0.1631 0.4458 0.07621 2026 7 16 61237 0.1950 0.4341 0.07751
2026 6 19 61210 0.1645 0.4454 0.07668 2026 7 17 61238 0.1961 0.4333 0.07821
2026 6 20 61211 0.1659 0.4450 0.07691 2026 7 18 61239 0.1972 0.4324 0.07881
2026 6 21 61212 0.1673 0.4446 0.07694 2026 7 19 61240 0.1983 0.4316 0.07932
2026 6 22 61213 0.1686 0.4442 0.07699 2026 7 20 61241 0.1993 0.4307 0.07987
2026 6 23 61214 0.1700 0.4438 0.07723 2026 7 21 61242 0.2003 0.4298 0.08067
2026 6 24 61215 0.1714 0.4433 0.07764 2026 7 22 61243 0.2014 0.4289 0.08162
2026 6 25 61216 0.1727 0.4428 0.07823 2026 7 23 61244 0.2024 0.4280 0.08281
2026 6 26 61217 0.1741 0.4423 0.07906 2026 7 24 61245 0.2033 0.4271 0.08417
2026 6 27 61218 0.1754 0.4418 0.08011 2026 7 25 61246 0.2043 0.4261 0.08568
2026 6 28 61219 0.1768 0.4412 0.08129 2026 7 26 61247 0.2052 0.4251 0.08728
2026 6 29 61220 0.1781 0.4406 0.08253 2026 7 27 61248 0.2061 0.4242 0.08887
2026 6 30 61221 0.1794 0.4400 0.08379 2026 7 28 61249 0.2070 0.4232 0.09042
2026 7 1 61222 0.1807 0.4394 0.08503 2026 7 29 61250 0.2079 0.4221 0.09183
2026 7 2 61223 0.1819 0.4388 0.08607 2026 7 30 61251 0.2088 0.4211 0.09304
2026 7 3 61224 0.1832 0.4381 0.08690 2026 7 31 61252 0.2096 0.4201 0.09407
These predictions are based on all announced leap seconds. These predictions are based on all announced leap seconds.
CELESTIAL POLE OFFSET SERIES: CELESTIAL POLE OFFSET SERIES:
NEOS Celestial Pole Offset Series NEOS Celestial Pole Offset Series
MJD dpsi error deps error MJD dpsi error deps error
(msec. of arc) (msec. of arc)
60837 -112.47 0.89 -11.70 0.14 60865 -116.77 0.98 -11.24 0.21
60838 -112.54 0.89 -11.60 0.14 60866 -116.93 0.98 -11.18 0.21
60839 -112.51 0.89 -11.35 0.14 60867 -116.98 0.98 -10.97 0.21
60840 -112.45 0.32 -11.16 0.16
60841 -112.45 1.48 -11.11 0.30
60842 -112.49 1.48 -11.13 0.30
60843 -112.49 1.48 -11.15 0.30
60844 -112.49 1.20 -11.12 0.28
60845 -112.62 1.20 -11.03 0.28
60846 -112.97 1.20 -10.87 0.28
IERS Celestial Pole Offset Final Series
MJD dpsi deps
(msec. of arc)
60797 -109.8 -11.9
60798 -109.1 -12.1
60799 -108.8 -12.0
60800 -108.9 -11.6
60801 -109.3 -11.1
60802 -109.7 -10.8
60803 -109.8 -10.7
60804 -109.8 -10.6
60805 -109.7 -10.6
60806 -109.6 -10.8
60807 -109.5 -11.3
60808 -109.5 -11.7
60809 -109.6 -11.9
60810 -109.7 -11.8
60811 -109.7 -11.6
60812 -109.6 -11.6
60813 -109.5 -11.6
60814 -109.3 -11.6
60815 -109.2 -11.6
60816 -109.3 -11.6
60817 -109.4 -11.6
60818 -109.7 -11.4
60819 -110.2 -11.0
60820 -111.0 -10.7
60821 -111.6 -10.8
60822 -111.9 -11.1
60823 -111.8 -11.3
60824 -111.5 -11.6
60825 -110.9 -11.7
60826 -110.5 -11.8
60827 -110.5 -11.7
IAU2000A Celestial Pole Offset Series IAU2000A Celestial Pole Offset Series
MJD dX error dY error MJD dX error dY error
(msec. of arc) (msec. of arc)
60837 0.432 0.352 -0.216 0.145 60865 0.402 0.390 -0.210 0.213
60838 0.439 0.352 -0.218 0.145 60866 0.393 0.390 -0.229 0.213
60839 0.448 0.352 -0.222 0.145 60867 0.382 0.390 -0.247 0.213
60840 0.457 0.128 -0.227 0.160
60841 0.465 0.588 -0.235 0.303
60842 0.472 0.588 -0.243 0.303
60843 0.476 0.588 -0.251 0.303
60844 0.476 0.476 -0.260 0.282
60845 0.472 0.476 -0.267 0.282
60846 0.467 0.476 -0.275 0.282
IAU2000A Celestial Pole Offset Final Series
MJD dX dY
(msec. of arc)
60797 0.44 -0.19
60798 0.51 -0.19
60799 0.53 -0.19
60800 0.52 -0.18
60801 0.49 -0.17
60802 0.41 -0.16
60803 0.33 -0.14
60804 0.31 -0.16
60805 0.34 -0.21
60806 0.39 -0.26
60807 0.44 -0.30
60808 0.49 -0.33
60809 0.48 -0.26
60810 0.45 -0.17
60811 0.42 -0.09
60812 0.42 -0.07
60813 0.43 -0.10
60814 0.44 -0.14
60815 0.45 -0.18
60816 0.43 -0.21
60817 0.40 -0.22
60818 0.37 -0.22
60819 0.37 -0.21
60820 0.38 -0.19
60821 0.39 -0.16
60822 0.40 -0.14
60823 0.41 -0.12
60824 0.41 -0.11
60825 0.41 -0.11
60826 0.39 -0.14
60827 0.34 -0.18
)--"; )--";

View File

@ -27,8 +27,8 @@ template <traits::mcc_mount_controls_c MOUNT_CONTROLS>
class MccMount : public fsm::MccFiniteStateMachine, public utils::MccSpdlogLogger, protected MOUNT_CONTROLS class MccMount : public fsm::MccFiniteStateMachine, public utils::MccSpdlogLogger, protected MOUNT_CONTROLS
{ {
// declare these classes as friends to allow them access protected members 'slewModel' and 'guidingModel' // declare these classes as friends to allow them access protected members 'slewModel' and 'guidingModel'
friend class MccMountStateSlew<MccMount>; friend class MccMountStateSlew<MccMount<MOUNT_CONTROLS>>;
friend class MccMountStateGuiding<MccMount>; friend class MccMountStateGuiding<MccMount<MOUNT_CONTROLS>>;
public: public:
typedef MOUNT_CONTROLS mount_controls_t; typedef MOUNT_CONTROLS mount_controls_t;

View File

@ -139,21 +139,29 @@ public:
using guiding_point_t = MccSlewAndGuidingPoint; using guiding_point_t = MccSlewAndGuidingPoint;
template <traits::mcc_mount_controls_c MOUNT_CONTROLS_T, typename... LoggerCtorArgTs> template <traits::mcc_mount_telemetry_c TELEMETRY_T,
MccSimpleGuidingModel(MOUNT_CONTROLS_T& mount_controls, LoggerCtorArgTs&&... ctor_args) traits::mcc_mount_hardware_c HARDWARE_T,
traits::mcc_tuple_c PZ_T,
typename... LoggerCtorArgTs>
MccSimpleGuidingModel(TELEMETRY_T& telemetry,
HARDWARE_T& hardware,
PZ_T& prohibited_zone,
LoggerCtorArgTs&&... ctor_args)
requires(!std::same_as<LoggerT, MccNullLogger>) requires(!std::same_as<LoggerT, MccNullLogger>)
: LoggerT(std::forward<LoggerCtorArgTs>(ctor_args)...) : LoggerT(std::forward<LoggerCtorArgTs>(ctor_args)...)
{ {
logDebug(std::format("Create 'MccSimpleGuidingModel' class instance ({})", (void*)this)); logDebug(std::format("Create 'MccSimpleGuidingModel' class instance ({})", (void*)this));
init(mount_controls); init(telemetry, hardware, prohibited_zone);
} }
template <traits::mcc_mount_controls_c MOUNT_CONTROLS_T> template <traits::mcc_mount_telemetry_c TELEMETRY_T,
MccSimpleGuidingModel(MOUNT_CONTROLS_T& mount_controls) traits::mcc_mount_hardware_c HARDWARE_T,
traits::mcc_tuple_c PZ_T>
MccSimpleGuidingModel(TELEMETRY_T& telemetry, HARDWARE_T& hardware, PZ_T& prohibited_zone)
requires(std::same_as<LoggerT, MccNullLogger>) requires(std::same_as<LoggerT, MccNullLogger>)
{ {
init(mount_controls); init(telemetry, hardware, prohibited_zone);
} }
virtual ~MccSimpleGuidingModel() virtual ~MccSimpleGuidingModel()
@ -177,23 +185,24 @@ protected:
error_t init(auto& mount_controls) error_t init(auto& telemetry, auto& hardware, auto& prohibited_zones)
{ {
// deduce controls types // deduce controls types
using astrom_engine_t = decltype(mount_controls.astrometryEngine); // deduce controls types
using hardware_t = decltype(mount_controls.hardware); using hardware_t = decltype(hardware);
using pec_t = decltype(mount_controls.PEC); using telemetry_t = decltype(telemetry);
using telemetry_t = decltype(mount_controls.telemetry); static_assert(traits::mcc_mount_default_telemetry_c<telemetry_t>,
"TELEMETRY CLASS MUST BE A DESCENDANT OF 'MccMountTelemetry'!");
static_assert(std::derived_from<telemetry_t, MccMountTelemetry<astrom_engine_t, pec_t, hardware_t, using astrom_engine_t = typename telemetry_t::astrom_engine_t;
typename telemetry_t::mount_telemetry_data_t>>,
"TELEMETRY CLASS MUST BE A DESCENDANT OF 'MccMountTelemetry' ONE!");
using tpl_pz_t = decltype(mount_controls.prohibitedZones); static constexpr size_t Nzones = std::tuple_size_v<decltype(prohibited_zones)>;
const auto p_mount_controls = &mount_controls; const auto p_telemetry = &telemetry;
const auto p_hardware = &hardware;
const auto p_prohibited_zones = &prohibited_zones;
_guidingFunc = [p_mount_controls, this](guiding_point_t guiding_point) { _guidingFunc = [p_telemetry, p_hardware, p_prohibited_zones, this](guiding_point_t guiding_point) {
_stopRequested = false; _stopRequested = false;
if (guiding_point.correctionRange[0] >= guiding_point.correctionRange[1]) { if (guiding_point.correctionRange[0] >= guiding_point.correctionRange[1]) {
@ -203,19 +212,14 @@ protected:
auto low_corr_limit = guiding_point.correctionRange[0] * guiding_point.correctionRange[0]; auto low_corr_limit = guiding_point.correctionRange[0] * guiding_point.correctionRange[0];
auto high_corr_limit = guiding_point.correctionRange[1] * guiding_point.correctionRange[1]; auto high_corr_limit = guiding_point.correctionRange[1] * guiding_point.correctionRange[1];
auto& astrom_engine = p_mount_controls->astrometryEngine; // using coord_t = typename astrom_engine_t::coord_t;
auto& hardware = p_mount_controls->hardware; // using jd_t = typename astrom_engine_t::juldate_t;
auto& pec = p_mount_controls->PEC; // jd_t jd;
auto& telemetry = p_mount_controls->telemetry;
using coord_t = typename astrom_engine_t::coord_t;
using jd_t = typename astrom_engine_t::juldate_t;
jd_t jd;
error_t res_err; error_t res_err;
typename astrom_engine_t::error_t ast_err; typename astrom_engine_t::error_t ast_err;
typename pec_t::error_t pec_err; // typename pec_t::error_t pec_err;
typename telemetry_t::error_t t_err; typename telemetry_t::error_t t_err;
typename telemetry_t::mount_telemetry_data_t t_data; typename telemetry_t::mount_telemetry_data_t t_data;
@ -225,7 +229,7 @@ protected:
ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_GUIDING; ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_GUIDING;
t_err = telemetry.setTarget(guiding_point); t_err = p_telemetry->setTarget(guiding_point);
if (t_err) { if (t_err) {
if constexpr (std::same_as<decltype(t_err), error_t>) { if constexpr (std::same_as<decltype(t_err), error_t>) {
logError(std::format("An telemetry error occured: code = {} ({})", t_err.value(), t_err.message())); logError(std::format("An telemetry error occured: code = {} ({})", t_err.value(), t_err.message()));
@ -238,7 +242,7 @@ protected:
} }
} }
std::array<bool, std::tuple_size_v<tpl_pz_t>> in_zone_flag; std::array<bool, Nzones> in_zone_flag;
while (true) { while (true) {
if (_stopRequested) { if (_stopRequested) {
@ -249,10 +253,13 @@ protected:
// suspend the thread here until telemetry data is updated // suspend the thread here until telemetry data is updated
t_err = telemetry.waitForUpdatedData(t_data, guiding_point.telemetryUpdateTimeout); t_err = p_telemetry->waitForUpdatedData(t_data, guiding_point.telemetryUpdateTimeout);
ax_pos.x = t_data.mntPosX;
ax_pos.y = t_data.mntPosY;
// check prohibited zones ... // check prohibited zones ...
if (mccCheckInZonePZTuple(t_data, p_mount_controls->prohibitedZones, in_zone_flag)) { if (mccCheckInZonePZTuple(t_data, *p_prohibited_zones, in_zone_flag)) {
return MccSimpleGuidingModelErrorCode::ERROR_IN_PROHIBITED_ZONE; return MccSimpleGuidingModelErrorCode::ERROR_IN_PROHIBITED_ZONE;
}; };
@ -279,9 +286,13 @@ protected:
// compare t_data with computed coordinates ... // compare t_data with computed coordinates ...
if (_doCorrection) { if (_doCorrection) {
auto coord_diff = telemetry.targetToMountDiff(); auto coord_diff = p_telemetry->targetToMountDiff();
if (coord_diff.r2 < low_corr_limit) { if (coord_diff.r2 < low_corr_limit) {
logWarn(
std::format("guiding model: the 'mount-target' square of difference is less than the limit "
"(diff = {}; lim = {}). Do not perfrom the corrections!",
(double)coord_diff.r2, (double)high_corr_limit));
continue; continue;
} }
@ -294,22 +305,14 @@ protected:
} }
// do correction // do correction
// current celestial position of target is already computed for current time point
// so one needs only correct apparent coordinates for PEC corrections
ax_pos.time_point = t_data.time_point; ax_pos.time_point = t_data.time_point;
if constexpr (mccIsEquatorialMount(pec_t::mountType)) { ax_pos.x += coord_diff.xdiff;
ax_pos.x = t_data.tagHA - t_data.pecX; if (guiding_point.dualAxisGuiding) {
ax_pos.y = t_data.tagDEC - t_data.pecY; ax_pos.y += coord_diff.ydiff;
} else if constexpr (mccIsAltAzMount(pec_t::mountType)) {
ax_pos.x = t_data.tagAZ - t_data.pecX;
ax_pos.y = t_data.tagALT - t_data.pecY;
} else {
static_assert(false, "UNSUPPORTED MOUNT TYPE!");
} }
// asynchronous operation! // asynchronous operation!
auto err = hardware.setPos(ax_pos); auto err = p_hardware->setPos(ax_pos);
if (err) { if (err) {
if constexpr (std::same_as<decltype(err), error_t>) { if constexpr (std::same_as<decltype(err), error_t>) {
logError( logError(

View File

@ -454,25 +454,25 @@ concept mcc_prohibited_zone_c =
// check if given coordinates are into the zone. // check if given coordinates are into the zone.
// input coordinates interpretation is in according to 'zoneCoordPairKind' static constexpr member // input coordinates interpretation is in according to 'zoneCoordPairKind' static constexpr member
{ // {
t.inZone(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>()) // t.inZone(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>())
} -> std::convertible_to<bool>; // } -> std::convertible_to<bool>;
// for given coordinates and time the method computes a time to reach the zone. // // for given coordinates and time the method computes a time to reach the zone.
// implementation of the method must assume that input coordinates are apparent RA and DEC at given time // // implementation of the method must assume that input coordinates are apparent RA and DEC at given time
// point, while the time point is one from which computation should be performed (e.g. current time moment) // // point, while the time point is one from which computation should be performed (e.g. current time moment)
{ // {
t.timeTo(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(), // t.timeTo(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::time_point_t>()) // std::declval<typename T::time_point_t>())
} -> mcc_time_duration_c; // } -> mcc_time_duration_c;
// for given coordinates and time the method computes a time to exit from the zone // // for given coordinates and time the method computes a time to exit from the zone
{ // {
t.timeFrom(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(), // t.timeFrom(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::time_point_t>()) // std::declval<typename T::time_point_t>())
} -> mcc_time_duration_c; // } -> mcc_time_duration_c;
// requires for the methods above with the first argument of type // requires for the methods above with the first argument of type
// 'const mcc_mount_telemetry_data_c&' (const lvalue reference) // 'const mcc_mount_telemetry_data_c&' (const lvalue reference)
@ -505,13 +505,13 @@ concept mcc_mount_controls_c = requires(T t) {
requires mcc_mount_telemetry_c<decltype(t.telemetry)>; requires mcc_mount_telemetry_c<decltype(t.telemetry)>;
requires mcc_slew_model_c<decltype(t.slewModel)>; requires mcc_slew_model_c<decltype(t.slewModel)>;
// requires mcc_slew_model_c<decltype(t.slewModel), decltype(t.telemetry)>;
requires mcc_guiding_model_c<decltype(t.guidingModel)>; requires mcc_guiding_model_c<decltype(t.guidingModel)>;
// requires mcc_guiding_model_c<decltype(t.guidingModel), decltype(t.telemetry)>;
// a std::tuple of prohibited zones // a std::tuple of prohibited zones
[]<mcc_prohibited_zone_c<typename decltype(t.telemetry)::mount_telemetry_data_t>... Ts>(std::tuple<Ts...>) { // []<mcc_prohibited_zone_c<typename decltype(t.telemetry)::mount_telemetry_data_t>... Ts>(std::tuple<Ts...>) {
}(t.prohibitedZones); // }(t.prohibitedZones);
requires mcc_tuple_c<decltype(t.prohibitedZones)>;
}; };

View File

@ -332,4 +332,20 @@ protected:
}; };
namespace traits
{
template <typename T>
concept mcc_mount_default_telemetry_c = requires {
mcc_astrom_engine_c<typename T::astrom_engine_t>;
mcc_mount_pec_c<typename T::pec_t>;
mcc_mount_hardware_c<typename T::hardware_t>;
mcc_mount_telemetry_data_c<typename T::mount_telemetry_data_t>;
requires std::derived_from<T, mcc::MccMountTelemetry<typename T::astrom_engine_t, typename T::pec_t,
typename T::hardware_t, typename T::mount_telemetry_data_t>>;
};
} // namespace traits
} // namespace mcc } // namespace mcc

View File

@ -71,6 +71,7 @@ struct MccSlewAndGuidingPoint : MccCelestialPoint {
// ******* guiding-related parameters ******* // ******* guiding-related parameters *******
coord_t correctionRange[2]{(double)MccAngle(0.3_arcsecs), (double)MccAngle(5.0_arcsecs)}; coord_t correctionRange[2]{(double)MccAngle(0.3_arcsecs), (double)MccAngle(5.0_arcsecs)};
bool dualAxisGuiding{true}; // mount must be of an equatorial type: false means guiding along only HA-axis
}; };

View File

@ -124,21 +124,30 @@ public:
using slew_point_t = MccSlewAndGuidingPoint; using slew_point_t = MccSlewAndGuidingPoint;
template <traits::mcc_mount_controls_c MOUNT_CONTROLS_T, typename... LoggerCtorArgTs> template <traits::mcc_mount_telemetry_c TELEMETRY_T,
MccSimpleSlewModel(MOUNT_CONTROLS_T& mount_controls, LoggerCtorArgTs&&... ctor_args) traits::mcc_mount_hardware_c HARDWARE_T,
traits::mcc_tuple_c PZ_T, // std::tuple of prohibited zones
typename... LoggerCtorArgTs>
MccSimpleSlewModel(TELEMETRY_T& telemetry,
HARDWARE_T& hardware,
PZ_T& prohibited_zone,
LoggerCtorArgTs&&... ctor_args)
requires(!std::same_as<LoggerT, MccNullLogger>) requires(!std::same_as<LoggerT, MccNullLogger>)
: LoggerT(std::forward<LoggerCtorArgTs>(ctor_args)...) : LoggerT(std::forward<LoggerCtorArgTs>(ctor_args)...)
{ {
logDebug(std::format("Create 'MccSimpleSlewModel' class instance ({})", (void*)this)); logDebug(std::format("Create 'MccSimpleSlewModel' class instance ({})", (void*)this));
init(mount_controls); init(telemetry, hardware, prohibited_zone);
} }
template <traits::mcc_mount_controls_c MOUNT_CONTROLS_T> template <traits::mcc_mount_telemetry_c TELEMETRY_T,
MccSimpleSlewModel(MOUNT_CONTROLS_T& mount_controls) traits::mcc_mount_hardware_c HARDWARE_T,
traits::mcc_tuple_c PZ_T // std::tuple of prohibited zones
>
MccSimpleSlewModel(TELEMETRY_T& telemetry, HARDWARE_T& hardware, PZ_T& prohibited_zone)
requires(std::same_as<LoggerT, MccNullLogger>) requires(std::same_as<LoggerT, MccNullLogger>)
{ {
init(mount_controls); init(telemetry, hardware, prohibited_zone);
} }
MccSimpleSlewModel(MccSimpleSlewModel&&) = default; MccSimpleSlewModel(MccSimpleSlewModel&&) = default;
@ -169,56 +178,43 @@ protected:
std::atomic_bool _stopRequested{false}; std::atomic_bool _stopRequested{false};
std::function<error_t(const slew_point_t&)> _slewFunc{}; std::function<error_t(const slew_point_t&)> _slewFunc{};
void init(auto& mount_controls) void init(auto& telemetry, auto& hardware, auto& prohibited_zones)
{ {
// deduce controls types // deduce controls types
using astrom_engine_t = decltype(mount_controls.astrometryEngine); using hardware_t = decltype(hardware);
using hardware_t = decltype(mount_controls.hardware); using telemetry_t = decltype(telemetry);
using pec_t = decltype(mount_controls.PEC); static_assert(traits::mcc_mount_default_telemetry_c<telemetry_t>,
using telemetry_t = decltype(mount_controls.telemetry); "TELEMETRY CLASS MUST BE A DESCENDANT OF 'MccMountTelemetry'!");
static_assert(std::derived_from<telemetry_t, MccMountTelemetry<astrom_engine_t, pec_t, hardware_t,
typename telemetry_t::mount_telemetry_data_t>>,
"TELEMETRY CLASS MUST BE A DESCENDANT OF 'MccMountTelemetry' ONE!");
using tpl_pz_t = decltype(mount_controls.prohibitedZones); using astrom_engine_t = typename telemetry_t::astrom_engine_t;
static constexpr size_t Nzones = std::tuple_size_v<tpl_pz_t>; static constexpr size_t Nzones = std::tuple_size_v<decltype(prohibited_zones)>;
const auto p_mount_controls = &mount_controls; const auto p_telemetry = &telemetry;
const auto p_hardware = &hardware;
const auto p_prohibited_zones = &prohibited_zones;
_slewFunc = [p_telemetry, p_hardware, p_prohibited_zones, this](slew_point_t slew_point) {
_slewFunc = [p_mount_controls, this](slew_point_t slew_point) {
_stopRequested = false; _stopRequested = false;
auto& astrom_engine = p_mount_controls->astrometryEngine;
auto& hardware = p_mount_controls->hardware;
auto& pec = p_mount_controls->PEC;
auto& telemetry = p_mount_controls->telemetry;
using coord_t = typename astrom_engine_t::coord_t;
using jd_t = typename astrom_engine_t::juldate_t;
typename hardware_t::axes_pos_t ax_pos; typename hardware_t::axes_pos_t ax_pos;
error_t res_err; error_t res_err;
typename astrom_engine_t::error_t ast_err; // typename astrom_engine_t::error_t ast_err;
typename pec_t::error_t pec_err;
typename telemetry_t::error_t t_err; typename telemetry_t::error_t t_err;
typename telemetry_t::mount_telemetry_data_t t_data; typename telemetry_t::mount_telemetry_data_t t_data;
coord_t ra_icrs, dec_icrs;
if (slew_point.withinToleranceCycleNumber == 0) { if (slew_point.withinToleranceCycleNumber == 0) {
slew_point.withinToleranceCycleNumber = MccSlewAndGuidingPoint::defaultWithinToleranceCycleNumber; slew_point.withinToleranceCycleNumber = MccSlewAndGuidingPoint::defaultWithinToleranceCycleNumber;
} }
// first, compute encoder coordinates // first, compute encoder coordinates
ax_pos.time_point = astrom_engine_t::timePointNow(); ax_pos.time_point = astrom_engine_t::timePointNow();
t_err = telemetry.toHardware(slew_point, ax_pos.time_point, ax_pos.x, ax_pos.y); t_err = p_telemetry->toHardware(slew_point, ax_pos.time_point, ax_pos.x, ax_pos.y);
if (!t_err) { if (!t_err) {
// SETUP TARGET SKY POINT // SETUP TARGET SKY POINT
t_err = telemetry.setTarget(slew_point); t_err = p_telemetry->setTarget(slew_point);
} }
if (t_err) { if (t_err) {
@ -237,7 +233,7 @@ protected:
ax_pos.xrate = slew_point.slewXRate; ax_pos.xrate = slew_point.slewXRate;
ax_pos.yrate = slew_point.slewYRate; ax_pos.yrate = slew_point.slewYRate;
ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_SLEWING; ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_SLEWING;
typename hardware_t::error_t hw_err = hardware->setPos(ax_pos); typename hardware_t::error_t hw_err = p_hardware->setPos(ax_pos);
if (hw_err) { if (hw_err) {
if constexpr (std::same_as<decltype(hw_err), error_t>) { if constexpr (std::same_as<decltype(hw_err), error_t>) {
@ -260,9 +256,10 @@ protected:
adj_ax_pos.yrate = slew_point.adjustYRate; adj_ax_pos.yrate = slew_point.adjustYRate;
adj_ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_ADJUSTING; adj_ax_pos.moving_type = hardware_t::hw_moving_type_t::HW_MOVE_ADJUSTING;
typename telemetry_t::mount_telemetry_data_t::coord_t xr, yr, coord_diff2, typename telemetry_t::mount_telemetry_data_t::coord_t adj_rad2 = slew_point.adjustCoordDiff *
adj_rad2 = slew_point.adjustCoordDiff * slew_point.adjustCoordDiff, slew_point.adjustCoordDiff,
tol_rad2 = slew_point.slewToleranceRadius * slew_point.slewToleranceRadius; tol_rad2 = slew_point.slewToleranceRadius *
slew_point.slewToleranceRadius;
std::array<bool, Nzones> in_zone_flag; std::array<bool, Nzones> in_zone_flag;
@ -271,34 +268,34 @@ protected:
bool in_adj_mode = false; bool in_adj_mode = false;
// compute new hardware coordinate of target // compute new hardware coordinate of target
auto compute_new_coord = [](auto const& t_data, typename hardware_t::axes_pos_t& hw_pos) { // auto compute_new_coord = [](auto const& t_data, typename hardware_t::axes_pos_t& hw_pos) {
// current celestial position of target is already computed for given time point // // current celestial position of target is already computed for given time point
// so one needs only correct apparent coordinates for PEC corrections // // so one needs only correct apparent coordinates for PEC corrections
hw_pos.time_point = t_data.time_point; // hw_pos.time_point = t_data.time_point;
if constexpr (mccIsEquatorialMount(pec_t::mountType)) { // if constexpr (mccIsEquatorialMount(pec_t::mountType)) {
hw_pos.x = t_data.tagHA - t_data.pecX; // hw_pos.x = t_data.tagHA - t_data.pecX;
hw_pos.y = t_data.tagDEC - t_data.pecY; // hw_pos.y = t_data.tagDEC - t_data.pecY;
} else if constexpr (mccIsAltAzMount(pec_t::mountType)) { // } else if constexpr (mccIsAltAzMount(pec_t::mountType)) {
hw_pos.x = t_data.tagAZ - t_data.pecX; // hw_pos.x = t_data.tagAZ - t_data.pecX;
hw_pos.y = t_data.tagALT - t_data.pecY; // hw_pos.y = t_data.tagALT - t_data.pecY;
} else { // } else {
static_assert(false, "UNSUPPORTED MOUNT TYPE!"); // static_assert(false, "UNSUPPORTED MOUNT TYPE!");
} // }
}; // };
auto cycle_func = [&](auto t_data) mutable { auto cycle_func = [&](auto& t_data) mutable {
if (_stopRequested) { if (_stopRequested) {
res_err = MccSimpleSlewModelErrorCode::ERROR_SLEW_STOPPED; res_err = MccSimpleSlewModelErrorCode::ERROR_SLEW_STOPPED;
} }
// check for prohibited zones // check for prohibited zones
if (mccCheckInZonePZTuple(t_data, p_mount_controls->prohibitedZones, in_zone_flag)) { if (mccCheckInZonePZTuple(t_data, *p_prohibited_zones, in_zone_flag)) {
return MccSimpleSlewModelErrorCode::ERROR_IN_PROHIBITED_ZONE; return MccSimpleSlewModelErrorCode::ERROR_IN_PROHIBITED_ZONE;
}; };
// t_data was updated in caller!!! // t_data was updated in caller!!!
auto coord_diff = telemetry.targetToMountDiff(); auto coord_diff = p_telemetry->targetToMountDiff();
if (_stopRequested) { if (_stopRequested) {
res_err = MccSimpleSlewModelErrorCode::ERROR_SLEW_STOPPED; res_err = MccSimpleSlewModelErrorCode::ERROR_SLEW_STOPPED;
@ -307,9 +304,13 @@ protected:
if (coord_diff.r2 < adj_rad2) { // adjusting mode if (coord_diff.r2 < adj_rad2) { // adjusting mode
in_adj_mode = true; in_adj_mode = true;
compute_new_coord(t_data, adj_ax_pos); // compute_new_coord(t_data, adj_ax_pos);
hw_err = hardware->setPos(adj_ax_pos); adj_ax_pos.time_point = t_data.time_point;
adj_ax_pos.x += coord_diff.xdiff;
adj_ax_pos.y += coord_diff.ydiff;
hw_err = p_hardware->setPos(adj_ax_pos);
if (!hw_err) { if (!hw_err) {
++i_adj_cycle; ++i_adj_cycle;
@ -343,12 +344,26 @@ protected:
} else { // continue to slewing } else { // continue to slewing
if (in_adj_mode) { // ?!!!!!!!!!!!!! slew again?!!! if (in_adj_mode) { // ?!!!!!!!!!!!!! slew again?!!!
logWarn(std::format(
"The slewing is in adjusting mode but computed target-to-mount coordinate difference "
"'{}' is greater than limit '{}' for adjusting mode!",
coord_diff.r2, adj_rad2));
in_adj_mode = false; in_adj_mode = false;
i_adj_cycle = 0; i_adj_cycle = 0;
i_in_tol_cycle = 0; i_in_tol_cycle = 0;
compute_new_coord(t_data, ax_pos); // compute_new_coord(t_data, ax_pos);
typename hardware_t::error_t hw_err = hardware->setPos(ax_pos); adj_ax_pos.time_point = t_data.time_point;
adj_ax_pos.x += coord_diff.xdiff;
adj_ax_pos.y += coord_diff.ydiff;
ax_pos.time_point = t_data.time_point;
ax_pos.x = adj_ax_pos.x;
ax_pos.y = adj_ax_pos.y;
// send command for slewing
typename hardware_t::error_t hw_err = p_hardware->setPos(ax_pos);
if (hw_err) { if (hw_err) {
if constexpr (std::same_as<decltype(hw_err), error_t>) { if constexpr (std::same_as<decltype(hw_err), error_t>) {
@ -372,7 +387,7 @@ protected:
// NOTE: TARGET COORDINATES WILL BE UPDATED FOR CURRENT TIME-POINT IN TELEMETRY-CLASS!!! // NOTE: TARGET COORDINATES WILL BE UPDATED FOR CURRENT TIME-POINT IN TELEMETRY-CLASS!!!
while (true) { while (true) {
t_err = telemetry.waitForUpdatedData(t_data, slew_point.telemetryUpdateTimeout); t_err = p_telemetry->waitForUpdatedData(t_data, slew_point.telemetryUpdateTimeout);
if (t_err) { if (t_err) {
std::string err_str = "An error occured while waiting for updated telemetry"; std::string err_str = "An error occured while waiting for updated telemetry";