⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpssimview.cpp

📁 GPS信号模拟器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    float fy = float(m_centerLati - lati) / (float)m_scaleLati;

    x = fx * (g_rectTrack.right - g_rectTrack.left) + (g_rectTrack.right + g_rectTrack.left) / 2;
    y = fy * (g_rectTrack.bottom - g_rectTrack.top) + (g_rectTrack.bottom - g_rectTrack.top) / 2;
}


void CGPSSimView::DrawAllTrack(CDC *pDC)
{
    CGPSSimDoc *pDoc = GetDocument();

    CBrush br(RGB(192,255,192));
    
    pDC->FillRect(&g_rectTrack, &br);
   
    pDC->MoveTo(g_rectTrack.left, g_rectTrack.top);
    pDC->LineTo(g_rectTrack.right, g_rectTrack.top);
    pDC->LineTo(g_rectTrack.right, g_rectTrack.bottom);
    pDC->LineTo(g_rectTrack.left, g_rectTrack.bottom);
    pDC->LineTo(g_rectTrack.left, g_rectTrack.top);


	const vector<KNPosition> &allpos = CGPSSimDoc::m_bDisplayFlag?
									   pDoc->GetAllTrnPos():
									   pDoc->GetAllRawPos();

    vector<KNPosition>::const_iterator it = allpos.begin();

    for (; it != allpos.end(); ++it)
    {
        int i = it->speed / 10;
        if (i < 0) i = 0;
        if (i > 17) i = 17;

        DrawTrack(pDC, it->longitude, it->latitude, g_crSpeed[i], 1);
    }
    
    if (allpos.size())
    {
        --it;
        
        int i = it->speed / 10;
        if (i < 0) i = 0;
        if (i > 17) i = 17;

        DrawTrack(pDC, it->longitude, it->latitude, g_crSpeed[i], 0);
    }
    
}

void CGPSSimView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

    CDC *pDC = GetDC();

    DrawAllTrack(pDC);
    RefreshChart();

    ReleaseDC(pDC);  
}

BOOL CGPSSimView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rectWnd, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{	
	BOOL bRet = CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rectWnd, pParentWnd, nID, pContext);

    m_chart.SubclassDlgItem(IDC_CHART, this);

    return bRet;
}

void CGPSSimView::OnSignalBegin() 
{
    CGPSSimDoc *pDoc = GetDocument();

	/*
    if (!m_bSignalPause)
    {
        pDoc->Begin();
    }*/

    SetTimer(1212, 995, NULL);
//	SetTimer(1212, 395, NULL);
    m_bSignalStart = true;
	m_bSignalPause = false;
}

void CGPSSimView::OnSignalPause() 
{
    m_bSignalPause = true;
    KillTimer(1212);
}

void CGPSSimView::OnSignalStop() 
{
	m_bSignalStart = false;
	m_bSignalPause = false;
    KillTimer(1212);

}


void CGPSSimView::OnUpdateSignalPause(CCmdUI* pCmdUI) 
{
    pCmdUI->SetCheck(m_bSignalPause);
	pCmdUI->Enable(m_bSignalStart);
}

void CGPSSimView::OnUpdateSignalStop(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_bSignalStart);
}

void CGPSSimView::OnUpdateSignalBegin(CCmdUI* pCmdUI) 
{
    pCmdUI->Enable((!m_bSignalStart || m_bSignalPause)&& GetDocument()->Validate());
}

void CGPSSimView::RefreshChart()
{
    CGPSSimDoc *pDoc = GetDocument();
    ASSERT(pDoc != NULL);


    int item = m_table.GetCurSel();

	const vector<KNPosition> &pos = CGPSSimDoc::m_bDisplayFlag?
									pDoc->GetAllTrnPos():
									pDoc->GetAllRawPos();

    if (item == 0) // 速度
    {
        m_chart.SetRangeY(0, 50);
        vector<KNPosition>::const_reverse_iterator it = pos.rbegin();

        for (int i = 0; it != pos.rend() && i < 20; ++it,++i)
        {
            m_chart.SetData(0, i, it->speed);
        }
    }
    else if (item == 1) // 高度
    {
        m_chart.SetRangeY(0, 100);
        vector<KNPosition>::const_reverse_iterator it = pos.rbegin();
        
        for (int i = 0; it != pos.rend() && i < 20; ++it,++i)
        {
            m_chart.SetData(0, i, it->height);
        }
    }
    else if (item == 2) // 速度分布
    {        
        vector<KNPosition>::const_iterator it = pos.begin();
        
        double aData[20] = {0.0f};

        long count = 0;
        for (; it != pos.end(); ++it)
        {
            int seg = (it->speed+4) / 5;
            if (seg < 0) seg = 0;
            if (seg > 19) seg = 19;

            aData[seg]++;
            count++;
        }

        for (int i = 0; i < 20; i++)
        {
            m_chart.SetData(0, i, aData[i]/count);
        }
    }
    else if (item == 3) // 高度分布
    {
        vector<KNPosition>::const_iterator it = pos.begin();
        
        double aData[20] = {0.0f};
        
        long count = 0;
        for (; it != pos.end(); ++it)
        {
            int seg = (it->height+4) / 5;
            if (seg < 0) seg = 0;
            if (seg > 19) seg = 19;
            
            aData[seg]++;
            count++;
        }
        
        for (int i = 0; i < 20; i++)
        {
            m_chart.SetData(0, i, aData[i]/count);
        }
    }
    
    m_chart.Invalidate();
    m_chart.UpdateWindow();
}

