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

📄 winpskview.cpp

📁 PSK31方式通信C++编写的原代码,可以通过声音传递数据.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	*pResult = 0;
}

//////////////////////////////////////////////////////////////////////
//  Capture keystroke messages before they go to the controls so
// that custom functionality can be attached to certain keys.
//////////////////////////////////////////////////////////////////////
BOOL CWinPSKView::PreTranslateMessage(MSG* pMsg) 
{
BOOL fSkipMsg = FALSE;
CWinPSKDoc* pDoc;
	switch (pMsg->message)
	{
		case WM_KEYDOWN:
		case WM_SYSKEYDOWN:
			switch (pMsg->wParam)
			{
				case VK_DOWN:
				case VK_LEFT:
				case VK_UP:
				case VK_RIGHT:
					pDoc = GetDocument();
					ASSERT_VALID( pDoc );
					m_fRxFreqEditing = FALSE;
					m_fTxFreqEditing = FALSE;
					switch( pDoc->m_pSettings->m_TabSel )
					{
						case FFT_DISPVIEW:
						case WATERFALL_DISPVIEW:
							if( pMsg->wParam == VK_UP )
							{
								pDoc->m_pSettings->m_UseAFC = m_UseAFC = TRUE;
								UpdateData(FALSE);		//Put value in control
								OnAfc();
							}
							if( pMsg->wParam == VK_DOWN )
							{
								pDoc->m_pSettings->m_UseAFC = m_UseAFC = FALSE;
								UpdateData(FALSE);		//Put value in control
								OnAfc();
							}
							if( pMsg->wParam == VK_RIGHT )
								FindClosestSignal(TRUE);
							if( pMsg->wParam == VK_LEFT )
								FindClosestSignal(FALSE);
							break;
					}
					fSkipMsg = TRUE;
					break;
				case VK_NEXT:
					ChngZoom( -1 );
					break;
				case VK_PRIOR:
					ChngZoom( +1 );
					break;
				case VK_F1:
				case VK_F2:
				case VK_F3:
				case VK_F4:
				case VK_F5:
				case VK_F6:
				case VK_F7:
				case VK_F8:
				case VK_F9:
				case VK_F10:
				case VK_F11:
				case VK_F12:
					if( (pMsg->message != WM_SYSKEYDOWN) ||
									(pMsg->wParam == VK_F10) )
					{
						ProcessFKeys(pMsg->wParam);
					}
					break;
			}
			break;
	}
	if( fSkipMsg )
		return TRUE;
	else
		return CFormView::PreTranslateMessage(pMsg);
}

//////////////////////////////////////////////////////////////////////
// Called when Net check box is touched.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnNet() 
{
CWinPSKDoc* pDoc = GetDocument();
	ASSERT_VALID( pDoc );
	UpdateData(TRUE);		//Get value from control
	pDoc->m_pSettings->m_TXNet = m_TXNet;
	if(m_TXNet )
	{
		if(pDoc->m_pSettings->m_TxOffsetMode)
		{
			pDoc->m_pSettings->m_TxFreq = m_RxFreq;
			fnSetTXFrequency( m_RxFreq + pDoc->m_pSettings->m_TxFreqOffset );
		}
		else
		{
			pDoc->m_pSettings->m_TxFreq = m_RxFreq;
			m_TxDisp = m_RxFreq;
			fnSetTXFrequency(m_RxFreq);
		}
		UpdateData(FALSE);		//Put changed data into control
	}
}

//////////////////////////////////////////////////////////////////////
// Called when TR Button is pushed.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnTrbutton() 
{
	ToggleTR();
}
//////////////////////////////////////////////////////////////////////
// Called when BPSK Box is touched.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnBpsk() 
{
	UpdateData(TRUE);		//Get value from control
	GetDocument()->m_pSettings->m_ModType = m_PSKMode;
	INT tmp = 0;
	if(GetDocument()->m_pSettings->m_PSK63Mode)
		tmp |= PSK63MODE;
	fnSetRXPSKMode(BPSK_MODE|tmp, RX_CHAN);
}

//////////////////////////////////////////////////////////////////////
// Called when PSK63 Box is touched.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnPsk3163() 
{
	UpdateData(TRUE);		//Get value from control
	GetDocument()->m_pSettings->m_PSK63Mode = m_PSK63;
	INT tmp = 0;
	if(m_PSK63)
		tmp |= PSK63MODE;
	switch(	GetDocument()->m_pSettings->m_ModType)
	{
		case BPSK_MODE:
			fnSetRXPSKMode(BPSK_MODE|tmp, RX_CHAN);
			break;
		case QPSK_MODE:
			fnSetRXPSKMode(QPSK_MODE|tmp, RX_CHAN);
			break;
		case IQPSK_MODE:
			fnSetRXPSKMode(IQPSK_MODE|tmp, RX_CHAN);
			break;
	}
}

