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

MTK

开发平台:

C++ Builder

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2001
  8. *
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  *
  12.  * Filename:
  13.  * ---------
  14.  *   misc_wifi.cpp
  15.  *
  16.  * Project:
  17.  * --------
  18.  *   Maui META APP
  19.  *
  20.  * Description:
  21.  * ------------
  22.  *  WiFi Misc. function source
  23.  *
  24.  * Author:
  25.  * -------
  26.  *  Andy Ueng (mtk00490)
  27.  *
  28.  *============================================================================
  29.  *             HISTORY
  30.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  31.  *------------------------------------------------------------------------------
  32.  * $Revision$
  33.  * $Modtime$
  34.  * $Log$
  35.  * 
  36.  *------------------------------------------------------------------------------
  37.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  38.  *============================================================================
  39.  ****************************************************************************/
  40. #include <vcl.h>
  41. #include <math.h>
  42.  
  43. #pragma hdrstop
  44. #ifndef META_DLL_H
  45. #include "meta.h"
  46. #endif
  47. #ifndef  _MAN_ERROR_H_
  48. #include "man_error.h"
  49. #endif
  50. #ifndef  _FT_UTILS_H_
  51. #include "ft_utils.h"
  52. #endif
  53. #ifndef  _WIFI_COMMON_H_
  54. #include "wifi_common.h"
  55. #endif
  56. //============================================================================
  57. double d_WIFI_802_11B_TX_RATE[] =
  58. {
  59.     1,
  60.     2,
  61.     5.5,
  62.    11
  63. };
  64. double d_WIFI_802_11AG_TX_RATE[] =
  65. {
  66.     6,
  67.     9,
  68.    12,
  69.    18,
  70.    24,
  71.    36,
  72.    48,
  73.    54
  74. };
  75. //==============================================================================
  76. //////////////////////////////        WiFi        //////////////////////////////
  77. //==============================================================================
  78. bool  AnsiString_To_MACAddress( AnsiString ansi_str, WiFi_MacAddress_S &out_value)
  79. {
  80.    /* check if each char is valid */
  81.    {  int   i;
  82.       char  ch;
  83.       char  str[256];
  84.       int   str_len = ansi_str.Length();
  85.       if(str_len==0)  return(false);
  86.       strcpy( str, ansi_str.c_str() );
  87.       for( i=0; i<str_len; i++ )
  88.       {  ch = str[i];
  89.          if( ((ch>='0')&&(ch<='9')) || (ch=='+') || (ch=='-') || (ch==' ') )   continue;
  90.          break;
  91.       }
  92.       if( i!=str_len )
  93.          return(false);
  94.    }
  95.    /* convert string to integer */
  96.    double d_out_value = atof(ansi_str.c_str());
  97.    if( d_out_value >= pow(2.0, 48) )  return false;
  98.    for( int i=0; i<sizeof(out_value.mac_addr)/sizeof(out_value.mac_addr[0]); i++ )
  99.    {
  100.        out_value.mac_addr[i] = ansi_str.SubString(i+1,1).ToInt();
  101.    }
  102.    return true;
  103. }
  104. //---------------------------------------------------------------------------
  105. bool AnsiString_Hex_To_MACAddress(AnsiString ansi_str, WiFi_MacAddress_S &out_value)
  106. {
  107.     char  str[256];
  108.     long  val;
  109.     int   i;
  110.     /* check if each char is valid */
  111.     char  ch;
  112.     int   str_len = ansi_str.Length();
  113.     if(str_len==0)  return(false);
  114.     strcpy( str, ansi_str.c_str() );
  115.     for( i=0; i<str_len; i++ )
  116.     {
  117.         val = 0;
  118.         ch = str[i];
  119.         if( (ch>='0')&&(ch<='9') )
  120.         {  //val <<= 4;
  121.            val += ch-'0';
  122.         }
  123.         else if( (ch>='A')&&(ch<='F') )
  124.         {  //val <<= 4;
  125.            val += ch-'A'+10;
  126.         }
  127.         else if( (ch>='a')&&(ch<='f') )
  128.         {  //val <<= 4;
  129.            val += ch-'a'+10;
  130.         }
  131.         else if( ch==' ' )
  132.         {
  133.         }
  134.         else
  135.         {  break;
  136.         }
  137.         out_value.mac_addr[i] = val;
  138.         continue;
  139.     }
  140.     if( i!=str_len )
  141.         return(false);
  142.     for( ; i<sizeof(out_value.mac_addr)/sizeof(out_value.mac_addr[0]); i++ )
  143.     {
  144.          out_value.mac_addr[i] = 0;
  145.     }
  146.     return true;
  147. }
  148. //----------------------------------------------------------------------------
  149. bool IsValidDecWiFiBBChipID(AnsiString ansi_str, unsigned short &chip_id)
  150. {
  151.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedShort(ansi_str, chip_id, 0, 65535), RANGE_ERR_WIFI_BB_CHIP_ID);
  152.     return true;
  153. }
  154. //----------------------------------------------------------------------------
  155. bool IsValidHexWiFiBBChipID(AnsiString ansi_str, unsigned short &chip_id)
  156. {
  157.     RANGE_CHECK_ERROR( !AnsiString_Hex_To_UnsignedShort( ansi_str, chip_id ) , RANGE_ERR_WIFI_BB_CHIP_ID );
  158.     
  159.     return true;
  160. }
  161. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  162. bool IsValidDecWiFiRFChipID(AnsiString ansi_str, unsigned short &chip_id)
  163. {
  164.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedShort(ansi_str, chip_id, 0, 65535), RANGE_ERR_WIFI_RF_CHIP_ID);
  165.     return true;
  166. }
  167. //----------------------------------------------------------------------------
  168. bool IsValidHexWiFiRFChipID(AnsiString ansi_str, unsigned short &chip_id)
  169. {
  170.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedShort(ansi_str, chip_id), RANGE_ERR_WIFI_RF_CHIP_ID);
  171.     return true;
  172. }
  173. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  174. bool IsValidDecWiFiSN(AnsiString ansi_str, unsigned int &sn)
  175. {
  176.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, sn, 0, 4294967295), RANGE_ERR_WIFI_SN);
  177.     return true;
  178. }
  179. //----------------------------------------------------------------------------
  180. bool IsValidHexWiFiSN(AnsiString ansi_str, unsigned int &sn)
  181. {
  182.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedInt(ansi_str, sn), RANGE_ERR_WIFI_SN);
  183.     return true;
  184. }
  185. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  186. bool IsValidDecWiFiMACAddress(AnsiString ansi_str, unsigned char &mac_addr_char)
  187. {
  188.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, mac_addr_char, 0, 255), RANGE_ERR_WIFI_MAC_ADDRESS);
  189.     return true;
  190. }
  191. //----------------------------------------------------------------------------
  192. bool IsValidHexWiFiMACAddress(AnsiString ansi_str, unsigned char &mac_addr_char)
  193. {
  194.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, mac_addr_char, 0, 255), RANGE_ERR_WIFI_MAC_ADDRESS);
  195.     return true;
  196. }
  197. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  198. bool IsValidDecWiFiBBRegAddr(AnsiString ansi_str, unsigned int &addr)
  199. {
  200.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, addr, 0, 4294967295), RANGE_ERR_WIFI_BB_REG_ADDR);
  201.     return  true;
  202. }
  203. //---------------------------------------------------------------------------
  204. bool IsValidHexWiFiBBRegAddr(AnsiString ansi_str, unsigned char &addr)
  205. {
  206.    RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, addr, 0, 255), RANGE_ERR_WIFI_BB_REG_ADDR);
  207.    return  true;
  208. }
  209. //---------------------------------------------------------------------------
  210. bool IsValidDecWiFiBBRegValue(AnsiString ansi_str, unsigned char &value)
  211. {
  212.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, value, 0, 255) , RANGE_ERR_WIFI_BB_REG_VALUE);
  213.     return true;
  214. }
  215. //---------------------------------------------------------------------------
  216. bool IsValidHexWiFiBBRegValue(AnsiString ansi_str, unsigned char &value)
  217. {
  218.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, value, 0, 255), RANGE_ERR_WIFI_BB_REG_VALUE);
  219.     return true;
  220. }
  221. //--------------------------------------------------------------------------
  222. bool IsValidHexWiFiMacRegAddr(AnsiString ansi_str, unsigned int &addr)
  223. {
  224.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedInt(ansi_str, addr ), RANGE_ERR_WIFI_MAC_REG_ADDR);
  225.     return  true;
  226. }
  227. //---------------------------------------------------------------------------
  228. bool IsValidDecWiFiMacRegValue(AnsiString ansi_str, unsigned int &value)
  229. {
  230.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, value, 0, 4294967295), RANGE_ERR_WIFI_MAC_REG_VALUE);
  231.     return true;
  232. }
  233. //---------------------------------------------------------------------------
  234. bool IsValidHexWiFiMacRegValue(AnsiString ansi_str, unsigned int &value)
  235. {
  236.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedInt(ansi_str, value), RANGE_ERR_WIFI_MAC_REG_VALUE);
  237.     return true;
  238. }
  239. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  240. bool IsValidDecWiFiMacReg16Value(AnsiString ansi_str, unsigned short &value)
  241. {
  242.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedShort(ansi_str, value, 0, 65536), RANGE_ERR_WIFI_MAC_REG_VALUE);
  243.     return true;
  244. }
  245. //---------------------------------------------------------------------------
  246. bool IsValidHexWiFiMacReg16Value(AnsiString ansi_str, unsigned short &value)
  247. {
  248.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedShort(ansi_str, value), RANGE_ERR_WIFI_MAC_REG_VALUE);
  249.     return true;
  250. }
  251. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  252. bool IsValidHexWiFiEERegAddr(AnsiString ansi_str, unsigned int &addr)
  253. {
  254.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedInt(ansi_str, addr), RANGE_ERR_WIFI_EE_ADDR);
  255.     return  true;
  256. }
  257. //---------------------------------------------------------------------------
  258. bool IsValidDecWiFiEERegValue(AnsiString ansi_str, unsigned short &value)
  259. {
  260.     RANGE_CHECK_ERROR( !AnsiString_To_UnsignedShort(ansi_str, value, 0, 65535), RANGE_ERR_WIFI_EE_VALUE);
  261.     return true;
  262. }
  263. //---------------------------------------------------------------------------
  264. bool IsValidHexWiFiEERegValue(AnsiString ansi_str, unsigned short &value)
  265. {
  266.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedShort(ansi_str, value), RANGE_ERR_WIFI_EE_VALUE);
  267.     return true;
  268. }
  269. //----------------------------------------------------------------------------
  270. bool IsValidWiFiPacketLength(AnsiString ansi_str, unsigned int &pkt_length)
  271. {
  272.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, pkt_length, 0, 6000), RANGE_ERR_WIFI_PACKET_LENGTH);
  273.     return true;
  274. }
  275. //----------------------------------------------------------------------------
  276. bool IsValidWiFiPacketCount(AnsiString ansi_str, unsigned int &pkt_count)
  277. {
  278.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, pkt_count, 0, 4294967295), RANGE_ERR_WIFI_PACKET_COUNT);
  279.     return true;
  280. }
  281. //----------------------------------------------------------------------------
  282. bool IsValidWiFiPacketInterval(AnsiString ansi_str, unsigned int &pkt_interval)
  283. {
  284.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, pkt_interval, 0, 4294967295), RANGE_ERR_WIFI_PACKET_INTERVAL);
  285.     return true;
  286. }
  287. //----------------------------------------------------------------------------
  288. bool IsValidDecWiFiTxPowerDac(AnsiString ansi_str, unsigned char &dac)
  289. {
  290.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, dac, 0, 63), RANGE_ERR_WIFI_TX_POWER_DAC);
  291.     return true;
  292. }
  293. //----------------------------------------------------------------------------
  294. bool IsValidHexWiFiTxPowerDac(AnsiString ansi_str, unsigned char &dac)
  295. {
  296.     RANGE_CHECK_ERROR( !AnsiString_Hex_To_UnsignedChar(ansi_str, dac, 0, 63), RANGE_ERR_WIFI_TX_POWER_DAC);
  297.     return true;
  298. }
  299. //----------------------------------------------------------------------------
  300. bool IsValidDecWiFiTxDcOffset(AnsiString ansi_str, unsigned char &txdc)
  301. {
  302.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, txdc, 0, 255), RANGE_ERR_WIFI_TX_DC_OFFSET);
  303.     return true;
  304. }
  305. //----------------------------------------------------------------------------
  306. bool IsValidHexWiFiTxDcOffset(AnsiString ansi_str, unsigned char &txdc)
  307. {
  308.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, txdc, 0, 255), RANGE_ERR_WIFI_TX_DC_OFFSET);
  309.     return true;
  310. }
  311. //----------------------------------------------------------------------------
  312. bool IsValidHexWiFiMacHeaderFrameCtrl(AnsiString ansi_str, unsigned char &frame_ctrl)
  313. {
  314.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, frame_ctrl, 0, 255), RANGE_ERR_WIFI_MAC_HEADER_FRAME_CTRL);
  315.     return true;
  316. }
  317. //----------------------------------------------------------------------------
  318. bool IsValidHexWiFiMacHeaderDuration(AnsiString ansi_str, unsigned char &duration)
  319. {
  320.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, duration, 0, 255), RANGE_ERR_WIFI_MAC_HEADER_DURATION);
  321.     return true;
  322. }
  323. //----------------------------------------------------------------------------
  324. bool IsValidHexWiFiMacHeaderAddress(AnsiString ansi_str, unsigned char &addr)
  325. {
  326.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, addr, 0, 255), RANGE_ERR_WIFI_MAC_HEADER_ADDRESS);
  327.     return true;
  328. }
  329. //----------------------------------------------------------------------------
  330. bool IsValidHexWiFiMacHeaderSeqCtrl(AnsiString ansi_str, unsigned char &seq_ctrl)
  331. {
  332.     RANGE_CHECK_ERROR(!AnsiString_Hex_To_UnsignedChar(ansi_str, seq_ctrl, 0, 255), RANGE_ERR_WIFI_MAC_HEADER_SEQ_CTRL);
  333.     return true;
  334. }
  335. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  336. // ALC
  337. bool IsValidWiFiTxAlcCCK(AnsiString ansi_str, unsigned char &tx_alc)
  338. {
  339.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, tx_alc, 0, 255), RANGE_ERR_WIFI_TX_ALC_CCK);
  340.     return true;
  341. }
  342. //----------------------------------------------------------------------------
  343. bool IsValidWiFiTxOutputPowerDbCCK(AnsiString ansi_str, unsigned char &output_power)
  344. {
  345.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, output_power, 0, 255), RANGE_ERR_WIFI_TX_OUTPUT_POWER_DB_CCK);
  346.     return true;
  347. }
  348. //---------------------------------------------------------------------------
  349. bool IsValidWiFiTxAlcOFDM(AnsiString ansi_str, unsigned char &tx_alc)
  350. {
  351.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, tx_alc, 0, 255), RANGE_ERR_WIFI_TX_ALC_OFDM);
  352.     return true;
  353. }
  354. //----------------------------------------------------------------------------
  355. bool IsValidWiFiTxOutputPowerDbOFDM(AnsiString ansi_str, unsigned char &output_power)
  356. {
  357.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, output_power, 0, 255), RANGE_ERR_WIFI_TX_OUTPUT_POWER_DB_OFDM);
  358.     return true;
  359. }
  360. //---------------------------------------------------------------------------
  361. bool IsValidWiFiAlcOffset(AnsiString ansi_str, char &offset)
  362. {
  363.     RANGE_CHECK_ERROR(!AnsiString_To_char(ansi_str, offset, -128, 127), RANGE_ERR_WIFI_ALC_OFFSET);
  364.     return true;
  365. }
  366. //---------------------------------------------------------------------------
  367. bool IsValidWiFiTargetALC(AnsiString ansi_str, unsigned int &alc)
  368. {
  369.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedInteger(ansi_str, alc, 0, 255), RANGE_ERR_WIFI_TARGET_ALC);
  370.     return true;
  371. }
  372. //---------------------------------------------------------------------------
  373. bool IsValidWiFiAlcSlopeDivider(AnsiString ansi_str, unsigned char &alc_slope_divider)
  374. {
  375.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, alc_slope_divider, 1, 100), RANGE_ERR_WIFI_ALC_SLOPE_DIVIDER);
  376.     return true;
  377. }
  378. //---------------------------------------------------------------------------
  379. bool IsValidWiFiAlcSlopeDividend(AnsiString ansi_str, unsigned char &alc_slope_dividend)
  380. {
  381.     RANGE_CHECK_ERROR(!AnsiString_To_UnsignedChar(ansi_str, alc_slope_dividend, 1, 100), RANGE_ERR_WIFI_ALC_SLOPE_DIVIDEND);
  382.     return true;
  383. }
  384. //===========================================================================
  385. //////////////////////////////  Format transform   //////////////////////////
  386. //===========================================================================
  387. bool MACAddress_To_Str(WiFi_MacAddress_S mac_addr, AnsiString &as_str)
  388. {
  389.     as_str = "";
  390.     int mac_addr_size = sizeof(mac_addr.mac_addr)/sizeof(mac_addr.mac_addr[0]);
  391.     for( int i=0; i<mac_addr_size; i++ )
  392.     {
  393.         if( i != mac_addr_size-1 )
  394.         {
  395.             as_str += IntToStr( mac_addr.mac_addr[mac_addr_size-i-1] )+":";
  396.         }
  397.         else
  398.         {
  399.             as_str += IntToStr( mac_addr.mac_addr[mac_addr_size-i-1] );
  400.         }
  401.     }
  402.     return true;
  403. }
  404. //---------------------------------------------------------------------------
  405. bool Str_To_MACAddress(AnsiString as_str, WiFi_MacAddress_S &mac_addr)
  406. {
  407.     char str[256];
  408.     WiFi_MacAddress_S temp_mac_addr;
  409.     strcpy( str, as_str.c_str() );
  410.     int mac_address_len = sizeof(mac_addr.mac_addr)/sizeof(mac_addr.mac_addr[0]);
  411.     String_To_Array_UnsignedChar( str, temp_mac_addr.mac_addr, mac_address_len );
  412.     for( int i=0; i<mac_address_len; i++ )
  413.     {
  414.         mac_addr.mac_addr[i] = temp_mac_addr.mac_addr[mac_address_len-i-1];
  415.     }
  416.     return true;
  417. }
  418. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  419. unsigned int GetWiFiChannelFreqFromStr(AnsiString as_str)
  420. {
  421.     unsigned int ch_freq;
  422.     int begin_pos, end_pos;
  423.     begin_pos = as_str.AnsiPos( "(" ) + 1;
  424.     end_pos   = as_str.AnsiPos( ")" ) - 1;
  425.     as_str = as_str.SubString( begin_pos, end_pos - begin_pos + 1 );
  426.     ch_freq = as_str.ToInt();
  427.     return ch_freq;
  428. }
  429. const unsigned int WIFI_802_11BG_CHANNEL_FREQ_KHZ[] =
  430. {
  431.     2412000,
  432.     2417000,
  433.     2422000,
  434.     2427000,
  435.     2432000,
  436.     2437000,
  437.     2442000,
  438.     2447000,
  439.     2452000,
  440.     2457000,
  441.     2462000,
  442.     2467000,
  443.     2472000,
  444.     2484000
  445. };
  446. const unsigned int WIFI_802_11A_CHANNEL_FREQ_KHZ[] =
  447. {
  448.     5040000,
  449.     5060000,
  450.     5080000,
  451.     5170000,
  452.     5180000,
  453.     5190000,
  454.     5200000,
  455.     5210000,
  456.     5220000,
  457.     5230000,
  458.     5240000,
  459.     5260000,
  460.     5280000,
  461.     5300000,
  462.     5320000,
  463.     5500000,
  464.     5520000,
  465.     5540000,
  466.     5560000,
  467.     5580000,
  468.     5600000,
  469.     5620000,
  470.     5640000,
  471.     5660000,
  472.     5680000,
  473.     5700000,
  474.     5745000,
  475.     5765000,
  476.     5785000,
  477.     5805000,
  478.     4920000,
  479.     4940000,
  480.     4960000,
  481.     4980000
  482. };
  483. //---------------------------------------------------------------------------
  484. unsigned int GetWiFiChannelFrequency(E_WIFI_GENERATION _802_11_type, int idx)
  485. {
  486.     unsigned int freq;
  487.     if( WIFI_802_11A_IDX != _802_11_type ) // 802.11b, 802.11g
  488.     {
  489.         freq = WIFI_802_11BG_CHANNEL_FREQ_KHZ[idx];
  490.     }
  491.     else
  492.     {
  493.         freq = WIFI_802_11A_CHANNEL_FREQ_KHZ[idx];
  494.     }
  495.     return freq;
  496. }
  497. //---------------------------------------------------------------------------
  498. bool GetWiFiChannelIndexFromStr(AnsiString as_channel, AnsiString as_txrate, E_WIFI_GENERATION &wifi_802_11_idx, unsigned int &chan_idx)
  499. {
  500.     AnsiString asWIFI_802_11B_TX_RATE_MHZ[] =
  501.     {
  502.         "1",
  503.         "2",
  504.         "5.5",
  505.         "11"
  506.     };
  507.     unsigned int chan_freq = GetWiFiChannelFreqFromStr( as_channel );
  508.     int i, j;
  509.     for( i=0; i<sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ[0]); i++ )
  510.     {
  511.         if( chan_freq == WIFI_802_11BG_CHANNEL_FREQ_KHZ[i] )
  512.         {
  513.             chan_idx = i;
  514.             for (j=0; j<4; j++)
  515.             {
  516.                 if( as_txrate.AnsiCompareIC(asWIFI_802_11B_TX_RATE_MHZ[j]) == 0 )
  517.                 {
  518.                     wifi_802_11_idx = WIFI_802_11B_IDX;
  519.                     return true;
  520.                 }
  521.             }
  522.             wifi_802_11_idx = WIFI_802_11G_IDX;
  523.             return true;
  524.         }
  525.     }
  526.     for( i=0; i<sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ[0]); j++ )
  527.     {
  528.         if( chan_freq == WIFI_802_11A_CHANNEL_FREQ_KHZ[i] )
  529.         {
  530.             chan_idx = i;
  531.             wifi_802_11_idx = WIFI_802_11A_IDX;
  532.             return true;
  533.         }
  534.     }
  535.     return false;
  536. }
  537. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  538. static AnsiString asWIFI_802_11ABG_TX_RATE_MHZ[] =
  539. {
  540.     "1",
  541.     "2",
  542.     "5.5",
  543.     "11",
  544.     "6",
  545.     "9",
  546.     "12",
  547.     "18",
  548.     "24",
  549.     "36",
  550.     "48",
  551.     "54"
  552. };
  553. //---------------------------------------------------------------------------
  554. unsigned int GetWiFiTxRateFromStr(AnsiString as_str)
  555. {
  556.     unsigned int tx_rate=0;
  557.     for( int i=0; i<WIFI_OFDM_TX_RATE_NUM; i++ )
  558.     {
  559.         if( as_str.AnsiCompareIC(asWIFI_802_11ABG_TX_RATE_MHZ[i]) == 0 )
  560.         {
  561.             tx_rate = i;
  562.             break;
  563.         }
  564.     }
  565.     return tx_rate;
  566. }
  567. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  568. bool IsValidWiFiTxRate(E_WIFI_GENERATION wifi_gen, double d_tx_rate)
  569. {
  570.     bool match = false;
  571.     switch (wifi_gen)
  572.     {
  573.         case WIFI_802_11A_IDX:
  574.         case WIFI_802_11G_IDX:
  575.         {
  576.             for (int i=0; i<sizeof(d_WIFI_802_11AG_TX_RATE)/sizeof(d_WIFI_802_11AG_TX_RATE[0]); i++)
  577.             {
  578.                 if (d_tx_rate == d_WIFI_802_11AG_TX_RATE[i])
  579.                 {
  580.                     match = true;
  581.                 }
  582.             }
  583.         }
  584.         break;
  585.         case WIFI_802_11B_IDX:
  586.         {
  587.             for (int i=0; i<sizeof(d_WIFI_802_11B_TX_RATE)/sizeof(d_WIFI_802_11B_TX_RATE[0]); i++)
  588.             {
  589.                 if (d_tx_rate == d_WIFI_802_11B_TX_RATE[i])
  590.                 {
  591.                     match = true;
  592.                 }
  593.             }
  594.         }
  595.         break;
  596.         default:
  597.         {
  598.             return false;
  599.         }
  600.     }
  601.     return match;
  602. }
  603. //===========================================================================
  604. bool IsWiFiSupported(AnsiString as_802_11, E_WIFI_GENERATION e_802_11_idx)
  605. {
  606.     int i = as_802_11.ToInt();
  607.     bool b_support;
  608.     switch (e_802_11_idx)
  609.     {
  610.         case WIFI_802_11A_IDX:
  611.         {
  612.             if (i & 0x01)
  613.             {
  614.                b_support = true;
  615.             }
  616.             else
  617.             {
  618.                b_support = false;
  619.             }
  620.         }
  621.         break;
  622. case WIFI_802_11B_IDX:
  623.         {
  624.             if (i & 0x02)
  625.             {
  626.                b_support = true;
  627.             }
  628.             else
  629.             {
  630.                b_support = false;
  631.             }
  632.         }
  633.         break;
  634. case WIFI_802_11G_IDX:
  635.         {
  636.             if (i & 0x04)
  637.             {
  638.                b_support = true;
  639.             }
  640.             else
  641.             {
  642.                b_support = false;
  643.             }
  644.         }
  645.         break;
  646.         default:
  647.         {
  648.             b_support = false;
  649.         }
  650.         break;
  651.     } // switch
  652.     return b_support;
  653. }
  654. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  655. bool GetWiFiTxRate(double d_tx_rate_mhz, WiFi_TestRate_E &e_tx_rate)
  656. {
  657.     if (1 == d_tx_rate_mhz)
  658.     {
  659.         e_tx_rate = WIFI_TEST_RATE_1M;
  660.     }
  661.     else if (2 == d_tx_rate_mhz)
  662.     {
  663.         e_tx_rate = WIFI_TEST_RATE_2M;
  664.     }
  665.     else if (5.5 == d_tx_rate_mhz)
  666.     {
  667.         e_tx_rate = WIFI_TEST_RATE_5_5M;
  668.     }
  669.     else if (11 == d_tx_rate_mhz)
  670.     {
  671.         e_tx_rate = WIFI_TEST_RATE_11M;
  672.     }
  673.     else if (6 == d_tx_rate_mhz)
  674.     {
  675.         e_tx_rate = WIFI_TEST_RATE_6M;
  676.     }
  677.     else if (9 == d_tx_rate_mhz)
  678.     {
  679.         e_tx_rate = WIFI_TEST_RATE_9M;
  680.     }
  681.     else if (12 == d_tx_rate_mhz)
  682.     {
  683.         e_tx_rate = WIFI_TEST_RATE_12M;
  684.     }
  685.     else if (18 == d_tx_rate_mhz)
  686.     {
  687.         e_tx_rate = WIFI_TEST_RATE_18M;
  688.     }
  689.     else if (24 == d_tx_rate_mhz)
  690.     {
  691.         e_tx_rate = WIFI_TEST_RATE_24M;
  692.     }
  693.     else if (36 == d_tx_rate_mhz)
  694.     {
  695.         e_tx_rate = WIFI_TEST_RATE_36M;
  696.     }
  697.     else if (48 == d_tx_rate_mhz)
  698.     {
  699.         e_tx_rate = WIFI_TEST_RATE_48M;
  700.     }
  701.     else if (54 == d_tx_rate_mhz)
  702.     {
  703.         e_tx_rate = WIFI_TEST_RATE_54M;
  704.     }
  705.     else
  706.     {
  707.         return false;
  708.     }
  709.     return true;
  710. }
  711. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  712. int GetWiFiRemainChannels(E_WIFI_GENERATION wifi_gen, S_WIFI_CH_FREQ_MHZ org_ch_freq_mhz, S_WIFI_CH_FREQ_MHZ &remain_ch_freq_mhz)
  713. {
  714.     int ch_num = 0;
  715.     bool match;
  716.     switch (wifi_gen)
  717.     {
  718.         case WIFI_802_11A_IDX:
  719.         {
  720.             for (int i=0; i<sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ[0]); i++)
  721.             {
  722.                 for (int j=0; j<org_ch_freq_mhz.ch_num; j++)
  723.                 {
  724.                     match = false;
  725.                     if ((org_ch_freq_mhz.ch_freq_MHz[j]*1000) == WIFI_802_11A_CHANNEL_FREQ_KHZ[i])
  726.                     {
  727.                         match = true;
  728.                         break;
  729.                     }
  730.                 }
  731.                 if (!match)
  732.                 {
  733.                     remain_ch_freq_mhz.ch_freq_MHz[ch_num] = WIFI_802_11A_CHANNEL_FREQ_KHZ[i]/1000;
  734.                     ch_num++;
  735.                 }
  736.             }
  737.         }
  738.         break;
  739.         case WIFI_802_11B_IDX:
  740.         case WIFI_802_11G_IDX:
  741.         {
  742.             for (int i=0; i<sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ[0]); i++)
  743.             {
  744.                 for (int j=0; j<org_ch_freq_mhz.ch_num; j++)
  745.                 {
  746.                     match = false;
  747.                     if ((org_ch_freq_mhz.ch_freq_MHz[j]*1000) == WIFI_802_11BG_CHANNEL_FREQ_KHZ[i])
  748.                     {
  749.                         match = true;
  750.                         break;
  751.                     }
  752.                 }
  753.                 if (!match)
  754.                 {
  755.                     remain_ch_freq_mhz.ch_freq_MHz[ch_num] = WIFI_802_11BG_CHANNEL_FREQ_KHZ[i]/1000;
  756.                     ch_num++;
  757.                 }
  758.             }
  759.         }
  760.         break;
  761.         default:
  762.         {
  763.             ch_num = 0;
  764.         }
  765.         break;
  766.     }
  767.     return ch_num;
  768. }
  769. //--------------------------------------------------------------------------
  770. int GetWiFiNVRAMChannelIndex(E_WIFI_GENERATION wifi_gen, unsigned int ch_freq_mhz)
  771. {
  772.     int nvram_ch_index = -1;
  773.     unsigned int ch_freq_kHz = ch_freq_mhz * 1000;
  774.     switch (wifi_gen)
  775.     {
  776.         case WIFI_802_11A_IDX:
  777.         {
  778.             for (int j=0; j<sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11A_CHANNEL_FREQ_KHZ[0]); j++)
  779.             {
  780.                 if (ch_freq_kHz == WIFI_802_11A_CHANNEL_FREQ_KHZ[j])
  781.                 {
  782.                     nvram_ch_index = j;
  783.                     break;
  784.                 }
  785.             }
  786.         }
  787.         break;
  788.         case WIFI_802_11B_IDX:
  789.         case WIFI_802_11G_IDX:
  790.         {
  791.             for (int j=0; j<sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ)/sizeof(WIFI_802_11BG_CHANNEL_FREQ_KHZ[0]); j++)
  792.             {
  793.                 if(ch_freq_kHz == WIFI_802_11BG_CHANNEL_FREQ_KHZ[j])
  794.                 {
  795.                     nvram_ch_index = j;
  796.                     break;
  797.                 }
  798.             }
  799.         }
  800.         break;
  801.         default:
  802.         {
  803.             nvram_ch_index = -1;
  804.         }
  805.         break;
  806.     }
  807.     return nvram_ch_index;
  808. }
  809. //----------------------------------------------------------------------------
  810. bool GetWiFiTwoClosetNVRAMChannelIndex(E_WIFI_GENERATION wifi_gen, unsigned int ch_freq_MHz, S_WIFI_CH_FREQ_MHZ s_ch_freq_MHz, int &first_ch_index, int &second_ch_index)
  811. {
  812.     int nvram_ch_index = GetWiFiNVRAMChannelIndex(wifi_gen, ch_freq_MHz);
  813.     bool found_first = false;
  814.     bool found_second = false;
  815.     unsigned int ui_first_ch_MHz;
  816.     unsigned int ui_second_ch_MHz;
  817.     int ch_num;
  818.     int i;
  819.     switch (wifi_gen)
  820.     {
  821.         case WIFI_802_11A_IDX:
  822.         {
  823.             ch_num = NUM_TX_POWER_5000M_CH;
  824.         }
  825.         break;
  826.         case WIFI_802_11B_IDX:
  827.         case WIFI_802_11G_IDX:
  828.         {
  829.             ch_num = NUM_TX_POWER_2400M_CH;
  830.         }
  831.         break;
  832.         default:
  833.         {
  834.             return false;
  835.         }
  836.     }
  837.     if (0 == nvram_ch_index)
  838.     {
  839.         first_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, s_ch_freq_MHz.ch_freq_MHz[0]);
  840.         second_ch_index = GetWiFiNVRAMChannelIndex(wifi_gen, s_ch_freq_MHz.ch_freq_MHz[1]);
  841.     }
  842.     else if (ch_num-1 == nvram_ch_index)
  843.     {
  844.         first_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, s_ch_freq_MHz.ch_freq_MHz[s_ch_freq_MHz.ch_num-2]);
  845.         second_ch_index = GetWiFiNVRAMChannelIndex(wifi_gen, s_ch_freq_MHz.ch_freq_MHz[s_ch_freq_MHz.ch_num-1]);
  846.     }
  847.     else
  848.     {
  849.         found_first = false;
  850.         for (i=0; i<s_ch_freq_MHz.ch_num; i++)
  851.         {
  852.             if (s_ch_freq_MHz.ch_freq_MHz[i] > ch_freq_MHz)
  853.             {
  854.                 found_first = true;
  855.                 break;
  856.             }
  857.         }
  858.         if (found_first)
  859.         {
  860.             ui_first_ch_MHz = s_ch_freq_MHz.ch_freq_MHz[i];
  861.             first_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, ui_first_ch_MHz);
  862.             found_second = false;
  863.             for (i=s_ch_freq_MHz.ch_num-1; i>=0; i--)
  864.             {
  865.                 if (s_ch_freq_MHz.ch_freq_MHz[i] < ch_freq_MHz)
  866.                 {
  867.                     found_second = true;
  868.                     break;
  869.                 }
  870.             }
  871.             if (found_second)
  872.             {
  873.                 ui_second_ch_MHz = s_ch_freq_MHz.ch_freq_MHz[i];
  874.                 second_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, ui_second_ch_MHz);
  875.             }
  876.             else
  877.             {
  878.                 for (i=0; i<s_ch_freq_MHz.ch_num; i++)
  879.                 {
  880.                     if (s_ch_freq_MHz.ch_freq_MHz[i] > ui_first_ch_MHz)
  881.                     {
  882.                         found_second = true;
  883.                         break;
  884.                     }
  885.                 }
  886.                 ui_second_ch_MHz = s_ch_freq_MHz.ch_freq_MHz[i];
  887.                 second_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, ui_second_ch_MHz);
  888.             }
  889.         }
  890.         else // not found_first
  891.         {
  892.             for (i=s_ch_freq_MHz.ch_num-1; i>=0; i--)
  893.             {
  894.                 if (s_ch_freq_MHz.ch_freq_MHz[i] < ch_freq_MHz)
  895.                 {
  896.                     found_first = true;
  897.                     break;
  898.                 }
  899.             }
  900.             ui_first_ch_MHz = s_ch_freq_MHz.ch_freq_MHz[i];
  901.             first_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, ui_first_ch_MHz);
  902.             found_second = false;
  903.             for (i=s_ch_freq_MHz.ch_num-1; i>=0; i--)
  904.             {
  905.                 if (s_ch_freq_MHz.ch_freq_MHz[i] < ui_first_ch_MHz)
  906.                 {
  907.                     found_second = true;
  908.                     break;
  909.                 }
  910.             }
  911.             if (found_second)
  912.             {
  913.                 ui_second_ch_MHz = s_ch_freq_MHz.ch_freq_MHz[i];
  914.                 second_ch_index  = GetWiFiNVRAMChannelIndex(wifi_gen, ui_second_ch_MHz);
  915.             }
  916.         }
  917.     }
  918.     return (found_first && found_second);
  919. }