void CGPSSimView::RefreshText()
{
    CGPSSimDoc *pDoc = GetDocument();

    const vector<char*> &vtxt = CGPSSimDoc::m_bDisplayFlag?
								pDoc->GetCurTrnText():
								pDoc->GetCurRawText();

    m_textRaw.Empty();

    vector<char*>::const_iterator it = vtxt.begin();
    for (; it != vtxt.end(); ++it)
    {
        m_textRaw += *it;
        //m_textRaw += "\r\n";
    }
    
    UpdateData(FALSE);
}

void CGPSSimView::OnSetScaleAdd() 
{
    m_scaleLngi += 160;
    m_scaleLati += 120;
    Invalidate();
    UpdateWindow();	
}

void CGPSSimView::OnSetScaleSub() 
{
    m_scaleLngi -= 160;
    m_scaleLati -= 120;

    if (m_scaleLngi < 40) m_scaleLngi = 80;
    if (m_scaleLati < 30) m_scaleLati = 60;

    Invalidate();
    UpdateWindow();	
}


void CGPSSimView::OnUpdateSignalTrn(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowSignal);
	pCmdUI->Enable(FALSE);
}

void CGPSSimView::OnUpdateSignalOri(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(!m_bShowSignal);
}

void CGPSSimView::OnSignalOri() 
{
	m_bShowSignal = false;
	CGPSSimDoc::m_bDisplayFlag = false;
}

void CGPSSimView::OnSignalTrn() 
{
	m_bShowSignal = true;
	CGPSSimDoc::m_bDisplayFlag = true;
}


void CGPSSimView::RefreshList(void)
{
	CGPSSimDoc *pDoc = GetDocument();

	const vector<KNPosition>& allpos = CGPSSimDoc::m_bDisplayFlag?
										pDoc->GetAllTrnPos():
										pDoc->GetAllRawPos();

	if (allpos.empty()) return;

	const KNPosition &pos = allpos.back();

	int count = m_list.GetItemCount();

	if (count > 20)
	{
		m_list.DeleteItem(19);
	}

	int num;
	char buff[20] = {pos.time[0], pos.time[1], ':', 
					 pos.time[2], pos.time[3], ':' ,
					 pos.time[4], pos.time[5], 0};

	m_list.InsertItem(0, buff);

	// Longitude
	num = pos.longitude >> 3;
	int dd = num/3600;
	int mm = (num%3600)/60;
	int ss = num%60;
	sprintf(buff, "%d:%d:%d", dd, mm, ss);
	m_list.SetItem(0, 1, LVIF_TEXT, buff, 0, 0, 0, 0, 0);

	// Latitude
	num = pos.latitude >> 3;
	dd = num/3600;
	mm = (num%3600)/60;
	ss = num%60;
	sprintf(buff, "%d:%d:%d", dd, mm, ss);
	m_list.SetItem(0, 2, LVIF_TEXT, buff, 0, 0, 0, 0, 0);

	// Speed
	sprintf(buff, "%.1f", pos.speed);
	m_list.SetItem(0, 3, LVIF_TEXT, buff, 0, 0, 0, 0, 0);

	// Direction
	sprintf(buff, "%.1f", pos.direction);
	m_list.SetItem(0, 4, LVIF_TEXT, buff, 0, 0, 0, 0, 0);

	// Height
	sprintf(buff, "%.1f", pos.height);
	m_list.SetItem(0, 5, LVIF_TEXT, buff, 0, 0, 0, 0, 0);
}


void CGPSSimView::OnSetProperty()
{
	CPropertySheet sheet;
	CNormalSetPage page1;
	//CNoisePage page2;
	sheet.AddPage(&page1);
	//sheet.AddPage(&page2);
	if (sheet.DoModal() == IDOK)
	{
		CGPSSimDoc *pDoc = GetDocument();
		/*
		char a,b,c;
		a = page2.m_nAbnormal;
		b = page2.m_nNoSignal;
		c = page2.m_nAcel;
		pDoc->SetSetting(a, b, c);
		*/
		pDoc->m_strPort = page1.m_strPort;
		pDoc->m_dwBand = page1.m_dwBand;
	}
}



void CGPSSimView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
	CGPSSimDoc *pDoc = GetDocument();
	
	int count = pDoc->GetCount();
	int index = pDoc->GetCurIndex();


	m_slider.SetRange(0, count, TRUE);
	m_slider.SetPos(index);

}


void CGPSSimView::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
	CGPSSimDoc *pDoc = GetDocument();

	int nPos = m_slider.GetPos();

	pDoc->Reset();

	while (nPos-- > 0)
		pDoc->Next();


	*pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -