📄 winpskview.cpp
字号:
}
*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 + -