[Bugfix][T108-GSW][bug-view-1513] gsw_get_sig_info error

    Only Configure: No
    Affected branch: unknown
    Affected module: network
    Is it affected on both ZXIC and ASR: only ASR
    Self-test: yes
    Doc Update: no

Change-Id: Id04aaba64e5db630606fb4672de12e0e1c2ae890
diff --git a/mbtk/libgsw_lib/gsw_nw_interface.c b/mbtk/libgsw_lib/gsw_nw_interface.c
index 774e23b..94a7630 100755
--- a/mbtk/libgsw_lib/gsw_nw_interface.c
+++ b/mbtk/libgsw_lib/gsw_nw_interface.c
@@ -17,6 +17,8 @@
 #define MBTK_ERR_OK             0

 #define GSW_IMEI_LENGTH 20+1

 

+#define INT_32_MAX    (0x7FFFFFFF)

+

 

 #ifndef FALSE

 #define FALSE   (0)

@@ -100,7 +102,7 @@
     uint32 value3;

     uint32 value4;

     uint32 value5;

-	uint32 value6;

+    uint32 value6;

     uint32 value7;

     uint32 value8;

     uint32 value9;

@@ -414,7 +416,7 @@
 

 #define LOGE(fmt, args...) \

     do{ \

-		char *file_ptr_1001 = __FILE__; \

+        char *file_ptr_1001 = __FILE__; \

         char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

         char line_1001[10] = {0}; \

         sprintf(line_1001, "%d", __LINE__); \

@@ -667,114 +669,118 @@
     }

 }

 

-static int gsw_rssi_to_csq(int rssi)

+static int32_t rscp_convert_to_minus_dBm(uint8 rscp)

 {

-    LOGD("rssi = %d\n",rssi);

-    if(rssi >= -113 && rssi <= -51)

+    if(rscp <= 96)

     {

-        return (rssi + 113) / 2;

+        return 121-rscp; //  96 map 25

+                         //  0 map -121, below -120

     }

-

     else

     {

-        return 99;

+        return INT_32_MAX;

     }

 }

 

-static int gsw_rscp_to_csq(int rscp)

+static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)

 {

-    LOGD("rscp = %d\n",rscp);

-    if(rscp <= -25 && rscp > -120)

+    if(rsrp <= 97)

     {

-        return rscp + 120;

+        return 141-rsrp; // 97 map 44

+                         // 0  map 141 below 140

     }

     else

     {

-        return 255;

-    }

-

-}

-

-static int gsw_rsrp_to_csq(int rsrp)

-{

-    LOGD("rsrp = %d\n",rsrp);

-

-    if(rsrp <= -44 && rsrp > -140)

-    {

-        return rsrp + 140;

-    }

-

-    else

-    {

-        return 255;

+        return INT_32_MAX;

     }

 }

 

-static int rscp_convert_to_dBm(int rscp)

+static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)

 {

-    if(rscp <= 96 && rscp >= 0)

+    if(rsrq <= 34)

     {

-        return rscp - 120;

+        return  (40-rsrq)/2;  //=20-rsrq / 2;   

+                              // 34 map 3

+                              // 0 map 20

     }

     else

     {

-        return -25; 

+        return INT_32_MAX;

     }

 }

 

 

-static int8_t rssi_convert_to_dBm(uint8 rssi)

+//int ecno;        /**< Valid values are positive integers.  This value is the actual Ec/Io multiplied

+//                      * by -10.  Example: If the actual Ec/Io is -12.5 dB, then this response value

+//                      * will be 125.*/

+//uint8 ecno; // 0: Ec/Io < -24 dB

+                    // 1: -24 dB �� Ec/Io < -23.5 dB

+                    // 2: -23.5 dB �� Ec/Io < -23 dB

+                    // ......

+                    // 47: -1 dB �� Ec/Io < -0.5 dB

+                    // 48: -0.5 dB �� Ec/Io < 0 dB

+                    // 49: 0 dB �� Ec/Io

+                    // 255: not known or not detectabl

