diff --git a/Result_out/Station_Site_Solving.m b/Result_out/Station_Site_Solving.m index d644c2b..f4922c2 100644 --- a/Result_out/Station_Site_Solving.m +++ b/Result_out/Station_Site_Solving.m @@ -1,6 +1,6 @@ function [ENU] = Station_Site_Solving() % 打开坐标文件 -file=fopen('LLA_result.txt'); +file=fopen('111.sp'); sPRN = []; satX = []; satY = []; @@ -41,7 +41,8 @@ while ~feof(file) satnum = satnum + 1; P_t1(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 + 16 ,25 + 16 + 16 + 16 )); if P_t1(eponum, satnum) ~= 0 - sPRN(eponum, satnum) = str2double(extractBetween(line,2 ,3 )); + prnnum = str2double(extractBetween(line,2 ,3 )); + sPRN(eponum, prnnum) = str2double(extractBetween(line,2 ,3 )); satX(eponum, satnum) = str2double(extractBetween(line,11 ,25 )); satY(eponum, satnum) = str2double(extractBetween(line,11 + 16 ,25 + 16 )); satZ(eponum, satnum) = str2double(extractBetween(line,11 + 16 + 16 ,25 + 16 + 16 )); @@ -95,8 +96,30 @@ for i = 1:1:eponum B(j, 3) = -((satZ(i, j) - apZ) / R); B(j, 4) = 1; -% 简化的Hopfield模型 - dtrop = 2.47/sind(H(i, j))+0.0121; +% % 简化的Hopfield模型 +% dtrop = 2.47/sind(H(i, j))+0.0121; + +% % % % % % + P0 = 1013.25; e0 = 11.69; T0 = 288.15; +% 求大气压强 + p = P0 * (1.0 - 0.0068 / T0 / apH)^5; +% 求开尔文温度 + T = 288.15 - 0.0068 * apH; +% 水汽压计算 + if apH > 11000 + e = 0; + end + if apH <= 11000 + e = e0 * (1.0 - 0.0068 * apH / T0)^4; + end + deltaSd = 0.00001552 * p / T * (40136 + 148.72 * (T - 273.16) - apH); + deltaSw = 0.0746512 * e / T^2 * (11000 - apH); +% 对流层延迟干分量 + dtropd = deltaSd / sqrt(sind( rad2deg(deg2rad(H(i, j)) ^ 2) + 6.25 ) ); +% 对流层延迟湿分量 + dtropw = deltaSw / sqrt(sind( rad2deg(deg2rad(H(i, j)) ^ 2) + 6.25 ) ); + dtrop = 0.1 * dtropw + 0.9 * dtropd; +% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 理想化的Saastamoinen模型/对流层改正 % P0 = 1013.25; e0 = 11.69; T0 = 288.15; @@ -124,9 +147,6 @@ for i = 1:1:eponum P_t = P_t1(i, j); end l(j, 1) = P_t - R + C_V * Dt(i,j) - dtrop; - if H(i, j)<5 - H(i, j) = H(i, j); - end P(j, j) = sind(H(i, j))^2; end @@ -172,12 +192,12 @@ end %绘制结果图 figure("Position",[200, 700,1000,200],"Name", "East component deviation","NumberTitle","off") -bar(ENU(1,:))%E +plot(ENU(1,:));%E box off figure("Position",[200, 400,1000,200],"Name","North component deviation","NumberTitle","off") -bar(ENU(2,:))%N +plot(ENU(2,:));%N box off figure("Position",[200, 100,1000,200],"Name", "Up component deviation","NumberTitle","off") -bar(ENU(3,:))%U +plot(ENU(3,:));%U box off diff --git a/SPP_calculate.c b/SPP_calculate.c index 8fb24ca..fb33166 100644 --- a/SPP_calculate.c +++ b/SPP_calculate.c @@ -1,11 +1,3 @@ -/* - * @Author: KenanZhu111 3471685733@qq.com - * @Date: 2024-09-27 19:05:41 - * @LastEditors: KenanZhu111 3471685733@qq.com - * @LastEditTime: 2024-09-27 19:55:46 - * @FilePath: \Sat_Position_Solving_ver1.4.7\maingui.c - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ #include #include #include @@ -16,19 +8,47 @@ #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='*'\"") -#define FILEEXOP TEXT("All Files(*.*)\0*.*\0"\ - "Obs Files(*.o*)\0*.20o;*.21o;*.22o;*.23o;*.24o\0"\ - "Nav Files(*.p*)\0*.20p;*.21p;*.22p;*.23p;*.24p\0\0"); -#define FILEEXSV TEXT("All Files(*.*)\0*.*\0"\ - "Spos Files(*.sp*)\0*.sp\0\0"); +//FILE SELECT DIALOGS +#define FILEEXOP TEXT("Obs Files(*.o*)\0*.20o;*.21o;*.22o;*.23o;*.24o\0"\ + "All Files(*.*)\0*.*\0\0"); +#define FILEEXNP TEXT("Nav Files(*.p*)\0*.20p;*.21p;*.22p;*.23p;*.24p\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 NAVCLEAR 3307 +//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 + +HWND hwndb[13];//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 -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); FILE * fp_nav = NULL; FILE * fp_obs = NULL; @@ -39,19 +59,86 @@ pnav_body nav_b = NULL; pobs_head obs_h = NULL; pobs_epoch obs_e = NULL; pobs_body obs_b = NULL; + int o_epochnum = 0; int gps_satnum = 0; +int bds_satnum = 0; + + +/*INITIAL SETTINGS*/ +static int ionoption = 0; +static int trooption = 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); +} + +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_HREDRAW | CS_VREDRAW; + wndclass.style = CS_PARENTDC; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; - wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wndclass.lpszMenuName = NULL; @@ -59,11 +146,19 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ 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("SPP"), TEXT("SPP Calculate"), - WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, 650, 300, 0, @@ -73,8 +168,29 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ hInstance, NULL); - HFONT hFont = (HFONT)GetStockObject(SYSTEM_FIXED_FONT); - SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 1); + 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); + } ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); @@ -87,33 +203,6 @@ int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _ return msg.wParam; } -int FileSelectDialog(const wchar_t *path) -{ - 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 | OFN_SHOWHELP; - return GetOpenFileName(&ofn); -} - -int FileSaveDialog(const wchar_t* path) -{ - 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 | OFN_SHOWHELP; - return GetSaveFileName(&ofn); -} - LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ const wchar_t wobs_file[MAX_PATH] = { 0 }; @@ -121,156 +210,211 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ 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 }; - - HWND hwndopt; + char res_file[MAX_PATH] = { 0 };//BE COMPATIBLE WITH MSVC RECT rect; - TCHAR* SATSYS[5] = { TEXT("GPS"), TEXT("GLO"),TEXT("SBAS"), TEXT("BeiDou"), TEXT("Galileo") }; + HBITMAP Delico; + TCHAR* SATSYS[5] = { TEXT("GPS"),TEXT("GLO"),TEXT("BeiDou"),TEXT("Galileo"),TEXT("SBAS") }; static int cxchar, cychar; + switch (msg) { case WM_CREATE: cxchar = LOWORD(GetDialogBaseUnits()); - cychar = HIWORD(GetDialogBaseUnits()); + cychar = HIWORD(GetDialogBaseUnits());//GET THE SYS FONT SIZE GetWindowRect(hwnd, &rect); - MoveWindow(hwnd, rect.left, rect.bottom, 50 * cxchar, 15 * cychar, TRUE); + MoveWindow(hwnd, rect.left, rect.bottom, 50 * cxchar, 15 * cychar, TRUE);//REPAINT THE MAIN WINDOW - CreateWindow(TEXT("Button"), TEXT("Load Obs file"), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, + //CREATE THE BUTTONS + hwndb[0] = CreateWindow(TEXT("Button"), TEXT("Open Obs Data"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, cxchar, 5 * cychar, - 16 * cxchar, 2 * cychar, - hwnd, (HMENU)3301, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - CreateWindow(TEXT("Button"), TEXT("Load Nav file"), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, + 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, - 16 * cxchar, 2 * cychar, - hwnd, (HMENU)3302, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - CreateWindow(TEXT("Button"), TEXT("Sat-Position Calculate"), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, + 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)3303, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - CreateWindow(TEXT("Button"), TEXT("Options..."), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, + 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)3304, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - CreateWindow(TEXT("Button"), TEXT("Plot"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, + 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)3304, ((LPCREATESTRUCT)lParam)->hInstance, NULL); + hwnd, (HMENU)PLOBUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); for (int i = 0; i < 5; i++) { - CreateWindow(TEXT("Button"), SATSYS[i], WS_VISIBLE|WS_CHILD|BS_AUTOCHECKBOX, - (2 + 9 * i) * cxchar, 21 * cychar/2, - 8 * cxchar, 5 * cychar/3, + 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_BITMAP | BS_PUSHBUTTON, + 15 * cxchar, 5 * cychar, + 2 * cxchar, 2 * cychar, + hwnd, (HMENU)OBSCLEAR, ((LPCREATESTRUCT)lParam)->hInstance, NULL); + hwndb[12] = CreateWindow(TEXT("Button"), NULL, WS_VISIBLE | WS_CHILD | BS_BITMAP | BS_PUSHBUTTON, + 31 * cxchar, 5 * cychar, + 2 * cxchar, 2 * cychar, + hwnd, (HMENU)NAVCLEAR, ((LPCREATESTRUCT)lParam)->hInstance, NULL); - CreateWindow(TEXT("Button"), TEXT("GNSS"), WS_VISIBLE | WS_CHILD | BS_GROUPBOX, - cxchar, 19 * cychar/2, - 47 * cxchar, 6 * cychar/2, - hwnd, (HMENU)(1001), ((LPCREATESTRUCT)lParam)->hInstance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { - case 3301: - while(MessageBox(hwnd,TEXT("Please choose Obs file"),TEXT("NOTICE"),MB_ICONASTERISK|MB_YESNO) == IDYES) +/* -------------------------- LOAD OBS DATA BUTTON -------------------------- */ + case OBSBUTTON: + FileSelobsDialog(wobs_file); + wcstombs(obs_file, wobs_file, MAX_PATH); + fp_obs = fopen(obs_file, TEXT("r")); + if (fp_obs != NULL) { - FileSelectDialog(wobs_file); - wcstombs(obs_file, wobs_file, MAX_PATH); - fp_obs = fopen(obs_file, TEXT("r")); - if (fp_obs != NULL) + 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) { - 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); - read_o_b(fp_obs, obs_e, obs_b, obs_h->obstypenum_gps, obs_h->obstypenum_bds); - } - fclose(fp_obs); - if (o_epochnum > 0) - { - MessageBox(hwnd, TEXT("File of Obs load complete!"), TEXT("NOTICE"), MB_ICONASTERISK); - break; - } + read_o_h(fp_obs, obs_h); + read_o_b(fp_obs, obs_e, obs_b, obs_h->obstypenum_gps, obs_h->obstypenum_bds); } - else + fclose(fp_obs); + if (o_epochnum > 0) + { + MessageBox(hwnd, TEXT("File of Obs load complete!"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); break; + } } break; return 0; - case 3302: - while(MessageBox(hwnd,TEXT("Please choose Nav file"),TEXT("NOTICE"),MB_ICONASTERISK|MB_YESNO) == IDYES) +/* -------------------------- LOAD NAV DATA BUTTON -------------------------- */ + case NAVBUTTON: + FileSelnavDialog(wnav_file); + wcstombs(nav_file, wnav_file, MAX_PATH); + fp_nav = fopen(nav_file, TEXT("r")); + if (fp_nav != NULL) { - FileSelectDialog(wnav_file); - wcstombs(nav_file, wnav_file, MAX_PATH); - fp_nav = fopen(nav_file, TEXT("r")); - if (fp_nav != NULL) + gps_satnum = getgpssatnum(fp_nav); + rewind(fp_nav); + bds_satnum = getbdssatnum(fp_nav); + rewind(fp_nav); + nav_h = (pnav_head)malloc(sizeof(nav_head)); + nav_b = (pnav_body)malloc(sizeof(nav_body) * (gps_satnum + bds_satnum)); + if (nav_h && nav_b) { - gps_satnum = getgpssatnum(fp_nav); - rewind(fp_nav); - nav_h = (pnav_head)malloc(sizeof(nav_head)); - nav_b = (pnav_body)malloc(sizeof(nav_body) * gps_satnum * 2); - if (nav_h && nav_b) - { - read_n_h(fp_nav, nav_h); - read_n_b(fp_nav, nav_b); - } - fclose(fp_nav); - if (gps_satnum > 0) - { - MessageBox(hwnd, TEXT("File of Nav load complete!"), TEXT("NOTICE"), MB_ICONASTERISK); - break; - } + read_n_h(fp_nav, nav_h); + read_n_b(fp_nav, nav_b); } - else + fclose(fp_nav); + if (gps_satnum > 0) + { + MessageBox(hwnd, TEXT("File of Nav load complete!"), TEXT("NOTICE"), MB_ICONASTERISK | MB_OK); break; + } } break; return 0; - case 3303: - if (fp_obs == NULL || fp_nav == NULL) +/* ---------------------------- CALCAULATE BUTTON --------------------------- */ + case CALBUTTON: + if (fp_obs == NULL && fp_nav == NULL) { - MessageBox(hwnd, TEXT("No Data File!"), TEXT("WARNING"), MB_ICONERROR | MB_OK); + 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) { - while(1) + int ALLSTATE = 0x0000; + for (int i = 0; i < 5; i++){ALLSTATE += SendMessage(hwndb[i + 5], BM_GETCHECK, wParam, lParam);} + if (ALLSTATE == 0x0000) + { + while (1) + { + if (MessageBox(hwnd, TEXT("No GNSS is choosen\nPlease Retry"), TEXT("NOTICE"), MB_ICONERROR | MB_RETRYCANCEL) == IDRETRY) + { + break; + } + } + } + else { FileSaveDialog(wres_file); - if (wres_file == TEXT("")) + wcstombs(res_file, wres_file, MAX_PATH); + if (res_file[0] == '\0') { - break; + while (MessageBox(hwnd, TEXT("Failed to select a save path.\nThe data has been cleared!"), TEXT("WARNING"), MB_ICONWARNING | MB_OK) == IDOK) + { + break; + } } else { - wcstombs(res_file, wres_file, MAX_PATH); - sat_gps_pos_clac(result_file, nav_b, obs_e, obs_b, obs_h, o_epochnum, gps_satnum, res_file); - free(obs_h); free(obs_e); free(obs_b); free(nav_h); free(nav_b); - fp_nav = NULL; fp_obs = NULL; result_file = NULL; - break; + if (SendMessage(hwndb[5], BM_GETCHECK, wParam, lParam) == BST_CHECKED) + { + sat_gps_pos_clac(result_file, nav_b, obs_e, obs_b, obs_h, o_epochnum, gps_satnum, res_file); + } } - + 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; - case 3304: +/* ----------------------------- OPTIONS BUTTON ----------------------------- */ + case OPTBUTTON: + DestroyWindow(hwndopt); + hwndopt = CreateWindow(TEXT("OPT"), TEXT("Options"), WS_CAPTION | WS_SYSMENU, + 650, 300, + 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: + + break; + return 0; +/* ------------------------------- DEFAULT MSG ------------------------------ */ + default: + return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; case WM_CLOSE: - if(MessageBox(hwnd, TEXT("You're shutting the program"), TEXT("Confirm"), MB_YESNO | MB_ICONASTERISK) == IDYES ) + if(MessageBox(hwnd, TEXT("You're shutting the program"), TEXT("NOTICE"), MB_OKCANCEL | MB_ICONASTERISK) == IDOK ) DestroyWindow(hwnd); else return 0; @@ -279,4 +423,63 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ 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()); + GetWindowRect(hwndopt, &rect); + MoveWindow(hwndopt, rect.left, rect.bottom, 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/headers/cal_mod.h b/headers/cal_mod.h index 05b9a84..f15bf89 100644 --- a/headers/cal_mod.h +++ b/headers/cal_mod.h @@ -19,12 +19,12 @@ 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.deltat[sPRN];//计算信号发射时刻 + double T_S = GPSsec - pos_t.delta_t[sPRN];//计算信号发射时刻 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;//规划时间改正 + else if (tk < -32400)tk += 604800;//归化时间改正 double Ms = nav_b[best_epoch].M0 + n * tk;//计算卫星发射时卫星的平近角M double Es = Ms, E0;//迭代计算偏近点角 do @@ -51,14 +51,14 @@ pos_ts gps_pos(int sPRN, int best_epoch, double GPSsec, 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[sPRN] = cos(Earth_e * pos_t.delta_t[sPRN]) * X + sin(Earth_e * pos_t.delta_t[sPRN]) * Y; + pos_t.X[sPRN] = cos(Earth_e * pos_t.delta_t[sPRN]) * X + sin(Earth_e * pos_t.delta_t[sPRN]) * Y; pos_t.Y[sPRN] = -sin(Earth_e * pos_t.delta_t[sPRN]) * X + cos(Earth_e * pos_t.delta_t[sPRN]) * Y; pos_t.Z[sPRN] = Z; - double R = sqrt(pow(pos_t.X[sPRN] - obs_h->apX, 2) + pow(pos_t.Y[sPRN] - obs_h->apY, 2) + pow(pos_t.Z[sPRN] - obs_h->apY, 2)); + double R = sqrt(pow(pos_t.X[sPRN] - obs_h->apX, 2) + pow(pos_t.Y[sPRN] - obs_h->apY, 2) + pow(pos_t.Z[sPRN] - obs_h->apZ, 2)); pos_t.deltat[sPRN] = pos_t.delta_t[sPRN]; - pos_t.delta_t[sPRN] = R / C_V; double rela = 2*sqrt(GM) * nav_b[best_epoch].e * nav_b[best_epoch].sqrtA * sin(Es)/pow(C_V,2); pos_t.delta_clk[sPRN] = nav_b[best_epoch].sa0 + nav_b[best_epoch].sa1 * tk + nav_b[best_epoch].sa2 * pow(tk,2) - rela; + pos_t.delta_t[sPRN] = R / C_V + pos_t.delta_clk[sPRN]; return pos_t; } /* -------------------------------------------------------------------------- */ @@ -105,7 +105,7 @@ void sat_gps_pos_clac(FILE * result_file, //计算近似的信号传播时间,接收机钟差已初始化为0(伪距/光速-接收机钟差+卫星钟差) pos_t.delta_t[sPRN] = (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[sPRN] = 0.0;//判断收敛 - while (fabs(pos_t.delta_t[sPRN] - pos_t.deltat[sPRN]) > 0.00001){ + while (fabs(pos_t.delta_t[sPRN] - pos_t.deltat[sPRN]) > 1.0e-9){ pos_t = gps_pos(sPRN, best_epoch, GPSsec, nav_b, obs_h, pos_t); } @@ -139,9 +139,9 @@ void sat_gps_pos_clac(FILE * result_file, rah.A = rad2deg(tem4.A); rah.H = rad2deg(tem4.H); /* -------------------------------------------------------------------------- */ - if (blh.H < 0 ||nav_b[best_epoch].sHEA != 0) + if (blh.H < 0 || rah.H < 10 ||nav_b[best_epoch].sHEA != 0) { - break; + continue; } else { @@ -174,4 +174,4 @@ void sat_gps_pos_clac(FILE * result_file, fclose(result_file); } -#endif +#endif \ No newline at end of file diff --git a/headers/public.h b/headers/public.h index e8e7423..f18085d 100644 --- a/headers/public.h +++ b/headers/public.h @@ -109,9 +109,9 @@ typedef struct nav_head //导航数据结构体 typedef struct nav_body { - //数据块第一行内容: - int sPRN;//卫星PRN号 - //历元:TOC中卫星钟的参考时刻 + + int sPRN_GPS;//GPS卫星PRN + int sPRN_BDS;//GPS卫星PRN int TOC_Y;//年 int TOC_M;//月 int TOC_D;//日 @@ -122,43 +122,36 @@ typedef struct nav_body double sa1;//卫星钟偏 double sa2;//卫星钟漂 - //数据块第二行内容: double IODE;//数据、星历发布时间(数据期龄) double Crs;//轨道半径的正弦调和改正项的振幅(单位:m) double deltan;//卫星平均运动速率与计算值之差(rad/s) double M0;//参考时间的平近点角(rad) - //数据块第三行内容: double Cuc;//维度幅角的余弦调和改正项的振幅(rad) double e;//轨道偏心率 double Cus;//轨道幅角的正弦调和改正项的振幅(rad) double sqrtA;//长半轴平方根 - //数据块第四行内容: double TOE;//星历的参考时刻(GPS周内秒) double Cic;//轨道倾角的余弦调和改正项的振幅(rad) double OMEGA;//参考时刻的升交点赤经 double Cis;//维度倾角的正弦调和改正项的振幅(rad) - //数据块第五行内容: double i0;//参考时间的轨道倾角(rad) double Crc;//轨道平径的余弦调和改正项的振幅(m) double omega;//近地点角距 double deltaomega;//升交点赤经变化率(rad) - //数据块第六行内容: double IDOT;//近地点角距(rad/s) double L2code;//L2上的码 double GPSweek;//GPS周,于TOE一同表示 double L2Pflag;//L2,p码数据标记 - //数据块第七行内容 double sACC;//卫星精度 double sHEA;//卫星健康状态 double TGD;//sec double IODC;//钟的数据龄期 - //数据块第八行内容 double TTN;//电文发送时间 double fit;//拟合区间 double spare1;//空 @@ -220,4 +213,4 @@ typedef struct obs_body }obs_body,*pobs_body; /* -------------------------------------------------------------------------- */ -#endif +#endif \ No newline at end of file diff --git a/headers/read.h b/headers/read.h index 772e78b..dd69eb6 100644 --- a/headers/read.h +++ b/headers/read.h @@ -57,6 +57,8 @@ extern int get_epochnum(FILE* fp_obs) /* -------------------------------- 读取O文件数据头 -------------------------------- */ extern void read_o_h(FILE* fp_obs, pobs_head obs_h) { + memset(obs_h->obscode_gps, 0, sizeof(obs_h->obscode_gps)); + memset(obs_h->obscode_bds, 0, sizeof(obs_h->obscode_bds)); char buff[MAXRINEX] = { 0 }; char flag = { 0 }; char* lable = buff + 60; @@ -95,7 +97,7 @@ extern void read_o_h(FILE* fp_obs, pobs_head obs_h) { for (i = 0; i < obs_h->obstypenum_gps; i++) { - obs_h->obscode_gps[i] = Type2Code(i, buff); + obs_h->obscode_gps[i + 1] = Type2Code(i, buff); } } else if (obs_h->obstypenum_gps > 13) @@ -186,6 +188,12 @@ extern void read_o_b(FILE* fp_obs, pobs_epoch obs_e, pobs_body obs_b, int type_g //输入卫星数 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_b[n].obs_gps, 0, sizeof(obs_b[n].obs_gps)); + memset(obs_b[n].obs_bds, 0, sizeof(obs_b[n].obs_bds)); for (i = 0; i < obs_e[n].sat_num; i++) { @@ -246,6 +254,10 @@ int getgpssatnum(FILE* fp_nav) //wchar_t * fgets ( wchar_t * str, int num, FILE * stream ); while (fgets(buff, MAXRINEX, fp_nav)) { + if (strstr(lable, "END OF HEADER")) + { + flag = 1; + } if (flag == 1) { while (fgets(buff, MAXRINEX, fp_nav)) @@ -262,13 +274,43 @@ int getgpssatnum(FILE* fp_nav) } } } + } + return gps_satnum; +} +int getbdssatnum(FILE* fp_nav) +{ + int bds_satnum = 0; + int flag = 0; + char buff[MAXRINEX];//用来存放读取到的字符串 + char satvar; + char* lable = buff + 60; + //fgets函数,读取一行,当读取结束后返回NULL指针,格式如下: + //wchar_t * fgets ( wchar_t * str, int num, FILE * stream ); + 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 != 'C') + { + continue; + } + else if (satvar == 'C') + { + bds_satnum++; + break; + } + } + } } - return gps_satnum; + return bds_satnum; } /* -------------------------------- 读取N文件数据头 -------------------------------- */ @@ -347,23 +389,23 @@ void read_n_h(FILE* fp_nav, pnav_head nav_h) /* -------------------------------- 读取N文件数据块 -------------------------------- */ void read_n_b(FILE* fp_nav, pnav_body nav_b) { - int i_g = 0;//第i_g个GPS卫星数据 - int i_c = 0;//第i_c个BDS卫星数据 + int i_g = 0;//第i_g个卫星数据 char buff[84] = { 0 }; char flag = { 0 };//判断符号 while (fgets(buff, MAXRINEX, fp_nav)) { int j_g = 0;//数据块的第j_g行数据 - int j_c = 0;//数据块的第j_C行数据 + int j_c = 0;//数据块的第j_c行数据 strncpy(&flag, buff + 0, 1); if(flag == 'G') { - for (j_g = 0; j_g < 8; j_g++)//读取第i_g颗 GPS卫星广播星历("总共包含8行数据") 数据块的第j_g行数据 + for (j_g = 0; j_g < 8; j_g++)//读取总计第i_g颗 GPS卫星广播星历("总共包含8行数据") 数据块的第j_g行数据 { switch (j_g) { case 0: - nav_b[i_g].sPRN = (int)strtonum(buff, 1, 2); + nav_b[i_g].sPRN_BDS = 0; + 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); @@ -428,9 +470,77 @@ void read_n_b(FILE* fp_nav, pnav_body nav_b) i_g++; continue; } - else if(flag != 'G') + else if(flag == 'C') { - fgets(buff, MAXRINEX, fp_nav); + for (j_c = 0; j_c < 8; j_c++)//读取总计第i_g颗 BDS卫星广播星历("总共包含8行数据") 数据块的第j_c行数据 + { + switch (j_c) + { + case 0: + nav_b[i_g].sPRN_GPS = 0; + 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].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; } } diff --git a/headers/select_epo.h b/headers/select_epo.h index cf28302..e974cc4 100644 --- a/headers/select_epo.h +++ b/headers/select_epo.h @@ -21,7 +21,7 @@ extern int select_epoch(double SecofWeek, int sPRN, pnav_body nav_b, int gps_sat int i; for (i = 0; i < gps_satnum; i++) { - if (sPRN == nav_b[i].sPRN) + if (sPRN == nav_b[i].sPRN_GPS) { Min = fabs(SecofWeek - nav_b[i].TOE); if (Min <= min) diff --git a/headers/type2code.h b/headers/type2code.h index 5864813..ce3221d 100644 --- a/headers/type2code.h +++ b/headers/type2code.h @@ -46,9 +46,9 @@ int Type2Code(int i, char buff[1000]) int Code2Type(int typecode, int typenum, int typearr[36]) { int pos; - for(pos = 0; pos < typenum; pos++) + for (pos = 0; pos < typenum; pos++) { - if(typearr[pos] == typecode) + if (typearr[pos] == typecode) { break; }