//////////////////////////////////////////////////////////////////////
// Called when QPSK Box is touched.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnQpsk() 
{
CWinPSKDoc* pDoc = GetDocument();
	ASSERT_VALID( pDoc );
	UpdateData(TRUE);		//Get value from control
	pDoc->m_pSettings->m_ModType = m_PSKMode;
	INT tmp = 0;
	if(GetDocument()->m_pSettings->m_PSK63Mode)
		tmp |= PSK63MODE;
	if(pDoc->m_pSettings->m_UseLSB)
		fnSetRXPSKMode(IQPSK_MODE|tmp, RX_CHAN);
	else
		fnSetRXPSKMode(QPSK_MODE|tmp, RX_CHAN);
}


//////////////////////////////////////////////////////////////////////
// Called when TX Tune Button is pressed.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::OnTxtune() 
{
CWinPSKDoc* pDoc = GetDocument();
	ASSERT_VALID( pDoc );
	if(!m_DLLRunning)
		return;
	switch( m_ProgramState )
	{
		case STATE_RX:
			UpdateStatus();
			OnNet();
			if(pDoc->m_pSettings->m_TxOffsetMode)
			{
				fnSetTXFrequency( pDoc->m_pSettings->m_TxFreq + pDoc->m_pSettings->m_TxFreqOffset );
			}
			else
			{
				fnSetTXFrequency(pDoc->m_pSettings->m_TxFreq);
			}
			if( pDoc->m_SatMode )
				fnStartTX(TUNEID_MODE | SATMODE);
			else
				fnStartTX(TUNEID_MODE);
//			fnStartTX(TUNE_MODE);
			pDoc->m_pRcvEdit->TXStamp(pDoc->m_pSettings->m_EchoTXText,
							TRUE, pDoc->m_pSettings->m_UseLocalTime);
			m_ProgramState = STATE_TUNE;
			break;
		case STATE_TX:
			break;
		case STATE_FINISH:
			fnAbortTX();
			break;
		case STATE_TUNE:
			fnStopTX();
			m_ProgramState = STATE_FINISH;
			break;
	}
}


//////////////////////////////////////////////////////////////////////
//     General Functions for various chores
//////////////////////////////////////////////////////////////////////
void CWinPSKView::FindClosestSignal(BOOL LookRight)
{
CWinPSKDoc* pDoc = GetDocument();
LONG peak;
	if( !m_fRxFreqEditing && !m_fTxFreqEditing && m_UseAFC)
	{
		if(LookRight)
		{
			peak = fnGetClosestPeak(  pDoc->m_pSettings->m_RxFreq,
							IndexToFreq( m_pCPlotData->GetXmax() ));
		}
		else
		{
			peak = fnGetClosestPeak( pDoc->m_pSettings->m_RxFreq,
				IndexToFreq( m_pCPlotData->GetXmin() ));
		}
		fnSetRXFrequency(peak, m_SearchRange, RX_CHAN);
	}
	else	//just inc or dec frequency
	{
		if(LookRight)
			pDoc->m_pSettings->m_RxFreq++;
		else
			pDoc->m_pSettings->m_RxFreq--;
		if(pDoc->m_pSettings->m_RxFreq < IndexToFreq( m_pCPlotData->GetXmin()) )
			pDoc->m_pSettings->m_RxFreq = IndexToFreq( m_pCPlotData->GetXmin());
		if(pDoc->m_pSettings->m_RxFreq > IndexToFreq( m_pCPlotData->GetXmax()) )
			pDoc->m_pSettings->m_RxFreq = IndexToFreq( m_pCPlotData->GetXmax());
		fnSetRXFrequency(pDoc->m_pSettings->m_RxFreq, 0, RX_CHAN);
		m_RxFreq = pDoc->m_pSettings->m_RxFreq;
		UpdateData(FALSE);		//Put changed data into control
		UpdatePlotInfo(PLOT_CHNG_FREQ);
	}
}