+static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)

 {

-    if(rssi <= 31)

+    if(ecno <=49)

     {

-        return rssi * 2 - 113;

+        return 245-ecno*5;   //49 map 0 db

+                            // 1 map 240 db

+                             // 0 map 245 below 240

     }

-    else

+    else 

     {

-        return -125;

+        return INT_32_MAX;

     }

 }

 

-static int16_t rsrp_convert_to_dBm(uint8 rsrp)

-{

-    if(rsrp <= 96)

-    {

-        return rsrp - 140;

-    }

-    else

-    {

-        return -44;

-    }

-}

 

-static int16_t rsrq_convert_to_dB(uint8 rsrq)

-{

-    if(rsrq >= 1 && rsrq <= 34)

-    {

-        return (rsrq + 1) / 2 - 20;

-    }

-    else

-    {

-        return  -20; 

-    }

-}

 

-static int16_t ecno_convert_to_dB(uint8 ecno)

+/* change realCsq to level */

+static int rscpToLevel(int rscp)

 {

-    if(ecno >= 48)

-    {

+

+    if (rscp < -110) {

         return 0;

+    } else if (rscp <= -95) {

+        return rscp+111;   // to 16

+    } else if (rscp >=-93 && rscp <=-90) {

+        return rscp+110;   // to 20

+    } else if (rscp >=-89 && rscp <=-59) {

+        return (rscp+152)/3; // =(rscp+89)/3+21 to 31

+    } else if (rscp ==- 94) {  // Geely requirement, -94 map 16

+        return 16;

+    } else if(rscp <= -25) {

+        return 31;

     }

-    else if(ecno == 255)

-    {

-        return 255;

-    }

-    else

-    {

-        return 48 - ecno;

-    }

+    return 99;        

 }

 

+static int rsrpToLevel(int rsrp)

+{

+    if (rsrp < -130) {

+        return 0;

+    } else if (rsrp <= -118) {

+        return (rsrp+132)/2;   // to 7

+    } else if (rsrp <=-109) {

+        return rsrp+125;      // to 16

+    } else if (rsrp <=-103) {

+        return  (rsrp+141)/2;  // =(rsrp+109)/2+16  to 19

+    } else if (rsrp <=- 85) {  

+        return (rsrp+160)/3;   // =(rsrp+103)/3+19  to 25 

+    } else if(rsrp <= -55) {

+        return (rsrp+210)/5;  // =(rsrp+85)/5+25 to 31 

+    } else if(rsrp <=-44)

+    {

+        return 31;

+    }

+    return 99;        

+}

+

+

+

+

 

 static int convert_reg_state(int reg_state_t)

 {

@@ -1096,6 +1102,53 @@
     fplmn_index--;

 }

 

+static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)

+{

+    LOGD("signal->type=%d", signal->type);

+    memset(sig_strength,0,sizeof (signalStrength_t));

+    switch(signal->type)

+    {

+        case MBTK_RADIO_TECH_E_UTRAN:

+        {

+            LOGI("rsrp = %d",signal->rsrp);

+            sig_strength->lte_sig_valid = 1;

+            sig_strength->rsrp = -rsrp_convert_to_minus_dBm(signal->rsrp);

+            sig_strength->rsrq = -rsrq_convert_to_minus_dB(signal->rsrq);

+            sig_strength->rssi =rsrpToLevel(signal->rsrp-141);

+            sig_strength->rssnr=INT_32_MAX;

+            break;

+        }

+        case MBTK_RADIO_TECH_UTRAN:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA:

+        case MBTK_RADIO_TECH_UTRAN_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:

+        case MBTK_RADIO_TECH_UTRAN_HSPA:

+        {

+            LOGI("rscp = %d",signal->rscp);

+            sig_strength->wcdma_sig_valid = 1;

+            sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);

+            sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);

+            sig_strength->rssi =rscpToLevel(signal->rscp-121);

+            break;

+        }

+        case MBTK_RADIO_TECH_GSM:

