//Copyright+LGPL //----------------------------------------------------------------------------------------------------------------------------------------------- // Copyright 2000-2013 Makoto Mori, Nobuyuki Oba //----------------------------------------------------------------------------------------------------------------------------------------------- // This file is part of MMVARI. // MMVARI is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // MMVARI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. // You should have received a copy of the GNU Lesser General Public License along with MMTTY. If not, see // . //----------------------------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "clipbrd.hpp" #include #include "Main.h" #include "LogFile.h" #include "MacEdit.h" #include "FreqDisp.h" #include "Option.h" #include "VerDsp.h" #include "InputWin.h" #include "CodeVw.h" #include "Country.h" #include "Mmcg.h" #include "LogLink.h" #include "LogList.h" #include "QSODlg.h" #include "LogSet.h" #include "RadioSet.h" #include "TrackDlg.h" #include "mml.h" #if DEBUG #include "Test.h" #endif //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainVARI *MainVARI; //アプリケーションメッセージのハンドラ--------------------------------------------- void __fastcall TMainVARI::OnAppMessage(tagMSG &Msg, bool &Handled) { /* Msg.hwnd := Handle; Msg.message := WM_KEYDOWN; Msg.wParam := Message.WParam; Msg.lParam := Message.LParam; */ switch(Msg.message){ case WM_KEYUP: if( !Active ) return; if( ActiveControl != PCTX ) return; if( Msg.wParam == VK_SHIFT ){ m_fKeyShift = FALSE; m_Edit[m_CurrentEdit].CloseSelect(); } break; case WM_KEYDOWN: if( !Active ) return; if( ActiveControl != PCTX ) return; switch(Msg.wParam){ case VK_SHIFT: m_fKeyShift = TRUE; break; case VK_DOWN: case VK_UP: case VK_LEFT: case VK_RIGHT: if( m_fKeyShift ) m_Edit[m_CurrentEdit].OpenSelect(); m_Edit[m_CurrentEdit].MoveCursor(Msg.wParam); Handled = TRUE; break; case VK_PRIOR: if( m_fKeyShift ){ SBarRX->Position--; } else { // if( m_fKeyShift ) m_Edit[m_CurrentEdit].OpenSelect(); for( int i = 0; i < m_Edit[m_CurrentEdit].GetScreenLine()/2; i++ ){ m_Edit[m_CurrentEdit].MoveCursor(VK_UP); } } Handled = TRUE; break; case VK_NEXT: if( m_fKeyShift ){ SBarRX->Position++; } else { // if( m_fKeyShift ) m_Edit[m_CurrentEdit].OpenSelect(); for( int i = 0; i < m_Edit[m_CurrentEdit].GetScreenLine()/2; i++ ){ m_Edit[m_CurrentEdit].MoveCursor(VK_DOWN); } } Handled = TRUE; break; case VK_TAB: m_Edit[m_CurrentEdit].PutKey('\t', 1); Handled = TRUE; break; } break; #if KEY_DIRECT case WM_CHAR: if( !Active ) return; if( ActiveControl != PCTX ) return; // if( !m_Edit[m_CurrentEdit].IsActive() ) return; OnChar(Msg.wParam & (sys.m_WinNT ? 0x0000ffff : 0x000000ff)); Handled = TRUE; break; #endif } } //ウインドウメッセージのハンドラ--------------------------------------------- void __fastcall TMainVARI::WndProc(TMessage &Message) { switch(Message.Msg){ case WM_COPYDATA: WndCopyData(Message); break; default: TForm::WndProc(Message); break; } } //--------------------------------------------------------------------------- // WM_COPYDATAの処理 void __fastcall TMainVARI::WndCopyData(TMessage &Message) { COPYDATASTRUCT *cp = (COPYDATASTRUCT *)Message.LParam; if( LogLink.IsCopyData() ){ Message.Result = LogLink.m_pLink->OnCopyData(HWND(Message.WParam), cp); return; } switch(cp->dwData){ case 0: case 1: // Hamlogからの返信 if( sys.m_LogLink != 1 ) return; switch(LogLink.AnaData(&Log.m_sd, cp)){ case 115: UpdateTextData(); break; case 106: LogFreq->Text = Log.GetFreqString(Log.m_sd.band, Log.m_sd.fq); OnLogFreq(FALSE); break; } Message.Result = TRUE; break; case 0x80001212: // 周波数データの指定 if( cp->cbData && (cp->lpData != NULL) ){ char bf[16]; int len = cp->cbData; if( len > 15 ) len = 15; memcpy(bf, cp->lpData, len); bf[len] = 0; LogFreq->Text = bf; OnLogFreq(FALSE); } Message.Result = TRUE; break; case 0x80001217: // 送信/受信の切り替え if( cp->cbData && (cp->lpData != NULL) ){ if( *(const BYTE *)(cp->lpData) ){ if( !m_TX ){ ToTX(); } } else if( m_TX ){ ToRX(); } } Message.Result = TRUE; break; case 0x8000121a: // PTT if( cp->cbData && (cp->lpData != NULL) ){ BOOL bPTT = *(const BYTE *)(cp->lpData); SetPTT(bPTT); } break; case 0x8000121b: // status { DWORD dw = m_TX ? 1 : 0; Message.Result = dw; } break; default: Message.Result = FALSE; break; } } //--------------------------------------------------------------------------- int __fastcall OnGetChar(void) { CDump *pEdit = &MainVARI->m_Edit[MainVARI->m_SendingEdit]; if( MainVARI->IsRTTY() && MainVARI->m_fRttyWordOut ){ if( !MainVARI->m_fReqRX && !pEdit->IsWord() ){ return 0; } } int c = pEdit->GetChar(MainVARI->m_SendingEdit==MainVARI->m_CurrentEdit); if( c < 0 ) c = pEdit->GetChar(MainVARI->m_SendingEdit==MainVARI->m_CurrentEdit); if( c == '\r' ){ MainVARI->m_ModFSK.m_Encode.PutChar('\n'); } if( c >= 0 ) MainVARI->m_fSendChar = TRUE; return c; } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::GetHintStatus(LPCSTR pHint) { if( m_WaveFile.m_mode ){ m_fHintUpdate = TRUE; LPCSTR pFmt; if( sys.m_MsgEng ){ pFmt = m_WaveFile.m_mode == 1 ? "Sound playing... [%s] %u:%02u:%02u" : "Sound recording... [%s] %u:%02u:%02u (%.1lfMB)"; } else { pFmt = m_WaveFile.m_mode == 1 ? "サウンドを再生中... [%s] %u:%02u:%02u" : "サウンドを録音中... [%s] %u:%02u:%02u (%.1lfMB)"; } int mb = m_WaveFile.GetPos(); int h = int(mb * 0.5 / SAMPFREQ); int s = h % 60; h /= 60; int m = h % 60; h /= 60; sprintf(m_HintText, pFmt, m_WaveFile.m_Name.c_str(), h, m, s, double(mb)/(1024.0*1024.0)); return m_HintText; } else if( !strcmp(pHint, "%SQ") ){ m_fHintUpdate = TRUE; sprintf(m_HintText, sys.m_MsgEng ? "Squelch level (S/N) = %.1lfdB (Right click for menu)":"スケルチレベル(S/N) = %.1lfdB (右クリックでメニュー)", double((m_RxSet[0].m_SQLevel) / 100.0)); return m_HintText; } else if( !strcmp(pHint, "%SP") ){ if( SBFFT->Down || SBWater->Down ){ if( m_fSubWindow || m_Notches.m_Count ) m_fHintUpdate = TRUE; if( m_MouseNotch ){ return sys.m_MsgEng ? "Drag for changing Notch FREQ":"ノッチ周波数を変更(ドラッグ操作)"; } else if( m_fSubWindow && m_MouseSubChannel ){ sprintf(m_HintText, sys.m_MsgEng ? "Drag for changing RX FREQ (CH%d)":"チャンネル%uの受信キャリア周波数を変更(ドラッグ操作)", m_MouseSubChannel); return m_HintText; } else { return sys.m_MsgEng ? "RX FREQ(Left click), open the popup menu(Right click)":"左クリック=受信キャリア周波数, 右クリック=サブメニューを開く"; } } else if( m_WaveType ){ return sys.m_MsgEng ? "Amplitude ingredient" : "振幅成分表示"; } else if( m_RxSet[0].IsMFSK() || m_RxSet[0].IsQPSK() ){ return sys.m_MsgEng ? "Timing" : "タイミングを表示"; } else { return sys.m_MsgEng ? "Timing of the CODE" : "タイミングを符号単位で表示"; } } else if( !strcmp(pHint, "%SD") ){ if( m_RxSet[0].IsMFSK() ){ CDEMFSK *pDem = m_RxSet[0].m_pDem; char bf[64]; sprintf(m_HintText, "mfsk%.0f %s baud %u tones (R=1/2, K=7) %.2lf bps", pDem->m_MFSK_SPEED, StrDbl(bf, pDem->m_MFSK_SPEED), pDem->m_MFSK_TONES, pDem->m_MFSK_SPEED * pDem->m_MFSK_BITS * 0.5); } else { sprintf(m_HintText, sys.m_MsgEng ? "Baudrate (Standard = %sbps)" : "伝送速度(BPS) 標準は%s", IsRTTY() ? "45.45":"31.25"); } return m_HintText; } else if( !strcmp(pHint, "%TX") ){ sprintf(m_HintText, sys.m_MsgEng ? "Switch TX/RX - %s (Right click for TONE)" : "送信/受信の切り替え - %s (右クリックでTONE)", GetKeyName(sys.m_DefKey[kkTX])); return m_HintText; } else if( !strcmp(pHint, "%TXOFF") ){ sprintf(m_HintText, sys.m_MsgEng ? "Abort TX - %s":"強制的に受信に切り替え - %s", GetKeyName(sys.m_DefKey[kkTXOFF])); return m_HintText; } else if( !strcmp(pHint, "%RX") ){ if( IsRTTY() ){ m_fHintUpdate = TRUE; int cf = UdRxCarrier->Position; int mf = m_RxSet[0].m_pDem->m_RTTYShift * 0.5; if( m_RxSet[0].m_Mode == MODE_U_RTTY ) mf = -mf; mf = cf - mf; sprintf(m_HintText, sys.m_MsgEng ? "RX Carrier FREQ=%uHz, Mark=%uHz":"受信キャリア周波数=%uHz, マーク周波数=%uHz", cf, mf); return m_HintText; } else { return sys.m_MsgEng ? "RX Carrier FREQ" : "受信キャリア周波数"; } } else if( !strcmp(pHint, "%TXW") ){ if( m_fpText ){ return sys.m_MsgEng ? "Sending text file...":"テキストファイルを送信中..."; } else if( m_ReqMacroTimer || m_pMacroTimer ){ sprintf(m_HintText, sys.m_MsgEng ? "Repeating...(Interval=%ums)":"繰り返し中...(時間間隔=%dms)", m_ReqMacroTimer); return m_HintText; } else { return sys.m_MsgEng ? "TX window" :"送信画面"; } } else if( !strcmp(pHint, "%ATC") ){ m_fHintUpdate = TRUE; if( !SBATC->Enabled || (m_TX == txINTERNAL) ){ return sys.m_MsgEng ? "Sync timing":"同期タイミング"; } else { double ppm = m_RxSet[0].m_pDem->m_Decode.m_dTmg2; double fq = SAMPFREQ * ppm * 1e-6; sprintf(m_HintText, sys.m_MsgEng ? "Sync timing [%.0fppm, RxOffset=%.2lfHz]":"同期タイミング [%.0fppm, RxOffset=%.2lfHz]", ppm, fq); return m_HintText; } } else if( !strncmp(pHint, "%PB", 3) ){ int i; sscanf(pHint+3, "%d", &i); switch(i){ case 0: i = m_PlayBackTime[0]; break; case 1: i = m_PlayBackTime[1]; break; default: i = m_PlayBackTime[2]; break; } sprintf(m_HintText, sys.m_MsgEng ? "Replay the latest %u(sec)":"%u秒前からプレーバック", i); return m_HintText; } else if( !strncmp(pHint, "%M", 2) ){ int i; sscanf(pHint+2, "%d", &i); int f = i - UdMac->Position * (MACBUTTONXW*m_MacButtonVW); m_HintText[0] = 0; if( i < MACBUTTONMAX ){ if( (f >= 0) && (f <= 11) ){ sprintf(m_HintText, "F%u", f + 1); } else if( (f >= 12) && (f <= 23) ){ sprintf(m_HintText, "Shift+F%u", f + 1 - 12); } else if( (f >= 24) && (f <= 35) ){ sprintf(m_HintText, "Alt+F%u", f + 1 - 24); } else if( (f >= 36) && (f <= 47) ){ sprintf(m_HintText, "Ctrl+F%u", f + 1 - 36); } WORD dkey = GetKeyCode(m_HintText); if( (dkey == sys.m_DefKey[kkTX]) || (dkey == sys.m_DefKey[kkTXOFF]) ){ m_HintText[0] = 0; } } MACBUTTON *pList = &m_tMacButton[i]; if( pList->Text.IsEmpty() ){ strcat(m_HintText, sys.m_MsgEng ? " -Right click for registration":" -右クリックで登録"); } else { LPSTR t = &m_HintText[strlen(m_HintText)]; *t++ = ' '; *t++ = '['; LPCSTR p = pList->Text.c_str(); int n = 128; for( ; *p && n; n--, p++ ){ if( *p == '\t' ){ *t++ = ' '; } else if( (BYTE(*p) >= 0x20) ){ *t++ = *p; } } *t++ = ']'; *t = 0; } return m_HintText; } else { return pHint; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnFontChange(BOOL fTX) { if( fTX ){ m_Edit[m_CurrentEdit].SetFont(PCTX->Font); } else { m_Dump.SetFont(PCRX->Font); UpdateCharset(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DisplayHint(TObject *Sender) { m_HintKey = GetLongHint(Application->Hint); m_fHintUpdate = FALSE; DrawHint(); } //--------------------------------------------------------------------------- // サウンドカードのオープンのトライ(オープンできない時のリカバリ処理) void __fastcall TMainVARI::SoundTimer(TObject *Sender) { if( m_fSuspend ) return; BOOL r; if( m_RecoverSoundMode ){ r = ReOutOpen(); } else { r = OpenSound(FALSE); } if( r ){ m_pSoundTimer->Enabled = FALSE; delete m_pSoundTimer; m_pSoundTimer = NULL; } else { m_SoundMsgTimer -= m_pSoundTimer->Interval; if( m_SoundMsgTimer < 0 ){ m_fShowMsg = TRUE; } PBoxFFTPaint(NULL); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::LogLinkTimer(TObject *Sender) { if( LogLink.IsEnabled() ){ if( LogLink.TimerLogLink() ){ UpdateLogLink(); } if( LogLink.IsPolling() && LogLink.IsLink() && !m_TX ){ LogLink.EventGetFreq(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::RadioTimer(TObject *Sender) { if( m_pRadio != NULL ){ m_pRadio->Timer(m_TX, m_pRadioTimer->Interval); if( m_pRadio->IsFreqChange(AnsiString(LogFreq->Text).c_str()) ){ //JA7UDE 0428 LogFreq->Text = m_pRadio->GetFreq(); LogFreqChange(NULL); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::MacroTimer(TObject *Sender) { if( m_pMacroTimer ){ m_pMacroTimer->Enabled = FALSE; if( m_CurrentMacro >= 0 ){ m_fMacroRepeat = TRUE; SendButton(m_CurrentMacro); } else if( (m_CurrentMacro == -1) && IsXMenu(m_pCurrentMacroMenu) ){ m_fMacroRepeat = TRUE; OnXClick(m_pCurrentMacroMenu); } else { delete m_pMacroTimer; m_pMacroTimer = NULL; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::WheelTimer(TObject *Sender) { if( m_pWheelTimer ){ if( !m_pDump || !m_pDump->OnTimer() ){ m_pWheelTimer->Enabled; delete m_pWheelTimer; m_pWheelTimer = NULL; m_pDump = NULL; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnActiveApp(TMessage &Message) { if( LogLink.IsEnabled() ){ if( LogLink.TimerLogLink() ){ UpdateLogLink(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnActiveFormChange(TObject *Sender) { if( m_pHelp ){ if( !::IsWindowEnabled(m_pHelp->Handle) ) ::EnableWindow(m_pHelp->Handle, TRUE); } if( m_pEdit ){ if( !::IsWindowEnabled(m_pEdit->Handle) ) ::EnableWindow(m_pEdit->Handle, TRUE); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormCreate(TObject *Sender) { Application->OnMessage = OnAppMessage; Application->OnHint = DisplayHint; Screen->OnActiveFormChange = OnActiveFormChange; #if !DEBUG || SHOWERRCOUNT Application->OnException = AppException; #endif } //--------------------------------------------------------------------------- // アプリケーション例外 void __fastcall TMainVARI::AppException(TObject *Sender, Exception *E) { m_AppErr++; #if SHOWERRCOUNT sprintf(m_TextBuff, "%u (%u): %s", m_AppErr, sys.m_ErrPhase, E->Message.c_str()); Caption = m_TextBuff; #endif if( m_AppErr < 128 ){ if( m_AppErr == 3 ){ ErrorMB(sys.m_MsgEng? "The indistinct error was detected.": "予想外のエラーが発生しました. 回復を試みます." ); } if( m_FFT.m_FFTDIS ){ m_FFT.InitFFT(); m_FFT.m_FFTDIS = FALSE; } #if 0 if( !m_TX ){ m_Wave.InClose(); OpenSound(FALSE); } #endif } } //--------------------------------------------------------------------------- __fastcall TMainVARI::TMainVARI(TComponent* Owner) : TForm(Owner) { m_fInitFirst = TRUE; m_fDisEvent = TRUE; sys.m_dwVersion = ::GetVersion(); if( sys.m_dwVersion < 0x80000000 ){ sys.m_WinNT = TRUE; // NT,2000,XP,Vista OSVERSIONINFO osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osvi); if (osvi.dwMajorVersion == 5) { sys.m_WinVista=FALSE; } else { sys.m_WinVista=TRUE; } } else { // win95/98/ME sys.m_WinNT = FALSE; sys.m_WinVista=FALSE; } // 言語 sys.m_LCID = GetThreadLocale(); #if FORCELANG sys.m_wLang = FORCELANG; #else sys.m_wLang = LANGIDFROMLCID(sys.m_LCID); #endif if( sys.m_wLang == 0x0411 ){ // 日本語 sys.m_FontName = "MS Pゴシック"; sys.m_FontCharset = SHIFTJIS_CHARSET; sys.m_LogLink = 1; sys.m_MsgEng = FALSE; } else { sys.m_FontName = "Arial"; sys.m_FontCharset = ANSI_CHARSET; Log.m_LogSet.m_TimeZone = 'Z'; sys.m_LogLink = 0; sys.m_MsgEng = TRUE; } sys.m_fShowLangMsg = TRUE; sys.m_fBaseMBCS = SetLangFont(NULL, sys.m_wLang); sys.m_DefaultMode = sys.m_fBaseMBCS ? MODE_GMSK : MODE_N_BPSK; sys.m_fRestoreSubChannel = FALSE; sys.m_fFixWindow = FALSE; sys.m_rcWindow.left = Left; sys.m_rcWindow.top = Top; sys.m_rcWindow.right = Width; sys.m_rcWindow.bottom = Height; sys.m_AutoTimeOffset = 0; sys.m_TimeOffset; sys.m_TimeOffsetMin; sys.m_LogName = "NOCALL.MDT"; InitRADIOPara(); InitDefKey(); if( ParamCount() >= 0 ){ SetDirName(sys.m_BgnDir, AnsiString(ParamStr(0)).c_str()); //JA7UDE 0428 } else { SetCurDir(sys.m_BgnDir, sizeof(sys.m_BgnDir)); } strcpy(sys.m_SoundDir, sys.m_BgnDir); strcpy(sys.m_LogDir, sys.m_BgnDir); strcpy(sys.m_ExtLogDir, sys.m_BgnDir); strcpy(sys.m_TextDir, sys.m_BgnDir); sprintf(sys.m_MacroDir, "%sMacroTxt\\", sys.m_BgnDir); g_VariCode.Init(); // バリコードテーブルを初期化 LogLink.SetHandle(Handle, CM_CMML); sys.m_CallSign = "NOCALL"; sys.m_bFSKOUT = FALSE; sys.m_bINVFSK = FALSE; sys.m_PTTCOM = "NONE"; sys.m_PTTLock = TRUE; sys.m_fSendSingleTone = TRUE; sys.m_fPlayBack = FALSE; sys.m_PlayBackSpeed = 5; sys.m_fShowCtrlCode = FALSE; sys.m_MFSK_Center = FALSE; sys.m_MFSK_SQ_Metric = FALSE; sys.m_MacroError = FALSE; sys.m_MaxCarrier = 2700; sys.m_DecCutOff = 2700; memset(&sys.m_PosMacEdit, 0, sizeof(sys.m_PosMacEdit)); sys.m_MacBuffSize = 4096; sys.m_OnTimerInterval = 1000; m_QSOStart = 0; m_WaterNoiseL = 35; m_WaterNoiseH = 65; m_TX = txRX; m_AppErr = 0; m_pCom = NULL; m_pRadio = NULL; m_pHelp = NULL; m_pEdit = NULL; m_fReqRX = FALSE; m_pPlayBox = NULL; m_pSoundTimer = NULL; m_pLogLinkTimer = NULL; m_pRadioTimer = NULL; m_pMacroTimer = NULL; m_pWheelTimer = NULL; m_pMacroOnTimer = NULL; m_pDump = NULL; m_pClockView = NULL; sys.m_LoopBack = loopINTERNAL; m_fpText = NULL; m_fpTest = NULL; m_BufferSize = 2048; m_fHPF = FALSE; m_NotchFreq = 1750; // m_NotchTaps = 128; // m_NotchWidth = 1; // m_Notches.m_nBaseTaps = 128; // m_Notches.m_NotchWidth = 1; m_MouseNotch = 0; m_MouseSubChannel = FALSE; m_fSubWindow = FALSE; m_MouseDown = FALSE; m_CurrentMacro = 0; m_pCurrentMacroMenu = NULL; m_ReqMacroTimer = 0; m_fHintUpdate = FALSE; m_LostSoundRX = 0; m_LostSoundTX = 0; m_fShowMsg = FALSE; m_InfoMsgFlag = 0; m_cErrorMsg = FALSE; m_fKeyShift = FALSE; m_ReqAutoClear = FALSE; m_fSuspend = FALSE; m_fTone = FALSE; m_ReqAutoReturn = FALSE; m_ReqAutoNET = FALSE; m_pMacroPopup = NULL; m_MacroMenuNo = 0; m_fMacroRepeat = FALSE; m_ModGain = MODGAIN; m_FFTVType = 2; m_ScaleAsRigFreq = 0; m_ScaleDetails = TRUE; m_CurrentEdit = 0; m_SendingEdit = 0; m_WaveType = 0; m_fRttyWordOut = TRUE; m_ListBAUD = "15.625,20.0,31.25,62.5,93.75,125.0,250.0"; m_AFCWidth = 50; m_AFCLevel = 12; // SN=12dB m_ATCLevel = 15; // SN=15dB m_ATCSpeed = 0; m_ATCLimit = 25000; m_AFCKeyTimer = 0; m_FFTSmooth = 2; m_FFTW = 1000; m_fMBCS = TRUE; m_fConvAlpha = TRUE; m_PlayBackTime[0]=60; m_PlayBackTime[1]=30; m_PlayBackTime[2]=15; m_CPUBENCHType = -1; m_ParentMenu = NULL; m_strLogMode = ""; m_StatusUTC = FALSE; m_Priority = 1; m_RxSet[0].m_CarrierFreq = 1750; m_RxSet[0].Create(FALSE); m_RxSet[1].m_CarrierFreq = 1600; m_RxSet[2].m_CarrierFreq = 1900; m_RxSet[3].m_CarrierFreq = 1450; m_RxSet[4].m_CarrierFreq = 2050; m_RxSet[5].m_CarrierFreq = 2210; m_RxSet[6].m_CarrierFreq = 2210; m_RxSet[7].m_CarrierFreq = 2210; m_RxSet[8].m_CarrierFreq = 2210; for( int i = 1; i < RXMAX; i++ ){ m_RxSet[i].m_rcView.left = 10 + (i * 16); m_RxSet[i].m_rcView.top = 10 + (i * 16); m_RxSet[i].m_rcView.right = 500; m_RxSet[i].m_rcView.bottom = 124; } #if DEBUG sys.m_test = FALSE; sys.m_testSN = 13; sys.m_testName = "eproject.txt"; sys.m_testGain = 0; sys.m_testCarrier1 = 1750; sys.m_testCarrier2 = 0; sys.m_testDB2 = 0; sys.m_testQSBTime = 8000; sys.m_testQSBDB = 0; sys.m_test500 = FALSE; sys.m_testPhase = FALSE; sys.m_testClockErr = 0; m_pDebugButton = NULL; #endif sys.m_fAutoTS = FALSE; sys.m_EnableMouseWheel = TRUE; sys.m_SoundIDRX = -1; sys.m_SoundIDTX = -1; sys.m_OptionPage = 1; sys.m_EventIndex = 0; sys.m_fFontFam = FALSE; memset(sys.m_tFontFam, 0, sizeof(sys.m_tFontFam)); memset(m_fftbuf, 0, sizeof(m_fftbuf)); SetLangFont(PCRX->Font, sys.m_wLang); PCTX->Font->Assign(PCRX->Font); m_tWaterLevel[0] = 28; m_tWaterLevel[1] = 100; m_tWaterLevel[2] = 168; m_tWaterLevel[3] = 192; m_tWaterLevel[4] = 220; m_tWaterLevel[5] = 240; m_tWaterColset[0].c = clBlack; // back m_tWaterColset[1].d = RGB(0,255,255); // low m_tWaterColset[2].c = clWhite; // char m_tWaterColset[3].c = clRed; // WAKU m_tWaterColset[4].d = RGB(0,255,255); // RX m_tWaterColset[5].c = clBlue; // TX m_tWaterColset[6].c = clYellow; // mid-low m_tWaterColset[7].d = RGB(255,128,0); // mid m_tWaterColset[8].d = RGB(255,0,128); // mid-high m_tWaterColset[9].c = clRed; // Peak m_tWaterColset[10].c = clRed; // Peak m_tWaterColset[11].c = clRed; // Peak m_tFFTColset[0].c = clBlack; // back m_tFFTColset[1].d = RGB(0,255,0); // high m_tFFTColset[2].c = clWhite; // char m_tFFTColset[3].c = clGray; // Gage m_tFFTColset[4].d = RGB(0,255,255); // RX m_tFFTColset[5].c = clBlue; // TX m_MacButtonVW = 3; int i; char bf[256]; MACBUTTON *pList = m_tMacButton; for( i = 0; i < MACBUTTONALL; i++, pList++ ){ pList->pButton = NULL; sprintf(bf, "M%u", i + 1); pList->Name = bf; pList->Color = clBlack; pList->Text = ""; pList->Style = 0; } pList = m_tMacButton; pList->Name = "Clear"; pList->Text = "<%ClearTXW>"; pList++; pList->Name = "CQ"; // pList->Text = "<%ClearTXW><%TX>CQ CQ CQ de <%MyCall> <%MyCall> <%MyCall> pse (<%VARITYPE>) K\r\n<%RX>"; pList->Text = "<%ClearTXW><%TX>CQ CQ CQ de <%MyCall> <%MyCall> <%MyCall> pse "; if( sys.m_fBaseMBCS ) pList->Text += "(<%VARITYPE>) "; pList->Text += "K\r\n<%RX>"; pList++; pList->Name = "CQ2"; pList->Text = "<%ClearTXW><%TX>CQ CQ CQ de <%MyCall> <%MyCall> <%MyCall>\r\nCQ CQ CQ de <%MyCall> <%MyCall> <%MyCall> pse "; if( sys.m_fBaseMBCS ) pList->Text += "(<%VARITYPE>) "; pList->Text += "K\r\n<%RX>"; pList++; pList->Name = "1x1"; pList->Text = "<%NETON><%TX><%HisCall> de <%MyCall> pse K\r\n<%RX>"; pList++; pList->Name = "2x2"; pList->Text = "<%NETON><%TX><%HisCall> <%HisCall> de <%MyCall> <%MyCall> pse K\r\n<%RX>"; pList++; pList->Name = "RRR"; pList->Text = "\r\nRRR <%HisCall> de <%MyCall>\r\n"; if( sys.m_fBaseMBCS ) pList->Text += "--- <%VARITYPE> ---\r\n"; pList++; pList->Name = "BTU"; pList->Text = "BTU <%HisCall> de <%MyCall> KN\r\n<%RX>"; pList = &m_tMacButton[12]; pList->Name = "CWID"; pList->Text = "<%TX><%CWID=DE <%MyCall>><%RX><%EOF>"; pList->Style = FSUNDERLINE; pList++; pList->Name = "TU SK"; pList->Text = "<%TX><%CWID=TU:><%RX><%EOF>"; pList->Style = FSUNDERLINE; pList++; pList++; pList->Name = "0x2 - 2x4"; pList->Text = "<%DisableCR>\r\n#macro <%Menu= 0x2, 0x3, 0x4, -, 1x2, 1x3, 1x4, -, 2x3, 2x4>\r\n#if ValMenu\r\n#define\t_His\t<%Format=%c,<%Input$>>\r\n#define\t_My\t<%Format=%d,<%Find$=x,<%Input$>>>\r\n<%TX><%RX>\r\n#if !Is1stCR\r\n<%CR>\r\n#endif\r\n#if IsCall\r\n<%RepeatText=_His,<%HisCall> >\r\n#endif\r\nde\r\n<%RepeatText=_My, <%MyCall>>\r\n pse K<%CR>\r\n#endif\r\n<%EOF>"; sys.m_AS = "<%DisableCR>\r\n#if !IsTX\r\n<%AutoNET><%AutoReturn>\r\n#if ValPage!=4\r\n<%Page=4>\r\n#else\r\n<%Page=3>\r\n#endif\r\n<%ClearTXW>\r\n#endif\r\n<%TX><%CWID=@><%RX><%EOF>\r\n"; CBMode->Clear(); CBMode->DropDownCount = MODE_END; for( i = 0; i < MODE_END; i++ ){ CBMode->Items->Add(g_tDispModeTable[i]); } // InitStgFFT(&m_StgFFT); // m_StgFFT.Timer = 0; m_fftMX = 0; m_fftSC = 109; m_nRadioMenu = 4; m_RadioMenu[0].strTTL = "7.030 LSB (FT847)"; m_RadioMenu[0].strCMD = "\\$0070300001\\w10\\$0000000007\\w10"; m_RadioMenu[1].strTTL = "14.073 LSB (FT847)"; m_RadioMenu[1].strCMD = "\\$0140730001\\w10\\$0000000007\\w10"; m_RadioMenu[2].strTTL = "21.073 LSB (FT847)"; m_RadioMenu[2].strCMD = "\\$0210730001\\w10\\$0000000007\\w10"; m_RadioMenu[3].strTTL = "28.073 LSB (FT847)"; m_RadioMenu[3].strCMD = "\\$0280730001\\w10\\$0000000007\\w10"; ReadRegister(); m_Wave.SetSoundID(); SampleFreq(SAMPFREQ); UpdateModGain(); m_FFT.InitFFT(); InitWater(iniwBOTH); SetSystemFont(); UpdateLogHeight(); InitWFX(); m_Dec2.SetSampleFreq(m_fDec, SAMPFREQ); m_ModFSK.m_Encode.m_pFunc = OnGetChar; m_ModFSK.SetMFSKType(m_RxSet[0].m_MFSK_TYPE); m_ModFSK.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_RxSet[0].SetSampleFreq(DEMSAMPFREQ); InitCollect(m_RxSet, IsRTTY() ? 7 : 14); m_HPF.Create(ffHPF, 300, SAMPFREQ, 2, 1, 0.3); m_ModFSK.SetSpeed(m_RxSet[0].m_Speed); m_ModFSK.SetType(m_RxSet[0].m_Mode); m_RxSet[0].m_pDem->m_fRTTYFFT = m_RxSet[0].m_RTTYFFT; m_RxSet[0].SetMFSKType(m_RxSet[0].m_MFSK_TYPE); m_RxSet[0].SetMode(m_RxSet[0].m_Mode); m_RxSet[0].m_pDem->SetSpeed(m_RxSet[0].m_Speed); m_RxSet[0].SetCarrierFreq(UdRxCarrier->Position); m_ModFSK.SetCarrierFreq(UdTxCarrier->Position); m_Notches.Create(); SetATCSpeed(m_ATCSpeed); SetATCLimit(m_ATCLimit); if( sys.m_fPlayBack ) m_PlayBack.Init(m_BufferSize, SAMPBASE); #if DEBUG m_ModTest.SetMFSKType(m_RxSet[0].m_MFSK_TYPE); m_ModTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_ModTest.SetSpeed(m_RxSet[0].m_Speed); m_ModTest.SetType(m_RxSet[0].m_Mode); if( sys.m_testCarrier1 ) m_ModTest.SetCarrierFreq(sys.m_testCarrier1); if( sys.m_testCarrier1 ) m_BPF500.Create(96, ffBPF, SAMPFREQ+SAMPTXOFFSET, sys.m_testCarrier1-250, sys.m_testCarrier1+250, 60.0, 1.0); m_VCOTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); if( sys.m_testCarrier2 ) m_VCOTest.SetFreeFreq(sys.m_testCarrier2); #endif if( m_FFTW < 750 ){ m_FFTW = 500; SBFFT500->Down = TRUE; } else if( m_FFTW < 1500 ){ SBFFT1K->Down = TRUE; } else if( m_FFTW < 2500 ){ SBFFT2K->Down = TRUE; } else { m_FFTW = 3000; SBFFT3K->Down = TRUE; } m_FFTWindow = m_FFTW * FFT_SIZE / m_FFTSampFreq; CalcFFTCenter(UdRxCarrier->Position); for( i = 0; i < RXMAX; i++ ){ m_RxSet[i].m_AFCTimerW = 3 * SAMPFREQ / m_BufferSize; m_RxSet[i].m_AFCTimerN = 3 * SAMPFREQ / m_BufferSize; } m_pBitmapFFT = new Graphics::TBitmap; m_pBitmapFFT->Width = PBoxFFT->Width; m_pBitmapFFT->Height = PBoxFFT->Height; m_fftYW = m_pBitmapFFT->Height; m_fftXW = m_pBitmapFFT->Width; m_pBitmapLevel = new Graphics::TBitmap; m_pBitmapLevel->Width = PBoxLevel->Width; m_pBitmapLevel->Height = PBoxLevel->Height; m_levelYW = m_pBitmapLevel->Height; m_levelXW = m_pBitmapLevel->Width; m_pBitmapPF = new Graphics::TBitmap; m_pBitmapPF->Width = PBoxPF->Width; m_pBitmapPF->Height = PBoxPF->Height; m_pfXW = m_pBitmapPF->Width; m_pfYW = m_pBitmapPF->Height; m_pfXC = m_pfXW / 2; m_PFTimer = 0; CreateWaterColors(); Draw(FALSE); DrawLevel(FALSE); DrawPF(FALSE); UpdateCharset(); m_Dump.Create(PCRX->Handle, PCRX, PBoxRX, PCRX->Font, SBarRX, 1024); #if DEBUG m_Edit[0].Create(PCTX->Handle, PCTX, PBoxTX, PCTX->Font, SBarTX, 256); #else m_Edit[0].Create(PCTX->Handle, PCTX, PBoxTX, PCTX->Font, SBarTX, 512); #endif m_Edit[0].SetCursorType(csCARET); m_Edit[0].SetMBCS(&m_RxSet[0].m_MBCS); m_Edit[0].m_fConvAlpha = m_fConvAlpha; m_Dump.SetCursorType(csSTATIC); m_Dump.SetRTTY(IsRTTY()); m_Dump.ShowCtrl(sys.m_fShowCtrlCode); SetTXCaption(); UpdateTitle(); if( m_MacButtonVW != 3 ){ UpdateMacButtonVW(m_MacButtonVW); } else { SetMacButtonMax(); CreateMacButton(); } if( m_Priority ) UpdatePriority(-m_Priority); OpenCom(); OpenRadio(); UpdateSpeedList(m_RxSet[0].m_Mode); UpdateUI(); UpdateWaveCaption(); SampleStatus(); PageStatus(); UpdateMode(m_RxSet, 0); if( sys.m_fFixWindow ){ SetBounds(sys.m_rcWindow.left, sys.m_rcWindow.top, sys.m_rcWindow.right, sys.m_rcWindow.bottom); if( sys.m_WindowState == wsMaximized ) WindowState = wsMaximized; } if( KVMX->Checked ) CreateMacExButton(); m_fDisEvent = FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetSystemFont(void) { Font->Name = sys.m_FontName; Font->Charset = sys.m_FontCharset; sys.m_MsgEng = (sys.m_FontCharset != SHIFTJIS_CHARSET); KECall->Caption = "<%HisCall> \t(&H)"; KEName->Caption = "<%HisName>\t(&N)"; KEDear->Caption = "<%DearName>\t(&D)"; KERST->Caption = "<%HisRST> \t(&R)"; KEMyCall->Caption = "<%MyCall> \t(&M)"; KESeq->Caption = "<%HisCall> de <%MyCall> \t(&S)"; KEFinal->Caption = "<%CR>CUL, TU SK...<%CR><%RX>\t(&F)"; if( sys.m_MsgEng ){ KF->Caption = "&File"; KE->Caption = "&Edit"; KV->Caption = "&View"; KO->Caption = "&Options"; KH->Caption = "&Help"; KFL->Caption = "Save RX log file (Filename = &Date)"; KFLR->Caption = "Show &RX log file..."; KFS->Caption = "Send &Text file..."; KFLO->Caption = "&Open QSO Log file..."; KFLF->Caption = "Save QSO data no&w"; KFMS->Caption = "&Save all Macros"; KFML->Caption = "&Load all Macros"; KFWST->Caption = "Sound recording (&Filename = Time stamp)"; KFWS->Caption = "So&und recording..."; KFRS->Caption = "Sound &Playing..."; KFES->Caption = "&Close recording or playing"; KFX->Caption = "E&xit MMVARI"; KEX->Caption = "Cu&t and copy to the clipboard"; KECP->Caption = "&Copy to the clipboard"; KEP->Caption = "&Paste from the clipboard"; KEC->Caption = "Character code &List..."; KVF->Caption = "&FFT scale"; KVF3->Caption = "&Square amplitude"; KVFS->Caption = "FFT S&moothing"; KVSF->Caption = "Frequency &Scale"; KVSFT->Caption = "&Tone(AF) frequencies"; KVSFR->Caption = "&Rig(RF) frequencies"; KVSD->Caption = "&Detailed scale"; KVWA->Caption = "Waterfall &AGC"; KVSP->Caption = "Show sound &Playing panel"; KVS->Caption = "Sub &Channels"; KVCR->Caption = "Clear &RX window"; KVCT->Caption = "Clear &TX window"; KVM->Caption = "Row of Macro &Buttons"; KVMX->Caption = "S&how expansion macro buttons"; KVLA->Caption = "Log panel size &Extension"; KVL->Caption = "Show &Log list..."; KOVO->Caption = "Soundcard output le&vel..."; KOVI->Caption = "Soundcard &Input level..."; KOAI->Caption = "Add CR/LF at the &Beginning"; KOAO->Caption = "Add CR/LF at the &Ending"; KORS->Caption = "&Way to send for RTTY"; KORSC->Caption = "&Character out"; KORSW->Caption = "&Word out"; KOV->Caption = "Show V&ARICODE mapping..."; KOA->Caption = "&Calibrating the SoundCard..."; KOR->Caption = "Setup &Radio command..."; KOL->Caption = "Setup &Logging..."; KOO->Caption = "Setup &MMVARI..."; KR->Caption = "&RadioCommand"; KRM->Caption = "Edit menu"; KRL->Caption = "&Load..."; KRO->Caption = "&Setup..."; KRADD->Caption = "&Add menu..."; KHA->Caption = "About &Project..."; KHO->Caption = "MMVARI &Operations..."; KHS->Caption = "Macro &Samples..."; KHH->Caption = "&History..."; KHN->Caption = "JE3HHT WebSite(Japanese)..."; KHJ->Caption = "&JARTS Web site..."; KHM->Caption = "MM Hamsoft Web Site..."; KHM->Hint = "http://mmhamsoft.amateur-radio.ca/"; KHV->Caption = "&About MMVARI..."; KRXNAME->Caption = "Put into the Name"; KRXQTH->Caption = "Put into the QTH"; KRXNOTE->Caption = "Put into the Note"; KRXCALL->Caption = "Put into the Callsign"; KRXMY->Caption = "Put into the MyRST"; KRXADDMY->Caption = "Add into the MyRST"; KRXADDNAME->Caption = "Add into the Name"; KRXADDNOTE->Caption = "Add into the Note"; KRXADDQSL->Caption = "Add into the QSL"; KRXCopy->Caption = "Copy to the clipboard"; KRXINV->Caption = "Swap LTR/FIG (for RTTY)"; KSAS->Caption = "Send &AS in CW on here"; KSTX->Caption = "Set TX Carrier FREQ on here"; KSRX->Caption = "Set RX Carrier FREQ on here"; KSN->Caption = "Set Notch on here"; KSNR->Caption = "Delete this notch"; KSNRA->Caption = "Delete all notches"; KSS->Caption = "Open sub channel on here"; KSCan->Caption = "Cancel"; KRWC->Caption = "&Clear window"; KRWE->Caption = "Open &Editer..."; KRWT->Caption = "Move to the &Top"; KRWB->Caption = "Move to the &Bottom"; KRSC->Caption = "Show CTRL code"; Splitter->Hint = "Drag & Drop for to change size of TX window"; CBMode->Hint = "Choose mode"; PLog->Hint = "Log panel (Right click for size extension/reduction)"; SBFFT->Hint = "Spectrum scope"; SBWater->Hint = "Waterfall scope"; SBWave->Hint = "Timing/Amplitude scope (Right click for switch)"; PF->Hint = "AFC level"; SBFFT500->Hint = "500Hz width"; SBFFT1K->Hint = "1KHz width"; SBFFT2K->Hint = "2KHz width"; SBFFT3K->Hint = "3KHz width"; SBBPFW->Hint = "Broad (Right click for the characteristic display)"; SBBPFM->Hint = "Narrow (Right click for the characteristic display)"; SBBPFN->Hint = "Sharp (Right click for the characteristic display)"; SBBPFS->Hint = "Very sharp (Right click for the characteristic display)"; SBAFC->Hint = "Auto frequency control"; SBNET->Hint = "TX Carrier FREQ = RX Carrier FREQ"; CBTxCarrier->Hint = "TX Carrier FREQ"; SBATC->Hint = "Auto timing control (Right click for clear)"; SBInit->Hint = "Clear current QSO data"; SBQSO->Hint = "Start/End logging"; SBData->Hint = "Show current data"; SBFind->Hint = "Find callsign"; SBList->Hint = "Show log list"; SBM->Hint = "Recent inquiry callsign"; HisCall->Hint = "His/her callsign"; HisName->Hint = "His/her name"; HisRST->Hint = "His/her RST"; MyRST->Hint = "My RST"; HisQTH->Hint = "His/her QTH"; EditNote->Hint = "Note (Remarks)"; EditQSL->Hint = "QSL information or Note"; LogFreq->Hint = "FREQ(MHz)"; PBoxRX->Hint = "Left (or Right) click for capturing window text"; UdMac->Hint = "Switch button page (Right click for seeking top)"; } CreateSubMenu(); HisRST->SelLength = 0; MyRST->SelLength = 0; LogFreq->SelLength = 0; for( int i = 0; i < KE->Count; i++ ){ TMenuItem *pMenu; BOOL f = FALSE; if( PupTX->Items->Count <= i ){ pMenu = new TMenuItem(PupTX); f = TRUE; } else { pMenu = PupTX->Items->Items[i]; } pMenu->Caption = KE->Items[i]->Caption; pMenu->OnClick = KE->Items[i]->OnClick; pMenu->ShortCut = KE->Items[i]->ShortCut; if( f ) PupTX->Items->Add(pMenu); } #if DEBUG EATC->Color = clWhite; #endif } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateCharset(void) { SetMBCP(PCRX->Font->Charset); m_RxSet[0].m_MBCS.Create(); m_RxSet[0].m_MBCS.SetCharset(PCRX->Font->Charset); m_RxSet[0].m_fJA = (PCRX->Font->Charset == SHIFTJIS_CHARSET); m_ModFSK.m_Encode.m_fJA = m_RxSet[0].m_fJA; LPCSTR pKey; switch(PCRX->Font->Charset){ case SHIFTJIS_CHARSET: pKey = "JA"; m_fMBCS = TRUE; // KJA->Checked = TRUE; break; case JOHAB_CHARSET: case HANGEUL_CHARSET: pKey = "HL"; m_fMBCS = TRUE; // KHL->Checked = TRUE; break; case CHINESEBIG5_CHARSET: // pKey = "BV"; m_fMBCS = TRUE; // KBV->Checked = TRUE; break; case 134: // 簡略 pKey = "BY"; m_fMBCS = TRUE; // KBY->Checked = TRUE; break; case ANSI_CHARSET: pKey = "ANSI"; m_fMBCS = FALSE; // KANSI->Checked = TRUE; break; case SYMBOL_CHARSET: pKey = "SYM"; m_fMBCS = FALSE; // KMISC->Checked = TRUE; break; default: pKey = "Other"; m_fMBCS = FALSE; // KMISC->Checked = TRUE; break; } DrawStatus(statusVARI, pKey); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormDestroy(TObject *Sender) { if( m_fpText ) fclose(m_fpText); if( m_fpTest ) fclose(m_fpTest); m_fpText = m_fpTest = NULL; if( m_pHelp ) delete m_pHelp; if( m_pEdit ) delete m_pEdit; if( m_pPlayBox ) delete m_pPlayBox; if( m_pClockView ) delete m_pClockView; if( m_pMacroPopup ) delete m_pMacroPopup; delete m_pBitmapFFT; delete m_pBitmapLevel; m_pBitmapFFT = NULL; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormCloseQuery(TObject *Sender, bool &CanClose) { #if !DEBUG || SHOWERRCOUNT Application->OnException = NULL; #endif Screen->OnActiveFormChange = NULL; DoEvent(macOnExit); SBTXOFFClick(NULL); sys.m_rcWindow.left = Left; sys.m_rcWindow.top = Top; sys.m_rcWindow.right = Width; sys.m_rcWindow.bottom = Height; m_Dump.CloseLogFile(); for( int i = 0; i < RXMAX; i++ ){ m_RxSet[i].Delete(); } WriteRegister(); sys.m_EnableMouseWheel = FALSE; if( m_pSoundTimer ) delete m_pSoundTimer; if( m_pLogLinkTimer ) delete m_pLogLinkTimer; if( m_pRadioTimer ) delete m_pRadioTimer; if( m_pMacroTimer ) delete m_pMacroTimer; if( m_pWheelTimer ) delete m_pWheelTimer; if( m_pMacroOnTimer ) delete m_pMacroOnTimer; m_Wave.OutAbort(); m_Wave.InClose(); if( m_pCom ) delete m_pCom; if( m_pRadio ) delete m_pRadio; UpdatePriority(0); Log.Close(); Log.DoBackup(); CanClose = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateTitle(void) { if( !Log.IsOpen() || !strcmp(sys.m_CallSign.c_str(), "NOCALL") ){ strcpy(m_TextBuff, VERTTL); } else { sprintf(m_TextBuff, "%s (%s) - "VERTTL2, sys.m_CallSign.c_str(), Log.GetName()); } if( LogLink.IsLink() ){ char bf[256]; sprintf(bf, " [Link to %s]", LogLink.GetSessionName()); strcat(m_TextBuff, bf); } #if DEBUG strcat(m_TextBuff, " (Running on debug mode)"); sprintf(&m_TextBuff[strlen(m_TextBuff)], " %08X:%d", m_RxSet[0].m_pDem, m_RxSet[0].m_pDem->m_DEBUG); #endif #if SHOWERRCOUNT strcat(m_TextBuff, " (Enable ERRMSG)"); #endif Caption = m_TextBuff; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdatePriority(int Priority) { if( Priority == m_Priority ) return; m_Priority = ABS(Priority); if( m_TX ) ToRX(); BOOL f = m_Wave.IsInOpen(); if( f ) m_Wave.InClose(); HANDLE hThread = GetCurrentThread(); switch(m_Priority){ case 1: ::SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL); break; case 2: ::SetThreadPriority(hThread, THREAD_PRIORITY_HIGHEST); break; default: ::SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL); break; } if( f ) OpenSound(FALSE); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ReadRegister(void) { char bf[256]; sprintf(bf, "%sMmvari.ini", sys.m_BgnDir); TMemIniFile *pIniFile = new TMemIniFile(bf); int i; // サウンドカード AnsiString as; sprintf(bf, "%.2lf", SAMPFREQ); as = pIniFile->ReadString("SoundCard", "Clock", bf); double fq; sscanf(as.c_str(), "%lf", &fq); LimitDbl(&fq, MIN_SAMP, MAX_SAMP); SampleFreq(fq); sprintf(bf, "%.2lf", SAMPTXOFFSET); as = pIniFile->ReadString("SoundCard", "TxOffset", bf); sscanf(as.c_str(), "%lf", &fq); if( fabs(fq) <= 500.0 ){ SAMPTXOFFSET = fq; } m_Wave.m_InFifoSize = pIniFile->ReadInteger("SoundCard", "RxFIFO", m_Wave.m_InFifoSize); m_Wave.m_OutFifoSize = pIniFile->ReadInteger("SoundCard", "TxFIFO", m_Wave.m_OutFifoSize); m_Wave.m_SoundStereo = pIniFile->ReadInteger("SoundCard", "Source", m_Wave.m_SoundStereo); sys.m_SoundIDRX = pIniFile->ReadString("SoundCard", "ID", sys.m_SoundIDRX); sys.m_SoundIDTX = pIniFile->ReadString("SoundCard", "IDTX", sys.m_SoundIDTX); // sys.m_SoundMMW = pIniFile->ReadString("SoundCard", "MMW", sys.m_SoundMMW); LimitInt(&m_Wave.m_InFifoSize, 4, 32); LimitInt(&m_Wave.m_OutFifoSize, 4, 32); /* SYSTEM */ int IniSchema = pIniFile->ReadInteger("System", "Schema", 0); m_Priority = pIniFile->ReadInteger("System", "Priority", m_Priority); sys.m_FontName = pIniFile->ReadString("System", "FontName", sys.m_FontName); sys.m_FontCharset = (BYTE)pIniFile->ReadInteger("System", "FontCharset", sys.m_FontCharset); /* Window */ sys.m_fFixWindow = pIniFile->ReadInteger("Window", "Fixed", sys.m_fFixWindow); sys.m_rcWindow.left = pIniFile->ReadInteger("Window", "Left", sys.m_rcWindow.left); sys.m_rcWindow.top = pIniFile->ReadInteger("Window", "Top", sys.m_rcWindow.top); sys.m_rcWindow.right = pIniFile->ReadInteger("Window", "Width", sys.m_rcWindow.right); sys.m_rcWindow.bottom = pIniFile->ReadInteger("Window", "Height", sys.m_rcWindow.bottom); sys.m_WindowState = pIniFile->ReadInteger("Window", "WindowState", wsNormal); KVLA->Checked = pIniFile->ReadInteger("Window", "LogExtension", KVLA->Checked); sys.m_fRestoreSubChannel = pIniFile->ReadInteger("Window", "RestoreSubChannels", sys.m_fRestoreSubChannel); /* Folder */ as = pIniFile->ReadString("Folder", "Sound", sys.m_SoundDir); strcpy(sys.m_SoundDir, as.c_str()); as = pIniFile->ReadString("Folder", "Log", sys.m_LogDir); strcpy(sys.m_LogDir, as.c_str()); as = pIniFile->ReadString("Folder", "ExtLog", sys.m_ExtLogDir); strcpy(sys.m_ExtLogDir, as.c_str()); as = pIniFile->ReadString("Folder", "Text", sys.m_TextDir); strcpy(sys.m_TextDir, as.c_str()); /* PTT */ sys.m_PTTCOM = pIniFile->ReadString("PTT", "Name", sys.m_PTTCOM); sys.m_PTTLock = pIniFile->ReadInteger("PTT", "Lock", sys.m_PTTLock); sys.m_bFSKOUT = pIniFile->ReadInteger("PTT", "OUTFSK", sys.m_bFSKOUT); sys.m_bINVFSK = pIniFile->ReadInteger("PTT", "INVFSK", sys.m_bINVFSK); /* TX */ sys.m_LoopBack = pIniFile->ReadInteger("TX", "LoopBack", sys.m_LoopBack); int f = pIniFile->ReadInteger("TX", "AutoCR", KOAI->Checked | (KOAO->Checked << 1)); KOAI->Checked = (f & 1); KOAO->Checked = (f & 2); UdTxCarrier->Position = (short)pIniFile->ReadInteger("TX", "Carrier", UdTxCarrier->Position); SBNET->Down = pIniFile->ReadInteger("TX", "NET", SBNET->Down); m_ModGain = pIniFile->ReadInteger("TX", "ModGain", m_ModGain); m_fRttyWordOut = pIniFile->ReadInteger("TX", "RttyWordOut", m_fRttyWordOut); as = pIniFile->ReadString("TX", "Mode", g_tDispModeTable[sys.m_DefaultMode]); m_RxSet[0].m_Mode = GetModeIndex(as.c_str()); CBMode->ItemIndex = m_RxSet[0].m_Mode; as = pIniFile->ReadString("TX", "Speed", "31.25"); sscanf(as.c_str(), "%lf", &m_RxSet[0].m_Speed); LimitDbl(&m_RxSet[0].m_Speed, MIN_SPEED, MAX_SPEED); m_fConvAlpha = pIniFile->ReadInteger("TX", "ConvAlpha", m_fConvAlpha); m_RxSet[0].m_MFSK_TYPE = pIniFile->ReadInteger("TX", "MFSK_TYPE", m_RxSet[0].m_MFSK_TYPE); SetCBSpeed(); sys.m_MFSK_Center = pIniFile->ReadInteger("TX", "MFSK_CENTER", sys.m_MFSK_Center); sys.m_fSendSingleTone = pIniFile->ReadInteger("TX", "SendSingleTone", sys.m_fSendSingleTone); /* RX */ UdRxCarrier->Position = (short)pIniFile->ReadInteger("RX", "Carrier", UdRxCarrier->Position); SetBPFType(pIniFile->ReadInteger("RX", "BPF", GetBPFType())); SBAFC->Down = pIniFile->ReadInteger("RX", "AFC", SBAFC->Down); m_RxSet[0].m_pDem->m_fAFC = m_RxSet[0].m_fAFC = SBAFC->Down; SBATC->Down = pIniFile->ReadInteger("RX", "ATC", SBATC->Down); m_RxSet[0].m_pDem->m_Decode.m_fATC = SBATC->Down; m_RxSet[0].m_SQLevel = pIniFile->ReadInteger("RX", "SQLevel", m_RxSet[0].m_SQLevel); m_AFCWidth = pIniFile->ReadInteger("RX", "AFCWidth", m_AFCWidth); m_AFCLevel = pIniFile->ReadInteger("RX", "AFCLevel", m_AFCLevel); if( IniSchema < 3 ){ // For old version if( m_AFCWidth > 50 ) m_AFCWidth = 50; if( m_AFCLevel < 12 ) m_AFCLevel = 12; } m_fHPF = pIniFile->ReadInteger("RX", "HPF", m_fHPF); m_ATCLevel = pIniFile->ReadInteger("RX", "ATCLevel", m_ATCLevel); m_ATCSpeed = pIniFile->ReadInteger("RX", "ATCSpeed", m_ATCSpeed); m_ATCLimit = pIniFile->ReadInteger("RX", "ATCLimit", m_ATCLimit); sys.m_fAutoTS = pIniFile->ReadInteger("RX", "SWL_TS", sys.m_fAutoTS); m_NotchFreq = pIniFile->ReadInteger("RX", "NotchFreq", m_NotchFreq); sys.m_fPlayBack = pIniFile->ReadInteger("RX", "PlayBack", sys.m_fPlayBack); sys.m_PlayBackSpeed = pIniFile->ReadInteger("RX", "PlayBackSpeed", sys.m_PlayBackSpeed); sys.m_MFSK_SQ_Metric = pIniFile->ReadInteger("RX", "MFSK_SQ_METRIC", sys.m_MFSK_SQ_Metric); m_RxSet[0].m_RTTYFFT = pIniFile->ReadInteger("RX", "RTTY_FFT", m_RxSet[0].m_RTTYFFT); /* View */ m_FFTW = pIniFile->ReadInteger("FFT", "Width", m_FFTW); m_FFTSmooth = pIniFile->ReadInteger("FFT", "Smooth", m_FFTSmooth); m_FFTVType = pIniFile->ReadInteger("FFT", "Type", m_FFTVType); if( m_FFTSmooth < 2 ) m_FFTSmooth = 2; m_FFT.m_FFTGain = (m_FFTVType < 2) ? 0 : 1; for( i = 0; i < 12; i++ ){ sprintf(bf, "Col%u", i + 1); if( i < 6 ){ m_tFFTColset[i].d = pIniFile->ReadInteger("Spec", bf, m_tFFTColset[i].d); } m_tWaterColset[i].d = pIniFile->ReadInteger("WF", bf, m_tWaterColset[i].d); if( i < 6 ){ sprintf(bf, "Lvl%u", i + 1); m_tWaterLevel[i] = pIniFile->ReadInteger("WF", bf, m_tWaterLevel[i]); } } SetDrawType(pIniFile->ReadInteger("View", "DrawType", GetDrawType())); m_WaveType = pIniFile->ReadInteger("View", "WaveForm", m_WaveType); m_ScaleAsRigFreq = pIniFile->ReadInteger("View", "RigFreqScale", m_ScaleAsRigFreq); m_ScaleDetails = pIniFile->ReadInteger("View", "ScaleDetails", m_ScaleDetails); if( IniSchema >= 2 ){ KVWA->Checked = pIniFile->ReadInteger("View", "WaterAGC", FALSE); } /* RXW */ for( i = 0; i < 5; i++ ){ sprintf(bf, "Color%d", i + 1); m_Dump.m_Color[i].d = pIniFile->ReadInteger("RXW", bf, m_Dump.m_Color[i].d); } LoadFontFromInifile(PCRX->Font, "RXW", pIniFile); m_StatusUTC = pIniFile->ReadInteger("RXW", "StatusUTC", m_StatusUTC); sys.m_EnableMouseWheel = pIniFile->ReadInteger("RXW", "MouseWheel", sys.m_EnableMouseWheel); sys.m_fShowCtrlCode = pIniFile->ReadInteger("RXW", "ShowCtrl", sys.m_fShowCtrlCode); /* TXW */ for( i = 0; i < 4; i++ ){ sprintf(bf, "Color%d", i + 1); m_Edit[0].m_Color[i].d = pIniFile->ReadInteger("TXW", bf, m_Edit[0].m_Color[i].d); for( int j = 1; j < 4; j++ ){ m_Edit[j].m_Color[i] = m_Edit[0].m_Color[i]; } } for( i = 0; i < 4; i++ ){ m_Edit[i].m_Color[4] = m_Edit[i].m_Color[0]; } LoadFontFromInifile(PCTX->Font, "TXW", pIniFile); PCRX->Color = m_Dump.m_Color[0].c; PCTX->Color = m_Edit[0].m_Color[0].c; /* Macro */ sys.m_CallSign = pIniFile->ReadString("Macro", "CallSign", sys.m_CallSign); m_MacButtonVW = pIniFile->ReadInteger("Macro", "ButtonRow", m_MacButtonVW); UdMac->Position = (short)pIniFile->ReadInteger("Macro", "ButtonPos", UdMac->Position); LoadMacro(pIniFile); AnsiString ws; CrLf2Yen(as, sys.m_AS); ws = pIniFile->ReadString("Macro", "CWAS", as); Yen2CrLf(sys.m_AS, ws); for( i = 0; i < macOnEnd; i++ ){ CrLf2Yen(as, sys.m_MacEvent[i]); ws = pIniFile->ReadString("Macro", g_tMacEvent[i], as); Yen2CrLf(sys.m_MacEvent[i], ws); } KVMX->Checked = pIniFile->ReadInteger("Macro", "Expand", FALSE); /* Log */ Log.m_FileName = pIniFile->ReadString("Log", "Name", ""); if( Log.m_FileName.IsEmpty() ){ as = sys.m_CallSign; Log.MakePathName(ClipCall(as.c_str())); } else { Log.MakeName(Log.m_FileName.c_str()); } /* LogSet */ Log.ReadIniFile("LogSet", pIniFile); sys.m_LogLink = pIniFile->ReadInteger("LogSet", "LogLink", sys.m_LogLink); LogLink.LoadMMLink(pIniFile); LogLink.SetPolling(pIniFile->ReadInteger("LogSet", "LinkPoll", 0)); LogLink.SetPTTEnabled(pIniFile->ReadInteger("LogSet", "LinkPTT", FALSE)); LoadRADIOSetup(pIniFile); for( i = 0; i < kkEOF; i++ ){ sprintf(bf, "K%u", i+1); sys.m_DefKey[i] = (WORD)pIniFile->ReadInteger("DefKey", bf, sys.m_DefKey[i]); } if( !IniSchema && (sys.m_DefKey[1] == VK_ESCAPE) ) sys.m_DefKey[1] = VK_PAUSE; /* Sub channel */ CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++, pRxSet++ ){ sprintf(bf, "Channel%u", i); pRxSet->m_fShowed = pIniFile->ReadInteger(bf, "Show", FALSE); as = pIniFile->ReadString(bf, "Mode", g_tDispModeTable[sys.m_DefaultMode]); pRxSet->m_Mode = GetModeIndex(as.c_str()); pRxSet->m_CarrierFreq = pIniFile->ReadInteger(bf, "Carrier", pRxSet->m_CarrierFreq); LimitInt(&pRxSet->m_CarrierFreq, MIN_CARRIER, sys.m_MaxCarrier); pRxSet->m_WaterW = pIniFile->ReadInteger(bf, "WaterWidth", pRxSet->m_WaterW); LimitInt(&pRxSet->m_WaterW, 200, 800); pRxSet->m_rcView.left = pIniFile->ReadInteger(bf, "Left", pRxSet->m_rcView.left); pRxSet->m_rcView.top = pIniFile->ReadInteger(bf, "Top", pRxSet->m_rcView.top); pRxSet->m_rcView.right = pIniFile->ReadInteger(bf, "Width", pRxSet->m_rcView.right); pRxSet->m_rcView.bottom = pIniFile->ReadInteger(bf, "Height", pRxSet->m_rcView.bottom); LoadFontFromInifile(&pRxSet->m_FontData, bf, pIniFile); pRxSet->m_RTTYFFT = pIniFile->ReadInteger(bf, "RTTYFFT", pRxSet->m_RTTYFFT); pRxSet->m_MFSK_TYPE = pIniFile->ReadInteger(bf, "MFSK_TYPE", pRxSet->m_MFSK_TYPE); as = pIniFile->ReadString(bf, "Speed", "31.25"); sscanf(as.c_str(), "%lf", &pRxSet->m_Speed); LimitDbl(&pRxSet->m_Speed, MIN_SPEED, MAX_SPEED); pRxSet->m_fAFC = pIniFile->ReadInteger(bf, "AFC", TRUE); } //RadioMenu m_nRadioMenu = pIniFile->ReadInteger("RadioMenu", "Menus", m_nRadioMenu); for( i = 0; i < m_nRadioMenu; i++ ){ sprintf(bf, "Cap%d", i+1); m_RadioMenu[i].strTTL = pIniFile->ReadString("RadioMenu", bf, m_RadioMenu[i].strTTL); sprintf(bf, "Cmd%d", i+1); m_RadioMenu[i].strCMD = pIniFile->ReadString("RadioMenu", bf, m_RadioMenu[i].strCMD); } /* Callsign */ for( i = 0; i < STGCALLMAX; i++ ){ sprintf(bf, "C%d", i+1); as = pIniFile->ReadString("Calls", bf, ""); if( as.IsEmpty() ) break; LPSTR p; for( p = as.c_str(); *p; p++ ){ if( *p == '_' ) *p = '\t'; } TMenuItem *pm = new TMenuItem(PupCalls); pm->Caption = as.c_str(); pm->RadioItem = FALSE; pm->OnClick = KCallClick; pm->Checked = FALSE; pm->Enabled = TRUE; PupCalls->Items->Add(pm); } m_MacroVal.ReadInifile(pIniFile, "MacroVal"); sys.m_fShowLangMsg = pIniFile->ReadInteger("Misc", "ShowLangMsg", sys.m_fShowLangMsg); #if DEBUG //debug sys.m_testSN = pIniFile->ReadInteger("DEBUG", "testSN", sys.m_testSN); sys.m_testName = pIniFile->ReadString("DEBUG", "testName", sys.m_testName); sys.m_testGain = pIniFile->ReadInteger("DEBUG", "testGain", sys.m_testGain); sys.m_testCarrier1 = pIniFile->ReadInteger("DEBUG", "testCarrier1", sys.m_testCarrier1); sys.m_testCarrier2 = pIniFile->ReadInteger("DEBUG", "testCarrier2", sys.m_testCarrier2); sys.m_testDB2 = pIniFile->ReadInteger("DEBUG", "testDB2", sys.m_testDB2); sys.m_testQSBTime = pIniFile->ReadInteger("DEBUG", "testQSBTime", sys.m_testQSBTime); sys.m_testQSBDB = pIniFile->ReadInteger("DEBUG", "testQSBDB", sys.m_testQSBDB); sys.m_test500 = pIniFile->ReadInteger("DEBUG", "test500", sys.m_test500); sys.m_testPhase = pIniFile->ReadInteger("DEBUG", "testPhase", sys.m_testPhase); sys.m_testClockErr = pIniFile->ReadInteger("DEBUG", "testClockErr", sys.m_testClockErr); #endif delete pIniFile; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::WriteRegister(void) { int i; char bf[256]; sprintf(bf, "%sMmvari.ini", sys.m_BgnDir); TMemIniFile *pIniFile = new TMemIniFile(bf); // サウンドカード sprintf(bf, "%.2lf", SAMPFREQ); pIniFile->WriteString("SoundCard", "Clock", bf); sprintf(bf, "%.2lf", SAMPTXOFFSET); pIniFile->WriteString("SoundCard", "TxOffset", bf); pIniFile->WriteInteger("SoundCard", "RxFIFO", m_Wave.m_InFifoSize); pIniFile->WriteInteger("SoundCard", "TxFIFO", m_Wave.m_OutFifoSize); pIniFile->WriteInteger("SoundCard", "Source", m_Wave.m_SoundStereo); pIniFile->WriteString("SoundCard", "ID", sys.m_SoundIDRX); pIniFile->WriteString("SoundCard", "IDTX", sys.m_SoundIDTX); // pIniFile->WriteString("SoundCard", "MMW", sys.m_SoundMMW); /* SYSTEM */ pIniFile->WriteInteger("System", "Schema", INI_SCHEMA); pIniFile->WriteInteger("System", "Priority", m_Priority); pIniFile->WriteString("System", "FontName", sys.m_FontName); pIniFile->WriteInteger("System", "FontCharset", sys.m_FontCharset); /* Window */ if( WindowState == wsNormal ){ pIniFile->WriteInteger("Window", "Fixed", sys.m_fFixWindow); pIniFile->WriteInteger("Window", "Left", sys.m_rcWindow.left); pIniFile->WriteInteger("Window", "Top", sys.m_rcWindow.top); pIniFile->WriteInteger("Window", "Width", sys.m_rcWindow.right); pIniFile->WriteInteger("Window", "Height", sys.m_rcWindow.bottom); } pIniFile->WriteInteger("Window", "WindowState", WindowState); pIniFile->WriteInteger("Window", "LogExtension", KVLA->Checked); pIniFile->WriteInteger("Window", "RestoreSubChannels", sys.m_fRestoreSubChannel); /* Folder */ pIniFile->WriteString("Folder", "Sound", sys.m_SoundDir); pIniFile->WriteString("Folder", "Log", sys.m_LogDir); pIniFile->WriteString("Folder", "ExtLog", sys.m_ExtLogDir); pIniFile->WriteString("Folder", "Text", sys.m_TextDir); /* PTT */ pIniFile->WriteString("PTT", "Name", sys.m_PTTCOM); pIniFile->WriteInteger("PTT", "Lock", sys.m_PTTLock); pIniFile->WriteInteger("PTT", "OUTFSK", sys.m_bFSKOUT); pIniFile->WriteInteger("PTT", "INVFSK", sys.m_bINVFSK); /* TX */ pIniFile->WriteInteger("TX", "LoopBack", sys.m_LoopBack); pIniFile->WriteInteger("TX", "AutoCR", KOAI->Checked | (KOAO->Checked << 1)); pIniFile->WriteInteger("TX", "Carrier", UdTxCarrier->Position); pIniFile->WriteInteger("TX", "NET", SBNET->Down); pIniFile->WriteString("TX", "Mode", g_tDispModeTable[m_RxSet[0].m_Mode]); pIniFile->WriteString("TX", "Speed", StrDbl(bf, m_RxSet[0].m_Speed)); pIniFile->WriteInteger("TX", "ModGain", m_ModGain); pIniFile->WriteInteger("TX", "ConvAlpha", m_fConvAlpha); pIniFile->WriteInteger("TX", "RttyWordOut", m_fRttyWordOut); pIniFile->WriteInteger("TX", "MFSK_TYPE", m_RxSet[0].m_MFSK_TYPE); pIniFile->WriteInteger("TX", "MFSK_CENTER", sys.m_MFSK_Center); pIniFile->WriteInteger("TX", "SendSingleTone", sys.m_fSendSingleTone); /* View */ pIniFile->WriteInteger("FFT", "Width", m_FFTW); pIniFile->WriteInteger("FFT", "Smooth", m_FFTSmooth); pIniFile->WriteInteger("FFT", "Type", m_FFTVType); for( i = 0; i < 12; i++ ){ sprintf(bf, "Col%u", i + 1); if( i < 6 ){ pIniFile->WriteInteger("Spec", bf, m_tFFTColset[i].d); } pIniFile->WriteInteger("WF", bf, m_tWaterColset[i].d); if( i < 6 ){ sprintf(bf, "Lvl%u", i + 1); pIniFile->WriteInteger("WF", bf, m_tWaterLevel[i]); } } pIniFile->WriteInteger("View", "DrawType", GetDrawType()); pIniFile->WriteInteger("View", "WaveForm", m_WaveType); pIniFile->WriteInteger("View", "RigFreqScale", m_ScaleAsRigFreq); pIniFile->WriteInteger("View", "ScaleDetails", m_ScaleDetails); pIniFile->WriteInteger("View", "WaterAGC", KVWA->Checked); /* RXW */ for( i = 0; i < 5; i++ ){ sprintf(bf, "Color%d", i + 1); pIniFile->WriteInteger("RXW", bf, m_Dump.m_Color[i].d); } SaveFontToInifile(PCRX->Font, "RXW", pIniFile); pIniFile->WriteInteger("RXW", "StatusUTC", m_StatusUTC); pIniFile->WriteInteger("RXW", "MouseWheel", sys.m_EnableMouseWheel); pIniFile->WriteInteger("RXW", "ShowCtrl", sys.m_fShowCtrlCode); /* TXW */ for( i = 0; i < 4; i++ ){ sprintf(bf, "Color%d", i + 1); pIniFile->WriteInteger("TXW", bf, m_Edit[0].m_Color[i].d); } SaveFontToInifile(PCTX->Font, "TXW", pIniFile); /* RX */ pIniFile->WriteInteger("RX", "Carrier", UdRxCarrier->Position); pIniFile->WriteInteger("RX", "BPF", GetBPFType()); pIniFile->WriteInteger("RX", "AFC", SBAFC->Down); pIniFile->WriteInteger("RX", "ATC", SBATC->Down); pIniFile->WriteInteger("RX", "SQLevel", m_RxSet[0].m_SQLevel); pIniFile->WriteInteger("RX", "AFCWidth", m_AFCWidth); pIniFile->WriteInteger("RX", "AFCLevel", m_AFCLevel); pIniFile->WriteInteger("RX", "HPF", m_fHPF); pIniFile->WriteInteger("RX", "ATCLevel", m_ATCLevel); pIniFile->WriteInteger("RX", "ATCSpeed", m_ATCSpeed); pIniFile->WriteInteger("RX", "ATCLimit", m_ATCLimit); pIniFile->WriteInteger("RX", "SWL_TS", sys.m_fAutoTS); pIniFile->WriteInteger("RX", "NotchFreq", m_NotchFreq); pIniFile->WriteInteger("RX", "PlayBack", sys.m_fPlayBack); pIniFile->WriteInteger("RX", "PlayBackSpeed", sys.m_PlayBackSpeed); pIniFile->WriteInteger("RX", "MFSK_SQ_METRIC", sys.m_MFSK_SQ_Metric); pIniFile->WriteInteger("RX", "RTTY_FFT", m_RxSet[0].m_RTTYFFT); /* Log */ pIniFile->WriteString("Log", "Name", Log.m_FileName); /* LogSet */ Log.WriteIniFile("LogSet", pIniFile); pIniFile->WriteInteger("LogSet", "LogLink", sys.m_LogLink); pIniFile->WriteInteger("LogSet", "LinkPoll", LogLink.IsPolling()); pIniFile->WriteInteger("LogSet", "LinkPTT", LogLink.GetPTTEnabled()); LogLink.SaveMMLink(pIniFile); /* Radio */ SaveRADIOSetup(pIniFile); /* Macro */ pIniFile->WriteString("Macro", "CallSign", sys.m_CallSign); pIniFile->WriteInteger("Macro", "ButtonRow", m_MacButtonVW); pIniFile->WriteInteger("Macro", "ButtonPos", UdMac->Position); SaveMacro(pIniFile); AnsiString as; CrLf2Yen(as, sys.m_AS); pIniFile->WriteString("Macro", "CWAS", as); for( i = 0; i < macOnEnd; i++ ){ CrLf2Yen(as, sys.m_MacEvent[i]); pIniFile->WriteString("Macro", g_tMacEvent[i], as); } pIniFile->WriteInteger("Macro", "Expand", PBoxFFT->Align != alClient); /* DefKey */ for( i = 0; i < kkEOF; i++ ){ sprintf(bf, "K%u", i+1); pIniFile->WriteInteger("DefKey", bf, sys.m_DefKey[i]); } /* Sub channel */ CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++, pRxSet++ ){ sprintf(bf, "Channel%u", i); pIniFile->WriteInteger(bf, "Show", pRxSet->m_fShowed); pIniFile->WriteString(bf, "Mode", g_tDispModeTable[pRxSet->m_Mode]); pIniFile->WriteInteger(bf, "Carrier", pRxSet->m_CarrierFreq); pIniFile->WriteInteger(bf, "WaterWidth", pRxSet->m_WaterW); pIniFile->WriteInteger(bf, "Left", pRxSet->m_rcView.left); pIniFile->WriteInteger(bf, "Top", pRxSet->m_rcView.top); pIniFile->WriteInteger(bf, "Width", pRxSet->m_rcView.right); pIniFile->WriteInteger(bf, "Height", pRxSet->m_rcView.bottom); SaveFontToInifile(&m_RxSet[i].m_FontData, bf, pIniFile); pIniFile->WriteInteger(bf, "RTTYFFT", pRxSet->m_RTTYFFT); char bbf[64]; pIniFile->WriteString(bf, "Speed", StrDbl(bbf, pRxSet->m_Speed)); pIniFile->WriteInteger(bf, "MFSK_TYPE", pRxSet->m_MFSK_TYPE); pIniFile->WriteInteger(bf, "AFC", pRxSet->m_fAFC); } //RadioMenu try{ pIniFile->EraseSection("RadioMenu"); } catch(...){ } pIniFile->WriteInteger("RadioMenu", "Menus", m_nRadioMenu); for( i = 0; i < m_nRadioMenu; i++ ){ sprintf(bf, "Cap%d", i+1); pIniFile->WriteString("RadioMenu", bf, m_RadioMenu[i].strTTL); sprintf(bf, "Cmd%d", i+1); pIniFile->WriteString("RadioMenu", bf, m_RadioMenu[i].strCMD); } for( i = 0; i < PupCalls->Items->Count; i++ ){ sprintf(bf, "C%d", i+1); char bbf[64]; StrCopy(bbf, AnsiString(PupCalls->Items->Items[i]->Caption).c_str(), 63); //JA7UDE 0428 LPSTR p; for( p = bbf; *p; p++ ){ if( *p == '\t' ) *p = '_'; } pIniFile->WriteString("Calls", bf, bbf); } m_MacroVal.WriteInifile(pIniFile, "MacroVal"); pIniFile->WriteInteger("Misc", "ShowLangMsg", sys.m_fShowLangMsg); #if DEBUG //debug pIniFile->WriteInteger("DEBUG", "testSN", sys.m_testSN); pIniFile->WriteString("DEBUG", "testName", sys.m_testName); pIniFile->WriteInteger("DEBUG", "testGain", sys.m_testGain); pIniFile->WriteInteger("DEBUG", "testCarrier1", sys.m_testCarrier1); pIniFile->WriteInteger("DEBUG", "testCarrier2", sys.m_testCarrier2); pIniFile->WriteInteger("DEBUG", "testDB2", sys.m_testDB2); pIniFile->WriteInteger("DEBUG", "testQSBTime", sys.m_testQSBTime); pIniFile->WriteInteger("DEBUG", "testQSBDB", sys.m_testQSBDB); pIniFile->WriteInteger("DEBUG", "test500", sys.m_test500); pIniFile->WriteInteger("DEBUG", "testPhase", sys.m_testPhase); pIniFile->WriteInteger("DEBUG", "testClockErr", sys.m_testClockErr); #endif pIniFile->UpdateFile(); delete pIniFile; } //--------------------------------------------------------------------------- /* Clock 復調器 FFT 6000Hz 6000Hz 6000Hz 1024 8000Hz 8000Hz 8000Hz 2048 11025Hz 5513Hz 11025Hz 2048 12000Hz 6000Hz 6000Hz 1024 16000Hz 5333Hz 10667Hz 2048 18000Hz 6000Hz 6000Hz 1024 22050Hz 5513Hz 11025Hz 2048 24000Hz 6000Hz 6000Hz 1024 44100Hz 6300Hz 6300Hz 1024 48000Hz 6000Hz 6000Hz 1024 50000Hz 6250Hz 6250Hz 1024 */ BOOL __fastcall TMainVARI::SampleFreq(double f) { int fftsize = FFT_SIZE; if( f >= 49000.0 ){ // 50000Hz SAMPFREQ = f; SAMPBASE = 50000; m_fDec = 7; m_DecFactor = 0.125; SAMPTYPE = 10; m_BufferSize = 8192; FFT_SIZE = 1024; m_FFTFactor = 0.125; sys.m_DecCutOff = 2900; sys.m_MaxCarrier = 3000; } else if( f >= 46000.0 ){ // 48000Hz SAMPFREQ = f; SAMPBASE = 48000; m_fDec = 7; m_DecFactor = 0.125; SAMPTYPE = 9; m_BufferSize = 8192; FFT_SIZE = 1024; m_FFTFactor = 0.125; sys.m_DecCutOff = 2800; sys.m_MaxCarrier = 2950; } else if( f >= 43000.0 ){ // 44100Hz SAMPFREQ = f; SAMPBASE = 44100; m_fDec = 6; m_DecFactor = 1.0/7.0; SAMPTYPE = 8; m_BufferSize = 8192; FFT_SIZE = 1024; m_FFTFactor = 1.0/7.0; sys.m_DecCutOff = 2900; sys.m_MaxCarrier = 3000; } else if( f >= 23000.0 ){ // 24000Hz SAMPFREQ = f; SAMPBASE = 24000; m_fDec = 3; m_DecFactor = 0.25; SAMPTYPE = 7; m_BufferSize = 4096; FFT_SIZE = 1024; m_FFTFactor = 0.25; sys.m_DecCutOff = 2800; sys.m_MaxCarrier = 2950; } else if( f >= 20000.0 ){ // 22050Hz SAMPFREQ = f; SAMPBASE = 22050; m_fDec = 2; m_DecFactor = 1.0/3.0; SAMPTYPE = 6; m_BufferSize = 6144; FFT_SIZE = 2048; m_FFTFactor = 1.0/3.0; sys.m_DecCutOff = 2700; sys.m_MaxCarrier = 2700; } else if( f >= 17000.0 ){ // 18000Hz SAMPFREQ = f; SAMPBASE = 18000; m_fDec = 2; m_DecFactor = 1.0/3.0; SAMPTYPE = 5; m_BufferSize = 3072; FFT_SIZE = 1024; m_FFTFactor = 1.0/3.0; sys.m_DecCutOff = 2800; sys.m_MaxCarrier = 2950; } else if( f >= 15000.0 ){ // 16000Hz SAMPFREQ = f; SAMPBASE = 16000; m_fDec = 2; m_DecFactor = 1.0/3.0; SAMPTYPE = 4; m_BufferSize = 6144; FFT_SIZE = 2048; m_FFTFactor = 1.0/3.0; sys.m_DecCutOff = 2600; sys.m_MaxCarrier = 2600; } else if( f >= 11600.0 ){ // 12000Hz系 SAMPFREQ = f; SAMPBASE = 12000; m_fDec = 1; m_DecFactor = 0.5; SAMPTYPE = 3; m_BufferSize = 2048; FFT_SIZE = 1024; m_FFTFactor = 0.5; sys.m_DecCutOff = 2900; sys.m_MaxCarrier = 2950; } else if( f > 10000.0 ){ // 11025Hz系 SAMPFREQ = f; SAMPBASE = 11025; m_fDec = 1; m_DecFactor = 0.5; SAMPTYPE = 0; m_BufferSize = 2048; FFT_SIZE = 2048; m_FFTFactor = 1.0; sys.m_DecCutOff = 2700; sys.m_MaxCarrier = 2700; } else if( f > 7000.0 ){ // 8000Hz系 SAMPFREQ = f; SAMPBASE = 8000; m_fDec = 0; m_DecFactor = 1.0; SAMPTYPE = 1; m_BufferSize = 2048; FFT_SIZE = 2048; m_FFTFactor = 1.0; sys.m_DecCutOff = 3000; sys.m_MaxCarrier = 3000; } else if( f > 5000 ){ // 6000Hz系 SAMPFREQ = f; SAMPBASE = 6000; m_fDec = 0; m_DecFactor = 1.0; SAMPTYPE = 2; m_BufferSize = 1024; FFT_SIZE = 1024; m_FFTFactor = 1.0; sys.m_DecCutOff = 2950; sys.m_MaxCarrier = 2950; } else { return FALSE; } DEMSAMPFREQ = SAMPFREQ * m_DecFactor; m_FFTSampFreq = SAMPFREQ * m_FFTFactor; if( fftsize != FFT_SIZE ) m_FFT.InitFFT(); UdRxCarrier->Max = short(sys.m_MaxCarrier); UdTxCarrier->Max = short(sys.m_MaxCarrier); m_Notches.m_SampleFreq = m_FFTSampFreq; return TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FFTSampleFreq(double fq) { m_FFTSampFreq = fq * m_FFTFactor; m_FFTWindow = m_FFTW * FFT_SIZE / m_FFTSampFreq; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SampleStatus(void) { if( SAMPTXOFFSET ){ sprintf(m_TextBuff, "%.2lf/%.2lf", SAMPFREQ, SAMPTXOFFSET); } else { sprintf(m_TextBuff, "%.2lfHz", SAMPFREQ); } DrawStatus(statusSAMP, m_TextBuff); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PageStatus(void) { sprintf(m_TextBuff, "Page%d", m_CurrentEdit + 1); DrawStatus(statusPAGE, m_TextBuff); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetSampleFreq(double f, BOOL fForce) { if( !fForce && (SAMPFREQ == f) ) return; if( !SampleFreq(f) ) return; BOOL fi = m_Wave.IsInOpen(); BOOL fo = m_Wave.IsOutOpen(); m_Wave.InClose(); m_Wave.OutAbort(); InitWFX(); m_Dec2.SetSampleFreq(m_fDec, SAMPFREQ); CRxSet *pRxSet = m_RxSet; for( int i = 0; i < RXMAX; i++, pRxSet++ ){ pRxSet->SetSampleFreq(DEMSAMPFREQ); } m_FFTWindow = m_FFTW * FFT_SIZE / m_FFTSampFreq; InitCollect(); m_HPF.Create(ffHPF, 300, SAMPFREQ, 2, 1, 0.3); m_ModFSK.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_Notches.Create(); #if DEBUG m_ModTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_VCOTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_TestHPF.Create(ffHPF, 700, SAMPFREQ+SAMPTXOFFSET, 3, 0, 0); if( sys.m_testCarrier1 ) m_BPF500.Create(96, ffBPF, SAMPFREQ+SAMPTXOFFSET, sys.m_testCarrier1-250, sys.m_testCarrier1+250, 60.0, 1.0); #endif if( sys.m_fPlayBack ) m_PlayBack.Init(m_BufferSize, SAMPBASE); SampleStatus(); if( fi ) OpenSound(FALSE); if( fo ) ReOutOpen(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTxOffset(double f) { if( SAMPTXOFFSET == f ) return; SAMPTXOFFSET = f; m_ModFSK.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); #if DEBUG m_ModTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); m_VCOTest.SetSampleFreq(SAMPFREQ+SAMPTXOFFSET); if( sys.m_testCarrier1 ) m_BPF500.Create(96, ffBPF, SAMPFREQ+SAMPTXOFFSET, sys.m_testCarrier1-250, sys.m_testCarrier1+250, 60.0, 1.0); #endif SampleStatus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetRXFifo(int d) { if( d == m_Wave.m_InFifoSize ) return; BOOL f = m_Wave.IsInOpen(); m_Wave.InClose(); m_Wave.m_InFifoSize = d; if( f ) OpenSound(FALSE); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTXFifo(int d) { if( d == m_Wave.m_OutFifoSize ) return; BOOL f = m_Wave.IsOutOpen(); m_Wave.OutAbort(); m_Wave.m_OutFifoSize = d; if( f ) ReOutOpen(); } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::ReOutOpen(void) { if( !OpenSound(TRUE) ) return FALSE; memset(m_wBuffer, 0, sizeof(m_wBuffer)); #if 1 while(!m_Wave.IsOutBufFull()) m_Wave.OutWrite(m_wBuffer); #else for( int i = 0; i < m_Wave.m_OutFifoSize; i++ ) m_Wave.OutWrite(m_wBuffer); #endif return TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetSoundCard(int ch, LPCSTR pID, LPCSTR pIDTX) { int id = m_Wave.m_SoundID; int idtx = m_Wave.m_SoundTxID; BOOL f = FALSE; if( pID ){ if( !strcmpi(pID, "default") ) pID = "-1"; if( !strcmpi(pIDTX, "default") ) pIDTX = "-1"; AnsiString as = sys.m_SoundMMW; sys.m_SoundIDRX = pID; sys.m_SoundIDTX = pIDTX; m_Wave.SetSoundID(id, idtx); if( id == -2 ) f = strcmp(as.c_str(), pID); } if( (m_Wave.m_SoundStereo != ch) || (id != m_Wave.m_SoundID) || (idtx != m_Wave.m_SoundTxID) || f ){ if( m_TX ) ToRX(); BOOL f = m_Wave.IsInOpen(); m_Wave.InClose(); m_Wave.m_SoundStereo = ch; m_Wave.m_SoundID = id; m_Wave.m_SoundTxID = idtx; InitWFX(); if( f ) OpenSound(FALSE); } } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::OpenSound(BOOL fTX) { m_Wave.m_hWnd = Handle; m_Wave.UpdateDevice(m_Wave.m_SoundID); BOOL r; if( fTX ){ r = m_Wave.OutOpen(&m_WFX, m_Wave.m_SoundTxID, m_BufferSize); } else { r = m_Wave.InOpen(&m_WFX, m_Wave.m_SoundID, m_BufferSize); } if( r || m_pSoundTimer || m_fSuspend ) return r; // サウンドカードリカバリタイマーを起動 // m_fShowMsg = TRUE; m_SoundMsgTimer = m_Wave.GetTimeout(); m_RecoverSoundMode = fTX; m_pSoundTimer = new TTimer(this); m_pSoundTimer->OnTimer = SoundTimer; m_pSoundTimer->Interval = 1000; return r; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetCBSpeed(void) { m_fDisEvent++; char bf[256]; CBSpeed->Text = StrDbl(bf, m_RxSet[0].GetSpeed()); m_fDisEvent--; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateUI(void) { BOOL f = m_TX != txINTERNAL; // SBTX->Enabled = !m_RxSet[0].m_fJA || CBMode->ItemIndex != MODE_BPSK; CBRXCarrier->Enabled = f; UdRxCarrier->Enabled = f; SBATC->Enabled = (!IsRTTY() && !m_RxSet[0].IsMFSK()); // CBSpeed->Enabled = !m_RxSet[0].IsMFSK(); SetCBSpeed(); f = f && SBATC->Enabled; f = f && !SBATC->Down; EATC->Enabled = f; UdATC->Enabled = f; f = m_TX || !SBNET->Down; CBTxCarrier->Enabled = f; UdTxCarrier->Enabled = f; SBM->Enabled = (PupCalls->Items->Count != 0); if( m_PlayBack.IsActive() ){ SBP60->Visible = TRUE; SBP30->Visible = TRUE; SBP15->Visible = TRUE; f = !m_TX; SBP60->Enabled = f; SBP30->Enabled = f; SBP15->Enabled = f; } else { SBP60->Visible = FALSE; SBP30->Visible = FALSE; SBP15->Visible = FALSE; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateLogPanel(void) { if( Log.IsOpen() ){ if( Log.m_CurChg ){ Log.SetLastPos(); UpdateTextData(); Log.m_CurChg = 0; SBQSO->Down = Log.m_sd.btime ? 1 : 0; } SBQSO->Enabled = !HisCall->Text.IsEmpty(); SBData->Enabled = TRUE; SBFind->Enabled = SBQSO->Enabled; SBList->Enabled = TRUE; } else { SBQSO->Enabled = FALSE; SBData->Enabled = FALSE; SBFind->Enabled = FALSE; SBList->Enabled = FALSE; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OpenCom(void) { if( m_pCom ){ delete m_pCom; m_pCom = NULL; } if( strcmpi(sys.m_PTTCOM.c_str(), "NONE") ){ m_pCom = new CComm(); m_pCom->m_Baud = IsRTTY() ? int(m_RxSet[0].m_Speed) : 45; if( m_pCom->Open(sys.m_PTTCOM.c_str()) ){ m_pCom->SetFSK(sys.m_bFSKOUT, sys.m_bINVFSK); m_pCom->SetPTT(m_TX); } else { delete m_pCom; m_pCom = NULL; } } DrawStatus(statusCOM); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OpenRadio(void) { if( m_pRadio ){ delete m_pRadio; m_pRadio = NULL; } if( m_pRadioTimer ){ delete m_pRadioTimer; m_pRadioTimer = NULL; } if( strcmp(RADIO.StrPort, "NONE" ) ){ m_pRadio = new CCradio(TRUE); m_pRadio->Open(&RADIO, Handle, CM_CMMR, CM_CRADIO); if( m_pRadio->m_CreateON != TRUE ){ delete m_pRadio; m_pRadio = NULL; ErrorMB( sys.m_MsgEng ? "Could not open '%s' for Radio commands":"Radioコマンドポート'%s'がオープンできません.", RADIO.StrPort); } else { m_pRadio->SendCommand(RADIO.CmdInit.c_str()); if( RADIO.PollScan ){ m_fDisEvent++; LogFreq->Text = "???"; m_fDisEvent--; RADIO.Cmdxx = 0x00; m_pRadio->m_ScanAddr = 1; } if( RADIO.PollType ){ m_pRadioTimer = new TTimer(this); m_pRadioTimer->OnTimer = RadioTimer; int intval = ((RADIO.PollInterval + 2) * 100)/2; m_pRadioTimer->Interval = intval; } } } RADIO.change = 0; } //--------------------------------------------------------------------------- // サウンドカード初期化パラメータの生成 void __fastcall TMainVARI::InitWFX(void) { m_WFX.wFormatTag = WAVE_FORMAT_PCM; m_WFX.nChannels = WORD(m_Wave.m_SoundStereo ? 2 : 1); m_WFX.wBitsPerSample = 16; m_WFX.nSamplesPerSec = SAMPBASE; m_WFX.nBlockAlign = WORD(m_WFX.nChannels *(m_WFX.wBitsPerSample/8)); m_WFX.nAvgBytesPerSec = m_WFX.nBlockAlign * m_WFX.nSamplesPerSec; m_WFX.cbSize = 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxFFTPaint(TObject *Sender) { PBoxFFT->Canvas->Draw(0, 0, m_pBitmapFFT); if( !SBWave->Down && (m_fSubWindow || m_Notches.m_Count) ){ DrawSubChannel(PBoxFFT); } DrawErrorMsg(PBoxFFT->Canvas, m_fftXW, m_fftYW, TRUE); // if( SBWave->Down && (m_fftMX > 0) ){ if( m_fftMX > 0 ){ TCanvas *pCanvas = PBoxFFT->Canvas; pCanvas->Pen->Style = psDot; pCanvas->Pen->Color = clYellow; pCanvas->Brush->Color = clBlack; pCanvas->MoveTo(m_fftMX, 0); pCanvas->LineTo(m_fftMX, m_fftYW); pCanvas->Pen->Style = psSolid; if( SBWave->Down ){ sprintf(m_TextBuff, "%.1lfms", 1000.0 * m_fftMX * m_Collect1.GetMax() / (m_fftXW * DEMSAMPFREQ) ); } else { sprintf(m_TextBuff, "%uHz", m_RightFreq); } DrawMessage(pCanvas, PBoxFFT->Width, PBoxFFT->Height, m_TextBuff, m_fftMX); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxLevelPaint(TObject *Sender) { PBoxLevel->Canvas->Draw(0, 0, m_pBitmapLevel); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::Draw(BOOL fPaint) { if( SBWave->Down ){ DrawWave(fPaint); } else if( SBFFT->Down ){ DrawFFT(fPaint); } else { DrawWater(fPaint, TRUE); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CalcFFTCenter(int fo) { if( m_FFTW == 3000 ){ m_FFTB = 0; m_FFTU = m_FFTB + m_FFTW; } int fb = fo - m_FFTW/2; if( fb < 0 ) fb = 0; fb /= 100; fb *= 100; if( m_FFTW == 3000 ){ fb = 0; } else if( (fb + m_FFTW) >= 3000 ){ fb = 3000 - m_FFTW; } m_FFTB = fb; m_FFTU = m_FFTB + m_FFTW; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CalcFFTFreq(void) { int fo = m_RxSet[0].m_pDem->m_CarrierFreq; int edge = 100; if( m_RxSet[0].IsMFSK() ){ edge = 200; if( !sys.m_MFSK_Center ){ int off = m_RxSet[0].m_pDem->m_MFSK_BW/2; if( m_RxSet[0].m_Mode == MODE_mfsk_L ){ fo -= off; } else { fo += off; } } } else if( m_RxSet[0].IsRTTY() ){ edge = 200; } if( m_FFTW == 3000 ){ m_FFTB = 0; m_FFTU = m_FFTB + m_FFTW; } if( (m_FFTB >= 0) && ((m_FFTB+m_FFTW) <= 3000 ) ){ if( (fo > m_FFTB+edge) && (fo < (m_FFTB+m_FFTW)-edge) ){ return; } } CalcFFTCenter(fo); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawSubChannel(TPaintBox *pBox) { TCanvas *pCanvas = pBox->Canvas; int fw = pCanvas->TextWidth("2"); int fh = pCanvas->TextHeight("2"); int ffw = fw - 2; int ffh = fh - 3; int i; POINT pt[6]; char bf[256]; CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ){ int fo = pRxSet->m_pDem->m_CarrierFreq + 0.5; int xx = 0.5 + (fo - m_FFTB) * m_fftXW / m_FFTW; pt[0].x = xx - ffw; pt[0].y = 0; pt[1].x = xx + ffw; pt[1].y = 0; pt[2].x = xx + ffw; pt[2].y = ffh; pt[3].x = xx; pt[3].y = ffh + 3; pt[4].x = xx - ffw; pt[4].y = ffh; pt[5].x = xx - ffw; pt[5].y = 0; pCanvas->Brush->Color = clWhite; pCanvas->Pen->Color = clRed; pCanvas->Polygon(pt, 5); pRxSet->m_X = xx; pRxSet->m_Y = fh/2; sprintf(bf, "%u", i); fw = pCanvas->TextWidth(bf); xx -= fw/2; ::SetBkMode(pCanvas->Handle, TRANSPARENT); pCanvas->TextOut(xx, 0, bf); } } if( m_Notches.m_Count ){ for( i = 0; i < m_Notches.m_Count; i++ ){ int fo = m_Notches.m_pBase[i].Freq; int xx = 0.5 + (fo - m_FFTB) * m_fftXW / m_FFTW; pt[0].x = xx - ffw; pt[0].y = 0; pt[1].x = xx + ffw; pt[1].y = 0; pt[2].x = xx + ffw; pt[2].y = ffh; pt[3].x = xx; pt[3].y = ffh + 3; pt[4].x = xx - ffw; pt[4].y = ffh; pt[5].x = xx - ffw; pt[5].y = 0; pCanvas->Brush->Color = clYellow; pCanvas->Pen->Color = clRed; pCanvas->Polygon(pt, 5); m_Notches.m_pBase[i].m_MX = xx; m_Notches.m_pBase[i].m_MY = fh/2; strcpy(bf, "N"); fw = pCanvas->TextWidth(bf); xx -= fw/2; ::SetBkMode(pCanvas->Handle, TRANSPARENT); pCanvas->TextOut(xx, 0, bf); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawFreqScale(TCanvas *pCanvas, int XW, int YW, int fftb, int fftw, int fh, BOOL fRadio) { int fw; char bf[128]; int A, B, L; switch(fftw){ case 500: B = 50; A = 100; L = 100; break; case 1000: B = 50; A = 100; L = 200; break; case 2000: B = 100; A = 500; L = 500; break; case 3000: B = 100; A = 500; L = 500; break; } BOOL fReal = fRadio && m_ScaleAsRigFreq && m_pRadio && m_pRadio->m_FreqHz; BOOL fLSB = (fReal && m_pRadio->IsRigLSB()); UINT f, fb, fu; if( fReal ){ int rfo = m_pRadio->m_CarrierFreq; if( fLSB ){ fb = m_pRadio->m_FreqHz + rfo - m_FFTB; fu = fb - fftw; } else { fb = m_pRadio->m_FreqHz - rfo + m_FFTB; fu = fb + fftw; } } else { fb = fftb; fu = fftb+fftw; } int xx; f = fb - (fb % A); if( !fReal && (int(f) < 0) ) f = 0; #if 0 // For Debug sprintf(m_TextBuff, "%u,%u,%u,%u", m_pRadio ? m_pRadio->m_FreqHz:0, fb, fu, f); Caption = m_TextBuff; #endif int _yt; TColor LCol, FCol; if( m_ScaleDetails ){ LCol = pCanvas->Pen->Color; FCol = pCanvas->Font->Color; _yt = 2; } else { B = A; _yt = 0; } int vy = pCanvas->TextHeight("0") + _yt; if( fLSB ){ for( ; f > fu; f -= B ){ xx = int(fb - f) * XW / fftw; if( xx >= XW ) break; if( !(f % 1000) || !(f % L) ){ sprintf(bf, "%.1lf", double(f) * 0.001); fw = pCanvas->TextWidth(bf)/2; if( (xx - fw) > 0 ){ pCanvas->TextOut(xx - fw, _yt, bf); if( fh ){ pCanvas->MoveTo(xx, fh); pCanvas->LineTo(xx, YW); } else { pCanvas->MoveTo(xx, vy); pCanvas->LineTo(xx, vy+3); } } } else if( fh && !(f % A) ){ pCanvas->MoveTo(xx, _yt); pCanvas->LineTo(xx, YW); } if( m_ScaleDetails && !(f % B) ){ pCanvas->Pen->Color = FCol; pCanvas->MoveTo(xx, 0); pCanvas->LineTo(xx, 2); pCanvas->Pen->Color = LCol; } } } else { for( ; f < fu; f += B ){ xx = int(f - fb) * XW / fftw; if( xx >= XW ) break; if( !(f % 1000) || !(f % L) ){ if( fReal ){ sprintf(bf, "%.1lf", double(f) * 0.001); } else { sprintf(bf, "%u", f); } fw = pCanvas->TextWidth(bf)/2; if( (xx - fw) > 0 ){ pCanvas->TextOut(xx - fw, _yt, bf); if( fh ){ pCanvas->MoveTo(xx, fh); pCanvas->LineTo(xx, YW); } else { pCanvas->MoveTo(xx, vy); pCanvas->LineTo(xx, vy+3); } } } else if( fh && !(f % A) ){ pCanvas->MoveTo(xx, _yt); pCanvas->LineTo(xx, YW); } if( m_ScaleDetails && !(f % B) ){ pCanvas->Pen->Color = FCol; pCanvas->MoveTo(xx, 0); pCanvas->LineTo(xx, 2); pCanvas->Pen->Color = LCol; } } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetInfoMsg(LPCSTR pStr) { SetInfoMsg(pStr, 1); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetMsgCount(void) { if( SBWave->Down ){ int n = DEMSAMPFREQ * 3 / m_Collect1.GetMax(); if( !n ) n++; return n; } else { return 15; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetInfoMsg(LPCSTR pStr, int pos) { if( (pos >= 0) && (pos < 5) ){ m_InfoMsg[pos] = pStr; m_InfoMsgFlag |= _tBitData[pos]; m_cInfoMsg[pos] = GetMsgCount(); m_fShowMsg = TRUE; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetErrorMsg(LPCSTR pStr) { m_ErrorMsg = pStr; m_cErrorMsg = GetMsgCount(); m_fShowMsg = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawErrorMsg(TCanvas *pCanvas, int XW, int YW, BOOL fReset) { LPCSTR p = NULL; if( m_fShowMsg ){ if( m_fSuspend ){ p = sys.m_MsgEng ? "Suspend..." : "サスペンド中..."; } else if( m_pSoundTimer ){ p = sys.m_MsgEng ? "SoundCard open error. Now trying to open every 1sec." : "サウンドカードオープンエラー, 再試行中(1秒毎)..."; } else if( m_LostSoundRX ){ if( fReset ) m_LostSoundRX--; p = sys.m_MsgEng ? "Lost RX Sound":"受信サウンド欠落"; } else if( m_LostSoundTX ){ if( fReset ) m_LostSoundTX--; p = sys.m_MsgEng ? "Lost TX Sound":"送信サウンド欠落"; } else if( m_cErrorMsg ){ m_cErrorMsg--; p = m_ErrorMsg.c_str(); } else if( m_InfoMsgFlag ){ for( int i = 0; i < 5; i++ ){ if( m_InfoMsgFlag & _tBitData[i] ){ DrawMessage(pCanvas, XW, YW, m_InfoMsg[i].c_str(), i); m_cInfoMsg[i]--; if( !m_cInfoMsg[i] ) m_InfoMsgFlag &= ~_tBitData[i]; } } } else { m_fShowMsg = FALSE; } } else if( m_ScaleAsRigFreq && m_pRadio ){ if( fReset ) m_RadioScaleCounter++; if( m_RadioScaleCounter & 4 ){ if( m_pRadio->m_FreqHz ){ if( (RADIO.PollOffset == 3) && !m_pRadio->m_LSB ){ p = sys.m_MsgEng ? "Invalid RIG MODE":"未対応のRIGモード"; } } else { p = sys.m_MsgEng ? "NO RIG DATA" : "RIGデータ未受信"; } } } #if 0 if( !p && !SBAFC->Down && m_RxSet[0].m_SQ && m_RxSet[0].m_pDem->IsFreqErr() ){ DrawMessage(pCanvas, XW, YW, sys.m_MsgEng ? "OFF FREQ":"Fズレ", 3); } #endif if( p ) DrawMessage(pCanvas, XW, YW, p, 3); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawFFT(BOOL fPaint) { TCanvas *pCanvas = m_pBitmapFFT->Canvas; TRect rc; rc.Left = 0; rc.Top = 0; rc.Right = m_fftXW; rc.Bottom = m_fftYW; pCanvas->Brush->Color = m_tFFTColset[0].c; pCanvas->Pen->Color = m_tFFTColset[0].c; pCanvas->FillRect(rc); if( !m_MouseDown ) CalcFFTFreq(); pCanvas->Pen->Style = psDot; int xx, y; int fh = pCanvas->TextHeight("A"); switch(m_FFTVType){ case 0: pCanvas->Pen->Color = m_tFFTColset[3].c; for( y = 6; y <= 86; y += 20 ){ xx = y * m_fftYW / 100; pCanvas->MoveTo(0, xx); pCanvas->LineTo(m_fftXW, xx); } break; case 1: pCanvas->Pen->Color = m_tFFTColset[3].c; for( y = 6; y <= 66; y += 20 ){ xx = y * m_fftYW / 60; pCanvas->MoveTo(0, xx); pCanvas->LineTo(m_fftXW, xx); } break; } pCanvas->Font->Height = -12; pCanvas->Font->Color = m_tFFTColset[2].c; pCanvas->Pen->Color = m_tFFTColset[3].c; int rfo = UdRxCarrier->Position; DrawFreqScale(pCanvas, m_fftXW, m_fftYW, m_FFTB, m_FFTW, fh, TRUE); if( m_RxSet[0].m_pDem->GetSyncState() && m_RxSet[0].m_SQ && m_RxSet[0].m_pDem->m_Lock ){ // DrawMessage(pCanvas, m_fftXW, m_fftYW, "SYNC", 1); pCanvas->TextOut(1, m_ScaleDetails ? 3 : 1, "SYNC"); } // pCanvas->Pen->Color = clYellow; // xx = m_Hilbert.m_CarrierFreq * m_fftXW / m_FFTW; // pCanvas->MoveTo(xx, 0); pCanvas->LineTo(xx, m_fftYW); pCanvas->Pen->Color = clGreen; xx = (DEMSAMPFREQ*0.5 - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh); pCanvas->LineTo(xx, m_fftYW); int tfo = UdTxCarrier->Position; POINT pt[4]; if( (tfo != rfo) && !SBNET->Down ){ pCanvas->Pen->Color = m_tFFTColset[5].c; xx = 0.5 + (tfo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh); pCanvas->LineTo(xx, m_fftYW); pt[0].x = xx; pt[0].y = fh; pt[1].x = xx - 3; pt[1].y = fh+3; pt[2].x = xx; pt[2].y = fh + 6; pt[3].x = xx + 3; pt[3].y = fh+3; pCanvas->Brush->Color = m_tFFTColset[5].c; pCanvas->Polygon(pt, 3); if( Is170() ){ double hw = m_RxSet[0].m_pDem->m_RTTYShift * 0.5; xx = 0.5 + (tfo - m_FFTB - hw) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); xx = 0.5 + (tfo - m_FFTB + hw) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } else if( m_RxSet[0].IsMFSK() ){ xx = 0.5 + (tfo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); double bw = m_RxSet[0].m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ int x = 0.5 + (tfo - m_FFTB - bw*0.5) * m_fftXW / m_FFTW; pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); x = 0.5 + (tfo - m_FFTB + bw*0.5) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+3); pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); } else { xx = 0.5 + (tfo - m_FFTB + (m_RxSet[0].m_Mode == MODE_mfsk_U ? bw : -bw)) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } } } pCanvas->Pen->Color = m_tFFTColset[4].c; xx = 0.5 + (rfo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh); pCanvas->LineTo(xx, m_fftYW); pt[0].x = xx; pt[0].y = fh; pt[1].x = xx - 3; pt[1].y = fh+3; pt[2].x = xx; pt[2].y = fh + 6; pt[3].x = xx + 3; pt[3].y = fh+3; pCanvas->Brush->Color = m_tFFTColset[4].c; pCanvas->Polygon(pt, 3); if( Is170() ){ double hw = m_RxSet[0].m_pDem->m_RTTYShift * 0.5; xx = 0.5 + (rfo - m_FFTB - hw) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); xx = 0.5 + (rfo - m_FFTB + hw) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } else if( m_RxSet[0].IsMFSK() ){ xx = 0.5 + (rfo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); double bw = m_RxSet[0].m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ int x = 0.5 + (rfo - m_FFTB - bw*0.5) * m_fftXW / m_FFTW; pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); x = 0.5 + (rfo - m_FFTB + bw*0.5) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+3); pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); } else { xx = 0.5 + (rfo - m_FFTB + (m_RxSet[0].m_Mode == MODE_mfsk_U ? bw : -bw)) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } } if( (m_Wave.IsInOpen() || m_Wave.IsOutOpen()) && SBFFT->Down ){ pCanvas->Pen->Style = psSolid; pCanvas->Pen->Color = m_tFFTColset[1].c; int x, y; #if 1 int xo = (m_FFTB*FFT_SIZE/m_FFTSampFreq) + 0.5; int xe = (m_FFTW*FFT_SIZE/m_FFTSampFreq) + 0.5; double kx = double(m_fftXW) / double(xe); xe += xo; #else int xo = ((m_FFTB+(m_FFTSampFreq/FFT_SIZE))*FFT_SIZE/m_FFTSampFreq) + 0.5; #endif switch(m_FFTVType){ case 0:{ // 100dB double k = m_fftYW*0.01/m_fftSC; for( x = xo; x <= xe; x++ ){ y = m_fftout[x]; y = m_fftYW - y * k; xx = int((x - xo) * kx); if( x > xo ){ pCanvas->LineTo(xx, y); } else { pCanvas->MoveTo(xx, y); } } break;} case 1:{ // 60dB double k = double(m_fftYW)/double(m_fftSC); int yo = m_fftYW * 40 / k; k = k / 60.0; for( x = xo; x <= xe; x++ ){ y = m_fftout[x]; y = m_fftYW - ((y-yo)*k); xx = int((x - xo) * kx); if( x > xo ){ pCanvas->LineTo(xx, y); } else { pCanvas->MoveTo(xx, y); } } break;} default:{ // SQR for( x = xo; x <= xe; x++ ){ y = m_fftout[x]; y = m_fftYW - (y/100); xx = int((x - xo) * kx); if( x > xo ){ pCanvas->LineTo(xx, y); } else { pCanvas->MoveTo(xx, y); } } break;} } } if( fPaint ) PBoxFFTPaint(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitWater(int sw) { if( m_WaterNoiseL > m_WaterNoiseH ){ int f = m_WaterNoiseL; m_WaterNoiseL = m_WaterNoiseH; m_WaterNoiseH = f; } if( m_FFT.m_FFTGain ){ if( sw & iniwMETRIC ){ m_StgWater.Sum = 1000; m_StgWater.Max = 5120; m_StgWater.VW = 5120; } if( sw & iniwLIMIT ){ m_StgWater.LimitL = DBToSqrt(m_WaterNoiseL*100-500); m_StgWater.LimitH = DBToSqrt(m_WaterNoiseH*100-500); } } else { if( sw & iniwMETRIC ){ m_StgWater.Sum = 5000; m_StgWater.Max = 8000; m_StgWater.VW = 6000; } if( sw & iniwLIMIT ){ m_StgWater.LimitL = m_WaterNoiseL * 100 - 500; m_StgWater.LimitH = m_WaterNoiseH * 100 - 500; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawWater(BOOL fPaint, BOOL fClear) { TCanvas *pCanvas = m_pBitmapFFT->Canvas; int fh = pCanvas->TextHeight("A"); int ft = fh + 8; int b = m_FFTB; int fo = UdRxCarrier->Position; if( !m_MouseDown ) CalcFFTFreq(); TRect rc; rc.Left = 0; rc.Top = 0; rc.Right = m_fftXW; if( fClear || (b != m_FFTB)){ rc.Bottom = m_fftYW; InitWater(iniwMETRIC); } else { rc.Bottom = ft; } pCanvas->Brush->Color = m_tWaterColset[0].c; pCanvas->Pen->Color = m_tWaterColset[0].c; pCanvas->Pen->Style = psSolid; pCanvas->FillRect(rc); rc.Bottom = m_fftYW; pCanvas->Font->Height = -12; pCanvas->Font->Color = m_tWaterColset[2].c; pCanvas->Pen->Color = m_tWaterColset[2].c; DrawFreqScale(pCanvas, m_fftXW, m_fftYW, m_FFTB, m_FFTW, 0, TRUE); if( m_RxSet[0].m_pDem->GetSyncState() && m_RxSet[0].m_SQ && m_RxSet[0].m_pDem->m_Lock ){ pCanvas->TextOut(1, m_ScaleDetails ? 3 : 1, "SYNC"); } int xx; POINT pt[3]; int tfo = UdTxCarrier->Position; if( tfo != fo && !SBNET->Down ){ if( Is170() ){ double hw = m_RxSet[0].m_pDem->m_RTTYShift * 0.5; pCanvas->Pen->Color = m_tWaterColset[5].c; xx = 0.5 + (tfo - m_FFTB - hw) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); xx = 0.5 + (tfo - m_FFTB + hw) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } else if( m_RxSet[0].IsMFSK() ){ pCanvas->Pen->Color = m_tWaterColset[5].c; xx = 0.5 + (tfo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); double bw = m_RxSet[0].m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ int x = 0.5 + (tfo - m_FFTB - bw*0.5) * m_fftXW / m_FFTW; pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); x = 0.5 + (tfo - m_FFTB + bw*0.5) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+3); pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); } else { xx = 0.5 + (tfo - m_FFTB + (m_RxSet[0].m_Mode == MODE_mfsk_U ? bw : -bw)) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } } xx = 0.5 + (tfo - m_FFTB) * m_fftXW / m_FFTW; pt[0].x = xx - 4; pt[0].y = fh; pt[1].x = xx + 4; pt[1].y = fh; pt[2].x = xx; pt[2].y = fh + 6; pCanvas->Pen->Color = m_tWaterColset[3].c; pCanvas->Brush->Color = m_tWaterColset[5].c; pCanvas->Polygon(pt, 2); } pCanvas->Pen->Color = m_tWaterColset[3].c; if( Is170() ){ double hw = m_RxSet[0].m_pDem->m_RTTYShift * 0.5; pCanvas->Pen->Color = m_tWaterColset[4].c; xx = 0.5 + (fo - m_FFTB - hw) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); xx = 0.5 + (fo - m_FFTB + hw) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } else if( m_RxSet[0].IsMFSK() ){ pCanvas->Pen->Color = m_tWaterColset[4].c; xx = 0.5 + (fo - m_FFTB) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+5); pCanvas->LineTo(xx, fh+3); double bw = m_RxSet[0].m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ int x = 0.5 + (fo - m_FFTB - bw*0.5) * m_fftXW / m_FFTW; pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); x = 0.5 + (fo - m_FFTB + bw*0.5) * m_fftXW / m_FFTW; pCanvas->MoveTo(xx, fh+3); pCanvas->LineTo(x, fh+3); pCanvas->LineTo(x, fh+6); } else { xx = 0.5 + (fo - m_FFTB + (m_RxSet[0].m_Mode == MODE_mfsk_U ? bw : -bw)) * m_fftXW / m_FFTW; pCanvas->LineTo(xx, fh+3); pCanvas->LineTo(xx, fh+6); } } xx = 0.5 + (fo - m_FFTB) * m_fftXW / m_FFTW; pt[0].x = xx - 4; pt[0].y = fh; pt[1].x = xx + 4; pt[1].y = fh; pt[2].x = xx; pt[2].y = fh + 6; pCanvas->Pen->Color = m_tWaterColset[3].c; pCanvas->Brush->Color = m_tWaterColset[4].c; pCanvas->Polygon(pt, 2); if( (m_Wave.IsInOpen() || m_Wave.IsOutOpen()) && SBWater->Down ){ TRect trc = rc; rc.Top += ft; rc.Bottom--; trc.Top += ft + 1; pCanvas->CopyRect(trc, pCanvas, rc); int xo = ((m_FFTB+(m_FFTSampFreq/FFT_SIZE))*FFT_SIZE/m_FFTSampFreq) + 0.5; int x, y; int n = 0; int sum = m_StgWater.LimitL; int max = 0; int wmax = 0; int xl = 0.5 + (fo - m_RxSet[0].m_Speed - m_FFTB) * m_fftXW / m_FFTW; int xh = 0.5 + (fo + m_RxSet[0].m_Speed - m_FFTB) * m_fftXW / m_FFTW; double k = 256.0 / m_StgWater.VW; for( x = 0; x < m_fftXW; x++ ){ xx = xo + (x * m_FFTWindow / m_fftXW); y = m_fftout[xx]; if( max < y ) max = y; if( (x >= xl) && (x <= xh) ){ if( wmax < y ) wmax = y; } if( (y > m_StgWater.LimitL) && (y < m_StgWater.LimitH) ){ sum += y; n++; } y = (y - m_StgWater.Sum) * k; if( y < 0 ) y = 0; if( y >= 256 ) y = 255; pCanvas->Pixels[x][ft] = m_tWaterColors[y]; } if( m_TX == txINTERNAL ){ sum = m_StgWater.LimitL; if( m_RxSet[0].IsMFSK() || m_RxSet[0].Is170() ){ sum = (sum + m_StgWater.LimitH)/2; } } else if( n < 16 ){ sum = m_StgWater.LimitL; } else { sum /= n; } m_StgWater.Sum = (m_StgWater.Sum + sum) / 2; if( m_StgWater.Sum >= m_StgWater.LimitH ) m_StgWater.Sum = m_StgWater.LimitH; if( (wmax-sum) >= 320 ){ max = wmax; } m_StgWater.Max = (m_StgWater.Max + max) / 2; m_StgWater.VW = m_StgWater.Max - m_StgWater.Sum; #if DEBUG // sprintf(m_TextBuff, "Max:%d, Sum:%d, DB:%d, VW:%d", max, sum, int(DBToSqrt(4000)), m_StgWater.VW); // Caption = m_TextBuff; #endif int low, high; if( KVWA->Checked ){ // AGC if( m_FFT.m_FFTGain ){ low = 3000; high = 7000; } else { low = 4000; high = 10000; } } else { low = high = m_FFT.m_FFTGain ? 5120 : 5000; } if( m_TX == txINTERNAL ) high = 100000; if( m_StgWater.VW < low ) m_StgWater.VW = low; if( m_StgWater.VW > high ) m_StgWater.VW = high; } if( fPaint ) PBoxFFTPaint(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawWave(BOOL fPaint) { TCanvas *pCanvas = m_pBitmapFFT->Canvas; TRect rc; rc.Left = 0; rc.Top = 0; rc.Right = m_fftXW; rc.Bottom = m_fftYW; pCanvas->Brush->Color = clBlack; pCanvas->Pen->Color = clBlack; pCanvas->FillRect(rc); pCanvas->Pen->Color = clGray; pCanvas->Pen->Style = psDot; int O1 = m_fftYW / 4; pCanvas->MoveTo(0, O1); pCanvas->LineTo(m_fftXW, O1); int O2 = m_fftYW * 3 / 4; pCanvas->MoveTo(0, O2); pCanvas->LineTo(m_fftXW, O2); if( (m_Wave.IsInOpen() || m_Wave.IsOutOpen()) && SBWave->Down ){ double k = m_fftYW * 0.3 / 32768.0; pCanvas->Pen->Style = psSolid; pCanvas->Pen->Color = TColor(RGB(0,255,0)); int x, y, xx; int W = m_Collect1.GetMax(); int M = m_Collect1.GetCount(); double *t1 = m_Collect1.GetZP(); double *t2 = m_Collect2.GetZP(); for( x = 0; x < m_fftXW; x++ ){ xx = x * W / m_fftXW; if( xx >= W ) xx = W - 1; if( xx >= M ){ break; } y = O1 - (t1[xx] * k); if( x ){ pCanvas->LineTo(x, y); } else { pCanvas->MoveTo(x, y); } } if( m_WaveType ){ double d; double max = 128; for( x = 0; x < M; x++ ){ d = fabs(t2[x]); if( max < d ) max = d; } k = m_fftYW * 0.2 / max; for( x = 0; x < M; x++ ){ xx = x * m_fftXW / W; y = O2 - (t2[x] * k); if( x ){ pCanvas->LineTo(xx, y); } else { pCanvas->MoveTo(xx, y); } } } else { for( x = 0; x < m_fftXW; x++ ){ xx = x * W / m_fftXW; if( xx >= W ) xx = W - 1; if( xx >= M ){ break; } y = O2 - (t2[xx] * k); if( x ){ pCanvas->LineTo(x, y); } else { pCanvas->MoveTo(x, y); } } } if( m_RxSet[0].m_pDem->GetSyncState() && m_RxSet[0].m_SQ ){ pCanvas->TextOut(1, 1, "SYNC"); } } if( fPaint ) PBoxFFTPaint(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawLevel(BOOL fPaint) { TCanvas *pCanvas = m_pBitmapLevel->Canvas; TRect rc; rc.Left = 0; rc.Top = 0; rc.Right = m_levelXW; rc.Bottom = m_levelYW; pCanvas->Brush->Color = clBlack; pCanvas->Pen->Color = clBlack; pCanvas->FillRect(rc); // pCanvas->Pen->Color = clYellow; int d = m_RxSet[0].m_StgFFT.Sig - 500; if( (m_TX != txINTERNAL) && m_RxSet[0].IsMFSK() && sys.m_MFSK_SQ_Metric ){ d = m_RxSet[0].m_pDem->GetMFSKMetric(0); } if( d > LEVELMAX ) d = LEVELMAX; if( m_Wave.IsInOpen() || m_Wave.IsOutOpen() ){ if( m_RxSet[0].m_pDem->m_AGC.GetOver() && !m_TX ){ pCanvas->Brush->Color = clRed; } else if( !m_RxSet[0].m_pDem->m_Lock ){ pCanvas->Brush->Color = m_RxSet[0].m_SQ ? clBlue : clGray; } else { TColor col = (m_TX == txINTERNAL) ? clYellow : TColor(RGB(0,255,0)); pCanvas->Brush->Color = m_RxSet[0].m_SQ ? col : clGray; } rc.Top = m_levelYW - (d * m_levelYW / LEVELMAX); pCanvas->FillRect(rc); } else { m_RxSet[0].m_SQ = FALSE; } pCanvas->Pen->Color = m_RxSet[0].m_SQ ? clBlack : clWhite; d = m_levelYW - (m_RxSet[0].m_SQLevel * m_levelYW / LEVELMAX); pCanvas->MoveTo(0, d); pCanvas->LineTo(m_levelXW, d); if( fPaint ) PBoxLevelPaint(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::RemoveUselessMessage(UINT wParam) { MSG msg; while( ::PeekMessage(&msg, Handle, WM_WAVE, WM_WAVE, PM_NOREMOVE) ){ if( msg.wParam == wParam ){ ::PeekMessage(&msg, Handle, WM_WAVE, WM_WAVE, PM_REMOVE); #if DEBUG RxStatus(m_RxSet, "Remove"); #endif } else { break; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnWave(void) { OnWaveIn(); OnWaveOut(); } //--------------------------------------------------------------------------- // サウンドカードからのイベント void __fastcall TMainVARI::OnWaveEvent(TMessage &Message) { switch(Message.WParam){ case waveIN: // 入力イベント OnWaveIn(); break; case waveOUT: // 出力イベント OnWaveOut(); break; case waveCloseFileEdit: // OnCloseFileEdit if( Message.LParam == int(m_pHelp) ){ if( m_pHelp ){ delete m_pHelp; m_pHelp = NULL; } } else if( Message.LParam == int(m_pEdit) ){ if( m_pEdit ){ delete m_pEdit; m_pEdit = NULL; } } break; case waveCodeView: // CodeView if( Message.LParam & 0x10000000 ){ PCTX->Font->Name = PCRX->Font->Name; PCTX->Font->Charset = PCRX->Font->Charset; OnFontChange(FALSE); OnFontChange(TRUE); } else { int c = Message.LParam & 0x0000ffff; if( c == '\b' ){ OnChar(c); } else { m_Edit[m_CurrentEdit].PutChar(c, 1); } } break; case wavePlayDlg: // PlayDlg if( Message.LParam == int(m_pPlayBox) ){ KFESClick(NULL); } break; case waveCloseRxView: // RxView case waveSwapRxView: for( int i = 1; i < RXMAX; i++ ){ if( Message.LParam == int(m_RxSet[i].m_pView) ){ CRxSet *pRxSet = &m_RxSet[i]; switch(Message.WParam){ case waveCloseRxView: pRxSet->Delete(); break; case waveSwapRxView: // 入れ替え { int fq = pRxSet->m_pDem->m_CarrierFreq; pRxSet->m_pDem->m_Decode.Reset(); pRxSet->m_pDem->ResetMeasMFSK(); pRxSet->SetCarrierFreq(UdRxCarrier->Position); // pRxSet->m_pDem->SetCarrierFreq(UdRxCarrier->Position); SetRxFreq(fq); SetTxFreq(fq); int sf = pRxSet->m_pDem->m_RTTYShift; pRxSet->m_pDem->SetRTTYShift(m_RxSet[0].m_pDem->m_RTTYShift); m_RxSet[0].m_pDem->SetRTTYShift(sf); int ModeSub = pRxSet->m_Mode; int ModeMain = CBMode->ItemIndex; double SpeedSub = pRxSet->GetSpeed(); double SpeedMain = m_RxSet[0].GetSpeed(); int MfskSub = pRxSet->m_MFSK_TYPE; int MfskMain = m_RxSet[0].m_MFSK_TYPE; pRxSet->m_pView->SetMode(ModeMain); SetMode(ModeSub); m_RxSet[0].m_pDem->m_Decode.Reset(); m_RxSet[0].m_pDem->ResetMeasMFSK(); pRxSet->SetSpeed(SpeedMain); m_RxSet[0].SetSpeed(SpeedSub); pRxSet->SetMFSKType(MfskMain); m_RxSet[0].SetMFSKType(MfskSub); m_ModFSK.SetMFSKType(m_RxSet[0].m_MFSK_TYPE); SetCBSpeed(); SetSpeedInfo(m_RxSet[0].m_Speed); } break; } break; } } UpdateSubWindow(); break; case waveClockAdj: // Clock ADJ window if( Message.LParam == int(m_pClockView) ){ delete m_pClockView; m_pClockView = NULL; } break; case waveSeekMacro: // Seek macro if( Message.LParam ){ int d = int(UdMac->Position) + Message.LParam; if( d < 0 ) d += UdMac->Max+1; if( d > UdMac->Max ) d -= UdMac->Max+1; UdMac->Position = short(d); CreateMacButton(); } break; case waveDoMacro: // Do Macro SendButton(Message.LParam); break; case waveLoadMacro: // Load Macro if( Message.LParam ){ LPCSTR p = (LPCSTR)Message.LParam; LoadMacro(p); delete p; } break; #if DEBUG case waveRepeatMacro: { TSpeedButton *pButton = (TSpeedButton *)Message.LParam; pButton->Down = TRUE; pButton->Click(); } break; #endif } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnWaveIn(void) { while(m_Wave.IsInOpen() && !m_Wave.IsInBufNull()){ if( !m_Wave.InRead(m_wBuffer) ){ m_Wave.InClose(); OpenSound(FALSE); m_LostSoundRX = LOSTMSGTIME * int(SAMPFREQ) / m_BufferSize; m_fShowMsg = TRUE; } m_WaveFile.ReadWrite(m_wBuffer, m_BufferSize); if( m_PlayBack.IsActive() && !m_TX ){ if( m_PlayBack.IsPlaying() ){ for( int i = 0; i < sys.m_PlayBackSpeed; i++ ){ if( m_PlayBack.Read(m_wBuffer) ){ DoDem(); } else { break; } /* MSG msg; if( ::PeekMessage(&msg, Handle, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) ){ break; } */ } if( !m_PlayBack.IsPlaying() ){ StopPlayBack(); } } else { m_PlayBack.Write(m_wBuffer); DoDem(); } } else { DoDem(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnWaveOut(void) { #if DEBUG if( sys.m_test ){ while(m_Wave.IsOutOpen() && !m_Wave.IsOutBufFull()){ m_WaveFile.ReadWrite(m_wBuffer, m_BufferSize); DoDem(); if( !m_Wave.OutWrite(m_wBuffer) ){ m_Wave.OutAbort(); OpenSound(TRUE); m_LostSoundTX = LOSTMSGTIME * int(SAMPFREQ) / m_BufferSize; m_fShowMsg = TRUE; } } if( m_fpTest ){ while(!m_ModTest.m_Encode.IsBuffFull()){ int c = fgetc(m_fpTest); if( m_RxSet[0].m_MBCS.IsLead(BYTE(c)) ){ c = c << 8; c += fgetc(m_fpTest); } m_ModTest.m_Encode.PutChar(c); if( feof(m_fpTest) ){ rewind(m_fpTest); } } } } else { #endif while(m_Wave.IsOutOpen() && !m_Wave.IsOutBufFull()){ if( (m_WaveFile.m_mode == 1) && (!m_TX) ){ // Read func m_WaveFile.ReadWrite(m_wBuffer, m_BufferSize); DoDem(); } else { DoMod(); if( (sys.m_LoopBack == loopINTERNAL) ) DoDem(); } if( !m_Wave.OutWrite(m_wBuffer) ){ m_Wave.OutAbort(); OpenSound(TRUE); m_LostSoundTX = LOSTMSGTIME * int(SAMPFREQ) / m_BufferSize; m_fShowMsg = TRUE; } if( m_WaveFile.m_mode == 2 ){ // Write func m_WaveFile.ReadWrite(m_wBuffer, m_BufferSize); } } #if DEBUG } #endif if( m_fReqRX ){ if( m_fTone ){ if( m_fReqRX == 1 ){ m_ModFSK.m_OutVol = 0; m_Wave.SetOutBCC(m_Wave.GetOutBC()); m_fReqRX++; SetTXCaption(); } else if( m_Wave.GetOutBCC() < 0 ){ ToRX(); } } else if( m_ModFSK.m_Encode.m_Idle && !m_Edit[m_SendingEdit].GetCharCount(TRUE) && m_Edit[m_SendingEdit].IsCursorLast() ){ if( m_fReqRX == 1 ){ m_fReqRX++; SetTXCaption(); if( KOAO->Checked && m_fSendChar ){ m_ModFSK.m_Encode.PutChar('\r'); m_ModFSK.m_Encode.PutChar('\n'); } else { if( m_pCom ) m_pCom->SetMark(); m_ModFSK.m_Encode.SetMark(); m_Wave.SetOutBCC(m_Wave.GetOutBC()); m_fReqRX++; } } else if( m_fReqRX == 2 ){ if( m_pCom ) m_pCom->SetMark(); m_ModFSK.m_Encode.SetMark(); m_Wave.SetOutBCC(m_Wave.GetOutBC()); m_fReqRX++; } else if( m_Wave.GetOutBCC() < 0 ){ if( !sys.m_bFSKOUT || !IsRTTY() || !m_pCom || m_pCom->m_QueueExtfsk.IsEmpty() ){ ToRX(); } } else { m_ModFSK.m_OutVol = 0; } } } if( m_pPlayBox ) m_pPlayBox->UpdateItem(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoDem(double d) { if( m_SkipTmg > 0 ){ m_SkipTmg--; return; } CRxSet *pRxSet = &m_RxSet[0]; CDEMFSK *pDem = pRxSet->m_pDem; int c; if( pDem->Do(d, pRxSet->m_SQ, pRxSet->m_fATC ) ){ while((c = pDem->GetData())!=-1){ PutDumpChar(c, pRxSet, &m_Dump); } } if( SBWave->Down ){ BOOL fMFSK = pRxSet->IsMFSK(); BOOL fQPSK = pRxSet->IsQPSK(); if( m_WaveType ){ m_Collect1.Do(pDem->GetS()); m_Collect2.Do(pDem->m_d); if( m_Collect1.IsFull() ){ DrawWave(TRUE); m_Collect1.Clear(); m_Collect2.Clear(); m_Lock = FALSE; } } else if(fMFSK || fQPSK){ m_Collect1.Do(pDem->GetTmg()*16384); if( fQPSK ){ m_Collect2.Do(pDem->m_DecPSK.GetD()); } else { m_Collect2.Do(pDem->GetS()); } if( m_Collect1.IsFull() ){ DrawWave(TRUE); m_Collect1.Clear(); m_Collect2.Clear(); m_Lock = FALSE; } } else { if( pDem->GetTmgLock() && pDem->m_Lock ){ m_Collect1.Do(pDem->GetTmg()*16384); m_Collect2.Do(pDem->GetS()); m_Lock = TRUE; } else if( m_Lock ){ DrawWave(TRUE); m_Collect1.Clear(); m_Collect2.Clear(); m_Lock = FALSE; } } } if( m_fSubWindow ){ pRxSet = &m_RxSet[1]; for( int i = 1; i < RXMAX; i++, pRxSet++ ){ pDem = pRxSet->m_pDem; if( pRxSet->IsActive() ){ if( pDem->Do(d, pRxSet->m_SQ, pRxSet->m_fATC ) ){ while((c = pDem->GetData())!=-1){ PutDumpChar(c, pRxSet, &pRxSet->m_pView->m_Dump); } } } } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoDem(void) { int i; SHORT *wp = m_wBuffer; #if DEBUG if( sys.m_test ){ if( m_TestTimer ) m_TestTimer--; for( i = 0; i < m_BufferSize; i++, wp++ ){ if( !m_TestTimer ){ if( sys.m_testCarrier1 ) *wp = SHORT(m_QSB.Do(m_ModTest.Do())); if( sys.m_testCarrier2 ) *wp += SHORT(m_VCOTest.Do(0)*sys.m_testGain2); } else { *wp = 0; } } if( SAMPFREQ < 7000.0 ){ AddGaussian(m_wBuffer, m_BufferSize, sys.m_testNoiseGain*0.5); } else { AddGaussian(m_wBuffer, m_BufferSize, sys.m_testNoiseGain); } wp = m_wBuffer; for( i = 0; i < m_BufferSize; i++, wp++ ){ *wp = m_TestHPF.Do(*wp); if( sys.m_test500 ) *wp = m_BPF500.Do(*wp); } wp = m_wBuffer; } if( m_pDebugButton ){ ::PostMessage(Handle, WM_WAVE, waveRepeatMacro, DWORD(m_pDebugButton)); m_pDebugButton = NULL; } #endif double *dp = m_fftbuf; BOOL fNOTCH = m_Notches.m_Count && (m_TX != txINTERNAL); switch(SAMPTYPE){ case 0: // 11025Hz for( i = 0; i < m_BufferSize; i++, wp++ ){ if( m_fHPF ) *wp = m_HPF.Do(*wp); if( fNOTCH ) *wp = m_Notches.m_FIR.Do(*wp); if( m_Dec2.Do(*wp) ){ DoDem(m_Dec2.GetOut()); } *dp++ = *wp; } break; case 1: // 8000Hz case 2: // 6000Hz for( i = 0; i < m_BufferSize; i++, wp++ ){ if( m_fHPF ) *wp = m_HPF.Do(*wp); if( fNOTCH ) *wp = m_Notches.m_FIR.Do(*wp); DoDem(*wp); *dp++ = *wp; } break; default: // // 16000Hz // // 22050Hz // 12000Hz // 18000Hz // 24000Hz // 44100Hz // 48000Hz // 50000Hz for( i = 0; i < m_BufferSize; i++, wp++ ){ if( m_fHPF ) *wp = m_HPF.Do(*wp); if( m_Dec2.Do(*wp) ){ if( fNOTCH ) m_Dec2.SetOut(m_Notches.m_FIR.Do(m_Dec2.GetOut())); DoDem(m_Dec2.GetOut()); *dp++ = m_Dec2.GetOut(); } } break; } try { m_FFT.Calc(m_fftbuf, 3001 * FFT_SIZE / m_FFTSampFreq, m_fftSC * 10.0, m_FFTSmooth, m_fftout); } catch(...){ m_FFT.InitFFT(); m_FFT.m_FFTDIS = 0; } for( i = 0; i < RXMAX; i++ ){ CalcStgFFT(&m_RxSet[i]); } if( SBFFT->Down ){ DrawFFT(TRUE); } else if( SBWater->Down ){ DrawWater(TRUE, FALSE); } DrawLevel(TRUE); DrawPF(TRUE); #if MEASIMD m_RxSet[0].m_pDem->CalcIMD(); #endif m_fDisEvent++; if( m_TX != txINTERNAL ){ if( m_AFCKeyTimer ){ m_AFCKeyTimer--; } else if( SBAFC->Down ){ UdRxCarrier->Position = short(m_RxSet[0].m_pDem->m_CarrierFreq+0.5); if( m_pRadio ) m_pRadio->SetCarrierFreq(UdRxCarrier->Position); #if 0 if( !m_TX && SBNET->Down ){ UdTxCarrier->Position = UdRxCarrier->Position; } #endif m_RxSet[0].m_pDem->UpdateBPF(); } if( IsRTTY() ){ if( m_RxSet[0].m_pDem->m_Decode.IsRTTYTmg() ){ sprintf(m_TextBuff, "%.2lf", m_RxSet[0].m_pDem->m_Decode.GetRTTYTmg()); EATC->Text = m_TextBuff; } else { EATC->Text = "***"; } } else if( m_RxSet[0].IsMFSK() ){ sprintf(m_TextBuff, "%d", m_RxSet[0].m_pDem->GetClockError()); EATC->Text = m_TextBuff; } else if( SBATC->Down ){ int d = m_RxSet[0].m_pDem->GetClockError(); EATC->Text = d; } } m_fDisEvent--; // StatusBar->Panels->Items[statusSYNC]->Text = (m_RxSet[0].m_SQ && m_RxSet[0].m_pDem->m_Decode.GetSyncState()) ? "SYNC" : ""; if( m_fSubWindow ){ CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ){ pRxSet->m_pDem->UpdateBPF(); pRxSet->m_pView->UpdateStatus(); } } } if( m_fHintUpdate ){ DrawHint(); } if( m_pClockView ){ wp = m_wBuffer; for( i = 0; i < m_BufferSize; i++ ){ m_pClockView->Do(*wp++); } m_pClockView->UpdateFFT(); } #if DEBUG && 0 sprintf(m_TextBuff, "%9.1lf, %9.4lf, %4u", m_RxSet[0].m_pDem->m_RxFreq, m_RxSet[0].m_pDem->m_out, m_RxSet[0].m_AFCFQ, ); Caption = m_TextBuff; #endif } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoMod(void) { if( m_fpText ){ while(m_Edit[m_CurrentEdit].GetCharCount(TRUE) < int(16 * m_RxSet[0].GetSpeed() / 31.25) ){ #if 1 int c = 0; int len = fread(&c, 1, 1, m_fpText); if( len <= 0 ){ fclose(m_fpText); m_fpText = NULL; break; } if( m_RxSet[0].m_MBCS.IsLead(BYTE(c)) ){ c = c << 8; int len = fread(&c, 1, 1, m_fpText); if( len <= 0 ){ fclose(m_fpText); m_fpText = NULL; break; } } m_Edit[m_CurrentEdit].PutChar(c, 1); #else int c = fgetc(m_fpText); if( m_RxSet[0].m_MBCS.IsLead(BYTE(c)) ){ c = c << 8; c += fgetc(m_fpText); } m_Edit[m_CurrentEdit].PutChar(c, 1); if( feof(m_fpText) ){ fclose(m_fpText); m_fpText = NULL; } #endif } } int i; SHORT *wp = m_wBuffer; if( m_fTone ){ for( i = 0; i < m_BufferSize; i++, wp++ ){ *wp = SHORT(m_ModFSK.DoCarrier()*m_ModGainR); } } else { for( i = 0; i < m_BufferSize; i++, wp++ ){ *wp = SHORT(m_ModFSK.Do()*m_ModGainR); } } } //--------------------------------------------------------------------------- //Added by JA7UDE on April 5, 2010 int MungeBits( int r ) { int oc = 0; if( r & 0x00000010 ) oc += 0x01; if( r & 0x00000008 ) oc += 0x02; if( r & 0x00000004 ) oc += 0x04; if( r & 0x00000002 ) oc += 0x08; if( r & 0x00000001 ) oc += 0x10; return (int)oc; } void __fastcall TMainVARI::ExtFskIt( int r ) { if( m_pCom && m_pCom->m_bFSKOUT && IsRTTY() ) m_pCom->m_QueueExtfsk.Push( (BYTE)MungeBits(r) ); } //Till here //--------------------------------------------------------------------------- void __fastcall TMainVARI::PutDumpChar(int d, CRxSet *pRxSet, CDump *pDump) { if( pRxSet->IsRTTY() ){ if( d ) pDump->PutChar(d, m_TX ? 2 : 1); } else { int m; if( pRxSet->IsMFSK() ){ m = d; } else { m = g_VariCode.Index2Mbcs(d, (pRxSet->m_fJA && !pRxSet->m_fTWO)); } if( pRxSet->m_fTWO ){ if( (m >= 0) && (m < 256) ){ if( pRxSet->m_fMBCS ){ m |= pRxSet->m_fMBCS; pRxSet->m_fMBCS = 0; } else if( pRxSet->m_MBCS.IsLead(BYTE(m)) ){ pRxSet->m_fMBCS = (m << 8); } if( !pRxSet->m_fMBCS ) pDump->PutChar(m, m_TX ? 2 : 1); } } else { pDump->PutChar(m, m_TX ? 2 : 1); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitStgFFT(FFTSTG *pStg) { if( m_FFT.m_FFTGain ){ pStg->Sum = 1024; pStg->Max = 1024; pStg->WMax = 1024; } else { pStg->Sum = 5000; pStg->Max = 5000; pStg->WMax = 5000; } pStg->Sig = 0; } //--------------------------------------------------------------------------- double __fastcall TMainVARI::SqrtToDB(double d) { d /= (0.00345 * 10.0 * m_fftSC); d = d * d; d = d * d; return m_fftSC * 10.0 * (log10(d+2.81458e4) - 4.4494132); } //--------------------------------------------------------------------------- double __fastcall TMainVARI::DBToSqrt(double d) { d /= m_fftSC * 10.0; d += 4.4494132; d = pow(10, d) - 2.81458e4; d = pow(d, 0.25); return d * (0.00345 * 10.0 * m_fftSC); } //--------------------------------------------------------------------------- double __fastcall TMainVARI::AdjDB(double d) { if( m_FFT.m_FFTGain ){ return SqrtToDB(d); } else { return d * 100.0 / m_fftSC; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CalcStgFFT(CRxSet *pRxSet) { if( !pRxSet->IsActive() ) return; CDEMFSK *pDem = pRxSet->m_pDem; int fo = pDem->m_CarrierFreq; int fm, xl, xh, xnl, xnh, xol, xoh; switch(pRxSet->m_Mode){ case MODE_GMSK: fm = pRxSet->m_Speed * 2 + 100; xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; xnl = (fo - pRxSet->m_Speed*1.6) * FFT_SIZE / m_FFTSampFreq; xnh = (fo + pRxSet->m_Speed*1.6) * FFT_SIZE / m_FFTSampFreq; xol = (fo - pRxSet->m_Speed/4) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + pRxSet->m_Speed/4) * FFT_SIZE / m_FFTSampFreq; break; case MODE_FSK: fm = pRxSet->m_Speed * 4 + 100; xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; xnl = (fo - pRxSet->m_Speed*3.2) * FFT_SIZE / m_FFTSampFreq; xnh = (fo + pRxSet->m_Speed*3.2) * FFT_SIZE / m_FFTSampFreq; xol = (fo - pRxSet->m_Speed/2) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + pRxSet->m_Speed/2) * FFT_SIZE / m_FFTSampFreq; break; case MODE_N_BPSK: case MODE_BPSK: case MODE_qpsk_L: case MODE_qpsk_U: fm = pRxSet->m_Speed * 2 + 100; xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; xnl = (fo - pRxSet->m_Speed*1.6) * FFT_SIZE / m_FFTSampFreq; xnh = (fo + pRxSet->m_Speed*1.6) * FFT_SIZE / m_FFTSampFreq; xol = (fo - pRxSet->m_Speed*0.6) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + pRxSet->m_Speed*0.6) * FFT_SIZE / m_FFTSampFreq; break; case MODE_FSKW: case MODE_RTTY: case MODE_U_RTTY: #if 1 fm = (pRxSet->m_pDem->m_RTTYShift * 0.5) + 150; if( fm > 1500 ) fm = 1500; xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; xnl = xl; xnh = xh; fm = (pRxSet->m_pDem->m_RTTYShift * 0.5) + 15; xol = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; #else fm = (pRxSet->m_pDem->m_RTTYShift * 500)/170; if( fm > 1500 ) fm = 1500; xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; xnl = (fo - (fm/2)) * FFT_SIZE / m_FFTSampFreq; xnh = (fo + (fm/2)) * FFT_SIZE / m_FFTSampFreq; fm = (pRxSet->m_pDem->m_RTTYShift * 0.5) + 15; xol = (fo - fm) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; #endif break; case MODE_mfsk_L: fm = pRxSet->m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ xl = (fo - fm/2 - 150) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm/2 + 150) * FFT_SIZE / m_FFTSampFreq; xnl = xl; xnh = xh; xol = (fo - fm/2 - 15) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + fm/2 + 15) * FFT_SIZE / m_FFTSampFreq; } else { xl = (fo - fm - 150) * FFT_SIZE / m_FFTSampFreq; xh = (fo + 150) * FFT_SIZE / m_FFTSampFreq; xnl = xl; xnh = xh; xol = (fo - fm - 15) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + 15) * FFT_SIZE / m_FFTSampFreq; } break; case MODE_mfsk_U: fm = pRxSet->m_pDem->m_MFSK_BW; if( sys.m_MFSK_Center ){ xl = (fo - fm/2 - 150) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm/2 + 150) * FFT_SIZE / m_FFTSampFreq; xnl = xl; xnh = xh; xol = (fo - fm/2 - 15) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + fm/2 + 15) * FFT_SIZE / m_FFTSampFreq; } else { xl = (fo - 150) * FFT_SIZE / m_FFTSampFreq; xh = (fo + fm + 150) * FFT_SIZE / m_FFTSampFreq; xnl = xl; xnh = xh; xol = (fo - 15) * FFT_SIZE / m_FFTSampFreq; xoh = (fo + fm + 15) * FFT_SIZE / m_FFTSampFreq; } break; } fm = 200 * FFT_SIZE / m_FFTSampFreq; if( xl < fm ) xl = fm; if( xol == xoh ){xol--; xoh++;} if( xol < fm ) xol = fm; int i, y; int sum = 0; int sumn = 0; int max = 0; int wmax = 0; int m = 0; int n = 0; for( i = xl; i < xh; i++ ){ y = m_fftout[i]; if( max < y ) max = y; if( (i >= xol) && (i <= xoh) ){ if( wmax < y ) wmax = y; } else if( (i >= xnl) && (i <= xnh) ){ sumn += y; n++; } else { sum += y; m++; } } if( m ) sum /= m; if( n ) sumn /= n; if( !m || (sumn < sum) ) sum = sumn; pRxSet->m_StgFFT.Sum = (pRxSet->m_StgFFT.Sum + sum) / 2; pRxSet->m_StgFFT.Max = (pRxSet->m_StgFFT.Max + max) / 2; pRxSet->m_StgFFT.WMax = (pRxSet->m_StgFFT.WMax + wmax) / 2; if( m_FFT.m_FFTGain ){ pRxSet->m_StgFFT.dBSum = SqrtToDB(pRxSet->m_StgFFT.Sum); pRxSet->m_StgFFT.dBMax = SqrtToDB(pRxSet->m_StgFFT.Max); pRxSet->m_StgFFT.dBWMax = SqrtToDB(pRxSet->m_StgFFT.WMax); if( m_TX == txINTERNAL ) pRxSet->m_StgFFT.dBSum = 0; } else { double k = 100.0 / m_fftSC; pRxSet->m_StgFFT.dBSum = pRxSet->m_StgFFT.Sum * k; pRxSet->m_StgFFT.dBMax = pRxSet->m_StgFFT.Max * k; pRxSet->m_StgFFT.dBWMax = pRxSet->m_StgFFT.WMax * k; if( m_TX == txINTERNAL ) pRxSet->m_StgFFT.dBSum = -200; } BOOL fMFSKMet = FALSE; int d = pRxSet->m_StgFFT.Sig - 500; if( d > LEVELMAX ) d = LEVELMAX; int sq = pRxSet->m_SQ; if( (m_TX != txINTERNAL) && pRxSet->IsMFSK() && sys.m_MFSK_SQ_Metric ){ pRxSet->m_SQ = (pRxSet->m_pDem->GetMFSKMetric(0)) >= pRxSet->m_SQLevel; } else { if( pRxSet->m_pDem->IsMFSKSQ() && (d < pRxSet->m_SQLevel) ){ fMFSKMet = TRUE; pRxSet->m_SQ = TRUE; } else { pRxSet->m_SQ = (d >= pRxSet->m_SQLevel); } if( pRxSet->m_SQLevel < 50 ) pRxSet->m_SQ = TRUE; } if( pRxSet->m_SQ ){ pRxSet->m_SQTimer++; if( !sq ){ pRxSet->m_pDem->m_AFCCount = 0; pRxSet->m_pDem->m_Decode.m_BAUDOT.ClearRX(); pRxSet->m_fMBCS = 0; if( !m_TX ){ if( sys.m_fAutoTS && (!pRxSet->m_cAutoTS1 || !pRxSet->m_cAutoTS2) ){ RxStatus(pRxSet, "SON"); } pRxSet->m_PeakSig = 0; pRxSet->m_AvgSig.Create(32); } } if( m_TX ){ pRxSet->m_cAutoTS1 = -5 * SAMPFREQ/m_BufferSize; } else if( pRxSet->m_cAutoTS1 >= 0 ){ pRxSet->m_cAutoTS1 = 10 * SAMPFREQ/m_BufferSize; } } else { pRxSet->m_SQTimer = 0; if( pRxSet->m_cAutoTS1 ){ if( pRxSet->m_cAutoTS1 > 0 ){ pRxSet->m_cAutoTS1--; if( sys.m_fAutoTS && !pRxSet->m_cAutoTS1 ){ RxStatus(pRxSet, "SOFF"); } } else { pRxSet->m_cAutoTS1++; } } } if( pRxSet->m_cAutoTS2 ) pRxSet->m_cAutoTS2--; if( pRxSet->m_AFCTimerN ){ pRxSet->m_AFCTimerN--; pRxSet->m_pDem->m_fEnableAFC = FALSE; } else if( pRxSet->Is170() ){ pRxSet->m_pDem->m_fEnableAFC = pRxSet->m_SQ && (pRxSet->m_SQTimer > 4) && (pRxSet->m_StgFFT.Sig >= (600+500)); } else { pRxSet->m_pDem->m_fEnableAFC = pRxSet->m_SQ; } if( pRxSet->m_StgFFT.Timer ){ pRxSet->m_StgFFT.Timer--; return; } else { pRxSet->m_StgFFT.Sig = (pRxSet->m_StgFFT.dBWMax - pRxSet->m_StgFFT.dBSum); pRxSet->m_fATC = (pRxSet->m_StgFFT.Sig >= ((m_ATCLevel*100)+300)); m = pRxSet->Is170() ? (1700+300) : (2000+300); pRxSet->m_pDem->m_Decode.SetMeasClock((pRxSet->m_StgFFT.Sig >= m)); pRxSet->m_pDem->m_DecPSK.SetSN(pRxSet->m_StgFFT.Sig); } // 広域AFCの動作 BOOL fAFC = pRxSet->m_pDem->m_fAFC && m_AFCWidth && (m_TX != txINTERNAL); if( fAFC ){ switch(pRxSet->m_Mode){ case MODE_N_BPSK: case MODE_BPSK: case MODE_qpsk_L: case MODE_qpsk_U: case MODE_GMSK: sq = (pRxSet->m_SQTimer >= 8) ? pRxSet->m_AFCSQ : (d >= pRxSet->m_StgFFT.dBMax/3); break; case MODE_FSKW: case MODE_FSK: sq = (pRxSet->m_SQTimer >= 32) ? pRxSet->m_AFCSQ : (d >= pRxSet->m_StgFFT.dBMax/2); break; case MODE_RTTY: case MODE_U_RTTY: sq = (pRxSet->m_SQTimer >= 32) ? pRxSet->m_AFCSQ : (d >= pRxSet->m_StgFFT.dBMax/2); break; case MODE_mfsk_L: case MODE_mfsk_U: sq = (pRxSet->m_SQTimer >= 8) ? pRxSet->m_AFCSQ : (d >= pRxSet->m_StgFFT.dBMax/2); break; } if( !sq ){ if( (m_AFCWidth > 50) && !pRxSet->IsMFSK() ){ xl = (fo - m_AFCWidth) * FFT_SIZE / m_FFTSampFreq; xh = (fo + m_AFCWidth) * FFT_SIZE / m_FFTSampFreq; int o = (xh + xl)/2; int m = (xh - xl)/2; int rmax = 0; int lmax = 0; int rc = 0; int lc = 0; int lm = 200 * FFT_SIZE / m_FFTSampFreq; for( i = 1; i < m; i++ ){ if( (o - i) > lm ){ y = m_fftout[o-i]; if( y > lmax ){ lc = i; lmax = y; } } y = m_fftout[o+i]; if( y > rmax ){ rc = i; rmax = y; } } int th = ((m_AFCLevel*100) + 450); if( pRxSet->IsMFSK() && (th < 1650) ) th = 1650; lmax = AdjDB(lmax) - pRxSet->m_StgFFT.dBSum; rmax = AdjDB(rmax) - pRxSet->m_StgFFT.dBSum; if( pRxSet->IsRTTY() ){ if( (lmax > th) && (rmax > th) ){ o += (rc - lc); } else if( !sq ){ if( lmax > th ){ o -= lc; } else if( rmax > th ){ o += rc; } else { o = 0; } } else { o = 0; } } else if( (lmax > th) && (rmax > th) ){ if( (rc + lc) < 10 ){ if( rmax > lmax ){ o += rc; } else { o -= lc; } } else { if( rc < lc ){ o += rc; } else { o -= lc; } } } else if( lmax > th ){ o -= lc; } else if( rmax > th ){ o += rc; } else { o = 0; } if( o ){ int fq = o * m_FFTSampFreq / FFT_SIZE; o = fq - fo; m = ABS(o); if( m < m_AFCWidth ){ int diff; BOOL bPSK = FALSE; switch(pRxSet->m_Mode){ case MODE_N_BPSK: case MODE_BPSK: case MODE_qpsk_L: case MODE_qpsk_U: bPSK = TRUE; diff = pRxSet->m_Speed*1.2; break; case MODE_GMSK: diff = pRxSet->m_Speed; break; case MODE_FSK: diff = pRxSet->m_Speed*2; break; case MODE_FSKW: case MODE_RTTY: case MODE_U_RTTY: diff = pRxSet->m_pDem->m_RTTYShift; break; case MODE_mfsk_L: if( !sys.m_MFSK_Center ) fq += pRxSet->m_pDem->m_MFSK_BW/2; diff = pRxSet->m_pDem->m_MFSK_BW*1.5; break; case MODE_mfsk_U: if( !sys.m_MFSK_Center ) fq -= pRxSet->m_pDem->m_MFSK_BW/2; diff = pRxSet->m_pDem->m_MFSK_BW*1.5; break; } if( !pRxSet->m_AFCTimerW && (pRxSet->m_AFCTimerW2 > 8) && (ABS(pRxSet->m_AFCFQ - fq) < diff) ){ if( (m < 30) || (bPSK && (m < 50)) || (pRxSet->IsRTTY() && (m < 220)) ){ fo = GetSignalFreq(fo+o, 50, pRxSet); o = 0; } else if( m < 80 ){ o /= 3; } else if( m < 160 ){ o /= 8; } else { o /= 10; } pDem->SetCarrierFreq(fo + o); } pRxSet->m_AFCTimerW2++; // pRxSet->m_AFCFQ = (pRxSet->m_AFCFQ + (fq * 2)) / 3; pRxSet->m_AFCFQ = pRxSet->m_AvgAFC.DoZ(fq); } } else { pRxSet->m_AFCTimerW2 -= pRxSet->IsRTTY() ? 3 : 2; if( pRxSet->m_AFCTimerW2 < 0 ) pRxSet->m_AFCTimerW2 = 0; } } else { pRxSet->m_AFCFQ = fo; } } else if( pRxSet->IsMFSK() ){ if( !fMFSKMet ){ DoAFCMFSK(pRxSet, fo, TRUE); } } else { double bw = pRxSet->GetBandWidth(); if( bw > 25.0 ){ fm = GetSignalFreq(fo, bw*0.75, pRxSet, pRxSet->m_SQ ? 600 : (m_AFCLevel*100)+450); pRxSet->m_AFCFQ = pRxSet->m_AvgAFC.DoZ(fm); if( pRxSet->m_SQ ){ m = ABS(fo - pRxSet->m_AFCFQ); fm = bw * 0.5; if( fm < m_AFCWidth ) fm = m_AFCWidth; if( (m >= int(bw*0.2)) && (m < fm) ){ pRxSet->m_AFCTimerPSK++; if( pRxSet->m_AFCTimerPSK >= UINT(IsBPSK() ? 6 : 8) ){ fm = (pRxSet->m_AFCFQ - fo)*0.75; pDem->SetCarrierFreq(fo+fm); } } else { pRxSet->m_AFCTimerPSK = 0; } } } } } else if( pRxSet->IsMFSK() ){ DoAFCMFSK(pRxSet, fo, FALSE); } else { double bw = pRxSet->GetBandWidth(); fm = GetSignalFreq(fo, bw*0.75, pRxSet, pRxSet->m_SQ ? 600 : (m_AFCLevel*100)+450); pRxSet->m_AFCFQ = pRxSet->m_AvgAFC.DoZ(fm); } pRxSet->m_AFCSQ = pRxSet->m_SQ; if( pRxSet->m_SQ ){ pRxSet->m_AFCTimerW = 3 * SAMPFREQ / m_BufferSize; } else if( pRxSet->m_AFCTimerW ){ pRxSet->m_AFCTimerW--; pRxSet->m_AFCTimerW2 = 0; } sum = int((pRxSet->m_StgFFT.Sig-500)*0.01); if( m_TX != txINTERNAL ){ if( m_FFT.m_FFTGain ){ if( sum >= 38 ){ sum += (sum - 38) * 1.75; } } else { if( sum >= 32 ){ sum += (sum - 32) * 0.357; } } } if( sum < 0 ) sum = 0; if( sum > 96 ) sum = 96; pRxSet->m_StgFFT.DispSig = sum; if( pRxSet == &m_RxSet[0] ){ sprintf(m_TextBuff, "S/N=%ddB", sum); DrawStatus(statusSN, m_TextBuff); } if( !m_TX ){ if( pRxSet->m_PeakSig < sum ) pRxSet->m_PeakSig = sum; if( pRxSet->m_SQ ) pRxSet->m_AvgSig.Do(sum); } } //--------------------------------------------------------------------------- #define MFSKAFC_1stATACK (8*11025/2048) // 最初の8秒は範囲広い #define MFSKAFC_2ndATACK (30*11025/2048) // 30秒経過後は範囲狭い #define MFSKAFC_MAX (60*11025/2048) void __fastcall TMainVARI::DoAFCMFSK(CRxSet *pRxSet, int fo, BOOL fUpdate) { if( !m_AFCWidth ) return; int bw; int xl, xh, x, xx; CDEMFSK *pDem = pRxSet->m_pDem; if( sys.m_MFSK_Center ){ bw = (pDem->m_MFSK_BW*0.5) + 0.5; xl = fo - bw; xh = fo + bw; } else { bw = pDem->m_MFSK_BW + 0.5; if( pRxSet->m_Mode == MODE_mfsk_U ){ xl = fo; xh = fo + bw; } else { xl = fo - bw; xh = fo; } } xl = int((xl * FFT_SIZE / m_FFTSampFreq)); xh = int((xh * FFT_SIZE / m_FFTSampFreq) + 0.5); int f; if( pRxSet->m_AFCTimerMFSK < MFSKAFC_2ndATACK ){ if( pRxSet->m_AFCTimerMFSK < MFSKAFC_1stATACK ){ f = m_AFCWidth; if( f >= 32 ) f = 32; } else { f = pDem->m_MFSK_SPEED; } f = f * FFT_SIZE / m_FFTSampFreq; xl -= f; xh += f; } else { if( pDem->m_MFSK_TONES == 8 ){ xl-=2; xh+=2; } else { xl--; xh++; } } if( pRxSet->m_AFCTimerMFSK < MFSKAFC_MAX ){ pRxSet->m_AFCTimerMFSK++; if( pDem->GetMFSKMetric(0) >= 800 ){ pRxSet->m_AFCTimerMFSK+=8; } } int d; int avg = 0; int max = 0; xx = xl; for( x = xl; x <= xh; x++ ){ d = m_fftout[x]; avg += d; if( max < d ){ max = d; xx = x; } } avg /= (xh - xl); int maxdb, avgdb; if( m_FFT.m_FFTGain ){ avgdb = SqrtToDB(avg); maxdb = SqrtToDB(max); } else { double k = 100.0 / m_fftSC; avgdb = avg * k; maxdb = max * k; } if( (maxdb - avgdb) < 750 ) return; xl = m_fftout[xx] - m_fftout[xx-1]; xh = m_fftout[xx] - m_fftout[xx+1]; if( (xl > 0) && (xh > 0) ){ // FFT間隔補正 double off = double(xl - xh) * 0.5 / double(xl + xh); x = ((xx + off) * m_FFTSampFreq / FFT_SIZE) + 0.5; // sprintf(m_TextBuff, "%u", x); // Caption = m_TextBuff; } else { x = (xx * m_FFTSampFreq / FFT_SIZE) + 0.5; } f = 0; if( sys.m_MFSK_Center ){ if( x < (fo - bw) ){ f = x + bw; } else if( x > (fo + bw) ){ f = x - bw; } } else if( pRxSet->m_Mode == MODE_mfsk_U ){ if( x < fo ){ f = x; } else if( x > (fo + bw) ){ f = x - bw; } } else { if( x < (fo - bw) ){ f = x + bw; } else if( x > fo ){ f = x; } } double fq; if( pDem->m_pMFSK->GetAFCShift(fq) ){ #if 0 static int Cnt = 0; char bf[256]; sprintf(bf, "%.1lf (%d)", fq, Cnt++); Application->MainForm->Caption = bf; #endif fq += pDem->m_CarrierFreq; pRxSet->m_AvgAFC.Do(fq); pRxSet->m_AFCFQ = pRxSet->m_AvgAFC.Do(fq) + 0.5; pDem->m_RxFreq = pRxSet->m_AFCFQ; if( fUpdate ){ if( pRxSet->m_AFCFQ != int(pDem->m_CarrierFreq) ){ pDem->SetCarrierFreq(pRxSet->m_AFCFQ); } } } else if( f ){ pRxSet->m_AFCFQ = pRxSet->m_AvgAFC.Do(f)+0.5; pDem->m_RxFreq = pRxSet->m_AFCFQ; if( fUpdate ){ if( pRxSet->m_AFCFQ != int(pDem->m_CarrierFreq) ){ pDem->SetCarrierFreq(pRxSet->m_AFCFQ); } } else { pRxSet->m_AFCTimerMFSK = 0; } } else if( !fUpdate ){ DoAvg(pDem->m_RxFreq, fo, (pRxSet->m_AFCTimerMFSK >= (15*4)) ? 0.1 : 0.005); pRxSet->m_AvgAFC.Do(pDem->m_RxFreq); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxRXPaint(TObject *Sender) { m_Dump.Paint(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxTXPaint(TObject *Sender) { m_Edit[m_CurrentEdit].Paint(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::AttachFocus(void) { SetTXFocus(); m_Edit[m_CurrentEdit].CreateCaret(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DettachFocus(void) { m_Edit[m_CurrentEdit].DestroyCaret(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormActivate(TObject *Sender) { AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormDeactivate(TObject *Sender) { DettachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PCTXEnter(TObject *Sender) { AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PCTXExit(TObject *Sender) { DettachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxTXClick(TObject *Sender) { DeleteMacroTimer(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnChar(int Key) { CDump *pEdit = &m_Edit[m_CurrentEdit]; if( m_TX ){ if( Key == '\b' ){ if( !pEdit->CanEdit() ) return; if( !pEdit->GetCharCount(TRUE) && pEdit->GetCharCount(FALSE) ){ if( IsRTTY() ){ Key = 'X'; } else { m_ModFSK.m_Encode.PutChar(Key); } } } } if( Key >= 0x8140 ){ pEdit->PutChar(Key, 1); } else { if( IsRTTY() ) Key = toupper(Key); pEdit->PutKey(char(Key), 1); } if( m_TX && (m_fReqRX == 1) ){ m_fReqRX = 0; m_ModFSK.m_Encode.m_fReqRX = FALSE; SetTXCaption(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormKeyPress(TObject *Sender, char &Key) { #if !KEY_DIRECT if( ActiveControl == PCTX ){ OnChar(Key & 0x00ff); } #endif } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateWaveCaption(void) { SBWave->Caption = m_WaveType ? "Wav.":"Sync"; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTXCaption(void) { if( m_fReqRX ){ SBTX->Caption = m_fReqRX > 1 ? "Wait" : "ReqRX"; } else if( m_fTone ){ SBTX->Caption = "TONE"; } else { AnsiString as = m_TX ? "RX" : "TX"; LPCSTR pKey = GetKeyName(sys.m_DefKey[kkTX]); if( *pKey && (strlen(pKey) < 5) ){ sprintf(m_TextBuff, "(%s)", pKey); as += m_TextBuff; } SBTX->Caption = as; } AnsiString as = "TXOFF"; LPCSTR pKey = GetKeyName(sys.m_DefKey[kkTXOFF]); if( *pKey && (strlen(pKey) < 3) ){ sprintf(m_TextBuff, "(%s)", pKey); as += m_TextBuff; } SBTXOFF->Caption = as; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetPTT(BOOL fTX) { if( m_pCom ) m_pCom->SetPTT(fTX); if( m_pRadio ){ if( fTX ) WaitICOM(); m_pRadio->SetPTT(fTX); } m_Wave.SetPTT(fTX); LogLink.SetPTT(fTX); DoEvent(macOnPTT); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::RxStatus(CRxSet *pRxSet, LPCSTR p) { CDump *pDump; if( pRxSet == &m_RxSet[0] ){ pDump = &m_Dump; } else if( pRxSet->m_pView ){ pDump = &pRxSet->m_pView->m_Dump; } else { return; } if( m_StatusUTC ){ ::GetUTC(&m_LocalTime); } else { ::GetLocal(&m_LocalTime); } pDump->PutStatus(3, "[%s %u/%u/%u %02u:%02u:%02u]\r", p, m_LocalTime.wYear, m_LocalTime.wMonth, m_LocalTime.wDay, m_LocalTime.wHour, m_LocalTime.wMinute, m_LocalTime.wSecond ); pRxSet->m_cAutoTS2 = 600 * SAMPFREQ/m_BufferSize; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTXInternal(void) { if( sys.m_LoopBack == loopINTERNAL ){ m_RxSet[0].SetCarrierFreq(UdTxCarrier->Position * SAMPFREQ/(SAMPFREQ+SAMPTXOFFSET)); CRxSet *pRxSet = m_RxSet; for( int i = 0; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ){ if( i ){ pRxSet->SetSampleFreq((SAMPFREQ+SAMPTXOFFSET)*m_DecFactor); if( pRxSet->m_fAFC ){ int f = pRxSet->m_pDem->m_CarrierFreq - UdTxCarrier->Position; f = ABS(f); if( f < (pRxSet->m_Speed * 0.5) ) pRxSet->SetCarrierFreq(UdTxCarrier->Position); } } pRxSet->m_pDem->MakeBPF(8); // CPU負荷低減のため pRxSet->m_pDem->m_Decode.m_fATC = FALSE; pRxSet->m_pDem->m_DecPSK.m_bATC = FALSE; pRxSet->m_pDem->m_fAFC = FALSE; pRxSet->m_pDem->m_Decode.Create(); // pRxSet->m_pDem->m_Decode.SetTmg(i ? 0 : 1e6*((SAMPFREQ+SAMPTXOFFSET)/SAMPFREQ - 1.0)); pRxSet->m_pDem->SetTmg(i ? 0 : 1e6*((SAMPFREQ+SAMPTXOFFSET)/SAMPFREQ - 1.0)); pRxSet->m_pDem->m_AGC.Reset(); // pRxSet->m_PeakSig = 0; // pRxSet->m_AvgSig.Create(32); for( int j = 0; j < m_BufferSize; j++ ){ pRxSet->m_pDem->Do(0); } pRxSet->InitStgFFT(); } } FFTSampleFreq(SAMPFREQ + SAMPTXOFFSET); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ToTone(void) { if( m_fSuspend ) return; if( !SBTX->Enabled ) return; m_fTone = TRUE; SBTX->Down = TRUE; m_TX = (sys.m_LoopBack == loopINTERNAL) ? txINTERNAL : txEXTERNAL; if( sys.m_LoopBack == loopINTERNAL ){ m_Wave.InClose(); DeleteSoundTimer(); } if( SBNET->Down ){ m_fDisEvent++; UdTxCarrier->Position = UdRxCarrier->Position; m_fDisEvent--; } m_ModFSK.Reset(); // For Signal/CW gain m_ModFSK.SetCarrierFreq(UdTxCarrier->Position); SetTXInternal(); m_fSendChar = FALSE; m_Wave.m_hWnd = Handle; InitWater(iniwMETRIC); if( !m_Wave.IsOutOpen() ) OpenSound(TRUE); memset(m_wBuffer, 0, sizeof(m_wBuffer)); if( m_pCom ){ m_pCom->SetSendChar(FALSE); } SetPTT(TRUE); SetTXCaption(); RxStatus(&m_RxSet[0], "TX"); if( m_Wave.IsOutFirst() ){ while(!m_Wave.IsOutBufFull()){ DoMod(); if( sys.m_LoopBack == loopINTERNAL ) DoDem(); m_Wave.OutWrite(m_wBuffer); } } UpdateUI(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ToTX(void) { #if DEBUG if( m_fpTest ){ fclose(m_fpTest); m_fpTest = NULL; } if( sys.m_test ){ m_Wave.OutAbort(); sys.m_test = FALSE; } #endif if( m_fSuspend ) return; if( !SBTX->Enabled ) return; StopPlayBack(); m_SendingEdit = m_CurrentEdit; BOOL fATone = m_fTone; m_fTone = FALSE; SBTX->Down = TRUE; m_TX = (sys.m_LoopBack == loopINTERNAL) ? txINTERNAL : txEXTERNAL; if( sys.m_LoopBack == loopINTERNAL ){ m_Wave.InClose(); DeleteSoundTimer(); } if( SBNET->Down ){ m_fDisEvent++; UdTxCarrier->Position = UdRxCarrier->Position; m_fDisEvent--; } CDump *pEdit = &m_Edit[m_CurrentEdit]; BOOL fCW = (pEdit->GetCharNB() & 0xff00) == 0x100; if( !fATone ) m_ModFSK.Reset(); // For Signal/CW gain m_ModFSK.m_Encode.Reset(fCW); while(pEdit->GetCharNB() == 0x200){ pEdit->GetChar(TRUE); m_ModFSK.m_Encode.PutChar(0x200); } if( KOAI->Checked && !fCW ){ m_ModFSK.m_Encode.PutChar('\r'); m_ModFSK.m_Encode.PutChar('\n'); } if( !fATone ) m_ModFSK.SetCarrierFreq(SBNET->Down ? m_RxSet[0].m_pDem->m_CarrierFreq : UdTxCarrier->Position); m_RxSet[0].m_pDem->ResetMFSK(); SetTXInternal(); m_fSendChar = FALSE; m_Wave.m_hWnd = Handle; InitWater(iniwMETRIC); if( !m_Wave.IsOutOpen() ) OpenSound(TRUE); if( m_pCom ){ m_pCom->SetDiddle(m_ModFSK.m_Encode.GetDiddle()); m_pCom->SetSendChar(IsRTTY()); } if( !fATone ){ SetPTT(TRUE); memset(m_wBuffer, 0, sizeof(m_wBuffer)); } if( sys.m_LoopBack == loopINTERNAL ){ DoDem(); if( !m_RxSet[0].IsMFSK() ){ for( int i = 0; i < 8192; i++ ){ m_RxSet[0].m_pDem->m_Decode.Do(1, TRUE, FALSE); } if( m_RxSet[0].IsQPSK() ) m_RxSet[0].m_pDem->m_DecPSK.ResetRX(); } } if( !fATone ) RxStatus(&m_RxSet[0], "TX"); if( m_Wave.IsOutFirst() ){ while(!m_Wave.IsOutBufFull()){ DoMod(); if( sys.m_LoopBack == loopINTERNAL ) DoDem(); m_Wave.OutWrite(m_wBuffer); } } UpdateUI(); if( m_fReqRX ){ m_fReqRX = 1; m_ModFSK.m_Encode.m_fReqRX = TRUE; SBTX->Caption = "ReqRX"; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ToRX(void) { m_fTone = FALSE; RxStatus(&m_RxSet[0], "RX"); if( m_fpText ){ fclose(m_fpText); m_fpText = NULL; } SBTX->Down = FALSE; m_TX = txRX; m_fReqRX = FALSE; m_ModFSK.m_Encode.m_fReqRX = FALSE; SetTXCaption(); if( m_WaveFile.m_mode != 1 ){ m_Wave.OutAbort(); DeleteSoundTimer(); } SetPTT(FALSE); InitWater(iniwMETRIC); if( !m_Wave.IsInOpen() ){ // Loopback == loopINTERNAL SetBPFType(GetBPFType()); m_RxSet[0].SetCarrierFreq( (UdRxCarrier->Position != int(m_ModFSK.m_CarrierFreq+0.5)) ? UdRxCarrier->Position : m_ModFSK.m_CarrierFreq); CRxSet *pRxSet = m_RxSet; int atctmg; if( sscanf(AnsiString(EATC->Text).c_str(), "%d", &atctmg) != 1 ) atctmg = 0; //JA7UDE 0428 for(int i = 0; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ){ if( i ){ pRxSet->SetSampleFreq(DEMSAMPFREQ); pRxSet->m_pDem->MakeBPF(m_RxSet[0].m_pDem->m_PreBPFTaps); } pRxSet->m_pDem->m_AFCCount = 0; pRxSet->m_pDem->m_fAFC = i ? pRxSet->m_fAFC : SBAFC->Down; pRxSet->m_pDem->m_Decode.m_fATC = i ? TRUE : SBATC->Down; pRxSet->m_pDem->m_DecPSK.m_bATC = pRxSet->m_pDem->m_Decode.m_fATC; // if( !pRxSet->IsRTTY() ) pRxSet->m_pDem->m_Decode.SetTmg(i ? 0 : atctmg); pRxSet->m_pDem->SetTmg((i || pRxSet->IsMFSK()||pRxSet->IsQPSK()) ? 0 : atctmg); pRxSet->m_pDem->m_Decode.ResetMeasRTTY(); pRxSet->m_pDem->ResetMFSK(); for( int j = 0; j < m_BufferSize; j++ ){ pRxSet->m_pDem->Do(0); pRxSet->m_pDem->m_Decode.Do(0, 0, FALSE); } pRxSet->m_pDem->m_DecPSK.ResetRX(); pRxSet->m_pDem->m_AGC.Reset(); pRxSet->InitStgFFT(); pRxSet->m_SQ = FALSE; pRxSet->m_AFCTimerW = 5 * SAMPFREQ / m_BufferSize; pRxSet->m_AFCTimerN = SAMPFREQ / m_BufferSize; pRxSet->m_SQTimer = 0; pRxSet->m_AFCTimerPSK = 0; pRxSet->m_AFCTimerMFSK = MFSKAFC_MAX; pRxSet->m_PeakSig = 0; pRxSet->m_AvgSig.Create(32); } } if( m_WaveFile.m_mode != 1 ) OpenSound(FALSE); FFTSampleFreq(SAMPFREQ); m_FFT.ClearStg(); } else { // loopEXTERNAL m_RxSet[0].m_AFCTimerN = 3 * SAMPFREQ / m_BufferSize; } m_RxSet[0].m_PeakSig = 0; m_RxSet[0].m_AFCTimerPSK = 0; m_RxSet[0].m_AFCTimerMFSK = MFSKAFC_MAX; if( m_ReqMacroTimer ) CreateMacroTimer(m_ReqMacroTimer); UpdateUI(); if( m_ReqAutoClear ) KVCTClick(NULL); if( m_ReqAutoReturn ){ m_ReqAutoReturn = FALSE; SetEditPage(m_SaveEditPage); } if( m_ReqAutoNET ){ m_ReqAutoNET = FALSE; if( !SBNET->Down ){ SBNET->Down = TRUE; SBNETClick(NULL); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DeleteSoundTimer(void) { if( m_pSoundTimer ){ m_pSoundTimer->Enabled = FALSE; delete m_pSoundTimer; m_pSoundTimer = NULL; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBTXMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ if( m_TX ){ if( m_fTone && (m_fReqRX != 1) ){ m_fReqRX = 1; m_ModFSK.m_Encode.m_fReqRX = TRUE; } } else { ToTone(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBTXClick(TObject *Sender) { DeleteMacroTimerS(); if( SBTX->Down ){ ToTX(); } else if( m_fReqRX ){ if( m_fReqRX == 1 ){ m_fReqRX = FALSE; m_ModFSK.m_Encode.m_fReqRX = FALSE; } SBTX->Down = SBTX->Enabled ? TRUE : FALSE; if( !SBTX->Down ) m_TX = txRX; } else { m_fReqRX = TRUE; m_ModFSK.m_Encode.m_fReqRX = TRUE; SBTX->Down = SBTX->Enabled ? TRUE : FALSE; if( !SBTX->Down ) m_TX = txRX; m_Edit[m_CurrentEdit].MoveCursor(dmpMoveLAST); } SetTXCaption(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBTXOFFClick(TObject *Sender) { m_ReqAutoClear = FALSE; DeleteMacroTimer(); if( m_TX ){ ToRX(); } else if( m_fReqRX ){ m_fReqRX = FALSE; SetTXCaption(); } m_Edit[m_CurrentEdit].MoveCursor(dmpMoveLAST); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PCRXResize(TObject *Sender) { m_Dump.Resize(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PCTXResize(TObject *Sender) { m_Edit[m_CurrentEdit].Resize(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBFFTClick(TObject *Sender) { m_fftMX = 0; Draw(TRUE); } //--------------------------------------------------------------------------- TSpeedButton *__fastcall TMainVARI::GetDraw(int n) { switch(n){ case 1: return SBWater; case 2: return SBWave; default: return SBFFT; } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetDrawType(void) { for( int i = 0; i < 3; i++ ){ if( GetDraw(i)->Down ) return i; } return 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetDrawType(int n) { TSpeedButton *pButton = GetDraw(n); pButton->Down = TRUE; } //--------------------------------------------------------------------------- TSpeedButton *__fastcall TMainVARI::GetBPF(int n) { switch(n){ case 1: return SBBPFM; case 2: return SBBPFN; case 3: return SBBPFS; default: return SBBPFW; } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetBPFType(void) { for( int i = 0; i < 4; i++ ){ if( GetBPF(i)->Down ) return i; } return 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetBPFType(int n) { TSpeedButton *pButton = GetBPF(n); pButton->Down = TRUE; m_RxSet[0].m_pDem->MakeBPF(GetBPFTaps(pButton)); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetBPFTaps(TObject *Sender) { for( int i = 0; i < 4; i++ ){ if( Sender == (TObject *)GetBPF(i) ){ return g_tBpfTaps[i]; } } return 64; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBBPFWClick(TObject *Sender) { if( m_fDisEvent ) return; int taps = GetBPFTaps(Sender); CDEMFSK *pDem = m_RxSet[0].m_pDem; int delay = (pDem->m_inBPF.GetTap() - taps)/2; pDem->MakeBPF(taps); CRxSet *pRxSet = &m_RxSet[1]; for( int i = 1; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ){ pRxSet->m_pDem->MakeBPF(pDem->m_PreBPFTaps); pRxSet->m_pDem->m_pBPF = &pDem->m_inBPF; } } if( !m_Wave.IsInOpen() ) return; if( delay < 0 ){ while( delay < 0 ){ DoDem(0); delay++; } } else { m_SkipTmg = delay; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTxFreq(int fq) { if( (fq >= MIN_CARRIER) && (fq <= sys.m_MaxCarrier) ){ m_ModFSK.SetCarrierFreq(fq); m_fDisEvent++; UdTxCarrier->Position = short(fq); if( m_TX && SBNET->Down ){ UdRxCarrier->Position = short(fq); } if( UdTxCarrier->Position != UdRxCarrier->Position ) SBNET->Down = FALSE; m_fDisEvent--; if( (m_TX == txINTERNAL) || SBNET->Down ){ m_RxSet[0].SetCarrierFreq(fq); } UpdateUI(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetRxFreq(int fq) { if( (fq >= MIN_CARRIER) && (fq <= sys.m_MaxCarrier) ){ if( m_TX != txINTERNAL ){ m_RxSet[0].SetCarrierFreq(fq); } m_fDisEvent++; UdRxCarrier->Position = short(fq); if( m_pRadio ) m_pRadio->SetCarrierFreq(fq); if( !m_TX && SBNET->Down ){ UdTxCarrier->Position = short(fq); } m_fDisEvent--; m_RxSet[0].m_AFCTimerW = 1; m_RxSet[0].m_SQTimer = 0; if( !m_RxSet[0].IsBPSK() ) m_PFTimer = 4; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UdTxCarrierClick(TObject *Sender, TUDBtnType Button) { if( m_fDisEvent ) return; SetTxFreq(UdTxCarrier->Position); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBTxCarrierChange(TObject *Sender) { if( m_fDisEvent ) return; int fq; sscanf(AnsiString(CBTxCarrier->Text).c_str(), "%u", &fq); //JA7UDE 0428 SetTxFreq(fq); if( m_fDrop ){ m_fDrop = FALSE; SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UdRxCarrierClick(TObject *Sender, TUDBtnType Button) { if( m_fDisEvent ) return; SetRxFreq(UdRxCarrier->Position); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBRXCarrierChange(TObject *Sender) { if( m_fDisEvent ) return; int fq; sscanf(AnsiString(CBRXCarrier->Text).c_str(), "%u", &fq); SetRxFreq(fq); if( m_fDrop ){ m_fDrop = FALSE; SetTXFocus(); } else { m_AFCKeyTimer = 3 * SAMPBASE / m_BufferSize; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetSpeedInfo(double b) { if( m_RxSet[0].IsMFSK() ){ switch(m_RxSet[0].m_MFSK_TYPE){ case typMFSK16: strcpy(m_TextBuff, "mfsk16 (15.625 baud, 16 tones)"); break; case typMFSK8: strcpy(m_TextBuff, "mfsk8 (7.8125 baud, 32 tones)"); break; case typMFSK31: strcpy(m_TextBuff, "mfsk31 (31.25 baud, 8 tones)"); break; case typMFSK11: strcpy(m_TextBuff, "mfsk11 (10.767 baud, 16 tones)"); break; case typMFSK22: strcpy(m_TextBuff, "mfsk22 (21.533 baud, 16 tones)"); break; case typMFSK32: strcpy(m_TextBuff, "mfsk32 (31.25 baud, 16 tones)"); break; case typMFSK64: strcpy(m_TextBuff, "mfsk64 (62.5 baud, 16 tones)"); break; case typMFSK4: strcpy(m_TextBuff, "mfsk4 (3.90625 baud, 32 tones)"); break; } } else { StrDbl(m_TextBuff, b); strcat(m_TextBuff, "Bps"); } switch( m_RxSet[0].m_Mode ){ case MODE_BPSK: case MODE_N_BPSK: if( b == 31.25 ){ strcat(m_TextBuff, " (PSK31)"); } else if( b == 62.5 ){ strcat(m_TextBuff, " (PSK63)"); } else if( b == 125 ){ strcat(m_TextBuff, " (PSK125)"); } else if( b == 250 ){ strcat(m_TextBuff, " (PSK250)"); } break; case MODE_qpsk_L: case MODE_qpsk_U: if( b == 31.25 ){ strcat(m_TextBuff, " (QPSK31)"); } else if( b == 62.5 ){ strcat(m_TextBuff, " (QPSK63)"); } else if( b == 125 ){ strcat(m_TextBuff, " (QPSK125)"); } else if( b == 250 ){ strcat(m_TextBuff, " (QPSK250)"); } break; case MODE_RTTY: case MODE_U_RTTY: if( b == 45.45 ){ strcat(m_TextBuff, sys.m_MsgEng ? "(Standard)":"(標準)"); } break; } if( IsRTTY() ){ if( b != 45.45 ){ strcat(m_TextBuff, sys.m_MsgEng ? " : 45.45Bps is standard" : " : 標準は45.45Bps"); } } else if( !m_RxSet[0].IsMFSK() ){ if( b != 31.25 ){ strcat(m_TextBuff, sys.m_MsgEng ? " : 31.25Bps is standard" : " : 標準は31.25Bps"); } } SetInfoMsg(m_TextBuff); DoEvent(macOnSpeed); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBSpeedChange(TObject *Sender) { if( m_fDisEvent ) return; double b; sscanf(AnsiString(CBSpeed->Text).c_str(), "%lf", &b); //JA7UDE 0428 SpeedChange(b); if( m_fDrop ){ m_fDrop = FALSE; SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SpeedChange(double b) { if( m_RxSet[0].IsMFSK() ){ m_RxSet[0].SetMFSKType(MFSK_Speed2Type(b)); #if DEBUG m_ModTest.SetMFSKType(m_RxSet[0].m_MFSK_TYPE); #endif m_ModFSK.SetMFSKType(m_RxSet[0].m_MFSK_TYPE); InitCollect(); SetSpeedInfo(b); } else if( (b >= MIN_SPEED) && (b <= MAX_SPEED) && (b != m_RxSet[0].m_Speed) ){ m_RxSet[0].SetSpeed(b); #if DEBUG m_ModTest.SetSpeed(b); #endif m_ModFSK.SetSpeed(b); InitCollect(); SetSpeedInfo(b); if( IsRTTY() && sys.m_bFSKOUT && m_pCom && m_pCom->IsBaudChange(b) ){ OpenCom(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateSpeed(CRxSet *pRxSet, double b) { if( pRxSet == &m_RxSet[0] ){ if( pRxSet->IsMFSK() ){ SpeedChange(b); UpdateUI(); } else { m_fDisEvent++; char bf[256]; CBSpeed->Text = StrDbl(bf, b); m_fDisEvent--; CBSpeedChange(NULL); } } else if( pRxSet->IsMFSK() ){ pRxSet->SetMFSKType(MFSK_Speed2Type(b)); } else { pRxSet->SetSpeed(b); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateMode(CRxSet *pRxSet, int offset) { if( pRxSet == &m_RxSet[0] ){ if( IsRTTY() ){ GBTiming->Caption = "Timing(ms)"; } else { GBTiming->Caption = "Timing(ppm)"; } if( offset ){ SetRxFreq(UdRxCarrier->Position + offset); if( m_TX || !SBNET->Down ){ SetTxFreq(UdTxCarrier->Position + offset); } } } else if( offset ){ pRxSet->SetCarrierFreq(pRxSet->m_CarrierFreq + offset); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFSClick(TObject *Sender) { if( m_fpText ){ fclose(m_fpText); m_fpText = NULL; } else { TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Send text file"; pBox->Filter = "Text Files(*.txt)|*.txt|"; } else { pBox->Title = "テキストファイルの送信"; pBox->Filter = "テキストファイル(*.txt)|*.txt|"; } pBox->FileName = ""; pBox->DefaultExt = "txt"; pBox->InitialDir = sys.m_TextDir; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ SetDirName(sys.m_TextDir, AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 OnWave(); m_fpText = fopen(AnsiString(pBox->FileName).c_str(), "rb"); //JA7UDE 0428 if( !m_TX ) ToTX(); } delete pBox; AttachFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetFFTWidth(int fw) { // int fo = m_FFTB + m_FFTW/2; if( SBWater->Down ) InitWater(iniwMETRIC); int fo = UdRxCarrier->Position; switch(fw){ case 500: SBFFT500->Down = TRUE; break; case 1000: SBFFT1K->Down = TRUE; break; case 2000: SBFFT2K->Down = TRUE; break; default: SBFFT3K->Down = TRUE; fw = 3000; break; } m_FFTW = fw; m_FFTWindow = m_FFTW * FFT_SIZE / m_FFTSampFreq; CalcFFTCenter(fo); Draw(TRUE); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBFFT500Click(TObject *Sender) { int fw; if( SBFFT3K->Down ){ fw = 3000; } else if( SBFFT2K->Down ){ fw = 2000; } else if( SBFFT500->Down ){ fw = 500; } else { fw = 1000; } SetFFTWidth(fw); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UdATCClick(TObject *Sender, TUDBtnType Button) { if( m_fDisEvent ) return; int d; sscanf(AnsiString(EATC->Text).c_str(), "%d", &d); //JA7UDE 0428 d = d - (d % 200); if( Button == Comctrls::btNext ){ d += 200; } else { d -= 200; } if( d < -m_ATCLimit ) d = -m_ATCLimit; if( d > m_ATCLimit ) d = m_ATCLimit; m_RxSet[0].m_pDem->m_Decode.SetTmg(d); m_RxSet[0].m_pDem->m_DecPSK.SetTmg(d); EATC->Text = d; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBAFCClick(TObject *Sender) { if( m_TX != txINTERNAL ){ CDEMFSK *pDem = m_RxSet[0].m_pDem; m_RxSet[0].m_fAFC = pDem->m_fAFC = SBAFC->Down; if( pDem->m_fAFC && m_RxSet[0].IsMFSK() ){ m_RxSet[0].m_AFCFQ = pDem->m_CarrierFreq; m_RxSet[0].m_AvgAFC.Reset(pDem->m_CarrierFreq); pDem->m_RxFreq = pDem->m_CarrierFreq; if( m_RxSet[0].m_AFCTimerMFSK < MFSKAFC_1stATACK ){ m_RxSet[0].m_AFCTimerMFSK = MFSKAFC_1stATACK; } } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBATCClick(TObject *Sender) { UpdateUI(); if( m_TX == txINTERNAL ) return; m_RxSet[0].m_pDem->m_Decode.m_fATC = SBATC->Down; m_RxSet[0].m_pDem->m_DecPSK.m_bATC = SBATC->Down; if( !SBATC->Down ){ int atctmg; if( sscanf(AnsiString(EATC->Text).c_str(), "%d", &atctmg) == 1 ){ //JA7UDE 0428 m_RxSet[0].m_pDem->m_Decode.SetTmg(atctmg); m_RxSet[0].m_pDem->m_DecPSK.SetTmg(atctmg); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxFFTMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { DeleteMacroTimer(); m_MouseDown = FALSE; if( SBFFT->Down || SBWater->Down ){ double fq = m_FFTB + X * m_FFTW / m_fftXW; if( fq < MIN_CARRIER ) fq = MIN_CARRIER; if( fq > sys.m_MaxCarrier ) fq = sys.m_MaxCarrier; if( Button == mbRight ){ m_RightX = X; m_RightFreq = fq + 0.5; RECT rc; ::GetWindowRect(PFFT->Handle, &rc); rc.left += X; if( !m_MouseNotch && (!m_fSubWindow || !m_MouseSubChannel) ){ m_fftMX = ((fq - m_FFTB) * m_fftXW / m_FFTW) + 0.5; PBoxFFTPaint(NULL); } PupSpec->Popup(rc.left, rc.bottom); m_fftMX = 0; PBoxFFTPaint(NULL); } else if( Button == mbLeft ){ if( m_MouseSubChannel || m_MouseNotch ){ m_MouseDown = TRUE; } else if( m_TX != txINTERNAL ){ m_RxSet[0].m_pDem->m_Decode.Reset(); m_RxSet[0].m_pDem->ResetMeasMFSK(); m_RxSet[0].m_PeakSig = 0; m_RxSet[0].m_AFCTimerMFSK = (SBFFT500->Down || SBFFT1K->Down) ? MFSKAFC_MAX : 0; if( !SBFFT500->Down ){ fq = GetSignalFreq(fq, SBFFT3K->Down ? 50 : 32, &m_RxSet[0]); } SetRxFreq(fq); m_MouseDown = TRUE; } } } else { if( Button == mbRight ){ m_fftMX = 0; } else { m_fftMX = X; } PBoxFFTPaint(NULL); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxLevelMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbLeft ){ int sq = (m_levelYW - Y) * LEVELMAX / m_levelYW; m_RxSet[0].m_SQLevel = ((sq + 5)/ 10) * 10; DrawLevel(TRUE); m_MouseDown = TRUE; } else if( Button == mbRight ){ RECT rc; ::GetWindowRect(PCLevel->Handle, &rc); PupSQ->PopupComponent = this; PupSQ->Popup(rc.left + X, rc.top + Y); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxLevelMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( m_MouseDown ){ X = (m_levelYW - Y) * LEVELMAX / m_levelYW; if( (X >= 0) && (X <= LEVELMAX) ){ m_RxSet[0].m_SQLevel = X; DrawLevel(TRUE); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxLevelMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { m_MouseDown = FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormResize(TObject *Sender) { if( !m_pBitmapFFT ) return; if( (ClientWidth < 600) || (ClientHeight < 400) ){ if( ClientWidth < 600 ) ClientWidth = 600; if( ClientHeight < 400 ) ClientHeight = 400; return; } PFFT->Font->Charset = sys.m_FontCharset; PFFT->Font->Height = -12; int x = SBFFT->Left + SBFFT->Width + PCLevel->Width + 2; PFFT->Width = ClientWidth - x; if( PBoxFFT->Align != alClient ) CreateMacExButton(); m_fftXW = PBoxFFT->Width; if( m_fftXW != m_pBitmapFFT->Width ){ m_pBitmapFFT->Width = m_fftXW; DrawWater(FALSE, TRUE); } UdMac->Left = PCMac->Width - UdMac->Width; CreateMacButton(); // StatusBar->SizeGrip = (WindowState == wsNormal); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFClick(TObject *Sender) { KFS->Checked = m_fpText != NULL; KFES->Enabled = m_WaveFile.m_mode; KFRS->Enabled = m_WaveFile.m_mode != 2; KFWS->Enabled = m_WaveFile.m_mode != 1; KFWST->Enabled = m_WaveFile.m_mode != 1; if( m_WaveFile.m_mode != 2 ){ KFWS->Checked = FALSE; KFWST->Checked = FALSE; } KFLF->Enabled = Log.IsEdit(); KFL->Checked = m_Dump.IsLogging(); OnMenuProc(KF, "&File"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBRXCarrierDropDown(TObject *Sender) { m_fDrop = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBRXCarrierKeyPress(TObject *Sender, char &Key) { m_fDrop = FALSE; if( Key == VK_RETURN ){ Key = 0; if( Sender == HisCall ){ FindCall(); UpdateUI(); } else if( Sender == CBSpeed ){ double speed; if( m_RxSet[0].IsMFSK() ){ speed = m_RxSet[0].m_pDem->m_MFSK_SPEED; } else { speed = m_RxSet[0].m_Speed; } SetCBSpeed(); SetSpeedInfo(speed); } SetTXFocus(); } else if( Sender == HisCall ){ Key = char(toupper(Key)); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetMacButtonMax(void) { int m = MACBUTTONXW * m_MacButtonVW; UdMac->Max = short((MACBUTTONMAX-1) / m); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CreateMacButton(void) { int xw = PCMac->Width - UdMac->Width - 6; xw /= MACBUTTONXW; int xa = xw * MACBUTTONXW; xa = ((PCMac->Width - UdMac->Width) - xa) / 2; int yw = PCMac->Height / m_MacButtonVW; int low = UdMac->Position * (MACBUTTONXW*m_MacButtonVW); int high = low + (MACBUTTONXW*m_MacButtonVW); MACBUTTON *pList = m_tMacButton; for( int i = 0; i < MACBUTTONMAX; i++, pList++ ){ if( (i < low) || (i >= high) ){ if( pList->pButton ){ PCMac->RemoveControl(pList->pButton); delete pList->pButton; pList->pButton = NULL; } } else { int n = i - low; int y = (n / MACBUTTONXW) * yw; int xm = n % MACBUTTONXW; int x = xm * xw; if( xm >= 4 ) x+=xa; if( xm >= 8 ) x+=xa; TSpeedButton *pButton = pList->pButton; if( !pButton ){ pButton = new TSpeedButton(PCMac); PCMac->InsertControl(pButton); pButton->Parent = PCMac; pButton->OnClick = OnMacButtonClick; pButton->OnMouseDown = OnMacButtonDown; pButton->GroupIndex = 1; pButton->AllowAllUp = TRUE; char bf[16]; sprintf(bf, "%%M%u", i); pButton->Hint = bf; pButton->Down = (i == m_CurrentMacro) && (m_ReqMacroTimer || m_pMacroTimer); pList->pButton = pButton; } else { pButton->Font->Name = sys.m_FontName; pButton->Font->Charset = sys.m_FontCharset; } pButton->Caption = ConvAndChar(m_TextBuff, pList->Name.c_str()); pButton->SetBounds(x, y, xw, yw); pButton->Font->Height = -(yw-4); pButton->Font->Color = pList->Text.IsEmpty() ? clGrayText : pList->Color; TFontStyles fs = Code2FontStyle(pList->Style); pButton->Font->Style = fs; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UdMacClick(TObject *Sender, TUDBtnType Button) { CreateMacButton(); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetMacButtonNo(TSpeedButton *pButton) { MACBUTTON *pList = m_tMacButton; int i; for( i = 0; i < MACBUTTONALL; i++, pList++ ){ if( pButton == pList->pButton ) return i; } return -1; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnMacButtonClick(TObject *Sender) { TSpeedButton *pButton = (TSpeedButton *)Sender; MACBUTTON *pList = m_tMacButton; int i; for( i = 0; i < MACBUTTONALL; i++, pList++ ){ if( pButton == pList->pButton ){ if( pButton->Down ){ m_fMacroRepeat = FALSE; SendButton(i); } else { DeleteMacroTimer(); } break; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnMacButtonDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { TSpeedButton *pButton = (TSpeedButton *)Sender; MACBUTTON *pList = m_tMacButton; int i; for( i = 0; i < MACBUTTONALL; i++, pList++ ){ if( pButton == pList->pButton ){ if( Button == mbRight ){ TMacEditDlg *pBox = new TMacEditDlg(this); DettachFocus(); if( pBox->Execute(pList, i) ){ pButton->Caption = ConvAndChar(m_TextBuff, pList->Name.c_str()); pButton->Font->Color = pList->Text.IsEmpty() ? clGrayText : pList->Color; TFontStyles fs = Code2FontStyle(pList->Style); pButton->Font->Style = fs; } delete pBox; AttachFocus(); } return; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupRXPopup(TObject *Sender) { int n = GetPopupIndex(PupRX->PopupComponent); if( n ){ KRXINV->Visible = m_RxSet[n].IsRTTY(); } else { KRXINV->Visible = IsRTTY(); } KRXN->Visible = KRXINV->Visible; OnMenuProc(PupRX->Items, "PopRX"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXINVClick(TObject *Sender) { int n = GetPopupIndex(PupRX->PopupComponent); CDump *pDump; if( n ){ pDump = &m_RxSet[n].m_pView->m_Dump; } else { pDump = &m_Dump; } pDump->SwapLTR(); } //--------------------------------------------------------------------------- static void __fastcall AdjustCallsign(AnsiString &as) { AnsiString cs; LPCSTR p; int nl = 0; int nu = 0; for(p = as.c_str(); *p; p++ ){ if( isupper(*p) ) nu++; if( islower(*p) ) nl++; } for( p = as.c_str(); *p; p++ ){ if( isdigit(*p) ) break; if( nl > nu ){ if( islower(*p) ) break; } else { if( isupper(*p) ) break; } } for( ; *p; p++ ){ if( *p != '/' ){ if( nl > nu ){ if( isupper(*p) ) break; } else { if( islower(*p) ) break; } } cs += *p; } if( IsCall(cs.c_str()) ){ as = cs; } jstrupr(as.c_str()); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXCALLClick(TObject *Sender) { if( Sender == NULL ){ AnsiString as = m_StrSel; AdjustCallsign(as); HisCall->Text = as; // m_UStrSel; } else { HisCall->Text = m_UStrSel; } FindCall(); UpdateUI(); SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXMYClick(TObject *Sender) { LPCSTR p = m_UStrSel.c_str(); if( PCRX->Font->Charset == SHIFTJIS_CHARSET ){ LPSTR t = m_TextBuff; for( ; *p; p++ ){ if( m_RxSet[0].m_MBCS.IsLead((const unsigned char *)p) ){ int c = *p & 0x000000ff; c = c << 8; p++; c |= (*p & 0x00ff); if( (c >= 0x824f) && (c <= 0x8258) ){ *t++ = BYTE(c + 0x30 - 0x824f); } else { *t++ = BYTE(c >> 8); *t++ = *p; } } else { *t++ = *p; } } *t = 0; p = m_TextBuff; } MyRST->Text = p; SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXQTHClick(TObject *Sender) { HisQTH->Text = m_StrSel; SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXNAMEClick(TObject *Sender) { HisName->Text = m_StrSel; SetTXFocus(); } //--------------------------------------------------------------------------- static BOOL FindDlmStr(LPCSTR v, LPCSTR s) { LPSTR pBF = StrDupe(v); BOOL f = FALSE; LPSTR p = pBF; LPSTR t; while(*p){ p = StrDlm(t, p, -1); if( *t && !strcmpi(t, s) ){ f = TRUE; break; } } delete pBF; return f; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXADDMYClick(TObject *Sender) { AnsiString as = MyRST->Text; as += m_StrSel; MyRST->Text = as; SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXADDNAMEClick(TObject *Sender) { if( !FindDlmStr(AnsiString(HisName->Text).c_str(), m_StrSel.c_str()) ){ //JA7UDE 0428 AnsiString as = HisName->Text; if( !as.IsEmpty() ) as += char(','); as += m_StrSel; HisName->Text = as; } SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXADDNOTEClick(TObject *Sender) { if( !FindDlmStr(AnsiString(EditNote->Text).c_str(), m_StrSel.c_str()) ){ //JA7UDE 0428 AnsiString as = EditNote->Text; if( !as.IsEmpty() ) as += char(','); as += m_StrSel; EditNote->Text = as; } SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXADDQSLClick(TObject *Sender) { if( !FindDlmStr(AnsiString(EditQSL->Text).c_str(), m_StrSel.c_str()) ){ //JA7UDE 0428 AnsiString as = EditQSL->Text; if( !as.IsEmpty() ) as += char(','); as += m_StrSel; EditQSL->Text = as; } SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXNOTEClick(TObject *Sender) { EditNote->Text = m_StrSel; SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRXCopyClick(TObject *Sender) { Clipboard()->AsText = m_StrSel; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxRXMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { DeleteMacroTimer(); BOOL f = m_Dump.ClearAllSelect(FALSE); int r = m_Dump.GetWindowText(m_StrSel, X, Y); if( f || r ) m_Dump.Paint(); if( r ){ m_UStrSel = m_StrSel.c_str(); jstrupr(m_UStrSel.c_str()); RECT rc; ::GetWindowRect(PCRX->Handle, &rc); rc.left += X; rc.top += Y+8; if( Button == mbLeft ){ if( r == 1 ){ // ASCII if( IsCall(m_UStrSel.c_str()) ){ KRXCALLClick(NULL); } else if( IsRST(m_UStrSel.c_str()) ){ KRXMYClick(NULL); } else { PupRX->PopupComponent = this; PupRX->Popup(rc.left, rc.top); } } else { // Shift-JIS PupRX->PopupComponent = this; PupRX->Popup(rc.left, rc.top); } DoEvent(macOnClick); } else if( Button == mbRight ){ PupRX->PopupComponent = this; PupRX->Popup(rc.left, rc.top); } } else if( Button == mbRight ){ RECT rc; ::GetWindowRect(PCRX->Handle, &rc); rc.left += X; rc.top += Y+8; PupRXW->PopupComponent = StatusBar; PupRXW->Popup(rc.left, rc.top); } else { SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { TShiftState sc1, sc2, sa1, sa2, ss1, ss2; WORD nKey = WORD(Key & 0x00ff); sc1 << ssCtrl; sc2 << ssCtrl; sc1 *= Shift; sa1 << ssAlt; sa2 << ssAlt; sa1 *= Shift; ss1 << ssShift; ss2 << ssShift; ss1 *= Shift; if( sc1 == sc2 ){ // Ctrl+Any nKey |= 0x0100; } else if( sa1 == sa2 ){ // Alt + Any nKey |= 0x0200; } else if( ss1 == ss2 ){ // Shift + Any nKey |= 0x0400; } if( nKey == sys.m_DefKey[kkTX] ){ if( SBTX->Enabled ){ SBTX->Down = SBTX->Down ? FALSE : TRUE; SBTXClick(NULL); } SetTXFocus(); Key = 0; } else if( nKey == sys.m_DefKey[kkTXOFF] ){ SBTXOFFClick(NULL); SetTXFocus(); Key = 0; } else { CDump *pEdit = &m_Edit[m_CurrentEdit]; switch(nKey){ case VK_DELETE: if( ActiveControl == PCTX ){ pEdit->DeleteChar(); } break; case VK_HOME: case VK_END: case VK_END + 0x0100: case VK_HOME + 0x0100: if( ActiveControl == PCTX ){ pEdit->MoveCursor(nKey); } break; default: if( (Key >= VK_F1) && (Key <= VK_F12) ){ int m = Key - VK_F1; Key = 0; if( nKey & 0x0400 ){ // Shift m += 12; } else if( nKey & 0x0200 ){ // Alt if( m_MacButtonVW < 3 ) break; m += 24; } else if( nKey & 0x0100 ){ // Ctrl if( m_MacButtonVW < 4 ) break; m += 36; } m_fMacroRepeat = FALSE; SendButton(m + UdMac->Position * (MACBUTTONXW*m_MacButtonVW)); } break; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBQSOClick(TObject *Sender) { UpdateLogData(); UpdateLogMode(); SYSTEMTIME now; GetUTC(&now); int Year = now.wYear % 100; int Month = now.wMonth; int Day = now.wDay; int Hour = now.wHour; UTCtoJST(Year, Month, Day, Hour); // Log.m_sd.cq = m_Running ? 'A' : 'C'; if( SBQSO->Down ){ // Start QSO m_QSOStart = SystemTime2GPS(&now); AddCall(AnsiString(HisCall->Text).c_str()); //JA7UDE 0428 LogLink.SetTime(&now, 0); Log.m_sd.year = char(Year % 100); Log.m_sd.date = WORD(Month * 100 + Day); Log.m_sd.btime = WORD((Hour * 60 + now.wMinute) * 30 + now.wSecond/2); if( !Log.m_sd.btime ) Log.m_sd.btime++; CWaitCursor w; if( Log.FindSet(&Log.m_Find, Log.m_sd.call) ){ OnWave(); SDMMLOG sd; Log.GetData(&sd, Log.m_Find.pFindTbl[0]); // 一番最新のデータ if( !Log.m_sd.name[0] && Log.m_LogSet.m_CopyName ) strcpy(Log.m_sd.name, sd.name); if( !Log.m_sd.qth[0] && Log.m_LogSet.m_CopyQTH ) strcpy(Log.m_sd.qth, sd.qth); if( !Log.m_sd.rem[0] && Log.m_LogSet.m_CopyREM ) strcpy(Log.m_sd.rem, sd.rem); if( !Log.m_sd.qsl[0] && Log.m_LogSet.m_CopyQSL ) strcpy(Log.m_sd.qsl, sd.qsl); } Log.CopyAF(); if( Log.m_sd.call[0] ){ LPCSTR pCC = ClipCC(Log.m_sd.call); Log.SetOptStr(0, &Log.m_sd, Cty.GetCountry(pCC)); Log.SetOptStr(1, &Log.m_sd, Cty.GetCont(pCC)); } UpdateTextData(); if( Log.PutData(&Log.m_sd, Log.m_CurNo) == FALSE ){ SBQSO->Down = FALSE; } if( Log.m_Find.m_FindCmp1Max ){ switch(Log.m_LogSet.m_CheckBand){ case 1: if( Log.FindSameBand(FALSE) ) m_Dupe = 1; break; case 2: if( Log.FindSameBand(TRUE) ) m_Dupe = 1; break; default: m_Dupe = 1; break; } } else { m_Dupe = 0; } Log.m_Find.Ins(Log.m_CurNo); Log.m_CurChg = 0; DoEvent(macOnQSO); LogLink.Write(&Log.m_sd, 1); } else { // Finish QSO LogLink.SetTime(&now, 1); Log.m_sd.etime = WORD((Hour * 60 + now.wMinute) * 30 + now.wSecond/2); if( !Log.m_sd.etime ) Log.m_sd.etime++; if( !Log.m_sd.ur[0] ){ strcpy(Log.m_sd.ur, "599"); } if( !Log.m_sd.my[0] ){ strcpy(Log.m_sd.my, "599"); } Log.PutData(&Log.m_sd, Log.m_CurNo); LogLink.Write(&Log.m_sd, 2); DoEvent(macOnQSO); memcpy(&Log.m_asd, &Log.m_sd, sizeof(Log.m_asd)); Log.m_CurNo++; Log.m_CurChg = 0; Log.m_Find.Clear(); Log.InitCur(); UpdateTextData(); AutoLogSave(); } UpdateCallsign(); UpdateUI(); SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVClick(TObject *Sender) { switch(m_FFTVType){ case 0: KVF1->Checked = TRUE; break; case 1: KVF2->Checked = TRUE; break; default: KVF3->Checked = TRUE; break; } switch(m_FFTSmooth){ case 3: KVFS3->Checked = TRUE; break; case 4: KVFS4->Checked = TRUE; break; default: KVFS2->Checked = TRUE; break; } switch(m_MacButtonVW){ case 2: KVM2->Checked = TRUE; break; case 4: KVM4->Checked = TRUE; break; default: KVM3->Checked = TRUE; break; } KVSP->Enabled = m_pPlayBox != NULL; KVSP->Checked = (m_pPlayBox != NULL) && m_pPlayBox->Active; for( int i = 1; i < RXMAX; i++ ){ TMenuItem *pm = KVS->Items[i-1]; pm->Checked = m_RxSet[i].IsActive(); } switch(m_ScaleAsRigFreq){ case 1: KVSFR->Checked = TRUE; break; default: KVSFT->Checked = TRUE; break; } KVSD->Checked = m_ScaleDetails; KVMX->Checked = PBoxFFT->Align != alClient; OnMenuProc(KV, "&View"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVF1Click(TObject *Sender) { int vtype = m_FFTVType; if( Sender == KVF1 ){ m_FFTVType = 0; m_FFT.m_FFTGain = 0; } else if( Sender == KVF2 ){ m_FFTVType = 1; m_FFT.m_FFTGain = 0; } else { m_FFTVType = 2; m_FFT.m_FFTGain = 1; } if( vtype == m_FFTVType ) return; InitWater(iniwBOTH); for( int i = 0; i < RXMAX; i++ ){ m_RxSet[i].m_StgFFT.Timer = SAMPFREQ/m_BufferSize; m_RxSet[i].m_AFCTimerW = SAMPFREQ / m_BufferSize; } DoEvent(macOnFFTScale); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBNETClick(TObject *Sender) { UpdateUI(); if( SBNET->Down && !m_TX ){ SetTxFreq(UdRxCarrier->Position); } m_ReqAutoNET = FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVFS2Click(TObject *Sender) { m_FFTSmooth = 2; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVFS3Click(TObject *Sender) { m_FFTSmooth = 3; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVFS4Click(TObject *Sender) { m_FFTSmooth = 4; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFXClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KEClick(TObject *Sender) { CDump *pEdit = &m_Edit[m_CurrentEdit]; BOOL f = pEdit->CanEdit(); KEX->Enabled = pEdit->IsSelText() && f; KECP->Enabled = pEdit->IsSelText(); KEP->Enabled = ::IsClipboardFormatAvailable(CF_TEXT) && f; OnMenuProc(KE, "&Edit"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupTXPopup(TObject *Sender) { if( KE->Count != PupTX->Items->Count ) return; KEClick(NULL); for( int i = 0; i < KE->Count; i++ ){ PupTX->Items->Items[i]->Enabled = KE->Items[i]->Enabled; for( int j = 0; j < KE->Items[i]->Count; j++ ){ PupTX->Items->Items[i]->Items[j]->Checked = KE->Items[i]->Items[j]->Checked; } } OnMenuProc(PupTX->Items, "PopTX"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KEPClick(TObject *Sender) { AnsiString as = Clipboard()->AsText.c_str(); LPCSTR p = as.c_str(); for( ; *p; p++ ){ m_Edit[m_CurrentEdit].PutKey(*p, 1); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBarRXChange(TObject *Sender) { m_Dump.OnScrollBarChange(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBarTXChange(TObject *Sender) { m_Edit[m_CurrentEdit].OnScrollBarChange(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBBPFWMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ CFIR2 fir; int fo = UdRxCarrier->Position; switch(CBMode->ItemIndex){ case MODE_N_BPSK: case MODE_BPSK: case MODE_qpsk_L: case MODE_qpsk_U: case MODE_GMSK: fir.Create(GetBPFTaps(Sender), ffBPF, DEMSAMPFREQ, fo-m_RxSet[0].m_Speed, fo+m_RxSet[0].m_Speed, 60, 1.0); break; case MODE_FSK: fir.Create(GetBPFTaps(Sender), ffBPF, DEMSAMPFREQ, fo-m_RxSet[0].m_Speed*2, fo+m_RxSet[0].m_Speed*2, 60, 1.0); break; case MODE_FSKW: case MODE_RTTY: case MODE_U_RTTY: { int taps = GetBPFTaps(Sender); double hw = m_RxSet[0].m_pDem->m_RTTYShift*0.5; double bw = GetRTTYBW(taps); fir.Create(taps, ffBPF, DEMSAMPFREQ, fo-hw-bw, fo+hw+bw, 60, 1.0); } break; case MODE_mfsk_L: { int taps = GetBPFTaps(Sender); double bw = GetMFSKBW(taps); if( sys.m_MFSK_Center ){ fir.Create(taps, ffBPF, DEMSAMPFREQ, fo-m_RxSet[0].m_pDem->m_MFSK_BW/2-bw, fo+m_RxSet[0].m_pDem->m_MFSK_BW/2+bw, 60, 1.0); } else { fir.Create(taps, ffBPF, DEMSAMPFREQ, fo-m_RxSet[0].m_pDem->m_MFSK_BW-bw, fo+bw, 60, 1.0); } } break; case MODE_mfsk_U: { int taps = GetBPFTaps(Sender); double bw = GetMFSKBW(taps); if( sys.m_MFSK_Center ){ fir.Create(taps, ffBPF, DEMSAMPFREQ, fo-m_RxSet[0].m_pDem->m_MFSK_BW/2-bw, fo+m_RxSet[0].m_pDem->m_MFSK_BW/2+bw, 60, 1.0); } else { fir.Create(taps, ffBPF, DEMSAMPFREQ, fo-bw, fo+m_RxSet[0].m_pDem->m_MFSK_BW+bw, 60, 1.0); } } break; } DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&fir, 3000, DEMSAMPFREQ); delete pBox; AttachFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOVOClick(TObject *Sender) { HWND hWnd = ::FindWindow("Volume Control", NULL); if( hWnd != NULL ){ ::PostMessage(hWnd, WM_CLOSE, 0, 0); ::Sleep(200); OnWave(); } char cmd[128]; if( sys.m_WinVista ){ if( Sender != KOVO ){ strcpy(cmd, "control.exe mmsys.cpl,,1"); } else { strcpy(cmd, "sndvol.exe"); } } else { strcpy(cmd, "SNDVOL32.EXE"); if( sys.m_WinNT && (Sender != KOVO) ) strcat(cmd, " /R"); } WinExec(cmd, SW_SHOW); if( !sys.m_WinNT && (Sender != KOVO) ){ CWaitCursor w; int i; for( i = 0; i < 30; i++ ){ OnWave(); ::Sleep(100); hWnd = ::FindWindow("Volume Control", NULL); if( hWnd != NULL ) break; } if( i < 30 ){ ::SetForegroundWindow(hWnd); ::Sleep(100); OnWave(); const short _tt[]={ VK_MENU, 'P', 'P'|0x8000, VK_MENU|0x8000, 'R', 'R'|0x8000, VK_TAB, VK_TAB|0x8000, VK_DOWN, VK_DOWN|0x8000, VK_RETURN, VK_RETURN|0x8000, 0 }; KeyEvent(_tt); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOOClick(TObject *Sender) { TOptDlgBox *pBox = new TOptDlgBox(this); DettachFocus(); if( pBox->Execute(DWORD(Sender)) ){ if( pBox->m_fComChange ) OpenCom(); if( RADIO.change ) OpenRadio(); if( pBox->m_fLangChange ){ SetSystemFont(); CreateMacButton(); if( PBoxFFT->Align != alClient ) CreateMacExButton(); } if( sys.m_fPlayBack ){ if( !m_PlayBack.IsActive() ) m_PlayBack.Init(m_BufferSize, SAMPBASE); } else { m_PlayBack.Delete(); } OnWave(); SetTXCaption(); UpdateUI(); OnWave(); UpdateShowCtrl(); PCRX->Color = m_Dump.m_Color[0].c; PCTX->Color = m_Edit[0].m_Color[0].c; m_Dump.Paint(); m_Edit[m_CurrentEdit].Paint(); CreateWaterColors(); InitWater(iniwLIMIT); UpdateMacroOnTimer(); } delete pBox; OnWave(); UpdateCharset(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitCheckValKey(LPCSTR pKey, AnsiString *pAS) { m_pCheckKey = pKey; m_pCheckBuff = pAS; } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::CheckKey(LPCSTR pTemplate) { if( *m_pCheckKey != *pTemplate ) return FALSE; return !strcmp(m_pCheckKey, pTemplate); } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::CheckValKey(LPCSTR pTemplate) { return CheckValKey(m_pCheckKey, pTemplate); } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::CheckValKey(LPCSTR pKey, LPCSTR pTemplate) { if( *pKey != *pTemplate ) return NULL; BOOL f = TRUE; LPCSTR pBase = pKey; LPCSTR pEnd = NULL; int seq = 0; for( ; *pKey && *pTemplate; pKey++, pTemplate++ ){ switch(*pTemplate){ case '*': pBase = pKey; for( ; *pKey; pKey++ ){ if( (*pKey == '<') && (*(pKey+1) == '%') ){ seq++; } else if( *pKey == '>' ){ if( seq ){ seq--; } else { pEnd = pKey; break; } } } pTemplate++; break; default: // if( *pKey != *pTemplate ) f = FALSE; if( *pKey != *pTemplate ) return NULL; break; } } if( *pKey != *pTemplate ) f = FALSE; if( f && pEnd ){ int len = pEnd - pBase; if( len < 0 ) len = 0; if( len >= 4095 ) len = 4095; LPSTR pBF = new char[len+1]; if( len > 0 ){ memcpy(pBF, pBase, len); pBF[len] = 0; } else { pBF[0] = 0; } *m_pCheckBuff = pBF; pBase = m_pCheckBuff->c_str(); delete pBF; } return f ? pBase : NULL; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::MacroDate(LPSTR t, SYSTEMTIME &now) { switch(Log.m_LogSet.m_DateType){ case 2: case 3: sprintf(t, "%02u-%s-%04u", now.wDay, MONT1[now.wMonth], now.wYear); break; case 4: case 5: sprintf(t, "%s-%02u-%04u", MONT1[now.wMonth], now.wDay, now.wYear); break; default: sprintf(t, "%04u-%s-%02u", now.wYear, MONT1[now.wMonth], now.wDay); break; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::MacroHisName(LPSTR t) { strcpy(m_TextBuff, AnsiString(HisName->Text).c_str()); //JA7UDE 0428 LPSTR pp; LPSTR p = m_TextBuff; while(*p){ p = StrDlm(pp, p, -1); BOOL f = m_RxSet[0].m_MBCS.IsLead((const unsigned char *)pp); if( IsRTTY() ) f = f ? FALSE : TRUE; if( *pp && f ){ strcpy(t, pp); return; } } strcpy(m_TextBuff, AnsiString(HisName->Text).c_str()); //JA7UDE 0428 p = m_TextBuff; while(*p){ p = StrDlm(pp, p, -1); if( *pp ){ strcpy(t, pp); return; } } *t = 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::MacroGreeting(LPSTR t, LPCSTR pCall, int type) { LPCSTR _tt[][3]={ {"Hi", "Hello", "まいどです",}, {"GM", "Good morning", "おはようございます",}, {"GA", "Good afternoon", "こんにちは",}, {"GE", "Good evening", "こんばんは",}, }; strcpy(t, _tt[0][type]); if( !Cty.IsData() ) return; LPCSTR p = ClipCC(pCall); if( *p ){ int n; if( (n = Cty.GetNoP(p))!=0 ){ CTL *cp = Cty.GetCTL(n-1); if( cp->TD != NULL ){ SYSTEMTIME now; GetUTC(&now); WORD tim = WORD((now.wHour * 60 + now.wMinute) * 30 + now.wSecond/2); tim = AdjustRolTimeUTC(tim, *cp->TD); if( tim ){ tim /= WORD(30); if( tim < 12*60 ){ n = 1; } else if( tim < 18*60 ){ n = 2; } else { n = 3; } strcpy(t, _tt[n][type]); } } } } } //--------------------------------------------------------------------------- static BOOL IsMMVARI(BYTE charset, int mode) { BOOL r = FALSE; switch(mode){ case MODE_GMSK: case MODE_FSK: case MODE_FSKW: case MODE_BPSK: switch(charset){ case SHIFTJIS_CHARSET: case HANGEUL_CHARSET: case CHINESEBIG5_CHARSET: // case 134: // 簡略 r = TRUE; break; default: break; } break; default: break; } return r; } //--------------------------------------------------------------------------- static LPCSTR GetVariType(BYTE charset, int mode) { if( (mode == MODE_RTTY) || (mode == MODE_U_RTTY) ){ return "BAUDOT"; } else if( IsMFSK(mode) ){ LPCSTR p; switch(charset){ case SHIFTJIS_CHARSET: p = "VariMFSK/JA"; break; case HANGEUL_CHARSET: case JOHAB_CHARSET: p = "VariMFSK/HL"; break; case CHINESEBIG5_CHARSET: // p = "VariMFSK/BV"; break; case 134: // 簡略 p = "VariMFSK/BY"; break; default: p = "VariMFSK"; break; } return p; } BOOL f = (mode == ((MODE_N_BPSK)) || IsQPSK(mode)); LPCSTR p = "VariSTD"; switch(charset){ case SHIFTJIS_CHARSET: p = f ? "VariSTD/JA":"VariJA"; break; case HANGEUL_CHARSET: case JOHAB_CHARSET: p = f ? "VariSTD/HL":"VariHL"; break; case CHINESEBIG5_CHARSET: // p = f ? "VariSTD/BV":"VariBV"; break; case 134: // 簡略 p = f ? "VariSTD/BY":"VariBY"; break; default: break; } return p; } //--------------------------------------------------------------------------- static int GetOnOff(LPCSTR pKey) { return FindStringTable(g_tOnOff, pKey, 3); } //--------------------------------------------------------------------------- static int GetMacroOnOff(LPCSTR pKey) { AnsiString as; int f = FindStringTable(g_tOnOff, MainVARI->GetMacroStr(as, pKey), 3); if( f < 0 ){ f = MainVARI->GetMacroInt(pKey) != 0; } return f; } //--------------------------------------------------------------------------- static BOOL __fastcall StrCond(LPCSTR p, LPCSTR v, int op) { int f = strcmp(p, v); switch(op){ case 0: return *p ? TRUE : FALSE; case 1: return !f; case 2: return f>=0; case 3: return f<=0; case 4: return f>0; case 5: return f<0; case 6: return f; case 7: return strstr(p, v)!=NULL; default: return FALSE; } } //--------------------------------------------------------------------------- BOOL __fastcall ValCond(double dd, double dv, int op) { switch(op){ case 0: return dd ? TRUE : FALSE; case 1: return dd == dv; case 2: return dd >= dv; case 3: return dd <= dv; case 4: return dd > dv; case 5: return dd < dv; case 6: return dd != dv; default: return FALSE; } } //--------------------------------------------------------------------------- BOOL __fastcall CheckCond(LPCSTR p, LPCSTR v, int type, int &op, double &d, AnsiString &as, AnsiString &vs) { int l; if( v ){ if( *p != *v ) return FALSE; l = strlen(v); if( strncmp(p, v, l) ){ for( ; *v; v++, p++ ){ if( *v == '*' ){ vs = ""; int f = 1; for( ; *p; p++ ){ if( *p == '(' ){ f++; } else if( *p == ')' ){ f--; if( !f ) break; } vs += char(*p); } if( *p != ')' ) return FALSE; p--; } else if( *p != *v ){ return FALSE; } } l = 0; } } else { int f = 0; l = 0; for( ; *p; p++ ){ if( (*p == '<') && (*(p+1)=='%') ){ f++; vs += char(*p); } else if( *p == '>' ){ if( f ){ f--; vs += char(*p); } else { l = -1; break; } } else if( !f ){ if( (*p == '=')||(*p == '<')||(*p == '!') ){ l = -1; break; } else { vs += char(*p); } } else { vs += char(*p); } } } DelLastSpace(vs.c_str()); p += l; p = SkipSpace(p); if( !strncmp(p, "==", 2) ){ op = 1; p += 2; } else if( !strncmp(p, "!=", 2) ){ op = 6; p += 2; } else if( !strncmp(p, ">=", 2) ){ op = 2; p += 2; } else if( !strncmp(p, "<=", 2) ){ op = 3; p += 2; } else if( !strncmp(p, ">>", 2) ){ op = 7; p += 2; } else if( !strncmp(p, "=", 1) ){ op = 1; p++; } else if( !strncmp(p, ">", 1) ){ op = 4; p++; } else if( !strncmp(p, "<", 1) ){ op = 5; p++; } else if( !*p ){ op = 0; } char bf[256]; StrCopy(bf, SkipSpace(p), sizeof(bf)-1); if( type ){ if( bf[0] ){ d = MainVARI->GetMacroDouble(bf); } else { d = 0; } } else { if( (bf[0]=='<') && (bf[1] == '%') ){ MainVARI->ConvMacro_(as, bf, NULL); } else { as = bf; } } return TRUE; } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::IsMBCSStr(LPCSTR p) { while(*p){ if( m_RxSet[0].m_MBCS.IsLead(*p) ) return TRUE; p++; } return FALSE; } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::GetDataCond(LPCSTR p, int err, TSpeedButton *pButton) { AnsiString vs = p; p = DelLastSpace(vs.c_str()); int op; AnsiString as, ms; double d; BOOL r = FALSE; BOOL fInv = FALSE; p = SkipSpace(p); if( *p == '!' ){ p++; fInv = TRUE; } if( !strcmp(p, "IsCall") ){ r = !HisCall->Text.IsEmpty(); } else if( !strcmp(p, "IsName") ){ r = !HisName->Text.IsEmpty(); } else if( !strcmp(p, "IsHisRST") ){ r = !HisRST->Text.IsEmpty(); } else if( !strcmp(p, "IsMyRST") ){ r = !MyRST->Text.IsEmpty(); } else if( !strcmp(p, "IsQTH") ){ r = !HisQTH->Text.IsEmpty(); } else if( !strcmp(p, "IsNote") ){ r = !EditNote->Text.IsEmpty(); } else if( !strcmp(p, "IsLocal") ){ if( !HisCall->Text.IsEmpty() ){ char bf[32]; LPCSTR pCC = ClipCC(AnsiString(HisCall->Text).c_str()); //JA7UDE 0428 strcpy(bf, Cty.GetCountry(pCC)); pCC = ClipCC(sys.m_CallSign.c_str()); r = !strcmp(bf, Cty.GetCountry(pCC)); } } else if( !strcmp(p, "IsAFC") ){ r = SBAFC->Down; } else if( !strcmp(p, "IsNET") ){ r = SBNET->Down; } else if( !strcmp(p, "IsQSO") ){ r = SBQSO->Enabled && SBQSO->Down; } else if( !strcmp(p, "IsTX") ){ r = SBTX->Enabled && m_TX; } else if( !strcmp(p, "IsPTT") ){ r = m_Wave.IsPTT(); } else if( !strcmp(p, "IsDupe") ){ r = m_Dupe; } else if( !strcmp(p, "IsTone") ){ r = SBTX->Enabled && m_TX && m_fTone; } else if( !strcmp(p, "IsTXEmpty") ){ r = !m_Edit[m_CurrentEdit].GetCharCount(TRUE); } else if( !strcmp(p, "IsRXScroll") ){ r = !m_Dump.IsCursorLast(); } else if( !strcmp(p, "IsSQ") ){ r = m_RxSet[0].m_SQ; } else if( !strcmp(p, "IsIME") ){ r = FALSE; HWND hWnd = ActiveControl->Handle; if( hWnd ){ HIMC hIMC; if( (hIMC = ::ImmGetContext(hWnd))!=NULL ){ r = ::ImmGetOpenStatus(hIMC); ::ImmReleaseContext(hWnd, hIMC); } } } else if( !strcmp(p, "IsUOS") ){ r = m_RxSet[0].m_pDem->m_Decode.GetUOS(); } else if( !strcmp(p, "IsRadioLSB") ){ r = m_pRadio && m_pRadio->IsRigLSB(); } else if( CheckCond(p, "IsCaptureText(*)", 1, op, d, as, ms) ){ r = m_Dump.IsWindowText(GetMacroStr(as, ms.c_str())); } else if( !strcmp(p, "IsRepeat") ){ r = m_fMacroRepeat; } else if( !strcmp(p, "IsOnTimer") ){ r = m_pMacroOnTimer != NULL; } else if( !strcmp(p, "IsIdle") ){ r = m_TX && m_ModFSK.m_Encode.m_Idle && !m_Edit[m_SendingEdit].GetCharCount(TRUE) && m_Edit[m_SendingEdit].IsCursorLast(); } else if( !strcmp(p, "IsFileSending") ){ r = m_TX && (m_fpText != NULL); } else if( !strcmp(p, "IsPlaying") ){ r = (m_WaveFile.m_mode == 1); } else if( !strcmp(p, "IsRecording") ){ r = (m_WaveFile.m_mode == 2); } else if( !strcmp(p, "IsEnglish") ){ r = sys.m_MsgEng; } else if( !strcmp(p, "IsMfskCenter") ){ r = sys.m_MFSK_Center; } else if( !strcmp(p, "IsMfskMetricSq") ){ r = sys.m_MFSK_SQ_Metric; } else if( !strcmp(p, "Is1stCR") ){ r = KOAI->Checked; } else if( !strcmp(p, "IsPlayBack") ){ r = m_PlayBack.IsActive(); } else if( !strcmp(p, "IsCodeMM") ){ r = IsMMVARI(PCRX->Font->Charset, m_RxSet[0].m_Mode); } else if( CheckCond(p, "ValFreq", 1, op, d, as, ms) ){ double dd; sscanf(AnsiString(LogFreq->Text).c_str(), "%lf", &dd); //JA7UDE 0428 r = ValCond(dd, d, op); } else if( CheckCond(p, "ValBaud", 1, op, d, as, ms) ){ r = ValCond(m_RxSet[0].m_Speed, d, op); } else if( CheckCond(p, "ValCarrierRX", 1, op, d, as, ms) ){ r = ValCond(UdRxCarrier->Position, d, op); } else if( CheckCond(p, "ValCarrierTX", 1, op, d, as, ms) ){ r = ValCond(UdTxCarrier->Position, d, op); } else if( CheckCond(p, "ValPage", 1, op, d, as, ms) ){ r = ValCond(m_CurrentEdit+1, d, op); } else if( CheckCond(p, "ValTimeLocal", 1, op, d, as, ms) ){ ::GetLocal(&m_LocalTime); r = ValCond(m_LocalTime.wHour*100 + m_LocalTime.wMinute, d, op); } else if( CheckCond(p, "ValTimeUTC", 1, op, d, as, ms) ){ SYSTEMTIME now; GetUTC(&now); r = ValCond(now.wHour*100 + now.wMinute, d, op); } else if( CheckCond(p, "ValDateLocal", 1, op, d, as, ms) ){ ::GetLocal(&m_LocalTime); r = ValCond(m_LocalTime.wMonth*100 + m_LocalTime.wDay, d, op); } else if( CheckCond(p, "ValDateUTC", 1, op, d, as, ms) ){ SYSTEMTIME now; GetUTC(&now); r = ValCond(now.wMonth*100 + now.wDay, d, op); } else if( CheckCond(p, "ValMenu", 1, op, d, as, ms) ){ r = ValCond(m_MacroMenuNo, d, op); } else if( CheckCond(p, "ValScope", 1, op, d, as, ms) ){ if( SBFFT->Down ){ r = 0; } else if( SBWater->Down ){ r = 1; } else { r = 2; } r = ValCond(r, d, op); } else if( CheckCond(p, "StrCall", 0, op, d, as, ms) ){ r = StrCond(AnsiString(HisCall->Text).c_str(), as.c_str(), op); } else if( CheckCond(p, "StrMode", 0, op, d, as, ms) ){ r = StrCond(AnsiString(CBMode->Text).c_str(), as.c_str(), op); } else if( CheckCond(p, "StrBand", 0, op, d, as, ms) ){ r = StrCond(_BandText[Log.m_sd.band], as.c_str(), op); } else if( CheckCond(p, "StrMyRST", 0, op, d, as, ms) ){ r = StrCond(AnsiString(MyRST->Text).c_str(), as.c_str(), op); } else if( CheckCond(p, "StrHisRST", 0, op, d, as, ms) ){ r = StrCond(AnsiString(HisRST->Text).c_str(), as.c_str(), op); } else if( CheckCond(p, "StrNote", 0, op, d, as, ms) ){ r = StrCond(AnsiString(EditNote->Text).c_str(), as.c_str(), op); } else if( CheckCond(p, "StrEntity", 0, op, d, as, ms) ){ LPCSTR pCC = ClipCC(AnsiString(HisCall->Text).c_str()); r = StrCond(Cty.GetCountry(pCC), as.c_str(), op); } else if( CheckCond(p, "StrContinent", 0, op, d, as, ms) ){ LPCSTR pCC = ClipCC(AnsiString(HisCall->Text).c_str()); r = StrCond(Cty.GetCont(pCC), as.c_str(), op); } else if( CheckCond(p, "StrVARITYPE", 0, op, d, as, ms) ){ if( IsRTTY() ){ r = StrCond("BAUDOT", as.c_str(), op); } else { r = StrCond(GetVariType(PCRX->Font->Charset, m_RxSet[0].m_Mode)+4, as.c_str(), op); } } else if( CheckCond(p, "StrPLATFORM", 0, op, d, as, ms) ){ char bf[128]; StrWindowsVer(bf); r = StrCond(bf, as.c_str(), op); } else if( CheckCond(p, "StrMacro(*)", 0, op, d, as, ms) ){ AnsiString ts; ConvMacro_(ts, ms.c_str(), pButton); r = StrCond(ts.c_str(), as.c_str(), op); } else if( CheckCond(p, "ValMacro(*)", 1, op, d, as, ms) ){ AnsiString ts; ConvMacro_(ts, ms.c_str(), pButton); double dd; if( sscanf(ts.c_str(), "%lf", &dd) != 1 ) dd = 0; r = ValCond(dd, d, op); } else if( CheckCond(p, "IsFile(*)", 0, op, d, as, ms) ){ if( !op && !ms.IsEmpty() ){ r = IsFile(GetMacroStr(as, ms.c_str())); } else { r = FALSE; } } else if( CheckCond(p, "IsDefined(*)", 1, op, d, as, ms) ){ if( !op && !ms.IsEmpty() ){ r = (m_MacroVal.FindName(ms.c_str(), _VAL_NORMAL|_VAL_INIFILE|_VAL_PROC) >= 0); } else { r = FALSE; } } else if( CheckCond(p, "IsMBCS(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = !as.IsEmpty() && IsMBCSStr(as.c_str()); } else if( CheckCond(p, "IsAlpha(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = !as.IsEmpty() && IsAlphaAll(as.c_str()); } else if( CheckCond(p, "IsNumber(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = !as.IsEmpty() && IsNumbAll(as.c_str()); } else if( CheckCond(p, "IsCall(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = !as.IsEmpty() && IsCall(as.c_str()); } else if( CheckCond(p, "IsRST(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = !as.IsEmpty() && IsRST(as.c_str()); } else if( CheckCond(p, "IsMenu(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TMenuItem *pMenu = GetMenuArg(ms, as.c_str(), FALSE); r = pMenu != NULL; } else if( CheckCond(p, "IsMenuEnabled(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TMenuItem *pMenu = GetMenuArg(ms, as.c_str(), FALSE); DoParentClick(pMenu); r = pMenu && pMenu->Enabled; } else if( CheckCond(p, "IsMenuChecked(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TMenuItem *pMenu = GetMenuArg(ms, as.c_str(), FALSE); DoParentClick(pMenu); r = pMenu && pMenu->Checked; } else if( CheckCond(p, "IsMenuVisible(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TMenuItem *pMenu = GetMenuArg(ms, as.c_str(), FALSE); DoParentClick(pMenu); r = pMenu && pMenu->Visible; } else if( CheckCond(p, "IsButton(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); r = (FindButton(this, as.c_str(), NULL, FALSE) != NULL); } else if( CheckCond(p, "IsButtonEnabled(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TSpeedButton *pButton = FindButton(this, as.c_str(), NULL, TRUE); r = pButton && pButton->Enabled; } else if( CheckCond(p, "IsButtonDown(*)", 1, op, d, as, ms) ){ GetMacroStr(as, ms.c_str()); TSpeedButton *pButton = FindButton(this, as.c_str(), NULL, TRUE); r = pButton && pButton->Enabled && pButton->Down; } else if( CheckCond(p, NULL, 1, op, d, as, ms) ){ r = ValCond(GetMacroDouble(ms.c_str()), d, op); } else { r = GetMacroInt(p); } r = r ? TRUE : FALSE; r = fInv ? !r : r; return r; } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::GetDataConds(LPCSTR p, int err, TSpeedButton *pButton) { BOOL r = TRUE; int op = '&'; LPSTR pBF = StrDupe(p); BOOL f; LPSTR s, t; t = s = pBF; for( ; *s; s++ ){ if( ((*s=='&')&&(*(s+1)=='&')) || ((*s=='|')&&(*(s+1)=='|')) ){ int c = *s; *s = 0; f = GetDataCond(t, err, pButton); if( op == '|' ){ r = r || f; }else{ r = r && f; }; op = c; s++; t = s + 1; } } f = GetDataCond(t, err, pButton); if( op == '|' ){ r = r || f; }else{ r = r && f; }; delete pBF; return r; } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::Cond(LPCSTR p, TSpeedButton *pButton) { sys.m_MacroError = FALSE; BOOL f = FALSE; LPCSTR sp = p; for( ; *p; p++ ){ if( *p == '#' ){ if( !strncmp(p, "#if", 3) || !strncmp(p, "#else", 5) || !strncmp(p, "#endif", 6) || !strncmp(p, "#define", 7) || !strncmp(p, "#DEFINE", 7) || !strncmp(p, "#DELETE", 7) || !strncmp(p, "#macro", 6) || !strncmp(p, "#exit", 5) || !strncmp(p, "#repeat", 7) || !strncmp(p, "#proc", 5) || !strncmp(p, "#endp", 5) || !strncmp(p, "#comment", 8) ){ f = TRUE; break; } } } if( !f ) return NULL; AnsiString asBuff; CCond *pCond = new CCond(64); TStringList *pString = new TStringList; pString->Text = sp; int count = pString->Count; int cProc = 0; AnsiString asProc, asName, asPara; for( int i = 0; i < count; i++ ){ LPCSTR pLine = AnsiString(pString->Strings[i]).c_str(); //JA7UDE 0428 if( cProc ){ // procの登録 LPCSTR p = SkipSpace(pLine); if( !strncmp(p, "#endp", 5) ){ if( cProc ) cProc--; if( !cProc ){ if( asName.IsEmpty() ){ // #repeatの実行 int n; CalcI(n, asPara.c_str()); if( (n > 0) && !asProc.IsEmpty() ){ LPSTR pBF = new char[sys.m_MacBuffSize]; for( int i = 1; (i <= n) && !sys.m_MacroError; i++ ){ sprintf(pBF, "%u,%u", n, i); ConvDummy(asPara, asProc.c_str(), "$repeat,$counter", pBF); DoMacroReturn(ConvMacro(pBF, asPara.c_str(), pButton)); asBuff += pBF; } delete pBF; } } else { // #procの登録 m_MacroVal.RegisterString(asName.c_str(), asProc.c_str(), asPara.c_str(), _VAL_PROC); } } else { asProc += pLine; asProc += "\r\n"; } } else { if( !strncmp(p, "#proc", 5) || !strncmp(p, "#repeat", 7) ) cProc++; asProc += pLine; asProc += "\r\n"; } } else if( pCond->CondJob(pLine, pButton) ){ LPCSTR p = SkipSpace(pLine); if( !strncmp(p, "#proc", 5) ){ pCond->SetCond(); LPSTR pBF = StrDupe(SkipSpace(p+5)); LPSTR pp = pBF; for(; *pp; pp++ ){ if( (*pp == ' ') || (*pp == '\t') ){ *pp = 0; pp++; break; } } if( pBF[0] && !isdigit(pBF[0]) ){ asName = pBF; asPara = SkipSpace(pp); asProc = ""; cProc++; } delete pBF; } else if( !strncmp(p, "#repeat", 7) ){ pCond->SetCond(); asName = ""; asPara = SkipSpace(p+7); asProc = ""; cProc++; } else if( !strncmp(p, "#macro", 6) ){ pCond->SetCond(); p = SkipSpace(p+6); LPSTR pBF = new char[sys.m_MacBuffSize]; DoMacroReturn(ConvMacro_(pBF, p, pButton)); asBuff += pBF; delete pBF; } else if( !strncmp(p, "#define", 7) || !strncmp(p, "#DEFINE", 7) ){ BYTE mtype = BYTE(*(p+1)=='D' ? _VAL_INIFILE : _VAL_NORMAL); pCond->SetCond(); LPSTR pBF = StrDupe(SkipSpace(p+7)); LPSTR pp = pBF; for(; *pp; pp++ ){ if( (*pp == ' ') || (*pp == '\t') ){ *pp = 0; pp++; break; } } if( pBF[0] && !isdigit(pBF[0]) ){ pp = SkipSpace(pp); m_MacroVal.RegisterString(pBF, GetMacroStr(asProc, pp), NULL, mtype); } delete pBF; } else if( !strncmp(p, "#DELETEALL", 10) ){ pCond->SetCond(); m_MacroVal.Delete(_VAL_NORMAL|_VAL_INIFILE); } else if( !strncmp(p, "#DELETE", 7) ){ pCond->SetCond(); m_MacroVal.Delete(SkipSpace(p+7), _VAL_NORMAL|_VAL_INIFILE|_VAL_PROC); } else if( !strncmp(p, "#exit", 5) ){ pCond->SetCond(); pCond->ClearLevel(); break; } else if( !strncmp(p, "#comment", 8) ){ pCond->SetCond(); } else { asBuff += pString->Strings[i]; asBuff += '\r'; } } } delete pString; f = pCond->IsCond(); BOOL fLevel = pCond->GetLevel(); delete pCond; if( !f ){ return NULL; } else if( !sys.m_MacroError ){ if( fLevel ){ sys.m_MacroError = TRUE; InfoMB(sys.m_MsgEng ? "#if-#endif block is not closed..." : "#if〜#endifブロックを終了していません."); } else if( cProc ){ sys.m_MacroError = TRUE; InfoMB(sys.m_MsgEng ? "Procedure block is not closed... (#endp is necessary)":"プロシジャーブロックを終了していません (#endpが必要です)."); } } return StrDupe(asBuff.c_str()); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::ConvMacro(LPSTR t, LPCSTR p, TSpeedButton *pButton) { LPCSTR bp = Cond(p, pButton); if( bp ) p = bp; int r = ConvMacro_(t, p, pButton); if( bp ) delete bp; return r; } //--------------------------------------------------------------------------- int __fastcall TMainVARI::ConvMacro(AnsiString &as, LPCSTR p, TSpeedButton *pButton) { LPCSTR bp = Cond(p, pButton); if( bp ) p = bp; int r = ConvMacro_(as, p, pButton); if( bp ) delete bp; return r; } //--------------------------------------------------------------------------- int __fastcall TMainVARI::ConvMacro_(AnsiString &as, LPCSTR p, TSpeedButton *pButton) { LPSTR bp = new char[sys.m_MacBuffSize]; int r = ConvMacro_(bp, p, pButton); as = bp; delete bp; return r; } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::GetMacroValue(LPCSTR pVal) { pVal = SkipSpace(pVal); int r = m_MacroVal.FindName(pVal, _VAL_NORMAL|_VAL_INIFILE); if( r >= 0 ){ pVal = m_MacroVal.GetString(r); } return pVal; } //--------------------------------------------------------------------------- LPCSTR __fastcall TMainVARI::GetMacroStr(AnsiString &as, LPCSTR pVal) { pVal = GetMacroValue(pVal); if( strstr(pVal, "<%") ){ ConvMacro_(as, pVal, NULL); } else { as = pVal; } return as.c_str(); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetMacroInt(LPCSTR pVal) { if( !*pVal ) return 0; AnsiString as; GetMacroStr(as, pVal); int d; if( sscanf(SkipToValue(as.c_str()), "%d", &d) != 1 ) d = 0; return d; } //--------------------------------------------------------------------------- double __fastcall TMainVARI::GetMacroDouble(LPCSTR pVal) { if( !*pVal ) return 0; AnsiString as; GetMacroStr(as, pVal); double d; if( sscanf(SkipToValue(as.c_str()), "%lf", &d) != 1 ) d = 0; return d; } //--------------------------------------------------------------------------- static LPCSTR __fastcall ClipRST(LPSTR bf, LPCSTR p) { if( strlen(p) <= 3 ) return p; StrCopy(bf, p, 3); bf[3] = 0; return bf; } //--------------------------------------------------------------------------- static LPCSTR __fastcall ClipNR(LPCSTR p) { if( strlen(p) <= 3 ) return ""; return p + 3; } //--------------------------------------------------------------------------- static LPSTR __fastcall strchrl(LPSTR p, LPSTR v) { LPSTR t; while(*v){ if( (t = strchr(p, *v++))!= NULL ) return t; } return NULL; } //--------------------------------------------------------------------------- static void __fastcall EncodeColors(LPSTR t, UCOL *pColors, int max) { int i; for( i = 0; i < max; i++ ){ if( i ) *t++ = ','; sprintf(t, "%06X", pColors[i].d); t += strlen(t); } } //--------------------------------------------------------------------------- static BOOL __fastcall DecodeColors(LPCSTR p, UCOL *pColors, int max) { AnsiString as; LPSTR pBF = StrDupe(MainVARI->GetMacroStr(as, p)); LPSTR pp, tt; pp = SkipSpace(pBF); int n = 0; while(*pp && (n < max)){ pp = SkipSpace(StrDlm(tt, pp)); pColors[n].d = htoin(MainVARI->GetMacroStr(as, tt), -1); n++; } delete pBF; return n != 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnMacroMenuClick(TObject *Sender) { TMenuItem *pMenu = (TMenuItem *)Sender; m_MacroInput = pMenu->Caption; if( !m_pMacroPopup ) return; int i, n; for( i = n = 0; i < m_pMacroPopup->Items->Count; i++ ){ TMenuItem *pRef = m_pMacroPopup->Items->Items[i]; if( pRef->Caption != "-" ){ if( pRef == pMenu ){ m_MacroMenuNo = n + 1; break; } n++; } } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::ConvMacro_(LPSTR t, LPCSTR p, TSpeedButton *pButton) { int r = 0; int f; AnsiString as, vs; SYSTEMTIME now; BOOL fKanji = FALSE; LPCSTR pVal; UINT cDisCR = 0; BOOL fDisTAB = FALSE; BOOL fDisSP = FALSE; while(*p){ if( fKanji ){ fKanji = FALSE; *t++ = *p++; } else if( m_RxSet[0].m_MBCS.IsLead(*p) ){ fKanji = TRUE; *t++ = *p++; } else if( (*p == '<') && (*(p+1) == '%') ){ *t = 0; AnsiString key; int seq = 0; for( p+=2; *p ; p++ ){ key += char(*p); if( (*p == '<') && (*(p+1) == '%') ){ seq++; } else if( *p == '>' ){ if( seq ){ seq--; } else { p++; break; } } } LPCSTR pKey = key.c_str(); InitCheckValKey(pKey, &vs); if( CheckKey("TX>") ){ r |= macTX; } else if( CheckKey("RX>") ){ r |= macRX; } else if( CheckKey("TXRX>") ){ r |= macTXRX; } else if( CheckKey("TXOFF>") ){ r |= macTXOFF; } else if( CheckKey("TONE>") ){ r |= macTONE; } else if( CheckKey("MyCall>") ){ strcpy(t, sys.m_CallSign.c_str()); } else if( CheckKey("HisCall>") ){ strcpy(t, AnsiString(HisCall->Text).c_str()); //JA7UDE 0428 } else if( CheckKey("HisName>") ){ MacroHisName(t); } else if( CheckKey("DearName>") ){ char bf[256]; MacroHisName(bf); if( bf[0] ){ if( (PCRX->Font->Charset == SHIFTJIS_CHARSET) && m_RxSet[0].m_MBCS.IsLead(bf[0]) ){ sprintf(t, "%sさん", bf); } else { sprintf(t, "Dear %s", bf); } } } else if( CheckKey("HisRST>") ){ char bf[MLRST+1]; strcpy(t, ClipRST(bf, AnsiString(HisRST->Text).c_str())); //JA7UDE 0428 } else if( CheckKey("MyRST>") ){ char bf[MLRST+1]; strcpy(t, ClipRST(bf, AnsiString(MyRST->Text).c_str())); //JA7UDE 0428 } else if( CheckKey("HisNR>") ){ strcpy(t, ClipNR(AnsiString(HisRST->Text).c_str())); //JA7UDE 0428 } else if( CheckKey("MyNR>") ){ strcpy(t, ClipNR(AnsiString(MyRST->Text).c_str())); //JA7UDE 0428 } else if( CheckKey("HisQTH>") ){ strcpy(t, AnsiString(HisQTH->Text).c_str()); //JA7UDE 0428 } else if( CheckKey("Note>") ){ strcpy(t, AnsiString(EditNote->Text).c_str()); //JA7UDE 0428 } else if( CheckKey("AutoClear>") ){ r |= macAUTOCLEAR; } else if( CheckKey("AutoReturn>") ){ m_ReqAutoReturn = TRUE; m_SaveEditPage = m_CurrentEdit; } else if( CheckKey("AutoNET>") ){ m_ReqAutoNET = TRUE; } else if( CheckKey("ClearTXW>") ){ KVCTClick(NULL); } else if( CheckKey("ClearRXW>") ){ KVCRClick(NULL); } else if( CheckKey("MoveTop>") ){ *t++ = button1ST; *t++ = button2ND; *t++ = buttonMOVETOP; *t = 0; } else if( CheckKey("MoveEnd>") ){ *t++ = button1ST; *t++ = button2ND; *t++ = buttonMOVEEND; *t = 0; } else if( CheckKey("ResetScroll>") ){ if( SBarRX->Enabled ){ SBarRX->Position = SBarRX->Max; SetTXFocus(); } } else if( CheckKey("DupeText>") ){ m_Edit[m_CurrentEdit].DupeText(1); } else if( CheckKey("PopupTXW>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; RECT rc; ::GetWindowRect(PCTX->Handle, &rc); int X, Y; m_Edit[m_CurrentEdit].GetCursorPos(X, Y); rc.left += X; rc.top += Y+8; PupTX->Popup(rc.left, rc.top); } else if( CheckKey("NETON>") ){ if( SBNET->Enabled ){ SBNET->Down = TRUE; SBNETClick(NULL); } } else if( CheckKey("NETOFF>") ){ if( SBNET->Enabled ){ SBNET->Down = FALSE; SBNETClick(NULL); } } else if( CheckKey("AFCON>") ){ if( SBAFC->Enabled ){ SBAFC->Down = TRUE; SBAFCClick(NULL); } } else if( CheckKey("AFCOFF>") ){ if( SBAFC->Enabled ){ SBAFC->Down = FALSE; SBAFCClick(NULL); } } else if( CheckKey("ATCON>") ){ if( SBATC->Enabled ){ SBATC->Down = TRUE; SBATCClick(NULL); } } else if( CheckKey("ATCOFF>") ){ if( SBATC->Enabled ){ SBATC->Down = FALSE; SBATCClick(NULL); } } else if( CheckKey("FREQ>") ){ strcpy(t, AnsiString(LogFreq->Text).c_str()); //JA7UDE 0428 } else if( CheckKey("BAND>") ){ strcpy(t, _BandText[Log.m_sd.band]); } else if( CheckKey("UDATE>") ){ GetUTC(&now); MacroDate(t, now); } else if( CheckKey("LDATE>") ){ GetLocal(&now); MacroDate(t, now); } else if( CheckKey("UTIME>") ){ GetUTC(&now); sprintf(t, "%02u:%02u", now.wHour, now.wMinute); } else if( CheckKey("LTIME>") ){ GetLocal(&now); sprintf(t, "%02u:%02u", now.wHour, now.wMinute); } else if( CheckKey("UTIMES>") ){ GetUTC(&now); sprintf(t, "%02u:%02u:%02u", now.wHour, now.wMinute, now.wSecond); } else if( CheckKey("LTIMES>") ){ GetLocal(&now); sprintf(t, "%02u:%02u:%02u", now.wHour, now.wMinute, now.wSecond); } else if( CheckKey("QSOON>") ){ if( SBQSO->Enabled && !SBQSO->Down ){ SBQSO->Down = TRUE; SBQSOClick(NULL); } } else if( CheckKey("PTIME>") ){ GetUTC(&now); sprintf(t, "%u", SystemTime2GPS(&now)); } else if( CheckKey("LPTIME>") ){ GetLocal(&now); sprintf(t, "%u", SystemTime2GPS(&now)); } else if( CheckKey("QPTIME>") ){ sprintf(t, "%u", m_QSOStart); } else if( CheckKey("ATCPPM>") ){ sprintf(t, "%d", m_RxSet[0].m_pDem->GetClockError()); } else if( CheckKey("CPUBENCHMARK>") ){ DoBench(t, 0); } else if( CheckKey("BENCHDECM>") ){ DoBench(t, 1); } else if( CheckKey("RANDOM>") ){ sprintf(t, "%d", rand()); } else if( CheckKey("QSOOFF>") ){ if( SBQSO->Enabled && SBQSO->Down ){ SBQSO->Down = FALSE; SBQSOClick(NULL); } } else if( CheckKey("MODE>") ){ strcpy(t, g_tDispModeTable[m_RxSet[0].m_Mode]); } else if( CheckKey("VARITYPE>") ){ strcpy(t, GetVariType(PCRX->Font->Charset, m_RxSet[0].m_Mode)); } else if( CheckKey("BAUD>") ){ char bf[256]; strcpy(t, StrDbl(bf, m_RxSet[0].IsMFSK() ? m_RxSet[0].m_pDem->m_MFSK_SPEED : m_RxSet[0].m_Speed)); } else if( CheckKey("SkipCR>") ){ cDisCR++; } else if( CheckKey("DisableCR>") ){ cDisCR = 0x7fffffff; } else if( CheckKey("EnableCR>") ){ cDisCR = 0; } else if( CheckKey("DisableTAB>") ){ fDisTAB = TRUE; } else if( CheckKey("EnableTAB>") ){ fDisTAB = 0; } else if( CheckKey("DisableSP>") ){ fDisSP = TRUE; } else if( CheckKey("EnableSP>") ){ fDisSP = 0; } else if( CheckKey("SP>") ){ *t++ = ' '; *t = 0; } else if( CheckKey("CR>") ){ *t++ = '\r'; *t = 0; } else if( CheckKey("BS>") ){ *t++ = '\b'; *t = 0; } else if( CheckKey("TAB>") ){ *t++ = '\t'; *t = 0; } else if( CheckKey("IDLE>") ){ *t++ = button1ST; *t++ = button2ND; *t++ = buttonIDLE; *t = 0; } else if( CheckKey("SeekTop>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; f = UdMac->Max - UdMac->Position + 1; if( f > UdMac->Max ) f = 0; if( f ){ ::PostMessage(Handle, WM_WAVE, waveSeekMacro, f); r |= macSEEK; pButton = NULL; } } else if( CheckKey("SeekNext>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; ::PostMessage(Handle, WM_WAVE, waveSeekMacro, 1); r |= macSEEK; pButton = NULL; } else if( CheckKey("SeekPrev>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; ::PostMessage(Handle, WM_WAVE, waveSeekMacro, -1); r |= macSEEK; pButton = NULL; } else if( CheckKey("Exit>") ){ Close(); } else if( CheckKey("ShutDown>") ){ ShutDown(); } else if( CheckKey("Suspend>") ){ DoSuspend(TRUE); } else if( CheckKey("Resume>") ){ DoResume(); } else if( CheckKey("PTTON>") ){ SetPTT(TRUE); } else if( CheckKey("PTTOFF>") ){ SetPTT(FALSE); } else if( CheckKey("VER>") ){ strcpy(t, VERNO); } else if( CheckKey("VERMINOR>") ){ strcpy(t, VERBETA); } else if( CheckKey("RxCarrier>") ){ sprintf(t, "%u", UdRxCarrier->Position); } else if( CheckKey("TxCarrier>") ){ sprintf(t, "%u", UdTxCarrier->Position); } else if( CheckKey("AFCFrequency>") ){ double fq; if( m_TX == txINTERNAL ){ fq = m_ModFSK.m_CarrierFreq; } else { fq = m_RxSet[0].m_pDem->m_RxFreq; } sprintf(t, (m_RxSet[0].Is170() || m_RxSet[0].IsMFSK()) ? "%.0lf":"%.1lf", fq); } else if( CheckKey("MouseFrequency>") ){ sprintf(t, "%d", m_RightFreq); } else if( CheckKey("Input$>") ){ strcpy(t, m_MacroInput.c_str()); } else if( CheckKey("Click$>") ){ strcpy(t, m_StrSel.c_str()); } else if( CheckKey("CLICK$>") ){ strcpy(t, m_UStrSel.c_str()); } else if( CheckKey("vvv>") ){ strcpy(t, "the quick brown fox jumps over a lazy dog"); } else if( CheckKey("VVV>") ){ strcpy(t, "天気晴朗なれど対馬の沖に波高し"); } else if( CheckKey("PLATFORM>") ){ strcpy(t, "Windows "); t += strlen(t); StrWindowsVer(t); } else if( CheckKey("OutputVolume>") ){ KOVOClick(KOVO); } else if( CheckKey("InputVolume>") ){ KOVOClick(KOVI); } else if( CheckKey("Setup>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; KOOClick(KOO); } else if( CheckKey("SetupLog>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; KOLClick(NULL); } else if( CheckKey("SetupRadio>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; KORClick(NULL); } else if( CheckKey("Calibration>") ){ // if( pButton && pButton->Down ) pButton->Down = FALSE; KOAClick(NULL); } else if( CheckKey("PlaySound>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; KFRSClick(NULL); } else if( CheckKey("RecordSound>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; KFWSClick(NULL); } else if( CheckKey("QuickRecordSound>") ){ KFWSTClick(NULL); } else if( CheckKey("StopPlayRecord>") ){ KFESClick(NULL); } else if( CheckKey("SoundTime>") ){ sprintf(t, "%u", UINT(m_WaveFile.GetPos()*0.5/SAMPFREQ)); } else if( CheckKey("Level>") ){ sprintf(t, "%d", m_RxSet[0].m_StgFFT.DispSig); } else if( CheckKey("PeakLevel>") ){ sprintf(t, "%d", m_RxSet[0].m_PeakSig); } else if( CheckKey("AverageLevel>") ){ sprintf(t, "%d", int(m_RxSet[0].m_AvgSig.GetAvg()+0.5)); } else if( CheckKey("CWID>") ){ *t++ = button1ST; *t++ = button2ND; *t++ = buttonCWON; strcpy(t, sys.m_CallSign.c_str()); t += strlen(t); *t++ = button1ST; *t++ = button2ND; *t++ = buttonCWOFF; *t = 0; } else if( (pVal = CheckValKey("CWID=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); *t++ = button1ST; *t++ = button2ND; *t++ = buttonCWON; for( ; *pVal; pVal++ ) *t++ = *pVal; *t++ = button1ST; *t++ = button2ND; *t++ = buttonCWOFF; *t = 0; } else if( CheckKey("DigitalLevel>") ){ sprintf(t, "%u", m_ModGain); } else if( (pVal = CheckValKey("DigitalLevel=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f >= 1024 ){ if( f > 32768 ) f = 32768; m_ModGain = f; UpdateModGain(); } } else if( (pVal = CheckValKey("ToLower=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); strcpy(t, (LPSTR)jstrlwr(LPUSTR(pBF))); delete pBF; } else if( (pVal = CheckValKey("ToUpper=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); strcpy(t, (LPSTR)jstrupr(LPUSTR(pBF))); delete pBF; } else if( (pVal = CheckValKey("Page=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 1) && (f <= 4) ){ f--; SetEditPage(f); } } else if( CheckKey("LogMODE>") ){ strcpy(t, Log.GetModeString(Log.m_sd.mode)); } else if( (pVal = CheckValKey("LogMODE=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); m_strLogMode = pVal; UpdateLogMode(); } else if( (pVal = CheckValKey("BAND=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ for(f = 0; _BandText[f]; f++ ){ if( !strcmpi(pVal, _BandText[f]) ){ LogFreq->Text = Log.GetFreqString(BYTE(f), 0); OnLogFreq(FALSE); break; } } } } else if( (pVal = CheckValKey("FREQ=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ LogFreq->Text = pVal; OnLogFreq(FALSE); } } else if( (pVal = CheckValKey("HisCall=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ HisCall->Text = pVal; FindCall(); UpdateUI(); SetTXFocus(); } } else if( (pVal = CheckValKey("HisRST=*>"))!=NULL ){ HisRST->Text = GetMacroStr(as, pVal); } else if( (pVal = CheckValKey("MyRST=*>"))!=NULL ){ MyRST->Text = GetMacroStr(as, pVal); } else if( (pVal = CheckValKey("Note=*>"))!=NULL ){ EditNote->Text = GetMacroStr(as, pVal); } else if( (pVal = CheckValKey("IME=*>"))!=NULL ){ f = GetMacroOnOff(pVal); if( f >= 0 ){ HWND hWnd = ActiveControl->Handle; if( hWnd ){ HIMC hIMC; if( (hIMC = ::ImmGetContext(hWnd))!=NULL ){ if( f == 2 ){ f = !::ImmGetOpenStatus(hIMC); } ::ImmSetOpenStatus(hIMC, f); ::ImmReleaseContext(hWnd, hIMC); } } } } else if( (pVal = CheckValKey("HisGreetings=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 1) && (f <= 3) ){ MacroGreeting(t, AnsiString(HisCall->Text).c_str(), f-1); //JA7UDE 0428 } } else if( (pVal = CheckValKey("Entity=*>"))!=NULL ){ strcpy(t, Cty.GetCountry(ClipCC(GetMacroStr(as, pVal)))); } else if( (pVal = CheckValKey("Continent=*>"))!=NULL ){ strcpy(t, Cty.GetCont(ClipCC(GetMacroStr(as, pVal)))); } else if( (pVal = CheckValKey("EntityName=*>"))!=NULL ){ if( (f = Cty.GetNoP(ClipCC(GetMacroStr(as, pVal))))!=0 ){ CTL *cp = Cty.GetCTL(f-1); strcpy(t, (cp->QTH!=NULL) ? cp->QTH : ""); } } else if( (pVal = CheckValKey("RANDOM=*>"))!=NULL ){ srand(GetMacroInt(pVal)); } else if( (pVal = CheckValKey("Wait=*>"))!=NULL ){ f = GetMacroInt(pVal); f /= 10; CWaitCursor w; for( ; f; f-- ){ OnWave(); ::Sleep(10); } } else if( (pVal = CheckValKey("MacroText=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ AnsiString ts; GetFullPathName(ts, pVal, sys.m_MacroDir); FILE *fp = fopen(ts.c_str(), "rb"); int len = sys.m_MacBuffSize; if( fp ){ LPSTR pBF = new char[len]; int rlen = fread(pBF, 1, len-1, fp); if( rlen > 0 ){ pBF[rlen] = 0; r |= ConvMacro(as, pBF, pButton); StrCopy(t, as.c_str(), len/2); } delete pBF; fclose(fp); } } } else if( (pVal = CheckValKey("SendFile=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ if( m_fpText ) fclose(m_fpText); ::SetCurrentDirectory(sys.m_BgnDir); if( (m_fpText = fopen(pVal, "rb")) != NULL ){ r |= macTX; } } } else if( (pVal = CheckValKey("RefRXW>"))!=NULL ){ AnsiString rs; m_Dump.GetWindowText(rs); if( !m_pEdit ){ m_pEdit = new TFileEdit(this); m_pEdit->SetEvent(Handle, WM_WAVE, 2); } m_pEdit->Execute(rs, "Received text", "Received.txt"); } else if( (pVal = CheckValKey("EditFile=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); pVal = GetMacroStr(as, tt); if( *pVal ){ if( !m_pEdit ){ m_pEdit = new TFileEdit(this); m_pEdit->SetEvent(Handle, WM_WAVE, 2); } f = GetMacroInt(pp); m_pEdit->SetWordWrap(f & 2 ? FALSE : TRUE); m_pEdit->Execute(pVal, f & 1); } delete pBF; } else if( (pVal = CheckValKey("SaveMacro=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ SaveMacro(pVal); } } else if( (pVal = CheckValKey("LoadMacro=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ ::PostMessage(Handle, WM_WAVE, waveLoadMacro, DWORD(StrDupe(pVal))); } } else if( (pVal = CheckValKey("PlaySound=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ AnsiString as; GetFullPathName(as, pVal); m_Wave.InClose(); m_WaveFile.Play(as.c_str()); ReOutOpen(); if( !m_pPlayBox ){ m_pPlayBox = new TPlayDlgBox(this); } m_pPlayBox->Execute(&m_WaveFile); m_pPlayBox->Visible = TRUE; m_pPlayBox->SetFocus(); } } else if( (pVal = CheckValKey("RecordSound=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ AnsiString as; GetFullPathName(as, pVal); m_WaveFile.Rec(as.c_str()); KFWST->Checked = FALSE; KFWS->Checked = TRUE; } } else if( (pVal = CheckValKey("Slider=*>"))!=NULL ){ CWaitCursor w; if( pButton && pButton->Down ) pButton->Down = FALSE; LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); pVal = GetMacroStr(as, tt); pp = StrDlm(tt, pp); double d = GetMacroDouble(tt); pp = StrDlm(tt, pp); double dmin = GetMacroDouble(tt); pp = StrDlm(tt, pp); double dmax = GetMacroDouble(tt); pp = StrDlm(tt, pp); double per = GetMacroDouble(tt); StrDlm(tt, pp); int sc = GetMacroInt(tt); m_MacroInput = ""; DettachFocus(); OnWave(); TTrackDlgBox *pBox = new TTrackDlgBox(this); f = pBox->Execute(pVal, d, dmin, dmax, sc, per); delete pBox; AttachFocus(); if( f ){ char bf[256]; m_MacroInput = StrDbl(bf, d); } delete pBF; } else if( (pVal = CheckValKey("FileDialog=*>"))!=NULL ){ CWaitCursor w; if( pButton && pButton->Down ) pButton->Down = FALSE; LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; pVal = GetMacroStr(as, tt); if( *pVal ) pBox->Title = pVal; pp = StrDlm(tt, pp); pBox->Filter = GetMacroStr(as, tt); pp = StrDlm(tt, pp); pBox->FileName = GetMacroStr(as, tt); pp = StrDlm(tt, pp); pBox->DefaultExt = GetMacroStr(as, tt); StrDlm(tt, pp); pVal = GetMacroStr(as, tt); pBox->InitialDir = *pVal ? pVal : sys.m_BgnDir; DettachFocus(); OnWave(); m_MacroInput = ""; if( pBox->Execute() ){ m_MacroInput = pBox->FileName.c_str(); } delete pBox; delete pBF; AttachFocus(); } else if( CheckKey("ListSpeed>") ){ GetComboBox(as, CBSpeed); strcpy(t, as.c_str()); } else if( (pVal = CheckValKey("ListSpeed=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ m_ListBAUD = pVal; if( !m_RxSet[0].IsMFSK() && !m_RxSet[0].IsRTTY() ){ SetComboBox(CBSpeed, pVal); } } } else if( CheckKey("ListCarrier>") ){ GetComboBox(as, CBRXCarrier); strcpy(t, as.c_str()); } else if( (pVal = CheckValKey("ListCarrier=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ SetComboBox(CBRXCarrier, pVal); SetComboBox(CBTxCarrier, pVal); } } else if( CheckKey("ListRST>") ){ GetComboBox(as, HisRST); strcpy(t, as.c_str()); } else if( (pVal = CheckValKey("ListRST=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ SetComboBox(HisRST, pVal); SetComboBox(MyRST, pVal); } } else if( CheckKey("ListLogFreq>") ){ GetComboBox(as, LogFreq); strcpy(t, as.c_str()); } else if( (pVal = CheckValKey("ListLogFreq=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ SetComboBox(LogFreq, pVal); } } else if( CheckKey("CWSpeed>") ){ sprintf(t, "%d", m_ModFSK.GetCWSpeed()); } else if( (pVal = CheckValKey("CWSpeed=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 10) && (f <= 60) ){ m_ModFSK.SetCWSpeed(f); } } else if( (pVal = CheckValKey("RxCarrier=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ SetRxFreq(f); } } else if( (pVal = CheckValKey("TxCarrier=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ SetTxFreq(f); } } else if( CheckKey("Clock>") ){ sprintf(t, "%.2lf", SAMPFREQ); } else if( CheckKey("BaseClock>") ){ sprintf(t, "%u", SAMPBASE); } else if( CheckKey("TxOffset>") ){ sprintf(t, "%.2lf", SAMPTXOFFSET); } else if( CheckKey("DemodulatorClock>") ){ sprintf(t, "%.2lf", DEMSAMPFREQ); } else if( CheckKey("FFTClock>") ){ sprintf(t, "%.2lf", m_FFTSampFreq); } else if( CheckKey("FFTSize>") ){ sprintf(t, "%u", FFT_SIZE); } else if( CheckKey("SoundName>") ){ m_Wave.GetInDevName(as); strcpy(t, as.c_str()); } else if( CheckKey("SoundOutName>") ){ m_Wave.GetOutDevName(as); strcpy(t, as.c_str()); } else if( CheckKey("SoundDevice>") ){ LPCSTR pVal = g_tSoundCH[m_Wave.m_SoundStereo]; if( m_Wave.m_SoundID == -2 ){ sprintf(t, "%s,%s", pVal, sys.m_SoundMMW.c_str()); } else { sprintf(t, "%s,%d", pVal, m_Wave.m_SoundID); if( m_Wave.m_SoundID != m_Wave.m_SoundTxID ){ t += strlen(t); sprintf(t, ",%d", m_Wave.m_SoundTxID); } } } else if( (pVal = CheckValKey("SoundDevice=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); pVal = GetMacroStr(as, tt); f = FindStringTable(g_tSoundCH, pVal, 3); if( f < 0 ) f = m_Wave.m_SoundStereo; pp = StrDlm(tt, pp); pVal = GetMacroStr(as, tt); { AnsiString ts; LPCSTR pVal2 = GetMacroStr(ts, pp); SetSoundCard(f, *pVal ? pVal : NULL, *pVal2 ? pVal2 : pVal); } delete pBF; } else if( (pVal = CheckValKey("Clock=*>"))!=NULL ){ double d = GetMacroDouble(pVal); if( (d >= MIN_SAMP) && (d <= MAX_SAMP) ){ SetSampleFreq(d, FALSE); } } else if( (pVal = CheckValKey("TxOffset=*>"))!=NULL ){ double d = GetMacroDouble(pVal); if( fabs(d) <= 3000.0 ){ SetTxOffset(d); } } else if( CheckKey("FFTScale>") ){ sprintf(t, "%d", m_FFTVType); } else if( (pVal = CheckValKey("FFTScale=*>"))!=NULL ){ f = GetMacroInt(pVal); switch(f){ case 0: KVF1Click(KVF1); break; case 1: KVF1Click(KVF2); break; default: KVF1Click(KVF3); break; } } else if( CheckKey("BPFTaps>") ){ sprintf(t, "%d,%d,%d,%d", g_tBpfTaps[0], g_tBpfTaps[1], g_tBpfTaps[2], g_tBpfTaps[3]); } else if( (pVal = CheckValKey("BPFTaps=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = SkipSpace(pBF); for( int n = 0; *pp && (n < 4); n++ ){ pp = SkipSpace(StrDlm(tt, pp)); if( *tt ){ f = GetMacroInt(tt) & 0x0000fffe; if( (f >= 8) && (f <= 512) ){ g_tBpfTaps[n] = f; } } } delete pBF; SBBPFWClick(GetBPF(GetBPFType())); } else if( (pVal = CheckValKey("BPF=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 0) && (f < 4) ){ TSpeedButton *pButton = GetBPF(f); pButton->Down = TRUE; SBBPFWClick(pButton); } } else if( CheckKey("NotchTaps>") ){ sprintf(t, "%d", m_Notches.m_nBaseTaps); } else if( (pVal = CheckValKey("NotchTaps=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 16) && (f <= TAPMAX) ){ m_Notches.m_nBaseTaps = f & 0x0ffe; m_Notches.Create(); } } else if( CheckKey("NotchWidth>") ){ sprintf(t, "%d", m_Notches.m_NotchWidth); } else if( (pVal = CheckValKey("NotchWidth=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 1) && (f <= 1000) ){ m_Notches.m_NotchWidth = f; m_Notches.Create(); } } else if( CheckKey("Notch>") ){ sprintf(t, "%d", m_Notches.m_Count ? m_Notches.m_pBase[0].Freq : 0); } else if( (pVal = CheckValKey("Notch=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); switch(GetOnOff(pVal)){ case 0: m_Notches.Delete(); break; case 1: if( !m_Notches.m_Count ){ m_Notches.Add(m_NotchFreq); } break; case 2: if( m_Notches.m_Count ){ m_Notches.Delete(); } else { m_Notches.Add(m_NotchFreq); } break; default: f = GetMacroInt(pVal); if( f ){ m_Notches.Add(f); m_NotchFreq = f; } else { m_Notches.Delete(); } break; } } else if( (pVal = CheckValKey("BAUD=*>"))!=NULL ){ double b = GetMacroDouble(pVal); if( b > 0 ){ if( m_RxSet[0].IsMFSK() || ((b >= MIN_SPEED) && (b <= MAX_SPEED)) ){ UpdateSpeed(&m_RxSet[0], b); } } } else if( CheckKey("SquelchLevel>") ){ sprintf(t, "%.1lf", double(m_RxSet[0].m_SQLevel * 0.01)); } else if( (pVal = CheckValKey("SquelchLevel=*>"))!=NULL ){ if( *pVal ){ f = GetMacroInt(pVal) * 100.0; if( f < 0 ) f = 0; if( f > 2048 ) f = 2048; m_RxSet[0].m_SQLevel = f; } } else if( CheckKey("AFCWidth>") ){ sprintf(t, "%d", m_AFCWidth); } else if( (pVal = CheckValKey("AFCWidth=*>"))!=NULL ){ if( *pVal ){ f = GetMacroInt(pVal); if( (f >= 0) && (f <= 2000) ){ m_AFCWidth = f; } } } else if( CheckKey("AFCLevel>") ){ sprintf(t, "%d", m_AFCLevel); } else if( (pVal = CheckValKey("AFCLevel=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 3) && (f < 20) ){ m_AFCLevel = f; } } else if( CheckKey("PTT>") ){ strcpy(t, sys.m_PTTCOM.c_str()); } else if( CheckKey("Radio>") ){ strcpy(t, RADIO.StrPort); } else if( (pVal = CheckValKey("PTT=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ if( strcmpi(sys.m_PTTCOM.c_str(), pVal) ){ sys.m_PTTCOM = pVal; OpenCom(); } } } else if( (pVal = CheckValKey("Radio=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ if( strcmpi(RADIO.StrPort, pVal) ){ strcpy(RADIO.StrPort, pVal); OpenRadio(); } } } else if( (pVal = CheckValKey("RadioOut=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( m_pRadio && *pVal ){ WaitICOM(); m_pRadio->SendCommand(pVal); } } else if( CheckKey("RadioCarrierKHz>") ){ if( m_pRadio ){ sprintf(t, "%.3lf", double(m_pRadio->m_FreqHz)*0.001); } } else if( CheckKey("RadioKHz>") ){ if( m_pRadio ){ sprintf(t, "%.3lf", double(m_pRadio->m_RigHz)*0.001); } } else if( (pVal = CheckValKey("RadioKHz=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt; pVal = StrDlm(tt, pBF); LPCSTR pKey = GetMacroStr(as, tt); double d; Calc(d, pVal); d *= 1000.0; // KHz -> Hz if( m_pRadio && (d >= 50000.0) && (d <= 6.0e9) ){ m_pRadio->CalcRigFreq(d*1.0e-6); if( !strcmp(pKey, "YAESU-VU") ){ OutYaesuVU(d); } else if( !strcmp(pKey, "YAESU-HF") ){ OutYaesuHF(d); } else if( !strcmp(pKey, "CI-V") ){ OutCIV(d); } else if( !strcmp(pKey, "CI-V4") ){ OutCIV4(d); } else if( !strcmp(pKey, "KENWOOD") ){ OutKENWOOD(d); } else if( !strcmp(pKey, "YAESU-NEW") ){ OutKENWOOD(d); } else if( !strcmp(pKey, "JST245") ){ OutJST245(d); } else { strcpy(t, "Rig type = YAESU-HF/YAESU-VU/YAESU-NEW/CI-V/CI-V4/KENWOOD/JST245\r\n"); } } delete pBF; } else if( CheckKey("RadioMode>") ){ if( m_pRadio ){ strcpy(t, g_tRadioMode[m_pRadio->m_RigMode]); } } else if( (pVal = CheckValKey("RadioMode=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt; pVal = StrDlm(tt, pBF); LPCSTR pKey = GetMacroStr(as, tt); AnsiString ts; LPCSTR pMode = GetMacroStr(ts, pVal); if( m_pRadio ){ m_pRadio->SetInternalRigMode(pMode); if( !strcmp(pKey, "YAESU-VU") ){ OutModeYaesuVU(pMode); } else if( !strcmp(pKey, "YAESU-HF") ){ OutModeYaesuHF(pMode); } else if( !strcmp(pKey, "CI-V") || !strcmp(pKey, "CI-V4") ){ OutModeCIV(pMode); } else if( !strcmp(pKey, "KENWOOD") ){ OutModeKENWOOD(pMode); } else if( !strcmp(pKey, "YAESU-NEW") ){ OutModeKENWOOD(pMode); } else if( !strcmp(pKey, "JST245") ){ OutModeJST245(pMode); } else { strcpy(t, "Rig type = YAESU-HF/YAESU-VU/YAESU-NEW/CI-V/CI-V4/KENWOOD/JST245\r\n"); } } delete pBF; } else if( (pVal = CheckValKey("PlayBack=*>"))!=NULL ){ f = GetOnOff(GetMacroStr(as, pVal)); switch(f){ case 0: // OFF sys.m_fPlayBack = FALSE; break; case 1: // ON sys.m_fPlayBack = TRUE; break; case 2: // ON-OFF sys.m_fPlayBack = !sys.m_fPlayBack; break; default: f = GetMacroInt(pVal); LimitInt(&f, 0, 60); DoPlayBack(f); f = -1; break; } if( f >= 0 ){ if( sys.m_fPlayBack ){ if( !m_PlayBack.IsActive() ) m_PlayBack.Init(m_BufferSize, SAMPBASE); } else { m_PlayBack.Delete(); } UpdateUI(); } } else if( CheckKey("PlayBackSpeed>") ){ sprintf(t, "%d", sys.m_PlayBackSpeed); } else if( (pVal = CheckValKey("PlayBackSpeed=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ LimitInt(&f, 1, 20); sys.m_PlayBackSpeed = f; } } else if( CheckKey("PlayBackButtons>") ){ sprintf(t, "%d,%d,%d", m_PlayBackTime[0], m_PlayBackTime[1], m_PlayBackTime[2]); } else if( (pVal = CheckValKey("PlayBackButtons=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( f ){ LimitInt(&f, 1, 60); m_PlayBackTime[0]=BYTE(f); } pp = StrDlm(tt, pp); f = GetMacroInt(tt); if( f ){ LimitInt(&f, 1, 60); m_PlayBackTime[1]=BYTE(f); } StrDlm(tt, pp); f = GetMacroInt(tt); if( f ){ LimitInt(&f, 1, 60); m_PlayBackTime[2]=BYTE(f); } UpdatePlayBack(); delete pBF; } else if( (pVal = CheckValKey("CODE=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( sscanf(pVal, "%X", &f) == 1 ){ char c = char(f >> 8); if( (f < 0x0100) || m_RxSet[0].m_MBCS.IsLead(c) ){ if( c ) *t++ = c; *t++ = char(f); *t = 0; } } } else if( (pVal = CheckValKey("FFTWidth=*>"))!=NULL ){ f = GetMacroInt(pVal); SetFFTWidth(f); } else if( (pVal = CheckValKey("SyncWidth=*>"))!=NULL ){ InitCollect(m_RxSet, GetMacroInt(pVal)); } else if( (pVal = CheckValKey("ShowCH=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( (f >= 1) && (f <= RXMAX) ){ int sw = GetMacroOnOff(pp); if( sw >= 0 ) ShowSubChannel(f, sw); } delete pBF; } else if( (pVal = CheckValKey("SetCHSpeed=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( (f >= 1) && (f <= RXMAX) ){ CRxSet *pRxSet = &m_RxSet[f]; double b = GetMacroDouble(pp); if( pRxSet->IsMFSK() ){ pRxSet->SetMFSKType(MFSK_Speed2Type(b)); } else { pRxSet->SetSpeed(b); } } delete pBF; } else if( (pVal = CheckValKey("SetCHMode=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( (f >= 1) && (f <= RXMAX) ){ pVal = GetMacroStr(as, pp); CRxSet *pRxSet = &m_RxSet[f]; f = GetModeIndex(pVal); if( pRxSet->IsActive() && pRxSet->m_pView ){ pRxSet->m_pView->SetMode(f); } else { pRxSet->SetMode(f); } } delete pBF; } else if( (pVal = CheckValKey("ClearCHW=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 1) && (f <= RXMAX) ){ m_RxSet[f].ClearWindow(); } } else if( (pVal = CheckValKey("RepeatTX=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ if( f < 100 ) f = 100; m_ReqMacroTimer = f; r |= macRX | macTX; DrawHint(); } } else if( (pVal = CheckValKey("Repeat=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ if( f < 100 ) f = 100; m_ReqMacroTimer = f; CreateMacroTimer(f); DrawHint(); } } else if( (pVal = CheckValKey("RepeatText=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( f > 0 ){ if( f > 100 ) f = 100; for( ; f; f-- ){ ConvMacro_(t, pp, pButton); t += strlen(t); } } delete pBF; } else if( (pVal = CheckValKey("MODE=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); SetMode(GetModeIndex(pVal)); } else if( (pVal = CheckValKey("Execute=*>"))!=NULL ){ CWaitCursor w; pVal = GetMacroStr(as, pVal); if( *pVal ){ if( (pVal[1] == ':')||(pVal[0]=='\\') ){ char bf[256]; SetDirName(bf, pVal); if( bf[0] ){ ::SetCurrentDirectory(bf); } } else { ::SetCurrentDirectory(sys.m_BgnDir); } ::WinExec(pVal, SW_SHOW); } } else if( (pVal = CheckValKey("Shell=*>"))!=NULL ){ CWaitCursor w; LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); LPCSTR pDoc = GetMacroStr(as, tt); AnsiString ts; pVal = GetMacroStr(ts, pp); if( *pDoc ){ char bf[256]; LPSTR pDefDir = bf; if( (pDoc[1] == ':')||(pDoc[0]=='\\') ){ SetDirName(pDefDir, pDoc); } else { pDefDir = NULL; } if( !*pVal ) pVal = NULL; ::ShellExecute(Handle, "open", pDoc, pVal, pDefDir, SW_SHOWDEFAULT); } delete pBF; } else if( (pVal = CheckValKey("YesNo=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); f = YesNoMB(GetMacroStr(as, pVal)); AttachFocus(); sprintf(t, "%d", f); } else if( (pVal = CheckValKey("YesNoCancel=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); f = YesNoCancelMB(GetMacroStr(as, pVal)); AttachFocus(); sprintf(t, "%d", f); } else if( (pVal = CheckValKey("OkCancel=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); f = OkCancelMB(GetMacroStr(as, pVal)); AttachFocus(); sprintf(t, "%d", f); } else if( (pVal = CheckValKey("Error=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); ErrorMB(GetMacroStr(as, pVal)); AttachFocus(); } else if( (pVal = CheckValKey("Warning=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); WarningMB(GetMacroStr(as, pVal)); AttachFocus(); } else if( (pVal = CheckValKey("Message=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); InfoMB(GetMacroStr(as, pVal)); AttachFocus(); } else if( (pVal = CheckValKey("WaterMsg=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = SkipSpace(StrDlm(tt, pBF)); int pos = 4; if( *pp ){ sscanf(GetMacroStr(as, tt), "%d", &pos); if( pos < 0 ) pos = 0; if( pos > 4 ) pos = 4; } else { pp = tt; } if( *pp ) SetInfoMsg(GetMacroStr(as, pp), pos); delete pBF; } else if( (pVal = CheckValKey("RxStatus=*>"))!=NULL ){ RxStatus(&m_RxSet[0], GetMacroStr(as, pVal)); } else if( CheckKey("SetFocus>") ){ PCTX->SetFocus(); } else if( CheckKey("Menu>") ){ sprintf(t, "%d", m_MacroMenuNo); } else if( (pVal = CheckValKey("Menu=*>"))!=NULL ){ DoMacroMenu(pVal, pButton, FALSE); } else if( (pVal = CheckValKey("MenuB=*>"))!=NULL ){ DoMacroMenu(pVal, pButton, TRUE); } else if( (pVal = CheckValKey("AddMenu=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = SkipSpace(StrDlm(tt, pBF)); AnsiString Title = GetMacroStr(as, tt); pp = SkipSpace(StrDlm(tt, pp)); pVal = GetMacroStr(as, tt); // if( !Title.IsEmpty() && *pVal && (*pp || !strcmp(pVal, "-")) ){ if( !Title.IsEmpty() ){ AddExtensionMenu(Title.c_str(), pVal, pp); } delete pBF; } else if( (pVal = CheckValKey("InsertMenu=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR pp, tt; pp = SkipSpace(StrDlm(tt, pBF)); AnsiString Title = GetMacroStr(as, tt); pp = SkipSpace(StrDlm(tt, pp)); AnsiString Pos = GetMacroStr(as, tt); pp = SkipSpace(StrDlm(tt, pp)); pVal = GetMacroStr(as, tt); if( !Title.IsEmpty() && !Pos.IsEmpty() && *pVal && (*pp || !strcmp(pVal, "-")) ){ InsExtensionMenu(Title.c_str(), Pos.c_str(), pVal, pp); } delete pBF; } else if( (pVal = CheckValKey("ShowMenu=*>"))!=NULL ){ TMenuItem *pMenu = GetMenuArg(as, pVal, TRUE); if( pMenu ){ f = GetMacroOnOff(as.c_str()); switch(f){ case 0: case 1: pMenu->Visible = f; break; case 2: pMenu->Visible = !pMenu->Visible; break; } } } else if( (pVal = CheckValKey("EnableMenu=*>"))!=NULL ){ TMenuItem *pMenu = GetMenuArg(as, pVal, TRUE); if( pMenu ){ f = GetMacroOnOff(as.c_str()); switch(f){ case 0: case 1: pMenu->Enabled = f; break; case 2: pMenu->Enabled = !pMenu->Enabled; break; } } } else if( (pVal = CheckValKey("ShortCut=*>"))!=NULL ){ TMenuItem *pMenu = GetMenuArg(as, pVal, TRUE); if( pMenu ) ShortCutExtensionMenu(pMenu, as.c_str()); } else if( (pVal = CheckValKey("CheckMenu=*>"))!=NULL ){ TMenuItem *pMenu = GetMenuArg(as, pVal, TRUE); if( pMenu ){ f = GetMacroOnOff(as.c_str()); switch(f){ case 0: case 1: pMenu->Checked = f; break; case 2: pMenu->Checked = !pMenu->Checked; break; } } } else if( (pVal = CheckValKey("DeleteMenu=*>"))!=NULL ){ TMenuItem *pMenu = GetMenuArg(as, pVal, FALSE); if( pMenu ){ TMenuItem *pMainMenu = pMenu->Parent; if( pMainMenu ){ if( (pMenu == KF)||(pMenu == KE)||(pMenu == KV)||(pMenu == KO)||(pMenu == KH) ){ if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; InfoMB("[%s] is not deleted...", pMenu->Caption.c_str()); } } else { pMainMenu->Delete(pMainMenu->IndexOf(pMenu)); } } } } else if( (pVal = CheckValKey("TableCount=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, p; int n = 0; p = pBF; while(*p){ p = StrDlm(tt, SkipSpace(p)); n++; } sprintf(t, "%d", n); delete pBF; } else if( (pVal = CheckValKey("TableStr=*>"))!=NULL ){ LPSTR pBF = new char[8192]; StrCopy(pBF, GetMacroStr(as, pVal), 8191); LPSTR tt, p; p = StrDlm(tt, pBF); f = GetMacroInt(tt); if( f > 0 ){ strcpy(p, GetMacroStr(as, p)); int n = 1; while(*p){ p = StrDlm(tt, SkipSpace(p)); if( n == f ){ strcpy(t, GetMacroStr(as, tt)); break; } n++; } } delete pBF; } else if( CheckKey("Events>") ){ for( f = 0; f < macOnEnd; f++ ){ if( f ) *t++ = ','; strcpy(t, g_tMacEvent[f]); t += strlen(t); } } else if( (pVal = CheckValKey("Table=*>"))!=NULL ){ LPSTR pBF = new char[8192]; StrCopy(pBF, GetMacroStr(as, pVal), 8191); LPSTR tt, p; p = StrDlm(tt, pBF); pVal = GetMacroStr(as, tt); AnsiString ts; strcpy(p, GetMacroStr(ts, p)); int n = 1; while(*p){ p = StrDlm(tt, SkipSpace(p)); if( !strcmpi(pVal, tt) ){ sprintf(t, "%d", n); n = -1; break; } n++; } if( n >= 0 ) strcpy(t, "0"); delete pBF; } else if( (pVal = CheckValKey("Input=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; DettachFocus(); LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = SkipSpace(StrDlm(tt, pBF)); AnsiString rs = *pp ? GetMacroStr(as, pp) : ""; if( InputMB("MMVARI", GetMacroStr(as, tt), rs) ){ ConvMacro_(m_MacroInput, rs.c_str(), pButton); strcpy(t, m_MacroInput.c_str()); } delete pBF; AttachFocus(); } else if( (pVal = CheckValKey("ButtonContents=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt, p; p = SkipSpace(StrDlm(tt, pBF)); f = GetMacroInt(tt); if( (f >= 1) && (f <= MACBUTTONALL) ){ f--; MACBUTTON *pList = &m_tMacButton[f]; as = p; Yen2CrLf(pList->Text, as); if( pList->pButton ){ pList->pButton->Font->Color = pList->Text.IsEmpty() ? clGrayText : pList->Color; } } delete pBF; } else if( (pVal = CheckValKey("ButtonName=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt, p; p = SkipSpace(StrDlm(tt, pBF)); f = GetMacroInt(tt); if( (f >= 1) && (f <= MACBUTTONALL) ){ f--; MACBUTTON *pList = &m_tMacButton[f]; pList->Name = GetMacroStr(as, p); if( pList->pButton ){ pList->pButton->Caption = ConvAndChar(m_TextBuff, pList->Name.c_str()); } } delete pBF; } else if( (pVal = CheckValKey("EditMacro=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; LPCSTR pp = GetMacroStr(as, pVal); if( !strcmpi(GetEXT(pp), "TXT") ){ DettachFocus(); TMacEditDlg *pBox = new TMacEditDlg(this); pBox->Execute(pp); delete pBox; AttachFocus(); } else if( !strcmp(pp, "AS(CW)") ){ DettachFocus(); TMacEditDlg *pBox = new TMacEditDlg(this); if( pBox->Execute(sys.m_AS, "AS(CW)") ){ AdjustAS(&sys.m_AS); } delete pBox; AttachFocus(); } else if( (f = FindStringTableStrictly(g_tMacEvent, pp, macOnEnd)) != 0 ){ DettachFocus(); TMacEditDlg *pBox = new TMacEditDlg(this); if( pBox->Execute(sys.m_MacEvent[f], g_tMacEvent[f]) ){ AdjustAS(&sys.m_MacEvent[f]); } delete pBox; AttachFocus(); } else { f = GetMacroInt(pVal); if( (f >= 1) && (f <= MACBUTTONALL) ){ f--; MACBUTTON *pList = &m_tMacButton[f]; DettachFocus(); TMacEditDlg *pBox = new TMacEditDlg(this); if( pBox->Execute(pList, f) ){ if( pList->pButton ){ pList->pButton->Caption = ConvAndChar(m_TextBuff, pList->Name.c_str()); pList->pButton->Font->Color = pList->Text.IsEmpty() ? clGrayText : pList->Color; TFontStyles fs = Code2FontStyle(pList->Style); pList->pButton->Font->Style = fs; } } delete pBox; AttachFocus(); } } } else if( (pVal = CheckValKey("DoMacro=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 1) && (f <= MACBUTTONALL) ){ ::PostMessage(Handle, WM_WAVE, waveDoMacro, f-1); } } else if( (pVal = CheckValKey("DoEvent=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); f = FindStringTable(g_tMacEvent, pVal, macOnEnd); if( f >= 0 ) DoEvent(f); } else if( (pVal = CheckValKey("DoButton=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; ClickButton(FindButton(this, GetMacroStr(as, pVal), pButton, TRUE)); } else if( (pVal = CheckValKey("DoMenu=*>"))!=NULL ){ if( pButton && pButton->Down ) pButton->Down = FALSE; TMenuItem *pMenu = GetMenuArg(as, pVal, FALSE); if( pMenu && pMenu->Enabled ) pMenu->Click(); } else if( (pVal = CheckValKey("HEX2DEC=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ sprintf(t, "%u", htoin(pVal, -1)); } } else if( (pVal = CheckValKey("CHARX=*>"))!=NULL ){ f = *pVal++; if( m_RxSet[0].m_MBCS.IsLead(BYTE(f)) ){ f = f << 8; f |= *pVal; } sprintf(t, "%02X", f); t += strlen(t); } else if( (pVal = CheckValKey("CHAR=*>"))!=NULL ){ f = *pVal++; if( m_RxSet[0].m_MBCS.IsLead(BYTE(f)) ){ f = f << 8; f |= *pVal; } sprintf(t, "%u", f); t += strlen(t); } else if( (pVal = CheckValKey("KeyStroke=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); f = htoin(pVal, -1); keybd_event(BYTE(f), 0, 0, 0); keybd_event(BYTE(f), 0, KEYEVENTF_KEYUP, 0); } else if( (pVal = CheckValKey("KeyDown=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); f = htoin(pVal, -1); keybd_event(BYTE(f), 0, 0, 0); } else if( (pVal = CheckValKey("KeyUp=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); f = htoin(pVal, -1); keybd_event(BYTE(f), 0, KEYEVENTF_KEYUP, 0); } else if( (pVal = CheckValKey("Cond=*>"))!=NULL ){ f = GetDataConds(SkipSpace(pVal), FALSE, pButton); sprintf(t, "%d", f); } else if( (pVal = CheckValKey("ATCSpeed=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 0) && (f <= 6) ){ SetATCSpeed(f); } } else if( (pVal = CheckValKey("ATCLevel=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 3) && (f <= 40) ){ m_ATCLevel = f; } } else if( (pVal = CheckValKey("ATCLimit=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f > 1000) && (f <= 100000) ){ SetATCLimit(f); } } else if( CheckKey("TxShift>") ){ StrDbl(t, m_ModFSK.m_RTTYShift); } else if( CheckKey("RxShift>") ){ StrDbl(t, m_RxSet[0].m_pDem->m_RTTYShift); } else if( (pVal = CheckValKey("TxShift=*>"))!=NULL ){ double d = GetMacroDouble(pVal); if( (d >= 10.0) && (d <= 450.0) ){ m_ModFSK.SetRTTYShift(d); #if DEBUG m_ModTest.SetRTTYShift(d); #endif } } else if( (pVal = CheckValKey("RxShift=*>"))!=NULL ){ double d = GetMacroDouble(pVal); if( (d >= 10.0) && (d <= 450.0) ){ m_RxSet[0].m_pDem->SetRTTYShift(d); } } else if( CheckKey("RTTYWaitC>") ){ sprintf(t, "%d", m_ModFSK.m_Encode.GetWaitC()); } else if( CheckKey("RTTYWaitD>") ){ sprintf(t, "%d", m_ModFSK.m_Encode.GetWaitD()); } else if( (pVal = CheckValKey("RTTYWaitC=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 0) && (f <= 100) ){ m_ModFSK.m_Encode.SetWaitC(f); #if DEBUG m_ModTest.m_Encode.SetWaitC(f); #endif } } else if( (pVal = CheckValKey("RTTYWaitD=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 0) && (f <= 100) ){ m_ModFSK.m_Encode.SetWaitD(f); #if DEBUG m_ModTest.m_Encode.SetWaitD(f); #endif } } else if( (pVal = CheckValKey("RTTYWordOut=*>"))!=NULL ){ f = GetMacroOnOff(pVal); switch(f){ case 0: case 1: m_fRttyWordOut = f; break; case 2: m_fRttyWordOut = !m_fRttyWordOut; break; } } else if( CheckKey("DIDDLE>") ){ pVal = m_ModFSK.m_Encode.GetDiddle() == diddleLTR ? "LTR":"BLK"; strcpy(t, pVal); } else if( (pVal = CheckValKey("DIDDLE=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( !strcmpi(pVal, "LTR") ){ m_ModFSK.m_Encode.SetDiddle(diddleLTR); } else if( !strcmpi(pVal, "BLK") ){ m_ModFSK.m_Encode.SetDiddle(diddleBLK); } } else if( CheckKey("RTTYDEM>") ){ pVal = m_RxSet[0].m_RTTYFFT ? "FFT":"IIR"; strcpy(t, pVal); } else if( (pVal = CheckValKey("RTTYDEM=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( !strcmpi(pVal, "FFT") ){ SetRTTYFFT(TRUE); } else if( !strcmpi(pVal, "IIR") ){ SetRTTYFFT(FALSE); } } else if( (pVal = CheckValKey("UOS=*>"))!=NULL ){ f = GetMacroOnOff(pVal); m_RxSet[0].m_pDem->m_Decode.SetUOS(f); } else if( CheckKey("MetricMFSK>") ){ sprintf(t, "%d", m_RxSet[0].m_pDem->GetMFSKMetric(0)); } else if( (pVal = CheckValKey("MetricMFSK=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); f = 0; if( !strcmpi(pVal, "EVEN") ){ f = 1; } else if( !strcmpi(pVal, "ODD") ){ f = 2; } sprintf(t, "%d", m_RxSet[0].m_pDem->GetMFSKMetric(f)); } else if( CheckKey("COMFSK>") ){ sprintf(t, "%d", sys.m_bFSKOUT); } else if( (pVal = CheckValKey("COMFSK=*>"))!=NULL ){ f = GetMacroOnOff(pVal); sys.m_bFSKOUT = f; if( m_pCom ) m_pCom->SetFSK(sys.m_bFSKOUT, sys.m_bINVFSK); } else if( CheckKey("COMFSKINV>") ){ sprintf(t, "%d", sys.m_bINVFSK); } else if( (pVal = CheckValKey("COMFSKINV=*>"))!=NULL ){ f = GetMacroOnOff(pVal); sys.m_bINVFSK = f; m_pCom->SetFSK(sys.m_bFSKOUT, sys.m_bINVFSK); } else if( (pVal = CheckValKey("String=*>"))!=NULL ){ strcpy(t, GetMacroStr(as, pVal)); } else if( (pVal = CheckValKey("CallProc=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt; pVal = GetMacroValue(StrDlm(tt, SkipSpace(pBF))); tt = SkipSpace(tt); if( *tt && !isdigit(*tt) ){ f = m_MacroVal.FindName(tt, _VAL_PROC); if( f >= 0 ){ ConvDummy(as, m_MacroVal.GetString(f), m_MacroVal.GetPara(f), pVal); r |= ConvMacro(t, as.c_str(), pButton); } else if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; InfoMB("Procedure [%s] is not found...", tt); } } delete pBF; } else if( (pVal = CheckValKey("DebugProc=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroValue(pVal)); LPSTR tt; pVal = GetMacroValue(StrDlm(tt, SkipSpace(pBF))); tt = SkipSpace(tt); if( *tt && !isdigit(*tt) ){ f = m_MacroVal.FindName(tt, _VAL_PROC); if( f >= 0 ){ ConvDummy(as, m_MacroVal.GetString(f), m_MacroVal.GetPara(f), pVal); strcpy(t, as.c_str()); } else if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; InfoMB("Procedure [%s] is not found...", tt); } } delete pBF; } else if( (pVal = CheckValKey("VALTIME=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt; pVal = StrDlm(tt, SkipSpace(pBF)); CalcI(f, pVal); GPS2SystemTime(f, &now); if( !strcmpi(tt, "YEAR") ){ sprintf(t, "%04u", now.wYear); } else if( !strcmpi(tt, "MONTH") ){ sprintf(t, "%u", now.wMonth); } else if( !strcmpi(tt, "DAY") ){ sprintf(t, "%u", now.wDay); } else if( !strcmpi(tt, "HOUR") ){ sprintf(t, "%02u", now.wHour); } else if( !strcmpi(tt, "MINUTE") ){ sprintf(t, "%02u", now.wMinute); } else if( !strcmpi(tt, "SECOND") ){ sprintf(t, "%02u", now.wSecond); } else if( !strcmp(tt, "LMonth") ){ strcpy(t, MONT2[now.wMonth]); } else if( !strcmp(tt, "LMONTH") ){ strcpy(t, MONT1[now.wMonth]); } else if( !strcmpi(tt, "ALL") ){ sprintf(t, "%04u,%02u,%02u,%02u,%02u,%02u,%s,%s", now.wYear,now.wMonth,now.wDay, now.wHour,now.wMinute,now.wSecond, MONT2[now.wMonth],MONT1[now.wMonth] ); } else { strcpy(t, "<%VALTIME=...> year/month/day/hour/minute/second/LMonth/LMONTH/ALL"); } delete pBF; } else if( (pVal = CheckValKey("Inv=*>"))!=NULL ){ sprintf(t, "%d", GetMacroInt(pVal)==0); } else if( (pVal = CheckValKey("Sin=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", sin(d)); } else if( (pVal = CheckValKey("Cos=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", cos(d)); } else if( (pVal = CheckValKey("Tan=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", tan(d)); } else if( (pVal = CheckValKey("ArcTan=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", atan(d)); } else if( (pVal = CheckValKey("Exp=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", exp(d)); } else if( (pVal = CheckValKey("Log=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", log(d)); } else if( (pVal = CheckValKey("Sqrt=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%.16lG", sqrt(d)); } else if( (pVal = CheckValKey("Pow=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); double x, y; Calc(x, GetMacroStr(as, tt)); Calc(y, GetMacroStr(as, pp)); sprintf(t, "%.16lG", pow(x, y)); delete pBF; } else if( (pVal = CheckValKey("Floor=*>"))!=NULL ){ double d; Calc(d, GetMacroStr(as, pVal)); sprintf(t, "%d", int(floor(d))); } else if( (pVal = CheckValKey("Format=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt; pVal = StrDlm(tt, SkipSpace(pBF)); if( strchr(tt, 'c') ){ pVal = GetMacroStr(as, pVal); sprintf(t, tt, *pVal); } else if( strchrl(tt, "spn") ){ pVal = GetMacroStr(as, pVal); sprintf(t, tt, pVal); } else if( strchrl(tt, "eEfgG") ){ double d; Calc(d, pVal); sprintf(t, tt, d); } else { CalcI(f, pVal); sprintf(t, tt, f); } delete pBF; } else if( (pVal = CheckValKey("Find$=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, pBF); if( (pVal=strstr(GetMacroStr(as, pp), tt)) != NULL ){ strcpy(t, pVal); } delete pBF; } else if( (pVal = CheckValKey("Skip$=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt; pVal = GetMacroStr(as, StrDlm(tt, SkipSpace(pBF))); f = GetMacroInt(tt); int l; for( l = 0; (l < f) && *pVal; l++, pVal++ ); strcpy(t, pVal); delete pBF; } else if( (pVal = CheckValKey("MSkip$=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt; pVal = GetMacroStr(as, StrDlm(tt, SkipSpace(pBF))); f = GetMacroInt(tt); int l; for( l = 0; (l < f) && *pVal; l++, pVal++ ){ if( m_RxSet[0].m_MBCS.IsLead(*pVal) ){ pVal++; if( !*pVal ) break; } } strcpy(t, pVal); delete pBF; } else if( (pVal = CheckValKey("StrLen=*>"))!=NULL ){ sprintf(t, "%d", strlen(GetMacroStr(as, pVal))); } else if( (pVal = CheckValKey("MStrLen=*>"))!=NULL ){ sprintf(t, "%d", _mbslen((const unsigned char *)GetMacroStr(as, pVal))); } else if( CheckKey("CodePage>") ){ sprintf(t, "%d", GetACP()); } else if( CheckKey("LanguageID>") ){ sprintf(t, "%d", sys.m_wLang); } else if( CheckKey("Font>") ){ sprintf(t, "%s,%d,%d", PCRX->Font->Name.c_str(), PCRX->Font->Size, PCRX->Font->Charset); } else if( (pVal = CheckValKey("Font=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, pp; pp = StrDlm(tt, SkipSpace(pBF)); pVal = GetMacroStr(as, tt); if( *pVal ){ PCRX->Font->Name = pVal; } pp = StrDlm(tt, pp); tt = SkipSpace(tt); if( *tt ){ f = GetMacroInt(tt); if( (f >= 1) && (f < 100) ){ PCRX->Font->Size = f; } } pp = StrDlm(tt, pp); tt = SkipSpace(tt); if( *tt ){ PCRX->Font->Charset = BYTE(GetMacroInt(tt)); } DettachFocus(); PCTX->Font->Name = PCRX->Font->Name; PCTX->Font->Charset = PCRX->Font->Charset; PCTX->Font->Size = PCRX->Font->Size; OnFontChange(FALSE); OnFontChange(TRUE); UpdateUI(); AttachFocus(); delete pBF; } else if( CheckKey("WaterNoise>") ){ double db = m_StgWater.Sum; if( m_FFT.m_FFTGain ) db = SqrtToDB(db); sprintf(t, "%.0lf", (db*0.01) + 5.0); } else if( (pVal = CheckValKey("WaterNoise=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); f = GetMacroInt(tt); if( (f > 0) && (f <= 100) ) m_WaterNoiseL = f; if( *pp ){ f = GetMacroInt(pp); if( (f > 0) && (f <= 100) ) m_WaterNoiseH = f; } InitWater(iniwLIMIT); delete pBF; } else if( CheckKey("WaterLevels>") ){ for( f = 0; f < AN(m_tWaterLevel); f++ ){ if( f ) *t++ = ','; sprintf(t, "%d", m_tWaterLevel[f]); t += strlen(t); } } else if( (pVal = CheckValKey("WaterLevels=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = SkipSpace(pBF); f = 0; while(*pp && (f < AN(m_tWaterLevel))){ pp = SkipSpace(StrDlm(tt, pp)); int d = GetMacroInt(tt); if( d < 0 ) d = 0; if( d > 255 ) d = 255; m_tWaterLevel[f] = d; f++; } CreateWaterColors(); delete pBF; } else if( CheckKey("WaterColors>") ){ EncodeColors(t, m_tWaterColset, AN(m_tWaterColset)); } else if( (pVal = CheckValKey("WaterColors=*>"))!=NULL ){ if( DecodeColors(pVal, m_tWaterColset, AN(m_tWaterColset)) ){ CreateWaterColors(); } } else if( CheckKey("SpectrumColors>") ){ EncodeColors(t, m_tFFTColset, AN(m_tFFTColset)); } else if( (pVal = CheckValKey("SpectrumColors=*>"))!=NULL ){ DecodeColors(pVal, m_tFFTColset, AN(m_tFFTColset)); } else if( CheckKey("RxColors>") ){ EncodeColors(t, m_Dump.m_Color, AN(m_Dump.m_Color)); } else if( (pVal = CheckValKey("RxColors=*>"))!=NULL ){ if( DecodeColors(pVal, m_Dump.m_Color, AN(m_Dump.m_Color)) ){ PCRX->Color = m_Dump.m_Color[0].c; } } else if( CheckKey("TxColors>") ){ EncodeColors(t, m_Edit[0].m_Color, AN(m_Edit[0].m_Color)); } else if( (pVal = CheckValKey("TxColors=*>"))!=NULL ){ if( DecodeColors(pVal, m_Edit[0].m_Color, AN(m_Edit[0].m_Color)) ){ for( f = 1; f < AN(m_Edit); f++ ){ for( int i = 0; i < AN(m_Edit[0].m_Color); i++ ){ m_Edit[f].m_Color[i] = m_Edit[0].m_Color[i]; } } PCTX->Color = m_Edit[0].m_Color[0].c; } } else if( CheckKey("Capture>") ){ if( m_Dump.GetWindowCallsign(as) ){ strcpy(t, as.c_str()); } } else if( CheckKey("SetCaptureLimit>") ){ m_Dump.UpdateCaptureLimit(); } else if( CheckKey("ClearCaptureLimit>") ){ m_Dump.ClearCaptureLimit(); } else if( (pVal = CheckValKey("SendMessage=*>"))!=NULL ){ m_MacroInput = ""; LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); if( *tt ){ HWND hWnd = HWND_BROADCAST; UINT uMsg; pVal = GetMacroStr(as, tt); if( !strcmpi(pVal, "this") ){ pp = StrDlm(tt, pp); uMsg = GetMacroInt(tt); hWnd = Handle; } else { uMsg = ::RegisterWindowMessage(pVal); } pp = StrDlm(tt, pp); DWORD wParam = GetMacroInt(tt); StrDlm(tt, pp); DWORD lParam = GetMacroInt(tt); f = ::SendMessage(hWnd, uMsg, wParam, lParam); char bf[32]; sprintf(bf, "%d", f); m_MacroInput = bf; } delete pBF; } else if( (pVal = CheckValKey("ShowHTML=*>"))!=NULL ){ m_WebRef.ShowHTML(GetMacroStr(as, pVal)); } else if( (pVal = CheckValKey("CallDLL=*>"))!=NULL ){ LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR pp, tt; pp = StrDlm(tt, pBF); if( *tt ){ pVal = GetMacroStr(as, tt); HANDLE hLib = m_LibDLL.LoadLibrary(pVal); //ja7ude 0522 if( hLib ){ pp = StrDlm(tt, pp); pVal = GetMacroStr(as, tt); tmmMacro pFunc = (tmmMacro)::GetProcAddress((HINSTANCE)hLib, pVal); if( pFunc ){ pp = StrDlm(tt, pp); pFunc(Handle, t, GetMacroStr(as, tt)); } } } delete pBF; } else if( CheckKey("OnTimerInterval>") ){ sprintf(t, "%d", sys.m_OnTimerInterval); } else if( (pVal = CheckValKey("OnTimerInterval=*>"))!=NULL ){ f = GetMacroInt(pVal); if( f > 0 ){ sys.m_OnTimerInterval = f; if( m_pMacroOnTimer && (m_pMacroOnTimer->Interval != UINT(f)) ){ m_pMacroOnTimer->Interval = f; } } } else if( (pVal = CheckValKey("ONOFF=*>"))!=NULL ){ strcpy(t, GetMacroInt(pVal) ? "ON":"OFF"); } else if( CheckKey("BuffSize>") ){ sprintf(t, "%d", sys.m_MacBuffSize); } else if( (pVal = CheckValKey("BuffSize=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f >= 512) && (f <= 65536) ){ sys.m_MacBuffSize = f; } } else if( CheckKey("Memory>") ){ MEMORYSTATUS mem; ::GlobalMemoryStatus(&mem); sprintf(t, "%u,%.2lf,%.2lf", mem.dwMemoryLoad, double(mem.dwTotalPhys)/(1024*1024), double(mem.dwAvailPhys)/(1024*1024) ); } else if( CheckKey("Folder>") ){ strcpy(t, sys.m_BgnDir); } else if( CheckKey("EOF>") ){ break; } #if DEBUG else if( CheckKey("Stack>") ){ sprintf(t, "%08X", &f); } else if( CheckKey("ListDLL>") ){ for( f = 0; f < m_LibDLL.m_Count; f++ ){ sprintf(t, "%s\r\n", m_LibDLL.m_pBase[f].pName); t += strlen(t); } } else if( CheckKey("AFCCount>") ){ if( m_RxSet[0].IsMFSK() ){ f = m_RxSet[0].m_AFCTimerMFSK; } else { f = m_RxSet[0].m_pDem->m_AFCCount; } sprintf(t, "%d", f); } else if( CheckKey("LostRX>") ){ m_LostSoundRX = LOSTMSGTIME * int(SAMPFREQ) / m_BufferSize; m_fShowMsg = TRUE; } else if( CheckKey("Repeat>") ){ m_pDebugButton = pButton; } else if( CheckKey("StopRepeat>") ){ m_pDebugButton = NULL; } else if( CheckKey("TestSignal>") ){ if( pButton && pButton->Down ) pButton->Down = FALSE; TestSignal(); } else if( CheckKey("TestMod>") ){ CMODFSK *pMod = new CMODFSK; pMod->SetSampleFreq(SAMPFREQ); pMod->SetCarrierFreq(1900.0); pMod->SetSpeed(m_RxSet[0].m_Speed); pMod->SetType(CBMode->ItemIndex); for( int i = 0; i < m_BufferSize; i++ ) pMod->Do(); sprintf(t, "%08X : %d", pMod, pMod->m_DEBUG); delete pMod; } else if( (pVal = CheckValKey("RandMem=*>"))!=NULL ){ f = GetMacroInt(pVal); if( (f > 1) && (f <= 1024*1024) ){ BYTE *bp = new BYTE[f]; BYTE *t = bp; for( int i = 0; i < f; i++ ) *t++ = (BYTE)rand(); delete bp; } } else if( CheckKey("ShowTxBPF>") ){ DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(m_ModFSK.GetFIR(), 6000, SAMPFREQ); delete pBox; AttachFocus(); } else if( CheckKey("ShowDECM>") ){ DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); #if DECFIR pBox->Execute(m_Dec2.GetFIR(), 6000, SAMPFREQ); #else pBox->Execute(m_Dec2.GetIIR(), 6000, SAMPFREQ); #endif delete pBox; AttachFocus(); } else if( CheckKey("ShowDemLPF>") ){ DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&m_RxSet[0].m_pDem->m_OutLPF, 300, SAMPFREQ); delete pBox; AttachFocus(); } else if( CheckKey("ShowNOTCH>") ){ if( !m_Notches.m_Count ){ m_Notches.Add(m_NotchFreq); } DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&m_Notches.m_FIR, 3000, m_Notches.m_FIR.GetSampleFreq()); delete pBox; AttachFocus(); } else if( CheckKey("ShowMFSK>") ){ CFIR2 *pH = m_RxSet[0].m_pDem->GetMFSKHIL(); if( pH ){ DettachFocus(); TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(pH, 3000, DEMSAMPFREQ); delete pBox; AttachFocus(); } } /* else if( CheckKey("ShowPHASEX>") ){ TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&m_RxSet[0].m_pDem->m_PhaseX.m_LPF, 400, DEMSAMPFREQ); delete pBox; } */ else if( CheckKey("ShowQPSK1>") ){ TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&m_RxSet[0].m_pDem->m_DecPSK.m_LPF1, 400, DEMSAMPFREQ); delete pBox; } else if( CheckKey("ShowQPSK2>") ){ TFreqDispDlg *pBox = new TFreqDispDlg(this); pBox->Execute(&m_RxSet[0].m_pDem->m_DecPSK.m_LPF2, 200, DEMSAMPFREQ/QPSK_SUBFACTOR); delete pBox; } else if( (pVal = CheckValKey("RxFile=*>"))!=NULL ){ pVal = GetMacroStr(as, pVal); if( *pVal ){ FILE *fp = fopen(pVal, "rb"); if( fp ){ while(1){ int len = fread(m_TextBuff, 1, sizeof(m_TextBuff), fp); if( len <= 0 ) break; LPCSTR p = m_TextBuff; while(len--){ m_Dump.PutKey(*p++, 1); } } fclose(fp); } } } else if( CheckKey("ShowTitle>") ){ UpdateTitle(); } else if( (pVal = CheckValKey("SimBAUD=*>"))!=NULL ){ double b = GetMacroDouble(pVal); if( (b >= MIN_SPEED) && (b <= MAX_SPEED) ){ m_ModTest.SetSpeed(b); } } #endif else { BOOL f = FALSE; for( int i = 0; i < macOnEnd; i++ ){ char bf[256]; sprintf(bf, "%s=*>", g_tMacEvent[i]); if( (pVal = CheckValKey(bf))!=NULL ){ f = TRUE; as = pVal; Yen2CrLf(sys.m_MacEvent[i], as); UpdateMacroOnTimer(); break; } else { sprintf(bf, "%s>", g_tMacEvent[i]); if( CheckKey(bf) ){ f = TRUE; DettachFocus(); TMacEditDlg *pBox = new TMacEditDlg(this); if( pBox->Execute(sys.m_MacEvent[i], g_tMacEvent[i]) ){ AdjustAS(&sys.m_MacEvent[i]); } delete pBox; AttachFocus(); break; } } } if( !f ){ *t++ = '<'; *t++ = '%'; strcpy(t, pKey); } } t += strlen(t); } else { if( *p != '\n' ){ if( (*p == '\r') && cDisCR ){ cDisCR--; p++; } else if( (*p == '\t') && fDisTAB ){ p++; } else if( (*p == ' ') && fDisSP ){ p++; } else { *t++ = *p++; } } else { p++; } } } *t = 0; return r; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoMacroReturn(int f) { if( f & macTX ){ if( !m_TX || m_fTone ) ToTX(); } else if( f & macTXRX ){ SBTX->Down = !SBTX->Down; SBTXClick(NULL); } else if( f & macTONE ){ if( !m_TX ) ToTone(); } if( f & macRX ){ m_fReqRX = TRUE; m_ModFSK.m_Encode.m_fReqRX = TRUE; m_Edit[m_CurrentEdit].MoveCursor(dmpMoveLAST); SetTXCaption(); } if( f & macTXOFF ){ if( m_TX ) ToRX(); } if( f & macAUTOCLEAR ) m_ReqAutoClear = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoMacro(LPCSTR pMacro, TSpeedButton *pButton) { int len = strlen(pMacro) + 1; if( len < sys.m_MacBuffSize ) len = sys.m_MacBuffSize; LPSTR bp = new char[len]; int f = ConvMacro(bp, pMacro, pButton); BOOL fCW = FALSE; LPCSTR p = bp; if( f & macRX ) m_Edit[m_CurrentEdit].MoveCursor(dmpMoveLAST); for( f; *p; p++ ){ if( (BYTE(*p) == button1ST) && (BYTE(*(p+1)) == button2ND) && (*(p+2)) ){ p+=2; switch(*p){ case buttonCWON: fCW = TRUE; break; case buttonCWOFF: fCW = FALSE; break; case buttonMOVETOP: m_Edit[m_CurrentEdit].MoveCursor(dmpMoveTOP); break; case buttonMOVEEND: m_Edit[m_CurrentEdit].MoveCursor(dmpMoveLAST); break; case buttonIDLE: m_Edit[m_CurrentEdit].PutChar(0x0200, 3); break; default: m_Edit[m_CurrentEdit].PutKey(button1ST, 1); m_Edit[m_CurrentEdit].PutKey(button2ND, 1); m_Edit[m_CurrentEdit].PutKey(*p, 1); break; } } else if( fCW ){ m_Edit[m_CurrentEdit].PutChar(*p+0x0100, 3); } else { m_Edit[m_CurrentEdit].PutKey(*p, 1); } } DoMacroReturn(f); if( pButton && !(f & macSEEK) ){ pButton->Down = m_ReqMacroTimer != 0; } delete bp; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SendButton(int n) { if( (n < 0) || (n >= MACBUTTONALL) ) return; sys.m_MacroError = FALSE; DeleteMacroTimer(); m_CurrentMacro = n; MACBUTTON *pList = &m_tMacButton[n]; if( pList->Text.IsEmpty() ){ if( pList->pButton ) pList->pButton->Down = FALSE; return; } DoMacro(pList->Text.c_str(), pList->pButton); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOAIClick(TObject *Sender) { InvMenu(KOAI); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOAOClick(TObject *Sender) { InvMenu(KOAO); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBInitClick(TObject *Sender) { AnsiString strBand = LogFreq->Text; if( Log.IsOpen() ){ if( SBQSO->Down ){ Log.DeleteLast(); Log.m_Find.Clear(); Log.InitCur(); SBQSO->Down = FALSE; UpdateTextData(); } else { Log.InitCur(); Log.m_sd.call[0] = 0; Log.m_sd.name[0] = 0; Log.m_sd.qth[0] = 0; UpdateTextData(); UpdateCallsign(); } if( !strBand.IsEmpty() ){ LogFreq->Text = strBand; Log.SetFreq(&Log.m_sd, strBand.c_str()); } HisCallChange(NULL); LogLink.Clear(); if( HisCall->CanFocus() ) HisCall->SetFocus(); } else { HisCall->Text = ""; HisName->Text = ""; HisRST->Text = "599"; MyRST->Text = "599"; SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOClick(TObject *Sender) { KOA->Enabled = !m_TX; KORS->Visible = IsRTTY(); KORSC->Checked = !m_fRttyWordOut; KORSW->Checked = m_fRttyWordOut; OnMenuProc(KO, "&Options"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KHAClick(TObject *Sender) { char fname[256]; BOOL ww = TRUE; LPCSTR pName; if( Sender == KHA ){ pName = "eproject.txt"; if( !sys.m_MsgEng ) pName++; } else if( Sender == KHO ){ pName = "emmvari.txt"; if( !sys.m_MsgEng ) pName++; } else if( Sender == KHS ){ pName = "samples.txt"; ww = FALSE; } else { pName = "ehistory.txt"; if( !sys.m_MsgEng ) pName++; } if( !m_pHelp ){ m_pHelp = new TFileEdit(this); m_pHelp->SetEvent(Handle, WM_WAVE, 2); } if( m_pHelp ){ m_pHelp->SetWordWrap(ww); sprintf(fname, "%s%s", sys.m_BgnDir, pName); #if DEBUG m_pHelp->Execute(fname, FALSE); #else m_pHelp->Execute(fname, TRUE); #endif } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KHVClick(TObject *Sender) { DettachFocus(); TVerDspDlg *pBox = new TVerDspDlg(this); pBox->ShowModal(); delete pBox; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FormPaint(TObject *Sender) { if( m_fInitFirst ){ m_fInitFirst = FALSE; Draw(FALSE); if( sys.m_fShowLangMsg && !sys.m_fBaseMBCS ){ AnsiString as = "This program was made for MBCS(JA/HL/BV/BY) languages. " "SBCS languages are out of scope of this project, and there is no merit to run this program." "\r\n\r\nDo you continue to run it?"; if( YesNoMB(as.c_str()) != ID_YES ){ Close(); return; } sys.m_fShowLangMsg = FALSE; } OpenSound(FALSE); int f1stInst = FALSE; if( !strcmp(sys.m_CallSign.c_str(), "NOCALL") ){ f1stInst = TRUE; AnsiString as; DettachFocus(); if( InputMB("MMVARI", sys.m_MsgEng ? "Enter your callsign (for Macros)":"コールサインを入力して下さい", as) && !as.IsEmpty() ){ strupr(as.c_str()); sys.m_CallSign = as; Log.MakePathName(ClipCall(as.c_str())); } } sprintf(m_TextBuff, "%sARRL.DX", sys.m_BgnDir); Cty.Load(m_TextBuff); sprintf(m_TextBuff, "%sMMCG.DEF", sys.m_BgnDir); mmcg.LoadDef(m_TextBuff); if( !f1stInst ) Log.DoBackup(); Log.Open(NULL, !f1stInst); m_LogBand = Log.m_sd.band; UpdateLogLink(); UpdateTextData(); if( Log.m_sd.btime ) SBQSO->Down = TRUE; UpdateTitle(); #if !DEBUG srand(::GetTickCount()); #endif if( sys.m_fRestoreSubChannel ){ for( int i = 1; i < RXMAX; i++ ){ if( m_RxSet[i].m_fShowed ){ ShowSubChannel(i, TRUE); } } } DoEvent(macOnStart); AttachFocus(); UpdateMacroOnTimer(); } else { DoResume(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVCRClick(TObject *Sender) { m_Dump.Clear(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVCTClick(TObject *Sender) { m_ReqAutoClear = FALSE; m_Edit[m_CurrentEdit].Clear(); if( m_fReqRX ){ m_fReqRX = FALSE; m_ModFSK.m_Encode.m_fReqRX = FALSE; SetTXCaption(); } AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBATCMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ if( m_TX != txINTERNAL ){ m_fDisEvent++; EATC->Text = "0"; m_RxSet[0].m_pDem->m_Decode.SetTmg(0); m_RxSet[0].m_pDem->m_Decode.ClearLPF(); m_fDisEvent--; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CreateWaterColors(void) { int i, O, W; UCOL c; W = m_tWaterLevel[0]; for( i = 0; i < W; i++ ){ c = GetGrade2(m_tWaterColset, i, W); m_tWaterColors[i] = c.c; } UCOL col[2]; W = m_tWaterLevel[1] - m_tWaterLevel[0]; O = m_tWaterLevel[0]; col[0].c = m_tWaterColset[1].c; col[1].c = m_tWaterColset[6].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } W = m_tWaterLevel[2] - m_tWaterLevel[1]; O = m_tWaterLevel[1]; col[0].c = m_tWaterColset[6].c; col[1].c = m_tWaterColset[7].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } W = m_tWaterLevel[3] - m_tWaterLevel[2]; O = m_tWaterLevel[2]; col[0].c = m_tWaterColset[7].c; col[1].c = m_tWaterColset[8].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } W = m_tWaterLevel[4] - m_tWaterLevel[3]; O = m_tWaterLevel[3]; col[0].c = m_tWaterColset[8].c; col[1].c = m_tWaterColset[9].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } W = m_tWaterLevel[5] - m_tWaterLevel[4]; O = m_tWaterLevel[4]; col[0].c = m_tWaterColset[9].c; col[1].c = m_tWaterColset[10].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } W = 256 - m_tWaterLevel[5]; O = m_tWaterLevel[5]; col[0].c = m_tWaterColset[10].c; col[1].c = m_tWaterColset[11].c; for( i = 0; i < W; i++ ){ c = GetGrade2(col, i, W); m_tWaterColors[i+O] = c.c; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawStatusBar(const TRect &Rect, LPCSTR pText, TColor col) //JA7UDE 0428 { if( (WindowState != wsMinimized) && Rect.Right ){ TCanvas *pCanvas = StatusBar->Canvas; pCanvas->Brush->Color = col; pCanvas->TextRect(Rect, Rect.Left+1, Rect.Top+1, pText); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawHint(void) { DrawStatus(statusHint, GetHintStatus(m_HintKey.c_str())); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawStatus(int n, LPCSTR pText) { if( strcmp(pText, m_strStatus[n].c_str()) ){ m_strStatus[n] = pText; DrawStatus(n); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawStatus(int n) { const TRect &Rect = m_rcStatus[n]; //JA7UDE 0428 switch(n){ case statusCOM: { TColor col = clBtnFace; if( strcmpi(sys.m_PTTCOM.c_str(), "NONE") && !m_pCom ){ col = clRed; } DrawStatusBar(Rect, sys.m_PTTCOM.c_str(), col); } break; default: DrawStatusBar(Rect, m_strStatus[n].c_str(), clBtnFace); if( (n == statusHint) && (WindowState == wsNormal) ){ RECT rc; rc.right = StatusBar->Width; rc.bottom = StatusBar->Height; rc.left = rc.right - 14; rc.top = rc.bottom - 14; ::DrawFrameControl(StatusBar->Canvas->Handle, &rc, DFC_SCROLL, DFCS_SCROLLSIZEGRIP); } break; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::StatusBarDrawPanel(TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect) { for( int i = 0; i < statusEND; i++ ){ if( Panel == StatusBar->Panels->Items[i] ){ m_rcStatus[i] = Rect; DrawStatus(i); break; } } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetStatusIndex(int x) { int N = -1; TRect *pRect = m_rcStatus; for( int i = 0; i <= statusHint; i++, pRect++ ){ if( (x > pRect->Left) && (x < pRect->Right) ){ N = i; break; } } return N; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::StatusBarMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { switch(GetStatusIndex(X)){ case statusPAGE: PupPage->Popup(Left+X, Top+StatusBar->Top + Y); break; case statusSAMP: if( Button == mbLeft ){ KOOClick((TObject *)2); } else { KOAClick(NULL); } break; case statusCOM: KOOClick((TObject *)1); break; case statusVARI: PupCharset->PopupComponent = StatusBar; PupCharset->Popup(Left+X, Top+StatusBar->Top + Y); break; case statusHint: if( m_pPlayBox ) KVSPClick(NULL); break; default: break; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::StatusBarMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { int N = GetStatusIndex(X); if( (N >= statusPAGE) && (N <= statusHint) ){ const LPCSTR _tt[][2]={ { "送信画面ページ", "Page of the TX window" }, { "受信信号のS/N比", "S/N ratio of the RX signals" }, { "サウンドカード Clock", "Sound card clock" }, { "PTTポート", "PTT Port" }, { "伝送言語", "Transmission language" }, { "", "" }, }; DrawStatus(statusHint, _tt[N][sys.m_MsgEng]); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KANSIClick(TObject *Sender) { TMenuItem *pMenu = (TMenuItem *)Sender; if( pMenu->Checked ) return; WORD wLang; if( pMenu == KANSI ){ wLang = 0; } else if( pMenu == KJA ){ wLang = 0x0411; } else if( pMenu == KHL ){ wLang = 0x0412; } else if( pMenu == KBV ){ wLang = 0x0404; } else if( pMenu == KBY ){ wLang = 0x0804; } int n = GetPopupIndex(PupCharset->PopupComponent); if( n ){ TRxViewDlg *pView = m_RxSet[n].m_pView; SetLangFont(pView->PC->Font, wLang); pView->OnUpdateFont(); } else { DettachFocus(); SetLangFont(PCRX->Font, wLang); PCTX->Font->Name = PCRX->Font->Name; PCTX->Font->Charset = PCRX->Font->Charset; OnFontChange(FALSE); OnFontChange(TRUE); UpdateUI(); AttachFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KMISCClick(TObject *Sender) { int n = GetPopupIndex(PupCharset->PopupComponent); if( n ){ m_RxSet[n].m_pView->ChangeFont(); } else { TFontDialog *pBox = new TFontDialog(this); DettachFocus(); pBox->Font = PCRX->Font; pBox->Font->Color = PCRX->Color; OnWave(); if( pBox->Execute() ){ PCRX->Font = pBox->Font; PCRX->Color = pBox->Font->Color; PCTX->Font->Name = PCRX->Font->Name; PCTX->Font->Charset = PCTX->Font->Charset; OnFontChange(FALSE); OnFontChange(TRUE); } delete pBox; UpdateUI(); AttachFocus(); } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetPopupIndex(TComponent *pComponent) { if( (pComponent == StatusBar)||(pComponent == this) ){ return 0; } else { CRxSet *pRxSet = &m_RxSet[1]; for( int i = 1; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() && pRxSet->m_pView ){ if( (pComponent == pRxSet->m_pView->StatusBar)|| (pComponent == pRxSet->m_pView) ){ return i; } } } } return 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupCharsetPopup(TObject *Sender) { CheckFontCharset(); KJA->Enabled = sys.m_tFontFam[fmJA]; KHL->Enabled = sys.m_tFontFam[fmHL] || sys.m_tFontFam[fmJOHAB]; KBV->Enabled = sys.m_tFontFam[fmBV]; KBY->Enabled = sys.m_tFontFam[fmBY]; int charset; int n = GetPopupIndex(PupCharset->PopupComponent); if( n ){ charset = m_RxSet[n].m_pView->PC->Font->Charset; } else { charset = PCRX->Font->Charset; } switch(charset){ case SHIFTJIS_CHARSET: KJA->Checked = TRUE; break; case JOHAB_CHARSET: case HANGEUL_CHARSET: KHL->Checked = TRUE; break; case CHINESEBIG5_CHARSET: // KBV->Checked = TRUE; break; case 134: // 簡略 KBY->Checked = TRUE; break; case ANSI_CHARSET: KANSI->Checked = TRUE; break; case SYMBOL_CHARSET: KMISC->Checked = TRUE; break; default: KMISC->Checked = TRUE; break; } OnMenuProc(PupCharset->Items, "PopCHARSET"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::HisRSTChange(TObject *Sender) { if( m_fDisEvent ) return; if( m_fDrop ){ m_fDrop = FALSE; SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnLogFreq(BOOL fLink) { Log.SetFreq(&Log.m_sd, AnsiString(LogFreq->Text).c_str()); //JA7UDE 0428 if( fLink ) LogLink.SetFreq(AnsiString(LogFreq->Text).c_str()); //JA7UDE 0428 if( Log.m_sd.band != m_LogBand ){ m_LogBand = Log.m_sd.band; DoEvent(macOnBand); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::LogFreqChange(TObject *Sender) { if( m_fDisEvent ) return; OnLogFreq(TRUE); if( m_fDrop ){ m_fDrop = FALSE; if( (ActiveControl != PCTX) && PCTX->CanFocus() ) SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOVClick(TObject *Sender) { char fname[256]; sprintf(fname, "%sVARICODE.TXT", sys.m_BgnDir); g_VariCode.SaveTable(fname); if( !m_pEdit ){ m_pEdit = new TFileEdit(this); m_pEdit->SetEvent(Handle, WM_WAVE, 2); } m_pEdit->SetDelFile(TRUE); m_pEdit->Execute(fname, TRUE); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KECClick(TObject *Sender) { DettachFocus(); TCodeView *pBox = new TCodeView(this); pBox->Execute(Handle, WM_WAVE, 3, PCRX->Font); delete pBox; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFWSTClick(TObject *Sender) { if( m_pPlayBox ){ delete m_pPlayBox; m_pPlayBox = NULL; } ::GetLocal(&m_LocalTime); sprintf(m_TextBuff, "%s%02u%02u%02u%02u%02u%02u.mmv", sys.m_SoundDir, m_LocalTime.wYear % 100, m_LocalTime.wMonth, m_LocalTime.wDay, m_LocalTime.wHour, m_LocalTime.wMinute, m_LocalTime.wSecond ); m_WaveFile.Rec(m_TextBuff); KFWST->Checked = TRUE; KFWS->Checked = FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFWSClick(TObject *Sender) { TSaveDialog *pBox = new TSaveDialog(this); pBox->Options << ofOverwritePrompt; pBox->Options << ofNoReadOnlyReturn; if( sys.m_MsgEng ){ pBox->Title = "Recode sound"; pBox->Filter = "MMV Files(*.mmv)|*.mmv|"; } else { pBox->Title = "サウンドの記録"; pBox->Filter = "MMV Files(*.mmv)|*.mmv|"; } pBox->FileName = ""; pBox->DefaultExt = "mmv"; pBox->InitialDir = sys.m_SoundDir; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ SetDirName(sys.m_SoundDir, AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 OnWave(); if( m_pPlayBox ){ delete m_pPlayBox; m_pPlayBox = NULL; } OnWave(); m_WaveFile.Rec(AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 KFWST->Checked = FALSE; KFWS->Checked = TRUE; } delete pBox; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFRSClick(TObject *Sender) { TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Play sound"; pBox->Filter = "MMV Files(*.mmv)|*.mmv|"; } else { pBox->Title = "サウンドの再生"; pBox->Filter = "MMV Files(*.mmv)|*.mmv|"; } pBox->FileName = ""; pBox->DefaultExt = "mmv"; pBox->InitialDir = sys.m_SoundDir; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ SetDirName(sys.m_SoundDir, AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 OnWave(); m_Wave.InClose(); if( m_WaveFile.Play(AnsiString(pBox->FileName).c_str()) ){ //JA7UDE 0428 ReOutOpen(); if( !m_pPlayBox ){ m_pPlayBox = new TPlayDlgBox(this); } m_pPlayBox->Execute(&m_WaveFile); } else { OpenSound(FALSE); } } delete pBox; if( m_pPlayBox ){ m_pPlayBox->Visible = TRUE; m_pPlayBox->SetFocus(); } else { AttachFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFESClick(TObject *Sender) { if( m_pPlayBox ){ delete m_pPlayBox; m_pPlayBox = NULL; } int mode = m_WaveFile.m_mode; m_WaveFile.FileClose(); if( mode == 1 ){ m_Wave.OutAbort(); OpenSound(FALSE); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVSPClick(TObject *Sender) { if( m_pPlayBox ){ m_pPlayBox->Visible = TRUE; m_pPlayBox->SetFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVLClick(TObject *Sender) { TLogListDlg *pBox = new TLogListDlg(this); OnWave(); pBox->Execute(); delete pBox; UpdateTitle(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateCallsign(void) { if( HisCall->Text.IsEmpty() ){ m_Dupe = 0; SBQSO->Enabled = FALSE; } else { SBQSO->Enabled = TRUE; } HisCall->Font->Color = m_Dupe ? clRed : clBlack; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateLogMode(void) { LPCSTR pMode; if( m_strLogMode.IsEmpty() ){ pMode = g_tLogModeTable[CBMode->ItemIndex]; } else { pMode = m_strLogMode.c_str(); } Log.SetMode(&Log.m_sd, pMode); LogLink.SetMode(pMode); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateLogData(void) { StrCopy(Log.m_sd.call, AnsiString(HisCall->Text).c_str(), MLCALL); //JA7UDE 0428 clipsp(Log.m_sd.call); jstrupr(Log.m_sd.call); StrCopy(Log.m_sd.name, AnsiString(HisName->Text).c_str(), MLNAME); //JA7UDE 0428 StrCopy(Log.m_sd.qth, AnsiString(HisQTH->Text).c_str(), MLQTH); //JA7UDE 0428 StrCopy(Log.m_sd.my, AnsiString(MyRST->Text).c_str(), MLRST); //JA7UDE 0428 jstrupr(Log.m_sd.my); StrCopy(Log.m_sd.ur, AnsiString(HisRST->Text).c_str(), MLRST); //JA7UDE 0428 jstrupr(Log.m_sd.ur); StrCopy(Log.m_sd.rem, AnsiString(EditNote->Text).c_str(), MLREM); //JA7UDE 0428 StrCopy(Log.m_sd.qsl, AnsiString(EditQSL->Text).c_str(), MLQSL); //JA7UDE 0428 Log.SetFreq(&Log.m_sd, AnsiString(LogFreq->Text).c_str()); //JA7UDE 0428 } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateTextData(void) { HisCall->Text = Log.m_sd.call; HisName->Text = Log.m_sd.name; HisQTH->Text = Log.m_sd.qth; HisRST->Text = Log.m_sd.ur; MyRST->Text = Log.m_sd.my; EditNote->Text = Log.m_sd.rem; EditQSL->Text = Log.m_sd.qsl; LogFreq->Text = Log.GetFreqString(Log.m_sd.band, Log.m_sd.fq); Log.m_CurChg = 0; UpdateLogPanel(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::FindCall(void) { CWaitCursor w; UpdateLogMode(); m_Dupe = 0; StrCopy(Log.m_sd.call, AnsiString(HisCall->Text).c_str(), MLCALL); //JA7UDE 0428 clipsp(Log.m_sd.call); AddCall(Log.m_sd.call); // if( IsCall(Log.m_sd.call) ) AddCall(Log.m_sd.call); AnsiString strHis = HisRST->Text; if( Log.FindSet(&Log.m_Find, Log.m_sd.call) ){ // 見つかった時 OnWave(); Log.SetFreq(&Log.m_sd, AnsiString(LogFreq->Text).c_str()); //JA7UDE 0428 SDMMLOG sd; Log.GetData(&sd, Log.m_Find.pFindTbl[0]); // 一番最新のデータ if( SBQSO->Down ){ if( (sd.btime == Log.m_sd.btime) && Log.m_Find.GetCount() ){ Log.GetData(&sd, Log.m_Find.pFindTbl[1]); // 二番目のデータ } } else { Log.m_sd.btime = 0; } if( sd.btime != Log.m_sd.btime ){ if( Log.m_Find.m_FindCmp1Max ){ switch(Log.m_LogSet.m_CheckBand){ case 1: if( Log.FindSameBand(FALSE) ) m_Dupe = 1; break; case 2: if( Log.FindSameBand(TRUE) ) m_Dupe = 1; break; default: m_Dupe = 1; break; } } } if( (!SBQSO->Down || !Log.m_sd.name[0] ) && Log.m_LogSet.m_CopyName ) strcpy(Log.m_sd.name, sd.name); if( (!SBQSO->Down || !Log.m_sd.qth[0] ) && Log.m_LogSet.m_CopyQTH ) strcpy(Log.m_sd.qth, sd.qth); if( (!SBQSO->Down || !Log.m_sd.rem[0] ) && Log.m_LogSet.m_CopyREM ) strcpy(Log.m_sd.rem, sd.rem); if( (!SBQSO->Down || !Log.m_sd.qsl[0] ) && Log.m_LogSet.m_CopyQSL ) strcpy(Log.m_sd.qsl, sd.qsl); UpdateTextData(); if( SBQSO->Down ){ Log.m_Find.Ins(Log.m_CurNo); UpdateTextData(); Log.PutData(&Log.m_sd, Log.m_CurNo); } } else { // 見つからなかった時 if( !SBQSO->Down && Log.m_LogSet.m_CopyName ) Log.m_sd.name[0] = 0; if( !SBQSO->Down && Log.m_LogSet.m_CopyQTH ) Log.m_sd.qth[0] = 0; if( !SBQSO->Down && Log.m_LogSet.m_CopyREM ) Log.m_sd.rem[0] = 0; if( !SBQSO->Down && Log.m_LogSet.m_CopyQSL ) Log.m_sd.qsl[0] = 0; UpdateTextData(); } LPCSTR pCC = ClipCC(Log.m_sd.call); Log.SetOptStr(0, &Log.m_sd, Cty.GetCountry(pCC)); Log.SetOptStr(1, &Log.m_sd, Cty.GetCont(pCC)); if( !strHis.IsEmpty() ) HisRST->Text = strHis; UpdateCallsign(); UpdateLogPanel(); if( !SBQSO->Down ){ LogLink.SetFreq(AnsiString(LogFreq->Text).c_str()); LogLink.SetMode(g_tLogModeTable[CBMode->ItemIndex]); LogLink.FindCall(Log.m_sd.call); } else { LogLink.Write(&Log.m_sd, 1); } DoEvent(macOnFind); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::AutoLogSave(void) { if( Log.IsOpen() && Log.m_LogSet.m_AutoSave && Log.IsEdit() ) KFLFClick(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateLogLink(void) { LogLink.UpdateLink(sys.m_LogLink); UpdateTitle(); if( sys.m_LogLink ){ if( !m_pLogLinkTimer ){ m_pLogLinkTimer = new TTimer(this); m_pLogLinkTimer->OnTimer = LogLinkTimer; m_pLogLinkTimer->Interval = LINKINTERVAL; } } else if( m_pLogLinkTimer ){ delete m_pLogLinkTimer; m_pLogLinkTimer = NULL; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFLFClick(TObject *Sender) { Log.Close(); Log.Open(NULL, TRUE); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::HisCallChange(TObject *Sender) { UpdateLogPanel(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBDataClick(TObject *Sender) { SDMMLOG sd; UpdateLogData(); if( strcmp(Log.m_Find.GetText(), Log.m_sd.call) ){ CWaitCursor w; Log.FindSet(&Log.m_Find, Log.m_sd.call); } TQSODlgBox *pBox = new TQSODlgBox(this); OnWave(); memcpy(&sd, &Log.m_sd, sizeof(sd)); DettachFocus(); if( pBox->Execute(&Log.m_Find, &Log.m_sd, Log.m_CurNo) == TRUE ){ if( memcmp(&sd, &Log.m_sd, sizeof(sd)) ){ UpdateTextData(); HisCallChange(NULL); LogLink.Write(&Log.m_sd, 0); } } delete pBox; AttachFocus(); UpdateLogPanel(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBFindClick(TObject *Sender) { AnsiString strName = HisName->Text; AnsiString strMy = MyRST->Text; if( !Log.IsOpen() ){ if( Log.Open(NULL, TRUE) == FALSE ){ UpdateLogPanel(); return; } } FindCall(); DettachFocus(); TQSODlgBox *pBox = new TQSODlgBox(this); pBox->ShowFind(&Log.m_Find); delete pBox; if( HisName->Text.IsEmpty() ) HisName->Text = strName; if( MyRST->Text.IsEmpty() ) MyRST->Text = strMy; AutoLogSave(); UpdateLogPanel(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOLClick(TObject *Sender) { DettachFocus(); TLogSetDlg *pBox = new TLogSetDlg(this); pBox->Execute(); delete pBox; UpdateLogLink(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CheckLogLink(void) { } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFLOClick(TObject *Sender) { TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options >> ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Open LogData File"; pBox->Filter = "MMLOG Data Files(*.mdt)|*.mdt|"; } else { pBox->Title = "ログファイルのオープン"; pBox->Filter = "MMLOGデータファイル(*.mdt)|*.mdt|"; } pBox->FileName = ""; pBox->DefaultExt = "mdt"; pBox->InitialDir = sys.m_LogDir; DettachFocus(); if( pBox->Execute() == TRUE ){ Log.Close(); Log.DoBackup(); Log.MakeName(AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 Log.Open(NULL, TRUE); UpdateTextData(); UpdateTitle(); } UpdateLogPanel(); delete pBox; if( Active ) AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBListClick(TObject *Sender) { DettachFocus(); TLogListDlg *pBox = new TLogListDlg(this); OnWave(); pBox->Execute(); delete pBox; AutoLogSave(); UpdateLogLink(); UpdateTitle(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CMMML(TMessage &Message) { if( sys.m_LogLink != 2 ) return; if( LogLink.m_pLink == NULL ) return; switch(Message.WParam){ case MML_NOTIFYSESSION: LogLink.NotifySession((LPCSTR)Message.LParam); UpdateLogLink(); break; case MML_QRETURN: if( !LogLink.IsLink() ) return; if( LogLink.QReturn(&Log.m_sd, (const mmLOGDATA *)Message.LParam) ){ UpdateTextData(); } break; case MML_VFO: if( !LogLink.IsLink() ) return; if( Message.LParam ){ LogFreq->Text = (LPCSTR)Message.LParam; OnLogFreq(FALSE); } break; } Message.Result = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CMMMR(TMessage &Message) { if( m_pRadio == NULL ) return; switch(Message.WParam){ case MMR_DEFCOMMAND: { LPCSTR p; switch(Message.LParam){ case 1: p = RADIO.CmdRx.c_str(); break; case 2: p = RADIO.CmdTx.c_str(); break; default: p = RADIO.CmdInit.c_str(); break; } m_pRadio->SendCommand(p); } break; case MMR_VFO: m_pRadio->UpdateFreq(double(Message.LParam)/10000.0); break; } Message.Result = TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVWAClick(TObject *Sender) { InvMenu(KVWA); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitDefKey(void) { sys.m_DefKey[kkTX] = VK_F12; sys.m_DefKey[kkTXOFF] = VK_PAUSE; } //--------------------------------------------------------------------------- // 初回の初期化 __fastcall CRxSet::CRxSet() { m_fShowed = FALSE; m_Mode = sys.m_DefaultMode; m_fTWO = 0; m_fMBCS = 0; m_fAFC = TRUE; m_SQLevel = 300; m_SQ = FALSE; m_SQTimer = 0; m_Speed = SPEED; m_AFCTimerW = 0; m_AFCTimerN = 0; m_AFCTimerW2 = 0; m_AFCFQ = 0; m_AFCSQ = 0; m_fATC = FALSE; m_WaterW = 400; m_pFFT = &MainVARI->m_FFT; m_CarrierFreq = 1750; m_MFSK_TYPE = typMFSK16; m_AFCTimerPSK = m_AFCTimerMFSK = 0; m_RTTYFFT = FALSE; memset(&m_StgFFT, 0, sizeof(m_StgFFT)); m_StgFFT.VW = 100; InitStgFFT(); m_FontData.m_Name = ""; m_FontData.m_Charset = 0; m_FontData.m_Height = 0; m_FontData.m_Style = 0; m_cAutoTS1 = m_cAutoTS2 = 0; m_AvgAFC.Create(8); m_pDem = NULL; m_pView = NULL; } //--------------------------------------------------------------------------- __fastcall CRxSet::~CRxSet() { Delete(); } //--------------------------------------------------------------------------- void __fastcall CRxSet::SetMFSKType(int type) { m_MFSK_TYPE = type; if( IsActive() ) m_pDem->SetMFSKType(type); } //--------------------------------------------------------------------------- double __fastcall CRxSet::GetSpeed(void) { if( IsMFSK() ){ const double _tt[]={15.625,7.8125,31.25,10.767,21.533,32.0,62.5,3.9063}; return _tt[m_MFSK_TYPE]; // return IsActive() ? m_pDem->m_MFSK_SPEED : 15.625; } else { return m_Speed; } } //--------------------------------------------------------------------------- void __fastcall CRxSet::SetSpeed(double b) { if( b < MIN_SPEED ) return; if( b > MAX_SPEED ) return; if( m_Speed != b ){ m_Speed = b; if( IsActive() ) m_pDem->SetSpeed(b); } } //--------------------------------------------------------------------------- void __fastcall CRxSet::SetMode(int mode) { int Offset = 0; double Speed = 0.0; if( m_Mode != mode ){ if( ::IsRTTY(mode) ){ if( !::IsRTTY(m_Mode) ){ Speed = 45.45; } } else if( ::IsMFSK(mode) ){ if( !::IsMFSK(m_Mode) ){ Speed = 15.625; } } else { if( ::IsRTTY(m_Mode) || ::IsMFSK(m_Mode) ){ Speed = 31.25; } } if( ::IsMFSK(mode) && ::IsMFSK(m_Mode) && !sys.m_MFSK_Center ){ int bw = m_pDem ? m_pDem->m_MFSK_BW : 234.375; Offset = (mode == MODE_mfsk_U) ? -bw : bw; } } m_Mode = mode; if( Speed > 1.0 ) MainVARI->UpdateSpeed(this, Speed); MainVARI->InitCollect(this, ::IsRTTY(m_Mode) ? 7 : 14); switch(m_Mode){ case MODE_RTTY: case MODE_U_RTTY: case MODE_GMSK: case MODE_FSK: case MODE_FSKW: case MODE_BPSK: m_fTWO = FALSE; break; case MODE_N_BPSK: case MODE_mfsk_L: case MODE_mfsk_U: case MODE_qpsk_L: case MODE_qpsk_U: m_fTWO = TRUE; break; } m_fMBCS = FALSE; m_AFCTimerPSK = m_AFCTimerMFSK = 0; if( IsActive() ) m_pDem->SetType(m_Mode); m_AvgAFC.Create(IsMFSK() ? 4 : 8); m_AvgAFC.Reset(m_pDem->m_CarrierFreq); MainVARI->UpdateMode(this, Offset); } //--------------------------------------------------------------------------- void __fastcall CRxSet::SetCarrierFreq(double f) { if( IsActive() ){ m_pDem->SetCarrierFreq(f); m_CarrierFreq = f; } m_AvgAFC.Reset(f); m_AFCTimerPSK = 0; m_AFCFQ = f; } //--------------------------------------------------------------------------- void __fastcall CRxSet::Create(BOOL fView) { m_SQLevel = 300; m_SQ = FALSE; m_SQTimer = 0; m_AFCTimerW = 0; m_AFCTimerN = 0; m_AFCTimerW2 = 0; m_AFCFQ = 0; m_AFCSQ = 0; m_fATC = FALSE; m_pFFT = &MainVARI->m_FFT; m_StgFFT.dBSum = 0; m_StgFFT.dBMax = 0; m_StgFFT.dBWMax = 0; m_StgFFT.VW = 100; m_StgFFT.DispSig = 0; m_StgFFT.Timer = 0; InitStgFFT(); m_cAutoTS1 = m_cAutoTS2 = 0; m_PeakSig = 0; m_AvgSig.Create(32); LimitInt(&m_CarrierFreq, MIN_CARRIER, sys.m_MaxCarrier); LimitInt(&m_SQLevel, 0, LEVELMAX); LimitDbl(&m_Speed, MIN_SPEED, MAX_SPEED); if( IsRTTY() ) m_Speed = 45.45; EPHASE(P_SUBCREATE); if( !m_pDem ){ m_pDem = new CDEMFSK; if( !m_pDem ){ MainVARI->SetErrorMsg("Out of memory"); return; } m_pDem->m_fRTTYFFT = m_RTTYFFT; m_pDem->SetSampleFreq(DEMSAMPFREQ); m_pDem->SetSpeed(m_Speed); m_pDem->SetType(m_Mode); m_pDem->SetMFSKType(m_MFSK_TYPE); m_pDem->m_Decode.SetATCSpeed(MainVARI->m_ATCSpeed); m_pDem->m_Decode.SetATCLimit(MainVARI->m_ATCLimit); if( fView ){ // サブウインドウの場合 m_pDem->m_Decode.m_fATC = TRUE; m_pDem->m_fAFC = m_fAFC; m_pDem->m_fEnableAFC = TRUE; CDEMFSK *pDem = MainVARI->m_RxSet[0].m_pDem; m_pDem->MakeBPF(pDem->m_PreBPFTaps); m_pDem->m_pBPF = &pDem->m_inBPF; SetCarrierFreq(m_CarrierFreq); // m_fJA = MainVARI->m_RxSet[0].m_fJA; } InitStgFFT(); m_StgFFT.Timer = 0; } EPHASE(P_SUBVIEW); if( fView && !m_pView ){ m_pView = new TRxViewDlg(MainVARI); if( !m_pView ){ delete m_pDem; m_pDem = NULL; MainVARI->SetErrorMsg("Out of memory"); return; } m_pView->m_pRxSet = this; m_pView->SetBounds(m_rcView.left, m_rcView.top, m_rcView.right, m_rcView.bottom); m_pView->UpdateWaterWidth(); m_pView->m_Dump.SetRTTY(IsRTTY()); m_pView->m_Dump.ShowCtrl(sys.m_fShowCtrlCode); if( m_FontData.m_Height ){ FontData2Font(m_pView->PC->Font, &m_FontData); } m_pView->OnUpdateFont(); memcpy(m_pView->m_Dump.m_Color, MainVARI->m_Dump.m_Color, sizeof(MainVARI->m_Dump.m_Color)); // ::SetWindowPos(m_pView->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); } EPHASE(P_NULL); SetMode(m_Mode); } //--------------------------------------------------------------------------- void __fastcall CRxSet::Delete(void) { if( m_pDem ){ m_CarrierFreq = m_pDem->m_CarrierFreq + 0.5; delete m_pDem; m_pDem = NULL; } if( m_pView ){ MainVARI->CloseWheelTimer(&m_pView->m_Dump); m_rcView.left = m_pView->Left; m_rcView.top = m_pView->Top; m_rcView.right = m_pView->Width; m_rcView.bottom = m_pView->Height; Font2FontData(&m_FontData, m_pView->PC->Font); delete m_pView; m_pView = NULL; m_fShowed = TRUE; } else { m_fShowed = FALSE; } } //--------------------------------------------------------------------------- void __fastcall CRxSet::SetSampleFreq(double f) { if( !IsActive() ) return; m_pDem->SetSampleFreq(f); if( m_pView ) m_pView->UpdateWaterWidth(); } //--------------------------------------------------------------------------- void __fastcall CRxSet::InitStgFFT(void) { if( m_pFFT->m_FFTGain ){ m_StgFFT.Sum = 1024; m_StgFFT.Max = 1024; m_StgFFT.WMax = 1024; } else { m_StgFFT.Sum = 5000; m_StgFFT.Max = 5000; m_StgFFT.WMax = 5000; } m_StgFFT.Sig = 0; } //--------------------------------------------------------------------------- void __fastcall CRxSet::ClearWindow(void) { if( !IsActive() ) return; if( m_pView ) m_pView->m_Dump.Clear(); } //--------------------------------------------------------------------------- double __fastcall CRxSet::GetBandWidth(void) { switch(m_Mode){ case MODE_GMSK: case MODE_BPSK: case MODE_N_BPSK: case MODE_qpsk_L: case MODE_qpsk_U: return m_Speed; case MODE_FSK: return m_Speed*2; case MODE_FSKW: case MODE_RTTY: case MODE_U_RTTY: return m_pDem->m_RTTYShift; case MODE_mfsk_L: case MODE_mfsk_U: if( m_pDem ){ return m_pDem->m_MFSK_BW; } else { return 234.375; } } return 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateSubWindow(void) { m_fSubWindow = FALSE; int i; for( i = 1; i < RXMAX; i++ ){ if( m_RxSet[i].IsActive() ) m_fSubWindow = TRUE; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ShowSubChannel(int n, int sw) { DettachFocus(); CRxSet *pRxSet = &m_RxSet[n]; if( sw == 2 ){ sw = !pRxSet->IsActive(); } if( sw ){ if( !pRxSet->IsActive() ){ pRxSet->Create(TRUE); sprintf(m_TextBuff, sys.m_MsgEng ? "Channel - %u":"チャンネル - %u", n); pRxSet->m_pView->Caption = m_TextBuff; } pRxSet->m_pView->Visible = TRUE; } else { if( pRxSet->IsActive() ) pRxSet->Delete(); } UpdateSubWindow(); AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxFFTMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( SBWave->Down ) return; // FFTまたはWaterFallの場合 if( m_MouseDown ){ int fq = m_FFTB + X * m_FFTW / m_fftXW; if( fq < MIN_CARRIER ) fq = MIN_CARRIER; if( fq > sys.m_MaxCarrier ) fq = sys.m_MaxCarrier; if( m_MouseNotch ){ m_Notches.SetFreq(m_MouseNotch-1, fq); if( m_MouseNotch == 1 ) m_NotchFreq = fq; PBoxFFTPaint(NULL); } else if( m_MouseSubChannel ){ CRxSet *pRxSet = &m_RxSet[m_MouseSubChannel]; if( pRxSet->IsActive() ){ pRxSet->m_pDem->m_Decode.Reset(); pRxSet->m_pDem->ResetMeasMFSK(); pRxSet->SetCarrierFreq(fq); PBoxFFTPaint(NULL); } } else { m_RxSet[0].m_pDem->m_Decode.Reset(); SetRxFreq(fq); } } else if( m_fSubWindow || m_Notches.m_Count ){ m_MouseNotch = FALSE; m_MouseSubChannel = FALSE; int i; if( m_Notches.m_Count ){ for( i = 0; i < m_Notches.m_Count; i++ ){ int xx = X - m_Notches.m_pBase[i].m_MX; int yy = Y - m_Notches.m_pBase[i].m_MY; int d = (xx * xx + yy * yy); if( d < 64 ){ m_MouseNotch = i + 1; } } } if( !m_MouseNotch ){ CRxSet *pRxSet = &m_RxSet[RXMAX-1]; for( i = RXMAX-1; i > 0; i--, pRxSet-- ){ if( pRxSet->IsActive() ){ int xx = X - pRxSet->m_X; int yy = Y - pRxSet->m_Y; int d = (xx * xx + yy * yy); if( d < 64 ){ m_MouseSubChannel = i; break; } } } } PBoxFFT->Cursor = (m_MouseNotch || m_MouseSubChannel) ? crSizeWE : crDefault; } else { m_MouseSubChannel = FALSE; m_MouseNotch = 0; // int XO = (UdRxCarrier->Position - m_FFTB) * m_fftXW / m_FFTW; // XO -= X; XO *= XO; // PBoxFFT->Cursor = (XO < 64) ? crSizeWE : crDefault; PBoxFFT->Cursor = crDefault; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxFFTMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( m_MouseDown && !SBFFT500->Down ){ int fq = m_FFTB + X * m_FFTW / m_fftXW; if( fq < MIN_CARRIER ) fq = MIN_CARRIER; if( fq > sys.m_MaxCarrier ) fq = sys.m_MaxCarrier; if( m_MouseNotch ){ m_Notches.SetFreq(m_MouseNotch-1, fq); if( m_MouseNotch == 1 ) m_NotchFreq = fq; PBoxFFTPaint(NULL); } else if( m_MouseSubChannel ){ CRxSet *pRxSet = &m_RxSet[m_MouseSubChannel]; if( pRxSet->IsActive() ){ fq = GetSignalFreq(fq, SBFFT3K->Down ? 50 : 32, pRxSet); pRxSet->m_pDem->m_Decode.Reset(); pRxSet->m_pDem->ResetMeasMFSK(); pRxSet->m_PeakSig = 0; pRxSet->SetCarrierFreq(fq); pRxSet->m_AFCTimerMFSK = (SBFFT500->Down || SBFFT1K->Down) ? MFSKAFC_MAX : 0; PBoxFFTPaint(NULL); } } else { fq = GetSignalFreq(fq, SBFFT3K->Down ? 50 : 32, &m_RxSet[0]); m_RxSet[0].m_pDem->m_Decode.Reset(); SetRxFreq(fq); m_RxSet[0].m_AFCTimerMFSK = (SBFFT500->Down || SBFFT1K->Down) ? MFSKAFC_MAX : 0; m_RxSet[0].m_PeakSig = 0; } } m_MouseDown = FALSE; m_MouseSubChannel = FALSE; m_MouseNotch = 0; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KCallClick(TObject *Sender) { TMenuItem *pm = (TMenuItem *)Sender; if( strcmp(AnsiString(HisCall->Text).c_str(), (AnsiString(pm->Caption).c_str()+6)) ){ //JA7UDE 0428 HisCall->Text = pm->Caption.c_str() + 6; FindCall(); UpdateUI(); SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::AddCall(LPCSTR p) { SYSTEMTIME now; GetLocal(&now); char bf[128]; sprintf(bf, "%02u:%02u\t%s", now.wHour, now.wMinute, p); int i; TMenuItem *pm; for( i = 0; i < PupCalls->Items->Count; i++ ){ pm = PupCalls->Items->Items[i]; if( !strcmp(AnsiString(pm->Caption).c_str()+6, p) ){ //JA7UDE 0428 if( !i ){ pm->Caption = bf; return; } else { PupCalls->Items->Delete(i); break; } } } pm = new TMenuItem (this); pm->Caption = bf; pm->RadioItem = FALSE; pm->OnClick = KCallClick; pm->Checked = FALSE; pm->Enabled = TRUE; if( (i >= PupCalls->Items->Count) && (PupCalls->Items->Count == STGCALLMAX) ){ PupCalls->Items->Delete(STGCALLMAX-1); } PupCalls->Items->Insert(0, pm); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetTXFocus(void) { if( PCTX->CanFocus() ) PCTX->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBMClick(TObject *Sender) { if( PupCalls->Items->Count ){ RECT rc; ::GetWindowRect(PLog->Handle, &rc); PupCalls->Popup(rc.left+SBM->Left + SBM->Width/2, rc.top+SBM->Top+SBM->Height/2); } } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::DeleteMacroTimerS(void) { BOOL r = FALSE; if( m_ReqMacroTimer || m_pMacroTimer ){ m_ReqMacroTimer = 0; if( m_CurrentMacro >= 0 ){ MACBUTTON *pList = &m_tMacButton[m_CurrentMacro]; if( pList->pButton ) pList->pButton->Down = FALSE; } if( m_pMacroTimer ){ m_pMacroTimer->Enabled = FALSE; delete m_pMacroTimer; m_pMacroTimer = NULL; } DrawHint(); r = TRUE; } m_pCurrentMacroMenu = NULL; return r; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DeleteMacroTimer(void) { if( DeleteMacroTimerS() ){ if( m_TX ) ToRX(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CreateMacroTimer(int n) { if( n <= 100 ) n = 100; if( m_pMacroTimer ){ delete m_pMacroTimer; m_pMacroTimer = NULL; } if( ((m_CurrentMacro >= 0) && (m_CurrentMacro < MACBUTTONALL)) || (m_CurrentMacro == -1) ){ m_pMacroTimer = new TTimer(this); m_pMacroTimer->Interval = n; m_pMacroTimer->OnTimer = MacroTimer; m_pMacroTimer->Enabled = TRUE; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVLAClick(TObject *Sender) { InvMenu(KVLA); UpdateLogHeight(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateLogHeight(void) { BOOL f = KVLA->Checked; if( f ){ PLog->Height = 52; } else { PLog->Height = 26; } L16->Visible = f; L17->Visible = f; L18->Visible = f; HisQTH->Visible = f; EditNote->Visible = f; EditQSL->Visible = f; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PLogMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ) KVLAClick(NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateMacButtonVW(int n) { if( n < 2 ) n = 2; if( n > 4 ) n = 4; m_MacButtonVW = n; n *= 16; PCMac->SetBounds(0, StatusBar->Top - n, ClientWidth, n); UdMac->Height = n; SetMacButtonMax(); CreateMacButton(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVM2Click(TObject *Sender) { int n = 3; if( Sender == KVM2 ){ n = 2; } else if( Sender == KVM4 ){ n = 4; } UpdateMacButtonVW(n); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UdMacMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ UdMac->Position = 0; CreateMacButton(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KOAClick(TObject *Sender) { if( m_TX ) return; if( !m_pClockView ) m_pClockView = new TClockAdjDlg(this); m_pClockView->Execute(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBDataMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ int n = Log.m_CurNo - 1; if( n < 0 ){ SBDataClick(NULL); return; } TQSODlgBox *pBox = new TQSODlgBox(this); SDMMLOG sd; Log.GetData(&sd, n); CLogFind Find; Log.FindSet(&Find, sd.call); DettachFocus(); pBox->Execute(&Find, &sd, n); delete pBox; AttachFocus(); if( !SBQSO->Down && Log.m_CurNo && Log.IsEdit() ){ Log.SetLastPos(); UpdateTextData(); } AutoLogSave(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBFindMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ AnsiString as; if( InputMB("MMVARI", "Callsign", as) == TRUE ){ jstrupr(as.c_str()); CLogFind find; Log.FindSet(&find, as.c_str() ); TQSODlgBox *pBox = new TQSODlgBox(this); DettachFocus(); pBox->ShowFind(&find); delete pBox; AttachFocus(); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFLClick(TObject *Sender) { if( m_Dump.IsLogging() ){ m_Dump.CloseLogFile(); } else { ::SetCurrentDirectory(sys.m_BgnDir); char bf[256]; sprintf(bf, "%sRxLog", sys.m_BgnDir); mkdir(bf); ::GetLocal(&m_LocalTime); sprintf(bf, "%sRxLog\\%04u%02u%02u.txt", sys.m_BgnDir, m_LocalTime.wYear, m_LocalTime.wMonth, m_LocalTime.wDay ); m_Dump.OpenLogFile(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFLRClick(TObject *Sender) { char bf[256]; sprintf(bf, "%sRxLog", sys.m_BgnDir); TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Load text file"; pBox->Filter = "Text files(*.txt)|*.txt|"; } else { pBox->Title = "テキストファイル参照"; pBox->Filter = "テキストファイル(*.txt)|*.txt|"; } pBox->FileName = ""; pBox->DefaultExt = "txt"; pBox->InitialDir = bf; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ m_Dump.FlushLogFile(); OnWave(); if( !m_pEdit ){ m_pEdit = new TFileEdit(this); m_pEdit->SetEvent(Handle, WM_WAVE, 2); } if( m_pEdit ){ m_pEdit->Execute(AnsiString(pBox->FileName).c_str(), FALSE); //JA7UDE 0428 } } else { AttachFocus(); } delete pBox; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVSFTClick(TObject *Sender) { if( (Sender == KVSFR) && (!m_pRadio || !RADIO.PollType) ){ if( YesNoMB(sys.m_MsgEng ? "Radio command must be installed, do you open the setup window?":"リグコントロール(周波数取り込み)を設定する必要があります. 設定画面を開きますか?") == IDYES ){ KORClick(NULL); } // if( (!m_pRadio || !RADIO.PollType) ) return; if( !m_pRadio ) return; } m_ScaleAsRigFreq = (Sender == KVSFT) ? FALSE : TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KORClick(TObject *Sender) { DettachFocus(); TRADIOSetDlg *pBox = new TRADIOSetDlg(this); RADIO.change = pBox->Execute(); delete pBox; AttachFocus(); if( RADIO.change ) OpenRadio(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateSpeedList(int mode) { if( IsMFSK(mode) ){ SetComboBox(CBSpeed, "3.9063,7.8125,10.767,15.625,21.533,31.25,32.0,62.5"); } else if( ::IsRTTY(mode) ){ SetComboBox(CBSpeed, "45.45,75.0,110.0"); } else { SetComboBox(CBSpeed, m_ListBAUD.c_str()); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetMode(int mode) { if( m_RxSet[0].m_Mode != mode ){ if( (::IsMFSK(mode) != ::IsMFSK(m_RxSet[0].m_Mode)) || (::IsRTTY(mode) != ::IsRTTY(m_RxSet[0].m_Mode)) ){ UpdateSpeedList(mode); } m_RxSet[0].SetMode(mode); m_ModFSK.SetType(mode); #if DEBUG m_ModTest.SetType(mode); #endif m_fDisEvent++; CBMode->ItemIndex = mode; m_fDisEvent--; m_Dump.SetRTTY(IsRTTY()); UpdateLogMode(); UpdateUI(); switch(mode){ case MODE_GMSK: SetInfoMsg(sys.m_MsgEng ? "GMSK : For MBCS language":"GMSK : MBCS伝送実験用(HF)"); break; case MODE_FSK: SetInfoMsg(sys.m_MsgEng ? "FSK : For V/UHF":"FSK : V/UHF帯用モード"); break; case MODE_FSKW: SetInfoMsg(sys.m_MsgEng ? "FSK-W : For V/UHF and satellite":"FSK-W : V/UHF帯/衛星通信用モード"); break; case MODE_BPSK: SetInfoMsg(sys.m_MsgEng ? "BPSK : No compatible on MBCS":"BPSK : 従来方式と互換性なし(VariJAは使用注意)"); break; case MODE_N_BPSK: SetInfoMsg(sys.m_MsgEng ? "bpsk : Compatible with conventionally VARICODE":"bpsk : 従来方式と互換性あり"); break; case MODE_RTTY: SetInfoMsg("rtty(LSB) : BAUDOT"); break; case MODE_U_RTTY: SetInfoMsg("rtty(USB) : BAUDOT"); break; case MODE_mfsk_L: case MODE_mfsk_U: sprintf(m_TextBuff, "mfsk%d (%s)", int((250.0/m_RxSet[0].m_pDem->m_MFSK_TONES)+0.5), mode == MODE_mfsk_L ? "LSB":"USB"); SetInfoMsg(m_TextBuff); break; case MODE_qpsk_L: case MODE_qpsk_U: SetInfoMsg(sys.m_MsgEng ? "qpsk : Compatible with conventionally VARICODE":"qpsk : 従来方式と互換性あり"); break; } UpdateLogMode(); DoEvent(macOnMode); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CBModeChange(TObject *Sender) { if( m_fDisEvent ) return; SetMode(CBMode->ItemIndex); SetTXFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KECPClick(TObject *Sender) { AnsiString as; if( m_Edit[m_CurrentEdit].GetSelText(as) ){ Clipboard()->AsText = as; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KEXClick(TObject *Sender) { AnsiString as; if( m_Edit[m_CurrentEdit].GetSelText(as) ){ Clipboard()->AsText = as; m_Edit[m_CurrentEdit].DeleteSelText(); m_Edit[m_CurrentEdit].Paint(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxTXMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbLeft ){ if( m_fpText ) return; m_Edit[m_CurrentEdit].MoveCursor(X, Y, TRUE); m_Edit[m_CurrentEdit].OpenSelect(); m_MouseDown = TRUE; } else if( Button == mbRight ){ RECT rc; ::GetWindowRect(PCTX->Handle, &rc); rc.left += X; rc.top += Y+8; PupTX->Popup(rc.left, rc.top); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxTXMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( m_MouseDown ){ m_Edit[m_CurrentEdit].MoveCursor(X, Y, FALSE); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxTXMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { m_Edit[m_CurrentEdit].CloseSelect(); m_MouseDown = FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoSuspend(BOOL fMinimize) { if( !m_fSuspend ){ DeleteMacroTimer(); if( m_TX ) ToRX(); m_Wave.InClose(); m_Wave.OutAbort(); if( m_pCom ){ delete m_pCom; m_pCom = NULL; } if( m_pRadio ){ delete m_pRadio; m_pRadio = NULL; } if( m_fpText ) fflush(m_fpText); Log.Close(); UpdateLogPanel(); m_fSuspend = TRUE; m_fShowMsg = TRUE; } if( fMinimize && (WindowState != wsMinimized) ) Application->Minimize(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoResume(void) { if( m_fSuspend ){ if( OpenSound(FALSE) ){ OpenCom(); OpenRadio(); Log.Open(NULL, TRUE); UpdateLogPanel(); m_fSuspend = FALSE; if( WindowState == wsMinimized ) Application->Restore(); } else { Draw(FALSE); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KECallClick(TObject *Sender) { SetTXFocus(); TMenuItem *pItem = (TMenuItem *)Sender; StrCopy(m_TextBuff, AnsiString(pItem->Caption).c_str(), sizeof(m_TextBuff)-1); //JA7UDE 0428 LPSTR p = m_TextBuff; for( ; *p; p++ ){ if( *p == '\t' ){ *p = 0; break; } } DoMacro(m_TextBuff, NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetEditPage(int cno) { if( cno == m_CurrentEdit ) return; DettachFocus(); CDump *pEdit = &m_Edit[cno]; CDump *pOld = &m_Edit[m_CurrentEdit]; m_CurrentEdit = cno; if( !pEdit->IsCreate() ){ pEdit->Create(PCTX->Handle, PCTX, PBoxTX, PCTX->Font, SBarTX, 512); pEdit->SetCursorType(csCARET); } if( memcmp(pEdit->GetLogFontP(), pOld->GetLogFontP(), sizeof(LOGFONT)) || pEdit->GetWindowSize() != pOld->GetWindowSize() ){ pEdit->SetFont(PCTX->Font); pEdit->Resize(); } else { pEdit->SetScrollBar(); } pEdit->SetMBCS(&m_RxSet[0].m_MBCS); pEdit->m_fConvAlpha = m_fConvAlpha; PBoxTX->Invalidate(); AttachFocus(); PageStatus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KPG1Click(TObject *Sender) { int cno = 0; if( Sender == KPG2 ){ cno = 1; } else if( Sender == KPG3 ){ cno = 2; } else if( Sender == KPG4 ){ cno = 3; } SetEditPage(cno); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupPagePopup(TObject *Sender) { switch(m_CurrentEdit){ case 1: KPG2->Checked = TRUE; break; case 2: KPG3->Checked = TRUE; break; case 3: KPG4->Checked = TRUE; break; default: KPG1->Checked = TRUE; break; } OnMenuProc(PupPage->Items, "PopPAGE"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitCollect(CRxSet *pRxSet, int n) { if( pRxSet != &m_RxSet[0] ) return; if( n < 4 ) n = 4; if( n > 24 ) n = 24; m_WaveBitMax = n; InitCollect(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InitCollect(void) { double speed = m_RxSet[0].m_Speed; if( m_RxSet[0].IsMFSK() ) speed = m_RxSet[0].m_pDem->m_MFSK_SPEED; m_Collect1.Create(DEMSAMPFREQ*m_WaveBitMax/speed); m_Collect2.Create(DEMSAMPFREQ*m_WaveBitMax/speed); if( m_RxSet[0].IsActive() ){ int n = m_WaveBitMax; if( !(n & 1) ) n++; m_RxSet[0].m_pDem->m_Decode.m_cBWave = n; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBWaveMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button == mbRight ){ m_WaveType = m_WaveType ? 0 : 1; UpdateWaveCaption(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSASClick(TObject *Sender) { KSTXClick(NULL); DoMacro(sys.m_AS.c_str(), NULL); } //--------------------------------------------------------------------------- #if DEBUG void __fastcall TMainVARI::TestSignal(void) { DettachFocus(); TTestDlg *pBox = new TTestDlg(this); AnsiString fName = sys.m_testName.c_str(); int r = pBox->Execute(); delete pBox; if( r ){ double snr = sys.m_testSN-20.9; if( snr >= (20.9-3.0) ){ sys.m_testGain = (16384); sys.m_testNoiseGain = (16384) / pow(10, snr/20.0); } else { sys.m_testNoiseGain = 2369.5; sys.m_testGain = 2369.5 * pow(10, snr/20.0); } sys.m_testGain2 = sys.m_testGain * pow(10, sys.m_testDB2/20.0); m_TestHPF.Create(ffHPF, 700, SAMPFREQ+SAMPTXOFFSET, 3, 0, 0); m_QSB.Create(sys.m_testGain / pow(10, sys.m_testQSBDB/20.0), sys.m_testGain, sys.m_testQSBTime, sys.m_testPhase); double baud = m_RxSet[0].m_Speed - m_RxSet[0].m_Speed * sys.m_testClockErr * 1.0e-6; m_ModTest.SetSpeed(baud); if( sys.m_testCarrier1 ) m_ModTest.SetCarrierFreq(sys.m_testCarrier1); if( sys.m_testCarrier2 ) m_VCOTest.SetFreeFreq(sys.m_testCarrier2); if( sys.m_testCarrier1 ){ int fq = sys.m_testCarrier1; if( !sys.m_MFSK_Center ){ switch( m_RxSet[0].m_Mode ){ case MODE_mfsk_L: fq -= 125; break; case MODE_mfsk_U: fq += 125; break; } } int bw = (sys.m_test500 == 1) ? 250 : 135; int tap = (sys.m_test500 == 1) ? 96 : 128; m_BPF500.Create(tap, ffBPF, SAMPFREQ+SAMPTXOFFSET, fq-bw, fq+bw, 60.0, 1.0); } if( r == 2 ){ // 終了 if( m_fpTest ){ fclose(m_fpTest); m_fpTest = NULL; } if( sys.m_test ){ m_Wave.OutAbort(); OpenSound(FALSE); sys.m_test = FALSE; } } else { // 開始 if( m_fpTest && (fName != sys.m_testName) ){ fclose(m_fpTest); m_fpTest = NULL; m_ModTest.m_Encode.Reset(FALSE); } ::SetCurrentDirectory(sys.m_BgnDir); if( !m_fpTest ) m_fpTest = fopen(sys.m_testName.c_str(), "rb"); if( !sys.m_test ){ sys.m_test = TRUE; m_ModTest.m_Encode.Reset(FALSE); m_ModTest.Reset(); m_TestTimer = 5 * SAMPFREQ / m_BufferSize; if( m_TX ) ToRX(); m_Wave.InClose(); OpenSound(TRUE); for( int i = 0; i < m_Wave.m_OutFifoSize; i++ ){ DoDem(); m_Wave.OutWrite(m_wBuffer); } } } } AttachFocus(); } #endif //--------------------------------------------------------------------------- void __fastcall TMainVARI::OpenWheelTimer(CDump *pDump) { if( m_pDump != pDump ){ m_pDump = pDump; } if( !m_pWheelTimer ){ m_pWheelTimer = new TTimer(this); m_pWheelTimer->OnTimer = WheelTimer; m_pWheelTimer->Interval = 500; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CloseWheelTimer(CDump *pDump) { if( m_pDump == pDump ){ m_pDump = NULL; if( m_pWheelTimer ){ delete m_pWheelTimer; m_pWheelTimer = NULL; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnMouseWheel(TMessage &Message) { if( !sys.m_EnableMouseWheel ) return; if( m_Dump.OnMouseWheel(Message.WParam >> 16) ){ OpenWheelTimer(&m_Dump); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetATCSpeed(int f) { m_ATCSpeed = f; CRxSet *pRxSet = m_RxSet; for( int i = 0; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ) pRxSet->m_pDem->m_Decode.SetATCSpeed(f); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetATCLimit(int f) { m_ATCLimit = f; CRxSet *pRxSet = m_RxSet; for( int i = 0; i < RXMAX; i++, pRxSet++ ){ if( pRxSet->IsActive() ) pRxSet->m_pDem->m_Decode.SetATCLimit(f); } } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetSignalFreq(int fo, int fm, CRxSet *pRxSet) { return GetSignalFreq(fo, fm, pRxSet, 600); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetSignalFreq(int fo, int fm, CRxSet *pRxSet, int th) { if( pRxSet->IsMFSK() ){ return fo; } else if( pRxSet->Is170() ){ if( (pRxSet != &m_RxSet[0]) || pRxSet->m_fAFC ){ fm = pRxSet->m_pDem->m_RTTYShift + 30; } else { return fo; } } int xl = (fo - fm) * FFT_SIZE / m_FFTSampFreq; int xh = (fo + fm) * FFT_SIZE / m_FFTSampFreq; int x; if( xl < 0 ){ x = xl; xl = 0; xh -= x; } if( xl >= xh ) return fo; int d; int avg = 0; int max = 0; for(x = xl; x < xh; x++ ){ d = m_fftout[x]; avg += d; if( max < d ) max = d; } avg /= (xh - xl); int maxdb, avgdb; if( m_FFT.m_FFTGain ){ avgdb = SqrtToDB(avg); maxdb = SqrtToDB(max); } else { double k = 100.0 / m_fftSC; avgdb = avg * k; maxdb = max * k; } if( (maxdb - avgdb) >= th ){ max = (max + (avg * 2)) / 3; int fl = 0; int fh = 0; for(x = xl; x <= xh; x++ ){ if( m_fftout[x] >= max ){ if( !fl ) fl = x; fh = x; } } if( pRxSet->Is170() ){ xl = (pRxSet->m_pDem->m_RTTYShift - 20) * FFT_SIZE/m_FFTSampFreq; xh = (pRxSet->m_pDem->m_RTTYShift + 30) * FFT_SIZE/m_FFTSampFreq; } else { xl = 0; xh = (pRxSet->m_Speed + 10) * FFT_SIZE/m_FFTSampFreq; } max = ABS(fh-fl); if( ((max >= xl) && (max <= xh)) ){ x = (fl + fh) / 2; fo = x * m_FFTSampFreq / FFT_SIZE; } } return fo; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::LoadMacro(LPCSTR pName) { AnsiString as; GetFullPathName(as, pName); TMemIniFile *pIniFile = new TMemIniFile(as.c_str()); LoadMacro(pIniFile); delete pIniFile; CreateMacButton(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SaveMacro(LPCSTR pName) { AnsiString as; GetFullPathName(as, pName); TMemIniFile *pIniFile = new TMemIniFile(as.c_str()); SaveMacro(pIniFile); pIniFile->UpdateFile(); delete pIniFile; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::LoadMacro(TMemIniFile *pIniFile) { char bf[64]; AnsiString as, ws; MACBUTTON *pList = m_tMacButton; for( int i = 0; i < MACBUTTONALL; i++, pList++ ){ sprintf(bf, "MB%u", i+1); pList->Name = pIniFile->ReadString(bf, "Name", pList->Name); CrLf2Yen(as, pList->Text); ws = pIniFile->ReadString(bf, "Text", as); Yen2CrLf(pList->Text, ws); pList->Color = (TColor)pIniFile->ReadInteger(bf, "Color", pList->Color); pList->Style = pIniFile->ReadInteger(bf, "Style", pList->Style); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SaveMacro(TMemIniFile *pIniFile) { char bf[64]; AnsiString as; MACBUTTON *pList = m_tMacButton; for( int i = 0; i < MACBUTTONALL; i++, pList++ ){ sprintf(bf, "MB%u", i+1); pIniFile->WriteString(bf, "Name", pList->Name); CrLf2Yen(as, pList->Text); pIniFile->WriteString(bf, "Text", as); pIniFile->WriteInteger(bf, "Color", pList->Color); pIniFile->WriteInteger(bf, "Style", pList->Style); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFMSClick(TObject *Sender) { TSaveDialog *pBox = new TSaveDialog(this); pBox->Options << ofOverwritePrompt; pBox->Options << ofNoReadOnlyReturn; if( sys.m_MsgEng ){ pBox->Title = "Save Macros"; pBox->Filter = "Macro Files(*.mac)|*.mac|"; } else { pBox->Title = "マクロのセーブ"; pBox->Filter = "マクロファイル(*.mac)|*.mac|"; } pBox->FileName = "Macros"; pBox->DefaultExt = "mac"; pBox->InitialDir = sys.m_BgnDir; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ OnWave(); SaveMacro(AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 } delete pBox; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KFMLClick(TObject *Sender) { TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Load Macros"; pBox->Filter = "Macro Files(*.mac)|*.mac|"; } else { pBox->Title = "マクロのロード"; pBox->Filter = "マクロファイル(*.mac)|*.mac|"; } pBox->FileName = ""; pBox->DefaultExt = "mac"; pBox->InitialDir = sys.m_BgnDir; DettachFocus(); OnWave(); if( pBox->Execute() == TRUE ){ OnWave(); LoadMacro(AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 } delete pBox; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupRXWPopup(TObject *Sender) { int n = GetPopupIndex(PupRXW->PopupComponent); TScrollBar *pBar; CDump *pDump; if( n ){ pBar = m_RxSet[n].m_pView->SBar; pDump = &m_RxSet[n].m_pView->m_Dump; } else { pBar = SBarRX; pDump = &m_Dump; } BOOL f; KRWC->Enabled = (f=pDump->IsPrinted()); KRWE->Enabled = f; KRWT->Enabled = (f=pBar->Enabled); KRWB->Enabled = f; KRSC->Checked = sys.m_fShowCtrlCode; OnMenuProc(PupRXW->Items, "PopRXW"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRWCClick(TObject *Sender) { int n = GetPopupIndex(PupRXW->PopupComponent); if( n ){ m_RxSet[n].m_pView->m_Dump.Clear(); } else { m_Dump.Clear(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRWTClick(TObject *Sender) { int n = GetPopupIndex(PupRXW->PopupComponent); TScrollBar *pBar; if( n ){ pBar = m_RxSet[n].m_pView->SBar; } else { pBar = SBarRX; } if( pBar->Enabled ){ pBar->Position = (Sender == KRWT) ? 0 : pBar->Max; if( Sender == KRWB ) SetTXFocus(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRWEClick(TObject *Sender) { int n = GetPopupIndex(PupRXW->PopupComponent); CDump *pDump; if( n ){ pDump = &m_RxSet[n].m_pView->m_Dump; } else { pDump = &m_Dump; } AnsiString as; pDump->GetWindowText(as); if( !m_pEdit ){ m_pEdit = new TFileEdit(this); m_pEdit->SetEvent(Handle, WM_WAVE, 2); } m_pEdit->Execute(as, "Received text", "Received.txt"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupSpecPopup(TObject *Sender) { BOOL fs = m_fSubWindow && m_MouseSubChannel; BOOL f = fs || m_MouseNotch; KSAS->Visible = !f; KSTX->Visible = !f; KSRX->Visible = !f; KSN->Visible = !f; KSNR->Visible = !fs && m_MouseNotch && m_Notches.m_Count; KSNRA->Visible = !fs && m_Notches.m_Count; KSS->Visible = !f; N21->Visible = !f; N23->Visible = !f; KSW->Visible = fs; KSSR->Visible = fs; KSSM->Visible = fs; if( fs ){ sprintf(m_TextBuff, sys.m_MsgEng ? "CH.%d <=swap=> main channel":"CH.%d <=入れ替え=> メインチャンネル", m_MouseSubChannel); KSW->Caption = m_TextBuff; sprintf(m_TextBuff, sys.m_MsgEng ? "CH.%d Close window":"CH.%d ウインドウを閉じる", m_MouseSubChannel); KSSR->Caption = m_TextBuff; sprintf(m_TextBuff, sys.m_MsgEng ? "CH.%d Set mode":"CH.%d モードを設定", m_MouseSubChannel); KSSM->Caption = m_TextBuff; BOOL fNew = !KSSM->Count; TRxViewDlg *pView = m_RxSet[m_MouseSubChannel].m_pView; pView->PupModePopup(NULL); TMenuItem *pMenu = pView->PupMode->Items; int i; for( i = 0; i < pMenu->Count; i++ ){ TMenuItem *pm; if( fNew ){ pm = new TMenuItem(KSSM); } else { pm = KSSM->Items[i]; } pm->GroupIndex = pMenu->Items[i]->GroupIndex; pm->RadioItem = pMenu->Items[i]->RadioItem; pm->Caption = pMenu->Items[i]->Caption; pm->OnClick = pMenu->Items[i]->OnClick; pm->Visible = pMenu->Items[i]->Visible; pm->Checked = pMenu->Items[i]->Checked; if( fNew ) KSSM->Add(pm); } } for( int i = 1; i < RXMAX; i++ ){ TMenuItem *pm = KSS->Items[i-1]; pm->Checked = m_RxSet[i].IsActive(); } OnMenuProc(PupSpec->Items, "PopWATER"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSWClick(TObject *Sender) { ::PostMessage(Handle, WM_WAVE, waveSwapRxView, DWORD(m_RxSet[m_MouseSubChannel].m_pView)); } //--------------------------------------------------------------------------- int __fastcall TMainVARI::GetOverlayTop(void) { int y = 0; int i; CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++, pRxSet ){ if( pRxSet->IsActive() ){ if( pRxSet->m_pView->Top < 32 ){ int yy = pRxSet->m_pView->Top + pRxSet->m_pView->Height; if( y < yy ) y = yy; } } } return y; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetConvAlpha(BOOL f) { m_fConvAlpha = f; m_Edit[m_CurrentEdit].m_fConvAlpha = f; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVSDClick(TObject *Sender) { m_ScaleDetails = m_ScaleDetails ? FALSE : TRUE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KORSCClick(TObject *Sender) { m_fRttyWordOut = (Sender == KORSW); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSNClick(TObject *Sender) { m_Notches.Add(m_RightFreq); m_NotchFreq = m_RightFreq; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSTXClick(TObject *Sender) { if( m_TX || !SBNET->Down ){ SetTxFreq(m_RightFreq); } else if( SBNET->Down ){ SBNET->Down = FALSE; SetTxFreq(m_RightFreq); } UpdateUI(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSRXClick(TObject *Sender) { m_RxSet[0].m_pDem->m_Decode.Reset(); SetRxFreq(m_RightFreq); m_RxSet[0].m_AFCTimerMFSK = MFSKAFC_MAX; UpdateUI(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSNRClick(TObject *Sender) { if( m_MouseNotch ){ m_Notches.Delete(m_MouseNotch-1); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSNRAClick(TObject *Sender) { m_Notches.Delete(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSSRClick(TObject *Sender) { ShowSubChannel(m_MouseSubChannel, 0); } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::IsFreqErr(double d) { if( IsBPSK() ){ return fabs(d) > 0.30; // 0.15 X 2.0 } else { return fabs(d) > 0.20; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DrawPF(BOOL fPaint) { if( !m_PFTimer ){ TCanvas *pCanvas = m_pBitmapPF->Canvas; TRect rc; rc.Left = 0; rc.Top = 0; rc.Right = m_pfXW; rc.Bottom = m_pfYW; pCanvas->Brush->Color = clBlack; pCanvas->Pen->Color = clBlack; pCanvas->Pen->Style = psSolid; pCanvas->FillRect(rc); if( m_Wave.IsInOpen() || m_Wave.IsOutOpen() ){ rc.Top ++; rc.Bottom--; BOOL fTX = (m_TX == txINTERNAL); CRxSet *pRxSet = m_RxSet; CDEMFSK *pDem = pRxSet->m_pDem; double d = pDem->GetFreqErr(); if( IsBPSK() ){ if( m_AFCWidth && !fTX ){ double f = double(pRxSet->m_AFCFQ - UdRxCarrier->Position)/pRxSet->GetBandWidth(); if( fabs(f) >= 0.2 ) d = f; } d *= 2.0; } if( fTX ) d *= 0.05; if( d > 0.0 ){ rc.Left = m_pfXC + (d * m_pfXW); rc.Right = m_pfXC; } else { rc.Left = m_pfXC; rc.Right = m_pfXC + (d * m_pfXW); } if( SBAFC->Down || fTX ){ pCanvas->Brush->Color = TColor(RGB(144,144,144)); } else { pCanvas->Brush->Color = IsFreqErr(d) ? clRed : clYellow; } pCanvas->FillRect(rc); } pCanvas->Pen->Color = SBAFC->Down ? TColor(RGB(0,255,0)) : clWhite; pCanvas->MoveTo(m_pfXC, 0); pCanvas->LineTo(m_pfXC, m_pfYW); if( fPaint ) PBoxPFPaint(NULL); } else { m_PFTimer--; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PBoxPFPaint(TObject *Sender) { PBoxPF->Canvas->Draw(0, 0, m_pBitmapPF); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutYaesuVU(int hz) { if( !m_pRadio ) return; char bf[256]; int hz1 = hz / 10000000; hz = hz % 10000000; int hz2 = hz / 100000; hz = hz % 100000; int hz3 = hz / 1000; hz = hz % 1000; sprintf(bf, "\\$%02u%02u%02u%02u01", hz1, hz2, hz3, hz/10); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutYaesuHF(int hz) { if( !m_pRadio ) return; char bf[256]; int hz1 = hz / 10000000; hz = hz % 10000000; int hz2 = hz / 100000; hz = hz % 100000; int hz3 = hz / 1000; hz = hz % 1000; sprintf(bf, "\\$%02u%02u%02u%02u0A", hz/10, hz3, hz2, hz1); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutCIV(int hz) { if( !m_pRadio ) return; char bf[256]; int hz1 = hz / 100000000; hz = hz % 100000000; int hz2 = hz / 1000000; hz = hz % 1000000; int hz3 = hz / 10000; hz = hz % 10000; int hz4 = hz / 100; hz = hz % 100; sprintf(bf, "\\$FEFExxE005%02u%02u%02u%02u%02uFD", hz, hz4, hz3, hz2, hz1); WaitICOM(); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutCIV4(int hz) { if( !m_pRadio ) return; char bf[256]; if( hz >= 100000000 ){ // 100MHz and up int hz1 = hz / 100000000; hz = hz % 100000000; int hz2 = hz / 1000000; hz = hz % 1000000; int hz3 = hz / 10000; hz = hz % 10000; int hz4 = hz / 100; hz = hz % 100; sprintf(bf, "\\$FEFExxE005%02u%02u%02u%02u%02uFD", hz, hz4, hz3, hz2, hz1); } else { int hz1 = hz / 1000000; hz = hz % 1000000; int hz2 = hz / 10000; hz = hz % 10000; int hz3 = hz / 100; hz = hz % 100; sprintf(bf, "\\$FEFExxE005%02u%02u%02u%02uFD", hz, hz3, hz2, hz1); } WaitICOM(); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutKENWOOD(int hz) { if( !m_pRadio ) return; char bf[256]; sprintf(bf, "FA0%010lu;", hz); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutJST245(int hz) { if( !m_pRadio ) return; char bf[256]; sprintf(bf, "H1\\rF%08luA\\rH0\\rI1\\r", hz); m_pRadio->SendCommand(bf); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutModeYaesuHF(LPCSTR pMode) { if( !m_pRadio ) return; const BYTE _td[]={ 0x00, 0x01, 0x02, 0x04, 0x06, 0x08, 0x0a, }; int n = FindStringTable(g_tRadioMode, pMode, AN(_td)); if( n >= 0 ){ char bf[256]; sprintf(bf, "\\$000000%02X0C", _td[n]); m_pRadio->SendCommand(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutModeYaesuVU(LPCSTR pMode) { if( !m_pRadio ) return; const BYTE _td[]={ 0x00, 0x01, 0x82, 0x04, 0x08, }; int n = FindStringTable(g_tRadioMode, pMode, AN(_td)); if( n >= 0 ){ char bf[256]; sprintf(bf, "\\$%02X00000007", _td[n]); m_pRadio->SendCommand(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutModeCIV(LPCSTR pMode) { if( !m_pRadio ) return; const BYTE _td[]={ 0x00, 0x01, 0x03, 0x02, 0x05, 0x04, }; int n = FindStringTable(g_tRadioMode, pMode, AN(_td)); if( n >= 0 ){ char bf[256]; sprintf(bf, "\\$FEFExxE006%02XFD", _td[n]); WaitICOM(); m_pRadio->SendCommand(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutModeKENWOOD(LPCSTR pMode) { if( !m_pRadio ) return; const BYTE _td[]={ 1, 2, 3, 5, 4, 6, }; int n = FindStringTable(g_tRadioMode, pMode, AN(_td)); if( n >= 0 ){ char bf[256]; sprintf(bf, "MD%d;", int(_td[n])); m_pRadio->SendCommand(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OutModeJST245(LPCSTR pMode) { if( !m_pRadio ) return; const BYTE _td[]={ 3, 2, 1, 4, 5, 0, }; int n = FindStringTable(g_tRadioMode, pMode, AN(_td)); if( n >= 0 ){ char bf[256]; sprintf(bf, "H1\rD%d\rH0\rI1\r", int(_td[n])); m_pRadio->SendCommand(bf); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::WaitICOM(void) { if( m_pRadio && m_pRadioTimer ){ m_pRadio->WaitICOM(m_pRadioTimer->Interval); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVMXClick(TObject *Sender) { if( KVMX->Checked ){ DeleteMacExButton(); } else { CreateMacExButton(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DeleteMacExButton(void) { KVMX->Checked = FALSE; if( PBoxFFT->Align != alClient ){ PBoxFFT->Align = alClient; m_fftYW = PBoxFFT->Height; m_pBitmapFFT->Canvas->Brush->Color = m_tWaterColset[0].c; m_pBitmapFFT->Height = m_fftYW; } MACBUTTON *pList = &m_tMacButton[MACBUTTONMAX]; for( int i = 0; i < MACEXBUTTONMAX; i++, pList++ ){ TSpeedButton *pButton = pList->pButton; if( pButton ){ PFFT->RemoveControl(pList->pButton); delete pList->pButton; pList->pButton = NULL; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CreateMacExButton(void) { KVMX->Checked = TRUE; MACBUTTON *pList = &m_tMacButton[MACBUTTONMAX]; if( PBoxFFT->Align == alClient ){ PBoxFFT->Align = alTop; PBoxFFT->Height = PFFT->Height - 24; m_fftYW = PBoxFFT->Height; m_pBitmapFFT->Height = m_fftYW; } int x = PBoxFFT->Left; int max = (PBoxFFT->Width / 60); if( max > MACEXBUTTONMAX ) max = MACEXBUTTONMAX; int xw = PBoxFFT->Width / max; int xx = PBoxFFT->Width % max; int y = PBoxFFT->Top + PBoxFFT->Height+2; int yw = 16; int i; for( i = 0; i < max; i++, pList++ ){ TSpeedButton *pButton = pList->pButton; if( !pButton ){ pButton = new TSpeedButton(PFFT); PFFT->InsertControl(pButton); pButton->Parent = PFFT; pButton->OnClick = OnMacButtonClick; pButton->OnMouseDown = OnMacButtonDown; pButton->GroupIndex = 1; pButton->AllowAllUp = TRUE; char bf[16]; sprintf(bf, "%%M%u", i+MACBUTTONMAX); pButton->Hint = bf; pButton->Down = (i == m_CurrentMacro) && (m_ReqMacroTimer || m_pMacroTimer); pList->pButton = pButton; } else { pButton->Font->Name = sys.m_FontName; pButton->Font->Charset = sys.m_FontCharset; } pButton->Caption = ConvAndChar(m_TextBuff, pList->Name.c_str()); int xxw = xw; if( xx ){ xxw++; xx--; } pButton->SetBounds(x, y, xxw, yw); pButton->Font->Height = -(yw-4); pButton->Font->Color = pList->Text.IsEmpty() ? clGrayText : pList->Color; TFontStyles fs = Code2FontStyle(pList->Style); pButton->Font->Style = fs; x += xxw; } for( ; i < MACEXBUTTONMAX; i++, pList++ ){ TSpeedButton *pButton = pList->pButton; if( pButton ){ PFFT->RemoveControl(pList->pButton); delete pList->pButton; pList->pButton = NULL; } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoMacroMenu(LPCSTR pVal, TSpeedButton *pButton, BOOL fRadio) { DettachFocus(); AnsiString as; LPSTR pBF = new char[8192]; StrCopy(pBF, GetMacroStr(as, pVal), 8191); LPSTR t, p; p = pBF; if( m_pMacroPopup ){ delete m_pMacroPopup; } m_pMacroPopup = new TPopupMenu(this); int nInit = -1; if( fRadio ){ p = StrDlm(t, SkipSpace(p)); nInit = GetMacroInt(t); } strcpy(p, GetMacroStr(as, p)); int n = 0; BYTE gIndex = 1; while(*p){ p = StrDlm(t, SkipSpace(p)); if( *t ){ TMenuItem *pMenu = new TMenuItem(m_pMacroPopup); pVal = GetMacroStr(as, t); pMenu->Caption = pVal; if( strcmp(pVal, "-") ){ pMenu->OnClick = OnMacroMenuClick; if( fRadio ){ n++; pMenu->GroupIndex = gIndex; pMenu->RadioItem = TRUE; pMenu->Checked = (n == nInit); } } else { gIndex++; if( fRadio ){ p = StrDlm(t, SkipSpace(p)); nInit = GetMacroInt(t); n = 0; } } m_pMacroPopup->Items->Add(pMenu); } } delete pBF; BOOL fButton = pButton && pButton->Down; if( fButton ) pButton->Down = FALSE; RECT rc; HWND hWnd; if( fButton ){ hWnd = GetMacButtonNo(pButton) >= MACBUTTONMAX ? PFFT->Handle : PCMac->Handle; } else { hWnd = PCTX->Handle; } ::GetWindowRect(hWnd, &rc); int X, Y; if( fButton ){ rc.left += pButton->Left + pButton->Width/2; rc.top += pButton->Top + pButton->Height/2; } else { m_Edit[m_CurrentEdit].GetCursorPos(X, Y); rc.left += X; rc.top += Y+8; } m_MacroInput = ""; m_MacroMenuNo = 0; m_pMacroPopup->Popup(rc.left, rc.top); Application->ProcessMessages(); delete m_pMacroPopup; m_pMacroPopup = NULL; AttachFocus(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SBP60Click(TObject *Sender) { TSpeedButton *pButton = (TSpeedButton *)Sender; int s = m_PlayBackTime[0]; if( Sender == SBP30 ){ s = m_PlayBackTime[1]; } else if( Sender == SBP15 ){ s = m_PlayBackTime[2]; } DoPlayBack(pButton->Down ? s : 0); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdatePlayBack(void) { SBP15->Caption = m_PlayBackTime[2]; SBP30->Caption = m_PlayBackTime[1]; SBP60->Caption = m_PlayBackTime[0]; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoPlayBack(int s) { if( !m_PlayBack.IsActive() || !SBP60->Enabled ) return; if( s ){ if( !m_PlayBack.StartPlaying(s) ){ StopPlayBack(); } else { DrawWater(FALSE, TRUE); if( s <= m_PlayBackTime[2] ){ SBP15->Down = TRUE; if( m_PlayBackTime[2] != s ) SBP15->Caption = s; } else if( s <= m_PlayBackTime[1] ){ SBP30->Down = TRUE; if( m_PlayBackTime[1] != s ) SBP30->Caption = s; } else { SBP60->Down = TRUE; if( m_PlayBackTime[0] != s ) SBP60->Caption = s; } } } else { m_PlayBack.StopPlaying(); UpdatePlayBack(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::StopPlayBack(void) { if( m_PlayBack.IsActive() ){ m_PlayBack.StopPlaying(); SBP60->Down = FALSE; SBP30->Down = FALSE; SBP15->Down = FALSE; UpdatePlayBack(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateShowCtrl(void) { int i; CRxSet *pRxSet = &m_RxSet[1]; for( i = 1; i < RXMAX; i++ ){ if( pRxSet->m_pView ){ pRxSet->m_pView->m_Dump.ShowCtrl(sys.m_fShowCtrlCode); } } m_Dump.ShowCtrl(sys.m_fShowCtrlCode); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRSCClick(TObject *Sender) { sys.m_fShowCtrlCode = !sys.m_fShowCtrlCode; UpdateShowCtrl(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupSQPopup(TObject *Sender) { int n = GetPopupIndex(PupSQ->PopupComponent); n = m_RxSet[n].m_SQLevel; switch(n){ case 100: KS1->Checked = TRUE; break; case 200: KS2->Checked = TRUE; break; case 300: KS3->Checked = TRUE; break; case 400: KS4->Checked = TRUE; break; default: if( n < 50 ){ KS0->Checked = TRUE; } else { KS0->Checked = FALSE; KS1->Checked = FALSE; KS2->Checked = FALSE; KS3->Checked = FALSE; KS4->Checked = FALSE; } break; } OnMenuProc(PupSQ->Items, "PopSQ"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KS0Click(TObject *Sender) { int sq = 0; if( Sender == KS1 ){ sq = 100; } else if( Sender == KS2 ){ sq = 200; } else if( Sender == KS3 ){ sq = 300; } else if( Sender == KS4 ){ sq = 400; } int n = GetPopupIndex(PupSQ->PopupComponent); m_RxSet[n].m_SQLevel = sq; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KHJClick(TObject *Sender) { AnsiString as = ((TMenuItem *)Sender)->Hint; m_WebRef.ShowHTML(as.c_str()); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoEvent(int n) { if( !sys.m_MacEvent[n].IsEmpty() ) DoMacro(sys.m_MacEvent[n].c_str(), NULL); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::MacroOnTimer(TObject *Sender) { AnsiString as = sys.m_MacEvent[macOnTimer].c_str(); if( !sys.m_MacroError ){ DoMacro(as.c_str(), NULL); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateMacroOnTimer(void) { if( sys.m_MacEvent[macOnTimer].IsEmpty() ){ if( m_pMacroOnTimer ){ delete m_pMacroOnTimer; m_pMacroOnTimer = NULL; } } else { if( !m_pMacroOnTimer ){ m_pMacroOnTimer = new TTimer(this); m_pMacroOnTimer->Interval = sys.m_OnTimerInterval; m_pMacroOnTimer->OnTimer = MacroOnTimer; m_pMacroOnTimer->Enabled = TRUE; } } sys.m_MacroError = FALSE; } //--------------------------------------------------------------------------- // システムシャットダウン void __fastcall TMainVARI::ShutDown(void) { DoSuspend(FALSE); WriteRegister(); HANDLE hToken; TOKEN_PRIVILEGES tkp; int WinNT = FALSE; // アクセストークンをオープン if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){ WinNT = TRUE; // 特権名のLUIDを取得する LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; /* one privilege to set */ tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // アクセストークンの特権を得る AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); } ::ExitWindowsEx(sys.m_WinNT ? EWX_POWEROFF : EWX_SHUTDOWN, 0); Close(); if( WinNT == TRUE ){ // アクセストークンの特権を放棄する tkp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::UpdateModGain(void) { m_ModGainR = m_ModGain; if( m_ModGainR < 1024 ) m_ModGainR = 1024; if( m_ModGainR > 31774 ) m_ModGainR = 31774; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoBench(LPSTR t, int type) { CWaitCursor w; if( m_CPUBENCHType != type ){ m_CPUBENCHType = type; m_CPUBENCH.Create(32); } LARGE_INTEGER ltFreq, ltOld; if( ::QueryPerformanceFrequency(<Freq) && ::QueryPerformanceCounter(<Old) ){ int i; double d; if( type ){ CDECM2 dec; CVCO vco; vco.SetSampleFreq(SAMPFREQ); vco.SetFreeFreq(1000.0); dec.SetSampleFreq(m_fDec, SAMPFREQ); for( i = 0; i < 65536; i++ ){ dec.Do(vco.Do()); } } else { for( i = 0; i < 23400; i++ ){ d = double(rand() % int(2 * PI * 1000)) / 1000.0; sin(d*d); } } LARGE_INTEGER ltNow; ::QueryPerformanceCounter(<Now); d = double(ltNow.QuadPart - ltOld.QuadPart)/double(ltFreq.QuadPart); d = m_CPUBENCH.Do(d); sprintf(t, "%.1lf", d * 1.0e6); } } //--------------------------------------------------------------------------- // インデックスからメニューを得る TMenuItem* __fastcall TMainVARI::GetMenuItem(TMenuItem *pMainMenu, LPCSTR pTitle) { int index; if( IsNumbAll(pTitle) && ((index = GetMacroInt(pTitle)) <= pMainMenu->Count) && (index >= 1) ){ int n = 1; TMenuItem *pMenu; for( int i = 0; i < pMainMenu->Count; i++ ){ pMenu = pMainMenu->Items[i]; if( pMenu->Visible && (pMenu->Caption != '-') ){ if( n == index ) return pMenu; n++; } } } return NULL; } //--------------------------------------------------------------------------- TMenuItem* __fastcall TMainVARI::FindMenu(TMenuItem *pMainMenu, LPCSTR pTitle) { AnsiString as; int i; BOOL fAcc = (*pTitle == '&') && (strlen(pTitle)==2); TMenuItem *pMenu; if( (pMenu = GetMenuItem(pMainMenu, pTitle)) != NULL ){ return pMenu; } else { for( i = pMainMenu->Count - 1; i >= 0; i-- ){ pMenu = pMainMenu->Items[i]; as = pMenu->Caption; if( !strcmp(as.c_str(), pTitle) ){ return pMenu; } else if( fAcc ){ for( LPCSTR p = as.c_str(); *p; p++ ){ if( *p == '&' ){ if( *(p+1) == '&' ){ p++; } else if( !strncmpi(p, pTitle, 2) ){ return pMenu; } } } } } } return NULL; } //--------------------------------------------------------------------------- TMenuItem* __fastcall TMainVARI::GetMainMenu(LPCSTR pTitle, BOOL fNew) { TMenuItem *pMenu = GetSubMenu(pTitle); if( pMenu ) return pMenu; TMenuItem *pMainMenu = MainMenu->Items; pMenu = FindMenu(pMainMenu, pTitle); if( !pMenu ){ if( fNew ){ pMenu = new TMenuItem(pMainMenu); pMenu->Caption = pTitle; pMenu->OnClick = OnXmClick; pMainMenu->Insert(pMainMenu->IndexOf(KH), pMenu); } else { pMenu = NULL; } } return pMenu; } //--------------------------------------------------------------------------- TMenuItem* __fastcall TMainVARI::GetSubMenu(LPCSTR pTitle) { if( !strcmp(pTitle, "PopWATER") ){ return PupSpec->Items; } else if( !strcmp(pTitle, "PopPAGE") ){ return PupPage->Items; } else if( !strcmp(pTitle, "PopRX") ){ return PupRX->Items; } else if( !strcmp(pTitle, "PopRXW") ){ return PupRXW->Items; } else if( !strcmp(pTitle, "PopSQ") ){ return PupSQ->Items; } else if( !strcmp(pTitle, "PopTX") ){ return PupTX->Items; } else if( !strcmp(pTitle, "PopCHARSET") ){ return PupCharset->Items; } else if( !strcmp(pTitle, "PopCALLS") ){ return PupCalls->Items; } return NULL; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnXmClick(TObject *Sender) { if( !m_MacroVal.IsHandleProc() ) return; TMenuItem *pMenu = (TMenuItem *)Sender; AnsiString as = pMenu->Caption; OnMenuProc(pMenu, as.c_str()); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::AddExtensionMenu(LPCSTR pTitle, LPCSTR pCaption, LPCSTR pHint) { TMenuItem *pMainMenu = GetMainMenu(pTitle, TRUE); if( !*pCaption ) return; AnsiString as; TMenuItem *pMenu = NULL; if( strcmp(pCaption, "-") ){ if( !*pHint ) return; pMenu = FindMenu(pMainMenu, pCaption); } else if( pMainMenu->Count ){ as = pMainMenu->Items[pMainMenu->Count - 1]->Caption; if( !strcmp(as.c_str(), "-") ) return; } BOOL fAdd = FALSE; if( !pMenu ){ pMenu = new TMenuItem(pMainMenu); pMenu->Caption = pCaption; fAdd = TRUE; } else if( pMenu->Count ){ if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; as = pMenu->Caption; InfoMB("[%s] is not overrode...", as.c_str()); } return; } pMenu->Hint = pHint; pMenu->OnClick = OnXClick; if( fAdd ){ pMainMenu->Add(pMenu); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::InsExtensionMenu(LPCSTR pTitle, LPCSTR pPos, LPCSTR pCaption, LPCSTR pHint) { TMenuItem *pMainMenu = GetMainMenu(pTitle, TRUE); TMenuItem *pPosMenu = FindMenu(pMainMenu, pPos); if( !pPosMenu ) return; BOOL fIns = FALSE; TMenuItem *pMenu = NULL; if( strcmp(pCaption, "-") ){ pMenu = FindMenu(pMainMenu, pCaption); } if( !pMenu ){ pMenu = new TMenuItem(pMainMenu); pMenu->Caption = pCaption; fIns = TRUE; } else if( pMenu->Count ){ if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; AnsiString as = pMenu->Caption; InfoMB("[%s] is not overrode...", as.c_str()); } return; } pMenu->Hint = pHint; pMenu->OnClick = OnXClick; if( fIns ){ pMainMenu->Insert(pMainMenu->IndexOf(pPosMenu), pMenu); } } //--------------------------------------------------------------------------- static void __fastcall DeleteShortCut(TMenuItem *pMain, TShortCut sKey) { for( int i = 0; i < pMain->Count; i++ ){ TMenuItem *pMenu = pMain->Items[i]; if( pMenu->ShortCut == sKey ){ pMenu->ShortCut = 0; } if( pMenu->Count ){ DeleteShortCut(pMenu, sKey); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ShortCutExtensionMenu(TMenuItem *pMenu, LPCSTR pKey) { if( pMenu ){ AnsiString as; GetMacroStr(as, pKey); TShortCut sKey = 0; if( strcmpi(as.c_str(), "NONE") ){ sKey = TextToShortCut(as); } if( sKey ){ DeleteShortCut(MainMenu->Items, sKey); DeleteShortCut(PupTX->Items, sKey); } pMenu->ShortCut = sKey; } } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::IsXMenu(TMenuItem *pItem) { if( !pItem ) return FALSE; TMenuItem *pMainMenu = MainMenu->Items; for( int i = 0; i < pMainMenu->Count; i++ ){ if( pMainMenu->Items[i]->IndexOf(pItem) >= 0 ) return TRUE; } return FALSE; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::OnXClick(TObject *Sender) { TMenuItem *pMenu = (TMenuItem *)Sender; AnsiString ps = pMenu->Hint.c_str(); LPSTR tt, pp; pp = StrDlm(tt, ps.c_str()); if( !OnMenuProc(pMenu, tt, pp, TRUE) ){ if( MainMenu->Items->IndexOf(pMenu) < 0 ){ if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; InfoMB("Procedure [%s] is not found...", tt); } } } } //--------------------------------------------------------------------------- BOOL __fastcall TMainVARI::OnMenuProc(TMenuItem *pMenu, LPCSTR pProc, LPCSTR pPara, BOOL fStop) { int r = m_MacroVal.FindName(pProc, _VAL_PROC); if( r >= 0 ){ if( fStop ){ sys.m_MacroError = FALSE; DeleteMacroTimer(); m_pCurrentMacroMenu = pMenu; m_CurrentMacro = -1; } m_MacroInput = pMenu->Caption; AnsiString as; ConvDummy(as, m_MacroVal.GetString(r), m_MacroVal.GetPara(r), pPara); DoMacro(as.c_str(), NULL); return TRUE; } else { return FALSE; } } //--------------------------------------------------------------------------- // メニューの更新ハンドラ void __fastcall TMainVARI::OnMenuProc(TMenuItem *pMenu, LPCSTR pCaption) { if( !m_MacroVal.IsHandleProc() ) return; m_ParentMenu = pMenu; char bf[256]; sprintf(bf, "On$%sClick", pCaption); OnMenuProc(pMenu, bf, "", FALSE); m_ParentMenu = NULL; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::DoParentClick(TMenuItem *pMenu) { TMenuItem *pMainMenu = pMenu->Parent; if( pMainMenu ){ DoParentClick(pMainMenu); if( (pMainMenu != m_ParentMenu) && pMainMenu->OnClick ) pMainMenu->Click(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KHClick(TObject *Sender) { OnMenuProc(KH, "&Help"); } //--------------------------------------------------------------------------- TMenuItem* __fastcall TMainVARI::GetMenuArg(AnsiString &arg, LPCSTR pVal, BOOL fArg) { BOOL f = !fArg; AnsiString as; LPSTR pBF = StrDupe(GetMacroStr(as, pVal)); LPSTR tt, p; p = StrDlm(tt, pBF); TMenuItem *pMenu = FindMenu(MainMenu->Items, GetMacroStr(as, tt)); while( *p && pMenu ){ p = StrDlm(tt, SkipSpace(p)); tt = SkipSpace(tt); if( *p || (!fArg) ){ if( *tt ){ pMenu = FindMenu(pMenu, GetMacroStr(as, tt)); } } else { arg = tt; f = TRUE; } } delete pBF; return f ? pMenu : NULL; } //--------------------------------------------------------------------------- TSpeedButton* __fastcall TMainVARI::FindButton(TComponent *pMainControl, LPCSTR pCaption, TSpeedButton *pButton, BOOL fErrMsg) { const LPCSTR _bt[]={"BPF1","BPF2","BPF3","BPF4"}; int i = FindStringTable(_bt, pCaption, AN(_bt)); if( i >= 0 ){ TSpeedButton *_tt[]={SBBPFW, SBBPFM, SBBPFN, SBBPFS}; return _tt[i]; } TComponent *pComponent; TControl *pControl; for( i = 0; i < pMainControl->ComponentCount; i++ ){ pComponent = pMainControl->Components[i]; pControl = (TControl *)pComponent; if( pControl && (pButton != pControl) ){ if( pControl->ClassNameIs("TSpeedButton") ){ TSpeedButton *pButton = (TSpeedButton *)pControl; AnsiString as = pButton->Caption; if( !strcmp(as.c_str(), pCaption) ){ return pButton; } } else if( pControl->ComponentCount ){ pControl = FindButton(pControl, pCaption, pButton, FALSE); if( pControl ) return (TSpeedButton *)pControl; } } } if( fErrMsg ){ if( !sys.m_MacroError ){ sys.m_MacroError = TRUE; InfoMB("Button [%s] is not found...", pCaption); } } return NULL; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::ClickButton(TSpeedButton *pButton) { if( !pButton ) return; if( pButton->Visible && pButton->Enabled ){ pButton->Down = !pButton->Down; pButton->Click(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::SetRTTYFFT(int f) { m_RxSet[0].m_RTTYFFT = f; m_RxSet[0].m_pDem->m_fRTTYFFT = f; #if 0 int i; for( i = 1; i < RXMAX; i++ ){ if( m_RxSet[i].m_pDem ){ m_RxSet[i].m_pDem->m_fRTTYFFT = f; } } #endif } //--------------------------------------------------------------------------- void __fastcall TMainVARI::CreateSubMenu(void) { char bf[256]; TMenuItem *pm; for( int i = 1; i < RXMAX; i++ ){ sprintf(bf, sys.m_MsgEng ? "CH &%d" : "チャンネル &%d", i); if( (i - 1) >= KVS->Count ){ pm = new TMenuItem(this); KVS->Add(pm); } pm = KVS->Items[i-1]; pm->OnClick = KVSClick; pm->Caption = bf; pm->Checked = m_RxSet[i].IsActive(); if( (i - 1) >= KSS->Count ){ pm = new TMenuItem(this); KSS->Add(pm); } pm = KSS->Items[i-1]; pm->OnClick = KSSClick; pm->Caption = bf; pm->Checked = m_RxSet[i].IsActive(); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KVSClick(TObject *Sender) { int RN = KVS->IndexOf((TMenuItem *)Sender); if( RN >= 0 ){ RN++; ShowSubChannel(RN, 2); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KSSClick(TObject *Sender) { int RN = KSS->IndexOf((TMenuItem *)Sender); if( RN >= 0 ){ RN++; ShowSubChannel(RN, 1); CRxSet *pRxSet = &m_RxSet[RN]; double fq = GetSignalFreq(m_RightFreq, SBFFT3K->Down ? 50 : 32, pRxSet); pRxSet->m_pDem->m_Decode.Reset(); pRxSet->SetCarrierFreq(fq); } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::AdjustRadioMenu(void) { int max = KR->IndexOf(NR); TMenuItem *pm; int i; for( i = 0; i < m_nRadioMenu; i++ ){ if( i >= max ){ TMenuItem *pm = new TMenuItem(this); KR->Insert(i, pm); max++; } pm = KR->Items[i]; if( pm->Caption != m_RadioMenu[i].strTTL ){ pm->Caption = m_RadioMenu[i].strTTL; } pm->OnClick = KRadioCmdClick; pm->Enabled = m_pRadio != NULL; } int N = i; for( ; i < max; i++ ){ KR->Delete(N); } max = KRM->IndexOf(NRE); for( i = 0; i < m_nRadioMenu; i++ ){ if( i >= max ){ TMenuItem *pm = new TMenuItem (this); KRM->Insert(i, pm); max++; } pm = KRM->Items[i]; if( pm->Caption != m_RadioMenu[i].strTTL ){ pm->Caption = m_RadioMenu[i].strTTL; } pm->OnClick = KRadioEditClick; } N = i; for( ; i < max; i++ ){ KRM->Delete(N); } BOOL f = m_nRadioMenu != 0; NR->Visible = f; NRE->Visible = f; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRadioCmdClick(TObject *Sender) { if( !m_pRadio ) return; int n = KR->IndexOf((TMenuItem *)Sender); if( (n >= 0) && (n < RADIOMENUMAX) ){ LPCSTR p = m_RadioMenu[n].strCMD.c_str(); if( CheckEXT(p, "RCM") && IsFile(p) ){ LoadRadioDef(p); } else { m_pRadio->SendCommand(p); } } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRadioEditClick(TObject *Sender) { int n = KRM->IndexOf((TMenuItem *)Sender); if( (n >= 0) && (n < RADIOMENUMAX) ){ AnsiString strTTL = m_RadioMenu[n].strTTL; AnsiString strCMD = m_RadioMenu[n].strCMD; TRMenuDialog *pBox = new TRMenuDialog(this); int r = pBox->Execute(strTTL, strCMD); BOOL fNull = strTTL.IsEmpty() && strCMD.IsEmpty(); if( (r == IDOK) && !fNull ){ if( !strCMD.IsEmpty() ){ if( strTTL.IsEmpty() ){ char bf[64]; sprintf(bf, "Radio command #d", n + 1); strTTL = bf; } m_RadioMenu[n].strTTL = strTTL; m_RadioMenu[n].strCMD = strCMD; AdjustRadioMenu(); } } else if( (r == 1024) || fNull ){ for( int i = n; i < (m_nRadioMenu - 1); i++ ){ m_RadioMenu[i].strTTL = m_RadioMenu[i+1].strTTL; m_RadioMenu[i].strCMD = m_RadioMenu[i+1].strCMD; } m_nRadioMenu--; AdjustRadioMenu(); } else if( r == 1025 ){ if( m_nRadioMenu < RADIOMENUMAX ){ for( int i = m_nRadioMenu; i > n; i-- ){ m_RadioMenu[i].strTTL = m_RadioMenu[i-1].strTTL; m_RadioMenu[i].strCMD = m_RadioMenu[i-1].strCMD; } m_RadioMenu[n].strTTL = strTTL; m_RadioMenu[n].strCMD = strCMD; m_nRadioMenu++; AdjustRadioMenu(); } } delete pBox; } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRClick(TObject *Sender) { AdjustRadioMenu(); KRADD->Enabled = m_nRadioMenu < RADIOMENUMAX; OnMenuProc(KR, "Radio&Command"); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRADDClick(TObject *Sender) { if( m_nRadioMenu >= RADIOMENUMAX ) return; AnsiString strTTL, strCMD; TRMenuDialog *pBox = new TRMenuDialog(this); if( pBox->Execute(strTTL, strCMD, TRUE) ){ if( !strCMD.IsEmpty() ){ if( strTTL.IsEmpty() ){ char bf[64]; sprintf(bf, "Radio command #d", m_nRadioMenu + 1); strTTL = bf; } m_RadioMenu[m_nRadioMenu].strTTL = strTTL; m_RadioMenu[m_nRadioMenu].strCMD = strCMD; m_nRadioMenu++; AdjustRadioMenu(); } } delete pBox; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::LoadRadioDef(LPCSTR pName) { try { CWaitCursor w; TMemIniFile *pIniFile = new TMemIniFile(pName); RADIO.CmdInit = pIniFile->ReadString("RADIO", "CmdInit", RADIO.CmdInit); RADIO.CmdRx = pIniFile->ReadString("RADIO", "CmdRx", RADIO.CmdRx); RADIO.CmdTx = pIniFile->ReadString("RADIO", "CmdTx", RADIO.CmdTx); char bf[32]; sprintf( bf, "%02X", RADIO.Cmdxx); AnsiString as = pIniFile->ReadString("RADIO", "Cmdxx", bf); int d; sscanf(as.c_str(), "%X", &d); RADIO.Cmdxx = d; RADIO.PollType = pIniFile->ReadInteger("RADIO", "PollType", 0); RADIO.PollInterval = pIniFile->ReadInteger("RADIO", "PollInterval", 0); delete pIniFile; OpenRadio(); } catch(...){ } } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KRLClick(TObject *Sender) { TOpenDialog *pBox = new TOpenDialog(this); pBox->Options >> ofCreatePrompt; pBox->Options << ofFileMustExist; if( sys.m_MsgEng ){ pBox->Title = "Open command file"; pBox->Filter = "Command files(*.rcm)|*.rcm|"; } else { pBox->Title = "コマンド定義ファイルを開く"; pBox->Filter = "コマンド定義ファイル(*.rcm)|*.rcm|"; } pBox->FileName = ""; pBox->DefaultExt = "rcm"; pBox->InitialDir = sys.m_BgnDir; if( pBox->Execute() == TRUE ){ LoadRadioDef(AnsiString(pBox->FileName).c_str()); //JA7UDE 0428 } delete pBox; } //--------------------------------------------------------------------------- void __fastcall TMainVARI::KROClick(TObject *Sender) { TRADIOSetDlg *pBox = new TRADIOSetDlg(this); if( (sys.m_PTTCOM != "NONE") && !strcmp(sys.m_PTTCOM.c_str(), RADIO.StrPort) ){ strcpy(RADIO.StrPort, "NONE"); RADIO.change = 1; } if( pBox->Execute() == TRUE ){ if( (sys.m_PTTCOM != "NONE") && !strcmp(sys.m_PTTCOM.c_str(), RADIO.StrPort) ){ sys.m_PTTCOM = "NONE"; COMM.change = 1; } } delete pBox; if( COMM.change ) OpenCom(); if( RADIO.change ) OpenRadio(); } //--------------------------------------------------------------------------- void __fastcall TMainVARI::PupCallsPopup(TObject *Sender) { OnMenuProc(PupCalls->Items, "PopPAGE"); } //---------------------------------------------------------------------------