//////////////////////////////////////////////////////////////////////
// Called to inc or dec zomm magnification from control or keystrokes.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::ChngZoom(INT delta)
{
INT tzoom;
	CWinPSKDoc* pDoc = GetDocument();
	ASSERT_VALID( pDoc );
// Get current zoom factor
	tzoom = pDoc->m_pSettings->m_PlotViewState[pDoc->m_pSettings->m_TabSel].zoom;
	tzoom += delta;		//change it
	if(tzoom < 1)		//clamp it
		tzoom = 1;
	if(tzoom >4)
		tzoom = 4;
	m_pCPlotData->SetZoom(tzoom,TRUE, pDoc->m_pSettings->m_FreqMin,
									pDoc->m_pSettings->m_FreqMax );
	pDoc->m_pSettings->m_PlotViewState[pDoc->m_pSettings->m_TabSel].zoom = tzoom;
	UpdatePlotInfo(PLOT_CHNG_ZOOM);
	pDoc->m_FFTModeChange = TRUE;
}

//////////////////////////////////////////////////////////////////////
// Converts display buffer index position to Frequency.
//////////////////////////////////////////////////////////////////////
INT CWinPSKView::IndexToFreq(INT Index)
{	//convert display buffer index to frequency Hz.
INT temp = ((Index)*FFT_SAMPLERATE*100)/(FFT_SIZE);	//100x freq
	if( (temp%100) > 50 )		//round to nearest fft index
		temp = temp/100 + 1;
	else
		temp = temp/100;
	return( temp);
}

//////////////////////////////////////////////////////////////////////
// Converts Frequency to display buffer index position.
//////////////////////////////////////////////////////////////////////
INT CWinPSKView::FreqToIndex(INT Freq)
{	//convert Frequency Hz to display buffer index.
INT temp = (Freq*FFT_SIZE*100)/FFT_SAMPLERATE;	//calc actual *100
	if( (temp%100) > 50 )		//round to nearest fft index
		temp = temp/100 + 1;
	else
		temp = temp/100;
	return( temp);
}

//////////////////////////////////////////////////////////////////////
// Updates the display controls depending on the view tab state and
//  where the change request is coming from(src = mouse,zoom,freq edit.)
//////////////////////////////////////////////////////////////////////
void CWinPSKView::UpdatePlotInfo(INT src)
{
CWnd* pWnd;
	CWinPSKDoc* pDoc = GetDocument();
	ASSERT_VALID( pDoc );
BOOL Full =	(pDoc->m_pSettings->m_PlotViewState[pDoc->m_pSettings->m_TabSel].zoom == 1);
	switch( src )
	{
		case PLOT_CHNG_MOUSE:
			switch( pDoc->m_pSettings->m_TabSel )
			{
				case FFT_DISPVIEW:
				case WATERFALL_DISPVIEW:
					m_RxFreq = IndexToFreq( m_pCPlotData->GetPlotCursorIndex() );
					pDoc->m_pSettings->m_RxFreq = m_RxFreq;
					fnSetRXFrequency(m_RxFreq, m_SearchRange, RX_CHAN);
					if(Full)
					{
						m_XMinCStr.Format(_T("%d Hz"), pDoc->m_pSettings->m_FreqMin );
						m_XMaxCStr.Format(_T("%d Hz"), pDoc->m_pSettings->m_FreqMax);
					}
					else
					{
						m_XMinCStr.Format(_T("%d Hz"), IndexToFreq( m_pCPlotData->GetXmin() ));
						m_XMaxCStr.Format(_T("%d Hz"), IndexToFreq( m_pCPlotData->GetXmax() ));
					}
					break;
				default:
					m_XMinCStr = _T("0");
					m_XMaxCStr = _T("0");
					break;
			}
			break;
		case PLOT_CHNG_ZOOM:
			switch( pDoc->m_pSettings->m_TabSel )
			{
				case FFT_DISPVIEW:
				case WATERFALL_DISPVIEW:
					if(Full)
					{
						m_XMinCStr.Format(_T("%d Hz"), pDoc->m_pSettings->m_FreqMin );
						m_XMaxCStr.Format(_T("%d Hz"), pDoc->m_pSettings->m_FreqMax);
					}
					else
					{
						m_XMinCStr.Format(_T("%d Hz"), IndexToFreq( m_pCPlotData->GetXmin() ));
						m_XMaxCStr.Format(_T("%d Hz"), IndexToFreq( m_pCPlotData->GetXmax() ));
					}
					m_ZoomTxt.Format(_T("Zoom X%d"),pDoc->m_pSettings->m_PlotViewState[pDoc->m_pSettings->m_TabSel].zoom );
					pWnd = GetDlgItem( IDC_ZOOM );
					pWnd->EnableWindow(TRUE);
					pWnd = GetDlgItem( IDC_SLOWAVE );
					pWnd->EnableWindow(TRUE);
					break;
				case INPUT_DISPVIEW:
					m_XMinCStr = _T("0 Sec");
					m_XMaxCStr.Format(_T("%3.2f Sec"), (float)m_PlotWidth/8000.0);
					m_ZoomTxt = "";
					pWnd = GetDlgItem( IDC_ZOOM );
					pWnd->EnableWindow(FALSE);
					pWnd = GetDlgItem( IDC_SLOWAVE );
					pWnd->EnableWindow(FALSE);
					break;
				default:
					m_XMinCStr = _T("");
					m_XMaxCStr = _T("");
					m_ZoomTxt = _T("");
					pWnd = GetDlgItem( IDC_ZOOM );
					pWnd->EnableWindow(FALSE);
					pWnd = GetDlgItem( IDC_SLOWAVE );
					pWnd->EnableWindow(FALSE);
					break;
			}
			break;
		case PLOT_CHNG_FREQ:
			switch( pDoc->m_pSettings->m_TabSel )
			{
				case FFT_DISPVIEW:
				case WATERFALL_DISPVIEW:
					m_pCPlotData->SetPlotCursorIndex(FreqToIndex(pDoc->m_pSettings->m_RxFreq) );
					m_pCPlotData->SetZoom( pDoc->m_pSettings->
							m_PlotViewState[pDoc->m_pSettings->m_TabSel].zoom,FALSE,
							pDoc->m_pSettings->m_FreqMin,
							pDoc->m_pSettings->m_FreqMax );
				break;
				default:
					break;
			}
			break;
	}
	UpdateData(FALSE);		//Put changed data into control
}