+        case MBTK_RADIO_TECH_GSM_COMPACT:

+        case MBTK_RADIO_TECH_GSM_EGPRS:

+        {

+            LOGI("g rssi = %d",signal->rssi);

+            sig_strength->gw_sig_valid = 1;

+            sig_strength->rssi = signal->rssi;

+            break;

+        }

+        default:

+        {

+            LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);

+        }

+    }

+

+}

+

+

 static void gsw_serving_info_callback_thread()

 {

     GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));

@@ -1134,56 +1187,95 @@
 

 }

 

+/*typedef struct

+{
+0    mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum

+1    uint8 rssi; // 0: 113 dBm or less

+                // 1: 111 dBm
+                // 2��30: 109��53 dBm
+                // 31: 51 dBm or greater
+                // 99: not known or not detectable
+2    uint8 rxlev;// 0:rssi < -110 dBm

+                // 1: -110 dBm �� rssi < -109 dBm
+                // 2: -109 dBm �� rssi < -108 dBm
+                // ......
+                // 61: -50 dBm �� rssi < -49 dBm
+                // 62: -49 dBm �� rssi < -48 dBm
+                // 63: -48 dBm �� rssi
+                // 99: not known or not detectable
+3    uint8 ber;  // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4

+                // 99 not known or not detectable
+4    uint8 rscp; // 0: rscp < -120 dBm

+                // 1: -120 dBm �� rscp < -119 dBm
+                // 2: -119 dBm �� rscp < -118 dBm
+                // ......
+                // 94: -27 dBm �� rscp < -26 dBm
+                // 95: -26 dBm �� rscp < -25 dBm
+                // 96: - 25 dBm �� rscp
+                // 255: not known or not detectable
+5    uint8 ecno; // 0: Ec/Io < -24 dB

+                // 1: -24 dB �� Ec/Io < -23.5 dB
+                // 2: -23.5 dB �� Ec/Io < -23 dB
+                // ......
+                // 47: -1 dB �� Ec/Io < -0.5 dB
+                // 48: -0.5 dB �� Ec/Io < 0 dB
+                // 49: 0 dB �� Ec/Io
+                // 255: not known or not detectable
+6    uint8 rsrq; // 0: rsrq < -19.5 dB

+                // 1: -19.5 dB �� rsrq < -19 dB
+                // 2: -19 dB �� rsrq < -18.5 dB
+                // ......
+                // 32: -4 dB �� rsrq < -3.5 dB
+                // 33: -3.5 dB �� rsrq < -3 dB
+                // 34: -3 dB �� rsrq
+                // 255: not known or not detectable
+7    uint8 rsrp; // 0: rsrp < -140 dBm

+                // 1: -140 dBm �� rsrp < -139 dBm
+                // 2: -139 dBm �� rsrp < -138 dBm
+                // ......
+                // 95: -46 dBm �� rsrp < -45 dBm
+                // 96: -45 dBm �� rsrp < -44 dBm
+                // 97: -44 dBm �� rsrp
+                // 255: not known or not detectable
+8    uint8 ss_rsrq; // 0: ss_rsrq < -43 dB

+                   // 1: -43 dB <= ss_rsrq < -42.5 dB
+                   // 2: -42.5 dB <= ss_rsrq < -42 dB
+                   // ......
+                   // 125: 19 dB <= ss_rsrq < 19.5 dB
+                   // 126: 19.5 dB <= ss_rsrq < 20 dB
+                   // 255: not known or not detectable
+    uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
+                   // 1: -156 dBm <= ss_rsrp < -155 dBm
+                   // 2: -155 dBm <= ss_rsrp < -154 dBm
+                   // ......
+                   // 125: -32 dBm <= ss_rsrp < -31 dBm
+                   // 126: -31 dBm <= ss_rsrp
+                   // 255: not known or not detectable
+    uint8 ss_sinr; // 0: ss_sinr < -23 dB
+                   // 1: -23 dB  ss_sinr < -22.5 dB
+                   // 2: -22.5 dB  ss_sinr < -22 dB
+                   // ......
+                   // 125: 39 dB  ss_sinr < 39.5 dBm
+                   // 126: 39.5 dB  ss_sinr < 40 dB
+                   // 127: 40 dB  ss_sinr
+                   // 255: not known or not detectable
+} __attribute__((packed)) mbtk_signal_info_t;

+*/

 static void gsw_sig_info_callback(const void* data, int data_len)

 {

-    LOGE("gsw_sig_info_callback start\n");

-

-    if(data && data_len == 8)

+    if(data && (data_len >= sizeof (mbtk_signal_info_t)))

     {

-        uint8 *net_data = (uint8*)data;

-        mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];

-

         signalStrength_t sig_strength;

-        memset(&sig_strength, 0x0, sizeof(signalStrength_t));

-

-        sig_strength.gw_sig_valid = 0;

-        sig_strength.wcdma_sig_valid = 0;

-        sig_strength.lte_sig_valid = 0;

-        sig_strength.nr_sig_valid = 0;

-

-        if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \

-           type == MBTK_RADIO_TECH_GSM_EGPRS)              //GSM

