form_Rtc32k.cpp
上传用户:gelin96
上传日期:2017-01-08
资源大小:20993k
文件大小:18k
源码类别:

MTK

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. // form
  5. #ifndef _FORM_MAIN_H_
  6. #include "form_main.h"
  7. #endif
  8. #ifndef _FORM_RTC32K_H_
  9. #include "form_Rtc32k.h"
  10. #endif
  11. // misc
  12. #ifndef  _MISC_H_
  13. #include "misc.h"
  14. #endif
  15. #ifndef  _FILE_UTILS_H_
  16. #include "file_utils.h"
  17. #endif
  18. #ifndef  _FT_UTILS_H_
  19. #include "ft_utils.h"
  20. #endif
  21. #ifndef  _BAND_UTILS_H_
  22. #include "band_utils.h"
  23. #endif
  24. #ifndef  _MAN_DLL_H_
  25. #include "man_dll.h"
  26. #endif
  27. #ifndef  _MAN_FDM_H_
  28. #include "man_fdm.h"
  29. #endif
  30. #ifndef _META_LAB_MSG_H_
  31. #include "meta_lab_msg.h"
  32. #endif
  33. // equipment
  34. #ifndef  _RCT_CTRL_H_
  35. #include "rct_ctrl.h"
  36. #endif
  37. // RF
  38. #ifndef  _RF_STOP_H_
  39. #include "rf_stop.h"
  40. #endif
  41. //---------------------------------------------------------------------------
  42. #pragma package(smart_init)
  43. #pragma resource "*.dfm"
  44. TfrmRTC32k *frmRTC32k;
  45. //===========================================================================
  46. __fastcall TfrmRTC32k::TfrmRTC32k(TComponent* Owner)
  47.         : TForm(Owner)
  48. {
  49.     m_pCfg = NULL;
  50.     m_sRfRtc.p_stLog = NULL;
  51.     m_sRct.cmu.RM       = NULL;
  52.     m_sRct.cmu.base     = NULL;
  53.     m_sRct.cmu.gsm      = NULL;
  54.     m_sRct.cmu.dcs      = NULL;
  55.     m_sRct.cmu.pcs      = NULL;
  56.     m_sRct.cmu.gsm850   = NULL;
  57.     m_sRct.cmu.s_gsm    = NULL;
  58.     m_sRct.cmu.s_dcs    = NULL;
  59.     m_sRct.cmu.s_pcs    = NULL;
  60.     m_sRct.cmu.s_gsm850 = NULL;
  61.     m_sRct.age.vi       = NULL;
  62.     Init();
  63. }
  64. //---------------------------------------------------------------------------
  65. void TfrmRTC32k::Init(void)
  66. {
  67.     m_bInit = true;
  68. }
  69. //---------------------------------------------------------------------------
  70. void __fastcall TfrmRTC32k::FormCreate(TObject *Sender)
  71. {
  72.     m_cbBand->ItemIndex = 0;
  73.     m_cbTXTsc->ItemIndex = 5;
  74.     m_cbEquipment->ItemIndex = 0;
  75.     WindowProc = SubClassWndProc;
  76. }
  77. //---------------------------------------------------------------------------
  78. void __fastcall TfrmRTC32k::FormActivate(TObject *Sender)
  79. {
  80.     if (m_bInit)
  81.     {
  82.         m_bInit = false;
  83.         m_sRfRtc.e_bb_id = frmMainSel->Get_FinalBBChip();
  84.     }
  85. }
  86. //---------------------------------------------------------------------------
  87. void __fastcall TfrmRTC32k::FormDestroy(TObject *Sender)
  88. {
  89.     if (NULL != m_sRfRtc.p_stLog)
  90.     {
  91.         delete m_sRfRtc.p_stLog;
  92.     }
  93.     if (NULL != m_pCfg)
  94.     {
  95.         delete m_pCfg;
  96.     }
  97. }
  98. //============================================================================
  99. void _fastcall TfrmRTC32k::SubClassWndProc(Messages::TMessage &Message)
  100. {
  101.     switch (Message.Msg)
  102.     {
  103.         case WM_ML_RCT_INIT_FAIL:
  104.         {
  105.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment initialization fail";
  106.             AnsiString as_msg = "Execution Fail : Equipment initialization";
  107.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  108.         }
  109.         break;
  110.         case WM_ML_RCT_SET_OPERATION_MODE_FAIL:
  111.         {
  112.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set operation mode fail";
  113.             AnsiString as_msg = "Execution Fail : Equipment set operation mode";
  114.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  115.         }
  116.         break;
  117.         case WM_ML_RCT_SET_BAND_FAIL:
  118.         {
  119.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set band fail";
  120.             AnsiString as_msg = "Execution Fail : Equipment set band";
  121.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  122.         }
  123.         break;
  124.         case WM_ML_RCT_SET_DOWNLINK_POWER_FAIL:
  125.         {
  126.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set downlink power fail";
  127.             AnsiString as_msg = "Execution Fail : Equipment set downlink power";
  128.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  129.         }
  130.         break;
  131.         case WM_ML_RCT_SET_TCH_LEVEL_FAIL:
  132.         {
  133.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set TCH level fail";
  134.             AnsiString as_msg = "Execution Fail : Equipment set TCH level";
  135.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  136.         }
  137.         break;
  138.         case WM_ML_RCT_SET_BCH_ARFCN_FAIL:
  139.         {
  140.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set BCH ARFCN fail";
  141.             AnsiString as_msg = "Execution Fail : Equipment set BCH ARFCN";
  142.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  143.         }
  144.         break;
  145.         case WM_ML_RCT_SET_TCH_ARFCN_FAIL:
  146.         {
  147.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set TCH ARFCN fail";
  148.             AnsiString as_msg = "Execution Fail : Equipment set TCH ARFCN";
  149.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  150.         }
  151.         break;
  152.         case WM_ML_RCT_SET_TCH_TIMESLOT_FAIL:
  153.         {
  154.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set TCH timeslot fail";
  155.             AnsiString as_msg = "Execution Fail : Equipment set TCH timeslot";
  156.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  157.         }
  158.         break;
  159.         case WM_ML_RCT_SET_TSC_FAIL:
  160.         {
  161.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set TSC fail";
  162.             AnsiString as_msg = "Execution Fail : Equipment set TSC";
  163.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  164.         }
  165.         break;
  166.         case WM_ML_RCT_SET_MS_TX_LEVEL_FAIL:
  167.         {
  168.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Equipment set MS TX level fail";
  169.             AnsiString as_msg = "Execution Fail : Equipment set MS TX level";
  170.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK);
  171.         }
  172.         break;
  173.         case WM_ML_RF_SELECT_BAND_FAIL:
  174.         {
  175.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Select band fail";
  176.             AnsiString as_msg = "Execution Fail : Select band";
  177.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK );
  178.         }
  179.         break;
  180.         case WM_ML_RF_AFC_CONTROL_FAIL:
  181.         {
  182.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  FB detection fail";
  183.             AnsiString as_msg = "Execution Fail : FB detection";
  184.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK );
  185.         }
  186.         break;
  187.         case WM_ML_RTC_PRINT_MSG:
  188.         {
  189.             FillRtc32KResult(false, Message.WParam);
  190.         }
  191.         break;
  192.         case WM_ML_RTC_CLOCK_OUT_OF_RANGE_MSG:
  193.         {
  194.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC clock is out of range";
  195.             AnsiString as_msg = "Execution Fail : RTC clock is out of range, RTC clock = " + Double_To_AnsiString(Message.WParam/100.0) + " Hz";
  196.             Application->MessageBox(as_msg.c_str(), "FAIL", MB_OK );
  197.         }
  198.         break;
  199.         default:
  200.         {
  201.             this->WndProc(Message);
  202.         }
  203.         break;
  204.     }
  205. }
  206. //===========================================================================
  207. void TfrmRTC32k::ShowHintLabel(TControl *sender, char* hint)
  208. {
  209.     TPoint pt0 = this->ClientOrigin;
  210.     TPoint pt1 = sender->ClientOrigin;
  211.     lblHint->Left = (pt1.x-pt0.x);
  212.     lblHint->Top  = (pt1.y-pt0.y)+sender->Height+3;
  213.     lblHint->Caption = hint;
  214.     lblHint->Visible = true;
  215.     HintTimer->Enabled = true;
  216. }
  217. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  218. void TfrmRTC32k::CurrentPageLock(void)
  219. {
  220.     m_btnStart->Enabled = false;
  221.     m_btnStart->Tag = START_TAG;
  222.     //m_btnNvramDB->Enabled = false;
  223.     m_btnCfgFile->Enabled = false;
  224.     m_btnLogFile->Enabled = false;
  225. }
  226. //---------------------------------------------------------------------------
  227. void TfrmRTC32k::CurrentPageReset(void)
  228. {
  229.     m_btnStart->Enabled = true;
  230.     m_btnStart->Tag = STOP_TAG;
  231.     //m_btnNvramDB->Enabled = true;
  232.     m_btnCfgFile->Enabled = true;
  233.     m_btnLogFile->Enabled = true;
  234. }
  235. //===========================================================================
  236. void TfrmRTC32k::setup_log_file(AnsiString asFileName)
  237. {
  238.     m_stLogFile->Caption = asFileName;
  239.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Setup log file name successfully";
  240. }
  241. //---------------------------------------------------------------------------
  242. void __fastcall TfrmRTC32k::m_btnLogFileClick(TObject *Sender)
  243. {
  244.     if (m_dlgSaveLog->Execute())
  245.     {
  246.         setup_log_file(m_dlgSaveLog->FileName);
  247.     }
  248. }
  249. //---------------------------------------------------------------------------
  250. void __fastcall TfrmRTC32k::on_TerminateSuccess(TObject *Sender)
  251. {
  252.     CloseRctHandle();
  253.     CurrentPageReset();
  254.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC 32K clock tracking terminated successfully ";
  255. }
  256. //---------------------------------------------------------------------------
  257. void __fastcall TfrmRTC32k::on_TerminateFail(TObject *Sender)
  258. {
  259.     CloseRctHandle();
  260.     StopRf();
  261.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC 32K clock tracking terminated fail ";
  262. }
  263. //---------------------------------------------------------------------------
  264. void __fastcall TfrmRTC32k::on_TerminateByUser(TObject *Sender)
  265. {
  266.     CloseRctHandle();
  267.     StopRf();
  268.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC 32K clock tracking terminated by user ";
  269. }
  270. //---------------------------------------------------------------------------
  271. void TfrmRTC32k::CloseRctHandle(void)
  272. {
  273.     CRCTCTRL rct_ctrl;
  274.     if (AGILENT_8960 == m_sRct.device_type)
  275.     {
  276.         if (!rct_ctrl.RCT_dcl(&m_sRct))
  277.         {
  278.             return;
  279.         }
  280.         Sleep(50);
  281.         if (!rct_ctrl.RCT_reset(&m_sRct))
  282.         {
  283.             return;
  284.         }
  285.         Sleep(50);
  286.         if (!rct_ctrl.RCT_close(&m_sRct, BandIdx_To_FreqBandString(m_cbBand->ItemIndex)))
  287.         {
  288.             return;
  289.         }
  290.     }
  291.     else // CMU 200
  292.     {
  293.         if (!rct_ctrl.RCT_sig_close(&m_sRct, BandIdx_To_FreqBandString(m_cbBand->ItemIndex)))
  294.         {
  295.             return;
  296.         }
  297.     }
  298. }
  299. //---------------------------------------------------------------------------
  300. void __fastcall TfrmRTC32k::m_btnStartClick(TObject *Sender)
  301. {
  302.     if (m_stCfgFile->Caption.AnsiCompareIC("") == 0)
  303.     {
  304.         Application->MessageBox("Please open configuration file.", "Warning", MB_OK);
  305.         m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Please open configuration file ";
  306.         return;
  307.     }
  308.     if (m_stLogFile->Caption.AnsiCompareIC("") == 0)
  309.     {
  310.         Application->MessageBox("Please setup log file.", "Warning", MB_OK );
  311.         m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Please setup log file ";
  312.         return;
  313.     }
  314.     if (NULL == m_sRfRtc.p_stLog)
  315.     {
  316.         m_sRfRtc.p_stLog = new TStringList;
  317.     }
  318.     if (NULL == m_sRfRtc.p_stLog)
  319.     {
  320.         Application->MessageBox("Allocate memory for log fail", "FAIL", MB_OK );
  321.         m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Allocate memory for log fail ";
  322.         return;
  323.     }
  324.     if (!DllMan->LoadAge1960DllFunctions(this->Handle) ||
  325.            !DllMan->LoadVisa32DllFunctions(this->Handle)
  326.           )
  327.         {
  328.             m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  Load equipment dll fail";
  329.             Application->MessageBox(" Load equipment dll fail", "Fail", MB_OK);
  330.             return;
  331.         }
  332.     CurrentPageLock();
  333.     m_sRfRtc.hPostMsgDestHandle = this->Handle;
  334.     m_sRfRtc.p_cfg = m_pCfg;
  335.     m_sRfRtc.as_LogFile = m_stLogFile->Caption;
  336.     m_sRfRtc.ne_onTermSuccess = on_TerminateSuccess;
  337.     m_sRfRtc.ne_onTermByUser  = on_TerminateByUser;
  338.     m_sRfRtc.e_band = (E_BANDSEL)m_cbBand->ItemIndex;
  339.     m_sRfRtc.s_arfcn = m_edtArfcn->Text.ToInt();
  340.     m_sRfRtc.c_tsc = (char)m_cbTXTsc->ItemIndex;
  341.     m_sRfRtc.s_pcl = m_edtPcl->Text.ToInt();
  342.     m_sRfRtc.d_P_DL = atof(m_edtDnPower->Text.c_str());
  343.     m_sRfRtc.ui_test_count = m_edtTestCount->Text.ToInt();
  344.     m_sRfRtc.ui_period     = m_edtPeriod->Text.ToInt();
  345.     m_sRct.device_type = (E_DEVICE_TYPE)m_cbEquipment->ItemIndex;
  346.     switch (m_cbBand->ItemIndex)
  347.     {
  348.         case BANDSEL_GSM900:
  349.         {
  350.             m_sRfRtc.as_FreqBand = "0x04";
  351.         }
  352.         break;
  353.         case BANDSEL_DCS1800:
  354.         {
  355.             m_sRfRtc.as_FreqBand = "0x08";
  356.         }
  357.         break;
  358.         case BANDSEL_PCS1900:
  359.         {
  360.             m_sRfRtc.as_FreqBand = "0x10";
  361.         }
  362.         break;
  363.         case BANDSEL_GSM850:
  364.         {
  365.             m_sRfRtc.as_FreqBand = "0x02";
  366.         }
  367.         break;
  368.     }
  369.     CRCTCTRL rct_ctrl_obj;
  370.     m_sRct.as_RCT  = rct_ctrl_obj.RCT_DeviceTypeToString((E_DEVICE_TYPE) m_sRct.device_type);
  371.     m_pt_Rtc32K = new CRFRTC(true, &m_sRfRtc, &m_sRct);
  372.     m_pt_Rtc32K->FreeOnTerminate = true;
  373.     m_pt_Rtc32K->OnTerminate = on_TerminateFail;
  374.     m_pt_Rtc32K->Resume();
  375.     FillRtc32KResult(true, 0);
  376.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC 32K clock tracking progressing ... ";
  377. }
  378. //---------------------------------------------------------------------------
  379. void __fastcall TfrmRTC32k::m_btnStopClick(TObject *Sender)
  380. {
  381.     m_pt_Rtc32K->Terminate();
  382.     StopRf();
  383.     m_sbRtc32K->Panels->Items[0]->Text = (AnsiString)"  RTC 32K clock tracking terminated by user ";
  384. }
  385. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  386. void __fastcall TfrmRTC32k::edtTestCountCheck(TObject *Sender)
  387. {
  388.     unsigned int data;
  389.     AnsiString  text;
  390.     TEdit *edit = (TEdit*)Sender;
  391.     char  hint[] = "value shall be 1~4294967295 ";
  392.     text = edit->Text;
  393.     if (!IsValidMeasurementCount(text, data))
  394.     {
  395.         ShowHintLabel(edit, hint);
  396.         edit->SetFocus();
  397.         return;
  398.     }
  399. }
  400. //---------------------------------------------------------------------------
  401. void __fastcall TfrmRTC32k::edtPeriodCheck(TObject *Sender)
  402. {
  403.     unsigned int data;
  404.     AnsiString  text;
  405.     TEdit *edit = (TEdit*)Sender;
  406.     char  hint[] = "value shall be 1000~4294967295 ";
  407.     text = edit->Text;
  408.     if (!IsValidPeriod(text, data))
  409.     {
  410.         ShowHintLabel(edit, hint);
  411.         edit->SetFocus();
  412.         return;
  413.     }
  414. }
  415. //---------------------------------------------------------------------------
  416. void __fastcall TfrmRTC32k::HintTimerTimer(TObject *Sender)
  417. {
  418.     HintTimer->Enabled = false;
  419.     lblHint->Visible = false;    
  420. }
  421. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  422. void __fastcall TfrmRTC32k::m_btnCfgFileClick(TObject *Sender)
  423. {
  424.     if (m_dlgOpenCfg->Execute())
  425.     {
  426.         read_cfg_file(m_dlgOpenCfg->FileName);
  427.     }
  428. }
  429. //---------------------------------------------------------------------------
  430. bool TfrmRTC32k::read_cfg_file(AnsiString asFileName)
  431. {
  432.     if (NULL == m_pCfg)
  433.     {
  434.          m_pCfg = new TMETA_factory_cfg();
  435.     }
  436.     if (!m_pCfg->ReadFromIniFile(asFileName))
  437.     {
  438.         return false;
  439.     }
  440.     m_stCfgFile->Caption = asFileName;
  441.     return true;
  442. }
  443. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  444. void TfrmRTC32k::StopRf(void)
  445. {
  446.     CRFSTOP rf_stop_obj;
  447.     rf_stop_obj.REQ_Start();
  448.     CurrentPageReset();
  449. }
  450. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  451. void TfrmRTC32k::FillRtc32KResult(bool b_title, int clock_mHz)
  452. {
  453.     char str[512];
  454.     if (b_title)
  455.     {
  456.         m_reResult->Lines->Clear();
  457.         sprintf(str, "   RTC clock (Hz)   RTC clock/32768   ");
  458.         m_reResult->Lines->Add(str);
  459.         sprintf(str, "=====================================");
  460.         m_reResult->Lines->Add(str);
  461.     }
  462.     else
  463.     {
  464.         double d_clock_Hz = clock_mHz/100.0;
  465.         sprintf(str, "   %.2f             %.6f", d_clock_Hz, d_clock_Hz/32768.0);
  466.         m_reResult->Lines->Add(str);
  467.     }
  468. }
  469. //---------------------------------------------------------------------------
  470. void __fastcall TfrmRTC32k::m_cbBandChange(TObject *Sender)
  471. {
  472.     short sdata;
  473.     if (!frmMainSel->cbGSM850->Checked)
  474.     {
  475.         if (BANDSEL_GSM850 == (E_BANDSEL) m_cbBand->ItemIndex)
  476.         {
  477.             m_cbBand->ItemIndex = 0;
  478.             Application->MessageBox("Please check GSM 850 on main menu", "FAILURE", MB_OK);
  479.         }
  480.     }
  481.     E_BANDSEL CurBand = (E_BANDSEL) m_cbBand->ItemIndex;
  482.     m_edtArfcnCheck(m_edtArfcn);
  483.     if (!IsValidARFCN(m_edtArfcn->Text, CurBand, sdata))
  484.     {
  485.         m_edtArfcn->Text = IntToStr(Default_ARFCN[CurBand]);
  486.     }
  487. }
  488. //---------------------------------------------------------------------------
  489. void __fastcall TfrmRTC32k::m_edtArfcnCheck(TObject *Sender)
  490. {
  491.     short sdata;
  492.     AnsiString  text;
  493.     TEdit *edit = (TEdit*)Sender;
  494.     char hint[][256] =
  495.     {
  496.         " value shall be 0~124 or 975~1023 ",
  497.         " value shall be 512~885 ",
  498.         " value shall be 512~810 ",
  499.         " value shall be 128~251 ",
  500.     };
  501.     E_BANDSEL CurBand = (E_BANDSEL) m_cbBand->ItemIndex;
  502.     text = edit->Text;
  503.     if (!IsValidARFCN(text, CurBand, sdata))
  504.     {
  505.         edit->Text = IntToStr(Default_ARFCN[CurBand]);
  506.         ShowHintLabel(edit, hint[CurBand]);
  507.         edit->SetFocus();
  508.         return;
  509.     }
  510. }
  511. //---------------------------------------------------------------------------
  512. void __fastcall TfrmRTC32k::m_edtPclCheck(TObject *Sender)
  513. {
  514.     int data;
  515.     AnsiString  text;
  516.     TEdit *edit = (TEdit*)Sender;
  517.     char  hint[][256] =
  518.     {
  519.         " value shall be 5~19 ",
  520.         " value shall be 0~15 ",
  521.         " value shall be 0~15 ",
  522.         " value shall be 5~19 ",
  523.     };
  524.     text = edit->Text;
  525.     if (text.AnsiCompare("") == 0)
  526.     {
  527.         return;
  528.     }
  529.     int CurBand = m_cbBand->ItemIndex;
  530.     if (!IsValidPCL(text, CurBand, data))
  531.     {
  532.         ShowHintLabel(edit, hint[CurBand]);
  533.         edit->Text = IntToStr(Default_PCL);
  534.         edit->SetFocus();
  535.         return;
  536.     }
  537. }
  538. //---------------------------------------------------------------------------
  539. void __fastcall TfrmRTC32k::m_edtDnPowerCheck(TObject *Sender)
  540. {
  541.     double  data;
  542.     AnsiString  text;
  543.     TEdit *edit = (TEdit*)Sender;
  544.     char  hint[] = " downlink power is not valid ";
  545.     text = edit->Text;
  546.     if (!IsValidPower(text, data))
  547.     {
  548.         ShowHintLabel(edit, hint);
  549.         edit->SetFocus();
  550.         return;
  551.     }    
  552. }
  553. //---------------------------------------------------------------------------