//////////////////////////////////////////////////////////////////////
// Called to process a Function key press.
//////////////////////////////////////////////////////////////////////
void CWinPSKView::ProcessFKeys(WPARAM wParam)
{
	switch(wParam)
	{
		case VK_F1:
			OnM1button();
			break;
		case VK_F2:
			OnM2button();
			break;
		case VK_F3:
			OnM3button();
			break;
		case VK_F4:
			OnM4button();
			break;
		case VK_F5:
			OnM5button();
			break;
		case VK_F6:
			OnM6button();
			break;
		case VK_F7:
			OnM7button();
			break;
		case VK_F8:
			OnM8button();
			break;
		case VK_F9:
			OnM9button();
			break;
		case VK_F10:
			OnM10button();
			break;
		case VK_F11:
			OnIncfnset();
			break;
		case VK_F12:
			ToggleTR();
			break;
	}
}

//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Called to process an RX/TX button command
//////////////////////////////////////////////////////////////////////
void CWinPSKView::ToggleTR()
{
CWinPSKDoc* pDoc = GetDocument();
INT mode;
	ASSERT_VALID( pDoc );
	if(!m_DLLRunning)
		return;
	switch( m_ProgramState )
	{
		case STATE_RX:
			OnNet();
			pDoc->m_pRcvEdit->CancelSelection();
			pDoc->m_pRcvEdit->TXStamp(pDoc->m_pSettings->m_EchoTXText,
								TRUE, pDoc->m_pSettings->m_UseLocalTime);
			if(pDoc->m_pSettings->m_TxOffsetMode)
			{
				fnSetTXFrequency( pDoc->m_pSettings->m_TxFreq + pDoc->m_pSettings->m_TxFreqOffset );
			}
			else
			{
				fnSetTXFrequency(pDoc->m_pSettings->m_TxFreq);
			}
			mode = pDoc->m_pSettings->m_ModType;
			if( (mode == QPSK_MODE) && pDoc->m_pSettings->m_UseLSB)
				mode = IQPSK_MODE;
			if( pDoc->m_SatMode )
				mode |= SATMODE;
			if( pDoc->m_pSettings->m_PSK63Mode )
				mode |= (1<<3);
			fnStartTX(mode);
//			m_ProgramState = STATE_TX;
			break;
		case STATE_TX:
//			pDoc->m_pXmitEdit->ClearSentText();
			fnStopTX();
//			m_ProgramState = STATE_FINISH;
			break;
		case STATE_FINISH:
			fnAbortTX();
			pDoc->m_pXmitEdit->ClearAll();
			break;
		case STATE_TUNE:
			fnStopTX();
//			m_ProgramState = STATE_FINISH;
			break;
	}
	pDoc->m_pXmitEdit->SetFocus();
}

⌨️ 快捷键说明

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