-        {

-            sig_strength.gw_sig_valid = 1;

-            sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);

-        }

-

-        else if(type == MBTK_RADIO_TECH_E_UTRAN) 

-        {

-            sig_strength.lte_sig_valid = 1;

-            sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);

-            sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);

-            sig_strength.rssnr = -99;

-        }

-

-        else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \

-                 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA ||  \

-                 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA

-        {

-            sig_strength.wcdma_sig_valid = 1;

-            sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);

-            sig_strength.ecno = ecno_convert_to_dB(net_data[5]);

-        }

-

+        convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);

+        

         if(sig_cb != NULL)

         {

             sig_cb(sig_strength);

         }

     }

-

     else

     {

-        LOGE("data is NULL\n");

+        LOGE("data is NULL or data len %d error",data_len);

     }

 }

 

@@ -1239,10 +1331,8 @@
     LOGE("gsw_reject_callback end\n");

 }

 

-

 void gsw_sig_info_timer()

 {

-    int ret = -1;

     if(nw_init_flag == 0 || nw_info_handle == NULL)

     {

         return;

@@ -1253,53 +1343,16 @@
 

     while(nw_init_flag)

     {

-        memset(&signal, 0x0, sizeof(mbtk_signal_info_t));

-        memset(&sig_strength, 0x0, sizeof(signalStrength_t));

-        ret = mbtk_net_signal_get(nw_info_handle, &signal);

+        int ret = mbtk_net_signal_get(nw_info_handle, &signal);

         if(ret != 0)

         {

-            LOGE("mbtk_net_signal_get fail\n");

+            LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);

         }

 

         else

         {

-            LOGD("signal.type=%d\n", signal.type);

-            switch(signal.type)

-            {

-                case MBTK_RADIO_TECH_GSM:

-                case MBTK_RADIO_TECH_GSM_COMPACT:

-                case MBTK_RADIO_TECH_GSM_EGPRS:

-                {

-                    LOGD("rssi = %d\n",signal.rssi);

-                    sig_strength.gw_sig_valid = 1;

-                    sig_strength.rssi = rssi_convert_to_dBm(signal.rssi);

-                    break;

-                }

-                case MBTK_RADIO_TECH_E_UTRAN:

-                {

-                    LOGD("rsrp = %d\n",signal.rsrp);

-                    sig_strength.lte_sig_valid = 1;

-                    sig_strength.rsrp = rsrp_convert_to_dBm(signal.rsrp);

-                    sig_strength.rsrq = rsrq_convert_to_dB(signal.rsrq);

-                    break;

-                }

-                case MBTK_RADIO_TECH_UTRAN:

-                case MBTK_RADIO_TECH_UTRAN_HSDPA:

-                case MBTK_RADIO_TECH_UTRAN_HSUPA:

-                case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:

-                case MBTK_RADIO_TECH_UTRAN_HSPA:

-                {

-                    LOGD("rscp = %d\n",signal.rscp);

-                    sig_strength.wcdma_sig_valid = 1;

-                    sig_strength.rscp = rssi_convert_to_dBm(signal.rscp);

-                    sig_strength.ecno = ecno_convert_to_dB(signal.ecno);

-                    break;

-                }

-                default:

-                {

-                    LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);

-                }

-            }

+            convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);

+           

         }

         

         if(sig_cb != NULL)

