2013年1月30日 星期三

WIFI signal percentage與dbm互轉

因RTL8192CU與RT5370在iwlist [interface] scanning 回傳的訊息中,signal level的回傳值RTL8192CU使用percentage,而RT5370卻是以DB表示,所以為了統一UI上顯示的訊息,所以將signal level轉為percentage表示。

percentage to dbm:
在RTL8192CU的driver中有段程式碼將percentage to dbm(rtw_recv.h),程式碼如下:

__inline static s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
{
s32 SignalPower; // in dBm.

// Translate to dBm (x=0.5y-95).
SignalPower = (s32)((SignalStrengthIndex + 1) >> 1);
SignalPower -= 95;

return SignalPower;
}

dbm to percentage:
在RT5370的driver中有段程式碼將dbm to percentage(cmm_info.c),程式碼如下:
/* Rssi*/
Rssi = (INT)pBss->Rssi;
if (Rssi >= -50)
Rssi_Quality = 100;
else if (Rssi >= -80)    /* between -50 ~ -80dbm*/
Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);
else if (Rssi >= -90)   /* between -80 ~ -90dbm*/
Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10);
else    /* < -84 dbm*/
Rssi_Quality = 0;
sprintf(msg+strlen(msg),"%-9d", Rssi_Quality);

也許有人會問怎麼不把percent to dbm的函式反轉就可以做dbm to percentage,為什麼要這麼麻煩?原本也是打算這麼做,可是實做後發現,也許是廠商不同,RT5370回傳的dbm值若是直接使用反轉的函式所得到的percentage值有時會出現超過100%的數值,所以後來還是乖乖的使用判斷的方式來將dbm to percentage。

沒有留言: