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

MTK

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <stdio.h>
  4. #pragma hdrstop
  5. #ifndef _FORM_TDMB_H_
  6. #include "form_TDMB.h"
  7. #endif
  8. // misc
  9. #ifndef  _FT_UTILS_H_
  10. #include "ft_utils.h"
  11. #endif
  12. //---------------------------------------------------------------------------
  13. typedef enum
  14. {
  15.     TDMB_STATUS_BAR_INDEX_STATUS = 0,
  16.     TDMB_STATUS_BAR_INDEX_SENT_AND_TOTAL,
  17.     TDMB_STATUS_BAR_INDEX_PERCENT
  18. }E_TDMB_STATUS_BAR_INDEX;
  19. //---------------------------------------------------------------------------
  20. #pragma package(smart_init)
  21. #pragma resource "*.dfm"
  22. TfrmTDMB *frmTDMB;
  23. //===========================================================================
  24. static void CNF_TDMB_PowerOn(void)
  25. {
  26.     frmTDMB->CNF_TDMB_PowerOn();
  27. }
  28. //---------------------------------------------------------------------------
  29. static void CNF_TDMB_SetFreq(void)
  30. {
  31.     frmTDMB->CNF_TDMB_SetFreq();
  32. }
  33. //---------------------------------------------------------------------------
  34. static void CNF_TDMB_AutoScan(void)
  35. {
  36.     frmTDMB->CNF_TDMB_AutoScan();
  37. }
  38. //---------------------------------------------------------------------------
  39. static void CNF_TDMB_GetSignal(void)
  40. {
  41.     frmTDMB->CNF_TDMB_GetSignal();
  42. }
  43. //---------------------------------------------------------------------------
  44. static void CNF_TDMB_SelServiceOnly(void)
  45. {
  46.     frmTDMB->CNF_TDMB_SelServiceOnly();
  47. }
  48. //---------------------------------------------------------------------------
  49. static void CNF_TDMB_RecordStream(void)
  50. {
  51.     frmTDMB->CNF_TDMB_RecordStream();
  52. }
  53. //---------------------------------------------------------------------------
  54. static void CNF_TDMB_StopService(void)
  55. {
  56.     frmTDMB->CNF_TDMB_StopService();
  57. }
  58. //===========================================================================
  59. __fastcall TfrmTDMB::TfrmTDMB(TComponent* Owner)
  60.         : TForm(Owner)
  61. {
  62.     Init();
  63. }
  64. //---------------------------------------------------------------------------
  65. void TfrmTDMB::Init(void)
  66. {
  67.     m_bInit = true;
  68.     m_bAction = false;
  69.     m_bService = false;
  70.     m_bRecordStream = false;
  71.     m_btnSetChannel->Enabled = true;
  72.     m_btnAutoScan->Enabled = true;
  73.     m_btnSelectService->Enabled = true;
  74.     m_btnStartRS->Enabled = true;
  75.     m_btnStop->Enabled = false;
  76.     Disable_AllTimer();
  77.     m_btnStop->Enabled = false;
  78.     m_tvServices->Items->Clear();  
  79.     ReDrawFields(TDMB_DRAW_MASK_SIGNAL);
  80. }
  81. //===========================================================================
  82. void __fastcall TfrmTDMB::FormShow(TObject *Sender)
  83. {
  84.     Display_Channel((E_TDMB_BAND_T) m_cbBand->ItemIndex);
  85. }
  86. //---------------------------------------------------------------------------
  87. void __fastcall TfrmTDMB::FormActivate(TObject *Sender)
  88. {
  89.     if (m_bInit)
  90.     {
  91.         m_bInit = false;
  92.         m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_PowerOn;
  93.         m_TDMB_RF_Obj.REQ_Power_On_Start();
  94.         CurrentPageLock();
  95.     }
  96. }
  97. //---------------------------------------------------------------------------
  98. void __fastcall TfrmTDMB::FormClose(TObject *Sender, TCloseAction &Action)
  99. {
  100.     Disable_AllTimer();
  101. }
  102. //---------------------------------------------------------------------------
  103. void __fastcall TfrmTDMB::FormHide(TObject *Sender)
  104. {
  105.     Disable_AllTimer();
  106. }
  107. //---------------------------------------------------------------------------
  108. void TfrmTDMB::Disable_AllTimer(void)
  109. {
  110.     m_tmSingal->Enabled = false;
  111.     m_tmService->Enabled = false;
  112.     m_tmGetFile->Enabled = false;
  113. }
  114. //---------------------------------------------------------------------------
  115. void TfrmTDMB::CNF_TDMB_PowerOn(void)
  116. {
  117.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  118.     switch (state)
  119.     {
  120.         case METAAPP_SUCCESS:
  121.         {
  122.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  TDMB module power on successfully";
  123.         }
  124.         break;
  125.         case METAAPP_FAIL:
  126.         {
  127.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  TDMB module power on fail";
  128.             Application->MessageBox("Execution Failure : TDMB module power on", "FAILURE", MB_OK );
  129.         }
  130.         break;
  131.         case METAAPP_TIMEOUT:
  132.         {
  133.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  TDMB module power on timeout";
  134.             Application->MessageBox("Execution Timeout : TDMB module power on", "TIMEOUT", MB_OK );
  135.         }
  136.         break;
  137.         case METAAPP_STOP:
  138.         {
  139.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  TDMB module power on stop";
  140.         }
  141.         break;
  142.         default:
  143.         {
  144.         }
  145.         break;
  146.     }
  147.     CurrentPageReset();
  148. }
  149. //===========================================================================
  150. void TfrmTDMB::CurrentPageReset(void)
  151. {
  152.     if (m_bService || m_bRecordStream)
  153.     {
  154.         m_btnStop->Enabled = true;
  155.     }
  156.     else
  157.     {
  158.         m_btnSetChannel->Enabled = true;
  159.         m_btnAutoScan->Enabled = true;
  160.         m_tvServices->Enabled = true;
  161.         m_btnSelectService->Enabled = true;
  162.         m_btnStartRS->Enabled = true;
  163.     }
  164. }
  165. //---------------------------------------------------------------------------
  166. void TfrmTDMB::CurrentPageLock(void)
  167. {
  168.     m_btnSetChannel->Enabled = false;
  169.     m_btnAutoScan->Enabled = false;
  170.     m_tvServices->Enabled = false;
  171.     m_btnSelectService->Enabled = false;
  172.     m_btnStartRS->Enabled = false;
  173.     m_btnStop->Enabled = false;
  174. }
  175. //---------------------------------------------------------------------------
  176. void TfrmTDMB::ReDrawFields(E_TDMB_DRAW_MASK mask)
  177. {
  178.     if (mask & TDMB_DRAW_MASK_CHANNEL)
  179.     {
  180.         Display_Channel((E_TDMB_BAND_T) m_cbBand->ItemIndex);
  181.     }
  182.     if (mask & TDMB_DRAW_MASK_FREQ_SERVICES)
  183.     {
  184.         Display_FreqEnsembleDB();
  185.     }
  186.     if (mask & TDMB_DRAW_MASK_SCAN_SERVICES)
  187.     {
  188.         Display_ScanEnsembleDB();
  189.     }
  190.     if (mask & TDMB_DRAW_MASK_SIGNAL)
  191.     {
  192.         if (m_bService || m_bRecordStream)
  193.         {
  194.             m_stSNR->Caption     = IntToStr(m_sSignal.m_u2Snr);
  195.             char str[256];
  196.             sprintf(str, "%.2f", (m_sSignal.m_u2PreBer / 100.0));
  197.             m_stPreBER->Caption = (AnsiString) str;
  198.             AnsiString as = "-";
  199.             as += IntToStr(m_sSignal.m_u2RSSI);
  200.             m_stRSSI->Caption = as;
  201.         }
  202.         else
  203.         {
  204.             m_tmSingal->Enabled = false;
  205.             m_stSNR->Caption     = "N/A";
  206.             m_stPreBER->Caption  = "N/A";
  207.             m_stRSSI->Caption    = "N/A";
  208.         }
  209.     }
  210. }
  211. //===========================================================================
  212. void TfrmTDMB::Display_Channel(E_TDMB_BAND_T band)
  213. {
  214.     m_cbChannel->Clear();
  215.     switch (band)
  216.     {
  217.         case TDMB_KOREA_BAND_IDX:
  218.         {
  219.             AnsiString as_channel[] =
  220.             {
  221.                 "7A (175.280 MHz)",
  222.                 "7B (177.008 MHz)",
  223.                 "7C (178.736 MHz)",
  224.                 "8A (181.280 MHz)",
  225.                 "8B (183.008 MHz)",
  226.                 "8C (184.736 MHz)",
  227.                 "9A (187.280 MHz)",
  228.                 "9B (189.008 MHz)",
  229.                 "9C (190.736 MHz)",
  230.                 "10A (193.280 MHz)",
  231.                 "10B (195.008 MHz)",
  232.                 "10C (196.736 MHz)",
  233.                 "11A (199.280 MHz)",
  234.                 "11B (201.008 MHz)",
  235.                 "11C (202.736 MHz)",
  236.                 "12A (205.280 MHz)",
  237.                 "12B (207.008 MHz)",
  238.                 "12C (208.736 MHz)",
  239.                 "13A (211.280 MHz)",
  240.                 "13B (213.008 MHz)",
  241.                 "13C (214.736 MHz)",
  242.             };
  243.             for (int i=0; i<TDMB_KOREA_BAND_CHANNEL_NUM; i++)
  244.             {
  245.                 m_cbChannel->Items->Add(as_channel[i]);
  246.             }
  247.         }
  248.         break;
  249.         case TDMB_VHF_BAND3_IDX:
  250.         {
  251.             AnsiString as_channel[] =
  252.             {
  253.                 "5A (174.928 MHz)",
  254.                 "5B (176.640 MHz)",
  255.                 "5C (178.352 MHz)",
  256.                 "5D (180.064 MHz)",
  257.                 "6A (181.936 MHz)",
  258.                 "6B (183.648 MHz)",
  259.                 "6C (185.360 MHz)",
  260.                 "6D (187.072 MHz)",
  261.                 "7A (188.928 MHz)",
  262.                 "7B (190.640 MHz)",
  263.                 "7C (192.352 MHz)",
  264.                 "7D (194.064 MHz)",
  265.                 "8A (195.936 MHz)",
  266.                 "8B (197.648 MHz)",
  267.                 "8C (199.360 MHz)",
  268.                 "8D (201.072 MHz)",
  269.                 "9A (202.928 MHz)",
  270.                 "9B (204.640 MHz)",
  271.                 "9C (206.352 MHz)",
  272.                 "9D (208.064 MHz)",
  273.                 "10A (209.936 MHz)",
  274.                 "10N (210.096 MHz)",
  275.                 "10B (211.648 MHz)",
  276.                 "10C (213.360 MHz)",
  277.                 "10D (215.072 MHz)",
  278.                 "11A (216.928 MHz)",
  279.                 "11N (217.088 MHz)",
  280.                 "11B (218.640 MHz)",
  281.                 "11C (220.352 MHz)",
  282.                 "11D (222.064 MHz)",
  283.                 "12A (223.936 MHz)",
  284.                 "12N (224.096 MHz)",
  285.                 "12B (225.648 MHz)",
  286.                 "12C (227.360 MHz)",
  287.                 "12D (229.072 MHz)",
  288.                 "13A (230.784 MHz)",
  289.                 "13B (232.496 MHz)",
  290.                 "13C (234.208 MHz)",
  291.                 "13D (235.776 MHz)",
  292.                 "13E (237.488 MHz)",
  293.                 "13F (239.200 MHz)"
  294.             };
  295.             for (int i=0; i<TDMB_VHF_BAND3_CHANNEL_NUM; i++)
  296.             {
  297.                 m_cbChannel->Items->Add(as_channel[i]);
  298.             }
  299.         }
  300.         break;
  301.         case TDMB_LBAND_IDX:
  302.         {
  303.             AnsiString as_channel[] =
  304.             {
  305.                 "LA (1452.960 MHz)",
  306.                 "LB (1454.672 MHz)",
  307.                 "LC (1456.384 MHz)",
  308.                 "LD (1458.096 MHz)",
  309.                 "LE (1459.808 MHz)",
  310.                 "LF (1461.520 MHz)",
  311.                 "LG (1463.232 MHz)",
  312.                 "LH (1464.944 MHz)",
  313.                 "LI (1466.656 MHz)",
  314.                 "LJ (1468.368 MHz)",
  315.                 "LK (1470.080 MHz)",
  316.                 "LL (1471.792 MHz)",
  317.                 "LM (1473.504 MHz)",
  318.                 "LN (1475.216 MHz)",
  319.                 "LO (1476.928 MHz)",
  320.                 "LP (1478.640 MHz)",
  321.                 "LQ (1480.352 MHz)",
  322.                 "LR (1482.064 MHz)",
  323.                 "LS (1483.776 MHz)",
  324.                 "LT (1485.488 MHz)",
  325.                 "LU (1487.200 MHz)",
  326.                 "LV (1488.912 MHz)",
  327.                 "LW (1490.624 MHz)"
  328.             };
  329.             for (int i=0; i<TDMB_LBAND_CHANNEL_NUM; i++)
  330.             {
  331.                 m_cbChannel->Items->Add(as_channel[i]);
  332.             }
  333.         }
  334.         break;
  335.         case TDMB_CHINA_BAND_IDX:
  336.         {
  337.             AnsiString as_channel[] =
  338.             {
  339.                 "(208.720 MHz)",
  340.                 "(209.936 MHz)",
  341.                 "(210.432 MHz)",
  342.                 "(211.648 MHz)",
  343.                 "(212.144 MHz)",
  344.                 "(213.360 MHz)",
  345.                 "(213.856 MHz)",
  346.                 "(215.072 MHz)",
  347.                 "(216.432 MHz)",
  348.                 "(218.144 MHz)",
  349.                 "(1458.096 MHz)",
  350.                 "(1459.808 MHz)",
  351.                 "(1470.080 MHz)",
  352.             };
  353.             for (int i=0; i<TDMB_CHINA_BAND_CHANNEL_NUM; i++)
  354.             {
  355.                 m_cbChannel->Items->Add(as_channel[i]);
  356.             }
  357.         }
  358.         break;
  359.         default:
  360.         {
  361.         }
  362.         break;
  363.     }
  364.     m_cbChannel->ItemIndex = 0;
  365. }
  366. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  367. void TfrmTDMB::Display_FreqEnsembleDB(void)
  368. {
  369.     TTreeNode *p_tnCurrentEnsembleDB;
  370.     TTreeNode *p_tnCurrentLabel;
  371.     TTreeNode *p_tnCurrentServiceDB[TDMB_MAX_SERVICEDB_NUM];
  372.     TTreeNode *p_tnEnsembleListDB;
  373.     TTreeNode *p_tnEnsembleLabel[TDMB_MAX_ENSEMBLEDB_NUM];
  374.     TTreeNode *p_tnServiceDB[TDMB_MAX_SERVICEDB_NUM];
  375.     m_tvServices->Items->Clear();
  376.     // Current Ensemble
  377.     p_tnCurrentEnsembleDB = m_tvServices->Items->Add(NULL , "[Current Ensemble]");
  378.     AnsiString as(m_sFreqEnsemble.m_rCurEnsembleDB.Label);
  379.     char str[20];
  380.     sprintf(str, "%.3f", m_sFreqEnsemble.m_rCurEnsembleDB.Frequency / 1000.0);
  381.     AnsiString as_str(str);
  382.     as += " CH = " + as_str + " MHz";
  383.     p_tnCurrentLabel = m_tvServices->Items->AddChild(p_tnCurrentEnsembleDB, as);
  384.     for (int i=0; i<m_sFreqEnsemble.m_rCurEnsembleDB.m_ucServiceDBNum; i++)
  385.     {
  386.         p_tnCurrentServiceDB[i] = m_tvServices->Items->AddChild(p_tnCurrentLabel, m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].Label);
  387.         for (int ch=0; ch<m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].m_ucChannelDBNum; ch++)
  388.         {
  389.             sprintf(str, "0x%X", m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].Id);
  390.             as_str = str;
  391.             as = "[DMB][Service ID:" + as_str +
  392.                  "][Channel ID:" + IntToStr(m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].m_rChannelDB[ch].Id) +
  393.                  "][PL:" + IntToStr(m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].m_rChannelDB[ch].PL) +
  394.                  "][" + IntToStr(m_sFreqEnsemble.m_rCurEnsembleDB.m_rServiceDB[i].m_rChannelDB[ch].BitRate) +
  395.                  "Kbps]";
  396.             m_tvServices->Items->AddChild(p_tnCurrentServiceDB[i], as);
  397.         }
  398.     }
  399.     // Ensemble List
  400.     p_tnEnsembleListDB = m_tvServices->Items->Add(NULL , "[Ensemble List]");
  401.     for (int en=0; en<m_sFreqEnsemble.m_ucEnsembleNum; en++)
  402.     {
  403.         as = m_sFreqEnsemble.m_rEnsembleDB[en].Label;
  404.         sprintf(str, "%.3f", m_sFreqEnsemble.m_rEnsembleDB[en].Frequency / 1000.0);
  405.         as_str = str;
  406.         as += " CH = " + as_str + " MHz";
  407.         p_tnEnsembleLabel[en] = m_tvServices->Items->AddChild(p_tnEnsembleListDB, as);
  408.         for (int sv=0; sv<m_sFreqEnsemble.m_rEnsembleDB[en].m_ucServiceDBNum; sv++)
  409.         {
  410.             p_tnServiceDB[sv] = m_tvServices->Items->AddChild(p_tnEnsembleLabel[en], m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].Label);
  411.             for (int ch=0; ch<m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_ucChannelDBNum; ch++)
  412.             {
  413.                 sprintf(str, "0x%X", m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].Id);
  414.                 as_str = str;
  415.                 as = "[DMB][Service ID:" + as_str +
  416.                      "][Channel ID:" + IntToStr(m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].Id) +
  417.                      "][PL:" + IntToStr(m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].PL) +
  418.                      "][" + IntToStr(m_sFreqEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].BitRate) +
  419.                      "Kbps]";
  420.                 m_tvServices->Items->AddChild(p_tnServiceDB[sv], as);
  421.             }
  422.         }
  423.     }
  424. }
  425. //--------------------------------------------------------------------------
  426. void TfrmTDMB::Display_ScanEnsembleDB(void)
  427. {
  428.     TTreeNode *p_tnEnsembleListDB;
  429.     TTreeNode *p_tnEnsembleLabel[TDMB_MAX_ENSEMBLEDB_NUM];
  430.     TTreeNode *p_tnServiceDB[TDMB_MAX_SERVICEDB_NUM];
  431.     m_tvServices->Items->Clear();
  432.     // Ensemble List
  433.     p_tnEnsembleListDB = m_tvServices->Items->Add(NULL , "[Ensemble List]");
  434.     for (int en=0; en<m_sScanEnsemble.m_ucEnsembleNum; en++)
  435.     {
  436.         AnsiString as = m_sScanEnsemble.m_rEnsembleDB[en].Label;
  437.         char str[20];
  438.         sprintf(str, "%.3f", m_sScanEnsemble.m_rEnsembleDB[en].Frequency / 1000.0);
  439.         AnsiString as_str(str);
  440.         as += " CH = " + as_str + " MHz";
  441.         p_tnEnsembleLabel[en] = m_tvServices->Items->AddChild(p_tnEnsembleListDB, as);
  442.         for (int sv=0; sv<m_sScanEnsemble.m_rEnsembleDB[en].m_ucServiceDBNum; sv++)
  443.         {
  444.             p_tnServiceDB[sv] = m_tvServices->Items->AddChild(p_tnEnsembleLabel[en], m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].Label);
  445.             for (int ch=0; ch<m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_ucChannelDBNum; ch++)
  446.             {
  447.                 sprintf(str, "0x%X", m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].Id);
  448.                 as_str = str;
  449.                 as = "[DMB][Service ID:" + as_str +
  450.                      "][Channel ID:" + IntToStr(m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].Id) +
  451.                      "][PL:" + IntToStr(m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].PL) +
  452.                      "][" + IntToStr(m_sScanEnsemble.m_rEnsembleDB[en].m_rServiceDB[sv].m_rChannelDB[ch].BitRate) +
  453.                      "Kbps]";
  454.                 m_tvServices->Items->AddChild(p_tnServiceDB[sv], as);
  455.             }
  456.         }
  457.     }
  458. }
  459. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  460. void __fastcall TfrmTDMB::m_cbBandChange(TObject *Sender)
  461. {
  462.     Display_Channel((E_TDMB_BAND_T) m_cbBand->ItemIndex);
  463. }
  464. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  465. void __fastcall TfrmTDMB::m_btnSetChannelClick(TObject *Sender)
  466. {
  467.     m_bAction = true;
  468.     unsigned int freq_khz = Get_TDMBFreqKHz();
  469.     m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_SetFreq;
  470.     m_TDMB_RF_Obj.REQ_Set_Freq_Start((E_TDMB_BAND_T) m_cbBand->ItemIndex, freq_khz);
  471.     CurrentPageLock();
  472. }
  473. //---------------------------------------------------------------------------
  474. void TfrmTDMB::CNF_TDMB_SetFreq(void)
  475. {
  476.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  477.     m_bAction = false; 
  478.     switch (state)
  479.     {
  480.         case METAAPP_SUCCESS:
  481.         {
  482.             TDMB_SET_FREQ_CNF_T* p_ensemble = m_TDMB_RF_Obj.Get_FreqEnsembleResult();
  483.              m_sFreqEnsemble = *p_ensemble;
  484.             ReDrawFields(TDMB_DRAW_MASK_FREQ_SERVICES);
  485.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Set frequency successfully";
  486.             //m_tmSingal->Enabled = true;
  487.         }
  488.         break;
  489.         case METAAPP_FAIL:
  490.         {
  491.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Set frequency fail";
  492.             Application->MessageBox("Execution Failure : Set frequency", "FAILURE", MB_OK );
  493.         }
  494.         break;
  495.         case METAAPP_TIMEOUT:
  496.         {
  497.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Set frequency timeout";
  498.             Application->MessageBox("Execution Timeout : Set frequency", "TIMEOUT", MB_OK );
  499.         }
  500.         break;
  501.         case METAAPP_STOP:
  502.         {
  503.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Set frequency stop";
  504.         }
  505.         break;
  506.         default:
  507.         {
  508.         }
  509.         break;
  510.     }
  511.     CurrentPageReset();
  512. }
  513. //---------------------------------------------------------------------------
  514. unsigned int TfrmTDMB::Get_TDMBFreqKHz(void)
  515. {
  516.     unsigned int freq_khz;
  517.     AnsiString as = m_cbChannel->Text;
  518.     int pos1 = as.Pos("(");
  519.     int pos2 = as.Pos("M");
  520.     AnsiString as_freq_khz = as.SubString(pos1 + 1, pos2-pos1-2);
  521.     freq_khz = atof(as_freq_khz.c_str()) * 1000;
  522.     return freq_khz;
  523. }
  524. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  525. void __fastcall TfrmTDMB::m_btnAutoScanClick(TObject *Sender)
  526. {
  527.     m_bAction = true;
  528.     m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_AutoScan;
  529.     m_TDMB_RF_Obj.REQ_AutoScan_Start((E_TDMB_BAND_T) m_cbBand->ItemIndex);
  530.     CurrentPageLock();
  531. }
  532. //---------------------------------------------------------------------------
  533. void TfrmTDMB::CNF_TDMB_AutoScan(void)
  534. {
  535.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  536.     m_bAction = false;
  537.     switch (state)
  538.     {
  539.         case METAAPP_SUCCESS:
  540.         {
  541.             TDMB_GET_ENSM_INFO_BY_AUTO_SCAN_CNF_T* p_ensemble = m_TDMB_RF_Obj.Get_ScanEnsembleResult();
  542.             m_sScanEnsemble = *p_ensemble;
  543.             ReDrawFields(TDMB_DRAW_MASK_SCAN_SERVICES);
  544.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Auto scan successfully";
  545.             //m_tmSingal->Enabled = true;
  546.         }
  547.         break;
  548.         case METAAPP_FAIL:
  549.         {
  550.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Auto scan fail";
  551.             Application->MessageBox("Execution Failure : Auto scan", "FAILURE", MB_OK );
  552.         }
  553.         break;
  554.         case METAAPP_TIMEOUT:
  555.         {
  556.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Auto scan timeout";
  557.             Application->MessageBox("Execution Timeout : Auto scan", "TIMEOUT", MB_OK );
  558.         }
  559.         break;
  560.         case METAAPP_STOP:
  561.         {
  562.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Auto scan stop";
  563.         }
  564.         break;
  565.         default:
  566.         {
  567.         }
  568.         break;
  569.     }
  570.     CurrentPageReset();
  571. }
  572. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  573. void __fastcall TfrmTDMB::m_tmSingalTimer(TObject *Sender)
  574. {
  575.     if (!m_bAction)
  576.     {
  577.         m_bAction = true;
  578.         if (!m_TDMB_RF_Obj.REQ_Get_Signal_Start())
  579.         {
  580.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Get signal fail";
  581.             Application->MessageBox("Execution Failure : Get signal", "FAILURE", MB_OK );
  582.             m_tmSingal->Enabled = false;
  583.         }
  584.         m_bAction = false;
  585.         TDMB_GET_SIGNAL_CNF_T* p_signal = m_TDMB_RF_Obj.Get_Signal();
  586.         m_sSignal = *p_signal;
  587.         ReDrawFields(TDMB_DRAW_MASK_SIGNAL);
  588.     }
  589. }
  590. //---------------------------------------------------------------------------
  591. void TfrmTDMB::CNF_TDMB_GetSignal(void)
  592. {
  593.     m_bAction = false;
  594.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  595.     switch (state)
  596.     {
  597.         case METAAPP_SUCCESS:
  598.         {
  599.             TDMB_GET_SIGNAL_CNF_T* p_signal = m_TDMB_RF_Obj.Get_Signal();
  600.             m_sSignal = *p_signal;
  601.             ReDrawFields(TDMB_DRAW_MASK_SIGNAL);
  602.         }
  603.         break;
  604.         case METAAPP_FAIL:
  605.         {
  606.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Get signal fail";
  607.             Application->MessageBox("Execution Failure : Get signal", "FAILURE", MB_OK );
  608.             m_tmSingal->Enabled = false;
  609.         }
  610.         break;
  611.         case METAAPP_TIMEOUT:
  612.         {
  613.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Get signal timeout";
  614.             Application->MessageBox("Execution Timeout : Get signal", "TIMEOUT", MB_OK );
  615.             m_tmSingal->Enabled = false;
  616.         }
  617.         break;
  618.         case METAAPP_STOP:
  619.         {
  620.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Get signal stop";
  621.             m_tmSingal->Enabled = false;
  622.         }
  623.         break;
  624.         default:
  625.         {
  626.         }
  627.         break;
  628.     }
  629.     //CurrentPageReset();
  630. }
  631. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  632. bool TfrmTDMB::Get_ServiceID(unsigned int &ch_kHz, unsigned int &ui_ServiceId, unsigned int &ui_SubChnId)
  633. {
  634.     AnsiString as_sel;
  635.     TTreeNode *p_tnSel;
  636.     for (int i=0; i<m_tvServices->Items->Count; i++)
  637.     {
  638.         p_tnSel = m_tvServices->Items->Item[i];
  639.         if (p_tnSel->Selected)
  640.         {
  641.             as_sel = p_tnSel->Text;
  642.             break;
  643.         }
  644.     }
  645.     int pos_sv_begin = as_sel.AnsiPos("Service ID:");
  646.     int pos_chid_begin = as_sel.AnsiPos("Channel ID:");
  647.     if ((!pos_sv_begin) || (!pos_chid_begin))
  648.     {
  649.         return false;
  650.     }
  651.     while (p_tnSel != NULL)
  652.     {
  653.         p_tnSel = p_tnSel->GetPrev();
  654.         if (NULL == p_tnSel)
  655.         {
  656.             return false;
  657.         }
  658.         // channel
  659.         int pos_ch_begin = p_tnSel->Text.AnsiPos("CH = ");
  660.         int pos_ch_end   = p_tnSel->Text.AnsiPos("MHz");
  661.         if ((pos_ch_begin != 0) && (pos_ch_end != 0))
  662.         {
  663.             AnsiString as_ch = p_tnSel->Text.SubString(pos_ch_begin+5, pos_ch_end-pos_ch_begin-6);
  664.             ch_kHz = atof(as_ch.c_str()) * 1000;
  665.             break;
  666.         }
  667.     }
  668.     // service ID
  669.     pos_sv_begin += strlen("Service ID:");
  670.     as_sel = as_sel.SubString(pos_sv_begin, as_sel.Length()-pos_sv_begin);
  671.     int pos_sv_end = as_sel.AnsiPos("]");
  672.     ui_ServiceId = as_sel.SubString(1, pos_sv_end -1).ToInt();
  673.     // channel ID
  674.     pos_chid_begin = pos_sv_end + strlen("Channel ID:") + 2;
  675.     as_sel = as_sel.SubString(pos_chid_begin, as_sel.Length() - pos_chid_begin);
  676.     int pos_ch_end = as_sel.AnsiPos("]");
  677.     ui_SubChnId = as_sel.SubString(1, pos_ch_end -1).ToInt();
  678.     return true;
  679. }
  680. //---------------------------------------------------------------------------
  681. void __fastcall TfrmTDMB::m_btnSelectServiceClick(TObject *Sender)
  682. {
  683.     S_TDMB_SEL_SERV_ONLY_T serv_only;
  684.     if (!Get_ServiceID(serv_only.ui_freq_khz, serv_only.req.m_u4ServiceId, serv_only.req.m_u4SubChnId))
  685.     {
  686.         return;
  687.     }
  688.     m_bAction = true;
  689.     m_tmSingal->Enabled = false;
  690.     m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_SelServiceOnly;
  691.     m_TDMB_RF_Obj.REQ_Select_Service_Only_Start(serv_only);
  692.     CurrentPageLock();
  693. }
  694. //--------------------------------------------------------------------
  695. void TfrmTDMB::CNF_TDMB_SelServiceOnly(void)
  696. {
  697.     m_bAction = false;
  698.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  699.     switch (state)
  700.     {
  701.         case METAAPP_SUCCESS:
  702.         {
  703.             m_tmSingal->Enabled = true;
  704.             m_bService = true;
  705.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Select service successfully";
  706.         }
  707.         break;
  708.         case METAAPP_TDMB_DISK_FULL:
  709.         {
  710.         }
  711.         break;
  712.         case METAAPP_FAIL:
  713.         {
  714.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Select service fail";
  715.             Application->MessageBox("Execution Failure : Select service", "FAILURE", MB_OK );
  716.         }
  717.         break;
  718.         case METAAPP_TIMEOUT:
  719.         {
  720.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Select service timeout";
  721.             Application->MessageBox("Execution Timeout : Select service", "TIMEOUT", MB_OK );
  722.         }
  723.         break;
  724.         case METAAPP_STOP:
  725.         {
  726.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Select service stop";
  727.         }
  728.         break;
  729.         default:
  730.         {
  731.         }
  732.         break;
  733.     }
  734.     CurrentPageReset();
  735. }
  736. //---------------------------------------------------------------------------
  737. void __fastcall TfrmTDMB::m_btnStartRSClick(TObject *Sender)
  738. {
  739.     S_TDMB_SEL_SERV_T serv;
  740.     if (!Get_ServiceID(serv.ui_freq_khz, serv.req.m_u4ServiceId, serv.req.m_u4SubChnId))
  741.     {
  742.         m_sbTDMB->Panels->Items[0]->Text = (AnsiString) "  Invalid item click! Please select sub channel.";
  743.         Application->MessageBox("Invalid item click! Please select sub channel.", "Warning", MB_OK);
  744.         return;
  745.     }
  746.     if (!m_dlgService->Execute())
  747.     {
  748.         m_sbTDMB->Panels->Items[0]->Text = (AnsiString) "  Save stream to file fail";
  749.         Application->MessageBox("Execution Failure : Save stream to file", "FAILURE", MB_OK);
  750.         return;
  751.     }
  752.     
  753.     m_bAction = true;
  754.     m_tmSingal->Enabled = false;
  755.     serv.req.m_pcfilepath = m_dlgService->FileName.c_str();
  756.     m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_RecordStream;
  757.     m_TDMB_RF_Obj.REQ_RecordStream_Start(serv);
  758.     CurrentPageLock();
  759. }
  760. //---------------------------------------------------------------------------
  761. void TfrmTDMB::CNF_TDMB_RecordStream(void)
  762. {
  763.     m_bAction = false;
  764.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  765.     switch (state)
  766.     {
  767.         case METAAPP_SUCCESS:
  768.         {
  769.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Record stream progressing";
  770.             m_tmSingal->Enabled = true;
  771.             m_tmService->Enabled = true;
  772.             m_bRecordStream = true;
  773.             m_btnStop->Enabled = true;
  774.         }
  775.         break;
  776.         case METAAPP_TDMB_DISK_FULL:
  777.         {
  778.         }
  779.         break;
  780.         case METAAPP_FAIL:
  781.         {
  782.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Record stream fail";
  783.             Application->MessageBox("Execution Failure : Record stream", "FAILURE", MB_OK );
  784.         }
  785.         break;
  786.         case METAAPP_TIMEOUT:
  787.         {
  788.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Record stream timeout";
  789.             Application->MessageBox("Execution Timeout : Record stream", "TIMEOUT", MB_OK );
  790.         }
  791.         break;
  792.         case METAAPP_STOP:
  793.         {
  794.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Record stream stop";
  795.         }
  796.         break;
  797.         default:
  798.         {
  799.         }
  800.         break;
  801.     }
  802.     CurrentPageReset();
  803. }
  804. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  805. void __fastcall TfrmTDMB::m_btnStopClick(TObject *Sender)
  806. {
  807.     m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_StopService;
  808.     m_TDMB_RF_Obj.REQ_Stop_Service_Start();
  809.     m_tmGetFile->Enabled = true;
  810.     m_bService = false;
  811.     m_bRecordStream = false;
  812.     m_tmSingal->Enabled = false;
  813.     CurrentPageLock();
  814.     m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_STATUS]->Text = "  read record TS file from FAT progressing ";
  815. }
  816. //---------------------------------------------------------------------------
  817. void TfrmTDMB::CNF_TDMB_StopService(void)
  818. {
  819.     m_tmService->Enabled = false;
  820.     m_tmGetFile->Enabled = false;
  821.     S_FAT_PROGRESS* p_progress =  m_TDMB_RF_Obj.Get_FatProgress();
  822.     m_pbService->Position = p_progress->percent;
  823.     m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_SENT_AND_TOTAL]->Text = "  " + IntToStr(p_progress->sent_bytes)+ " / " + IntToStr(p_progress->total_bytes)+ " bytes";
  824.     m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_PERCENT]->Text = "  " + IntToStr(p_progress->percent) + "%";
  825.     CurrentPageReset();
  826.     E_METAAPP_RESULT_T state = m_TDMB_RF_Obj.Get_ConfirmState();
  827.     switch (state)
  828.     {
  829.         case METAAPP_SUCCESS:
  830.         {
  831.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Stop service successfully";
  832.            // m_tmSingal->Enabled = true;
  833.         }
  834.         break;
  835.         case METAAPP_FAIL:
  836.         {
  837.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Stop service fail";
  838.             Application->MessageBox("Execution Failure : Stop service", "FAILURE", MB_OK );
  839.         }
  840.         break;
  841.         case METAAPP_TIMEOUT:
  842.         {
  843.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Stop service timeout";
  844.             Application->MessageBox("Execution Timeout : Stop service", "TIMEOUT", MB_OK );
  845.         }
  846.         break;
  847.         case METAAPP_STOP:
  848.         {
  849.             m_sbTDMB->Panels->Items[0]->Text = (AnsiString)"  Stop service stop";
  850.         }
  851.         break;
  852.         default:
  853.         {
  854.         }
  855.         break;
  856.     }
  857. }
  858. void __fastcall TfrmTDMB::m_tmGetFileTimer(TObject *Sender)
  859. {
  860.     S_FAT_PROGRESS* p_progress =  m_TDMB_RF_Obj.Get_FatProgress();
  861.     m_pbService->Position = p_progress->percent;
  862.     m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_SENT_AND_TOTAL]->Text = "  " + IntToStr(p_progress->sent_bytes)+ " / " + IntToStr(p_progress->total_bytes)+ " bytes";
  863.     m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_PERCENT]->Text = "  " + IntToStr(p_progress->percent) + "%";
  864. }
  865. //---------------------------------------------------------------------------
  866. void __fastcall TfrmTDMB::m_tmServiceTimer(TObject *Sender)
  867. {
  868.     S_TDMB_SEL_SERV_ERROR_RESULT* p_result = m_TDMB_RF_Obj.Get_SelServiceResult();
  869.     if (p_result->b_valid)
  870.     {
  871.         if (TDMB_FAT_DISK_FULL == p_result->e_result)
  872.         {
  873.             m_tmService->Enabled = false;
  874.             m_bRecordStream = false;
  875.             Application->MessageBox("FAT disk full, read record TS file from FAT", "WARNING", MB_OK);
  876.             m_sbTDMB->Panels->Items[TDMB_STATUS_BAR_INDEX_STATUS]->Text = "  read record TS file from FAT progressing ";
  877.             m_TDMB_RF_Obj.ConfirmCallback = ::CNF_TDMB_StopService;
  878.             m_TDMB_RF_Obj.REQ_Stop_Service_Start();
  879.             m_tmGetFile->Enabled = true;
  880.             CurrentPageLock();
  881.         }    
  882.     }
  883. }
  884. //---------------------------------------------------------------------------
  885. //---------------------------------------------------------------------------