From 62db78e3df8baf81ae146897491df4121562fbe7 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 26 May 2025 14:41:45 +0300 Subject: [PATCH] Init --- doc/expl.jpg | Bin 0 -> 122322 bytes inc/GonetsAlmanac.h | 74 ++++++++++ modular.json | 17 +++ src/GonetsAlmanac.c | 348 ++++++++++++++++++++++++++++++++++++++++++++ tst/CMakeLists.txt | 20 +++ tst/CURALM.DAT | Bin 0 -> 1119 bytes tst/curalm(2).dat | Bin 0 -> 1119 bytes tst/modular.json | 13 ++ tst/test.c | 112 ++++++++++++++ 9 files changed, 584 insertions(+) create mode 100644 doc/expl.jpg create mode 100644 inc/GonetsAlmanac.h create mode 100644 modular.json create mode 100644 src/GonetsAlmanac.c create mode 100644 tst/CMakeLists.txt create mode 100644 tst/CURALM.DAT create mode 100644 tst/curalm(2).dat create mode 100644 tst/modular.json create mode 100644 tst/test.c diff --git a/doc/expl.jpg b/doc/expl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c31af5741486329904c84ab8fcd8adfb54befd6 GIT binary patch literal 122322 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 N%(Ke>^=urc?;rF}Bmw{c literal 0 HcmV?d00001 diff --git a/inc/GonetsAlmanac.h b/inc/GonetsAlmanac.h new file mode 100644 index 0000000..1ef63f7 --- /dev/null +++ b/inc/GonetsAlmanac.h @@ -0,0 +1,74 @@ +// +// Created by dd on 06.06.2023. +// + +#ifndef DECODERALMANACH_DECODER_H +#define DECODERALMANACH_DECODER_H + +#include "stdint.h" +#include "vector.h" +#include "time.h" +#include "stdbool.h" + +typedef struct __attribute__ ((packed)) { + uint8_t NKA; + uint16_t coil; + struct { + uint8_t day; + uint8_t month; + uint8_t year; + } date; + double equator_time; + double semimajor_axis; + double eccentricity; + double inclination; + double periapsis_argument; + double assending_node_longitud; + double saros; + double assending_node_longitude_delta; + double periapsis_argument_delta; + uint8_t validity_interval; +// uint8_t beginDateWTF; +// uint8_t validToWTF; +} tGonetsAlmanac; + + +//возвращаемое значение +//это количество элемтов в массиве inRange +size_t GonetsAlmanac_GetInRangeForInterval( + tGonetsAlmanac *alms, //массив альманахов + size_t almsCount, //количество элементов в массиве + + vector2 geoLocation, //собственная широта и долгота + float rangeDistance, //ограничение по расстоянию до спутника + + //интервал времени в течении которого (полностью от начала и до конца) + //спутник должен находиться в зоне видимости + time_t begin, + time_t end, + + //возвращаемый массив с номерами спутников + uint8_t *inRange +); + + +//возвращаемое значение +//это количество элемтов в массиве inRange +size_t GonetsAlmanac_GetInRangeForMoment( + tGonetsAlmanac *alms, //массив альманахов + size_t almsCount, //количество элементов в массиве + + vector2 geoLocation, //собственная широта и долгота + float rangeDistance, //ограничение по расстоянию до спутника + + time_t moment,//момент времени для которого запрашиваем спутники в зоне видимости + + //возвращаемый массив с номерами спутников + uint8_t *inRange +); + +float GonetsAlmanac_GetDistanceByAngleDeg(float angleDeg); + +bool GonetsAlmanac_IsValid(tGonetsAlmanac *alms, time_t now); + +#endif //DECODERALMANACH_DECODER_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..c1747cd --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "VectorMath" + } + ], + "cmake": { + "inc_dirs": [ + "./inc" + ], + "srcs": [ + "./src/**.c" + ] + } +} \ No newline at end of file diff --git a/src/GonetsAlmanac.c b/src/GonetsAlmanac.c new file mode 100644 index 0000000..8fab2f6 --- /dev/null +++ b/src/GonetsAlmanac.c @@ -0,0 +1,348 @@ +#include +#include +#include +#include +#include +#include "GonetsAlmanac.h" + + +const static double PI = 3.141592653589793238462643383279; +const static double PI2 = 6.283185307179586476925286766559; +const static double PIdiv2 = 1.570796326794896619231321691639; +const static double PI3div2 = 4.712388980384689857693965074919; +const static double _180divPi = 57.29577951308232087679815481410; + + +float RadToDeg(float rad) { + return rad * _180divPi; +} + +float DegToRad(float grad) { + return grad * (float) (PI / 180.0); +} + + +vector3 GeodesicToSpaceA(vector2 vc, int hh) { + double E2 = 0.00669438; + double EQ = 6378.137; + vc.x = DegToRad(vc.x); + vc.y = DegToRad(vc.y); + + double sin_fi = sin(vc.x); + double cos_fi = cos(vc.x); + double n = EQ / pow(1 - E2 * pow(sin_fi, 2), 0.5); + vector3 ret; + ret.x = (n + hh) * cos_fi * cos(vc.y); + ret.y = (n + hh) * cos_fi * sin(vc.y); + ret.z = ((1.0 - E2) * n + hh) * sin_fi; + return ret; +} + + +int GetSecond(int y, int m, int d, int h, int mi, int sec) { + int ret = 0; + if (y < 2000) y = 2000; + y -= 2000; + ret = (y * 365) + (y / 4) + 1; //при делении сделай целое + if (!(y % 4)) ret--; + + + int i; + for (i = 1; i < m; i++) { + int kolDay = 31; + switch (i) { + case 2: { + if (y % 4) kolDay = 28; + else + kolDay = 29; + } + break; + case 4: + kolDay = 30; + break; + case 6: + kolDay = 30; + break; + case 9: + kolDay = 30; + break; + case 11: + kolDay = 30; + break; + } + ret += kolDay; + } + ret += (d - 1); + ret = ret * 24 * 60 * 60 + h * 60 * 60 + mi * 60 + sec; + return ret; +} + + +double modfd(double a, double b) { + int dm = floor(a / b); + return a - (double) (dm * b); + +} + +vector2 GetCoorAlg1(tGonetsAlmanac *station, int sec, int day, int mon, int year) { + vector2 vc; + vc.x = 0; + vc.y = 0; + if (station->saros < 2000) return vc; + double secTc = GetSecond(year, mon, day, 0, 0, 0) + sec; + double secAll = + GetSecond(station->date.year + 2000, station->date.month, station->date.day, 0, 0, 0) + + station->equator_time; + +// double secAll= GetSecund(2023, 6, 5, 0, 0, 0) + station.equator_time; + + if (secAll > secTc) + return vc; + + double Ttek_Tnu = secTc - secAll; + + if (Ttek_Tnu > 315360000) return vc; + // console.debug("2222"); + + ////// + double i = station->inclination; + + double We = 0.00007303; + double T_T = Ttek_Tnu; + if (T_T >= station->saros) { + T_T = modfd(T_T, station->saros); + } + + double U = PI2 * T_T; + U = U / station->saros; + //console.debug(T_T); + double S = asin(sin(i) * sin(U)); + double Dd = 0; + if (0 <= U && U <= PIdiv2) { + Dd = atan(cos(i) * tan(U)); + } else if (PIdiv2 < U && U < PI3div2) { + Dd = PI + atan(cos(i) * tan(U)); + + } else if (PI3div2 < U && U < PI2) { + Dd = 2 * PI + atan(cos(i) * tan(U)); + + } else if (U == PIdiv2 || U == PI3div2) { + Dd = U; + } + + double D = (station->assending_node_longitud + Dd - (We * Ttek_Tnu)); + if (D >= PI2) { + D = modfd(D, PI2); + } + if (D <= -PI2) { + D = modfd(D, -PI2); + } + if (D < -PI) D += PI2; +// console.debug(S); +// console.debug(D); + vc.x = RadToDeg(S); + vc.y = RadToDeg(D); +// console.debug(vc.fi,"li=",vc.li); + return vc; +} + +vector3 AlmanacCalc(tGonetsAlmanac *station, struct tm date) { + + vector2 coord = GetCoorAlg1( + station, + date.tm_sec + date.tm_min * 60 + date.tm_hour * 3600, date.tm_mday, + date.tm_mon + 1, + date.tm_year + ); + + vector3 v = GeodesicToSpaceA(coord, 1500); + +// printf("%d coor = %lf %lf v=%lf %lf %lf\n", station.NKA, coord.x, coord.y, v.x, v.y, v.z); + return v; +} + +static float getTriangleOppositeAngle(float adjacent, float opposite, float angle) { + return asinf((opposite / adjacent) * sinf(angle)); +} + +static float getTriangleOppositeEdge(float adjacentA, float adjacentB, float angle) { + return sqrtf( + powf(adjacentA, 2) + powf(adjacentB, 2) - 2 * adjacentA * adjacentB * cosf(angle) + ); +} + +static float getTriangleAdjacentEdge(float adjacent, float opposite, float angle) { + float oppositeAngle = (float) PI - getTriangleOppositeAngle(adjacent, opposite, angle) - angle; + return getTriangleOppositeEdge(adjacent, opposite, oppositeAngle); +} + +static float getTriangleAngle(float adjacentA, float adjacentB, float opposite) { + return acosf((powf(adjacentA, 2) + powf(adjacentB, 2) - powf(opposite, 2)) / (2 * adjacentA * adjacentB)); +} + + +static const float earthRadius = 6378.135f; +static const float orbitMax = 8000.f; +static const float RAD_90_DEG = 1.5708f; + + +float GonetsAlmanac_GetDistanceByAngleDeg(float angleDeg) { + return getTriangleAdjacentEdge(orbitMax, earthRadius, (float) (DegToRad(angleDeg) + PI / 2)); +} + + +//получаем угол между нормалью и вектором предельной дальности +static float rangeAngleFromDistance(float distance) { + return (float) (PI - getTriangleAngle(earthRadius, distance, orbitMax)); +} + +bool GonetsAlmanac_InRange( + tGonetsAlmanac *alms, + vector3 selfPosition, + float rangeDistance, + float rangeAngle, + struct tm ts +) { + vector3 satPos; //переменная для записи координат спутника + satPos = AlmanacCalc(alms, ts); //получили координаты + + vector3 direction = vector3Less(satPos, selfPosition);// получаем вектор направления от спутника до нас + float distance = vector3Len(direction); //узнали дистанцию + + if (distance <= rangeDistance) { + + //рассчитали угол мужду нормалью к поверхности и направлением на спутник + float angle = vector3Angle(selfPosition, direction); + +// для наглядности при отладке переводим все в градусы, а так они нафиг ненужны +// float angleDeg = RadToDeg(angle); +// float rangeAngleDeg = RadToDeg(rangeAngle); + + if (angle < rangeAngle) { //проверили подходит ли спутник + return true; + } + } + return false; +} + +static const time_t time_step = 60;//шаг времени при проходе интервала + +size_t GonetsAlmanac_GetInRangeForInterval( + tGonetsAlmanac *alms, + size_t almsCount, + + vector2 geoLocation, + float rangeDistance, + + time_t begin, + time_t end, + + uint8_t *inRange +) { + float rangeAngle = rangeAngleFromDistance(rangeDistance); + vector3 selfPosition = GeodesicToSpaceA(geoLocation, 0); + + bool notInRange[almsCount]; + memset(notInRange, 0, almsCount); + + struct tm ts; + +// for (time_t timet = begin; timet <= end; timet += time_step) { //цикл по времени от начала интервала до конца +// ts = *gmtime(&timet); +// ts.tm_year = ts.tm_year - 100 + 2000; +// +// for (int i = 0; i < almsCount; i++) { //цикл по всем спутникам +// if (!GonetsAlmanac_InRange(alms + i, selfPosition, rangeDistance, rangeAngle, ts)) { +// notInRange[i] = true; +// } +// } +// } + + //проверка нахождения спутников в начале интервала + { + ts = *gmtime(&begin); + ts.tm_year = ts.tm_year - 100 + 2000; + + for (int i = 0; i < almsCount; i++) { //цикл по всем спутникам + if (!GonetsAlmanac_InRange(alms + i, selfPosition, rangeDistance, rangeAngle, ts)) { + notInRange[i] = true; + } + } + } + + + //проверка нахождения спутников в конце интервала + { + ts = *gmtime(&end); + ts.tm_year = ts.tm_year - 100 + 2000; + + for (int i = 0; i < almsCount; i++) { //цикл по всем спутникам + if (!GonetsAlmanac_InRange(alms + i, selfPosition, rangeDistance, rangeAngle, ts)) { + notInRange[i] = true; + } + } + } + + int inRangeCount = 0; + for (size_t i = 0; i < almsCount; ++i) { + if (!notInRange[i]) { + inRange[inRangeCount] = alms[i].NKA; + ++inRangeCount; + } + } + + return inRangeCount; +} + + +size_t GonetsAlmanac_GetInRangeForMoment( + tGonetsAlmanac *alms, + size_t almsCount, + + vector2 geoLocation, + float rangeDistance, + + time_t moment, + + uint8_t *inRange +) { + float rangeAngle = rangeAngleFromDistance(rangeDistance); + vector3 selfPosition = GeodesicToSpaceA(geoLocation, 0); + + bool notInRange[almsCount]; + memset(notInRange, 0, almsCount); + + struct tm ts; + + ts = *gmtime(&moment); + ts.tm_year = ts.tm_year - 100 + 2000;// что за магия? + + for (int i = 0; i < almsCount; i++) { //цикл по всем спутникам + if (!GonetsAlmanac_InRange(alms + i, selfPosition, rangeDistance, rangeAngle, ts)) { + notInRange[i] = true; + } + } + + int inRangeCount = 0; + for (size_t i = 0; i < almsCount; ++i) { + if (!notInRange[i]) { + inRange[inRangeCount] = alms[i].NKA; + ++inRangeCount; + } + } + + return inRangeCount; +} + +bool GonetsAlmanac_IsValid(tGonetsAlmanac *alms, time_t now) { + struct tm begin = {0}; + + begin.tm_year = alms->date.year + 100; + begin.tm_mon = alms->date.month - 1; + begin.tm_mday = alms->date.day; +// begin.tm_gmtoff = 3600; + + time_t begin_ts = mktime(&begin); + + return (begin_ts + (60 * 60 * 24 * alms->validity_interval)) > now; +} \ No newline at end of file diff --git a/tst/CMakeLists.txt b/tst/CMakeLists.txt new file mode 100644 index 0000000..dc977ad --- /dev/null +++ b/tst/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.17) +project(decoderAlmanacTest C) + +set(CMAKE_C_STANDARD 99) + +include(modular.cmake) + +add_executable(decoderAlmanacTest ${SOURCES} test.c) + +target_link_libraries(decoderAlmanacTest m) + + + +#cmake_minimum_required(VERSION 3.17) +#project(test C) +# +#set(CMAKE_C_STANDARD 11) +# +# +#add_executable(test ${SOURCES} test.c) diff --git a/tst/CURALM.DAT b/tst/CURALM.DAT new file mode 100644 index 0000000000000000000000000000000000000000..fb217a95a23cf676bb197b7b0e698aca6a046ebe GIT binary patch literal 1119 zcmYk+iBHpK9LI66v{LE>?4UraQW*FvRKO0WK*#f-U8KbeB0D+8)rrIjxG@8CU?J9x zt(3x4goy|Y5R3?dWX#S8s1Yo~Z0eLlfw4mvhd<~+Df`xB%l?5^-k&GW^UTEBWU{RG zTUl8H=F6^%|zsOZnpfd5)EP7oCRD{f7#oE_6ryfW4aPJ9xXiZxQ7(g zPmu-R+v-sN8TnSN)QHkOQ;KS1ml5a85V6X)3*Xofw2uQ^8Rg@ifHvTqN^EE}R{J*n z&E1vfG5bYuat?4V<@xcR;{7Q4@t9i`)FsI%rED*Iy!UF8YMyC>eNC<-e?T3>vviv) za2-3#rQ+)~8p64R0(IxjZIh33NxVm2$0!EQWYRrtkBInhEWbniR?=oB_6b(^ zuGXmam!#8iu^Thdk4MGaGF`?L)HS##%viWekD06fOXV8ERcMAf#nPQiy9P;Ywr|O| zaJ+A33*+(asqgvq16U-uKkH$;KMa|m9N5i8n{4z^(PL%osEA zz|r7W=a-5cwDrnpI~}5EqgpFP3#fdZm=s7z^zN8-%5&fp1Wn`w+<>}XZEP*o5F7bY z;DiUWz7?5C9JAhvo(Y_aOm$kWPDNwC{TUMp+=Tpf{SuW#i3dN;JaJ(Tl_yW|hyKTj zhMa2V*<~8SoiBy4hI1vh>oY3wksm^or+`Z+8V+shPeziT8KL)J>?y6{Bf3C`9B=I# zA2Cg%&XBZgufRq5-D_ZzWvn1CW>4~JxW-&N1JrfPmyVNK5+BIiOD_QK%}v*jVY5?30jon3gDU>`F33mX5`&HmrE;KLTx)u-Iho8@7axVuDs7~ z2F~*(m(}~#Y+QXKzR`Mry#ly))?n7|;S_Y>4GW}0LW!5K`t&l|Uhrdlzq1jE4n6L* Yd;wM7BQ?%Yry5*%ev7Ww5J4{g0BzdWh5!Hn literal 0 HcmV?d00001 diff --git a/tst/curalm(2).dat b/tst/curalm(2).dat new file mode 100644 index 0000000000000000000000000000000000000000..fb217a95a23cf676bb197b7b0e698aca6a046ebe GIT binary patch literal 1119 zcmYk+iBHpK9LI66v{LE>?4UraQW*FvRKO0WK*#f-U8KbeB0D+8)rrIjxG@8CU?J9x zt(3x4goy|Y5R3?dWX#S8s1Yo~Z0eLlfw4mvhd<~+Df`xB%l?5^-k&GW^UTEBWU{RG zTUl8H=F6^%|zsOZnpfd5)EP7oCRD{f7#oE_6ryfW4aPJ9xXiZxQ7(g zPmu-R+v-sN8TnSN)QHkOQ;KS1ml5a85V6X)3*Xofw2uQ^8Rg@ifHvTqN^EE}R{J*n z&E1vfG5bYuat?4V<@xcR;{7Q4@t9i`)FsI%rED*Iy!UF8YMyC>eNC<-e?T3>vviv) za2-3#rQ+)~8p64R0(IxjZIh33NxVm2$0!EQWYRrtkBInhEWbniR?=oB_6b(^ zuGXmam!#8iu^Thdk4MGaGF`?L)HS##%viWekD06fOXV8ERcMAf#nPQiy9P;Ywr|O| zaJ+A33*+(asqgvq16U-uKkH$;KMa|m9N5i8n{4z^(PL%osEA zz|r7W=a-5cwDrnpI~}5EqgpFP3#fdZm=s7z^zN8-%5&fp1Wn`w+<>}XZEP*o5F7bY z;DiUWz7?5C9JAhvo(Y_aOm$kWPDNwC{TUMp+=Tpf{SuW#i3dN;JaJ(Tl_yW|hyKTj zhMa2V*<~8SoiBy4hI1vh>oY3wksm^or+`Z+8V+shPeziT8KL)J>?y6{Bf3C`9B=I# zA2Cg%&XBZgufRq5-D_ZzWvn1CW>4~JxW-&N1JrfPmyVNK5+BIiOD_QK%}v*jVY5?30jon3gDU>`F33mX5`&HmrE;KLTx)u-Iho8@7axVuDs7~ z2F~*(m(}~#Y+QXKzR`Mry#ly))?n7|;S_Y>4GW}0LW!5K`t&l|Uhrdlzq1jE4n6L* Yd;wM7BQ?%Yry5*%ev7Ww5J4{g0BzdWh5!Hn literal 0 HcmV?d00001 diff --git a/tst/modular.json b/tst/modular.json new file mode 100644 index 0000000..203edd4 --- /dev/null +++ b/tst/modular.json @@ -0,0 +1,13 @@ +{ + "dep": [ + { + "type": "git", + "provider": "GONEC_NEW", + "repo": "ArrayPrint" + }, + { + "type": "local", + "dir": "../" + } + ] +} \ No newline at end of file diff --git a/tst/test.c b/tst/test.c new file mode 100644 index 0000000..e7b1316 --- /dev/null +++ b/tst/test.c @@ -0,0 +1,112 @@ +// +// Created by xemon on 21.06.23. +// +#include "GonetsAlmanac.h" +#include +#include +#include "time.h" + +#define TEST_ALMANAC_FILE "curalm(2).dat" +//#define TEST_ALMANAC_FILE "../CURALM.DAT" + + +//double rangeAngle=90-89.65081259507197; //угол конуса +double rangeAngle = 40; +double rangeDistance = 5117; //дистанция до спутника +const RANGEMIN = 5; + + +size_t load_from_file(tGonetsAlmanac *alms) { + size_t countAlmanac = 0; + + // подгружаем альманахи + FILE *f = fopen(TEST_ALMANAC_FILE, "r+"); + fseek(f, 11, SEEK_CUR); + tGonetsAlmanac alm; + // сделали декодирование (достаточно просто считать их в запакованную структуру) + while (!feof(f)) { + size_t read = (fread(&alm, sizeof(tGonetsAlmanac), 1, f)); + ////важно чтоб весь альманах целеком был подгружен!!!! + if (read) { + *alms = alm; + ++alms; + countAlmanac++; + } + } + fclose(f); + + return countAlmanac; +} + +void timeCheck(tGonetsAlmanac *alms, int countAlmanac, time_t now) { + //вводим начальные данные + + struct tm ts; + // time(&now); + + time_t interval_begin = now - 1 * 60; + time_t interval_end = now + 1 * 60; + // now += 3 * 3600; +// ts = *localtime(&now); //текущее время + +// vector3 vectorAlmanac; //переменная для записи координат спутника + + uint8_t inRange[100]; // массив со спутниками внутри конуса + int countRange = 0; + + vector2 selfPosition = {52.232f, 41.2322f};//твоя позиция + + + countRange = GonetsAlmanac_GetInRangeForInterval( +// countRange = GonetsAlmanac_GetInRangeForMoment( + alms, + countAlmanac, + + selfPosition, + 4000, + + interval_begin, + interval_end, +// now, + + inRange + ); + + printf("in range (%i): ", countRange); + for (uint8_t *nka = inRange, *end = inRange + countRange; nka < end; ++nka) { + printf("%02i ", *nka); + } + printf("\n"); + +} + +int main() { + + tGonetsAlmanac alms[50]; + + int countAlmanac = load_from_file(alms); + + printf("alms (%i): ", countAlmanac); + for (tGonetsAlmanac *alm = alms, *end = alms + countAlmanac; alm < end; ++alm) { + printf("%02i ", alm->NKA); + } + + time_t now, end; + now = 1687536080; +// now = 1686730934; + end = now + 3600 * 120; + + printf("\n"); + if (GonetsAlmanac_IsValid(alms, now)) { + printf("valid\n "); + } else { + printf("expired\n "); + } + + + for (time_t timestamp = now; timestamp < end; timestamp += 60) { + timeCheck(alms, countAlmanac, timestamp); + } + + return 0; +}