From 68f31ded2424a677cd236676c4564f3346cde824 Mon Sep 17 00:00:00 2001 From: KenanZhu111 <3471685733@qq.com> Date: Sat, 26 Oct 2024 10:14:53 +0800 Subject: [PATCH] BIG UPDATE: 1. Full gui 2. Integrated KNZ_Calculate and KNZ_Plot 3. Realized GPS, BeiDou, Galileo, GLONASS satellite position calculation, 4. New module added: 3D satellite orbit display --- README.md | 39 -- SPP_calculate.c | 564 --------------- app/Mainui.py | 1571 ++++++++++++++++++++++++++++++++++++++++++ app/Trocor.py | 36 + headers/2gpst.h | 34 - headers/blh2enu.h | 38 - headers/cal_mod.h | 491 ------------- headers/deg2dms.h | 32 - headers/degRrad.h | 27 - headers/public.h | 302 -------- headers/rahcal.h | 37 - headers/read.h | 577 ---------------- headers/select_epo.h | 58 -- headers/type2code.h | 108 --- headers/xyz2blh.h | 50 -- plot/Mainui.py | 1065 ---------------------------- plot/Trocor.py | 24 - resouce/Delete.ico | Bin 6782 -> 0 bytes resouce/Main.ico | Bin 4286 -> 0 bytes resouce/Options.ico | Bin 4286 -> 0 bytes resouce/Plot.ico | Bin 4286 -> 0 bytes resouce/Reload.ico | Bin 6782 -> 0 bytes resouce/View.ico | Bin 9662 -> 0 bytes resource.h | 19 - src/dllmain.cpp | 1416 +++++++++++++++++++++++++++++++++++++ src/framework.h | 5 + src/pch.cpp | 5 + src/pch.h | 398 +++++++++++ 28 files changed, 3431 insertions(+), 3465 deletions(-) delete mode 100644 SPP_calculate.c create mode 100644 app/Mainui.py create mode 100644 app/Trocor.py delete mode 100644 headers/2gpst.h delete mode 100644 headers/blh2enu.h delete mode 100644 headers/cal_mod.h delete mode 100644 headers/deg2dms.h delete mode 100644 headers/degRrad.h delete mode 100644 headers/public.h delete mode 100644 headers/rahcal.h delete mode 100644 headers/read.h delete mode 100644 headers/select_epo.h delete mode 100644 headers/type2code.h delete mode 100644 headers/xyz2blh.h delete mode 100644 plot/Mainui.py delete mode 100644 plot/Trocor.py delete mode 100644 resouce/Delete.ico delete mode 100644 resouce/Main.ico delete mode 100644 resouce/Options.ico delete mode 100644 resouce/Plot.ico delete mode 100644 resouce/Reload.ico delete mode 100644 resouce/View.ico delete mode 100644 resource.h create mode 100644 src/dllmain.cpp create mode 100644 src/framework.h create mode 100644 src/pch.cpp create mode 100644 src/pch.h diff --git a/README.md b/README.md index 2140649..139597f 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,2 @@ -# **MAIN FUNCTION INTRODUCTION** -* Reads the specified observation data and navigation data. -* Calculate the coordinates of each epoch of the satellite in the ECEF coordinate system (.sp file).[ADIN 2024/10/5] -* ~~With the help of PyGMT, the output document information is processed and the satellite ground track map is drawn.~~ -* ~~With the help of MatLab tool, the satellite position is calculated and the station position is obtained by simultaneous solution, and the precision is evaluated by comparing with the coordinates of the precise station.~~ -* With the help of SPP_plot, the coordinates of the station can be calculated. And draw the image.[ADIN 2024/10/5] -# MAIN NOTICE - -## Program notice - ### About main calculate - * ~~Due to the lack of program writing experience, the ease of file reading is not perfect, if you need to read other observation files and navigation files, you can make changes in the ***main.c*** file.~~ - * ~~It is constantly modified and updated, and the reading of the file is controlled through the form of the terminal, and is optimized visually.[ADIN 2024/9/22]~~ - * After a few updates, the observation file and navigation ephemeris file can be selected through the file dialog, and the SPP_calculate program can generate satellite position information (.sp file) in a folder specified by the user.[ADIN 2024/10/5] - * The format of the (.sp file) is described in detail in the help documentation. - ### About PyGMT(STOP) - * ~~I have improved the drawing part of PyGMT to ensure that the output data can be used independently.~~ - * As of October 5, 2024, projects for PyGMT drawing will no longer be considered.[ADIN 2024/10/5] - ### About Matlab(STOP)(REPLACEED BY SPP_plot) - * ~~When the new station data is needed for calculation, two parts of parameters in the Matlab source file need to be corrected, the first is the exact coordinates of the station in the file header, and the second is the longitude, latitude and elevation information of the station in the file header.(OINP)~~ - ### About PyPlot - * With the help of python's tkinter and matplotlib libraries, it is realized to read and process the.sp file generated by SPP_calculate and generate the (.po file) in the (.sp file) sibling directory. The generated.po file can be processed by SPP_plot to obtain line plots of ENU components. - * At present, the algorithm of station position calculation is integrated in the plot, and only two default tropospheric and ionospheric correction algorithms are supported at present, and the accuracy is still being optimized. - * The format of the (.po file) is described in detail in the help documentation. - -## Project notice -* Due to my limited programming level, ~~PyGMT drawing used too miscellaneous judgment statements, resulting in slow drawing or debugging errors,~~ please forgive. -* When writing the code, with the help of the existing open source code results, and different degrees of reference, here one by one mark and express thanks: - -| *https://blog.csdn.net/why1472587?type=blog* -| *https://zhuanlan.zhihu.com/p/416072448* -| *https://www.pygmt.org/latest/index.html* -| *https://blog.csdn.net/FrankXCR/article/details/135438701* - -### Document label specification -* [ADIN TIME]: new added in "TIME"(e.g. [ADIN 2024/9/22]: new added in 2024/9/22). -* (OINP): Operation in progress, or in urgent need of improvement. -* (STOP): No longer update maintenance or consider implementing features. - -#### *This program code is solely for study and communication purposes* #### diff --git a/SPP_calculate.c b/SPP_calculate.c deleted file mode 100644 index 55c6e56..0000000 --- a/SPP_calculate.c +++ /dev/null @@ -1,564 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#pragma comment(lib, "comctl32") - -#include"resource.h" -#include"headers/public.h" -#include"headers/read.h" -#include"headers/cal_mod.h" - -#pragma comment(linker,"\"/manifestdependency:type='win32' \ -name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ -processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") - -HWND hwndb[15];//BUTTON HANDLE -HWND hwndopt;//OPTIONS HANDLE -HWND hwndopt_def_ion;//DEFAULT ION COR -HWND hwndopt_def_tro;//DEFAULT TRO COR -HWND hwndopt_confirm;//OPTION CONFIRM - -FILE* fp_nav = NULL; -FILE* fp_obs = NULL; -FILE* result_file = NULL; - -pnav_head nav_h = NULL; -pnav_body nav_b = NULL; -pobs_head obs_h = NULL; -pobs_epoch obs_e = NULL; -pobs_body obs_b = NULL; - -/*INITIAL CONST*/ -int o_epochnum = 0; -int satnum = 0; - -/*INITIAL SETTINGS*/ -static int ionoption = 0; -static int trooption = 0; -/* ------------- */ -char obs_f[MAX_PATH] = { 0 }; -char nav_f[MAX_PATH] = { 0 }; - -char path[MAX_PATH]; -const wchar_t wpath[MAX_PATH];//PROGRAM'S FOLDER - -static void ProgressBar(HWND hwnd, int BEG, int DES)//PROGRESS BAR FUNCTION -{ - PBRANGE range; - SendMessage(hwnd, PBM_SETRANGE, (WPARAM)FALSE, (LPARAM)(MAKELPARAM(0, 100))); - SendMessage(hwnd, PBM_GETRANGE, (WPARAM)TRUE, (LPARAM)&range); - SendMessage(hwnd, PBM_SETPOS, (WPARAM)BEG, (LPARAM)0); - for (int i = 0; i < DES - BEG; i += fabs(DES - BEG)/(DES - BEG)) - { - SendMessage(hwnd, PBM_SETPOS, (WPARAM)(int)( i + BEG / 10), (LPARAM)0); - if (SendMessage(hwnd, PBM_GETPOS, (WPARAM)0, (LPARAM)0) == range.iHigh * DES/PBSTATEFULL) - { - break; - } - } - SendMessage(hwnd, PBM_SETPOS, (WPARAM)DES, (LPARAM)0); -} - -static int FileSelobsDialog(const wchar_t* path)//FILEDIALOG FOR OBS -{ - OPENFILENAME ofn; - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.lpstrFile = path; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFilter = FILEEXOP; - ofn.lpstrTitle = TEXT("Open From"); - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - return GetOpenFileName(&ofn); -} - -static int FileSelnavDialog(const wchar_t* path)//FILEDIALOG FOR NAV -{ - OPENFILENAME ofn; - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.lpstrFile = path; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFilter = FILEEXNP; - ofn.lpstrTitle = TEXT("Open From"); - ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; - return GetOpenFileName(&ofn); -} - -static int FileSaveDialog(const wchar_t* path)//FILEDIALOG FOR SAVE -{ - OPENFILENAME ofn; - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.lpstrDefExt = TEXT(".sp"); - ofn.lpstrFile = path; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFilter = FILEEXSV; - ofn.lpstrTitle = TEXT("Save To"); - ofn.Flags = OFN_OVERWRITEPROMPT; - return GetSaveFileName(&ofn); -} - -//DWORD WINAPI PBThreadProc(LPVOID lpParameter);//PROGRESS BAR WINDOW -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//MAIN WINDOW -LRESULT CALLBACK OptWndProc(HWND, UINT, WPARAM, LPARAM);//OPTION WINDOW - -int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int iCmdShow) { - - WNDCLASS wndclass; - wndclass.style = CS_PARENTDC; - wndclass.lpfnWndProc = WndProc; - wndclass.cbClsExtra = 0; - wndclass.cbWndExtra = 0; - wndclass.hInstance = hInstance; - wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); - wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); - wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = TEXT("CAL"); - - RegisterClass(&wndclass); - - wndclass.lpfnWndProc = OptWndProc; - wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON2)); - wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); - wndclass.lpszMenuName = NULL; - wndclass.lpszClassName = TEXT("OPT"); - - RegisterClass(&wndclass); - - HWND hwnd; - hwnd = CreateWindow( - TEXT("CAL"), - TEXT("KNZ_Calculate"), - WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, - 0, - 0, - 0, - 0, - NULL, - NULL, - hInstance, - NULL); - - HICON Delico,Relico; - HFONT hbFont; - hbFont = CreateFont( - 15, - 0, - 0, - 0, - FW_LIGHT, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_OUTLINE_PRECIS, - CLIP_DEFAULT_PRECIS, - CLEARTYPE_QUALITY, - VARIABLE_PITCH, - TEXT("Segoe UI")); - - SendMessage(hwnd, WM_SETFONT, (WPARAM)hbFont, 1); - - for (int i = 0; i < 12; i++) - { - SendMessage(hwndb[i], WM_SETFONT, (WPARAM)hbFont, 1); - } - Delico = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON3)); - Relico = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON4)); - SendMessage(hwndb[11], BM_SETIMAGE, IMAGE_ICON, (LPARAM)Delico); - SendMessage(hwndb[12], BM_SETIMAGE, IMAGE_ICON, (LPARAM)Relico); - SendMessage(hwndb[13], BM_SETIMAGE, IMAGE_ICON, (LPARAM)Delico); - SendMessage(hwndb[14], BM_SETIMAGE, IMAGE_ICON, (LPARAM)Relico); - - ShowWindow(hwnd, iCmdShow); - UpdateWindow(hwnd); - - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - return msg.wParam; -} - -LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ - - const wchar_t wobs_file[MAX_PATH] = { 0 }; - const wchar_t wnav_file[MAX_PATH] = { 0 }; - const wchar_t wres_file[MAX_PATH] = { 0 }; - char obs_file[MAX_PATH] = { 0 }; - char nav_file[MAX_PATH] = { 0 }; - char res_file[MAX_PATH] = { 0 };//BE COMPATIBLE WITH MSVC - - RECT rect; - TCHAR* SATSYS[5] = { TEXT("GPS"),TEXT("GLO"),TEXT("BeiDou"),TEXT("Galileo"),TEXT("SBAS") }; - static HWND hwndPB; - static int cxchar, cychar; - static int gnssencode;//GNSS SET STATE CODE - - switch (msg) { - - case WM_CREATE: - { - getcwd(path, sizeof(path));//GET THE PROGRAM'S FOLDER - const char plot[] = "KNZ_Plot.exe"; - sprintf(path, "%s\\%s", path, plot); - - cxchar = LOWORD(GetDialogBaseUnits()); - cychar = HIWORD(GetDialogBaseUnits());//GET THE SYS FONT SIZE - - MoveWindow(hwnd, (GetSystemMetrics(SM_CXSCREEN) - 50 * cxchar) / 2, (GetSystemMetrics(SM_CYSCREEN) - 16 * cychar) / 2, 50 * cxchar, 16 * cychar, TRUE);//REPAINT THE MAIN WINDOW - - InitCommonControls(); - hwndPB = CreateWindowEx(0, PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE, - 0.5 * cxchar, 12.5 * cychar, - 47 * cxchar, 3 * cychar/4, - hwnd, (HMENU)PROGRESS, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - //CREATE THE BUTTONS - hwndb[0] = CreateWindow(TEXT("Button"), TEXT("Open Obs Data"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - cxchar, 5 * cychar, - 14 * cxchar, 2 * cychar, - hwnd, (HMENU)OBSBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[1] = CreateWindow(TEXT("Button"), TEXT("Open Nav Data"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - 17 * cxchar, 5 * cychar, - 14 * cxchar, 2 * cychar, - hwnd, (HMENU)NAVBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[2] = CreateWindow(TEXT("Button"), TEXT("Sat-Position Calculate"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - cxchar, 7 * cychar, - 32 * cxchar, 2 * cychar, - hwnd, (HMENU)CALBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[3] = CreateWindow(TEXT("Button"), TEXT("Options..."), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - 36 * cxchar, 7 * cychar, - 10 * cxchar, 2 * cychar, - hwnd, (HMENU)OPTBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[4] = CreateWindow(TEXT("Button"), TEXT("Plot"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, - 36 * cxchar, 5 * cychar, - 10 * cxchar, 2 * cychar, - hwnd, (HMENU)PLOBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - - for (int i = 0; i < 5; i++) - { - hwndb[i + 5] = CreateWindow(TEXT("Button"), SATSYS[i], WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX, - (2 + 7 * i) * cxchar, 21 * cychar / 2, - 7 * cxchar, 5 * cychar / 3, - hwnd, (HMENU)(5500 + i), ((LPCREATESTRUCT)lParam)->hInstance, NULL); - } - hwndb[10] = CreateWindow(TEXT("Button"), TEXT("Satellite System"), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, - 1 * cxchar / 2, 19 * cychar / 2, - 47 * cxchar, 6 * cychar / 2, - hwnd, (HMENU)SYSGROUP, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - - hwndb[11] = CreateWindow(TEXT("Button"), NULL, WS_VISIBLE | WS_CHILD | BS_ICON | BS_PUSHBUTTON, - 15 * cxchar, 5 * cychar, - 2 * cxchar, 1 * cychar, - hwnd, (HMENU)OBSCLEAR, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[12] = CreateWindow(TEXT("Button"), NULL, WS_VISIBLE | WS_CHILD | BS_ICON | BS_PUSHBUTTON, - 15 * cxchar, 6 * cychar, - 2 * cxchar, 1 * cychar, - hwnd, (HMENU)OBSRELOD, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[13] = CreateWindow(TEXT("Button"), NULL, WS_VISIBLE | WS_CHILD | BS_ICON | BS_PUSHBUTTON, - 31 * cxchar, 5 * cychar, - 2 * cxchar, 1 * cychar, - hwnd, (HMENU)NAVCLEAR, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - hwndb[14] = CreateWindow(TEXT("Button"), NULL, WS_VISIBLE | WS_CHILD | BS_ICON | BS_PUSHBUTTON, - 31 * cxchar, 6 * cychar, - 2 * cxchar, 1 * cychar, - hwnd, (HMENU)NAVRELOD, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - - return 0; - } - case WM_COMMAND: - switch(LOWORD(wParam)) - { -/* -------------------------- LOAD OBS DATA BUTTON -------------------------- */ - case OBSBUTTON: - if (fp_obs == NULL) - { - FileSelobsDialog(wobs_file); - wcstombs(obs_file, wobs_file, MAX_PATH); - fp_obs = fopen(obs_file, TEXT("r")); - if (fp_obs != NULL) - { - strcpy(obs_f, obs_file); - o_epochnum = get_epochnum(fp_obs); - rewind(fp_obs); - obs_h = (pobs_head)malloc(sizeof(obs_head)); - obs_e = (pobs_epoch)malloc(sizeof(obs_epoch) * o_epochnum); - obs_b = (pobs_body)malloc(sizeof(obs_body) * o_epochnum); - if (obs_h && obs_e && obs_b) - { - read_o_h(fp_obs, obs_h); - ProgressBar(hwndPB, PBSTATENONE, PBSTATEHALF); - read_o_b(fp_obs, obs_e, obs_b, obs_h); - } - fclose(fp_obs); - - ProgressBar(hwndPB, PBSTATEHALF, PBSTATEFULL); - } - } - else - { - MessageBox(hwnd, TEXT("File of Obs has already been loaded ! \nTo load new data file of Obs, \nPlease clear the existing data first"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); - } - break; - return 0; -/* -------------------------- LOAD NAV DATA BUTTON -------------------------- */ - case NAVBUTTON: - if (fp_nav == NULL) - { - FileSelnavDialog(wnav_file); - wcstombs(nav_file, wnav_file, MAX_PATH); - fp_nav = fopen(nav_file, TEXT("r")); - if (fp_nav != NULL) - { - strcpy(nav_f, nav_file); - satnum = getsatnum(fp_nav); - rewind(fp_nav); - nav_h = (pnav_head)malloc(sizeof(nav_head)); - nav_b = (pnav_body)malloc(sizeof(nav_body) * (satnum)); - if (nav_h && nav_b) - { - read_n_h(fp_nav, nav_h); - ProgressBar(hwndPB, PBSTATENONE, PBSTATEHALF); - read_n_b(fp_nav, nav_b); - } - fclose(fp_nav); - ProgressBar(hwndPB, PBSTATEHALF, PBSTATEFULL); - } - } - else - { - MessageBox(hwnd, TEXT("File of Nav has already been loaded ! \nTo load new data file of Nav, \nPlease clear the existing data first"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); - } - break; - return 0; -/* -------------------------- CLEAR OBS DATA BUTTON ------------------------- */ - case OBSCLEAR: - while (fp_obs != NULL) - { - free(obs_h); free(obs_e); free(obs_b); - fp_obs = NULL; obs_e = NULL; obs_b = NULL; - ProgressBar(hwndPB, PBSTATEFULL, PBSTATENONE); - while (MessageBox(hwnd, TEXT("File of Obs has been cleared."), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK) == IDOK) - { - break; - } - } - break; - return 0; - - case OBSRELOD: - if (fp_obs != NULL) - { - if (o_epochnum > 100) - { - ProgressBar(hwndPB, PBSTATENONE, PBSTATEFULL); - MessageBox(hwnd, TEXT("File of Obs Reload complete !"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); - break; - } - } - break; - return 0; -/* -------------------------- CLEAR NAV DATA BUTTON ------------------------- */ - case NAVCLEAR: - while(fp_nav != NULL) - { - free(nav_h); free(nav_b); - fp_nav = NULL;nav_h = NULL; nav_b = NULL; - ProgressBar(hwndPB, PBSTATEFULL, PBSTATENONE); - while (MessageBox(hwnd, TEXT("File of Nav has been cleared."), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK) == IDOK) - { - break; - } - } - break; - return 0; - - case NAVRELOD: - if (fp_nav != NULL) - { - if (satnum > 100) - { - ProgressBar(hwndPB, PBSTATENONE, PBSTATEFULL); - MessageBox(hwnd, TEXT("File of Nav Reload complete !"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); - break; - } - } - break; - return 0; -/* ---------------------------- CALCAULATE BUTTON --------------------------- */ - case CALBUTTON: - if (fp_obs == NULL && fp_nav == NULL) - { - MessageBox(hwnd, TEXT("No Data File !"), TEXT("STOP"), MB_ICONERROR | MB_OKCANCEL | MB_DEFBUTTON1); - } - else if (fp_obs == NULL && fp_nav != NULL) - { - MessageBox(hwnd, TEXT("No Obs Data File !"), TEXT("STOP"), MB_ICONERROR | MB_OKCANCEL | MB_DEFBUTTON1); - } - else if (fp_obs != NULL && fp_nav == NULL) - { - MessageBox(hwnd, TEXT("No Nav Data File !"), TEXT("STOP"), MB_ICONERROR | MB_OKCANCEL | MB_DEFBUTTON1); - } - else if (fp_obs != NULL && fp_nav != NULL) - { - int ALLSTATE = 0x0000; - for (int i = 0; i < 5; i++){ALLSTATE += SendMessage(hwndb[i + 5], BM_GETCHECK, wParam, lParam);} - if (ALLSTATE == 0x0000) - { while (MessageBox(hwnd, TEXT("No GNSS is choosen\nPlease Retry"), TEXT("STOP"), MB_ICONERROR | MB_RETRYCANCEL) == IDRETRY) - { - break;}} - - else - { FileSaveDialog(wres_file); - wcstombs(res_file, wres_file, MAX_PATH); - if (res_file[0] == '\0') - { while (MessageBox(hwnd, TEXT("Failed to select a save path.\nThe data has been cleared !"), TEXT("WARNING"), MB_ICONWARNING | MB_OK) == IDOK) - { break;}} - - else - { gnssencode = pow(GPS, SendMessage(hwndb[5], BM_GETCHECK, wParam, lParam)) - * pow(GLO, SendMessage(hwndb[6], BM_GETCHECK, wParam, lParam)) - * pow(BDS, SendMessage(hwndb[7], BM_GETCHECK, wParam, lParam)) - * pow(GAL, SendMessage(hwndb[8], BM_GETCHECK, wParam, lParam)) - * pow(SBAS, SendMessage(hwndb[9], BM_GETCHECK, wParam, lParam)); - - sat_pos_clac(result_file, hwndPB, - nav_b, obs_e, obs_b, obs_h, - o_epochnum, satnum, gnssencode, - res_file, obs_f, nav_f, - ionoption, trooption); - } - free(obs_h); free(obs_e); free(obs_b); free(nav_h); free(nav_b); - fp_nav = NULL; fp_obs = NULL; result_file = NULL; - nav_h = NULL; nav_b = NULL; obs_h = NULL; obs_e = NULL; obs_b = NULL; - } - } - break; - return 0; -/* ----------------------------- OPTIONS BUTTON ----------------------------- */ - case OPTBUTTON: - DestroyWindow(hwndopt); - hwndopt = CreateWindow(TEXT("OPT"), TEXT("Options"), WS_CAPTION | WS_SYSMENU, - 0, 0, - 0, 0, - NULL, NULL, GetWindowLongPtr(hwndopt, GWLP_HINSTANCE), NULL); - HFONT hbFont; - hbFont = CreateFont( - 15,0,0,0, - FW_LIGHT,FALSE,FALSE,FALSE, - DEFAULT_CHARSET,OUT_OUTLINE_PRECIS, - CLIP_DEFAULT_PRECIS,CLEARTYPE_QUALITY, - VARIABLE_PITCH,TEXT("Segoe UI")); - - SendMessage(hwndopt_def_ion, WM_SETFONT, (WPARAM)hbFont, 1); - SendMessage(hwndopt_def_tro, WM_SETFONT, (WPARAM)hbFont, 1); - SendMessage(hwndopt_confirm, WM_SETFONT, (WPARAM)hbFont, 1);//SEND FONT SETTING MESSAGE - while (ionoption == 1) { SendMessage(hwndopt_def_ion, BM_SETCHECK, wParam, lParam); break; }; - while (trooption == 1) { SendMessage(hwndopt_def_tro, BM_SETCHECK, wParam, lParam); break; };//SEND SETTING STATE MESSAGE - - break; - return 0; -/* ------------------------------- PLOT BUTTON ------------------------------ */ - case PLOBUTTON: { - - mbstowcs(wpath, path, MAX_PATH); - - if (ShellExecute(NULL, TEXT("open"), wpath, NULL, NULL, SW_SHOW) <= 32) - { - MessageBox(hwnd, TEXT("Failed to open Plot module !\nThe file may be removed or be damaged.\n "), TEXT("ERROR"), MB_ICONERROR | MB_OK); - } - - break; - return 0; - } -/* ------------------------------- DEFAULT MSG ------------------------------ */ - default: - return DefWindowProc(hwnd, msg, wParam, lParam); - } - return 0; - case WM_CLOSE: - DestroyWindow(hwnd); - return 0; - case WM_DESTROY: - PostQuitMessage(0); - return 0; - } - return DefWindowProc(hwnd, msg, wParam, lParam); -} - -LRESULT CALLBACK OptWndProc(HWND hwndopt, UINT msg, WPARAM wParam, LPARAM lParam) -{ - static int cxchar, cychar; - RECT rect; - switch (msg) - { - case WM_CREATE: - cxchar = LOWORD(GetDialogBaseUnits()); - cychar = HIWORD(GetDialogBaseUnits()); - - MoveWindow(hwndopt, (GetSystemMetrics(SM_CXSCREEN) - 30 * cxchar) / 2, (GetSystemMetrics(SM_CYSCREEN) - 7 * cychar) / 2, 30 * cxchar, 7 * cychar, TRUE); - ShowWindow(hwndopt, SW_SHOWDEFAULT); - UpdateWindow(hwndopt); - hwndopt_def_ion = CreateWindow(TEXT("BUTTON"), TEXT("Use Default ION_COR"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, - 2 * cxchar, 0, 18 * cxchar, 2 * cychar, hwndopt, (HMENU)OPTDFION, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - hwndopt_def_tro = CreateWindow(TEXT("BUTTON"), TEXT("Use Default TRO_COR"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, - 2 * cxchar, 2 * cychar, 18 * cxchar, 2 * cychar, hwndopt, (HMENU)OPTDFTRO, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - hwndopt_confirm = CreateWindow(TEXT("BUTTON"), TEXT("Confirm"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, - 20 * cxchar, 5 * cychar/2, 7 * cxchar, 3 * cychar/2, hwndopt, (HMENU)OPTCONFI, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - - - break; - return 0; - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case OPTDFION: - - break; - return 0; - case OPTDFTRO: - - break; - return 0; - case OPTCONFI: - if (SendMessage(hwndopt_def_ion, BM_GETCHECK, wParam, lParam) == BST_CHECKED){ionoption = 1;} - else{ionoption = 0;} - if (SendMessage(hwndopt_def_tro, BM_GETCHECK, wParam, lParam) == BST_CHECKED){trooption = 1;} - else{trooption = 0;}//GET CHECKBOX'S SETTINGS - - DestroyWindow(hwndopt); - break; - return 0; - } - break; - return 0; - case WM_CLOSE: - DestroyWindow(hwndopt); - break; - return 0; - case WM_DESTROY: - break; - return 0; - default: - return DefWindowProc(hwndopt, msg, wParam, lParam); - } - return 0; -} \ No newline at end of file diff --git a/app/Mainui.py b/app/Mainui.py new file mode 100644 index 0000000..7a8dc87 --- /dev/null +++ b/app/Mainui.py @@ -0,0 +1,1571 @@ +import math +import threading +import time + +import Trocor + +from base64 import b64decode +from ctypes import * +from tkinter import colorchooser +from tkinter import messagebox +from tkinter import filedialog +from tkinter import ttk +from PIL import ImageTk + +import tkinter.font as tkfont +import tkinter as tk +import matplotlib as mpl +import numpy as np + +mpl.use('TkAgg') +import matplotlib.pyplot as plt +from matplotlib.backends.backend_tkagg import ( + FigureCanvasTkAgg, NavigationToolbar2Tk) + +dll = cdll.LoadLibrary('./brdm2pos.dll') +dll.Start.restype = c_double +# +# +# +# Sat color +SatColor = ["#FF0000","#FFA500","#FFFF00","#00FF00","#00FFFF","#0000FF","#A020F0"] +# Color register part +enucolor = ["#0080FF","#0080FF","#0080FF"] +enucolormid = ["#0080FF","#0080FF","#0080FF"] +enulinew = [ "0.80", "0.80", "0.80"] +satncolor = ["#0080FF"] +satncolormid= ["#0080FF"] +satnlinew = [ "1.50"] +# Ion & tro register part +ioncormode = ['OFF', 'Ion-Free LC', 'Broadcast'] +ioncorstate = 0 +trocormode = ['OFF', 'Hopfield', 'Saastamoinen'] +trocorstate = 0 +#Sat system register part +satsysdict = {1: "G", 4:"R", 2:"C", 3:"E", 5:"S"} +satellite_system = 1 +##Combox Count-er +ComboxObsCount = 0 +ComboxNavCount = 0 +ComboxOutCount = 0 +# +# +# +def OptionsIN(hwnd): + OPTGUI(hwnd) + +def ExecutIN(hwnd): + EXECUDUI(hwnd) + +def ViewIN(hwnd): + VIEWGUI(hwnd) + +def Abo_windows(): + abo = tk.Toplevel(root) + abo.title("About") + abo.attributes('-toolwindow', 2) + abo.geometry('200x100') + abo.minsize(200, 100) + abo.maxsize(200, 100) + + About = tk.Label(abo, text="\nKNZ_GeoTrackLab ver1.5.1\n\nCopyright (c) 2024 by KenanZhu\nAll Right Reserved.") + About.pack(side=tk.TOP, expand=tk.YES) + +class FUNCTION: + + @staticmethod + def Colorchoose(i, label, mode): + # Brief # choice to change the color of draw + # Param # i : only for mode 1 + # Param # label : match the label with the button + # Param # mode : color register type + # undo choice == 0 & + # middle choice store == 1 & + # final confirm == 3 & + # satn color == 4 + # Return# none + global enucolor + if mode == 0: + enucolor = ["#0080FF", "#0080FF", "#0080FF"] + satncolor[0] = "#0080FF" + label.config(bg=enucolor[0]) + elif mode == 1: + colorvalue = tk.colorchooser.askcolor() + enucolormid[i] = str(colorvalue[1]) + label.config(bg=str(colorvalue[1])) + elif mode == 3: + enucolor[0] = enucolormid[0] + enucolor[1] = enucolormid[1] + enucolor[2] = enucolormid[2] + satncolor[0] = satncolormid[0] + elif mode == 4: + colorvalue = tk.colorchooser.askcolor() + satncolormid[0] = str(colorvalue[1]) + label.config(bg=str(colorvalue[1])) + + @staticmethod + def Linewchoose(entry0, entry1, entry2, mode): + # Brief # input to change the width of line + # Param # entry0 : the entry box of e + # Param # entry1 : the entry box of n + # Param # entry2 : the entry box of u + # Param # mode : width of line register type + # undo choice == 0 & + # final confirm == 1 + # Return# none + + global enulinew + if mode == 0: + enulinew = ["0.80", "0.80", "0.80"] + entry0.set(enulinew[0]) + entry1.set(enulinew[1]) + entry2.set(enulinew[2]) + + elif mode == 1: + if (0 < float(entry0.get()) <= 5 and + 0 < float(entry1.get()) <= 5 and + 0 < float(entry2.get()) <= 5): + + enulinew[0] = entry0.get() + enulinew[1] = entry1.get() + enulinew[2] = entry2.get() + elif (float(entry0.get()) <= 0 or + float(entry1.get()) <= 0 or + float(entry2.get()) <= 0): + while not messagebox.showerror("ERROR !", "The line width value is invalid !"): + break + enulinew = ["0.80", "0.80", "0.80"] + entry0.set(enulinew[0]) + entry1.set(enulinew[1]) + entry2.set(enulinew[2]) + + elif (5 < float(entry0.get()) or + 5 < float(entry1.get()) or + 5 < float(entry2.get())): + msg = messagebox.askyesno("NOTICE", "The width of the line is too large\n" + "affecting the mapping.\n" + "Are you sure to continue ?") + if not msg: + enulinew = ["0.80", "0.80", "0.80"] + entry0.set(enulinew[0]) + entry1.set(enulinew[1]) + entry2.set(enulinew[2]) + pass + elif msg: + enulinew[0] = entry0.get() + enulinew[1] = entry1.get() + enulinew[2] = entry2.get() + + def Calcu_confirm(self, v, cboxi, cboxt): + # Brief # choice to change the ion & tro correction && confirm the sat system + # Param # v sat system radio button value + # Param # cboxi the combo box of ion correction + # Param # cboxt the combo box of tro correction + # Return# none + global ioncorstate + global trocorstate + global satellite_system + + ioncorstate = self.Ion_and_Trocbox(cboxi, 0) + trocorstate = self.Ion_and_Trocbox(cboxt, 1) + satellite_system = self.Satsys_button(v) + + print(ioncorstate, trocorstate, satellite_system) + + @staticmethod + def Satsys_button(v): + # Brief # get the value of radio button of sat system + # Param # v : the value of radio button + # Return# the sat system code + Systemdict = {1: "1", 2: "2", 3: "3", 4: "4", 5: "5"} + return int(Systemdict.get(v.get())) + + @staticmethod + def Ion_and_Trocbox(cbox, cortype): + # Brief # get the value of combo box + # Param # cortype: correction type of + # ion == 0 & + # tro == 1 + # Param # cbox: + # Return# ion | tro state code + count = -1 + if cortype == 0: + for ionmode in ioncormode: + count += 1 + if cbox.get() == ionmode: + return count + + elif cortype == 1: + for tromode in trocormode: + count += 1 + if cbox.get() == tromode: + return count + + @staticmethod + def GetObsFilePath(ObsFileSelectBox): + global ComboxObsCount + path = filedialog.askopenfilename(title='RINEX OBS File', + filetypes=[('RINEX OBS File(*.o*.*.*obs.*.*d)', '*.*o;*.*obs;*.*d'), + ('All Files', '*.*')]) + if path and path not in ObsFileSelectBox['value']: + ObsFileSelectBox['value'] += (path,) + ComboxObsCount += 1 + ObsFileSelectBox.current(ComboxObsCount) + + @staticmethod + def GetNavFilePath(NavFileSelectBox): + global ComboxNavCount + path = filedialog.askopenfilename(title='RINEX NAV File', + filetypes=[('RINEX NAV File(*.*nav.*.hnav.*.gnav.*.qnav.*.*n.*.*g.*.*h.*.*q.*.*p)', + '*.*nav;*.hnav;*.gnav;*.qnav;*.*n;*.*g;*.*h;*.*q;*.*p'), + ('All Files', '*.*')]) + if path and path not in NavFileSelectBox['value']: + NavFileSelectBox['value'] += (path,) + ComboxNavCount += 1 + NavFileSelectBox.current(ComboxNavCount) + + @staticmethod + def AskDirectory(AskDirectorySelectBox): + global ComboxOutCount + path = filedialog.askdirectory() + if path and path not in AskDirectorySelectBox['value']: + AskDirectorySelectBox['value'] += (path + "/*.sp",) + ComboxOutCount += 1 + AskDirectorySelectBox.current(ComboxOutCount) + + @staticmethod + def AskOrNotCheck(AskOrNotCheckVar, + AskDirectorySelectBox, + AskDirectorySelectButton): + + if AskOrNotCheckVar.get() == 0: + AskDirectorySelectBox.config(state=tk.DISABLED) + AskDirectorySelectButton.config(state=tk.DISABLED) + else: + AskDirectorySelectBox.config(state=tk.NORMAL) + AskDirectorySelectButton.config(state=tk.NORMAL) + + def ExecuteFile(self,ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar): + obsfile = "" + res_path = "" + + state3 = ["","",""] + statemsg = "" + if not ObsSelectBoxVar.get(): + state3[0] = " obs file." + if not NavSelectBoxVar.get(): + state3[1] = " nav file." + if not DirectorySelectBoxVar.get(): + if AskOrNotCheckVar.get(): + state3[2] = " solution directory." + for state in state3: + statemsg += state + if statemsg: + ExecuteState.config(text='No file: %s !'%statemsg) + return 0 + + obs_path = ObsSelectBoxVar.get() + nav_path = NavSelectBoxVar.get() + DirectoryOut = DirectorySelectBoxVar.get() + # Get the obs file name---------------------------# + obspath = len(obs_path) + while obspath > 0: + flag = obs_path[obspath - 1:obspath] + if flag == "/": + obsfile = satsysdict.get(satellite_system) + "-" + obs_path[obspath:-4] + break + obspath -= 1 + # Get the file's father folder-------------------# + if DirectoryOut: + pathlon = len(DirectoryOut) + while pathlon - 3 > 0: + flag = DirectoryOut[pathlon - 3 - 1:pathlon - 3] + if flag == "/": + res_path = DirectoryOut[:pathlon - 3] + obsfile + ".sp" + break + pathlon -= 1 + else: + res_path = obs_path[0:obspath] + obsfile + ".sp" + # -----------------------------------------------# + + ExecuteState.config(text='Processing...... file : %s' % obs_path[obspath:]) + dll.Start(nav_path.encode(), obs_path.encode(), res_path.encode(), satellite_system) + ExecuteState.config(text='Complete generate file : %s!' % obsfile + ".sp") + + def _ExecuteFile(self,ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar): + T = threading.Thread(target=lambda: self.ExecuteFile(ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar)) + T.start() + +class MAINGUI: + def __init__(self, hwnd): + + self.satvisb = None + self.sattrack = None + self.satn = None + self.canvas2 = None + self.canvas1 = None + self.canvas0 = None + self.ux = None + self.nx = None + self.ex = None + self.plotstate = None + self.initGUI(hwnd) + + self.Drawcards = tk.ttk.Notebook(hwnd) + + self.frmFigure0 = tk.Frame(hwnd) + self.frmFigure0.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + self.frmFigure1 = tk.Frame(hwnd) + self.frmFigure1.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + self.frmFigure2 = tk.Frame(hwnd) + self.frmFigure2.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + self.initTOPMENU(hwnd) + + self.initPLOT() + + self.Drawcards.add(self.frmFigure0, text='ENU-Draw') + self.Drawcards.add(self.frmFigure1, text='Sat Number') + self.Drawcards.add(self.frmFigure2, text='Sat Track') + self.Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + + hwnd.protocol("WM_DELETE_WINDOW", hwnd.quit) + hwnd.mainloop() + + def initGUI(self, hwnd): + hwnd.title("KNZ_GeoTrackLab ver1.5.1") + hwnd.geometry('1200x700') + hwnd.minsize(1200, 700) + + icon_img = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4xMTGQMDAwKgAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTE0MjIy7jMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8QMTExSAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAMTExNDIyMu4zMzP/MzMz/zMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vEDIyMsoyMjLKAAAAAAAAAAAAAAAAAAAAADExMTQyMjLuMzMz/zIy' + b'MvsxMTGaMjIy/TMzM/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAyMjJRMjIy3TExMbgyMjLKMzMz/zIyMtkAAAAAMDAwOioqKgYAAAAAMTExszMzM/8yMjL7MDAwWQAAAAAxMTFhMjIy/TMz' + b'M/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMt0zMzP/MzMz/zMz' + b'M/8zMzP/MTExrjExMU0yMjL4MTExsyoqKgYqKioMMjIyvzAwMFkAAAAAAAAAAAAAAAAxMTFhMjIy/TMzM/8zMzPrMTExLgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExuDMzM/8zMzP/MzMz/zMzM/8xMTGaMjIy+DMz' + b'M/8zMzP/MTExsyoqKgYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTFhMjIy/jMzM/8yMjLfAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLxAyMjLKMzMz/zMzM/8zMzP/MzMz9TIyMvkzMzP/MzMz/zMzM/8zMzP/MTExsyoq' + b'KgYAAAAAAAAAAAAAAAAAAAAAAAAAADExMY8zMzP/MzMz/zMzM8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAvLy8QMjIyyjMzM/8zMzP/MzMz/zMzM/UyMjL+MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAAAAAAAAA' + b'AAAxMTGPMzMz/zMzM/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMUgyMjLKMjIy2DEx' + b'Ma4xMTGaMjIy+TMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAMTExbDMzM/8zMzP/MjIy0zAw' + b'MBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTTIyMvgzMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMzMzwzIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDoyMjL4MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MTExsyoqKgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIyfgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExNDExMbMqKioMKioqBjIy' + b'MrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8xMTGUAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDUyMjLvMzMz/zIyMsAAAAABKioqBjIyMrIzMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIy3i0tLRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAwMDA1MjIy7zMzM/8yMjL7MDAwWQAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwLzIy' + b'Mu8zMzP/MjIy+zAwMFkAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8yMjLeMzMzHgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTGQMzMz/zMzM/8zMzObAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MjIy3jMzMx4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMSkzMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAAAAAAAAAAADEx' + b'MWwqKioMKioqBjIyMrIzMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAxMTGQMzMz/zMzM8MqKioMKioqBjIy' + b'Mn4xMTGULy8vGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiMTExkDMzM/8zMzP/MjIy0zAwMBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEx' + b'MS4zMzPrMzMz/zIyMv4zMzP/MzMz/zIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zMz' + b'M/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4yMjLfMTExxzAwMBUAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////' + b'/////////////////x////4P//58B//8eAP/4EhB/+AA4P/gAfD/wAHw/4AA4P+AAEH/8AAD/+AAB//gAA//8AAP/8AAD/+A' + b'AA//BgAf/g8AP/4fgH/+DwD//wYB//+AH///wD///+B////w//8=') + + icon_img = b64decode(icon_img) + icon_img = ImageTk.PhotoImage(data=icon_img) + hwnd.tk.call('wm', 'iconphoto', hwnd._w, icon_img) + + default_font = tkfont.nametofont("TkDefaultFont") + default_font.configure(family="Segoe UI", size=9) + + stateframe = tk.Frame(hwnd) + stateframe.pack(side=tk.BOTTOM, fill=tk.X) + self.plotstate = ttk.Label(stateframe, text="None") + self.plotstate.pack(side=tk.LEFT, anchor='w') + + def initTOPMENU(self, hwnd): + + topmenu = tk.Menu(hwnd) + filemenu = tk.Menu(topmenu, tearoff=False) + openmenu = tk.Menu(filemenu, tearoff=False) + openmenu.add_command(label="Open Pos Solution",command=lambda :self.PO_openfile(hwnd), accelerator='Ctrl+S') + openmenu.add_command(label="Open Sat Solution", command=lambda: self._SPP_calculat(hwnd), accelerator='Ctrl+S') + openmenu.add_command(label="Open RINEX",command=lambda :ExecutIN(hwnd), accelerator='Ctrl+P') + filemenu.add_cascade(label="Open...", menu=openmenu) + filemenu.add_command(label="Clear", command=self.Clear_canvas) + filemenu.add_command(label="View", command=lambda :ViewIN(hwnd)) + filemenu.add_command(label="Exit", command=hwnd.quit, accelerator='Ctrl+E') + topmenu.add_cascade(label="File", menu=filemenu) + + optmenu = tk.Menu(topmenu, tearoff=False) + optmenu.add_cascade(label="Options...",command=lambda :OptionsIN(hwnd)) + topmenu.add_cascade(label="Options", menu=optmenu) + + helpmenu = tk.Menu(topmenu, tearoff=False) + helpmenu.add_command(label="About", command=Abo_windows) + topmenu.add_cascade(label="Help", menu=helpmenu) + + hwnd.config(menu=topmenu) + + def initPLOT(self): + # -------------------------------------------------------------------------------- + plt.rc('font', family='Segoe UI') + plt.rcParams['xtick.direction'] = 'in' + plt.rcParams['ytick.direction'] = 'in' + fig, (self.ex, self.nx, self.ux) = plt.subplots(3, 1, figsize=(10, 0), sharex=True) + + for spine in [ 'right', 'left']: + self.ex.spines[spine].set_visible(False) + self.ex.set_facecolor('#f5f5f5') + + for spine in [ 'right', 'left']: + self.nx.spines[spine].set_visible(False) + self.nx.set_facecolor('#f5f5f5') + + for spine in [ 'right', 'left']: + self.ux.spines[spine].set_visible(False) + self.ux.set_facecolor('#f5f5f5') + + fig.subplots_adjust(left=0, bottom=0.040, right=1, top=1, hspace=0.0) + self.canvas0 = FigureCanvasTkAgg(fig, self.frmFigure0) + self.canvas0.draw() + self.canvas0.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + toolbar = NavigationToolbar2Tk(self.canvas0, self.frmFigure0, pack_toolbar=False) + toolbar.update() + toolbar.pack(side=tk.LEFT) + + # -------------------------------------------------------------------------------- + #-------------------------------------------------------------------------------- + plt.rc('font', family='Segoe UI') + plt.rcParams['xtick.direction'] = 'in' + plt.rcParams['ytick.direction'] = 'in' + fig, (self.satn, self.satvisb) = plt.subplots(2, 1, figsize=(10, 0), sharex=True) + fig.subplots_adjust(left=0, bottom=0.045, right=1, top=0.95, hspace=0.0) + + for spine in [ 'right', 'left']: + self.satn.spines[spine].set_visible(False) + self.satn.set_facecolor('#f5f5f5') + + for spine in [ 'right', 'left']: + self.satvisb.spines[spine].set_visible(False) + self.satvisb.set_facecolor('#f5f5f5') + + self.canvas1 = FigureCanvasTkAgg(fig, self.frmFigure1) + self.canvas1.draw() + self.canvas1.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + toolbar = NavigationToolbar2Tk(self.canvas1, self.frmFigure1, pack_toolbar=False) + toolbar.update() + toolbar.pack(side=tk.LEFT) + + # -------------------------------------------------------------------------------- + # -------------------------------------------------------------------------------- + plt.rc('font', family='Segoe UI') + fig = plt.figure() + self.sattrack = fig.add_subplot(projection='3d') + fig.subplots_adjust(left=0, bottom=0, right=1, top=1) + + for spine in ['right', 'left']: + self.sattrack.spines[spine].set_visible(False) + self.sattrack.set_facecolor('#f5f5f5') + + self.canvas2 = FigureCanvasTkAgg(fig, self.frmFigure2) + self.canvas2.draw() + self.canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + toolbar = NavigationToolbar2Tk(self.canvas2, self.frmFigure2, pack_toolbar=False) + toolbar.update() + toolbar.pack(side=tk.TOP, anchor='w') + + def Clear_canvas(self): + # Brief # clear the canvas + # Return# none + self.ex.clear() + self.nx.clear() + self.ux.clear() + self.satn.clear() + self.satvisb.clear() + self.sattrack.clear() + self.canvas0.draw() + self.canvas1.draw() + self.canvas2.draw() + self.plotstate.config(text="None") + root.update() + + def PO_openfile(self, hwnd): + # Brief # read the .po file & draw in the canvas + # Return# none + ENU_O = np.empty((3, 0)) + # Sat numbers register part + satnumnarry = np.empty((1, 0)) + f_path = filedialog.askopenfilename(title='Pos Solution File', + filetypes=[('Pos Solution File(*.po)', '*.po'), + ('All Files', '*.*')]) + if not f_path.find(".po") >= 0: + self.plotstate.config(text="Error !: format is invalid.") + hwnd.update() + return + with open(f_path, 'r') as f: + while 1: + line = f.readline() + if line.find("X-rec") >= 0: + self.plotstate.config(text="Reading...") + hwnd.update() + while 1: + line = f.readline() + if line != "" and line[1:2] != "-": + E = float(line[45 + 22:55 + 22]) + N = float(line[56 + 22:66 + 22]) + U = float(line[67 + 22:77 + 22]) + satnum = int(line[64:67]) + + ENU_O = np.hstack((ENU_O, [[E], [N], [U]])) + satnumnarry = np.hstack((satnumnarry, [[satnum]])) + if line[1:2] == "-": + ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) + satnumnarry = np.hstack((satnumnarry, [[0]])) + if line == "": + self.ex.clear() + self.nx.clear() + self.ux.clear() + self.ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', + ms=enulinew[0]) + self.ex.set_title(' E-W(m)', x=0.02, y=0, fontsize=8) + self.ex.grid(True, linestyle='--', alpha=0.7) + self.nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', + ms=enulinew[1]) + self.nx.set_title(' N-S(m)', x=0.02, y=0, fontsize=8) + self.nx.grid(True, linestyle='--', alpha=0.7) + self.ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', + ms=enulinew[2]) + self.ux.set_title(' U-D(m)', x=0.02, y=0, fontsize=8) + self.ux.grid(True, linestyle='--', alpha=0.7) + self.canvas0.draw() + + self.satn.clear() + self.satn.plot(satnumnarry[0, :], marker='_', linestyle=None, color=satncolor[0], linewidth=0) + self.satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) + self.satn.set_xlabel('Epochs') + self.satn.grid(True, linestyle='--', alpha=0.7) + self.canvas1.draw() + break + elif line == "": + self.plotstate.config(text="Plot form: %s" % f_path) + break + + def SPP_calculat(self, hwnd): + # Brief # read .sp file & draw in the canvas & output the .po file + # Return# none + + # Const define + self.sattrack.clear() + C_V = 299792458 + f1 = 1575.42 + f2 = 1227.60 + + match satsysdict.get(satellite_system): + case 'G': + f1 = 1575.42 + f2 = 1227.60 + case 'E': + f1 = 1575.42 + f2 = 1278.75 + case 'C': + f1 = 1561.098 + f2 = 1207.140 + + ENU_O = np.empty((3, 0)) + GDOP = np.empty((1, 0)) + # Sat numbers register part + satnumnarry = np.empty((1, 0)) + res_path = filedialog.askopenfilename(title='Sat Solution File', + filetypes=[('Sat Solution File(*.sp)', '*.sp'), + ('All Files', '*.*')]) + if not res_path.find(".sp") >= 0: + self.plotstate.config(text="Error !: format is invalid.") + hwnd.update() + return + with open(res_path, 'r') as f: + while 1: + line = f.readline() + if line.find("APPROX POSITION XYZ") >= 0: + apX = float(line[23:35]) + apY = float(line[36:48]) + apZ = float(line[49:61]) + elif line.find("APPROX POSITION BLH") >= 0: + apB = float(line[23:35]) + apL = float(line[36:48]) + apH = float(line[49:61]) + elif line.find("OBS FILE PATH") >= 0: + Obs = line[23:300] + elif line.find("NAV FILE PATH") >= 0: + pass + elif line.find("END OF HEADER") >= 0: + break + # Get the obs file name---------------------------# + obspath = len(Obs) + while obspath > 0: + flag = Obs[obspath - 1:obspath] + if flag == "/": + obsfile = satsysdict.get(satellite_system) + "-" + Obs[obspath:-4] + break + obspath -= 1 + # Get the file's father folder-------------------# + pathlon = len(res_path) + while pathlon - 3 > 0: + flag = res_path[pathlon - 3 - 1:pathlon - 3] + if flag == "/": + o_path = res_path[:pathlon - 3] + obsfile + "po" + break + pathlon -= 1 + # -----------------------------------------------# + + # Generate the data header-----------------------# + with open(o_path, 'w+') as of: # Initialize-------# + of.close() + of = open(o_path, 'a+') + print("@ GENERATE PROGRAM : KNZ_SN Visual Lab v1.5.1\n" + "@ GENERATE TYPE : Receiver Station Position\n" + "@ GENERATE TIME : %s\n" + "@ GENERATE SYS : %s\n" + "@ IONOS OPT : %s\n" + "@ TROPO OPT : %s\n" + "@\n\n" % (time.asctime(time.localtime()) + , satsysdict.get(satellite_system) + , ioncormode[ioncorstate] + , trocormode[trocorstate]), file=of) + print( + "GPST X-rec(m) Y-rec(m) Z-rec(m) Sn(n) dE(m) dN(m) dU(m) ", + file=of) + + # Coordinate transformation matrix---------------# + S = np.array([ + [-math.sin(apL), math.cos(apL), 0], + [-math.sin(apB) * math.cos(apL), -math.sin(apB) * math.sin(apL), math.cos(apB)], + [math.cos(apB) * math.cos(apL), math.cos(apB) * math.sin(apL), math.sin(apB)] + ]) + # -----------------------------------------------# + self.plotstate.config(text="Reading...") + hwnd.update() + + global epoch_last + epoch_last = 0 + while 1: + line = f.readline() + if line == "": + break + flag = line[0: 1] + if flag == ">": + satnum = 0 + sPRN = [] + satX = np.empty((1, 0)) + satY = np.empty((1, 0)) + satZ = np.empty((1, 0)) + C1 = np.empty((1, 0)) + C2 = np.empty((1, 0)) + ma = np.empty((1, 0)) + np.empty((1, 0)) + Dt = np.empty((1, 0)) + + year = int(line[6:10]) + month = int(line[11:13]) + day = int(line[14:16]) + hour = int(line[17:19]) + min = int(line[20:22]) + sec = float(line[23:30]) + epoch = int(line[2:6]) + + count = 0 + # Check the lost epoch + while count < epoch - epoch_last - 1: + ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) + satnumnarry = np.hstack((satnumnarry, [[0]])) + print("------------ MISSING EPOCH DATA", file=of) + count += 1 + epoch_last = epoch + # Calculate start + while 1: + line = f.readline() + if line == "\n": + + # The sampling rate of 3D draw + if epoch % 15 == 0: + self.sattrack.scatter(satX[0,:], satY[0,:], satZ[0,:], s=5, zdir='z', c=SatColor[6] ) + + # Get the viald satellite number + satnumnarry = np.hstack((satnumnarry, [[satnum]])) + + match satsysdict.get(satellite_system): + case 'G': + MINSAT = 4 + case 'E': + MINSAT = 4 + case 'R': + MINSAT = 5 + case 'C': + MINSAT = 4 + + if satnum >= MINSAT: + stop = 0 + Qtrace = 0 + X = ap_X = apX + Y = ap_Y = apY + Z = ap_Z = apZ + while math.fabs(ap_X - X) > 1.0e-7 or ap_X == X: + stop += 1 + if stop >= 4: + break + count = 0 + ap_X = X + ap_Y = Y + ap_Z = Z + Ptem = [] + B = np.empty((0, 4)) + L = np.empty((0, 1)) + while 1: + # Linear the observation equation + R = math.sqrt( + pow((satX[0, count] - ap_X), 2) + pow((satY[0, count] - ap_Y), 2) + pow( + (satZ[0, count] - ap_Z), 2)) + l = -((satX[0, count] - ap_X) / R) + m = -((satY[0, count] - ap_Y) / R) + n = -((satZ[0, count] - ap_Z) / R) + B = np.vstack((B, [l, m, n, 1])) + Ptem.append(pow(math.sin(math.radians(ma[0, count])), 2)) + Pl = 0 + # Get the tropsphere correction + match trocorstate: + case 0: + Tro = 0 + case 1: + Tro = Trocor.Hop_tro_cor(apH, ma[0, count]) + case 2: + Tro = Trocor.Sas_tro_cor(apB, apH, ma[0, count]) + pass + # Get the ionsphere correction + match ioncorstate: + case 0: + if C1[0, count] == 0 and C2[0, count] != 0: + Pl = C2[0, count] + + elif C1[0, count] != 0 and C2[0, count] == 0: + Pl = C1[0, count] + case 1: + if C2[0, count] != 0 and C1[0, count] != 0: + Pl = (f1 * f1 * C1[0, count]) / (f1 * f1 - f2 * f2) - ( + f2 * f2 * C2[0, count]) / (f1 * f1 - f2 * f2) + + elif C1[0, count] == 0 and C2[0, count] != 0: + Pl = C2[0, count] + + elif C1[0, count] != 0 and C2[0, count] == 0: + Pl = C1[0, count] + case 2: + pass + # Omc matrix + L = np.vstack( + ( L, [Pl - R + C_V * Dt[0, count] - Tro] ) + ) + + count += 1 + if count == satnum: + break + + # Construct the Least Squares + P = np.diag(Ptem) + BTP = np.dot(np.transpose(B), P) + BTPB = np.dot(BTP, B) + Q = np.linalg.inv(BTPB) + Qtrace = np.trace(Q) + D_X = np.dot(np.dot(np.dot(Q, np.transpose(B)), P), L) # Coordinate correction + X = D_X[0, 0] + ap_X + Y = D_X[1, 0] + ap_Y + Z = D_X[2, 0] + ap_Z + + DeltaXYZ = np.array([[X - apX], [Y - apY], [Z - apZ]]) + ENU = S @ DeltaXYZ + #if math.fabs(ENU[0, 0]) > 25 or math.fabs(ENU[1, 0]) > 25 or math.fabs(ENU[2, 0]) > 50: + # ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) + # print("------------ ANOMALY RESOLUTION", file=of) + #else: + + ENU_O = np.hstack((ENU_O, [[ENU[0, 0]], [ENU[1, 0]], [ENU[2, 0]]])) + GDOP = np.hstack((GDOP, [ [math.sqrt(Qtrace)] ])) + + print( + "%4d\\%02d\\%02d\\%02d\\%02d\\%04.1f %12.4f %12.4f %12.4f %3d %10.5f %10.5f %10.5f" + % (year, month, day, hour, min, sec, X, Y, Z, satnum, + float(ENU[0, 0]), + float(ENU[1, 0]), + float(ENU[2, 0]) ), file=of) + break + else: + break + + flag = line[0:1] + if flag == satsysdict.get(satellite_system): + satnum += 1 + sPRN.append(int(line[2:4])) + satX = np.hstack((satX, [[float(line[6:21])]])) + satY = np.hstack((satY, [[float(line[22:37])]])) + satZ = np.hstack((satZ, [[float(line[38:53])]])) + C1 = np.hstack((C1, [[float(line[55:69])]])) + C2 = np.hstack((C2, [[float(line[71:85])]])) + ma = np.hstack((ma, [[float(line[86:101])]])) + Dt = np.hstack((Dt, [[float(line[102:118])]])) + + elif line.find("END") >= 0: + self.ex.clear() + self.nx.clear() + self.ux.clear() + + self.ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', + ms=enulinew[0]) + self.ex.plot( GDOP[0, :], color='#808080', alpha=0.5, linewidth=enulinew[0], marker='.', linestyle=':', + ms=enulinew[0]) + self.ex.set_title(' E-W(m)', x=0.02, y=0, fontsize=8) + self.ex.grid(True, linestyle='--', alpha=0.7) + + self.nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', + ms=enulinew[1]) + self.nx.set_title(' N-S(m)', x=0.02, y=0, fontsize=8) + self.nx.grid(True, linestyle='--', alpha=0.7) + + self.ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', + ms=enulinew[2]) + self.ux.set_title(' U-D(m)', x=0.02, y=0, fontsize=8) + self.ux.grid(True, linestyle='--', alpha=0.7) + + self.canvas0.draw() + + self.satn.clear() + self.satn.plot(satnumnarry[0, :], marker='_', ms=10, linestyle=None, color=satncolor[0], linewidth=0) + self.satn.set_title('Valid Satellite Numbers',loc='left', fontsize=8) + self.satn.set_xlabel('Epochs') + self.satn.grid(True, linestyle='--', alpha=0.7) + self.canvas1.draw() + self.canvas2.draw() + + f.close() + self.plotstate.config(text="Plot form: %s" % res_path) + break + + def _SPP_calculat(self, hwnd: object) -> object: + T = threading.Thread(target=lambda :self.SPP_calculat(hwnd)) + T.start() + +class OPTGUI: + def __init__(self,hwnd): + + self.ulinewidth = None + self.nlinewidth = None + self.elinewidth = None + self.Main2Frame0 = None + self.v = None + self.ctrobox = None + self.cionbox = None + self.Main1Frame0 = None + self.opthwnd = None + + self.initGUI(hwnd) + + self.Cmd = FUNCTION() + + def initGUI(self,hwnd): + self.opthwnd = tk.Toplevel(hwnd) + self.opthwnd.title("Options") + self.opthwnd.resizable(0, 0) + self.opthwnd.geometry('320x250') + self.opthwnd.minsize(320, 250) + self.opthwnd.maxsize(320, 250) + + icon_img2 = (b'AAABAAEAICAAAAAAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'ABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAABIAAAASAAAACQAAAAAAAAACAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAk' + b'QAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAACQAAAA/wAAAPw' + b'AAAD/AAAA/wAAAPwAAAD/AAAAkAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAADAAAAAQAAAAEAAAAAA' + b'AAACwAAAOMAAAD/AAAA/AAAAP4AAAD+AAAA/AAAAP8AAADjAAAACgAAAAAAAAABAAAAAQAAAAMA' + b'AAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAA' + b'AAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAA' + b'AAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AABAAAAAAAAABEAAABTAAAAUQAAAA8AAAAAAAAAAAAAAEQAAAD/AAAA/gAAAP8AAAD/AAAA/wAA' + b'AP8AAAD+AAAA/wAAAEQAAAAAAAAAAAAAAA8AAABRAAAAUwAAABEAAAAAAAAAAQAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAgAAAAAAAAAwAAAA5QAAAP8AAAD/AAAA4QAAAHYAAAB2AAAA6QAAAP8AAA' + b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA6QAAAHYAAAB1AAAA4QAAAP8AAAD/AAAA5QAAA' + b'DAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMoAAAD/AAAA+gAAAPwAAAD/AAAA' + b'/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD' + b'/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAABrAAAA/wAAAP' + b'oAAAD/AAAA/wAAAP0AAAD7AAAA+wAAAP4AAAD/AAAA/AAAAP0AAAD/AAAA/wAAAP0AAAD8AAAA/' + b'wAAAP4AAAD7AAAA+wAAAP0AAAD/AAAA/wAAAPoAAAD/AAAAawAAAAAAAAADAAAAAAAAAAEAAAAA' + b'AAAAAwAAANUAAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA/wAAAPI' + b'AAADyAAAA/wAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAADVAAAAAw' + b'AAAAAAAAABAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9A' + b'AAA/wAAAK8AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8A' + b'AAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAAAAAAAAQAAAAAAAADBAAAA/wAAAPoAAAD/AAAA/wA' + b'AAP8AAAD/AAAA/QAAAP8AAAB3AAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAdwAAAP8AAAD9AA' + b'AA/wAAAP8AAAD/AAAA/wAAAPoAAAD/AAAAwQAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAADEAA' + b'ADmAAAA/wAAAP0AAAD/AAAA/wAAAPwAAAD/AAAAqwAAAAAAAAAEAAAAAwAAAAEAAAABAAAABAAA' + b'AAQAAAAAAAAArAAAAP8AAAD8AAAA/wAAAP8AAAD9AAAA/wAAAOYAAAAwAAAAAAAAAAIAAAAAAAA' + b'AAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACvAAAADQAAA' + b'AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAAD4AAAA/wAAAP0AAAD/AAAA' + b'8gAAABgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABgAAADyAAAA/wAAAP0AAAD' + b'/AAAA+AAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAP' + b'gAAAD/AAAA/QAAAP8AAADyAAAAGAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAG' + b'AAAAPIAAAD/AAAA/QAAAP8AAAD4AAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB' + b'AAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACuAAAADQAAAAAAAAABAAAAAA' + b'AAAAAAAAAAAAAAAgAAAAAAAAAxAAAA5gAAAP8AAAD9AAAA/wAAAP8AAAD8AAAA/wAAAKsAAAAAA' + b'AAABAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAAAAAKsAAAD/AAAA/AAAAP8AAAD/AAAA/QAAAP8A' + b'AADmAAAAMAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAMEAAAD/AAAA+gAAAP8AAAD/AAAA/wA' + b'AAP8AAAD9AAAA/wAAAHcAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAB3AAAA/wAAAP0AAAD/AA' + b'AA/wAAAP8AAAD/AAAA+gAAAP8AAADBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAATAAAA7AAAAP8AA' + b'AD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK4AAAA8AAAAFQAAABUAAAA8AAAArgAA' + b'AP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAABAAA' + b'AAAAAAAMAAADWAAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAP8AAA' + b'DyAAAA8gAAAP8AAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA1QAAA' + b'AMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAGsAAAD/AAAA+gAAAP8AAAD/AAAA/QAAAPsAAAD7AAAA' + b'/gAAAP8AAAD8AAAA/QAAAP8AAAD/AAAA/QAAAPwAAAD/AAAA/gAAAPsAAAD7AAAA/QAAAP8AAAD' + b'/AAAA+gAAAP8AAABrAAAAAAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMsAAAD/AAAA+gAAAP' + b'wAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/' + b'wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAA' + b'AAAAMQAAAOYAAAD/AAAA/wAAAOEAAAB2AAAAdgAAAOkAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8' + b'AAAD+AAAA/wAAAOkAAAB2AAAAdgAAAOEAAAD/AAAA/wAAAOYAAAAxAAAAAAAAAAIAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAFQAAABRAAAADwAAAAAAAAAAAAAARAAAAP8AAAD+A' + b'AAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAARAAAAAAAAAAAAAAADwAAAFEAAABUAAAAEQAAAAAA' + b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQA' + b'AAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAA' + b'AAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' + b'AAEAAAABAAAAAEAAAABAAAAAAAAAAsAAADjAAAA/wAAAPwAAAD+AAAA/gAAAPwAAAD/AAAA4wAA' + b'AAoAAAAAAAAAAQAAAAEAAAAEAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAJAAAAD/AAAA/AAAAP8AAA' + b'D/AAAA/AAAAP8AAACQAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA' + b'BwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAkAAAASAAAAEgAAAAoAAAAAAAAAAgAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAM' + b'AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9GL//' + b'+kJf//kAn//5AJ/+ggBBfTIATLqCAEFZAAAAkgAAAEIAAABEAAAAJAAAACIAQgBKAIEAVQClAKq' + b'AmQFagJkBVQClAKoAgQBSAEIARAAAACQAAAAiAAAAQgAAAEkAAACaggBBXTIATL6CAEF/+QCf//' + b'kAn//6Ql///Ri/8=') + + icon_img2 = b64decode(icon_img2) + icon_img2 = ImageTk.PhotoImage(data=icon_img2) + self.opthwnd.tk.call('wm', 'iconphoto', self.opthwnd._w, icon_img2) + + Optionscards = tk.ttk.Notebook(self.opthwnd) + + self.initCARDCALCU() + self.initCARDDRAW() + + Optionscards.add(self.Main1Frame0, text='Calc options') + Optionscards.add(self.Main2Frame0, text='Draw options') + Optionscards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + + self.initCONFIRM() + + def initCARDCALCU(self): + self.Main1Frame0 = tk.Frame(self.opthwnd) + + # ION correction# + TOP1Frame0 = ttk.Frame(self.Main1Frame0) + TOP1Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + ioncor = ttk.Label(TOP1Frame0, text='Ionosphere Correction') + ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') + + self.cionbox = ttk.Combobox(TOP1Frame0, width=15, height=4) + self.cionbox['state'] = 'readonly' + self.cionbox['value'] = ('OFF', 'Ion-Free LC', 'Broadcast') + self.cionbox.current(ioncorstate) + self.cionbox.pack(side=tk.RIGHT, anchor='e') + + # TRO correction# + TOP2Frame0 = ttk.Frame(self.Main1Frame0) + TOP2Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + ioncor = ttk.Label(TOP2Frame0, text='Troposphere Correction') + ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') + + self.ctrobox = ttk.Combobox(TOP2Frame0, width=15, height=4) + self.ctrobox['state'] = 'readonly' + self.ctrobox['value'] = ('OFF', 'Hopfield', 'Saastamoinen') + self.ctrobox.current(trocorstate) + self.ctrobox.pack(side=tk.RIGHT, anchor='e') + + # GNSS Options# + TOP5Frame0 = ttk.LabelFrame(self.Main1Frame0, text='Satellite system', labelanchor='nw') + TOP5Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + satsys = [("GPS", 1), ("GLO", 4), ("BeiDou", 2), ("Galileo", 3), ("SBAS", 5)] + self.v = tk.IntVar() + + for sys, num in satsys: + radio_button = ttk.Radiobutton(TOP5Frame0, text=sys, variable=self.v, value=num) + radio_button.pack(side=tk.LEFT, padx='3px', anchor='w') + + self.v.set(satellite_system) + + def initCARDDRAW(self): + + self.Main2Frame0 = tk.Frame(self.opthwnd) + + self.initDRAWCOLOR() + self.initDRAWLINE() + + def initDRAWLINE(self): + # Line's weight options# + Right2Frame1 = ttk.LabelFrame(self.Main2Frame0, text='Draw configs', labelanchor='nw') + Right2Frame1.pack(side=tk.RIGHT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) + + EFrameR2 = tk.Frame(Right2Frame1) + EFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + elinewopt = tk.Label(EFrameR2, text='Eline:', width=5, height=1) + elinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.elinewidth = ttk.Spinbox(EFrameR2, from_=0, to=10, increment=0.01, width=10) + self.elinewidth.set(enulinew[0]) + self.elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + NFrameR2 = tk.Frame(Right2Frame1) + NFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + nlinewopt = tk.Label(NFrameR2, text='Nline:', width=5, height=1) + nlinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.nlinewidth = ttk.Spinbox(NFrameR2, from_=0, to=10, increment=0.01, width=10) + self.nlinewidth.set(enulinew[1]) + self.nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + UFrameR2 = tk.Frame(Right2Frame1) + UFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ulinewopt = tk.Label(UFrameR2, text='Uline:', width=5, height=1) + ulinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.ulinewidth = ttk.Spinbox(UFrameR2, from_=0, to=10, increment=0.01, width=10) + self.ulinewidth.set(enulinew[2]) + self.ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + LineConR2 = tk.Frame(Right2Frame1) + LineConR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + linewre = ttk.Button(LineConR2, text='Undo', width=10, + command=lambda: self.Cmd.Linewchoose(self.elinewidth, + self.nlinewidth, + self.ulinewidth, 0)) + linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + def initDRAWCOLOR(self): + + # Satnum plot options# + Buttom1Frame1 = ttk.LabelFrame(self.Main2Frame0, text='Satn configs', labelanchor='nw') + Buttom1Frame1.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='1px', fill=tk.BOTH) + + SatnFrameB1 = tk.Frame(Buttom1Frame1) + SatnFrameB1.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + satncolopt = ttk.Button(SatnFrameB1, text='Satn Color', width=10, + command=lambda: self.Cmd.Colorchoose(0, satncollab, 4)) + satncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + satncollab = tk.Label(SatnFrameB1, width=5, height=1, bg=satncolormid[0]) + satncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + LineConB1 = tk.Frame(Buttom1Frame1) + LineConB1.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + linewre = ttk.Button(LineConB1, text='Undo', width=10, + command=lambda: self.Cmd.Colorchoose(0, satncollab, 0)) + linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + # Line's colors options# + Left2Frame1 = ttk.LabelFrame(self.Main2Frame0, text='ENU colors', labelanchor='nw') + Left2Frame1.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) + + EFrameL2 = tk.Frame(Left2Frame1) + EFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ecolopt = ttk.Button(EFrameL2, text='E Color', width=10, + command=lambda: self.Cmd.Colorchoose(0, ecollab, 1)) + ecolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + ecollab = tk.Label(EFrameL2, width=5, height=1, bg=enucolor[0]) + ecollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + NFrameL2 = tk.Frame(Left2Frame1) + NFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ncolopt = ttk.Button(NFrameL2, text='N Color', width=10, + command=lambda: self.Cmd.Colorchoose(1, ncollab, 1)) + ncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + ncollab = tk.Label(NFrameL2, width=5, height=1, bg=enucolor[1]) + ncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + UFrameL2 = tk.Frame(Left2Frame1) + UFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ucolopt = ttk.Button(UFrameL2, text='U Color', width=10, + command=lambda: self.Cmd.Colorchoose(2, ucollab, 1)) + ucolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + ucollab = tk.Label(UFrameL2, width=5, height=1, bg=enucolor[2]) + ucollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + ColorConL2 = tk.Frame(Left2Frame1) + ColorConL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + colorcon = ttk.Button(ColorConL2, text='Undo', width=10, + command=lambda: [self.Cmd.Colorchoose(0, ecollab, 0) + , self.Cmd.Colorchoose(0, ncollab, 0) + , self.Cmd.Colorchoose(0, ucollab, 0)]) + colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + def initCONFIRM(self): + # TOTAL Confirm# + Bottom0Frame0 = ttk.Frame(self.opthwnd) + Bottom0Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.Y) + TotalCancel = ttk.Button(Bottom0Frame0, text='Cancel', width=10, + command=lambda: [self.opthwnd.destroy()]) + TotalCancel.pack(side=tk.RIGHT, padx='1px', anchor='e') + TotalCon = ttk.Button(Bottom0Frame0, text='Confirm', width=10, + command=lambda: [self.Cmd.Colorchoose(0, None, 3), + self.Cmd.Linewchoose(self.elinewidth, + self.nlinewidth, + self.ulinewidth, 1), + self.Cmd.Calcu_confirm(self.v, self.cionbox, self.ctrobox), + self.opthwnd.destroy()]) + TotalCon.pack(side=tk.RIGHT, padx='1px', anchor='e') + +class EXECUDUI: + def __init__(self,hwnd): + self.exehwnd = None + self.initGUI(hwnd) + ##Combox Var + self.ObsSelectBoxVar = tk.StringVar() + self.NavSelectBoxVar = tk.StringVar() + self.DirectorySelectBoxVar = tk.StringVar() + ##CheckButton Var + self.AskOrNotCheckButtonVar = tk.IntVar() + + self.initIO() + + self.Cmd = FUNCTION() + + def initGUI(self,hwnd): + self.exehwnd = tk.Toplevel(hwnd) + self.exehwnd.title("RINEX Processor") + self.exehwnd.resizable(0, 0) + self.exehwnd.geometry('400x215') + self.exehwnd.minsize(400, 215) + self.exehwnd.maxsize(400, 215) + + global icon_img3 + icon_img3 = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAQ' + b'AAAAAAAAAAAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'QAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAADQAAAA0AAAABAAAA' + b'AAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAzAAAAlgAAANQAAADwAAAA8AAAANQAAACWAAAAMwAAAAAAAAADAA' + b'AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAARAAAAEAAAABAAAAAPAAAAAQAAAAAAAAAAA' + b'AAAAQAAAAAAAAAIAAAAlwAAAP4AAAD/AAAA/wAAAPcAAAD3AAAA/wAAAP8AAAD+AAAAlwAAAAgAAAAAAAAAAQAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAgAAAAAAAABRAAAA5gAAAPIAAADwAAAA9gAAAOIAAAAQAAAAAAAAAAIAAAAAAAAACAAAALsAAAD' + b'/AAAA8gAAAIsAAAAyAAAAFAAAABQAAAAyAAAAiwAAAPIAAAD/AAAAuwAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAA' + b'AAAAAABgAAANwAAAD/AAAA8QAAAPEAAAD2AAAA4gAAABAAAAAAAAAABAAAAAAAAACWAAAA/wAAAN0AAAAuAAAAAAAAAAIAA' + b'AAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAARAAAA8AAAAPEA' + b'AAAfAAAADAAAABIAAAAPAAAAAQAAAAIAAAAAAAAANgAAAP8AAAD2AAAAMwAAAAAAAAAHAAAAAgAAAAAAAAAFAAAABAAAAAY' + b'AAAAAAAAAMwAAAPYAAAD/AAAANgAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABAAAADxAAAA8gAAABAAAAAAAAAAAQAAAA' + b'AAAAAAAAAABAAAAAAAAACSAAAA/wAAAIoAAAAAAAAAAAAAABUAAACiAAAAJwAAAAAAAAADAAAAAwAAAAYAAAAAAAAAigAAA' + b'P8AAACSAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAAAAEAAAAAAAAAAAAA' + b'ANAAAAD/AAAANwAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAAAAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAOAAAA7QAAAPcAAAAWAAAAAA' + b'AAAAAAAAARAAAA6gAAAP8AAAD/AAAA5gAAAFYAAAAAAAAAAAAAABYAAAD3AAAA7QAAAA0AAAAAAAAAAQAAAAAAAAABAAAAA' + b'AAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAA4AAADtAAAA9gAAABYAAAAAAAAAAAAAABEAAADqAAAA' + b'/wAAAP8AAADmAAAAVgAAAAAAAAAAAAAAFgAAAPcAAADtAAAADQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAA' + b'AEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAANAAAAD/AAAANgAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAA' + b'AAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAA' + b'AAAAAAAAAQAAAAAAAAAkgAAAP8AAACJAAAAAAAAAAAAAAAVAAAAogAAACcAAAAAAAAAAwAAAAMAAAAGAAAAAAAAAIoAAAD/' + b'AAAAkwAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAA' + b'2AAAA/wAAAPUAAAAyAAAAAAAAAAcAAAACAAAAAAAAAAUAAAAEAAAABgAAAAAAAAAyAAAA9gAAAP8AAAA2AAAAAAAAAAIAAA' + b'AAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAACWAAAA/wAAANwAA' + b'AAuAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAA' + b'AAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAC7AAAA/wAAAPEAAACKAAAAMgAAABQ' + b'AAAAUAAAAMgAAAIoAAADyAAAA/wAAALsAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAAB' + b'AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAACXAAAA/wAAAP8AAAD/AAAA9gAAAPcAAAD/AAAA/wAAA' + b'P8AAACXAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAA' + b'AAEAAAABAAAAAQAAAAEAAAACAAAAAwAAAAAAAAA0AAAAlgAAANUAAADwAAAA8AAAANUAAACXAAAANAAAAAAAAAADAAAAAgA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' + b'EwAAABQAAAAQAAAADAAAAAwAAAAQAAAAFAAAABMAAAAQAAAAEgAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA' + b'AEQAAAO4AAAD/AAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPMAAADzAA' + b'AA8wAAAPMAAADyAAAA8gAAAPEAAADyAAAA3QAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAARAAAA7gAAAP8AAADyA' + b'AAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADy' + b'AAAA8gAAAP8AAADuAAAAEQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAA' + b'QAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEQAAAAwAAAAfAAAA8gAAAPEAAA' + b'AQAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAA' + b'AAAAAAAAAQAAAAAAAAAQAAAA8QAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADxAAAAEAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAB' + b'EAAADwAAAA8QAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAA' + b'BAAAAAQAAAAEQAAAAwAAAAfAAAA8QAAAPAAAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAANwAAAD/AAAA8QAA' + b'APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gA' + b'AAPEAAAD/AAAA3AAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAUgAAAOYAAADyAAAA8gAAAPIAAADyAAAA8g' + b'AAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAOYAAABSAAAAA' + b'AAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAABEAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' + b'EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAARAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB' + b'AAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//2Mb+gSYZfS9IBLqBgABZAUAAmgFCEIoAhIhKFIhEShGMFGoVDAwqFQwMKhW' + b'MFGoUiERKFISIShZCEIoWQACaFoABWhAIBJoX+hf6AAAAWgAAAFoAAABaAAAAWhf/6FoX/+haAAAAWgAAAFkAAACagAABXS' + b'//9L6AAAF/////8=' +) + icon_img3 = b64decode(icon_img3) + icon_img3 = ImageTk.PhotoImage(data=icon_img3) + self.exehwnd.tk.call('wm', 'iconphoto', self.exehwnd._w, icon_img3) + + def initIO(self): + MainFrame0 = tk.Frame(self.exehwnd) + MainFrame0.pack() + TopFrame1 = ttk.Frame(MainFrame0) + TopFrame1.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + # ----------------------------------------------------------------------------------- + ObsInFrame3 = ttk.LabelFrame(TopFrame1, text='RINEX Obs File') + ObsInFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + ObsFileSelectBox = ttk.Combobox(ObsInFrame3, width=46, height=4, values=('',), + textvariable=self.ObsSelectBoxVar) + ObsFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='1px', pady='1px') + + ObsFileSelectButton = ttk.Button(ObsInFrame3, text='...', width=3, + command=lambda: self.Cmd.GetObsFilePath(ObsFileSelectBox)) + ObsFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='1px') + # ----------------------------------------------------------------------------------- + + #----------------------------------------------------------------------------------- + NavInFrame3 = ttk.LabelFrame(TopFrame1, text='RINEX Nav File') + NavInFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + NavFileSelectBox = ttk.Combobox(NavInFrame3, width=46, height=4, values=('',), + textvariable=self.NavSelectBoxVar) + NavFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='1px', pady='1px') + + NavFileSelectButton = ttk.Button(NavInFrame3, text='...', width=3, + command=lambda: self.Cmd.GetNavFilePath(NavFileSelectBox)) + NavFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='1px') + # ----------------------------------------------------------------------------------- + + BottomFrame1 = ttk.Frame(MainFrame0) + BottomFrame1.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + FileOutFrame3 = ttk.LabelFrame(BottomFrame1, text='Output Directory') + FileOutFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + ## CheckButton Initialize + AskOrNotCheckButton = ttk.Checkbutton(FileOutFrame3, text='Directory', + variable=self.AskOrNotCheckButtonVar, onvalue=1, offvalue=0, + command=lambda: self.Cmd.AskOrNotCheck( + self.AskOrNotCheckButtonVar, + AskDirectorySelectBox, + AskDirectorySelectButton)) + AskOrNotCheckButton.pack(side=tk.LEFT, anchor='w', padx='1px', pady='0px') + + ## SelectBox Initialize + AskDirectorySelectBox = ttk.Combobox(FileOutFrame3, width=36, height=4, values=('',), + state=tk.DISABLED, textvariable=self.DirectorySelectBoxVar) + AskDirectorySelectBox.pack(side=tk.LEFT, anchor='w', padx='1px', pady='0px') + + ## SelectButton Initialize + AskDirectorySelectButton = ttk.Button(FileOutFrame3, text='...', width=3, + state=tk.DISABLED, command=lambda: self.Cmd.AskDirectory(AskDirectorySelectBox)) + AskDirectorySelectButton.pack(side=tk.RIGHT, anchor='e', padx='2px', pady='0px') + + ExeFrame3 = ttk.Frame(BottomFrame1) + ExeFrame3.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + ExitButton = ttk.Button(ExeFrame3, text='Exit', width=10, + command=self.exehwnd.destroy) + ExitButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + ExecuteButton = ttk.Button(ExeFrame3, text='Execute', width=10, + command=lambda :self.Cmd._ExecuteFile(ExecuteState, + self.ObsSelectBoxVar, + self.NavSelectBoxVar, + self.AskOrNotCheckButtonVar, + self.DirectorySelectBoxVar)) + + ExecuteButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + # Execute state bar + StateFrame = ttk.Frame(BottomFrame1) + StateFrame.pack(side=tk.TOP, fill=tk.X, padx='1px', pady='0px') + ExecuteState = ttk.Label(StateFrame, text="None") + ExecuteState.pack(side=tk.LEFT, anchor='nw') + +def View_windowshow(text, view): + # Brief # get the file path of reading and show in the text ctr box + # Param # text : the show box of file of choice + # Param # view : the father window of text ctr box + # Return# none + f_path = filedialog.askopenfilename() + view.title('Viewing: %s' % f_path) + text.delete('1.0', 'end') + with open(f_path, 'r') as f: + fcon = f.read() + text.insert('insert', fcon) + text.config() + +class VIEWGUI: + def __init__(self, hwnd): + self.initGUI(hwnd) + + @staticmethod + def initGUI(hwnd): + view = tk.Toplevel(hwnd) + view.title("View") + view.geometry('900x600') + view.minsize(1000, 600) + + global icon_img1 + icon_img1 = (b'AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAPY6AQD2OgEAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAA' + b'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAAB' + b'EAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAD' + b'QAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAAHEAAADMAAAA6wAAAO8' + b'AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7g' + b'AAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAMwAAAByAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA' + b'AAAdAAAAzwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wA' + b'AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AA' + b'AA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAA' + b'AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAA' + b'A/wAAAP8AAAD/AAAA/gAAAPoAAAD6AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAA' + b'P8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA' + b'7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAAB' + b'xAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAE' + b'QAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAUAAAAFgAAABUAAAAR' + b'AAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAA' + b'AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAA' + b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgA' + b'AAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAA' + b'AAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAAAAAAAA/AAAAkwAAAE0AAAAAAAAAAAAAABQAA' + b'ADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAIAAAAFAAAAAAAAAFsAAA' + b'D/AAAA/gAAAP8AAABNAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA' + b'/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAIAAAAAAAAAXAAAAP8AAAD9AAAA9QAAAP8AAACIAAAAAAAAABUAAADuAAAA/wAAAP' + b'8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAgAAAAIAAAAAAAAAKgAAAGcAAAB7AAAAaAAAAB0AAABaAAAA/wAAAP0AAAD8AAAA/QAAAP8' + b'AAAA/AAAAAAAAABQAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARA' + b'AAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABYAAACrAAAA/gAAAP8AAAD+AAAA/wAAAPcA' + b'AAD4AAAA/gAAAP0AAAD9AAAA/wAAAFwAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgA' + b'AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + b'AAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGAAAANgAA' + b'AD/AAAA/QAAAPkAAAD2AAAA+QAAAP8AAAD9AAAA/gAAAP8AAAD/AAAAXAAAAAAAAAAFAAAAAAAA' + b'ABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAA' + b'AAAAAAAAAAAAIAAAAAAAAArAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD+AAAA/wAAA' + b'P8AAABbAAAAAAAAAAUAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD' + b'/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAwAAAA/gAAAP0AAAD+AAAA/wAAAM' + b'YAAACAAAAAygAAAP8AAAD9AAAA/wAAAPoAAAAmAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/' + b'wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAA' + b'AAABqAAAA/wAAAPkAAAD/AAAAxQAAAAMAAAAAAAAABgAAAMsAAAD/AAAA+QAAAP8AAABkAAAAAA' + b'AAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4A' + b'AAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAAB/AAAA/wAAAPcAAAD/AAAAggAAAAAAAAASAAAAAAA' + b'AAIoAAAD/AAAA9wAAAP8AAAB4AAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAA' + b'AAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' + b'AAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABrAAAA/wAA' + b'APkAAAD/AAAAwQAAAAAAAAAAAAAAAwAAAMcAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAA' + b'AAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAA' + b'AEAAAAAAAAAAgAAAAAAAAAyAAAA/wAAAP0AAAD+AAAA/wAAAMEAAAB4AAAAxAAAAP8AAAD+AAAA' + b'/gAAAPwAAAArAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAA' + b'BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO' + b'0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAsAAAAP8AAAD5AAAA/' + b'QAAAP8AAAD/AAAA/wAAAP0AAAD5AAAA/wAAAKkAAAAAAAAAAgAAAAAAAAABAAAAAAAAABEAAADu' + b'AAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAA' + b'AAAAEAAAAAAAAAHAAAAN0AAAD/AAAA/AAAAPgAAAD2AAAA+AAAAPwAAAD/AAAA2AAAABgAAAAAA' + b'AAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wA' + b'AAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABsAAAC0AAAA/wAAAP8AAAD+AA' + b'AA/wAAAP8AAACvAAAAGAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AA' + b'ADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAA' + b'AAwAAAAIAAAAAAAAAMQAAAG8AAACEAAAAbgAAAC8AAAAAAAAAAgAAAAMAAAABAAAAAQAAAAAAAA' + b'ABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAA' + b'AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAA' + b'AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAE' + b'gAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAAS' + b'AAAAFAAAABYAAAAWAAAAFgAAABQAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABE' + b'AAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQA' + b'AAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwA' + b'AADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AA' + b'AA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AA' + b'AD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAA' + b'AP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAA' + b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAA' + b'BIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAA' + b'RAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADtAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO' + b'4AAADuAAAA7gAAAO0AAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAE' + b'gAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA' + b'AAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAARAAAAEQAAABE' + b'AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAEAAAAAEAAAABAAAAAA' + b'AAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AA' + b'AD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAA' + b'A/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAA' + b'BIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAA' + b'EAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO' + b'4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7' + b'QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADt' + b'AAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE' + b'AAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/w' + b'AAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAA' + b'AAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAA' + b'AAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA' + b'AA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAA' + b'AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAA' + b'AO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAA' + b'A7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAA' + b'DuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAABAAAA' + b'EAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAA' + b'SAAAAEAAAAAEAAAABAAAAAAAAABIAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/' + b'wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAABMAAADtAAAA/wAAAP8' + b'AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAA' + b'AAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAA' + b'AARAAAAEQAAABEAAAARAAAAEQAAABIAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAA' + b'AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA' + b'AAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAA' + b'DuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAA' + b'P8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD' + b'/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP' + b'8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD5AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAd' + b'AAAA0AAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8' + b'AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0A' + b'AAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACgAAAHIAAADNAAAA6wAAAO8AAADuAAAA7gAAAO4A' + b'AADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gA' + b'AAO4AAADvAAAA6wAAAM0AAAByAAAACgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAA' + b'AABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAA' + b'ABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Rf/' + b'/ov8AAP6QAAAJfwAA/UAAAAK/AAD+gAAAAX8AAPkAAAAAnwAA+QAAAACfAAD5AAAAAJ8AAPoF//' + b'+gXwAA+gQABGBfAAD6BegIIF8AAPoF0pAgXwAA+gWkACBfAAD6BVAAYF8AAPoFIACgXwAA+gUgA' + b'SBfAAD6BUABIF8AAPoFQIEgXwAA+gVBQSBfAAD6BUCBIF8AAPoFQAEgXwAA+gUgAiBfAAD6BSAC' + b'IF8AAPoFUAUgXwAA+gQEECBfAAD6Bf//oF8AAPoEAAAgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAAB' + b'gXwAA+gYAAGBfAAD6BAAAIF8AAPoF//+gXwAA+gX//6BfAAD6BAAAIF8AAPoGAABgXwAA+gYAAG' + b'BfAAD6BgAAYF8AAPoGAABgXwAA+gQAACBfAAD6BF/6IF8AAPoF//+gXwAA+QAAAACfAAD5AAAAA' + b'J8AAPkAAAAAnwAA/oAAAAF/AAD9QAAAAr8AAP6QAAAJfwAA/0X//6L/AAA=') + + icon_img1 = b64decode(icon_img1) + icon_img1 = ImageTk.PhotoImage(data=icon_img1) + view.tk.call('wm', 'iconphoto', view._w, icon_img1) + + # View window's menu + topmenu = tk.Menu(view) + filemenu = tk.Menu(topmenu, tearoff=False) + filemenu.add_command(label="Open File", + command=lambda: View_windowshow(text, view), accelerator='Ctrl+F') + filemenu.add_command(label="Exit", command=view.destroy, accelerator='Ctrl+E') + topmenu.add_cascade(label="File", menu=filemenu) + + view.config(menu=topmenu) + + ybar = tk.Scrollbar(view) + ybar.pack(side=tk.RIGHT, fill=tk.Y) + xbar = tk.Scrollbar(view, orient=tk.HORIZONTAL) + xbar.pack(side=tk.BOTTOM, fill=tk.X) + + text = tk.Text(view, xscrollcommand=xbar.set, yscrollcommand=ybar.set, height=500, width=1000, undo=True, + autoseparators=False, wrap='none') + text.pack(side=tk.TOP, fill=tk.BOTH) + + ybar.config(command=text.yview) + xbar.config(command=text.xview) + +if __name__ == "__main__": + + # Main window + root = tk.Tk() + MAIN = MAINGUI(root) + diff --git a/app/Trocor.py b/app/Trocor.py new file mode 100644 index 0000000..65f781d --- /dev/null +++ b/app/Trocor.py @@ -0,0 +1,36 @@ +##Tro correct-Hopfield +import math +def Hop_tro_cor(H, ma): + global e + P0 = 1013.25 + e0 = 11.69 + T0 = 288.15 + p = P0 * pow((1.0 - 0.0068 / T0 / H) , 5) + T = 288.15 - 0.0068 * H + if H > 11000: + e = 0 + if H <= 11000: + e = e0 * pow( (1.0 - 0.0068 * H / T0) , 4) + deltaSd = 1.552e-5 * p * (40136 + 148.72 * (T - 273.16) - H) / T + deltaSw = 1.552e-5 * 4810 * e * (11000 - H) / pow(T , 2) + #Dry + dtropd = deltaSd / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) + #Wet + dtropw = deltaSw / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) + dtrop = dtropw + dtropd + return dtrop + +#Tro corrct-Saastamoinen +def Sas_tro_cor(B, H, ma): + global e + P0 = 1013.25 * pow( (1 - 2.2557 * 10e-5 * H), 5.2568) + e0 = 11.69 + T0 = 15 - 6.5 * 10e-3 * H + 273.15 + deltaSd = 2.2768e-3 * P0 / (1 - 2.66e-3 * math.cos(2 * B) - 2.8e-4 * H * 1e3) + deltaSw = 2.2768e-3 * (1255 / T0 + 0.05) * e0 + # Dry + dtropd = deltaSd / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma), 2) ) + 6.25) ) ) + # Wet + dtropw = deltaSw / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma), 2) ) + 6.25) ) ) + dtrop = dtropw + dtropd + return dtrop \ No newline at end of file diff --git a/headers/2gpst.h b/headers/2gpst.h deleted file mode 100644 index 6dfec1c..0000000 --- a/headers/2gpst.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef _2GPST_H_ -#define _2GPST_H_ - -/* -------------------------------------------------------------------------- */ -/// @brief convert UTC to GPS Second of week -/// @param y year -/// @param m month -/// @param d day -/// @param h hour -/// @param min minute -/// @param sec second -/// @return return GPS Second of week -/* -------------------------------------------------------------------------- */ -double Time2Weeksec(int y, int m, int d, double h, int min, double sec) -{ - if (m > 2) - { - y = y; - m = m; - } - if (m <= 2) - { - y = y - 1; - m = m + 12; - } - h = h + min/60.0 + sec/3600.0; - double JD = (int)(365.25 * y) + (int)(30.6001 * (m + 1)) + d + h/24.0 + 1720981.5; - double MJD = JD - 2400000.5; - int gpsweek = (int)((MJD - 44244) / 7); - double secofweek = (MJD - 44244.0 - gpsweek * 7.0) * 86400.0; - return secofweek; -} - -#endif \ No newline at end of file diff --git a/headers/blh2enu.h b/headers/blh2enu.h deleted file mode 100644 index 4073f08..0000000 --- a/headers/blh2enu.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _BLH2ENU_H_ -#define _BLH2ENU_H_ - -#include -#include - -typedef struct -{ - double E; - double N; - double U; -}blh2enu; -/* -------------------------------------------------------------------------- */ -/// @brief convert BLH coordinates to ENU coordinates -/// @param blh2enu parameter transfer structure -/// @param stationB latitude of receiver station -/// @param stationL longitude of receiver station -/// @param deltax X-coordinate difference of satellite arrival center -/// @param deltay Y-coordinate difference of satellite arrival center -/// @param deltaz Z-coordinate difference of satellite arrival center -/// @return return type of structure contain E, N, U members -/* -------------------------------------------------------------------------- */ -blh2enu BLH2ENU(blh2enu blh2enu, - double stationB, double stationL, - double deltax, double deltay, double deltaz) -{ - double sinB = sin(stationB); - double cosB = cos(stationB); - double sinL = sin(stationL); - double cosL = cos(stationL); - blh2enu.E = - sinL*(deltax) + cosL*(deltay); - blh2enu.N = -sinB*cosL*(deltax) - sinB*sinL*(deltay) + cosB*(deltaz); - blh2enu.U = cosB*cosL*(deltax) + cosB*sinL*(deltay) + sinB*(deltaz); - - return blh2enu; -} - -#endif \ No newline at end of file diff --git a/headers/cal_mod.h b/headers/cal_mod.h deleted file mode 100644 index 824434c..0000000 --- a/headers/cal_mod.h +++ /dev/null @@ -1,491 +0,0 @@ -#ifndef _CAL_MOD_H_ -#define _CAL_MOD_H_ -#include -#include -#include -#include -#include - -#include"public.h" - -#include"2gpst.h" -#include"rahcal.h" -#include"xyz2blh.h" -#include"degRrad.h" -#include"deg2dms.h" -#include"blh2enu.h" -#include"type2code.h" -#include"select_epo.h" - -/* -------------------- GPS Satellite position calculate -------------------- */ -pos_ts gps_pos(int sPRN, int best_epoch, double GPSsec, - pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) -{ double T_S = GPSsec - pos_t.delta_t; - double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA,3); - double n = n_0 + nav_b[best_epoch].deltan; - double tk = T_S - nav_b[best_epoch].TOE; - - if (tk > 32400)tk -= 604800; - else if (tk < -32400)tk += 604800; - - double Ms = nav_b[best_epoch].M0 + n * tk; - - double Es = Ms, E0; - do - { - E0 = Es; - Es = Ms + nav_b[best_epoch].e * sin(Es); - } while (fabs(Es - E0) > 1.0e-10); - - double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); - double sinfs = (sqrt(1 - pow(nav_b[best_epoch].e, 2)) * sin(Es)) / (1 - nav_b[best_epoch].e * cos(Es)); - double fs = atan2(sinfs, cosfs); - double u0 = fs + nav_b[best_epoch].omega; - - double epsilon_u = nav_b[best_epoch].Cus * sin(2 * u0) + nav_b[best_epoch].Cuc * cos(2 * u0); - double epsilon_r = nav_b[best_epoch].Crs * sin(2 * u0) + nav_b[best_epoch].Crc * cos(2 * u0); - double epsilon_i = nav_b[best_epoch].Cis * sin(2 * u0) + nav_b[best_epoch].Cic * cos(2 * u0); - - double u = u0 + epsilon_u; - double r = pow(nav_b[best_epoch].sqrtA, 2) * (1 - nav_b[best_epoch].e * cos(Es)) + epsilon_r; - double i = nav_b[best_epoch].i0 + epsilon_i + nav_b[best_epoch].IDOT * tk; - - double x = r * cos(u); - double y = r * sin(u); - - double l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; - double X = x * cos(l) - y * cos(i) * sin(l); - double Y = x * sin(l) + y * cos(i) * cos(l); - double Z = y * sin(i); - - pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; - pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; - pos_t.Z = Z;//Correction of earth rotation - - double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); - pos_t.deltat = pos_t.delta_t; - double rela = 2*sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es)/pow(C_V,2);//Relativistic effect - pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk,2) - rela - nav_b[best_epoch].TGD; - pos_t.delta_t = R / C_V + pos_t.delta_clk; - - return pos_t;} - - -/* -------------------- GAL Satellite position calculate -------------------- */ -pos_ts gal_pos(int sPRN, int best_epoch, double GALsec, - pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) -{ double T_S = GALsec - pos_t.delta_t; - double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA, 3); - double n = n_0 + nav_b[best_epoch].deltan; - double tk = T_S - nav_b[best_epoch].TOE; - - if (tk > 32400)tk -= 604800; - else if (tk < -32400)tk += 604800; - - double Ms = nav_b[best_epoch].M0 + n * tk; - - double Es = Ms, E0; - do - { - E0 = Es; - Es = Ms + nav_b[best_epoch].e * sin(Es); - } while (fabs(Es - E0) > 1.0e-10); - - double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); - double sinfs = (sqrt(1 - pow(nav_b[best_epoch].e, 2)) * sin(Es)) / (1 - nav_b[best_epoch].e * cos(Es)); - double fs = atan2(sinfs, cosfs); - double u0 = fs + nav_b[best_epoch].omega; - - double epsilon_u = nav_b[best_epoch].Cus * sin(2 * u0) + nav_b[best_epoch].Cuc * cos(2 * u0); - double epsilon_r = nav_b[best_epoch].Crs * sin(2 * u0) + nav_b[best_epoch].Crc * cos(2 * u0); - double epsilon_i = nav_b[best_epoch].Cis * sin(2 * u0) + nav_b[best_epoch].Cic * cos(2 * u0); - - double u = u0 + epsilon_u; - double r = pow(nav_b[best_epoch].sqrtA, 2) * (1 - nav_b[best_epoch].e * cos(Es)) + epsilon_r; - double i = nav_b[best_epoch].i0 + epsilon_i + nav_b[best_epoch].IDOT * tk; - - double x = r * cos(u); - double y = r * sin(u); - - double l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; - double X = x * cos(l) - y * cos(i) * sin(l); - double Y = x * sin(l) + y * cos(i) * cos(l); - double Z = y * sin(i); - - pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; - pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; - pos_t.Z = Z;//Correction of earth rotation - - double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); - pos_t.deltat = pos_t.delta_t; - double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2);//Relativistic effect - pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela - nav_b[best_epoch].BGDa; - pos_t.delta_t = R / C_V + pos_t.delta_clk; - - return pos_t;} - - -/* -------------------- BDS Satellite position calculate -------------------- */ -pos_ts bds_pos(int sPRN, int best_epoch, double BDSsec, - pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) -{ double T_S = BDSsec - pos_t.delta_t; - double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA, 3); - double n = n_0 + nav_b[best_epoch].deltan; - double tk = T_S - nav_b[best_epoch].TOE - 14; - - if (tk > 32400)tk -= 604800; - else if (tk < -32400)tk += 604800; - double Ms = nav_b[best_epoch].M0 + n * tk; - - double Es = Ms, E0; - do - { - E0 = Es; - Es = Ms + nav_b[best_epoch].e * sin(Es); - } while (fabs(Es - E0) > 1.0e-10); - - double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); - double sinfs = (sqrt(1 - pow(nav_b[best_epoch].e, 2)) * sin(Es)) / (1 - nav_b[best_epoch].e * cos(Es)); - double fs = atan2(sinfs, cosfs); - double u0 = fs + nav_b[best_epoch].omega; - - double epsilon_u = nav_b[best_epoch].Cus * sin(2 * u0) + nav_b[best_epoch].Cuc * cos(2 * u0); - double epsilon_r = nav_b[best_epoch].Crs * sin(2 * u0) + nav_b[best_epoch].Crc * cos(2 * u0); - double epsilon_i = nav_b[best_epoch].Cis * sin(2 * u0) + nav_b[best_epoch].Cic * cos(2 * u0); - - double u = u0 + epsilon_u; - double r = pow(nav_b[best_epoch].sqrtA, 2) * (1 - nav_b[best_epoch].e * cos(Es)) + epsilon_r; - double i = nav_b[best_epoch].i0 + epsilon_i + nav_b[best_epoch].IDOT * tk; - - double x = r * cos(u); - double y = r * sin(u); - - double l, X, Y, Z; - if (sPRN > 5 && sPRN < 59) //BDS IGSO & MEO Satellites - { - l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; - X = x * cos(l) - y * cos(i) * sin(l); - Y = x * sin(l) + y * cos(i) * cos(l); - Z = y * sin(i);} - - else // BDS GEO Satellites - { - l = nav_b[best_epoch].OMEGA + nav_b[best_epoch].deltaomega * tk - Earth_e * nav_b[best_epoch].TOE; - X = x * cos(l) - y * cos(i) * sin(l); - Y = x * sin(l) + y * cos(i) * cos(l); - Z = y * sin(i); - - double f = deg2rad(-5); - double p = Earth_e * tk; - - X = X * cos(p) + Y * sin(p) * cos(f) + Z * sin(p) * sin(f); - Y = X * -sin(p) + Y * cos(p) * cos(f) + Z * cos(p) * sin(f); - Z = Y * -sin(f) + Z * cos(f);} - - pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; - pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; - pos_t.Z = Z;//Correction of earth rotation - - double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2);//Relativistic effect - pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela; - double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); - pos_t.deltat = pos_t.delta_t; - pos_t.delta_t = R / C_V + pos_t.delta_clk; - return pos_t;} - - -/* -------------------------------- Satellite position calculate & Output -------------------------------- */ -void sat_pos_clac(FILE* result_file,HWND hwndPB, - pnav_body nav_b, pobs_epoch obs_e, pobs_body obs_b,pobs_head obs_h, - int o_epochnum, int satnum, int gnssdecode, - char res_file[MAX_PATH], char obs_file[MAX_PATH], char nav_file[MAX_PATH], - int ionoption, int trooption) -{ - PBRANGE range; - SendMessage(hwndPB, PBM_SETRANGE, (WPARAM)FALSE, (LPARAM)(MAKELPARAM(0, 100))); - SendMessage(hwndPB, PBM_GETRANGE, (WPARAM)TRUE, (LPARAM)&range); - - time_t gen_time;time(&gen_time);stations station = { 0 };xyz2blh tem2 = { 0 }; - tem2 = XYZ2BLH(tem2, obs_h->apX, obs_h->apY, obs_h->apZ); - station.B = tem2.B; - station.L = tem2.L; - station.H = tem2.H; - - result_file = fopen(res_file, "w"); - fclose(result_file); - result_file = fopen(res_file, "a+"); - fprintf(result_file, "@ GENERATE PROGRAM : KNZ_Calculate v1.2.2\n"); - fprintf(result_file, "@ GENERATE TYPE : Satellite Position\n"); - fprintf(result_file, "@ GENERATE TIME : %s", ctime(&gen_time)); - fprintf(result_file, "@ OBS FILE PATH : %s\n", obs_file); - fprintf(result_file, "@ NAV FILE PATH : %s\n", nav_file); - fprintf(result_file, "@ TIME OF FIRST OBS : %4d %02d %02d %02d %02d %07.4f\n" - , obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); - fprintf(result_file, "@ TIME OF LAST OBS : %4d %02d %02d %02d %02d %07.4f\n" - , obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); - fprintf(result_file, "@ APPROX POSITION XYZ: %13.04f%13.04f%13.04f\n@ APPROX POSITION BLH: %12.07f %12.07f %12.07f\n" - , obs_h->apX, obs_h->apY, obs_h->apZ - , station.B, station.L, station.H); - - if (ionoption == 0) { fprintf(result_file, "@ IONOS OPT : NULL\n"); } - if (ionoption == 1) { fprintf(result_file, "@ IONOS OPT : DEFAULT\n"); } - if (trooption == 0) { fprintf(result_file, "@ TROPO OPT : NULL\n@\n\n"); } - if (trooption == 1) { fprintf(result_file, "@ TROPO OPT : DEFAULT\n@\n\n"); } - fclose(result_file); - - //the beginning second of observation - double beginsec = Time2Weeksec(obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); - //the ending second of observation - double endinsec = Time2Weeksec(obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); - - for (int i = 0; i < o_epochnum; i++) - { int y = obs_e[i].y; - int m = obs_e[i].m; - int d = obs_e[i].d; - double h = obs_e[i].h; - int min = obs_e[i].min; - double sec = obs_e[i].sec; - - xyz2blh tem1 = { 0 }; - blh2enu tem3 = { 0 }; - rahcal tem4 = { 0 }; - deg2dms temb = { 0 }; - deg2dms teml = { 0 }; - - blhs blh = { 0 }; - enus enu = { 0 }; - rahs rah = { 0 }; - pos_ts pos_t = { 0 }; - - double Weeksec = Time2Weeksec(y, m, d, h, min, sec); - int epochcount = round((Weeksec - beginsec) / obs_h->interval) + 1; - - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\n>%04d %04d %02d %02d %02d %02d %07.04f" - , epochcount, obs_e[i].y, obs_e[i].m, obs_e[i].d, obs_e[i].h, obs_e[i].min, obs_e[i].sec); - fclose(result_file); - - if (gnssdecode % GPS == 0)//Be judged as GPS - { - for (int j = 0; j < obs_e[i].gps_num; j++) - { - int sPRN = obs_e[i].sPRN_GPS[j]; - int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, GPS); - - if (best_epoch == -1)//when the sPRN is not exist func will return -1 - break; - - double detat_toc = Weeksec - nav_b[best_epoch].TOE; - - //Iterative approximate propagation time - pos_t.delta_t = (obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V) - - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); - pos_t.deltat = 0.0; - while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) - { - pos_t = gps_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); - } - - tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); - blh.B = rad2deg(tem1.B); - blh.L = rad2deg(tem1.L); - blh.H = tem1.H; - - double deltax = pos_t.X - obs_h->apX; - double deltay = pos_t.Y - obs_h->apY; - double deltaz = pos_t.Z - obs_h->apZ; - - tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); - enu.E = tem3.E; - enu.N = tem3.N; - enu.U = tem3.U; - - //Satellite altitude Angle calculation - tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); - rah.R = tem4.R; - rah.A = rad2deg(tem4.A); - rah.H = rad2deg(tem4.H); - - if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0) - { - continue; - } - - else - { - temb = DEG2DMS(temb, blh.B); - blh.B_d = temb.D; - blh.B_m = temb.M; - blh.B_s = temb.S; - - teml = DEG2DMS(teml, blh.L); - blh.L_d = teml.D; - blh.L_m = teml.M; - blh.L_s = teml.S; - - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\nG %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , obs_b[i].obs_gps[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , obs_b[i].obs_gps[j][Code2Type(C2L, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , rah.H, pos_t.delta_clk);//GPS satellite - fclose(result_file); - } - } - } - - if (gnssdecode % BDS == 0)//Be judged as BeiDou - { - for (int j = 0; j < obs_e[i].bds_num; j++) - { - int sPRN = obs_e[i].sPRN_BDS[j]; - int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, BDS); - - if (best_epoch == -1)//when the sPRN is not exist func will return -1 - break; - - double detat_toc = Weeksec - nav_b[best_epoch].TOE - 14;//BDST - GPST = 14s - - //Iterative approximate propagation time - pos_t.delta_t = (obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] / C_V) - - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); - pos_t.deltat = 0.0; - while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) - { - pos_t = bds_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); - } - - tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); - blh.B = rad2deg(tem1.B); - blh.L = rad2deg(tem1.L); - blh.H = tem1.H; - - double deltax = pos_t.X - obs_h->apX; - double deltay = pos_t.Y - obs_h->apY; - double deltaz = pos_t.Z - obs_h->apZ; - - tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); - enu.E = tem3.E; - enu.N = tem3.N; - enu.U = tem3.U; - - //Satellite altitude Angle calculation - tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); - rah.R = tem4.R; - rah.A = rad2deg(tem4.A); - rah.H = rad2deg(tem4.H); - - if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0){ - continue; - } - - else{ - temb = DEG2DMS(temb, blh.B); - blh.B_d = temb.D; - blh.B_m = temb.M; - blh.B_s = temb.S; - - teml = DEG2DMS(teml, blh.L); - blh.L_d = teml.D; - blh.L_m = teml.M; - blh.L_s = teml.S; - - result_file = fopen(res_file, "a+"); - if (sPRN >= 19) { - fprintf(result_file, "\nCC%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] - , obs_b[i].obs_bds[j][Code2Type(C7I, obs_h->obstypenum_bds, obs_h->obscode_bds)] - , rah.H, pos_t.delta_clk);//BDS-3 satellite - } - else { - fprintf(result_file, "\nCB%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , obs_b[i].obs_bds[j][Code2Type(C2I, obs_h->obstypenum_bds, obs_h->obscode_bds)] - , obs_b[i].obs_bds[j][Code2Type(C7I, obs_h->obstypenum_bds, obs_h->obscode_bds)] - , rah.H, pos_t.delta_clk);//BDS-2 satellite - } - fclose(result_file); - } - } - } - - if (gnssdecode % GAL == 0)//Be judged as Galileo - { - for (int j = 0; j < obs_e[i].gal_num; j++) - { - int sPRN = obs_e[i].sPRN_GAL[j]; - int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, GAL); - - if (best_epoch == -1)//when the sPRN is not exist func will return -1 - break; - - double detat_toc = Weeksec - nav_b[best_epoch].TOE; - - //Iterative approximate propagation time - pos_t.delta_t = (obs_b[i].obs_gal[j][Code2Type(C1C, obs_h->obstypenum_gal, obs_h->obscode_gal)] / C_V) - - station.delta_TR + nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * detat_toc + nav_b[best_epoch].sa2 * pow(detat_toc, 2); - pos_t.deltat = 0.0; - while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) - { - pos_t = gal_pos(sPRN, best_epoch, Weeksec, nav_b, obs_h, pos_t); - } - - tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); - blh.B = rad2deg(tem1.B); - blh.L = rad2deg(tem1.L); - blh.H = tem1.H; - - double deltax = pos_t.X - obs_h->apX; - double deltay = pos_t.Y - obs_h->apY; - double deltaz = pos_t.Z - obs_h->apZ; - - tem3 = BLH2ENU(tem3, station.B, station.L, deltax, deltay, deltaz); - enu.E = tem3.E; - enu.N = tem3.N; - enu.U = tem3.U; - - //Satellite altitude Angle calculation - tem4 = RAHCAL(tem4, enu.E, enu.N, enu.U); - rah.R = tem4.R; - rah.A = rad2deg(tem4.A); - rah.H = rad2deg(tem4.H); - - if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0) - { continue;} - - else - { - temb = DEG2DMS(temb, blh.B); - blh.B_d = temb.D; - blh.B_m = temb.M; - blh.B_s = temb.S; - - teml = DEG2DMS(teml, blh.L); - blh.L_d = teml.D; - blh.L_m = teml.M; - blh.L_s = teml.S; - - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\nE %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" - , sPRN, pos_t.X, pos_t.Y, pos_t.Z - , obs_b[i].obs_gal[j][Code2Type(C1C, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , obs_b[i].obs_gal[j][Code2Type(C6C, obs_h->obstypenum_gps, obs_h->obscode_gps)] - , rah.H, pos_t.delta_clk);//Galileo satellite - fclose(result_file); - } - } - } - - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\n"); - fclose(result_file); - SendMessage(hwndPB, PBM_SETPOS, (WPARAM)((int)(i * 100 / o_epochnum)), (LPARAM)0); - - } - result_file = fopen(res_file, "a+"); - fprintf(result_file, "\nEND"); - fclose(result_file); - SendMessage(hwndPB, PBM_SETPOS, (WPARAM)range.iHigh, (LPARAM)0); -} -#endif \ No newline at end of file diff --git a/headers/deg2dms.h b/headers/deg2dms.h deleted file mode 100644 index 7417771..0000000 --- a/headers/deg2dms.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _DEG2DMS_H_ -#define _DEG2DMS_H_ - -#include -#include - -typedef struct -{ - double D; - double M; - double S; -}deg2dms; -/* -------------------------------------------------------------------------- */ -/// @brief Converts decimal degrees to degree minutes and seconds -/// @param deg2dms Parameter transfer structure -/// @param D The number of degrees to convert -/// @return return structure contain degree minute second -/* -------------------------------------------------------------------------- */ -deg2dms DEG2DMS(deg2dms deg2dms, - double D) -{ - int sig = D / fabs(D);//sign judgment - deg2dms.D = (int)(D);//to degree - deg2dms.M = (int)((D - deg2dms.D) * 60);//to minute - deg2dms.S = (int)(((D - deg2dms.D) * 60 - deg2dms.M) * 60);//to second - deg2dms.M = deg2dms.M * sig; - deg2dms.S = deg2dms.S * sig; - - return deg2dms; -} - -#endif \ No newline at end of file diff --git a/headers/degRrad.h b/headers/degRrad.h deleted file mode 100644 index 0cf8f1d..0000000 --- a/headers/degRrad.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _DEGRRAD_H_ -#define _DEGRRAD_H_ - -#include"public.h" -/* -------------------------------------------------------------------------- */ -/// @brief degree to radian -/// @param deg -/// @return return radian -/* -------------------------------------------------------------------------- */ -double deg2rad(double deg) -{ - double rad = (PI / 180) * deg; - return rad; -} - -/* -------------------------------------------------------------------------- */ -/// @brief radian to degree -/// @param rad -/// @return return degree -/* -------------------------------------------------------------------------- */ -double rad2deg(double rad) -{ - double deg = (180 / PI) * rad; - return deg; -} - -#endif \ No newline at end of file diff --git a/headers/public.h b/headers/public.h deleted file mode 100644 index 75b7572..0000000 --- a/headers/public.h +++ /dev/null @@ -1,302 +0,0 @@ -#ifndef _PUBLIC_H_ -#define _PUBLIC_H_ - -/* --------------------------------- FOR UI --------------------------------- */ -//FILE SELECT DIALOGS -#define FILEEXOP TEXT("RINEX OBS(*.o*.*.*obs.*.*d)\0*.*o;*.*obs;*.*d\0"\ - "All Files(*.*)\0*.*\0\0"); - -#define FILEEXNP TEXT("RINEX NAV(*.*nav.*.hnav.*.gnav.*.qnav.*.*n.*.*g.*.*h.*.*q.*.*p)\0*.*nav;*.hnav;*.gnav;*.qnav;*.*n;*.*g;*.*h;*.*q;*.*p\0"\ - "All Files(*.*)\0*.*\0\0") - -#define FILEEXSV TEXT("Spos Files(*.sp*)\0*.sp\0"\ - "All Files(*.*)\0*.*\0\0"); - -//DEF MAIN WINDOW BUTTONS -#define OBSBUTTON 3301 -#define NAVBUTTON 3302 -#define CALBUTTON 3303 -#define OPTBUTTON 3304 -#define PLOBUTTON 3305 -#define OBSCLEAR 3306 -#define OBSRELOD 3307 -#define NAVCLEAR 3308 -#define NAVRELOD 3309 -#define PROGRESS 3310 -//DEF MAIN WINDOW GNSS NUTTONS -#define GPSCHECK 5500 -#define GLOCHECK 5501 -#define BEICHECK 5502 -#define GALCHECK 5503 -#define SBACHECK 5504 -#define SYSGROUP 1001 -//DEF OPTIONS WINDOW CHECK+BOXS -#define OPTDFION 7001 -#define OPTDFTRO 7002 -#define OPTCONFI 7003 - -//DEFINE PROGRESSBAR STATE -#define PBSTATENONE 0 -#define PBSTATEHALF 500 -#define PBSTATEFULL 1000 - - -/* ------------------------------ WGS-84 CONST ------------------------------ */ -#define a 6378137.0 -#define e2 (0.0033528106647475*(2 - 0.0033528106647475)) -#define C_V 299792458 -#define GM 398600500000000 -#define math_e 2.718281828459 -#define PI 3.141592653589793 -#define Earth_e 7.2921151467e-5 - - -/* ----------------------------- GNSS OBSERV TYPE --------------------------- */ -#define C1C 100 -#define C1S 101 -#define C1L 102 -#define C1X 103 -#define C1P 104 -#define C1W 105 -#define C1Y 106 -#define C1M 107 -#define C1A 108 -#define C1B 109 -#define C1Z 110 - -#define C2C 200 -#define C2S 201 -#define C2L 202 -#define C2X 203 -#define C2P 204 -#define C2W 205 -#define C2Y 206 -#define C2M 207 -#define C2I 208 -#define C2Q 209 -#define C2X 210 - -#define C5I 500 -#define C5Q 501 -#define C5X 502 - -#define C6A 600 -#define C6B 601 -#define C6C 602 -#define C6X 603 -#define C6Z 604 - -#define C7I 700 -#define C7Q 701 -#define C7X 702 -#define C7D 703 -#define C7P 704 -#define C7Z 705 - -#define C8I 800 -#define C8Q 801 -#define C8X 802 - -/* ------------------------------- GNSS CODE -------------------------------- */ -#define GPS 03 -#define BDS 07 -#define GAL 11 -#define GLO 13 -#define SBAS 17 - - -/* ------------------------------ FOR CALMOD.H ------------------------------ */ -#define MAXRINEX 1000 -#define DAYSEC 86400 - -//satellite position & clock bias structure -typedef struct -{ - double X; - double Y; - double Z; - double deltat; - double delta_t; - double delta_clk; -}pos_ts; - -//receiver station position & clock bias structure -typedef struct -{ - double X; - double Y; - double Z; - double B; - double L; - double H; - double delta_TR; -}stations; - -//longitude & latitude structure -typedef struct -{ - double B; - int B_d; - int B_m; - int B_s; - double L; - int L_d; - int L_m; - int L_s; - double H; -}blhs; - -//local Cartesian coordinates coordinate system structure -typedef struct -{ - double E; - double N; - double U; -}enus; - -//satellite azimuth angle structure -typedef struct -{ - double R; - double A; - double H; -}rahs; -/* ------------------------------- FOR READ.H ------------------------------- */ - -//header data of file of nav -typedef struct nav_head -{ - double ver;//rinex - char type[20]; - double ION_GPSA[4]; - double ION_GPSB[4]; - double ION_BDSA[4]; - double ION_BDSB[4]; - double ION_QZSA[4]; - double ION_QZSB[4]; - double ION_IRNA[4]; - double ION_IRNB[4]; - double GPUT[4]; - double GLUT[4]; - double GAUT[4]; - double BDUT[4]; - double QZUT[4]; - double IRUT[4]; - double SBUT[4]; - int leap; -}nav_head, *pnav_head; - -//body data of file of nav: GPS BeiDou Galileo -typedef struct nav_body -{ - int sPRN_GPS; int sPRN_BDS; int sPRN_GAL; - int TOC_Y; - int TOC_M; - int TOC_D; - int TOC_H; - int TOC_Min; - int TOC_Sec; - double sa0; - double sa1; - double sa2; - - double IODE; double AODE; - double Crs; - double deltan; - double M0; - - double Cuc; - double e; - double Cus; - double sqrtA; - - double TOE; - double Cic; - double OMEGA; - double Cis; - - double i0; - double Crc; - double omega; - double deltaomega; - - double IDOT; - double L2code; int Datasource; - double GPSweek; double BDTweek; double GALweek; - double L2Pflag; - - double sACC; - double sHEA; - double TGD; double TGD1; double BGDa; - double IODC; double TGD2; double BGDb; - - double TTN; - double fit; double AODC; - double spare1; - double spare2; - -}nav_body, *pnav_body; - -//header data of file of obs -typedef struct obs_head -{ - double ver; - char type[30]; - double apX; - double apY; - double apZ; - double ANTH; - double ANTdeltaE; - double ANTdeltaN; - int obstypenum_gps; - int obstypenum_bds; - int obstypenum_gal; - int obscode_gps[26]; - int obscode_bds[26]; - int obscode_gal[26]; - double interval; - int f_y; - int f_m; - int f_d; - int f_h; - int f_min; - double f_sec; - int l_y; - int l_m; - int l_d; - int l_h; - int l_min; - double l_sec; - char tsys[5];//time system -}obs_head,*pobs_head; - -//epoch data of file of obs -typedef struct obs_epoch -{ - int y; - int m; - int d; - int h; - int min; - double sec;//epoch time - int p_flag;//epoch flag - int sat_num;//the total number of obsable sat - int gps_num;//the total gps sat - int bds_num;//the total bds sat - int gal_num;//the total galileo sat - int sPRN[84];//total sprn of obs sat - int sPRN_GPS[30]; - int sPRN_BDS[60]; - int sPRN_GAL[30]; -}obs_epoch,*pobs_epoch; - -//body data of file of obs -typedef struct obs_body -{ - double obs_gps[30][26];//GPS obs data - double obs_bds[60][26];//BDS obs data - double obs_gal[30][26];//GALILEO obs data -}obs_body,*pobs_body; -/* -------------------------------------------------------------------------- */ - -#endif \ No newline at end of file diff --git a/headers/rahcal.h b/headers/rahcal.h deleted file mode 100644 index e90828f..0000000 --- a/headers/rahcal.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _RAHCAL_H_ -#define _RAHCAL_H_ - -#include -#include - -#include"public.h" - -typedef struct -{ - double R; - double A; - double H; -}rahcal; -/* -------------------------------------------------------------------------- */ -/// @brief satellite azimuth angle calculation -/// @param rahcal parameter transfer structure -/// @param E east -/// @param N north -/// @param U up -/// @return return structure contain R, A, H members -/* -------------------------------------------------------------------------- */ -rahcal RAHCAL(rahcal rahcal, - double E, double N, double U) -{ - rahcal.H = atan2(U, sqrt(E * E + N * N)); - rahcal.A = atan2(E, U); - if (rahcal.A < 0) - rahcal.A += 2 * PI; - if (rahcal.A > 2 * PI) - rahcal.A -= 2 * PI; - rahcal.R = sqrt(E * E + N * N + U * U); - - return rahcal; -} - -#endif \ No newline at end of file diff --git a/headers/read.h b/headers/read.h deleted file mode 100644 index f0bf23f..0000000 --- a/headers/read.h +++ /dev/null @@ -1,577 +0,0 @@ -#ifndef _READ_H_ -#define _READ_H_ -#include -#include - -#include"public.h" -#include"type2code.h" - - -static double strtonum(const char* buff, int i, int n) -{ - double value = 0.0; - char str[256] = { 0 }; - char* p = str; - /* ---------------------------------- */ - /// Function will return 0.0 as error code when three occasion are below: - /// 1.Begining position < 0 - /// 2.The number of Byte of read < i - /// 3.The Byte size of string < n - /* ---------------------------------- */ - if (i < 0 || (int)strlen(buff) < i || (int)sizeof(str) - 1 < n) - { - return 0.0; - } - for (buff += i; *buff && --n >= 0; buff++) - { - *p++ = ((*buff == 'D' || *buff == 'd') ? 'e' : *buff); - } - *p = '\0'; - - return sscanf(str, "%lf", &value) == 1 ? value : 0.0; -} - -/* -------------------------- Read the file of obs -------------------------- */ -/* -------------------------------------------------------------------------- */ -/// @brief get the total number of epoch of obs -/// @param fp_obs the file pointer of obs -/// @return epoch number -/* -------------------------------------------------------------------------- */ -extern int get_epochnum(FILE* fp_obs) -{ - int n = 0; - int satnum = 0; - char flag; - char buff[MAXRINEX]; - while (fgets(buff, MAXRINEX, fp_obs)) - { satnum = (int)strtonum(buff, 33, 2); - strncpy(&flag, buff + 0, 1); - if (flag == '>') - { n++;} - } - return n; -} -/* ------------------- Read the header data of file of obs ------------------ */ -extern void read_o_h(FILE* fp_obs, pobs_head obs_h) -{ - char buff[MAXRINEX] = { 0 }; - char flag = { 0 }; - char* lable = buff + 60; - int i = 0; - int j = 0; - - obs_h->interval = 30; - obs_h->f_y = obs_h->f_m = obs_h->f_d = obs_h->f_h = obs_h->f_min = obs_h->f_sec = 0; - obs_h->l_y = obs_h->l_m = obs_h->l_d = obs_h->l_h = obs_h->l_min = obs_h->l_sec = 0; - memset(obs_h->obscode_gps, 0, sizeof(obs_h->obscode_gps)); - memset(obs_h->obscode_bds, 0, sizeof(obs_h->obscode_bds)); - memset(obs_h->obscode_gal, 0, sizeof(obs_h->obscode_gal)); - - while (fgets(buff, MAXRINEX, fp_obs)) - { if (strstr(lable, "RINEX VERSION / TYPE")) - { obs_h->ver = strtonum(buff, 0, 9); - strncpy(obs_h->type, buff + 20, 30); - continue;} - - else if (strstr(lable, "APPROX POSITION XYZ")) - { obs_h->apX = strtonum(buff, 0, 14); - obs_h->apY = strtonum(buff, 0 + 14, 14); - obs_h->apZ = strtonum(buff, 0 + 14 + 14, 14); - continue;} - - else if (strstr(lable, "ANTENNA: DELTA H/E/N")) - { obs_h->ANTH = strtonum(buff, 0, 14); - obs_h->ANTdeltaE = strtonum(buff, 14, 14); - obs_h->ANTdeltaN = strtonum(buff, 14 + 14, 14); - continue;} - - else if (strstr(lable, "SYS / # / OBS TYPES")) - { char flag = {0}; - strncpy(&flag, buff + 0, 1); - - if (flag == 'G') - { obs_h->obstypenum_gps = (int)strtonum(buff, 4, 2); - - if (obs_h->obstypenum_gps <= 13) - { for (i = 0; i < obs_h->obstypenum_gps; i++) - { obs_h->obscode_gps[i + 1] = Type2Code(i, buff);}} - - else if (obs_h->obstypenum_gps > 13) - { for (i = 0; i < 13; i++) - { obs_h->obscode_gps[i] = Type2Code(i, buff);} - - fgets(buff, MAXRINEX, fp_obs); - - for (i = 0; i < obs_h->obstypenum_gps - 13; i++) - { obs_h->obscode_gps[i + 13] = Type2Code(i, buff);}} - - continue;} - - else if (flag == 'C') - { obs_h->obstypenum_bds = (int)strtonum(buff, 4, 2); - - if (obs_h->obstypenum_bds <= 13) - { for (i = 0; i < obs_h->obstypenum_bds; i++) - { obs_h->obscode_bds[i] = Type2Code(i, buff);}} - - else if (obs_h->obstypenum_bds > 13) - { for (i = 0; i < 13; i++) - { obs_h->obscode_bds[i] = Type2Code(i, buff);} - - fgets(buff, MAXRINEX, fp_obs); - - for (i = 0; i < obs_h->obstypenum_bds - 13; i++) - { obs_h->obscode_bds[i + 13] = Type2Code(i, buff);}} - continue;} - - else if (flag == 'E') - { obs_h->obstypenum_gal = (int)strtonum(buff, 4, 2); - - if (obs_h->obstypenum_gal <= 13) - { for (i = 0; i < obs_h->obstypenum_gal; i++) - {obs_h->obscode_gal[i] = Type2Code(i, buff);}} - - else if (obs_h->obstypenum_gal > 13) - { for (i = 0; i < 13; i++) - {obs_h->obscode_gal[i] = Type2Code(i, buff);} - - fgets(buff, MAXRINEX, fp_obs); - - for (i = 0; i < obs_h->obstypenum_gal - 13; i++) - {obs_h->obscode_gal[i + 13] = Type2Code(i, buff);}} - continue;} - - continue;} - - else if (strstr(lable, "INTERVAL")) - { obs_h->interval = strtonum(buff, 0, 10); - continue;} - - else if (strstr(lable, "TIME OF FIRST OBS")) - { obs_h->f_y = (int)strtonum(buff, 2, 4); - obs_h->f_m = (int)strtonum(buff, 2 + 6, 4); - obs_h->f_d = (int)strtonum(buff, 2 + 6 + 6, 4); - obs_h->f_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); - obs_h->f_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); - obs_h->f_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); - strncpy(obs_h->tsys, buff + 6 + 6 + 6 + 6 + 6 + 18, 3); - continue;} - - else if (strstr(lable, "TIME OF LAST OBS")) - { obs_h->l_y = (int)strtonum(buff, 2, 4); - obs_h->l_m = (int)strtonum(buff, 2 + 6, 4); - obs_h->l_d = (int)strtonum(buff, 2 + 6 + 6, 4); - obs_h->l_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); - obs_h->l_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); - obs_h->l_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); - continue;} - - else if (strstr(lable, "END OF HEADER")) - { break;} - } -} -/* -------------------- Read the body data of file of obs ------------------- */ -extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, pobs_head obs_h) -{ - int n = 0; - char buff[MAXRINEX] = { 0 }; - char flag = { 0 }; - - while (fgets(buff, MAXRINEX, fp_obs)) - { - int i = 0; - int j_g = 0; - int k_g = 0; - int j_c = 0; - int k_c = 0; - int j_ga = 0; - int k_ga = 0; - obs_e[n].gps_num = 0; - obs_e[n].bds_num = 0; - obs_e[n].gal_num = 0; - - obs_e[n].y = (int)strtonum(buff, 2, 4); - obs_e[n].m = (int)strtonum(buff, 7, 2); - obs_e[n].d = (int)strtonum(buff, 10, 2); - obs_e[n].h = (int)strtonum(buff, 13, 2); - obs_e[n].min = (int)strtonum(buff, 16, 2); - obs_e[n].sec = strtonum(buff, 19, 10); - obs_e[n].p_flag = (int)strtonum(buff, 31, 1); - obs_e[n].sat_num = strtonum(buff, 33, 3); - strncpy(&flag, buff + 0, 1); - - memset(obs_e[n].sPRN, 0, sizeof(obs_e[n].sPRN)); - memset(obs_e[n].sPRN_GPS, 0, sizeof(obs_e[n].sPRN_GPS)); - memset(obs_e[n].sPRN_BDS, 0, sizeof(obs_e[n].sPRN_BDS)); - memset(obs_e[n].sPRN_GAL, 0, sizeof(obs_e[n].sPRN_GAL)); - memset(obs_b[n].obs_gps, 0, sizeof(obs_b[n].obs_gps)); - memset(obs_b[n].obs_bds, 0, sizeof(obs_b[n].obs_bds)); - memset(obs_b[n].obs_gal, 0, sizeof(obs_b[n].obs_gal)); - - for (i = 0; i < obs_e[n].sat_num; i++) - { - if (flag == 'G') - { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); - obs_e[n].sPRN_GPS[j_g] = obs_e[n].sPRN[i]; - - for (k_g = 0; k_g < obs_h->obstypenum_gps; k_g++) - { obs_b[n].obs_gps[j_g][k_g] = strtonum(buff, 3 + 16 * k_g, 14);} - - obs_e[n].gps_num++; j_g++; - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1);} - - else if (flag == 'C') - { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); - obs_e[n].sPRN_BDS[j_c] = obs_e[n].sPRN[i]; - - for (k_c = 0; k_c < obs_h->obstypenum_bds; k_c++) - { obs_b[n].obs_bds[j_c][k_c] = strtonum(buff, 3 + 16 * k_c, 14);} - - obs_e[n].bds_num++; j_c++; - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } - - else if (flag == 'E') - { obs_e[n].sPRN[i] = strtonum(buff, 1, 2); - obs_e[n].sPRN_GAL[j_ga] = obs_e[n].sPRN[i]; - - for (k_ga = 0; k_ga < obs_h->obstypenum_gal; k_ga++) - { obs_b[n].obs_gal[j_ga][k_ga] = strtonum(buff, 3 + 16 * k_ga, 14);} - - obs_e[n].gal_num++; j_ga++; - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } - - else if (flag != 'G'&& flag != 'C'&& flag != 'E') - { - fgets(buff, MAXRINEX, fp_obs); - strncpy(&flag, buff + 0, 1); - } - } - n++; - } -} -/* -------------------------- Read the file of nav -------------------------- */ -/* -------------------------------------------------------------------------- */ -/// @brief get the total number of satellite boardcast data of nav file -/// @param fp_nav the file pointer of nav file -/// @return total number of satellite boardcast data -/* -------------------------------------------------------------------------- */ -static int getsatnum(FILE* fp_nav) -{ - int satnum = 0; - int flag = 0; - char buff[MAXRINEX]; - char satvar; - char* lable = buff + 60; - - while (fgets(buff, MAXRINEX, fp_nav)) - { if (strstr(lable, "END OF HEADER")) - { flag = 1;} - - if (flag == 1) - { while (fgets(buff, MAXRINEX, fp_nav)) - { strncpy(&satvar, buff + 0, 1); - if (satvar == 'G' || satvar == 'E' || satvar == 'R' || satvar == 'S' || satvar == 'C' || satvar == 'I' || satvar == 'J') - { satnum++;} - - else - { continue;}}}} - - return satnum; -} -/* ------------------- Read the header data of file of nav ------------------ */ -void read_n_h(FILE* fp_nav, pnav_head nav_h) -{ - char buff[MAXRINEX] = { 0 }; - char* lable = buff; - int i = 0; - int j = 0; - while (fgets(buff, MAXRINEX, fp_nav)) - { - if (strstr(lable, "RINEX VERSION / TYPE")) - { nav_h->ver = strtonum(buff, 0, 9); - strncpy((nav_h->type), buff + 20, 15); - continue;} - - else if (strstr(lable, "GPSA")) - { nav_h->ION_GPSA[0] = strtonum(buff, 6, 12); - nav_h->ION_GPSA[1] = strtonum(buff, 6 + 12, 12); - nav_h->ION_GPSA[2] = strtonum(buff, 6 + 12 + 12, 12); - nav_h->ION_GPSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue;} - - else if (strstr(lable, "GPSB")) - { nav_h->ION_GPSB[0] = strtonum(buff, 6, 12); - nav_h->ION_GPSB[1] = strtonum(buff, 6 + 12, 12); - nav_h->ION_GPSB[2] = strtonum(buff, 6 + 12 + 12, 12); - nav_h->ION_GPSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue;} - - else if (strstr(lable, "BDSA")) - { nav_h->ION_BDSA[0] = strtonum(buff, 6, 12); - nav_h->ION_BDSA[1] = strtonum(buff, 6 + 12, 12); - nav_h->ION_BDSA[2] = strtonum(buff, 6 + 12 + 12, 12); - nav_h->ION_BDSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue;} - - else if (strstr(lable, "BDSB")) - { nav_h->ION_BDSB[0] = strtonum(buff, 6, 12); - nav_h->ION_BDSB[1] = strtonum(buff, 6 + 12, 12); - nav_h->ION_BDSB[2] = strtonum(buff, 6 + 12 + 12, 12); - nav_h->ION_BDSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); - continue;} - - else if (strstr(lable, "BDUT")) - { nav_h->BDUT[0] = strtonum(buff, 5, 17); - nav_h->BDUT[1] = strtonum(buff, 5 + 17, 16); - nav_h->BDUT[2] = strtonum(buff, 5 + 17 + 16, 7); - nav_h->BDUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); - continue;} - - else if (strstr(lable, "GPUT")) - { nav_h->GPUT[0] = strtonum(buff, 5, 17); - nav_h->GPUT[1] = strtonum(buff, 5 + 17, 16); - nav_h->GPUT[2] = strtonum(buff, 5 + 17 + 16, 7); - nav_h->GPUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); - continue;} - - else if (strstr(lable, "LEAP SECONDS")) - { nav_h->leap = (int)strtonum(buff, 4, 2);} - - else if (strstr(lable, "END OF HEADER")) - break; - } -} -/* -------------------- Read the body data of file of nav ------------------- */ -void read_n_b(FILE* fp_nav, pnav_body nav_b) -{ - int i_g = 0; - char buff[MAXRINEX] = { 0 }; - char flag = { 0 }; - while (fgets(buff, MAXRINEX, fp_nav)) - { - int j_g = 0; - int j_c = 0; - int j_ga = 0; - int j_gl = 0; - strncpy(&flag, buff + 0, 1); - if(flag == 'G') - { for (j_g = 0; j_g < 8; j_g++) - { switch (j_g) - { - case 0: - nav_b[i_g].sPRN_BDS = -1; - nav_b[i_g].sPRN_GAL = -1; - nav_b[i_g].sPRN_GPS = (int)strtonum(buff, 1, 2); - nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); - nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); - nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); - nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); - nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); - nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); - nav_b[i_g].sa0 = strtonum(buff, 23, 19); - nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); - nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 1: - nav_b[i_g].IODE = strtonum(buff, 4, 19); - nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); - nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 2: - nav_b[i_g].Cuc = strtonum(buff, 4, 19); - nav_b[i_g].e = strtonum(buff, 4 + 19, 19); - nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 3: - nav_b[i_g].TOE = strtonum(buff, 4, 19); - nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); - nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 4: - nav_b[i_g].i0 = strtonum(buff, 4, 19); - nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); - nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 5: - nav_b[i_g].IDOT = strtonum(buff, 4, 19); - nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); - nav_b[i_g].GPSweek= strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 6: - nav_b[i_g].sACC = strtonum(buff, 4, 19); - nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); - nav_b[i_g].TGD = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].IODC = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 7: - nav_b[i_g].TTN = strtonum(buff, 4, 19); - nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); - //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); - //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); - break; - }} - i_g++; - continue;} - - if(flag == 'C') - { for (j_c = 0; j_c < 8; j_c++) - { switch (j_c) - { - case 0: - nav_b[i_g].sPRN_GPS = -1; - nav_b[i_g].sPRN_GAL = -1; - nav_b[i_g].sPRN_BDS = (int)strtonum(buff, 1, 2); - nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); - nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); - nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); - nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); - nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); - nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); - nav_b[i_g].sa0 = strtonum(buff, 23, 19); - nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); - nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 1: - nav_b[i_g].AODE = strtonum(buff, 4, 19); - nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); - nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 2: - nav_b[i_g].Cuc = strtonum(buff, 4, 19); - nav_b[i_g].e = strtonum(buff, 4 + 19, 19); - nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 3: - nav_b[i_g].TOE = strtonum(buff, 4, 19); - nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); - nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 4: - nav_b[i_g].i0 = strtonum(buff, 4, 19); - nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); - nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 5: - nav_b[i_g].IDOT = strtonum(buff, 4, 19); - //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); - nav_b[i_g].BDTweek = strtonum(buff, 4 + 19 + 19, 19); - //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 6: - nav_b[i_g].sACC = strtonum(buff, 4, 19); - nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); - nav_b[i_g].TGD1 = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].TGD2 = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 7: - //nav_b[i_g].TTN = strtonum(buff, 4, 19); - nav_b[i_g].AODC = strtonum(buff, 4 + 19, 19); - //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); - //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); - break; - }} - i_g++; - continue;} - - if (flag == 'E') - { for (j_ga = 0; j_ga < 8; j_ga++) - { switch (j_ga) - { - case 0: - nav_b[i_g].sPRN_BDS = -1; - nav_b[i_g].sPRN_GPS = -1; - nav_b[i_g].sPRN_GAL = (int)strtonum(buff, 1, 2); - nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); - nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); - nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); - nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); - nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); - nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); - nav_b[i_g].sa0 = strtonum(buff, 23, 19); - nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); - nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 1: - nav_b[i_g].IODE = strtonum(buff, 4, 19); - nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); - nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 2: - nav_b[i_g].Cuc = strtonum(buff, 4, 19); - nav_b[i_g].e = strtonum(buff, 4 + 19, 19); - nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 3: - nav_b[i_g].TOE = strtonum(buff, 4, 19); - nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); - nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 4: - nav_b[i_g].i0 = strtonum(buff, 4, 19); - nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); - nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 5: - nav_b[i_g].IDOT = strtonum(buff, 4, 19); - //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); - nav_b[i_g].GALweek = strtonum(buff, 4 + 19 + 19, 19); - //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 6: - nav_b[i_g].sACC = strtonum(buff, 4, 19); - nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); - nav_b[i_g].BGDa = strtonum(buff, 4 + 19 + 19, 19); - nav_b[i_g].BGDb = strtonum(buff, 4 + 19 + 19 + 19, 19); - fgets(buff, MAXRINEX, fp_nav); - break; - case 7: - //nav_b[i_g].TTN = strtonum(buff, 4, 19); - //nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); - //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); - //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); - break; - }} - i_g++; - continue;} - } -} -/* ------------------------------ END OF READ_H ----------------------------- */ -#endif \ No newline at end of file diff --git a/headers/select_epo.h b/headers/select_epo.h deleted file mode 100644 index 4679fa0..0000000 --- a/headers/select_epo.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _SELECT_EPO_H_ -#define _SELECT_EPO_H_ - -#include - -#include"public.h" -/* -------------------------------------------------------------------------- */ -/// @brief find the nearest obs epoch with boardcast -/// @param SecofWeek second of week of obs epoch time -/// @param sPRN the satellite PRN which need to match -/// @param nav_b nav data file structure -/// @param satnum total number of boardcast satellite -/// @param syscode GNSS code, more on PPUBLIC.H -/// @return Return the absolute epoch number of the best epoch -/// When there is no matching satellite number, the function returns -1 -/* -------------------------------------------------------------------------- */ -extern int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int satnum, int syscode) -{ - int best_epoch = -1; - double min = 10000;//Initialize the minimum value - double Min; - if (syscode == GPS)//Be judged as GPS - { for (int i = 0; i < satnum; i++) - { if (sPRN == nav_b[i].sPRN_GPS) - { Min = fabs(SecofWeek - nav_b[i].TOE); - if (Min <= min) - { - best_epoch = i; - min = Min; - }}} - return best_epoch;} - - if (syscode == BDS)//Be judged as BeiDou - { for (int i = 0; i < satnum; i++) - { if (sPRN == nav_b[i].sPRN_BDS) - { Min = fabs(SecofWeek - nav_b[i].TOE); - if (Min <= min) - { - best_epoch = i; - min = Min; - }}} - return best_epoch;} - - if (syscode == GAL)//Be judged as Galileo - {for (int i = 0; i < satnum; i++) - { if (sPRN == nav_b[i].sPRN_GAL) - { Min = fabs(SecofWeek - nav_b[i].TOE); - if (Min <= min) - { - best_epoch = i; - min = Min; - }}} - return best_epoch;} - - return best_epoch; -} -/* --------------------------- END OF SELECT_EPO_H -------------------------- */ -#endif \ No newline at end of file diff --git a/headers/type2code.h b/headers/type2code.h deleted file mode 100644 index 884beda..0000000 --- a/headers/type2code.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef _TYPE2CODE_H_ -#define _TYPE2CODE_H_ - -#include -#include - -#include"public.h" -/* -------------------------------------------------------------------------- */ -/// @brief converts the observation type to the numeric code defined in PUBLIC.H -/// @param i reads the number of incoming loops in the loop -/// @param buff type of incoming observation -/// @return Returns the obs code -/* -------------------------------------------------------------------------- */ -int Type2Code(int i, char buff[1000]) -{ - int code_return = 0; - char code_contrast[4]; - char code_original[4]; - - const char L1codeindex[] = "C1CC1SC1LC1XC1PC1WC1YC1MC1AC1BC1Z";//obs type of different frequency - const char L2codeindex[] = "C2CC2SC2LC2XC2PC2WC2YC2MC2IC2QC2X"; - const char L5codeindex[] = "C5IC5QC5X"; - const char L6codeindex[] = "C6AC6BC6CC6XC6Z"; - const char L7codeindex[] = "C7IC7QC7XC7DC7PC7Z"; - const char L8codeindex[] = "C8JC8QC8X"; - - for(int j = 0; j < (strlen(L1codeindex)/3); j++) - { memset(code_contrast,0,sizeof(code_contrast)); - memset(code_original,0,sizeof(code_original)); - strncpy(code_contrast, L1codeindex + 0 + j * 3 , 3); - strncpy(code_original, buff + 7 + 4 * i , 3); - if(strcmp(code_contrast,code_original) == 0) - { code_return = j + 100; - return code_return; - break;}} - - for (int j = 0; j < (strlen(L2codeindex) / 3); j++) - { memset(code_contrast, 0, sizeof(code_contrast)); - memset(code_original, 0, sizeof(code_original)); - strncpy(code_contrast, L2codeindex + 0 + j * 3, 3); - strncpy(code_original, buff + 7 + 4 * i, 3); - if (strcmp(code_contrast, code_original) == 0) - { code_return = j + 200; - return code_return; - break;}} - - for (int j = 0; j < (strlen(L5codeindex) / 3); j++) - { memset(code_contrast, 0, sizeof(code_contrast)); - memset(code_original, 0, sizeof(code_original)); - strncpy(code_contrast, L5codeindex + 0 + j * 3, 3); - strncpy(code_original, buff + 7 + 4 * i, 3); - if (strcmp(code_contrast, code_original) == 0) - { code_return = j + 500; - return code_return; - break;}} - - for (int j = 0; j < (strlen(L6codeindex) / 3); j++) - { memset(code_contrast, 0, sizeof(code_contrast)); - memset(code_original, 0, sizeof(code_original)); - strncpy(code_contrast, L6codeindex + 0 + j * 3, 3); - strncpy(code_original, buff + 7 + 4 * i, 3); - if (strcmp(code_contrast, code_original) == 0) - { code_return = j + 600; - return code_return; - break;}} - - for (int j = 0; j < (strlen(L7codeindex) / 3); j++) - { memset(code_contrast, 0, sizeof(code_contrast)); - memset(code_original, 0, sizeof(code_original)); - strncpy(code_contrast, L7codeindex + 0 + j * 3, 3); - strncpy(code_original, buff + 7 + 4 * i, 3); - if (strcmp(code_contrast, code_original) == 0) - { code_return = j + 700; - return code_return; - break;}} - - for (int j = 0; j < (strlen(L8codeindex) / 3); j++) - { memset(code_contrast, 0, sizeof(code_contrast)); - memset(code_original, 0, sizeof(code_original)); - strncpy(code_contrast, L8codeindex + 0 + j * 3, 3); - strncpy(code_original, buff + 7 + 4 * i, 3); - if (strcmp(code_contrast, code_original) == 0) - { code_return = j + 800; - return code_return; - break;}} - - return code_return; -} - -/* -------------------------------------------------------------------------- */ -/// @brief the type of the obs value read matches the type code stored in an array -/// @param typecode obs type that you want to match -/// @param typenum the total number of obs types -/// @param typearr type codes store arrays -/// @return returns the array position of the corresponding obs type code -/* -------------------------------------------------------------------------- */ -int Code2Type(int typecode, int typenum, int typearr[36]) -{ - int pos; - for (pos = 0; pos < typenum; pos++) - { if (typearr[pos] == typecode) - { break; - return pos;}} - - return pos; -} - -#endif \ No newline at end of file diff --git a/headers/xyz2blh.h b/headers/xyz2blh.h deleted file mode 100644 index 90c9d48..0000000 --- a/headers/xyz2blh.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef _XYZ2BLH_H_ -#define _XYZ2BLH_H_ - -#include -#include - -#include"public.h" - -typedef struct -{ - double B; - double L; - double H; -}xyz2blh; -/* -------------------------------------------------------------------------- */ -/// @brief Convert ECEF geostationary coordinates to BLH coordinates -/// @param xyz2blh parameter transfer structure -/// @param X X coordinates of ECEF -/// @param Y Y coordinates of ECEF -/// @param Z Z coordinates of ECEF -/// @param a major semiaxis of WGS-84 ellipsoid -/// @param e2 the square of the first eccentricity of WGS-84 ellipsoid -/// @return return type of structure contain B, L, H members -/* -------------------------------------------------------------------------- */ -xyz2blh XYZ2BLH(xyz2blh xyz2blh, - double X, double Y, double Z) - -{ - double B = 0.0, N = 0.0, H = 0.0, R0, R1, deltaH, deltaB; - R0 = sqrt(pow(X, 2) + pow(Y, 2)); - R1 = sqrt(pow(X, 2) + pow(Y, 2) + pow(Z, 2)); - xyz2blh.L = atan2(Y, X); - N = a; - H = R1 - a; - B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); - do - { - deltaH = N; - deltaB = B; - N = a / sqrt(1 - e2 * pow(sin(B), 2)); - H = R0 / cos(B) - N; - B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); - } while (fabs(deltaH - H) > 1.0e-3 && fabs(deltaB - B) > 1.0e-9); - xyz2blh.B = B; - xyz2blh.H = H; - - return xyz2blh; -} - -#endif \ No newline at end of file diff --git a/plot/Mainui.py b/plot/Mainui.py deleted file mode 100644 index 2756599..0000000 --- a/plot/Mainui.py +++ /dev/null @@ -1,1065 +0,0 @@ -import math -import time -import Trocor -from base64 import b64decode -from tkinter import colorchooser -from tkinter import messagebox -from tkinter import filedialog -from tkinter import ttk -from PIL import ImageTk -import tkinter.font as tkFont -import tkinter as tk -import matplotlib as mpl -import numpy as np -mpl.use('TkAgg') -import matplotlib.pyplot as plt -from matplotlib.backends.backend_tkagg import ( - FigureCanvasTkAgg, NavigationToolbar2Tk) - -# Color register part -enucolor = ["#0080FF","#0080FF","#0080FF"] -enucolormid = ["#0080FF","#0080FF","#0080FF"] -enulinew = [ "0.80", "0.80", "0.80"] -satncolor = ["#0080FF"] -satncolormid= ["#0080FF"] -satnlinew = [ "1.50"] -# Ion & tro register part -ioncormode = ['OFF', 'Ion-Free LC', 'Broadcast'] -ioncorstate = 0 -trocormode = ['OFF', 'Hopfield', 'Saastamoinen'] -trocorstate = 0 - -#Sat system register part -satsysdict = {0: "G", 1:"R", 2:"C", 3:"E", 4:"S"} -satellite_system = 0 - - -def Colorchoose(i, label, mode): - #Brief # choice to change the color of draw - #Param # i : only for mode 1 - #Param # label : match the label with the button - #Param # mode : color register type - # undo choice == 0 & - # middle choice store == 1 & - # final confirm == 3 & - # satn color == 4 - #Return# none - global enucolor - if mode == 0: - enucolor = ["#0080FF", "#0080FF", "#0080FF"] - satncolor[0] = "#0080FF" - label.config(bg=enucolor[0]) - elif mode == 1: - colorvalue = tk.colorchooser.askcolor() - enucolormid[i] = str(colorvalue[1]) - label.config(bg=str(colorvalue[1])) - elif mode == 3: - enucolor[0] = enucolormid[0] - enucolor[1] = enucolormid[1] - enucolor[2] = enucolormid[2] - satncolor[0] = satncolormid[0] - elif mode == 4: - colorvalue = tk.colorchooser.askcolor() - satncolormid[0] = str(colorvalue[1]) - label.config(bg=str(colorvalue[1])) - -def Linewchoose(entry0, entry1, entry2, mode): - #Brief # input to change the width of line - #Param # entry0 : the entry box of e - #Param # entry1 : the entry box of n - #Param # entry2 : the entry box of u - #Param # mode : width of line register type - # undo choice == 0 & - # final confirm == 1 - #Return# none - - global enulinew - if mode == 0: - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - - elif mode == 1: - if (0 < float(entry0.get()) <= 5 and - 0 < float(entry1.get()) <= 5 and - 0 < float(entry2.get()) <= 5 ): - - enulinew[0] = entry0.get() - enulinew[1] = entry1.get() - enulinew[2] = entry2.get() - elif(float(entry0.get()) <= 0 or - float(entry1.get()) <= 0 or - float(entry2.get()) <= 0 ): - while not messagebox.showerror("ERROR !", "The line width value is invalid !"): - break - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - - elif(5 < float(entry0.get())or - 5 < float(entry1.get())or - 5 < float(entry2.get()) ): - msg = messagebox.askyesno("NOTICE", "The width of the line is too large\n" - "affecting the mapping.\n" - "Are you sure to continue ?") - if msg == False: - enulinew = ["0.80", "0.80", "0.80"] - entry0.set(enulinew[0]) - entry1.set(enulinew[1]) - entry2.set(enulinew[2]) - pass - elif msg == True: - enulinew[0] = entry0.get() - enulinew[1] = entry1.get() - enulinew[2] = entry2.get() - -def Calcu_confirm(v, cboxi, cboxt): - #Brief # choice to change the ion & tro correction && confirm the sat system - #Param # v sat system radio button value - #Param # cboxi the combo box of ion correction - #Param # cboxt the combo box of tro correction - #Return# none - global ioncorstate - global trocorstate - global satellite_system - - ioncorstate = Ion_and_Trocbox(cboxi, 0) - trocorstate = Ion_and_Trocbox(cboxt, 1) - satellite_system = Satsys_button(v) - - print(ioncorstate,trocorstate,satellite_system) - -def Satsys_button(v): - #Brief # get the value of radio button of sat system - #Param # v : the value of radio button - #Return# the sat system code - Systemdict = {0: "0", 1: "1", 2: "2", 3: "3", 4: "4"} - return int(Systemdict.get(v.get())) - -def Ion_and_Trocbox(cbox, cortype): - #Brief # get the value of combo box - #Param # cortype: correction type of - # ion == 0 & - # tro == 1 - #Param # cbox: - #Return# ion | tro state code - count = -1 - if cortype == 0: - for ionmode in ioncormode: - count += 1 - if cbox.get() == ionmode: - return count - - elif cortype == 1: - for tromode in trocormode: - count += 1 - if cbox.get() == tromode: - return count - -def Opt_windows(): - opt = tk.Toplevel(root) - opt.title("Options") - opt.geometry('350x200+250+200') - opt.minsize(320,250) - opt.maxsize(320,250) - - global icon_img2 - icon_img2 = (b'AAABAAEAICAAAAAAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'ABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAABIAAAASAAAACQAAAAAAAAACAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAk' - b'QAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAACQAAAA/wAAAPw' - b'AAAD/AAAA/wAAAPwAAAD/AAAAkAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAADAAAAAQAAAAEAAAAAA' - b'AAACwAAAOMAAAD/AAAA/AAAAP4AAAD+AAAA/AAAAP8AAADjAAAACgAAAAAAAAABAAAAAQAAAAMA' - b'AAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAA' - b'AAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAA' - b'AAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AABAAAAAAAAABEAAABTAAAAUQAAAA8AAAAAAAAAAAAAAEQAAAD/AAAA/gAAAP8AAAD/AAAA/wAA' - b'AP8AAAD+AAAA/wAAAEQAAAAAAAAAAAAAAA8AAABRAAAAUwAAABEAAAAAAAAAAQAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAgAAAAAAAAAwAAAA5QAAAP8AAAD/AAAA4QAAAHYAAAB2AAAA6QAAAP8AAA' - b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA6QAAAHYAAAB1AAAA4QAAAP8AAAD/AAAA5QAAA' - b'DAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMoAAAD/AAAA+gAAAPwAAAD/AAAA' - b'/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD' - b'/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAABrAAAA/wAAAP' - b'oAAAD/AAAA/wAAAP0AAAD7AAAA+wAAAP4AAAD/AAAA/AAAAP0AAAD/AAAA/wAAAP0AAAD8AAAA/' - b'wAAAP4AAAD7AAAA+wAAAP0AAAD/AAAA/wAAAPoAAAD/AAAAawAAAAAAAAADAAAAAAAAAAEAAAAA' - b'AAAAAwAAANUAAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA/wAAAPI' - b'AAADyAAAA/wAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAADVAAAAAw' - b'AAAAAAAAABAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9A' - b'AAA/wAAAK8AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8A' - b'AAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAAAAAAAAQAAAAAAAADBAAAA/wAAAPoAAAD/AAAA/wA' - b'AAP8AAAD/AAAA/QAAAP8AAAB3AAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAdwAAAP8AAAD9AA' - b'AA/wAAAP8AAAD/AAAA/wAAAPoAAAD/AAAAwQAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAADEAA' - b'ADmAAAA/wAAAP0AAAD/AAAA/wAAAPwAAAD/AAAAqwAAAAAAAAAEAAAAAwAAAAEAAAABAAAABAAA' - b'AAQAAAAAAAAArAAAAP8AAAD8AAAA/wAAAP8AAAD9AAAA/wAAAOYAAAAwAAAAAAAAAAIAAAAAAAA' - b'AAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACvAAAADQAAA' - b'AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAAD4AAAA/wAAAP0AAAD/AAAA' - b'8gAAABgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABgAAADyAAAA/wAAAP0AAAD' - b'/AAAA+AAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAP' - b'gAAAD/AAAA/QAAAP8AAADyAAAAGAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAG' - b'AAAAPIAAAD/AAAA/QAAAP8AAAD4AAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB' - b'AAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACuAAAADQAAAAAAAAABAAAAAA' - b'AAAAAAAAAAAAAAAgAAAAAAAAAxAAAA5gAAAP8AAAD9AAAA/wAAAP8AAAD8AAAA/wAAAKsAAAAAA' - b'AAABAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAAAAAKsAAAD/AAAA/AAAAP8AAAD/AAAA/QAAAP8A' - b'AADmAAAAMAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAMEAAAD/AAAA+gAAAP8AAAD/AAAA/wA' - b'AAP8AAAD9AAAA/wAAAHcAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAB3AAAA/wAAAP0AAAD/AA' - b'AA/wAAAP8AAAD/AAAA+gAAAP8AAADBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAATAAAA7AAAAP8AA' - b'AD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK4AAAA8AAAAFQAAABUAAAA8AAAArgAA' - b'AP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAABAAA' - b'AAAAAAAMAAADWAAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAP8AAA' - b'DyAAAA8gAAAP8AAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA1QAAA' - b'AMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAGsAAAD/AAAA+gAAAP8AAAD/AAAA/QAAAPsAAAD7AAAA' - b'/gAAAP8AAAD8AAAA/QAAAP8AAAD/AAAA/QAAAPwAAAD/AAAA/gAAAPsAAAD7AAAA/QAAAP8AAAD' - b'/AAAA+gAAAP8AAABrAAAAAAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMsAAAD/AAAA+gAAAP' - b'wAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/' - b'wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAA' - b'AAAAMQAAAOYAAAD/AAAA/wAAAOEAAAB2AAAAdgAAAOkAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8' - b'AAAD+AAAA/wAAAOkAAAB2AAAAdgAAAOEAAAD/AAAA/wAAAOYAAAAxAAAAAAAAAAIAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAFQAAABRAAAADwAAAAAAAAAAAAAARAAAAP8AAAD+A' - b'AAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAARAAAAAAAAAAAAAAADwAAAFEAAABUAAAAEQAAAAAA' - b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQA' - b'AAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAA' - b'AAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' - b'AAEAAAABAAAAAEAAAABAAAAAAAAAAsAAADjAAAA/wAAAPwAAAD+AAAA/gAAAPwAAAD/AAAA4wAA' - b'AAoAAAAAAAAAAQAAAAEAAAAEAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAJAAAAD/AAAA/AAAAP8AAA' - b'D/AAAA/AAAAP8AAACQAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA' - b'BwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAkAAAASAAAAEgAAAAoAAAAAAAAAAgAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAM' - b'AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9GL//' - b'+kJf//kAn//5AJ/+ggBBfTIATLqCAEFZAAAAkgAAAEIAAABEAAAAJAAAACIAQgBKAIEAVQClAKq' - b'AmQFagJkBVQClAKoAgQBSAEIARAAAACQAAAAiAAAAQgAAAEkAAACaggBBXTIATL6CAEF/+QCf//' - b'kAn//6Ql///Ri/8=') - - icon_img2 = b64decode(icon_img2) - icon_img2 = ImageTk.PhotoImage(data=icon_img2) - opt.tk.call('wm', 'iconphoto', opt._w, icon_img2) - - Optionscards = tk.ttk.Notebook(opt) - - #Calculate Options card---------------------------------------------------------# - Main1Frame0 = tk.Frame(opt) - - #ION correction# - TOP1Frame0 = ttk.Frame(Main1Frame0) - TOP1Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - ioncor = ttk.Label(TOP1Frame0, text='Ionosphere Correction') - ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') - - cionbox = ttk.Combobox(TOP1Frame0, width=15, height=4) - cionbox['state'] = 'readonly' - cionbox['value'] = ('OFF', 'Ion-Free LC', 'Broadcast') - cionbox.current(ioncorstate) - cionbox.pack(side=tk.RIGHT, anchor='e') - - #TRO correction# - TOP2Frame0 = ttk.Frame(Main1Frame0) - TOP2Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - ioncor = ttk.Label(TOP2Frame0, text='Troposphere Correction') - ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') - - ctrobox = ttk.Combobox(TOP2Frame0, width=15, height=4) - ctrobox['state'] = 'readonly' - ctrobox['value'] = ('OFF', 'Hopfield', 'Saastamoinen') - ctrobox.current(trocorstate) - ctrobox.pack(side=tk.RIGHT, anchor='e') - - #GNSS Options# - TOP5Frame0 = ttk.LabelFrame(Main1Frame0, text='Satellite system', labelanchor='nw') - TOP5Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) - - satsys = [("GPS", 0),("GLO", 1),("BeiDou", 2),("Galileo", 3),("SBAS", 4)] - v = tk.IntVar() - - for sys, num in satsys: - radio_button = ttk.Radiobutton(TOP5Frame0, text=sys, variable=v, value=num) - radio_button.pack(side=tk.LEFT, padx='3px', anchor='w') - - v.set(satellite_system) - - #Drawing Options card-----------------------------------------------------------# - Main2Frame0 = tk.Frame(opt) - - # Satnum plot options# - Buttom1Frame1 = ttk.LabelFrame(Main2Frame0, text='Satn configs', labelanchor='nw') - Buttom1Frame1.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='1px', fill=tk.BOTH) - - SatnFrameB1 = tk.Frame(Buttom1Frame1) - SatnFrameB1.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - satncolopt = ttk.Button(SatnFrameB1, text='Satn Color', width=10, command=lambda: Colorchoose(0, satncollab, 4)) - satncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - satncollab = tk.Label(SatnFrameB1, width=5, height=1, bg=satncolormid[0]) - satncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - LineConB1 = tk.Frame(Buttom1Frame1) - LineConB1.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') - linewre = ttk.Button(LineConB1, text='Undo', width=10, - command=lambda: Colorchoose(0, satncollab, 0)) - linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') - - #Line's colors options# - Left2Frame1 = ttk.LabelFrame(Main2Frame0, text='ENU colors', labelanchor='nw') - Left2Frame1.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) - - EFrameL2 = tk.Frame(Left2Frame1) - EFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ecolopt = ttk.Button(EFrameL2, text='E Color', width=10, command=lambda: Colorchoose(0, ecollab, 1)) - ecolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ecollab = tk.Label(EFrameL2, width=5, height=1, bg=enucolor[0]) - ecollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - NFrameL2 = tk.Frame(Left2Frame1) - NFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ncolopt = ttk.Button(NFrameL2, text='N Color', width=10, command=lambda: Colorchoose(1, ncollab,1)) - ncolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ncollab = tk.Label(NFrameL2, width=5, height=1, bg=enucolor[1]) - ncollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - UFrameL2 = tk.Frame(Left2Frame1) - UFrameL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ucolopt = ttk.Button(UFrameL2, text='U Color', width=10, command=lambda: Colorchoose(2, ucollab,1)) - ucolopt.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - ucollab = tk.Label(UFrameL2, width=5, height=1, bg=enucolor[2]) - ucollab.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - ColorConL2 = tk.Frame(Left2Frame1) - ColorConL2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - colorcon = ttk.Button(ColorConL2, text='Undo', width=10, - command=lambda: [Colorchoose(0, ecollab,0) - ,Colorchoose(0, ncollab,0) - ,Colorchoose(0, ucollab,0)]) - colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') - - #Line's weight options# - Right2Frame1 = ttk.LabelFrame(Main2Frame0, text='Draw configs', labelanchor='nw') - Right2Frame1.pack(side=tk.RIGHT, expand=tk.YES , padx='1px', pady='1px', fill=tk.Y) - - EFrameR2 = tk.Frame(Right2Frame1) - EFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - elinewopt = tk.Label(EFrameR2, text='Eline:', width=5, height=1) - elinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - elinewidth = ttk.Spinbox(EFrameR2, from_=0, to=10,increment=0.01, width=10) - elinewidth.set(enulinew[0]) - elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - NFrameR2 = tk.Frame(Right2Frame1) - NFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - nlinewopt = tk.Label(NFrameR2, text='Nline:', width=5, height=1) - nlinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - nlinewidth = ttk.Spinbox(NFrameR2, from_=0, to=10,increment=0.01, width=10) - nlinewidth.set(enulinew[1]) - nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - UFrameR2 = tk.Frame(Right2Frame1) - UFrameR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - ulinewopt = tk.Label(UFrameR2, text='Uline:', width=5, height=1) - ulinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - ulinewidth = ttk.Spinbox(UFrameR2, from_=0, to=10,increment=0.01, width=10) - ulinewidth.set(enulinew[2]) - ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') - - LineConR2 = tk.Frame(Right2Frame1) - LineConR2.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') - linewre = ttk.Button(LineConR2, text='Undo', width=10, - command=lambda: Linewchoose(elinewidth, nlinewidth, ulinewidth, 0)) - linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') - - Optionscards.add(Main1Frame0, text='Calc options') - Optionscards.add(Main2Frame0, text='Draw options') - Optionscards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') - - #TOTAL Confirm# - Bottom0Frame0 = ttk.Frame(opt) - Bottom0Frame0.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.Y) - TotalCancel = ttk.Button(Bottom0Frame0, text='Cancel', width=10, - command=lambda: [opt.destroy()]) - TotalCancel.pack(side=tk.RIGHT, padx='1px', anchor='e') - TotalCon = ttk.Button(Bottom0Frame0, text='Confirm', width=10, - command=lambda: [Colorchoose(0, ecollab,3), - Linewchoose(elinewidth,nlinewidth,ulinewidth,1), - Calcu_confirm(v, cionbox, ctrobox), - opt.destroy()]) - TotalCon.pack(side=tk.RIGHT, padx='1px', anchor='e') - -def Abo_windows(): - abo = tk.Toplevel(root) - abo.title("About") - abo.attributes('-toolwindow', 2) - abo.geometry('200x200+200+200') - abo.minsize(200, 100) - abo.maxsize(200, 100) - - About = tk.Label(abo, text="\\( ̄︶ ̄*\\))\n\nKNZ_plot ver 1.2.1\nCopyright (c) 2024 by KenanZhu\nAll Right Reserved.") - About.pack(side=tk.TOP, expand=tk.YES) - -def View_windows(): - view = tk.Toplevel(root) - view.title("KNZ_View") - view.geometry('900x600') - view.minsize(1000, 600) - - global icon_img1 - icon_img1 = (b'AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAPY6AQD2OgEAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAA' - b'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAAB' - b'EAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAD' - b'QAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAAHEAAADMAAAA6wAAAO8' - b'AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7g' - b'AAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAMwAAAByAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA' - b'AAAdAAAAzwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wA' - b'AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AA' - b'AA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAA' - b'AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAA' - b'A/wAAAP8AAAD/AAAA/gAAAPoAAAD6AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAA' - b'P8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA' - b'7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAAB' - b'xAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAE' - b'QAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAUAAAAFgAAABUAAAAR' - b'AAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAA' - b'AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAA' - b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgA' - b'AAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAA' - b'AAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAAAAAAAA/AAAAkwAAAE0AAAAAAAAAAAAAABQAA' - b'ADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAIAAAAFAAAAAAAAAFsAAA' - b'D/AAAA/gAAAP8AAABNAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA' - b'/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAIAAAAAAAAAXAAAAP8AAAD9AAAA9QAAAP8AAACIAAAAAAAAABUAAADuAAAA/wAAAP' - b'8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAgAAAAIAAAAAAAAAKgAAAGcAAAB7AAAAaAAAAB0AAABaAAAA/wAAAP0AAAD8AAAA/QAAAP8' - b'AAAA/AAAAAAAAABQAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARA' - b'AAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABYAAACrAAAA/gAAAP8AAAD+AAAA/wAAAPcA' - b'AAD4AAAA/gAAAP0AAAD9AAAA/wAAAFwAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgA' - b'AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' - b'AAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGAAAANgAA' - b'AD/AAAA/QAAAPkAAAD2AAAA+QAAAP8AAAD9AAAA/gAAAP8AAAD/AAAAXAAAAAAAAAAFAAAAAAAA' - b'ABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAA' - b'AAAAAAAAAAAAIAAAAAAAAArAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD+AAAA/wAAA' - b'P8AAABbAAAAAAAAAAUAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD' - b'/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAwAAAA/gAAAP0AAAD+AAAA/wAAAM' - b'YAAACAAAAAygAAAP8AAAD9AAAA/wAAAPoAAAAmAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/' - b'wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAA' - b'AAABqAAAA/wAAAPkAAAD/AAAAxQAAAAMAAAAAAAAABgAAAMsAAAD/AAAA+QAAAP8AAABkAAAAAA' - b'AAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4A' - b'AAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAAB/AAAA/wAAAPcAAAD/AAAAggAAAAAAAAASAAAAAAA' - b'AAIoAAAD/AAAA9wAAAP8AAAB4AAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAA' - b'AAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' - b'AAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABrAAAA/wAA' - b'APkAAAD/AAAAwQAAAAAAAAAAAAAAAwAAAMcAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAA' - b'AAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAA' - b'AEAAAAAAAAAAgAAAAAAAAAyAAAA/wAAAP0AAAD+AAAA/wAAAMEAAAB4AAAAxAAAAP8AAAD+AAAA' - b'/gAAAPwAAAArAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAA' - b'BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO' - b'0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAsAAAAP8AAAD5AAAA/' - b'QAAAP8AAAD/AAAA/wAAAP0AAAD5AAAA/wAAAKkAAAAAAAAAAgAAAAAAAAABAAAAAAAAABEAAADu' - b'AAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAA' - b'AAAAEAAAAAAAAAHAAAAN0AAAD/AAAA/AAAAPgAAAD2AAAA+AAAAPwAAAD/AAAA2AAAABgAAAAAA' - b'AAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wA' - b'AAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABsAAAC0AAAA/wAAAP8AAAD+AA' - b'AA/wAAAP8AAACvAAAAGAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AA' - b'ADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAA' - b'AAwAAAAIAAAAAAAAAMQAAAG8AAACEAAAAbgAAAC8AAAAAAAAAAgAAAAMAAAABAAAAAQAAAAAAAA' - b'ABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAA' - b'AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAA' - b'AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAE' - b'gAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAAS' - b'AAAAFAAAABYAAAAWAAAAFgAAABQAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABE' - b'AAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQA' - b'AAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwA' - b'AADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AA' - b'AA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AA' - b'AD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAA' - b'AP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAA' - b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAA' - b'BIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAA' - b'RAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADtAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO' - b'4AAADuAAAA7gAAAO0AAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAE' - b'gAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA' - b'AAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAARAAAAEQAAABE' - b'AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAEAAAAAEAAAABAAAAAA' - b'AAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AA' - b'AD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAA' - b'A/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAA' - b'BIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAA' - b'EAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO' - b'4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7' - b'QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADt' - b'AAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE' - b'AAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/w' - b'AAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAA' - b'AAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAA' - b'AAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA' - b'AA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAA' - b'AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAA' - b'AO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAA' - b'A7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAA' - b'DuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAABAAAA' - b'EAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAA' - b'SAAAAEAAAAAEAAAABAAAAAAAAABIAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/' - b'wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAABMAAADtAAAA/wAAAP8' - b'AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAA' - b'AAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAA' - b'AARAAAAEQAAABEAAAARAAAAEQAAABIAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAA' - b'AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA' - b'AAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAA' - b'DuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAA' - b'P8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD' - b'/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP' - b'8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD5AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAd' - b'AAAA0AAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8' - b'AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0A' - b'AAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACgAAAHIAAADNAAAA6wAAAO8AAADuAAAA7gAAAO4A' - b'AADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gA' - b'AAO4AAADvAAAA6wAAAM0AAAByAAAACgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAA' - b'AABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAA' - b'ABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Rf/' - b'/ov8AAP6QAAAJfwAA/UAAAAK/AAD+gAAAAX8AAPkAAAAAnwAA+QAAAACfAAD5AAAAAJ8AAPoF//' - b'+gXwAA+gQABGBfAAD6BegIIF8AAPoF0pAgXwAA+gWkACBfAAD6BVAAYF8AAPoFIACgXwAA+gUgA' - b'SBfAAD6BUABIF8AAPoFQIEgXwAA+gVBQSBfAAD6BUCBIF8AAPoFQAEgXwAA+gUgAiBfAAD6BSAC' - b'IF8AAPoFUAUgXwAA+gQEECBfAAD6Bf//oF8AAPoEAAAgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAAB' - b'gXwAA+gYAAGBfAAD6BAAAIF8AAPoF//+gXwAA+gX//6BfAAD6BAAAIF8AAPoGAABgXwAA+gYAAG' - b'BfAAD6BgAAYF8AAPoGAABgXwAA+gQAACBfAAD6BF/6IF8AAPoF//+gXwAA+QAAAACfAAD5AAAAA' - b'J8AAPkAAAAAnwAA/oAAAAF/AAD9QAAAAr8AAP6QAAAJfwAA/0X//6L/AAA=') - - icon_img1 = b64decode(icon_img1) - icon_img1 = ImageTk.PhotoImage(data=icon_img1) - view.tk.call('wm', 'iconphoto', view._w, icon_img1) - - #View window's menu - topmenu = tk.Menu(view) - filemenu = tk.Menu(topmenu, tearoff=False) - filemenu.add_command(label="Open File", command=lambda: View_windowshow(text, view), accelerator='Ctrl+F') - filemenu.add_command(label="Exit", command=view.destroy, accelerator='Ctrl+E') - topmenu.add_cascade(label="File", menu=filemenu) - - view.config(menu=topmenu) - - ybar = tk.Scrollbar(view) - ybar.pack(side=tk.RIGHT, fill=tk.Y) - xbar = tk.Scrollbar(view, orient=tk.HORIZONTAL) - xbar.pack(side=tk.BOTTOM, fill=tk.X) - - text = tk.Text(view, xscrollcommand=xbar.set, yscrollcommand=ybar.set, height=500, width=1000, undo=True, autoseparators=False, wrap='none') - text.pack(side=tk.TOP, fill=tk.BOTH) - - ybar.config(command=text.yview) - xbar.config(command=text.xview) - -def View_windowshow(text, view): - #Brief # get the file path of reading and show in the text ctr box - #Param # text : the show box of file of choice - #Param # view : the father window of text ctr box - #Return# none - f_path = filedialog.askopenfilename() - view.title('KNZ_Viewing: %s' %(f_path)) - text.delete('1.0', 'end') - with open(f_path, 'r') as f: - lines = f.readlines() - for line in lines: - text.insert('insert', line) - text.config() - -def Clear_canvas(): - #Brief # clear the canvas - #Return# none - ex.clear() - nx.clear() - ux.clear() - satn.clear() - canvas0.draw() - canvas1.draw() - plotstate.config(text="None") - root.update() - -def PO_openfile(): - #Brief # read the .po file & draw in the canvas - #Return# none - ENU_O = np.empty((3, 0)) - #Sat numbers register part - satnumnarry = np.empty((1, 0)) - f_path = filedialog.askopenfilename() - if not f_path.find(".po") >= 0: - plotstate.config(text="Error !: format is invalid.") - root.update() - return - with open(f_path, 'r') as f: - while 1: - line = f.readline() - if line.find("X-rec") >= 0: - plotstate.config(text="Reading...") - root.update() - while 1: - line = f.readline() - if line != "" and line[1:2] != "-": - E = float(line[45 + 22:55 + 22]) - N = float(line[56 + 22:66 + 22]) - U = float(line[67 + 22:77 + 22]) - satnum = int(line[64:67]) - - ENU_O = np.hstack((ENU_O, [ [E], [N], [U] ] )) - satnumnarry = np.hstack((satnumnarry, [[satnum]])) - if line[1:2] == "-": - ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) - satnumnarry = np.hstack((satnumnarry, [[0]])) - if line == "": - ex.clear() - nx.clear() - ux.clear() - ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', ms=enulinew[0]) - ex.set_title('E-W(m)', loc='left', fontsize=8) - ex.grid(True, linestyle='--', alpha=0.7) - nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', ms=enulinew[1]) - nx.set_title('N-S(m)', loc='left', fontsize=8) - nx.grid(True, linestyle='--', alpha=0.7) - ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', ms=enulinew[2]) - ux.set_title('U-D(m)', loc='left', fontsize=8) - ux.set_xlabel('Epochs') - ux.grid(True, linestyle='--', alpha=0.7) - canvas0.draw() - - satn.clear() - satn.plot(satnumnarry[0, :], color=satncolor[0], linewidth=satnlinew[0]) - satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) - satn.set_xlabel('Epochs') - satn.grid(True, linestyle='--', alpha=0.7) - canvas1.draw() - break - elif line == "": - plotstate.config(text="Plot form: %s" % (f_path)) - break - -def SPP_calculat(): - # Brief # read .sp file & draw in the canvas & output the .po file - # Return# none - # Const define - C_V = 299792458 - f1 = 1575.42 - f2 = 1227.60 - ENU_O = np.empty((3,0)) - #Sat numbers register part - satnumnarry = np.empty((1, 0)) - f_path = filedialog.askopenfilename() - if not f_path.find(".sp") >= 0: - plotstate.config(text="Error !: format is invalid.") - root.update() - return - with open(f_path, 'r') as f: - while 1: - line = f.readline() - if line.find("APPROX POSITION XYZ") >= 0: - apX = float(line[23:35]) - apY = float(line[36:48]) - apZ = float(line[49:61]) - elif line.find("APPROX POSITION BLH") >= 0: - apB = float(line[23:35]) - apL = float(line[36:48]) - apH = float(line[49:61]) - elif line.find("OBS FILE PATH") >= 0: - Obs = line[23:300] - elif line.find("NAV FILE PATH") >= 0: - Nav = line[23:300] - elif line.find("IONOS OPT") >= 0: - ION = line[23:33] - elif line.find("TROPO OPT") >= 0: - TRO = line[23:33] - break - #Get the obs file name---------------------------# - obspath = len(Obs) - while obspath > 0: - flag = Obs[obspath - 1:obspath] - if flag == "\\": - obsfile = satsysdict.get(satellite_system) + "-" + Obs[obspath:-4] - break - obspath -= 1 - # Get the file's father folder-------------------# - pathlon = len(f_path) - while pathlon - 3 > 0: - flag = f_path[pathlon - 3 - 1:pathlon - 3] - if flag == "/": - o_path = f_path[:pathlon - 3] + obsfile +"po" - break - pathlon -= 1 - # -----------------------------------------------# - - # Generate the data header-----------------------# - with open(o_path, 'w+') as of:# Initialize-------# - of.close() - with open(o_path, 'a+') as of: - print("@ GENERATE PROGRAM : KNZ_Plot v1.2.1\n" - "@ GENERATE TYPE : Receiver Station Position\n" - "@ GENERATE TIME : %s\n" - "@ GENERATE SYS : %s\n" - "@ IONOS OPT : %s\n" - "@ TROPO OPT : %s\n" - "@\n\n" % ( time.asctime(time.localtime()) - , satsysdict.get(satellite_system) - , ioncormode[ioncorstate] - , trocormode[trocorstate]), file=of) - print("GPST X-rec(m) Y-rec(m) Z-rec(m) Sn(n) dE(m) dN(m) dU(m) ", file=of) - of.close() - #Coordinate transformation matrix---------------# - S = np.array([ - [ -math.sin(apL), math.cos(apL), 0], - [ -math.sin(apB) * math.cos(apL), -math.sin(apB) * math.sin(apL), math.cos(apB)], - [ math.cos(apB) * math.cos(apL), math.cos(apB) * math.sin(apL), math.sin(apB)] - ]) - #-----------------------------------------------# - plotstate.config(text="Reading...") - root.update() - - global epoch_last - epoch_last = 0 - while 1: - line = f.readline() - if line == "": - break - flag = line[0: 1] - if flag == ">": - satnum = 0 - satX = np.empty((1, 0)) - satY = np.empty((1, 0)) - satZ = np.empty((1, 0)) - C1 = np.empty((1, 0)) - C2 = np.empty((1, 0)) - ma = np.empty((1, 0)) - TGD = np.empty((1, 0)) - Dt = np.empty((1, 0)) - - year = int(line[6:10]) - month = int(line[11:13]) - day = int(line[14:16]) - hour = int(line[17:19]) - min = int(line[20:22]) - sec = float(line[23:30]) - epoch = int(line[2:6]) - - count = 0 - while count < epoch - epoch_last - 1: - ENU_O = np.hstack(( ENU_O, [ [0], [0], [0] ] )) - satnumnarry = np.hstack((satnumnarry, [[0]])) - with open(o_path, 'a+') as of: - print("------------Missing data------------Missing data------------Missing data------------Missing data------------", file=of) - of.close() - count += 1 - epoch_last = epoch - while 1: - line = f.readline() - if line == "\n": - satnumnarry = np.hstack(( satnumnarry, [ [satnum] ] )) - if satnum >= 4: - stop = 0 - X = ap_X = apX - Y = ap_Y = apY - Z = ap_Z = apZ - while math.fabs(ap_X - X) > 1.0e-7 or ap_X == X: - stop += 1 - if stop >= 4: - break - count = 0 - ap_X = X - ap_Y = Y - ap_Z = Z - Ptem = [] - B = np.empty((0, 4)) - L = np.empty((0, 1)) - while 1: - R = math.sqrt(pow((satX[0,count] - ap_X), 2) + pow((satY[0,count] - ap_Y), 2) + pow((satZ[0,count] - ap_Z), 2)) - l = -((satX[0,count] - ap_X) / R) - m = -((satY[0,count] - ap_Y) / R) - n = -((satZ[0,count] - ap_Z) / R) - B = np.vstack((B, [l, m, n, 1])) - Ptem.append(pow(math.sin(math.radians(ma[0,count])), 2)) - if C2[0,count] != 0 and C1[0,count] != C2[0,count]: - Pl = (f1 * f1 * C1[0,count]) / (f1 * f1 - f2 * f2) - (f2 * f2 * C2[0,count]) / (f1 * f1 - f2 * f2) - else: - Pl = C1[0,count] - L = np.vstack((L, [Pl - R + C_V * Dt[0,count] - Trocor.def_tro_cor(apH, ma[0,count])])) - - count += 1 - if count == satnum: - break - - P = np.diag(Ptem) - BTP = np.dot(np.transpose(B) , P) - BTPB = np.dot( BTP , B) - Q = np.linalg.inv( BTPB ) - D_X = np.dot( np.dot( np.dot( Q , np.transpose(B) ) , P ) , L ) #Coordinate correction - X = D_X[0, 0] + ap_X - Y = D_X[1, 0] + ap_Y - Z = D_X[2, 0] + ap_Z - - DeltaXYZ = np.array([[X - apX],[Y - apY],[Z - apZ]]) - ENU = S @ DeltaXYZ - if ENU[0, 0] > 25 or ENU[1, 0] > 25 or ENU[2, 0] > 50: - ENU_O = np.hstack((ENU_O, [[0], [0], [0]])) - else: - ENU_O = np.hstack((ENU_O,[ [ENU[0, 0]],[ENU[1, 0]],[ENU[2, 0]] ])) - with open(o_path, 'a+') as of: - print("%4d\\%02d\\%02d\\%02d\\%02d\\%04.1f %12.4f %12.4f %12.4f %3d %10.5f %10.5f %10.5f" - %(year, month, day, hour, min, sec, X, Y, Z, satnum, ENU[0, 0], ENU[1, 0], ENU[2, 0]),file = of) - of.close() - break - else: - break - - flag = line[0:1] - if flag == satsysdict.get(satellite_system): - satnum += 1 - satX = np.hstack(( satX, [ [float(line[6:21])] ] )) - satY = np.hstack(( satY, [ [float(line[22:37])] ] )) - satZ = np.hstack(( satZ, [ [float(line[38:53])] ] )) - C1 = np.hstack(( C1, [ [float(line[55:69])] ] )) - C2 = np.hstack(( C2, [ [float(line[71:85])] ] )) - ma = np.hstack(( ma, [ [float(line[86:101])] ] )) - Dt = np.hstack(( Dt, [ [float(line[102:118])] ] )) - - - elif line.find("END") >= 0: - ex.clear() - nx.clear() - ux.clear() - ex.plot(ENU_O[0, :], color=enucolor[0], linewidth=enulinew[0], marker='.', linestyle=':', ms=enulinew[0]) - ex.set_title('E-W(m)', loc='left', fontsize=8) - ex.grid(True, linestyle='--', alpha=0.7) - nx.plot(ENU_O[1, :], color=enucolor[1], linewidth=enulinew[1], marker='.', linestyle=':', ms=enulinew[1]) - nx.set_title('N-S(m)', loc='left', fontsize=8) - nx.grid(True, linestyle='--', alpha=0.7) - ux.plot(ENU_O[2, :], color=enucolor[2], linewidth=enulinew[2], marker='.', linestyle=':', ms=enulinew[2]) - ux.set_title('U-D(m)', loc='left', fontsize=8) - ux.set_xlabel('Epochs') - ux.grid(True, linestyle='--', alpha=0.7) - canvas0.draw() - - satn.clear() - satn.plot(satnumnarry[0, :], color=satncolor[0], linewidth=satnlinew[0]) - satn.set_title('Valid Sat Numbers', loc='left', fontsize=8) - satn.set_xlabel('Epochs') - satn.grid(True, linestyle='--', alpha=0.7) - canvas1.draw() - - f.close() - plotstate.config(text="Plot form: %s" % (f_path)) - break - -root = tk.Tk() -root.title("KNZ_Plot") -root.geometry('900x450') -root.minsize(500,500) - -icon_img = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAANIAAADSAAAAAAA' - b'AAAAAAAAEAQOcBAEDtQQBA6UEAQN6BAEDPgQBAwgEAQMABAEDAQQBAwMEAQMBBAEDAAQBAwAEAQ' - b'MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBA60EAQP/BAED/QQBA/8EAQP+BAED3AQBA4cEAQMeBAED' - b'AAQBAwMEAQMCBAEDAAQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDBwQBA8wEAQP/BAED+gQBA/' - b'4EAQP+BAED/wQBA/cEAQOCBAEDBgQCAwAEAQMBBAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMA' - b'BAEDVQQBA/8EAQP8BAED/wQBA/0EAQP7BAED/AQBA/8EAQPEBAEDFAQBAwAEAQMBBAEDAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAQBAwAEAQMOBAED5wQBA/8EAQP+BAED/wQBA/8EAQP+BAED+QQBA/8EAQO7B' - b'AEDAAQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAgQBAwAEAQO5BAED/wQBA/wEAQP/BAED/wQ' - b'BA/8EAQP/BAED/AQBA/8EAQMzBAEDAAQBAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMEBAEDAAQBA5MEA' - b'QP/BAED+wQBA/8EAQP/BAED/wQBA/8EAQP9BAED/wQBAz8EAQMABAEDBQQBAwAEAQMABAEDAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAQBAwQEAQMABAEDaAQBA/8EAQP7BAED/wQBA/8EAQP/BAED/gQBA/8EAQPqBAEDFAQBAwAEAQ' - b'MBBAEDAwQBAwAEAQMABAEDAAYAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAABAEDAgQBAwAEAQMnBAED+QQBA/4EAQP8BAED/gQBA/wEAQP5BAED' - b'/wQBA38EAQMABAEDOgQBAzsEAQMABAEDBAQBAwEEAQMABAEDAAMBAgAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAwQBAwAEAQOIBAED/wQBA/' - b'wEAQP/BAED/QQBA/8EAQOhBAIDAAMBBAEEAQPIBAED/wQBA2UEAQMABAEDAwQBAwEEAQMABAEDA' - b'AQBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMA' - b'BAEDAQUAAgAEAQN8BAED6QQBA/QEAQPVBAEDZgQBAwMEAQMABAEDkAQBA/8EAQP5BAED/wQBA5Q' - b'EAwUABAEDAgQBAwEEAQMABAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAABAEDAAQBAwAEAQMABAEDAgQBAwAEAQMLBAEDGAQBAwQEAQMABAEDBAQBA5QEAQP/B' - b'AED/AQBA/4EAQP6BAED/wQBA6oEAQMDBAEDAQQBAwEEAQMABAEDAAQABAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMBBAEDAwQBAwAEAQMCBAEDAAQ' - b'BAz8EAQPVBAED/wQBA/wEAQP/BAED/wQBA/8EAQP6BAED/wQBA64EAQMDBAEDAQQBAwEEAQMABA' - b'EDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAgAEA' - b'QIABAEDAQQBAwQEAQMABAEDRQQBA/8EAQP6BAED/gQBA/8EAQP/BAED/wQBA/8EAQP6BAED/wQB' - b'A6YEAQQABAEDAgQBAwEEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDAAQBAwMEAQMABAEDbAQBA/8EAQP7BAED/wQBA/8EAQ' - b'P/BAED/wQBA/8EAQP6BAED/wQBA5UEAQMABAEDAwQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAQMABAED' - b'kQQBA/8EAQP6BAED/wQBA/8EAQP/BAED/wQBA/8EAQP7BAED/wQBA38EAQMABAEDBAQAAAAEAQM' - b'ABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAw' - b'AEAQMABAEDAQQBAwIEAQMABAEDnwQBA/8EAQP6BAED/wQBA/8EAQP/BAED/wQBA/8EAQP8BAED/' - b'wQBA2QEAQMABAEDBAQBAwAEAQMABAEDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAQQBAwIHAQQABAEDnQQBA/8EAQP6BAED/gQBA/8' - b'EAQP/BAED/wQBA/4EAQP+BAED/QQBA0cEAQMABAEDBAQBAwAEAQMABAECAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBAAQBAwAEAQMABAEDAQQBAwMEAQMAB' - b'AEDjAQBA/8EAQP7BAED/gQBA/8EAQP/BAED/wQBA/0EAQP/BAED7gQBAysEAQMABAEDAwQBAwAE' - b'AQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgECAAQ' - b'BAwAEAQMABAEDAQQBAwQEAQMABAEDcwQBA/8EAQP9BAED/QQBA/8EAQP/BAED/wQBA/wEAQP/BA' - b'ED1gQBAxIEAQMABAEDAgQBAwAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAwECAAQBAwAEAQMABAEDAQQBAwQEAQMABAEDVQQBA/cEAQP/BAED/AQB' - b'A/8EAQP/BAED/wQBA/sEAQP/BAEDtQAAAAAEAQMCBAEDAQQBBAAEAQMAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwQEAQ' - b'MABAEDNgQBA+QEAQP/BAED+wQBA/8EAQP/BAED/wQBA/sEAQP/BAEDjAQBAwAEAQMEBAEEAAQBA' - b'wAEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAQBAwAEAQMABAADAAQBAwQEAQMABAEDGgQBA8cEAQP/BAED+wQBA/4EAQP/BAED/wQBA/wEAQP' - b'/BAEDXgQBAwAEAQMEBAEDAAQBAwAEAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwMEAwIABAEDBQQBA54EAQP/BAED/' - b'AQBA/0EAQP/BAED/gQBA/8EAQP0BAEDMQQBAwAEAQMDBAEDAAQBAwAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBAwAEAQMABAEDAAQBAwI' - b'EAQMDBAEDAAQBA20EAQP8BAED/wQBA/wEAQP/BAED/AQBA/8EAQPTBAEDDQQBAwAEAQMBBAEDAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAQBAwAEAQMABAEDAAQBAwEEAQMEBAEDAAQBAz0EAQPkBAED/wQBA/sEAQP+BAED+wQBA/8E' - b'AQOgBAEDAAQBAwMEAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMBAgAEAQMABAEDAAQBAwAEAQMEBAEDAAQBAxUEAQO4BA' - b'ED/wQBA/sEAQP9BAED/AQBA/8EAQNhBAEDAAQBAwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAAQB' - b'AwAEAQMDBAEDAQQBBAAEAQN6BAED/QQBA/8EAQP6BAED/wQBA+8EAQMiBAEDAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAEAQMABAEDAAQBAwAEAQMCBAEDBAQBAwAEAQM6BAED2wQBA/8EAQP4BAED/wQBA' - b'60EAQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQMABAEDAAQBAwAEAQMBBAEDBAQBAwAEAQM' - b'MBAEDlgQBA/8EAQP+BAED/wQBA1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEDA' - b'AQBAwAEAQMABAEDAwQBAwMEAQMABAEDPAQBA8kEAQP/BAED1wAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' - b'AAAAAAAAAAAAAAAAAAAAABAEDAAQBAwAEAQMABAEDAQQBAwQEAQMABAEDAwQBA18EAQOvAi///w' - b'CX//8AC///gBP//4AT//9AC///QAp//0AIv/9AEl//ICEv/wAgl/9IgAv/oQAF/9kAEv/8gAl//' - b'EAEf/0gAr/+kAFf/0gAr/+kAFf/0gAD/+kAK//0gBX/+QAK//6QBP//SAT//6QC///JAf//9IH/' - b'//pA///8kP///0g=') - -icon_img = b64decode(icon_img) -icon_img = ImageTk.PhotoImage(data=icon_img) -root.tk.call('wm', 'iconphoto', root._w, icon_img) - -Drawcards = tk.ttk.Notebook(root) - -default_font = tkFont.nametofont("TkDefaultFont") -default_font.configure(family="Segoe UI", size=9) - -stateframe = tk.Frame(root) -stateframe.pack(side=tk.BOTTOM, fill=tk.X) -plotstate = ttk.Label(stateframe,text="None") -plotstate.pack(side=tk.LEFT, anchor='w') - -Tooptions = tk.Frame(root) -Tooptions.pack(side=tk.TOP, fill=tk.X) - -topmenu = tk.Menu(root) -filemenu = tk.Menu(topmenu, tearoff=False) -openmenu = tk.Menu(filemenu, tearoff=False) -openmenu.add_command(label="Open.sp", command=SPP_calculat, accelerator='Ctrl+S') -openmenu.add_command(label="Open.po", command=PO_openfile, accelerator='Ctrl+P') -filemenu.add_cascade(label="Open...", menu=openmenu) -filemenu.add_command(label="Clear", command=Clear_canvas) -filemenu.add_command(label="View", command=View_windows) -filemenu.add_command(label="Exit", command=root.quit, accelerator='Ctrl+E') -topmenu.add_cascade(label="File", menu=filemenu) - -optmenu = tk.Menu(topmenu, tearoff=False) -optmenu.add_cascade(label="Options...", command=Opt_windows) -topmenu.add_cascade(label="Options", menu=optmenu) - -helpmenu = tk.Menu(topmenu, tearoff=False) -helpmenu.add_command(label="About", command=Abo_windows) -topmenu.add_cascade(label="Help", menu=helpmenu) - -root.config(menu=topmenu) - -frmFigure0 = tk.Frame(root) -frmFigure0.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - -frmFigure1 = tk.Frame(root) -frmFigure1.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) - -plt.rc('font',family='Segoe UI') -fig, (ex, nx, ux) = plt.subplots(3, 1, figsize=(10, 0) ,sharex=True) -fig.subplots_adjust(left=0.06, bottom=0.115, right=0.97, top=0.95) -canvas0 = FigureCanvasTkAgg(fig,frmFigure0) -canvas0.draw() -canvas0.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.BOTH,expand=tk.YES) - -toolbar = NavigationToolbar2Tk(canvas0,frmFigure0,pack_toolbar=False) -toolbar.update() -toolbar.pack(side=tk.LEFT) - -plt.rc('font',family='Segoe UI') -fig, (satn) = plt.subplots(1, 1, figsize=(10, 0) ,sharex=True) -fig.subplots_adjust(left=0.06, bottom=0.115, right=0.97, top=0.95) -canvas1 = FigureCanvasTkAgg(fig,frmFigure1) -canvas1.draw() -canvas1.get_tk_widget().pack(side=tk.BOTTOM,fill=tk.BOTH,expand=tk.YES) - -toolbar = NavigationToolbar2Tk(canvas1,frmFigure1,pack_toolbar=False) -toolbar.update() -toolbar.pack(side=tk.LEFT) - -Drawcards.add(frmFigure0, text='ENU-draw') -Drawcards.add(frmFigure1, text='Sat num') -Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') - -root.protocol("WM_DELETE_WINDOW", root.quit) - -root.mainloop() \ No newline at end of file diff --git a/plot/Trocor.py b/plot/Trocor.py deleted file mode 100644 index ceb86ff..0000000 --- a/plot/Trocor.py +++ /dev/null @@ -1,24 +0,0 @@ -##Tro correct-Hopfield -import math -def def_tro_cor(H, ma): - P0 = 1013.25 - e0 = 11.69 - T0 = 288.15 - - p = P0 * pow((1.0 - 0.0068 / T0 / H) , 5) - - T = 288.15 - 0.0068 * H - - if H > 11000: - e = 0 - if H <= 11000: - e = e0 * pow( (1.0 - 0.0068 * H / T0) , 4) - - deltaSd = 0.00001552 * p * (40136 + 148.72 * (T - 273.16) - H) / T - deltaSw = 0.0746512 * e * (11000 - H) / pow(T , 2) - #Dry - dtropd = deltaSd / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) - #Wet - dtropw = deltaSw / math.sqrt( math.sin( math.radians( math.degrees( pow(math.radians(ma) , 2) ) + 6.25) ) ) - dtrop = dtropw + dtropd - return dtrop \ No newline at end of file diff --git a/resouce/Delete.ico b/resouce/Delete.ico deleted file mode 100644 index f1c99ab14e6fd3b9664a5d79df1def421a40545a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6782 zcmeH|K@Ng25Jih?)`qyzB}>ZwL-L9mvpB4Jj$4vm$e~ff;Db^_UU@`%w@raB7`0vsc$TzM6}fP zQxt{fPDw}iJ-T2(0`}ujF-*y~n$9^v)@LT+gs diff --git a/resouce/Main.ico b/resouce/Main.ico deleted file mode 100644 index 5cd789f3837e395a7d539389060f8f8071d8a974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc(iOK4qH6o%J1xvfczHa;Q7Bscfg5UW_6L{y};Iw;gfMVtr@6bFt(RK$T0v{l53 z4-ip79BGS+FL0p6DxzF<;0y6FlU^{@iG%uR)EvM6bpPS>a+BO#3ZC#~t-beJ=U@AA zPEH~+e(Lq$s>i<3h_mr#%T~m8ETjD9Vr+8LF^+Zo|G(??dJfcIe*_M|8}Rljyvf+R z@DzmUcP8Xp{{#F2{z+DTH~vli-(X{EYAR&=y~rIga~X755$lWXZ~3 zcNvxZQ}H*$G<*-z@LZQt`!IGZDDE@}Q2n)J)n2BTVyf}@UW?c8rSHA4{W!&E)6>(@ zY&J_$UtqPDiQ{zH=qdxhrL(g(RdB1hk zP}WS|FdPDDx(?5EHT!4E(fJ8jul{llx!PlC`RuKxtFgrtFKzE*wvM?6dBS_}4t}rt z)_#Q?X=@$5mOYg~e1Nqt#P__trz_3h+WUDXm2Y&vl3of(v3idv=RT00pTCu~UE|BV zhc(~6v{fIu!u$3r{#tAA+V&CKRlCw3_`-2+OS-%&;~M(}R@3*If0ous*xL{EoVqb|l8J zzkzc1q`n_g`#@^v9r~XC6)Dd5t!k@A?RCIO;5q8dsGUK;a{pF=?PtX!M=mgjGMeOEB%8g#bxF6gGMxGW*xYoasI2G9LE{D5y$-yy8m zDwD1+`lEvG?e=lc_So2%`(=k<3NC{uK;MU6w`cJK?g7{HSn4b1Xl>gx7RgHYIPKK$ z+D2)A3VKeg>Ax4xr&!hHy;#6MC-s;2ux{0+@#tn1N59v47Qd=1?XTc^2$1%#;F@m1 z5Agn0WqbD1J<9s=cfo^jE6hO5&CLb&F3_{%`X0s)7?_-#lr6tqdlsz(>VJ+Zx>q{4 z=i=W9-+}hq+7ICeEYDl*elKz}<%6D!=io>933Lvm>-9d2e zeu;8BuYzlPwhay@dvfvU;7i5M7@BWItyqYBUbG`G+L6gGTCo9!8?Crzs1>K**2)JP zt$d`h5Vb}-J2P)@+_~eI;oUoqJRN(FY{_biH|N8}(UG%?rFyeij9u_daWvmrEZuSN EKVdb6l>h($ diff --git a/resouce/Options.ico b/resouce/Options.ico deleted file mode 100644 index 41c80d447b350a8f72e0e13968df1b1e9e2920b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmc(i&2EiR6o$WY8crKgq!@k^i6JusgGO9H8}7mw7hzI&U|`UMa1EX6NQ8OQ5Tp!@ z#NY8gXMaz-9fxY2woBf<*IqyG+JE16+B8%7*S1ZhZC2)*=4`Z!!%@>Lq>ndkB)%(~ z1;wzZb}Cs%$7Eu|x8HK4E6`7Wx&u0*uZ$+!y0&AXT@Ky{A3LDm5AY$zmeFKd_ng{; z;9J+%IzGhMGTMF1{Cgb_y6c&Zz7bgSM|9v^@XZ8>dCUbaIq>~WIKw&?eY#6Hlm0_M zed^NJIzD0$az=S}x*x`$O74wdDL5G@*Q3<+tY6!RQOJb@E;tcul+kwU+%CoRI*@xk z`kfB%I(xl#6-qaKg5>8FPSF7&m48c4kl z+HS>8obl-2gRdQ|1t)g=#yD4EjIU$lqy}P5=fU`8AfMc$ea-nP@xYkcr_Ej;HR{^d z=icUZ9&))(bM57Lnz*aMdEO5>$d`r@GK|&{aJfA?+<%9srSeF?BT0!y{^@@*M04q#QU3) zTi^3x{QpD!dJonzX1&~j`VGV88}5EE9%s`}4~O>&Zr>?u#x#_1-vIgR!CroUkVCF> z;qB#pN32yw+pTlrx6;jEDVW6XFSy`DtWie4x6G}MK|iS9pU#Gwye9zN`OHS&2s~HM z-+O{@^!Ino6Zf9Qd&A!t*7t0!j}I}nj3(2%2Z#0dm#gsZ)_;Gx=lYD@kDh%Px4+oj zqkpbDcz$m%cz9tjSndz;w(XsJ(e~C>+TMH)v)|?pf`xpupzXE22gm287iSh{R{G2H W0392?t+*}^4!Gci+d9LVsr?grug%E- diff --git a/resouce/Plot.ico b/resouce/Plot.ico deleted file mode 100644 index 126e7315e245e476cb3a7b0b68f070728d4b7187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmcInJ!=$E6n!&0o5Vy#q7ku>)kYyj5WymTWE(MmAlMlM6$`EGg0Rs>3yT$_Y5WRA z5kXT06pJ*12CO0~qNO0Q&?caXn>^2X`_B3t5N3DBk>kBH@7;6H+Bg|!73LRS(MZUM8veP9eY40Hhoh=78(ymwG+9u}OB0Sl~p zy9WCSxD4z7n3Eb}@8_xkoSndHfErc+<|lan1GofqBypo2dFLnJ2*7+bZ&{09!Tk&P zTLA85Px2_epm&$Q?4Lh}b?;7_*99*1^_kD38Zf`0XZx6&F*)W>Jm+8rx0KGkF*DHIvQ8aC7Xcd)2eAIG2jtMZAA!$&`Zg=K ztTa5pbdcw-UNoa2+zTFZsTOD9Ghg~_rZwD1#gQYV&E$Iy7Ykn+uEA$My{~f1N?XOp zC!7H9XUZFHQXDLMp;@>KpZWf!LFe`)_As}4*lr!1hR%9_ZwDImZBz|-Pw=~O6i8`k z?)wx+QKNp~q6YQiDtzW-&C?q6&H9G5et;Z`3rn2IkL%|_I>K{t9=z1Re9Eahs1NV3 z)(bFRJ#v-PkpZBd?o(Er7@j1I4&tC%45YB|^a@@yCx8rC_L;al!34RWNo4-l!cn!>{ znUEI#d$t$g-j?T4dOeT&!QP7V9DKcV+P=Zs1|Q2g5?xEy^GHKDmxr(x&ID_q*|_K9 zoZgla2SKT`K`rWUAN;3)W`g}tJx;)PdjqPrT+gRk@ZC@kH|t~YH4FM~f5)?3jLGvN zUjWX8YB31^Bfwhx^p^kc%QL;>B4>bbCf4KmO@JD7CPs1>;0Xf_)Wd%0d>n*74^YSZ z|COJ-;13bjf?7s_nRvijGYRxqJHEM&GW>FP#g@C~Y`J&TmUa$UQ<}8H<2`oD6zvDo zYir}{Dz$P_SuMqLYt?Af4x1S}ZI0OmQ?QGs-!6^!*=5sh*Q$xN!@zWG?R;eI(nV`m L%GTDZ77M=tYJp3; diff --git a/resouce/Reload.ico b/resouce/Reload.ico deleted file mode 100644 index 7105b554b17502de8d993d70a5d7afd33655eda5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6782 zcmeHKJugI26ui%OqM$%Qu?oc|8kIyP`~h1lNK_J`Awk4f6r$5fG`8YrsQe0vR-!<$ zVy)e`X5O7E{(!U1Ih)xz_uQMz?7ZEVw;^PBmCFG&8P>-`7(>S;Q2{c{y*vR=z!UHU zJONL@6EIGIk0e{bwZOgvu(~6ezh_e11AhW-AQ#wk#ywV7B(wMA?E;GQ(g5y&Re}8% zz&)O^tmJJ0qSU94B^h8&DJ#yBN1nB+q<;%R`a6_xAGinT1^P8R0`m;dS{A)L0n{#@ z+`-8=+TWggJj1h=H3YFYpazUeI9>Mv&6wo~@B#3wWl{SPU^dedW~Qudfb$Ii|Ava5 zXOn-lCRK$BeVj{;xv>ra&NqP_^;NKS%|Vbpc+Xq;BhKFo=MTWE`dM%%DrH4KH!^Sn z=DIHC{g1z$LBO)o_h}8H^m8TgGp)bH&*FXUTT;5GOhB|G;axEOz5u+w?^<`lAEdoJ z0Z+ga@B};oPrwtfO`y$!tqc)ChuKgJb9Xy6QNU=S=tO?q|Oiyu+zmRj=yaQ@3tae@zHu z`rEN1sBDIxJ`3TK5W-eLU13I`zb#urc)Dw>jo8ssIi}GK0sXe*ZTVOs!T`a?r0|jO zVMV|eHXWPXpSlMU^Ijz@-wQW{`@$pP-->`OY-0PUfG@=GOFoUlRQ><)5<*J(ai<;TeuHnE-i!Z%_rvDLlw z_(=`DC**P2oTm4imrHrKEo?jX_`EB?0Wqi8>Rfs(@qH+mKlQa~Dn1$4E5_6ODe1Gq z*Qt$SPm2EFfS6NkbuK-Y9LepG?`7?=KJwO}ZSLQyPE33ccn#zdKJs|M0Wqi8>Rftk zG5*-@W)GepEMcC0WUl}}?#d^renuKuihtR7MGLX)mp>fMbDQel3CDy30{8hhg1Ns` z-S_>J>InH$jQ_Csn>TmLCBeC2&Hea1^~2lT*$)eQTL*vd*LwNCEjY&9B~Jz4DRB0B z7-Q}}7j^M>?0*p_c){24rS0|P+&RMt+`axf_?tU#*Ws7P_)oP@2-gL#0nKaS=K{j~ zI{Evx{h)Zj&AIZ2>b{3os{U8u`F^z#=8ppZ&_paJD*?nz84UiI?u27NHhi(+Zty6+vmXKWx%$E%^$zc zAM&AB)R{lT9sfSR@9+P3{<**Wx{<#=ILC-vH}P2V0UNegyg&2jeogY&PTFI0esCIQ z{^M`d^M`m8<4?>H_NeOfi|u0mzyWbi#8&6hWApqVA6QHA`}5A0x;fK6;WPWZ$((og)E=X145^;-g57m}`ucW%eF@r6&s9Ac~Y z((_kqD!KHxa9?;NlzFdTW(>BliEVt~3$gFm>c7N}ZLyc!OFnl#hl6NrVbgh%`%`x% zf^E*UeNGaL2A5cQrApEtw#_Veag?4Pzi8QZ&er~cIT^X7`!Z@p){-EK72#QxVj oqCfr8FoU1vw07Ws^A^|9+x*79`P|NOadI3Nrc+!~oE`W70GsP;_5c6? diff --git a/resource.h b/resource.h deleted file mode 100644 index fa90d33..0000000 --- a/resource.h +++ /dev/null @@ -1,19 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ Éú³ɵİüº¬Îļþ¡£ -// ¹© SPP_calculate.rc ʹÓà -// -#define IDI_ICON1 101 -#define IDI_ICON2 102 -#define IDI_ICON3 103 -#define IDI_ICON4 105 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 106 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/dllmain.cpp b/src/dllmain.cpp new file mode 100644 index 0000000..ede8a43 --- /dev/null +++ b/src/dllmain.cpp @@ -0,0 +1,1416 @@ +/* + * @Author: KenanZhu111 3471685733@qq.com + * @Date: 2024-09-20 21:47:22 + * @LastEditors: KenanZhu111 3471685733@qq.com + * @LastEditTime: 2024-10-26 10:13:40 +*/ +#include "pch.h" +#include +#include +#include +using namespace std; +/* -------------------------------------------------------------------------- */ +/// @brief Convert UTC to GPS Second of week +/// @param y Year +/// @param m Month +/// @param d Day +/// @param h Hour +/// @param min Minute +/// @param sec Second +/// @return Return GPS Second of week +/* -------------------------------------------------------------------------- */ +double Time2GPST(int y, int m, int d, double h, int min, double sec) +{ + if (m > 2){ + y = y; + m = m; + } + if (m <= 2){ + y = y - 1; + m = m + 12; + } + h = h + min / 60.0 + sec / 3600.0; + double JD = (int)(365.25 * y) + (int)(30.6001 * (m + 1)) + d + h / 24.0 + 1720981.5; + double MJD = JD - 2400000.5; + int gpsweek = (int)((MJD - 44244) / 7); + double secofweek = (MJD - 44244.0 - gpsweek * 7.0) * 86400.0; + return secofweek; +} +double JDUTC2GPST(double JD_UTCSU) +{ + double n;//Leap second + + if (2451179.5000000 < JD_UTCSU && JD_UTCSU < 2453736.5000000) { n = 32.0; } + else if (2453736.5000000 < JD_UTCSU && JD_UTCSU < 2454832.5000000) { n = 33.0; } + else if (2454832.5000000 < JD_UTCSU && JD_UTCSU < 2455927.5000000) { n = 34.0; } + else if (2455927.5000000 < JD_UTCSU && JD_UTCSU < 2457023.5000000) { n = 35.0; } + else if (2457023.5000000 < JD_UTCSU && JD_UTCSU < 2457754.5000000) { n = 36.0; } + else if (2457754.5000000 < JD_UTCSU) { n = 37.0; } + + JD_UTCSU += ((n * 1 - 19) / 3600.0) / 24.0; + double MJD = JD_UTCSU - 2400000.5; + int gpsweek = (int)((MJD - 44244) / 7); + double secofweek = (MJD - 44244.0 - gpsweek * 7.0) * 86400.0; + return secofweek; +} +double UTCTime2JD(int y, int m, int d, double h, int min, double sec) +{ + if (m > 2){ + y = y; + m = m; + } + if (m <= 2){ + y = y - 1; + m = m + 12; + } + h = h + min / 60.0 + sec / 3600.0; + double JD = (int)(365.25 * y) + (int)(30.6001 * (m + 1)) + d + h / 24.0 + 1720981.5; + return JD; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Degree to radian +/// @param deg +/// @return Return radian +/* -------------------------------------------------------------------------- */ +double deg2rad(double deg) +{ + double rad = (PI / 180) * deg; + return rad; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Radian to degree +/// @param rad +/// @return Return degree +/* -------------------------------------------------------------------------- */ +double rad2deg(double rad) +{ + double deg = (180 / PI) * rad; + return deg; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Satellite azimuth angle calculation +/// @param rahcal Parameter transfer structure +/// @param E East +/// @param N North +/// @param U Up +/// @return Return structure contain R, A, H members +/* -------------------------------------------------------------------------- */ +rahcal RAHCAL(rahcal rahcal, + double E, double N, double U) +{ + rahcal.H = atan2(U, sqrt(E * E + N * N)); + rahcal.A = atan2(E, U); + if (rahcal.A < 0) + rahcal.A += 2 * PI; + if (rahcal.A > 2 * PI) + rahcal.A -= 2 * PI; + rahcal.R = sqrt(E * E + N * N + U * U); + + return rahcal; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Convert BLH coordinates to ENU coordinates +/// @param blh2enu Parameter transfer structure +/// @param stationB Latitude of receiver station +/// @param stationL Longitude of receiver station +/// @param deltax X-coordinate difference of satellite arrival center +/// @param deltay Y-coordinate difference of satellite arrival center +/// @param deltaz Z-coordinate difference of satellite arrival center +/// @return Return type of structure contain E, N, U members +/* -------------------------------------------------------------------------- */ +blh2enu BLH2ENU(blh2enu blh2enu, + double stationB, double stationL, + double deltax, double deltay, double deltaz) +{ + double sinB = sin(stationB); + double cosB = cos(stationB); + double sinL = sin(stationL); + double cosL = cos(stationL); + blh2enu.E = -sinL * (deltax)+cosL * (deltay); + blh2enu.N = -sinB * cosL * (deltax)-sinB * sinL * (deltay)+cosB * (deltaz); + blh2enu.U = cosB * cosL * (deltax)+cosB * sinL * (deltay)+sinB * (deltaz); + + return blh2enu; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Convert ECEF geostationary coordinates to BLH coordinates +/// @param xyz2blh parameter transfer structure +/// @param X X coordinates of ECEF +/// @param Y Y coordinates of ECEF +/// @param Z Z coordinates of ECEF +/// @param a Major semiaxis of WGS-84 ellipsoid +/// @param e2 The square of the first eccentricity of WGS-84 ellipsoid +/// @return Return type of structure contain B, L, H members +/* -------------------------------------------------------------------------- */ +xyz2blh XYZ2BLH(xyz2blh xyz2blh, + double X, double Y, double Z) +{ + double B = 0.0, N = 0.0, H = 0.0, R0, R1, deltaH, deltaB; + R0 = sqrt(pow(X, 2) + pow(Y, 2)); + R1 = sqrt(pow(X, 2) + pow(Y, 2) + pow(Z, 2)); + xyz2blh.L = atan2(Y, X); + N = a; + H = R1 - a; + B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); + do{ + deltaH = N; + deltaB = B; + N = a / sqrt(1 - e2 * pow(sin(B), 2)); + H = R0 / cos(B) - N; + B = atan2(Z * (N + H), R0 * (N * (1 - e2) + H)); + } while (fabs(deltaH - H) > 1.0e-3 && fabs(deltaB - B) > 1.0e-9); + xyz2blh.B = B; + xyz2blh.H = H; + + return xyz2blh; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Find the nearest obs epoch with boardcast +/// @param SecofWeek Second of week of obs epoch time +/// @param sPRN The satellite PRN which need to match +/// @param nav_b Nav data file structure +/// @param satnum Total number of boardcast satellite +/// @param syscode GNSS code, more on PPUBLIC.H +/// @return Return the absolute epoch number of the best epoch +/// When there is no matching satellite number, the function returns -1 +/* -------------------------------------------------------------------------- */ +int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int satnum, int syscode) +{ + int best_epoch = -1; + double min = 10000;//Initialize the minimum value + double Min; + if (syscode == GPS){ //Be judged as GPS + for (int i = 0; i < satnum; i++){ + if (sPRN == nav_b[i].sPRN_GPS){ + Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min){ + best_epoch = i; + min = Min; + } + } + }return best_epoch; + } + if (syscode == BDS){ //Be judged as BeiDou + for (int i = 0; i < satnum; i++){ + if (sPRN == nav_b[i].sPRN_BDS){ + Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min){ + best_epoch = i; + min = Min; + } + } + }return best_epoch; + } + if (syscode == GAL){ //Be judged as Galileo + for (int i = 0; i < satnum; i++){ + if (sPRN == nav_b[i].sPRN_GAL){ + Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min){ + best_epoch = i; + min = Min; + } + } + }return best_epoch; + } + if (syscode == GLO){ //Be judged as GLONASS + for (int i = 0; i < satnum; i++){ + if (sPRN == nav_b[i].sPRN_GLO){ + Min = fabs(SecofWeek - nav_b[i].TOE); + if (Min <= min){ + best_epoch = i; + min = Min; + } + } + }return best_epoch; + }return best_epoch; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Converts the observation type to the numeric code defined in PUBLIC.H +/// @param i Reads the number of incoming loops in the loop +/// @param buff Type of incoming observation +/// @return Returns the obs code +/* -------------------------------------------------------------------------- */ +int Type2Code(int i, char buff[1000]) +{ + int code_return = 0; + char code_contrast[4]; + char code_original[4]; + + const char L1codeindex[] = "C1AC1BC1CC1DC1LC1MC1PC1SC1XC1YC1Z";//obs type of different frequency + const char L2codeindex[] = "C2CC2DC2IC2LC2MC2PC2QC2SC2XC2YC2Z"; + const char L3codeindex[] = "C3IC3QC3X"; + const char L4codeindex[] = "C5IC5QC5X"; + const char L5codeindex[] = "C5IC5QC5X"; + const char L6codeindex[] = "C6AC6BC6CC6XC6Z"; + const char L7codeindex[] = "C7IC7QC7XC7DC7PC7Z"; + const char L8codeindex[] = "C8IC8QC8X"; + + memset(code_contrast, 0, sizeof(code_contrast)); + memset(code_original, 0, sizeof(code_original)); + + strncpy(code_original, buff + 7 + 4 * i, 3); + + if (strstr(code_original, "1")){ + for (int j = 0; j < (strlen(L1codeindex) / 3); j++){ + strncpy(code_contrast, L1codeindex + 0 + j * 3, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 100; + return code_return; + break; + } + } + } + if (strstr(code_original, "2")){ + for (int j = 0; j < (strlen(L2codeindex) / 3); j++){ + strncpy(code_contrast, L2codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 200; + return code_return; + break; + } + } + } + if (strstr(code_original, "3")){ + for (int j = 0; j < (strlen(L3codeindex) / 3); j++){ + strncpy(code_contrast, L3codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 500; + return code_return; + break; + } + } + } + if (strstr(code_original, "4")){ + for (int j = 0; j < (strlen(L3codeindex) / 3); j++){ + strncpy(code_contrast, L3codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 500; + return code_return; + break; + } + } + } + if (strstr(code_original, "5")){ + for (int j = 0; j < (strlen(L5codeindex) / 3); j++){ + strncpy(code_contrast, L5codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 500; + return code_return; + break; + } + } + } + if (strstr(code_original, "6")){ + for (int j = 0; j < (strlen(L6codeindex) / 3); j++){ + strncpy(code_contrast, L6codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 600; + return code_return; + break; + } + } + } + if (strstr(code_original, "7")){ + for (int j = 0; j < (strlen(L7codeindex) / 3); j++){ + strncpy(code_contrast, L7codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 700; + return code_return; + break; + } + } + } + if (strstr(code_original, "8")){ + for (int j = 0; j < (strlen(L8codeindex) / 3); j++){ + strncpy(code_contrast, L8codeindex + 0 + j * 3, 3); + strncpy(code_original, buff + 7 + 4 * i, 3); + if (strcmp(code_contrast, code_original) == 0){ + code_return = j + 800; + return code_return; + break; + } + } + }return code_return; +} + +/* -------------------------------------------------------------------------- */ +/// @brief The type of the obs value read matches the type code stored in an array +/// @param typecode Obs type that you want to match +/// @param typenum The total number of obs types +/// @param typearr Type codes store arrays +/// @return Returns the array position of the corresponding obs type code +/* -------------------------------------------------------------------------- */ +int Code2Type(int typecode, int typenum, int typearr[36]) +{ + int pos; + for (pos = 0; pos < typenum; pos++) { + if ((typearr[pos] - typearr[pos] % 100) == typecode) { + return pos; + } + }return pos; +} + +/*Allocate the memory of observation structure*/ +void initobs_e(pobs_epoch obs_e, pobs_body obs_b) +{ + obs_e = (pobs_epoch)malloc(sizeof(obs_epoch)); + obs_b = (pobs_body)malloc(sizeof(obs_body)); +} + +/*Free the memory of observation structure*/ +void freeobs_e(pobs_epoch obs_e, pobs_body obs_b) +{ + free(obs_e); free(obs_b); +} + +/* -------------------------------------------------------------------------- */ +/// @brief Convert the string to number +/// @param buff +/// @param i Position of begin to read +/// @param n The number of character will to capture +/// @return Number of string you captured +/* -------------------------------------------------------------------------- */ +double strtonum(const char* buff, int i, int n) +{ + double value = 0.0; + char str[256] = { 0 }; + char* p = str; + /* ---------------------------------- */ + /// Function will return 0.0 as error code when three occasion are below: + /// 1.Begining position < 0 + /// 2.The number of Byte of read < i + /// 3.The Byte size of string < n + /* ---------------------------------- */ + if (i < 0 || (int)strlen(buff) < i || (int)sizeof(str) - 1 < n){ + return 0.0; + } + for (buff += i; *buff && --n >= 0; buff++){ + *p++ = ((*buff == 'D' || *buff == 'd') ? 'e' : *buff); + } + *p = '\0'; + return sscanf(str, "%lf", &value) == 1 ? value : 0.0; +} + +/* -------------------------- Read the file of nav -------------------------- */ +/* -------------------------------------------------------------------------- */ +/// @brief get the total number of satellite boardcast data of nav file +/// @param fp_nav the file pointer of nav file +/// @return total number of satellite boardcast data +/* -------------------------------------------------------------------------- */ +int getsatnum(FILE* fp_nav) +{ + int satnum = 0; + int flag = 0; + char buff[MAXRINEX]; + char satvar; + char* lable = buff + 60; + + while (fgets(buff, MAXRINEX, fp_nav)){ + if (strstr(lable, "END OF HEADER")){ + flag = 1; + } + if (flag == 1){ + while (fgets(buff, MAXRINEX, fp_nav)){ + strncpy(&satvar, buff + 0, 1); + if (satvar == 'G' || satvar == 'E' || satvar == 'R' || satvar == 'S' || satvar == 'C' || satvar == 'I' || satvar == 'J'){ + satnum++; + } + else{ + continue; + } + } + } + }return satnum; +} + +/*Read the header data of file of nav*/ +void read_n_h(FILE* fp_nav, pnav_head nav_h) +{ + char buff[MAXRINEX] = { 0 }; + char* lable = buff; + int i = 0; + int j = 0; + while (fgets(buff, MAXRINEX, fp_nav)){ + if (strstr(lable, "RINEX VERSION / TYPE")){ + nav_h->ver = strtonum(buff, 0, 9); + strncpy((nav_h->type), buff + 20, 15); + continue; + } + else if (strstr(lable, "GPSA")){ + nav_h->ION_GPSA[0] = strtonum(buff, 6, 12); + nav_h->ION_GPSA[1] = strtonum(buff, 6 + 12, 12); + nav_h->ION_GPSA[2] = strtonum(buff, 6 + 12 + 12, 12); + nav_h->ION_GPSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); + continue; + } + else if (strstr(lable, "GPSB")){ + nav_h->ION_GPSB[0] = strtonum(buff, 6, 12); + nav_h->ION_GPSB[1] = strtonum(buff, 6 + 12, 12); + nav_h->ION_GPSB[2] = strtonum(buff, 6 + 12 + 12, 12); + nav_h->ION_GPSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); + continue; + } + else if (strstr(lable, "BDSA")){ + nav_h->ION_BDSA[0] = strtonum(buff, 6, 12); + nav_h->ION_BDSA[1] = strtonum(buff, 6 + 12, 12); + nav_h->ION_BDSA[2] = strtonum(buff, 6 + 12 + 12, 12); + nav_h->ION_BDSA[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); + continue; + } + else if (strstr(lable, "BDSB")){ + nav_h->ION_BDSB[0] = strtonum(buff, 6, 12); + nav_h->ION_BDSB[1] = strtonum(buff, 6 + 12, 12); + nav_h->ION_BDSB[2] = strtonum(buff, 6 + 12 + 12, 12); + nav_h->ION_BDSB[3] = strtonum(buff, 6 + 12 + 12 + 12, 12); + continue; + } + else if (strstr(lable, "BDUT")){ + nav_h->BDUT[0] = strtonum(buff, 5, 17); + nav_h->BDUT[1] = strtonum(buff, 5 + 17, 16); + nav_h->BDUT[2] = strtonum(buff, 5 + 17 + 16, 7); + nav_h->BDUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); + continue; + } + else if (strstr(lable, "GPUT")){ + nav_h->GPUT[0] = strtonum(buff, 5, 17); + nav_h->GPUT[1] = strtonum(buff, 5 + 17, 16); + nav_h->GPUT[2] = strtonum(buff, 5 + 17 + 16, 7); + nav_h->GPUT[3] = strtonum(buff, 5 + 17 + 16 + 7, 5); + continue; + } + else if (strstr(lable, "LEAP SECONDS")){ + nav_h->leap = (int)strtonum(buff, 4, 2); + } + else if (strstr(lable, "END OF HEADER")) + break; + } +} + +/*Read the body data of file of nav*/ +void read_n_b(FILE* fp_nav, pnav_body nav_b) +{ + int i_g = 0; + char buff[MAXRINEX] = { 0 }; + char flag = { 0 }; + while (fgets(buff, MAXRINEX, fp_nav)){ + int j_g = 0; + int j_c = 0; + int j_ga = 0; + int j_gl = 0; + strncpy(&flag, buff + 0, 1); + //GPS SATELLITE + if (flag == 'G'){ + for (j_g = 0; j_g < 8; j_g++){ + switch (j_g){ + case 0: + nav_b[i_g].sPRN_BDS = -1; + nav_b[i_g].sPRN_GAL = -1; + nav_b[i_g].sPRN_GPS = (int)strtonum(buff, 1, 2); + nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); + nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); + nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); + nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); + nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); + nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); + nav_b[i_g].sa0 = strtonum(buff, 23, 19); + nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); + nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 1: + nav_b[i_g].IODE = strtonum(buff, 4, 19); + nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); + nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 2: + nav_b[i_g].Cuc = strtonum(buff, 4, 19); + nav_b[i_g].e = strtonum(buff, 4 + 19, 19); + nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 3: + nav_b[i_g].TOE = strtonum(buff, 4, 19); + nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); + nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 4: + nav_b[i_g].i0 = strtonum(buff, 4, 19); + nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); + nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 5: + nav_b[i_g].IDOT = strtonum(buff, 4, 19); + nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); + nav_b[i_g].GPSweek = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 6: + nav_b[i_g].sACC = strtonum(buff, 4, 19); + nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); + nav_b[i_g].TGD = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].IODC = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 7: + nav_b[i_g].TTN = strtonum(buff, 4, 19); + nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + break; + } + } + i_g++; + continue; + } + //BDS SATELLITE + if (flag == 'C'){ + for (j_c = 0; j_c < 8; j_c++){ + switch (j_c){ + case 0: + nav_b[i_g].sPRN_GPS = -1; + nav_b[i_g].sPRN_GAL = -1; + nav_b[i_g].sPRN_BDS = (int)strtonum(buff, 1, 2); + nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); + nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); + nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); + nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); + nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); + nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); + nav_b[i_g].sa0 = strtonum(buff, 23, 19); + nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); + nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 1: + nav_b[i_g].AODE = strtonum(buff, 4, 19); + nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); + nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 2: + nav_b[i_g].Cuc = strtonum(buff, 4, 19); + nav_b[i_g].e = strtonum(buff, 4 + 19, 19); + nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 3: + nav_b[i_g].TOE = strtonum(buff, 4, 19); + nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); + nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 4: + nav_b[i_g].i0 = strtonum(buff, 4, 19); + nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); + nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 5: + nav_b[i_g].IDOT = strtonum(buff, 4, 19); + //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); + nav_b[i_g].BDTweek = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 6: + nav_b[i_g].sACC = strtonum(buff, 4, 19); + nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); + nav_b[i_g].TGD1 = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].TGD2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 7: + //nav_b[i_g].TTN = strtonum(buff, 4, 19); + nav_b[i_g].AODC = strtonum(buff, 4 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + break; + } + } + i_g++; + continue; + } + //GAL SATELLITE + if (flag == 'E'){ + for (j_ga = 0; j_ga < 8; j_ga++){ + switch (j_ga){ + case 0: + nav_b[i_g].sPRN_BDS = -1; + nav_b[i_g].sPRN_GPS = -1; + nav_b[i_g].sPRN_GAL = (int)strtonum(buff, 1, 2); + nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); + nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); + nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); + nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); + nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); + nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); + nav_b[i_g].sa0 = strtonum(buff, 23, 19); + nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); + nav_b[i_g].sa2 = strtonum(buff, 23 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 1: + nav_b[i_g].IODE = strtonum(buff, 4, 19); + nav_b[i_g].Crs = strtonum(buff, 4 + 19, 19); + nav_b[i_g].deltan = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].M0 = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 2: + nav_b[i_g].Cuc = strtonum(buff, 4, 19); + nav_b[i_g].e = strtonum(buff, 4 + 19, 19); + nav_b[i_g].Cus = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].sqrtA = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 3: + nav_b[i_g].TOE = strtonum(buff, 4, 19); + nav_b[i_g].Cic = strtonum(buff, 4 + 19, 19); + nav_b[i_g].OMEGA = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].Cis = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 4: + nav_b[i_g].i0 = strtonum(buff, 4, 19); + nav_b[i_g].Crc = strtonum(buff, 4 + 19, 19); + nav_b[i_g].omega = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].deltaomega = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 5: + nav_b[i_g].IDOT = strtonum(buff, 4, 19); + //nav_b[i_g].L2code = strtonum(buff, 4 + 19, 19); + nav_b[i_g].GALweek = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].L2Pflag = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 6: + nav_b[i_g].sACC = strtonum(buff, 4, 19); + nav_b[i_g].sHEA = strtonum(buff, 4 + 19, 19); + nav_b[i_g].BGDa = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].BGDb = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 7: + //nav_b[i_g].TTN = strtonum(buff, 4, 19); + //nav_b[i_g].fit = strtonum(buff, 4 + 19, 19); + //nav_b[i_g].spare1 = strtonum(buff, 4 + 19 + 19, 19); + //nav_b[i_g].spare2 = strtonum(buff, 4 + 19 + 19 + 19, 19); + break; + } + } + i_g++; + continue; + } + //GLO SATELLITE + if (flag == 'R'){ + for (j_gl = 0; j_gl < 4; j_gl++){ + switch (j_gl){ + case 0: + nav_b[i_g].sPRN_BDS = -1; + nav_b[i_g].sPRN_GPS = -1; + nav_b[i_g].sPRN_GAL = -1; + nav_b[i_g].sPRN_GLO = (int)strtonum(buff, 1, 2); + nav_b[i_g].TOC_Y = (int)strtonum(buff, 4, 4); + nav_b[i_g].TOC_M = (int)strtonum(buff, 9, 2); + nav_b[i_g].TOC_D = (int)strtonum(buff, 12, 2); + nav_b[i_g].TOC_H = (int)strtonum(buff, 15, 2); + nav_b[i_g].TOC_Min = (int)strtonum(buff, 18, 2); + nav_b[i_g].TOC_Sec = strtonum(buff, 21, 2); + nav_b[i_g].sa0 = strtonum(buff, 23, 19); + nav_b[i_g].sa1 = strtonum(buff, 23 + 19, 19); + nav_b[i_g].Dos = strtonum(buff, 23 + 19 + 19, 19); + + nav_b[i_g].TOE = JDUTC2GPST( + UTCTime2JD(nav_b[i_g].TOC_Y, nav_b[i_g].TOC_M, nav_b[i_g].TOC_D, + nav_b[i_g].TOC_H, nav_b[i_g].TOC_Min, nav_b[i_g].TOC_Sec) + ); + fgets(buff, MAXRINEX, fp_nav); + break; + case 1: + nav_b[i_g].SatX = strtonum(buff, 4, 19); + nav_b[i_g].SatXv = strtonum(buff, 4 + 19, 19); + nav_b[i_g].SatXa = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].sHEA = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 2: + nav_b[i_g].SatY = strtonum(buff, 4, 19); + nav_b[i_g].SatYv = strtonum(buff, 4 + 19, 19); + nav_b[i_g].SatYa = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].FreN = strtonum(buff, 4 + 19 + 19 + 19, 19); + fgets(buff, MAXRINEX, fp_nav); + break; + case 3: + nav_b[i_g].SatZ = strtonum(buff, 4, 19); + nav_b[i_g].SatZv = strtonum(buff, 4 + 19, 19); + nav_b[i_g].SatZa = strtonum(buff, 4 + 19 + 19, 19); + nav_b[i_g].AOO = strtonum(buff, 4 + 19 + 19 + 19, 19); + break; + } + } + i_g++; + continue; + } + } +} + +/* -------------------------- Read the file of obs -------------------------- */ +/* -------------------------------------------------------------------------- */ +/// @brief get the total number of epoch of obs +/// @param fp_obs the file pointer of obs +/// @return epoch number +/* -------------------------------------------------------------------------- */ +int get_epochnum(FILE* fp_obs) +{ + int n = 0; + int satnum = 0; + char flag; + char buff[MAXRINEX]; + while (fgets(buff, MAXRINEX, fp_obs)){ + satnum = (int)strtonum(buff, 33, 2); + strncpy(&flag, buff + 0, 1); + if (flag == '>'){ + n++; + } + } + return n; +} + +/*Read the header data of file of obs*/ +void read_o_h(FILE* fp_obs, pobs_head obs_h) +{ + char buff[MAXRINEX] = { 0 }; + char flag = { 0 }; + char* lable = buff + 60; + int i = 0; + int j = 0; + + obs_h->interval = 30; + obs_h->f_y = obs_h->f_m = obs_h->f_d = obs_h->f_h = obs_h->f_min = obs_h->f_sec = 0; + obs_h->l_y = obs_h->l_m = obs_h->l_d = obs_h->l_h = obs_h->l_min = obs_h->l_sec = 0; + + while (fgets(buff, MAXRINEX, fp_obs)){ + if (strstr(lable, "RINEX VERSION / TYPE")){ + obs_h->ver = strtonum(buff, 0, 9); + strncpy(obs_h->type, buff + 20, 30); + continue; + } + else if (strstr(lable, "APPROX POSITION XYZ")){ + obs_h->apX = strtonum(buff, 0, 14); + obs_h->apY = strtonum(buff, 0 + 14, 14); + obs_h->apZ = strtonum(buff, 0 + 14 + 14, 14); + continue; + } + else if (strstr(lable, "ANTENNA: DELTA H/E/N")){ + obs_h->ANTH = strtonum(buff, 0, 14); + obs_h->ANTdeltaE = strtonum(buff, 14, 14); + obs_h->ANTdeltaN = strtonum(buff, 14 + 14, 14); + continue; + } + else if (strstr(lable, "SYS / # / OBS TYPES")){ + char flag = { 0 }; + strncpy(&flag, buff + 0, 1); + if (flag == 'G'){ + obs_h->obstypenum_gps = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_gps <= 13){ + for (i = 0; i < obs_h->obstypenum_gps; i++){ + obs_h->obscode_gps[i + 1] = Type2Code(i, buff); + } + } + else if (obs_h->obstypenum_gps > 13){ + for (i = 0; i < 13; i++){ + obs_h->obscode_gps[i] = Type2Code(i, buff); + } + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_gps - 13; i++){ + obs_h->obscode_gps[i + 13] = Type2Code(i, buff); + } + }continue; + } + else if (flag == 'C'){ + obs_h->obstypenum_bds = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_bds <= 13){ + for (i = 0; i < obs_h->obstypenum_bds; i++){ + obs_h->obscode_bds[i] = Type2Code(i, buff); + } + } + else if (obs_h->obstypenum_bds > 13){ + for (i = 0; i < 13; i++){ + obs_h->obscode_bds[i] = Type2Code(i, buff); + } + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_bds - 13; i++){ + obs_h->obscode_bds[i + 13] = Type2Code(i, buff); + } + }continue; + } + else if (flag == 'E'){ + obs_h->obstypenum_gal = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_gal <= 13){ + for (i = 0; i < obs_h->obstypenum_gal; i++){ + obs_h->obscode_gal[i] = Type2Code(i, buff); + } + } + else if (obs_h->obstypenum_gal > 13){ + for (i = 0; i < 13; i++){ + obs_h->obscode_gal[i] = Type2Code(i, buff); + } + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_gal - 13; i++){ + obs_h->obscode_gal[i + 13] = Type2Code(i, buff); + } + }continue; + } + else if (flag == 'R'){ + obs_h->obstypenum_glo = (int)strtonum(buff, 4, 2); + if (obs_h->obstypenum_glo <= 13){ + for (i = 0; i < obs_h->obstypenum_glo; i++){ + obs_h->obscode_glo[i] = Type2Code(i, buff); + } + } + else if (obs_h->obstypenum_glo > 13){ + for (i = 0; i < 13; i++){ + obs_h->obscode_glo[i] = Type2Code(i, buff); + } + fgets(buff, MAXRINEX, fp_obs); + for (i = 0; i < obs_h->obstypenum_glo - 13; i++){ + obs_h->obscode_glo[i + 13] = Type2Code(i, buff); + } + }continue; + }continue; + } + else if (strstr(lable, "INTERVAL")){ + obs_h->interval = strtonum(buff, 0, 10); + continue; + } + else if (strstr(lable, "TIME OF FIRST OBS")){ + obs_h->f_y = (int)strtonum(buff, 2, 4); + obs_h->f_m = (int)strtonum(buff, 2 + 6, 4); + obs_h->f_d = (int)strtonum(buff, 2 + 6 + 6, 4); + obs_h->f_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); + obs_h->f_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); + obs_h->f_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); + strncpy(obs_h->tsys, buff + 6 + 6 + 6 + 6 + 6 + 18, 3); + continue; + } + else if (strstr(lable, "TIME OF LAST OBS")){ + obs_h->l_y = (int)strtonum(buff, 2, 4); + obs_h->l_m = (int)strtonum(buff, 2 + 6, 4); + obs_h->l_d = (int)strtonum(buff, 2 + 6 + 6, 4); + obs_h->l_h = (int)strtonum(buff, 2 + 6 + 6 + 6, 4); + obs_h->l_min = (int)strtonum(buff, 2 + 6 + 6 + 6 + 6, 4); + obs_h->l_sec = strtonum(buff, 2 + 6 + 6 + 6 + 6 + 6, 9); + continue; + } + else if (strstr(lable, "END OF HEADER")){ + break; + } + } +} + +/*Read the body data of file of obs*/ +void read_o_eb(FILE* fp_obs, pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b) +{ + initobs_e(obs_e, obs_b); + char buff[MAXRINEX] = { 0 }; + char flag = { 0 }; + while (fgets(buff, MAXRINEX, fp_obs)) { + strncpy(&flag, buff + 0, 1); + if (flag == '>') { + int j_g = 0; int k_g = 0; + int j_c = 0; int k_c = 0; + int j_ga = 0; int k_ga = 0; + int j_gl = 0; int k_gl = 0; + + obs_e->gps_num = 0; + obs_e->bds_num = 0; + obs_e->gal_num = 0; + obs_e->glo_num = 0; + + obs_e->y = (int)strtonum(buff, 2, 4); + obs_e->m = (int)strtonum(buff, 7, 2); + obs_e->d = (int)strtonum(buff, 10, 2); + obs_e->h = (int)strtonum(buff, 13, 2); + obs_e->min = (int)strtonum(buff, 16, 2); + obs_e->sec = strtonum(buff, 19, 10); + obs_e->p_flag = (int)strtonum(buff, 31, 1); + obs_e->sat_num = strtonum(buff, 33, 3); + strncpy(&flag, buff + 0, 1); + + memset(obs_e->sPRN, 0, sizeof(obs_e->sPRN)); + memset(obs_e->sPRN_GPS, 0, sizeof(obs_e->sPRN_GPS)); + memset(obs_e->sPRN_BDS, 0, sizeof(obs_e->sPRN_BDS)); + memset(obs_e->sPRN_GAL, 0, sizeof(obs_e->sPRN_GAL)); + memset(obs_e->sPRN_GLO, 0, sizeof(obs_e->sPRN_GLO)); + memset(obs_b->obs_gps, 0, sizeof(obs_b->obs_gps)); + memset(obs_b->obs_bds, 0, sizeof(obs_b->obs_bds)); + memset(obs_b->obs_gal, 0, sizeof(obs_b->obs_gal)); + memset(obs_b->obs_glo, 0, sizeof(obs_b->obs_glo)); + + for (int i = 0; i < obs_e->sat_num; i++) { + if (flag == 'G') { + obs_e->sPRN[i] = strtonum(buff, 1, 2); + obs_e->sPRN_GPS[j_g] = obs_e->sPRN[i]; + for (k_g = 0; k_g < obs_h->obstypenum_gps; k_g++) { + obs_b->obs_gps[j_g][k_g] = strtonum(buff, 3 + 16 * k_g, 14); + } + obs_e->gps_num++; j_g++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + else if (flag == 'C') { + obs_e->sPRN[i] = strtonum(buff, 1, 2); + obs_e->sPRN_BDS[j_c] = obs_e->sPRN[i]; + for (k_c = 0; k_c < obs_h->obstypenum_bds; k_c++) { + obs_b->obs_bds[j_c][k_c] = strtonum(buff, 3 + 16 * k_c, 14); + } + obs_e->bds_num++; j_c++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + else if (flag == 'E') { + obs_e->sPRN[i] = strtonum(buff, 1, 2); + obs_e->sPRN_GAL[j_ga] = obs_e->sPRN[i]; + for (k_ga = 0; k_ga < obs_h->obstypenum_gal; k_ga++) { + obs_b->obs_gal[j_ga][k_ga] = strtonum(buff, 3 + 16 * k_ga, 14); + } + obs_e->gal_num++; j_ga++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + else if (flag == 'R') { + obs_e->sPRN[i] = strtonum(buff, 1, 2); + obs_e->sPRN_GLO[j_gl] = obs_e->sPRN[i]; + for (k_gl = 0; k_gl < obs_h->obstypenum_glo; k_gl++) { + obs_b->obs_glo[j_gl][k_gl] = strtonum(buff, 3 + 16 * k_gl, 14); + } + obs_e->glo_num++; j_gl++; + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + else { + fgets(buff, MAXRINEX, fp_obs); + strncpy(&flag, buff + 0, 1); + } + } + }break; + } +} + +/*Obatain the intergral term of acceleraction of each component*/ +void pz90deq(double X[6], double K[6], double acc[3]) +{ + double r = sqrt(pow(X[0], 2) + pow(X[1], 2) + pow(X[2], 2)); + double coef0 = -GM / pow(r, 3); + double coef1 = 1.5 * C20 * (GM * pow(a, 2) / pow(r, 5)); + + K[0] = X[3]; K[1] = X[4]; K[2] = X[5]; + K[3] = + coef0 * X[0] + + coef1 * (1 - 5 * pow((X[2] / r), 2)) * X[0] + + pow(Earth_e, 2) * X[0] + + 2 * Earth_e * X[4] + + acc[0]; + K[4] = + coef0 * X[1] + + coef1 * (1 - 5 * pow((X[2] / r), 2)) * X[1] + + pow(Earth_e, 2) * X[1] - + 2 * Earth_e * X[3] + + acc[1]; + K[5] = + coef0 * X[2] + + coef1 * (3 - 5 * pow((X[2] / r), 2)) * X[2] + + acc[2]; +} + +/*Construct the RK-4 method*/ +void pz90pos(double tstep, double X[6], double acc[3]) +{ + double K1[6], K2[6], K3[6], K4[6], W[6]; + + pz90deq(X, K1, acc); for (int i = 0; i < 6; i++) W[i] = X[i] + K1[i] * tstep / 2.0; + pz90deq(W, K2, acc); for (int i = 0; i < 6; i++) W[i] = X[i] + K2[i] * tstep / 2.0; + pz90deq(W, K3, acc); for (int i = 0; i < 6; i++) W[i] = X[i] + K3[i] * tstep; + pz90deq(W, K4, acc); + for (int i = 0; i < 6; i++) X[i] += (K1[i] + 2.0 * K2[i] + 2.0 * K3[i] + K4[i]) * tstep / 6.0; +} + +/*Calculate the satellite position of GLONASS on this epoch*/ +pos_ts glo_pos(int best_epoch, double Weeksec, + pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) +{ + double X[6], acc[3]; double R = 0.0; + double tdist = Weeksec - pos_t.delta_t - nav_b[best_epoch].TOE, tstep = 0.0; + pos_t.delta_clk = -nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tdist; + + X[0] = nav_b[best_epoch].SatX * 1e3; + X[1] = nav_b[best_epoch].SatY * 1e3; + X[2] = nav_b[best_epoch].SatZ * 1e3;//Position + + X[3] = nav_b[best_epoch].SatXv * 1e3; + X[4] = nav_b[best_epoch].SatYv * 1e3; + X[5] = nav_b[best_epoch].SatZv * 1e3;//Velocity + + acc[0] = nav_b[best_epoch].SatXa * 1e3; + acc[1] = nav_b[best_epoch].SatYa * 1e3; + acc[2] = nav_b[best_epoch].SatZa * 1e3;//Acclerate + + for (tstep = tdist < 0.0 ? TSTEP : -TSTEP; fabs(tdist) > 1.0e-9; tdist += tstep) { + if (fabs(tdist) < TSTEP) tstep = -tdist; + pz90pos(tstep, X, acc); + } + + X[0] = -0.47 + (X[0] * 1 + X[1] * 1.728e-6 + X[2] * -0.017e-6) * (1 + 22e-9); + X[1] = -0.51 + (X[0] * 1.728e-6 + X[1] * 1 + X[2] * -0.076e-6) * (1 + 22e-9); + X[2] = -1.56 + (X[0] * 0.0178e-6 + X[1] * -0.076e-6 + X[2] * 1) * (1 + 22e-9);//PZ90 Convert to WGS-84 + + pos_t.X = X[0]; + pos_t.Y = X[1]; + pos_t.Z = X[2]; + + R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); + pos_t.deltat = pos_t.delta_t; + pos_t.delta_t = R / C_V + pos_t.delta_clk; + + return pos_t; +} + +/*Calculate the satellite position of other systems on this epoch*/ +pos_ts sat_pos(int sPRN, int best_epoch, double Weeksec, int gnsscode, + pnav_body nav_b, pobs_head obs_h, pos_ts pos_t) +{ + double T_S = Weeksec - pos_t.delta_t; + double n_0 = sqrt(GM) / pow(nav_b[best_epoch].sqrtA, 3); + double n = n_0 + nav_b[best_epoch].deltan; + double tk; + if (gnsscode == BDS) tk = T_S - nav_b[best_epoch].TOE - 14; + else tk = T_S - nav_b[best_epoch].TOE; + + if (tk > 32400)tk -= 604800; + else if (tk < -32400)tk += 604800; + + double Ms = nav_b[best_epoch].M0 + n * tk; + + double Es = Ms, E0; + do + { + E0 = Es; + Es = Ms + nav_b[best_epoch].e * sin(Es); + } while (fabs(Es - E0) > 1.0e-10); + + double cosfs = (cos(Es) - nav_b[best_epoch].e) / (1 - nav_b[best_epoch].e * cos(Es)); + double sinfs = (sqrt(1 - pow(nav_b[best_epoch].e, 2)) * sin(Es)) / (1 - nav_b[best_epoch].e * cos(Es)); + double fs = atan2(sinfs, cosfs); + double u0 = fs + nav_b[best_epoch].omega; + + double epsilon_u = nav_b[best_epoch].Cus * sin(2 * u0) + nav_b[best_epoch].Cuc * cos(2 * u0); + double epsilon_r = nav_b[best_epoch].Crs * sin(2 * u0) + nav_b[best_epoch].Crc * cos(2 * u0); + double epsilon_i = nav_b[best_epoch].Cis * sin(2 * u0) + nav_b[best_epoch].Cic * cos(2 * u0); + + double u = u0 + epsilon_u; + double r = pow(nav_b[best_epoch].sqrtA, 2) * (1 - nav_b[best_epoch].e * cos(Es)) + epsilon_r; + double i = nav_b[best_epoch].i0 + epsilon_i + nav_b[best_epoch].IDOT * tk; + + double x = r * cos(u); + double y = r * sin(u); + + double l, X, Y, Z; + if (gnsscode == BDS){ + if (sPRN > 5 && sPRN < 59) //BDS IGSO & MEO Satellites + { + l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; + X = x * cos(l) - y * cos(i) * sin(l); + Y = x * sin(l) + y * cos(i) * cos(l); + Z = y * sin(i); + } + else //BDS GEO Satellites + { + l = nav_b[best_epoch].OMEGA + nav_b[best_epoch].deltaomega * tk - Earth_e * nav_b[best_epoch].TOE; + X = x * cos(l) - y * cos(i) * sin(l); + Y = x * sin(l) + y * cos(i) * cos(l); + Z = y * sin(i); + + double f = deg2rad(-5); + double p = Earth_e * tk; + + X = X * cos(p) + Y * sin(p) * cos(f) + Z * sin(p) * sin(f); + Y = X * -sin(p) + Y * cos(p) * cos(f) + Z * cos(p) * sin(f); + Z = Y * -sin(f) + Z * cos(f); + } + } + else{ + l = nav_b[best_epoch].OMEGA + (nav_b[best_epoch].deltaomega - Earth_e) * tk - Earth_e * nav_b[best_epoch].TOE; + X = x * cos(l) - y * cos(i) * sin(l); + Y = x * sin(l) + y * cos(i) * cos(l); + Z = y * sin(i); + } + pos_t.X = cos(Earth_e * pos_t.delta_t) * X + sin(Earth_e * pos_t.delta_t) * Y; + pos_t.Y = -sin(Earth_e * pos_t.delta_t) * X + cos(Earth_e * pos_t.delta_t) * Y; + pos_t.Z = Z;//Correction of earth rotation + + double TGD; + if (gnsscode == GPS) TGD = nav_b[best_epoch].TGD; + else if (gnsscode == GAL) TGD = nav_b[best_epoch].BGDa; + else if (gnsscode == BDS) TGD = 0; + + double R = sqrt(pow(pos_t.X - obs_h->apX, 2) + pow(pos_t.Y - obs_h->apY, 2) + pow(pos_t.Z - obs_h->apZ, 2)); + double rela = 2 * sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es) / pow(C_V, 2);//Relativistic effect + pos_t.delta_clk = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk, 2) - rela - TGD; + pos_t.deltat = pos_t.delta_t; + pos_t.delta_t = R / C_V + pos_t.delta_clk; + + return pos_t; +} + +/* -------------------------------------------------------------------------- */ +/// @brief Calculate the position of satellite in the ECEF coordinate system by the broadcast ephemeris and epoch information +/// @param obs_h Observation header data +/// @param obs_e Observation epoch data +/// @param obs_b Observation data +/// @param nav_b Navigation data +/// @param res_file The file path of result file of satellite position +/// @param station Prior information about station location +/// @param gnsscode GNSS system code +/// @param satnum The total number of satellite of designated satellite system +/// @return 1 refer OK +/* -------------------------------------------------------------------------- */ +int sat_pos_cal(pobs_head obs_h, pobs_epoch obs_e, pobs_body obs_b, + pnav_body nav_b, + FILE* res_file, stations station, + int gnsscode, int satnum) +{ + //the beginning second of observation + double beginsec = Time2GPST(obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); + //the ending second of observation + double endinsec = Time2GPST(obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); + + blhs blh = { 0 }; blh2enu enu = { 0 }; + rahcal rah = { 0 }; pos_ts pos_t = { 0 }; + xyz2blh tem1 = { 0 }; blh2enu tem2 = { 0 }; rahcal tem3 = { 0 }; + + int y = obs_e->y; int m = obs_e->m; int d = obs_e->d; + double h = obs_e->h; int min = obs_e->min; double sec = obs_e->sec; + + double Weeksec = Time2GPST(y, m, d, h, min, sec); + int epochcount = round((Weeksec - beginsec) / obs_h->interval) + 1; + fprintf(res_file, "\n>%04d %04d %02d %02d %02d %02d %07.04f" + , epochcount, obs_e->y, obs_e->m, obs_e->d, obs_e->h, obs_e->min, obs_e->sec); + int sat_num = 0, sPRN = 0, SIGN = 0, PERS = 0; + double detat_toc; + //Check the GNSS and assign the satellite number + if (gnsscode == GPS)sat_num = obs_e->gps_num; + else if (gnsscode == GAL)sat_num = obs_e->gal_num; + else if (gnsscode == BDS)sat_num = obs_e->bds_num; + else if (gnsscode == GLO)sat_num = obs_e->glo_num; + + for (int j = 0; j < sat_num; j++) { + if (gnsscode == GPS) { + sPRN = obs_e->sPRN_GPS[j]; SIGN = GPS; + PERS = obs_b->obs_gps[j][Code2Type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)] / C_V; + } + else if (gnsscode == GAL) { + sPRN = obs_e->sPRN_GAL[j]; SIGN = GAL; + PERS = obs_b->obs_gal[j][Code2Type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)] / C_V; + } + else if (gnsscode == BDS) { + sPRN = obs_e->sPRN_BDS[j]; SIGN = BDS; + PERS = obs_b->obs_bds[j][Code2Type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)] / C_V; + } + else if (gnsscode == GLO) { + sPRN = obs_e->sPRN_GLO[j]; SIGN = GLO; + PERS = obs_b->obs_glo[j][Code2Type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)] / C_V; + } + + int best_epoch = select_epoch(Weeksec, sPRN, nav_b, satnum, SIGN); + if (best_epoch == -1)//when the sPRN is not exist function will return -1 + break; + if (SIGN == BDS) detat_toc = Weeksec - nav_b[best_epoch].TOE - 14; + else detat_toc = Weeksec - nav_b[best_epoch].TOE; + + //Iterative approximate propagation time + //Exclude GLONASS + if (SIGN == GLO) { + pos_t.delta_t = PERS - + station.delta_TR + + nav_b[best_epoch].sa0 + + nav_b[best_epoch].sa1 * detat_toc; + pos_t.deltat = 0.0; + + while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9){ + pos_t = glo_pos(best_epoch, Weeksec, nav_b, obs_h, pos_t); + } + } + else { + pos_t.delta_t = PERS - + station.delta_TR + + nav_b[best_epoch].sa0 + + nav_b[best_epoch].sa1 * detat_toc + + nav_b[best_epoch].sa2 * pow(detat_toc, 2); + pos_t.deltat = 0.0; + while (fabs(pos_t.delta_t - pos_t.deltat) > 1.0e-9) { + pos_t = sat_pos(sPRN, best_epoch, Weeksec, gnsscode, nav_b, obs_h, pos_t); + } + } + //Satellite blh position calculation + tem1 = XYZ2BLH(tem1, pos_t.X, pos_t.Y, pos_t.Z); + blh.B = rad2deg(tem1.B); + blh.L = rad2deg(tem1.L); + blh.H = tem1.H; + + double deltax = pos_t.X - obs_h->apX; + double deltay = pos_t.Y - obs_h->apY; + double deltaz = pos_t.Z - obs_h->apZ; + + tem2 = BLH2ENU(tem2, station.B, station.L, deltax, deltay, deltaz); + enu.E = tem2.E; + enu.N = tem2.N; + enu.U = tem2.U; + //Satellite elevation Angle calculation + tem3 = RAHCAL(tem3, enu.E, enu.N, enu.U); + rah.R = tem3.R; + rah.A = rad2deg(tem3.A); + rah.H = rad2deg(tem3.H); + if (blh.H < 0 || rah.H < 10 || nav_b[best_epoch].sHEA != 0) { + continue; + } + else { + if (SIGN == GPS) { + fprintf(res_file, "\nG %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b->obs_gps[j][Code2Type(C1, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , obs_b->obs_gps[j][Code2Type(C2, obs_h->obstypenum_gps, obs_h->obscode_gps)] + , rah.H, pos_t.delta_clk);//GPS satellite pos output + } + else if (SIGN == GAL) { + fprintf(res_file, "\nE %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b->obs_gal[j][Code2Type(C1, obs_h->obstypenum_gal, obs_h->obscode_gal)] + , obs_b->obs_gal[j][Code2Type(C6, obs_h->obstypenum_gal, obs_h->obscode_gal)] + , rah.H, pos_t.delta_clk);//Galileo satellite pos output + } + else if (SIGN == BDS) { + if (sPRN >= 19) { + fprintf(res_file, "\nCC%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b->obs_bds[j][Code2Type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , obs_b->obs_bds[j][Code2Type(C7, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , rah.H, pos_t.delta_clk);//BDS-3 satellite pos output + } + else { + fprintf(res_file, "\nCB%02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b->obs_bds[j][Code2Type(C2, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , obs_b->obs_bds[j][Code2Type(C7, obs_h->obstypenum_bds, obs_h->obscode_bds)] + , rah.H, pos_t.delta_clk);//BDS-2 satellite pos output + } + } + else if (SIGN == GLO) { + fprintf(res_file, "\nR %02d| %15.05f %15.05f %15.05f %15.05f %15.05f %15.05f %16.13f" + , sPRN, pos_t.X, pos_t.Y, pos_t.Z + , obs_b->obs_glo[j][Code2Type(C1, obs_h->obstypenum_glo, obs_h->obscode_glo)] + , obs_b->obs_glo[j][Code2Type(C2, obs_h->obstypenum_glo, obs_h->obscode_glo)] + , rah.H, pos_t.delta_clk);//Galileo satellite pos output + } + } + }return 1; +} +/* -------------------------------------------------------------------------- */ +/// @brief The entry function of full .dll package, +/// @param nav_path The RINEX navigation file's path +/// @param obs_path The RINEX observation file's path +/// @param res_path The Satellite output file's path +/// @param gnsscode The GNSS position you want to calculate +/// @return 0 refer complete solution; -1 refer fail to complete solution +/// @return > 0 refer partlt complete solution +/* -------------------------------------------------------------------------- */ +double Start(char nav_path[260], char obs_path[260], char res_path[260], int gnsscode) +{ + int satnum, epochunum, result = 0; + pos_ts pos_t = { 0 }; + xyz2blh tem2 = { 0 }; + stations station = { 0 }; + time_t gen_time; time(&gen_time); + + pnav_head nav_h = NULL; + pnav_body nav_b = NULL; + pobs_head obs_h = NULL; + pobs_body obs_b = NULL; + pobs_epoch obs_e = NULL; + + FILE* fp_nav = fopen(nav_path, "r"); + satnum = getsatnum(fp_nav); rewind(fp_nav); + nav_h = (pnav_head)malloc(sizeof(nav_head)); + nav_b = (pnav_body)malloc(sizeof(nav_body) * (satnum)); + if (nav_h && nav_b){ + read_n_h(fp_nav, nav_h); read_n_b(fp_nav, nav_b); + } + fclose(fp_nav); + + FILE* fp_obs = fopen(obs_path, "r"); + epochunum = get_epochnum(fp_obs); + rewind(fp_obs); + obs_h = (pobs_head)malloc(sizeof(obs_head)); + obs_e = (pobs_epoch)malloc(sizeof(obs_epoch)); + obs_b = (pobs_body)malloc(sizeof(obs_body)); + if (obs_h && obs_e && obs_b) { + read_o_h(fp_obs, obs_h); + + tem2 = XYZ2BLH(tem2, obs_h->apX, obs_h->apY, obs_h->apZ); + station.B = tem2.B; station.L = tem2.L; station.H = tem2.H; + //Out put the header of solution file + FILE* result_file_clear = fopen(res_path, "w"); + fclose(result_file_clear); + FILE* result_file = fopen(res_path, "a+"); + fprintf(result_file, "@ GENERATE PROGRAM : KNZ_GeoTrackLab ver1.5.1\n"); + fprintf(result_file, "@ GENERATE TYPE : Satellite Position\n"); + fprintf(result_file, "@ GENERATE TIME : %s", ctime(&gen_time)); + fprintf(result_file, "@ OBS FILE PATH : %s\n", obs_path); + fprintf(result_file, "@ NAV FILE PATH : %s\n", nav_path); + fprintf(result_file, "@ TIME OF FIRST OBS : %4d %02d %02d %02d %02d %07.4f\n" + , obs_h->f_y, obs_h->f_m, obs_h->f_d, obs_h->f_h, obs_h->f_min, obs_h->f_sec); + fprintf(result_file, "@ TIME OF LAST OBS : %4d %02d %02d %02d %02d %07.4f\n" + , obs_h->l_y, obs_h->l_m, obs_h->l_d, obs_h->l_h, obs_h->l_min, obs_h->l_sec); + fprintf(result_file, "@ APPROX POSITION XYZ: %13.04f%13.04f%13.04f\n@ APPROX POSITION BLH: %12.07f %12.07f %12.07f\n" + , obs_h->apX, obs_h->apY, obs_h->apZ + , station.B, station.L, station.H); + fprintf(result_file, "END OF HEADER\n"); + //Begin to calculate + for (int i = 0; i < epochunum; i++){ + read_o_eb(fp_obs, obs_h, obs_e, obs_b); + result += sat_pos_cal(obs_h, obs_e, obs_b, nav_b, + result_file, station, + gnsscode, satnum); + fprintf(result_file, "\n"); + } + freeobs_e(obs_e, obs_b); + fprintf(result_file, "\nEND"); + fclose(result_file); + return epochunum - result; + } +} diff --git a/src/framework.h b/src/framework.h new file mode 100644 index 0000000..80cbbc9 --- /dev/null +++ b/src/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容 +// Windows 头文件 +#include diff --git a/src/pch.cpp b/src/pch.cpp new file mode 100644 index 0000000..b6fb8f4 --- /dev/null +++ b/src/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: 与预编译标头对应的源文件 + +#include "pch.h" + +// 当使用预编译的头时,需要使用此源文件,编译才能成功。 diff --git a/src/pch.h b/src/pch.h new file mode 100644 index 0000000..9d1f456 --- /dev/null +++ b/src/pch.h @@ -0,0 +1,398 @@ +// pch.h: 这是预编译标头文件。 +// 下方列出的文件仅编译一次,提高了将来生成的生成性能。 +// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。 +// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。 +// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。 + +#ifndef PCH_H +#define PCH_H + +// 添加要在此处预编译的标头 +#include "framework.h" + +#endif +/* ------------------------------ CALCU CONST ------------------------------- */ +#define C_V 299792458 +#define GM 398600500000000 +#define math_e 2.718281828459 +#define PI 3.141592653589793 +#define Earth_e 7.2921151467e-5 +#define C20 1.0826257e-3 + +/* ------------------------------ WGS-84 CONST ------------------------------ */ +#define a 6378137.0 +#define e2 (0.0033528106647475*(2 - 0.0033528106647475)) +/* ------------------------------- PZ-90 CONST ------------------------------ */ +// +#define TSTEP 30.0 +/* ----------------------------- GNSS OBSERV TYPE --------------------------- */ +//frequency 1 +#define C1 100 +#define C1A 100 +#define C1B 101 +#define C1C 102 +#define C1D 103 +#define C1E +#define C1F +#define C1G +#define C1H +#define C1I +#define C1J +#define C1K +#define C1L 104 +#define C1M 105 +#define C1N +#define C1O +#define C1P 106 +#define C1Q +#define C1R +#define C1S 107 +#define C1T +#define C1U +#define C1V +#define C1W +#define C1X 108 +#define C1Y 109 +#define C1Z 110 + +//frequency 2 +#define C2 200 +#define C2A +#define C2B +#define C2C 200 +#define C2D 201 +#define C2E +#define C2F +#define C2G +#define C2H +#define C2I 202 +#define C2J +#define C2K +#define C2L 203 +#define C2M 204 +#define C2N +#define C2O +#define C2P 205 +#define C2Q 206 +#define C2R +#define C2S 207 +#define C2T +#define C2U +#define C2V +#define C2W +#define C2X 208 +#define C2Y 209 +#define C2Z 210 + +//frequency 3 +#define C3 300 +#define C3I 300 +#define C3Q 301 +#define C3X 302 + +//frequency 4 +#define C4 400 +#define C4A 400 +#define C4B 401 +#define C4X 402 + +//frequency 5 +#define C5 500 +#define C5A +#define C5B +#define C5C +#define C5D +#define C5E +#define C5F +#define C5G +#define C5H +#define C5I 500 +#define C5J +#define C5K +#define C5L +#define C5M +#define C5N +#define C5O +#define C5P +#define C5Q 501 +#define C5R +#define C5S +#define C5T +#define C5U +#define C5V +#define C5W +#define C5X 502 +#define C5Y +#define C5Z + +//frequency 6 +#define C6 600 +#define C6A 600 +#define C6B 601 +#define C6C 602 +#define C6D +#define C6E +#define C6F +#define C6G +#define C6H +#define C6I +#define C6J +#define C6K +#define C6L +#define C6M +#define C6N +#define C6O +#define C6P +#define C6Q +#define C6R +#define C6S +#define C6T +#define C6U +#define C6V +#define C6W +#define C6X 603 +#define C6Y +#define C6Z 604 + +//frequency 7 +#define C7 700 +#define C7A +#define C7B +#define C7C +#define C7D +#define C7E +#define C7F +#define C7G +#define C7H +#define C7I 700 +#define C7J +#define C7K +#define C7L +#define C7M +#define C7N +#define C7O +#define C7P +#define C7Q 701 +#define C7R +#define C7S +#define C7T +#define C7U +#define C7V +#define C7W +#define C7X 702 +#define C7Y +#define C7Z + +//frequency 8 +#define C8 800 +#define C8I 800 +#define C8Q 801 +#define C8X 802 + +/* ------------------------------- GNSS CODE -------------------------------- */ +#define GPS 01 +#define BDS 02 +#define GAL 03 +#define GLO 04 +#define SBAS 05 + +/* ------------------------------ FOR CALMOD.H ------------------------------ */ +#define MAXRINEX 1000 +#define DAYSEC 86400 + +//satellite position & clock bias structure +typedef struct +{ + double X; + double Y; + double Z; + double deltat; + double delta_t; + double delta_clk; +}pos_ts; +//receiver station position & clock bias structure +typedef struct +{ + double X; + double Y; + double Z; + double B; + double L; + double H; + double delta_TR; +}stations; +//longitude & latitude structure +typedef struct +{ + double B; + int B_d; + int B_m; + int B_s; + double L; + int L_d; + int L_m; + int L_s; + double H; +}blhs; +//satellite azimuth angle structure +typedef struct +{ + double R; + double A; + double H; +}rahcal; +//local Cartesian coordinates coordinate system structure +typedef struct +{ + double E; + double N; + double U; +}blh2enu; + +typedef struct +{ + double B; + double L; + double H; +}xyz2blh; +/* ------------------------------- FOR READ.H ------------------------------- */ +//header data of file of nav +typedef struct nav_head +{ + double ver;//rinex + char type[20]; + double ION_GPSA[4]; + double ION_GPSB[4]; + double ION_BDSA[4]; + double ION_BDSB[4]; + double ION_QZSA[4]; + double ION_QZSB[4]; + double ION_IRNA[4]; + double ION_IRNB[4]; + double GPUT[4]; + double GLUT[4]; + double GAUT[4]; + double BDUT[4]; + double QZUT[4]; + double IRUT[4]; + double SBUT[4]; + int leap; +}nav_head, * pnav_head; +//body data of file of nav: GPS BeiDou Galileo +typedef struct nav_body +{ + int sPRN_GPS; int sPRN_BDS; int sPRN_GAL; int sPRN_GLO; + int TOC_Y; + int TOC_M; + int TOC_D; + int TOC_H; + int TOC_Min; + int TOC_Sec; + double sa0; + double sa1; + double sa2; double Dos; + + double IODE; double AODE; double SatX; + double Crs; double SatXv; + double deltan; double SatXa; + double M0; + + double Cuc; double SatY; + double e; double SatYv; + double Cus; double SatYa; + double sqrtA; int FreN; + + double TOE; double SatZ; + double Cic; double SatZv; + double OMEGA; double SatZa; + double Cis; int AOO; + + double i0; + double Crc; + double omega; + double deltaomega; + + double IDOT; + double L2code; int Datasource; + double GPSweek; double BDTweek; double GALweek; + double L2Pflag; + + double sACC; + double sHEA; + double TGD; double TGD1; double BGDa; + double IODC; double TGD2; double BGDb; + + double TTN; + double fit; double AODC; + double spare1; + double spare2; + +}nav_body, * pnav_body; +//header data of file of obs +typedef struct obs_head +{ + double ver; + char type[30]; + double apX; + double apY; + double apZ; + double ANTH; + double ANTdeltaE; + double ANTdeltaN; + int obstypenum_gps; + int obstypenum_bds; + int obstypenum_gal; + int obstypenum_glo; + int obscode_gps[40]; + int obscode_bds[40]; + int obscode_gal[40]; + int obscode_glo[40]; + double interval; + int f_y; + int f_m; + int f_d; + int f_h; + int f_min; + double f_sec; + int l_y; + int l_m; + int l_d; + int l_h; + int l_min; + double l_sec; + char tsys[5];//time system +}obs_head, * pobs_head; +//epoch data of file of obs +typedef struct obs_epoch +{ + int y; + int m; + int d; + int h; + int min; + double sec;//epoch time + int p_flag;//epoch flag + int sat_num;//the total number of obsable sat + int gps_num;//the total gps sat + int bds_num;//the total bds sat + int gal_num;//the total galileo sat + int glo_num;//the total glonass sat + int sPRN[84];//total sprn of obs sat + int sPRN_GPS[32]; + int sPRN_BDS[60]; + int sPRN_GAL[30]; + int sPRN_GLO[24]; +}obs_epoch, * pobs_epoch; +//body data of file of obs +typedef struct obs_body +{ + double obs_gps[20][26];//GPS obs data + double obs_bds[30][26];//BDS obs data + double obs_gal[20][26];//GALILEO obs data + double obs_glo[20][26];//GLONASS obs data +}obs_body, * pobs_body; + +extern "C" _declspec(dllexport) double Start(char nav_path[260], char obs_path[260], char res_path[260], int gnsscode); + + +