@@ -1909,16 +1962,13 @@
  */

 int gsw_get_sig_info(int *csq_value)

 {

-    int ret = -1;

-

     if (nw_init_flag == 0 || nw_info_handle == NULL)

     {

         return GSW_HAL_NORMAL_FAIL;

     }

 

     mbtk_signal_info_t signal;

-    memset(&signal, 0x0, sizeof(mbtk_signal_info_t));

-    ret = mbtk_net_signal_get(nw_info_handle, &signal);

+    int ret = mbtk_net_signal_get(nw_info_handle, &signal);

     if(ret != 0)

     {

         LOGE("mbtk_net_signal_get fail\n");

@@ -1928,18 +1978,11 @@
     LOGD("signal.type=%d\n", signal.type);

     switch(signal.type)

     {

-        case MBTK_RADIO_TECH_GSM:

-        case MBTK_RADIO_TECH_GSM_COMPACT:

-        case MBTK_RADIO_TECH_GSM_EGPRS:

-        {

-            LOGD("rssi = %d\n",signal.rssi);

-            *csq_value = rssi_convert_to_dBm(signal.rssi);

-            break;

-        }

+        

         case MBTK_RADIO_TECH_E_UTRAN:

         {

-            LOGD("rsrp = %d\n",signal.rsrp);

-            *csq_value = rsrp_convert_to_dBm(signal.rsrp);

+            LOGD("lte rsrp = %d dbm",signal.rsrp-141);

+            *csq_value = rsrpToLevel(signal.rsrp-141);

             break;

         }

         case MBTK_RADIO_TECH_UTRAN:

@@ -1948,13 +1991,21 @@
         case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:

         case MBTK_RADIO_TECH_UTRAN_HSPA:

         {

-            LOGD("rscp = %d\n",signal.rscp);

-            *csq_value = rscp_convert_to_dBm(signal.rscp);

+            LOGD("w rscp = %d dbm",signal.rscp-121);

+            *csq_value = rscpToLevel(signal.rscp-121);

+            break;

+        }

+        case MBTK_RADIO_TECH_GSM:

+        case MBTK_RADIO_TECH_GSM_COMPACT:

+        case MBTK_RADIO_TECH_GSM_EGPRS:

+        {

+            LOGD("gsm rssi = %d (0-31)",signal.rssi);

+            *csq_value = signal.rssi;

             break;

         }

         default:

         {

-            LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);

+            LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);

             return GSW_HAL_NORMAL_FAIL;

         }

     }

@@ -2016,23 +2067,18 @@
         return GSW_HAL_NORMAL_FAIL;

     }

     switch(netType)

-    {

-        case 1:

-        case 2:

-        case 3:

-        case 4:        //GSM

+    {        

+        case 4:        

         {

-            return gsw_rssi_to_csq(sigValue);

-        }

-            

-        case 5:        //WCDMA

+            return rsrpToLevel(sigValue);

+        }            

+        case 3:        //WCDMA

         {

-            return gsw_rscp_to_csq(sigValue);

-        }

-            

-        case 6:        //LTE

+            return rscpToLevel(sigValue);

+        }            

+        case 2:        //GSM

         {

-            return gsw_rsrp_to_csq(sigValue);

+            return sigValue;

         }

             

         default:

@@ -2479,7 +2525,7 @@
 {

     if (nw_init_flag == 0 || nw_info_handle == NULL)

     {

-	    printf("nw sdk has not init\n");

+        printf("nw sdk has not init\n");

         return GSW_HAL_NORMAL_FAIL;

     }