📄 gn74w.c
字号:
#include"gn74w.h"
#define PI 3.14159265359
struct POINT {
int x;
int y;
}IPOINT;
VOID NEAR FillComboBox( HINSTANCE,HWND,WORD NEAR*,WORD,WORD);
BOOL FAR PASCAL _export DialogWndProc(HWND,UINT,UINT,LONG);
POINT CoordinateTransform(int ,int );
int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wndclass,wcMess,wcchild;
if(!hPrevInstance)
{
wndclass.style = CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(hInstance,(LPCSTR)IDI_DHICON);
wndclass.hCursor = LoadCursor(NULL ,IDC_ARROW);
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = "GN74W";
wndclass.lpszClassName = szAppName;
wcMess.style = CS_HREDRAW |CS_VREDRAW | CS_PARENTDC;
wcMess.lpfnWndProc = MessWndProc;
wcMess.cbClsExtra = 0;
wcMess.cbWndExtra = 0;
wcMess.hInstance = hInstance;
wcMess.hIcon = LoadIcon(hInstance,(LPCSTR)IDI_DHICON);
wcMess.hCursor = LoadCursor(NULL, IDC_ARROW);
wcMess.hbrBackground = GetStockObject(WHITE_BRUSH);
wcMess.lpszMenuName =NULL;
wcMess.lpszClassName = "MessageW";
wcchild.style = CS_HREDRAW |CS_VREDRAW|CS_SAVEBITS|CS_PARENTDC|CS_DBLCLKS;
wcchild.lpfnWndProc = ChildWndProc;
wcchild.cbClsExtra = 0;
wcchild.cbWndExtra =sizeof( WORD ) ;
wcchild.hInstance = hInstance;
wcchild.hIcon = LoadIcon(NULL,(LPCSTR)IDI_DHICON);
wcchild.hCursor = LoadCursor(NULL, IDC_ARROW);
wcchild.hbrBackground = GetStockObject(0);
wcchild.lpszMenuName =NULL;
wcchild.lpszClassName = "ChildWindow";
if(RegisterClass(&wcMess) == 0||RegisterClass(&wndclass) == 0||RegisterClass(&wcchild)==0)
return FALSE;
}
hFrameInstance = hInstance;
hFrameWnd = hWnd = CreateWindow(szAppName,"GPS OEM板测试软件--北京大恒",
WS_OVERLAPPEDWINDOW,
0,
0,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN),
NULL,NULL,hInstance,NULL
);
if (!hWnd) return (FALSE);
if(InitCom("COM1","COM1:4800,N,8,1")!=0)
InitCom("COM2","COM2:4800,N,8,1");
ShowWindow(hWnd,SW_SHOWMAXIMIZED);
UpdateWindow(hWnd);
while(TRUE){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
if(msg.message == WM_QUIT )
break;
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}else RecieveData();
}//while
return 0;
}
long FAR PASCAL _export WndProc(HWND hWnd,UINT message,UINT wParam,LONG lParam)
{
static char str[64];
HDC hDC;
PAINTSTRUCT ps;
char Temp[32],szLonDeg[32],szLonMin[32],szLatDeg[32],szLatMin[32];
char szLatAve[48],szLonAve[48],szHeightAve[48],szstr1[32];
char sss[] = "没有定位!";
static char ss1[] = "开始定位";
static HBRUSH hBrush[12],hBrushA,hBrushB;
static LOGPEN lpBlack = {PS_SOLID,1,1,RGB(0,0,0)};
static LOGPEN lpGray = {PS_SOLID,1,1,RGB(128,128,128)};
HPEN hBlackPen,hGrayPen;
static RECT rect;
int i,j,iScreenX,iScreenY;
FARPROC lpDlg;
time_t t;
static int iSecond;
char szOCMD[64];
switch(message)
{
case WM_CREATE:
iScreenX = GetSystemMetrics(SM_CXSCREEN);
iScreenY = GetSystemMetrics(SM_CYSCREEN);
GetClientRect(hWnd,&rect);
rect.left = 250;
rect.top = 10;
rect.right =500 ;
rect.bottom = 220;
MessageNum=0;
hMessWnd = CreateWindow(
"MessageW",
"数据信息",
WS_OVERLAPPEDWINDOW,
0,
310,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN)-310,
hWnd,
NULL,
hFrameInstance,
NULL
);
ShowWindow(hMessWnd,SW_SHOW);
return 0;
case WM_TIMER:
switch(wParam){
case 1:
if(iTime)
{
iSecond++;
if((unsigned long)iSecond >= iTime)
{
iTime = 0;
iSecond = 0;
bCount = FALSE;
if(recfp)
{
time(&t); // get current time
fprintf(recfp,"\n#end");
fprintf(recfp,"\n结束时间:%s",ctime(&t));
fprintf(recfp,"\n The average of Latitude is :%d Degree %6.4f Minute",iLatDegAve,dLatMinAve);
fprintf(recfp,"\n The average of Longitude is :%d Degree %6.4f Minute",iLonDegAve,dLonMinAve);
fprintf(recfp,"\n The average of Altitude is :%7.1f Meters",fHeightAve);
fclose(recfp);
bSaveFile = FALSE;
KillTimer(hWnd,idTimer);
}
MessageBox(hWnd,"计算结束!","消息",MB_OK);
bGetAver = FALSE;
}
}else{
KillTimer(hWnd,idTimer);
bGetAver = FALSE;
if(recfp)
{
time(&t); // get current time
fprintf(recfp,"\n#end");
fprintf(recfp,"\n结束时间:%s",ctime(&t));
fclose(recfp);
}
}
break;
}
break;
case WM_PAINT:
hDC = BeginPaint (hWnd, &ps);
hBlackPen = CreatePenIndirect(&lpBlack);
sprintf(Temp,"%s","卫星信噪比:(db)");
TextOut(hDC,250,10,Temp,strlen(Temp));//560,290
////////画图--根据卫星的个数来确定图的个数//////////////////
for(j = 0;j<iSateNo;j++)
{
if(Satellites[j].SNR >=38)
hBrush[j] = CreateSolidBrush(RGB(66,171,44 ));
else
hBrush[j] = CreateSolidBrush(RGB(255,255,0 ));
SelectObject(hDC,hBlackPen);
SelectObject(hDC,hBrush[j]);
Rectangle(hDC,250+j*20,200-2*Satellites[j].SNR ,260+j*20,200);
sprintf(str,"%2d",Satellites[j].SNR);
TextOut(hDC,250+j*20,200-2*Satellites[j].SNR-18,str,strlen(str));
//////////显示卫星星号/////////////////////////////////
sprintf(str,"%02d",Satellites[j].SV);
TextOut(hDC,250+j*20,200,str,strlen(str));
}
////////画图例///////////////
SelectObject(hDC,hBlackPen);
hBrushA = CreateSolidBrush(RGB(255,255,0 ));
SelectObject(hDC,hBrushA);
Rectangle(hDC,260,230,270,240);//570,530,580,540);
SelectObject(hDC,hBlackPen);
hBrushB = CreateSolidBrush(RGB(66,171,44 ));
SelectObject(hDC,hBrushB);
Rectangle(hDC,360,230,370,240);//670,530,680,540);
sprintf(str,"有效值");
TextOut(hDC,375,225,str,strlen(str));//685,525
sprintf(str,"无效值");
TextOut(hDC,275,225,str,strlen(str));// 585,525
//////////////////////////////////////////
SetTextColor(hDC,RGB(146,46,113));
sprintf(Temp,"%s","经纬度:");
TextOut(hDC,10,10,Temp,strlen(Temp));//570
sprintf(Temp,"%s","东经: ");
TextOut(hDC,10,32,Temp,strlen(Temp));
sprintf(Temp,"%s","北纬: ");
TextOut(hDC,10,54,Temp,strlen(Temp));
sprintf(Temp,"%s","时间:");
TextOut(hDC,10,76,Temp,strlen(Temp));
sprintf(Temp,"%s","卫星个数:");
TextOut(hDC,10,98,Temp,strlen(Temp));
sprintf(Temp,"%s","有效卫星:");
TextOut(hDC,10,120,Temp,strlen(Temp));
sprintf(Temp,"%s","状态:");
TextOut(hDC,10,142,Temp,strlen(Temp));
sprintf(szLonDeg,"%d",iLonDeg);
TextOut(hDC,60,32,szLonDeg,strlen(szLonDeg));//620,32
TextOut(hDC,85,32,"度",strlen("度"));//645,32
sprintf(szLonMin,"%6.4f",dLonMin);
TextOut(hDC,105,32,szLonMin,strlen(szLonMin));//665,32
TextOut(hDC,160,32,"分",strlen("分"));//720,32
sprintf(szLatDeg,"%d",iLatDeg);
TextOut(hDC,60,54,szLatDeg,strlen(szLatDeg));//620,54
TextOut(hDC,85,54,"度",strlen("度"));//645,54
sprintf(szLatMin,"%6.4f",dLatMin);
TextOut(hDC,105,54,szLatMin,strlen(szLatMin));//665,54
TextOut(hDC,160,54,"分",strlen("分"));//720,32
if(bGetAver && iStatus)
{
sprintf(szstr1,"%s","经纬度平均值:");
TextOut(hDC,10,164,szstr1,strlen(szstr1));
sprintf(szLatAve,"纬度: %d 度 %6.4f 分",iLatDegAve,dLatMinAve);
TextOut(hDC,10,188,szLatAve,strlen(szLatAve));
sprintf(szLonAve,"经度: %d 度 %6.4f 分",iLonDegAve,dLonMinAve);
TextOut(hDC,10,210,szLonAve,strlen(szLonAve));
sprintf(szHeightAve,"高度:%7.1f 米",fHeightAve);
TextOut(hDC,10,232,szHeightAve,strlen(szHeightAve));
}
////////画边界框/////////////////////
hGrayPen = CreatePenIndirect(&lpGray);
SelectObject(hDC,hGrayPen);
MoveTo(hDC,220,0); //553,0
LineTo(hDC,220,270);//553,GetSystemMetrics(SM_CYSCREEN)
MoveTo(hDC,222,0); //551,0
LineTo(hDC,222,270);//551GetSystemMetrics(SM_CYSCREEN)
SelectObject(hDC,hGrayPen);
MoveTo(hDC,0,270);//552,270
LineTo(hDC,GetSystemMetrics(SM_CXSCREEN),270);
MoveTo(hDC,0,272);//552,272
LineTo(hDC,GetSystemMetrics(SM_CXSCREEN),272);
EndPaint(hWnd,&ps);
DeleteObject(hGrayPen);
DeleteObject(hBlackPen);
DeleteObject(hBrushA);
DeleteObject(hBrushB);
for(j = 0;j<iSateNo;j++)
DeleteObject(hBrush[j]);
break;
case WM_USER:
hDC=GetDC(hWnd);
SetTextColor(hDC,RGB(0,128,192));
sprintf(szLonDeg,"%d",iLonDeg);
TextOut(hDC,60,32,szLonDeg,strlen(szLonDeg)); //620,32
TextOut(hDC,85,32,"度",strlen("度"));//645,32
sprintf(szLonMin,"%6.4f",dLonMin);
TextOut(hDC,105,32,szLonMin,strlen(szLonMin));//665,32
TextOut(hDC,160,32,"分",strlen("分"));//720
sprintf(szLatDeg,"%d",iLatDeg);
TextOut(hDC,60,54,szLatDeg,strlen(szLatDeg));//620,54
TextOut(hDC,85,54,"度",strlen("度"));//645,54
sprintf(szLatMin,"%6.4f",dLatMin);
TextOut(hDC,105,54,szLatMin,strlen(szLatMin));//665,54
TextOut(hDC,160,54,"分",strlen("分"));//720,54
sprintf(str,"%02ld :",tmptime/10000L+8);
TextOut(hDC,60,76,str,strlen(str)); //620,76
tmptime%=10000L;
sprintf(str,"%02ld :",tmptime/100L);
TextOut(hDC,90,76,str,strlen(str));//650,76
tmptime%=100L;
sprintf(str,"%02ld",tmptime);
TextOut(hDC,120,76,str,strlen(str));//680,76
sprintf(str,"%02d 颗",iSateNo);
TextOut(hDC,85,98,str,strlen(str));//645,98
//////////取有效卫星个数///////////////
for(i = 0,validSate=0;i<iSateNo;i++)
{
if(Satellites[i].SNR >= 38)
validSate++;
}
sprintf(str,"%02d 颗",validSate);
TextOut(hDC,85,120,str,strlen(str));//645,120
//////////显示卫星状态//////////////////////////////
if(iStatus == 0)
TextOut(hDC,60,142,sss,strlen(sss)); //620,142
else
TextOut(hDC,60,142,ss1,strlen(ss1)); //620,142
//////////显示卫星星号/////////////////////////////////
/* for(j = 0;j<iSateNo;j++)
{
sprintf(str,"%02d",Satellites[j].SV);
//560+j*20,500
TextOut(hDC,250+j*20,200,str,strlen(str));
}*/
///////////取画图区域坐标,刷新//////////////////////////////////////
if(bGetAver && iStatus)
{
sprintf(szLatAve,"纬度: %d 度 %6.4f 分",iLatDegAve,dLatMinAve);
TextOut(hDC,10,188,szLatAve,strlen(szLatAve));
sprintf(szLonAve,"经度: %d 度 %6.4f 分",iLonDegAve,dLonMinAve);
TextOut(hDC,10,210,szLonAve,strlen(szLonAve));
sprintf(szHeightAve,"高度:%7.1f 米",fHeightAve);
TextOut(hDC,10,232,szHeightAve,strlen(szHeightAve));
SetTextColor(hDC,RGB(146,46,113));
sprintf(szstr1,"%s","经纬度平均值:");
TextOut(hDC,10,164,szstr1,strlen(szstr1));
}
InvalidateRect(hWnd,&rect,TRUE);
ReleaseDC(hWnd,hDC);
break;
case WM_COMMAND:
switch (wParam)
{
int iCheckNum;
char szChkNum[5];
case IDM_GGA:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,GGA%02d",iInterval);
//sprintf(str,"$PFEC,GPint,GGA01,GLL00,ZDA00,GSA00,GSV00,VTG00,RMC00,TST00");
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_GSV:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,GSV%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_ZDA:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,ZDA%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_RMC:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,RMC%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_VTG:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,VTG%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_TST:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,tst%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_GSA:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,GSA%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_GLL:
if(!GetInterval()) break;
sprintf(str,"$PFEC,GPint,GLL%02d",iInterval);
iCheckNum = GetCheckNum(str);
sprintf(szChkNum,"%02x",iCheckNum);
sprintf(szOCMD,"%s*%s\r\n",str,_strupr(_strdup(szChkNum)));
SendCommand(szOCMD);
memset(str,0,sizeof(str)) ;
memset(szOCMD,0,sizeof(szOCMD)) ;
break;
case IDM_CLOSE:
sprintf(str,"%s*%x\r\n",close,GetCheckNum(close));
SendCommand(str);
memset(str,0,sizeof(str)) ;
break;
case IDM_OPEN:
sprintf(str,"%s*%2x\r\n",open,GetCheckNum(open));
SendCommand(str);
memset(str,0,sizeof(str)) ;
break;
case IDM_OUTPUT:
GetOutputCommmand();
break;
case IDM_SETUP:
SetupCommID();
break;
case IDM_ABOUT:
lpDlg=MakeProcInstance(AboutDlgProc,hFrameInstance);
DialogBox(hFrameInstance,"ABOUT",hFrameWnd,lpDlg);
FreeProcInstance(lpDlg);
break;
case IDM_SAMPLE:
CreateDialog(hFrameInstance,"SAMPLE",hWnd,
MakeProcInstance((FARPROC)DialogWndProc,hFrameInstance));
break;
case IDM_MESSAGE:
if(hMessWnd) // message window already exist
break;
hMessWnd = CreateWindow(
"MessageW",
"数据信息",
WS_OVERLAPPEDWINDOW,
0,
310,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN)-310,
hWnd,
NULL,
hFrameInstance,
NULL
);
ShowWindow(hMessWnd,SW_SHOW);
SetWindowPos(hMessWnd,hWnd,
0,
310,
GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN)-310,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -