changeset 676:61df1066039e

alr_cs.c compiles
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 29 Sep 2014 04:54:15 +0000
parents 029f631b22ff
children a71671d8c2db
files gsm-fw/g23m-gsm/alr/Makefile gsm-fw/g23m-gsm/alr/alr_cs.c
diffstat 2 files changed, 203 insertions(+), 88 deletions(-) [+]
line wrap: on
line diff
--- a/gsm-fw/g23m-gsm/alr/Makefile	Mon Sep 29 01:41:48 2014 +0000
+++ b/gsm-fw/g23m-gsm/alr/Makefile	Mon Sep 29 04:54:15 2014 +0000
@@ -5,7 +5,7 @@
 CPPFLAGS=-I. -I../../include -I../../include/condat -I../../gpf/inc \
 	-I../../cdginc
 
-OBJS=	alr_cbch.o
+OBJS=	alr_cbch.o alr_cs.o
 
 all:	${OBJS}
 
--- a/gsm-fw/g23m-gsm/alr/alr_cs.c	Mon Sep 29 01:41:48 2014 +0000
+++ b/gsm-fw/g23m-gsm/alr/alr_cs.c	Mon Sep 29 04:54:15 2014 +0000
@@ -21,6 +21,10 @@
 #ifndef ALR_CS_C
 #define ALR_CS_C
 
+#include "config.h"
+#include "fixedconf.h"
+#include "condat-features.h"
+
 #define ENTITY_PL
 
 /*==== INCLUDES ===================================================*/
@@ -190,7 +194,7 @@
     next_area = alr_data->cs_data.freq_area;
 
   /*
-   * In the case the members and value arenīt already initialized,
+   * In the case the members and value aren't already initialized,
    * next_area is set to 0
    */
   switch (next_area)
@@ -1948,18 +1952,28 @@
   PURPOSE : This function puts the White carriers at the top of the 
             MPH_POWER_CNF list
             CSI-LLD 4.1.3.4.2.7
+
+  FreeCalypso note: when TI reworked this function for their
+  TI_PS_FF_QUAD_BAND_SUPPORT, they broke the configuration without this
+  feature.  If one takes the version of ALR from the LoCosto source
+  and builds it without TI_PS_FF_QUAD_BAND_SUPPORT, after passing through
+  the C preprocessor this function will be reduced to an equivalent of
+  return 0; followed by unreachable code.
+
+  Our solution: let's put the #ifdef TI_PS_FF_QUAD_BAND_SUPPORT on the
+  outside of the function, and have two entirely separate versions.
+  If one builds with the new feature, the version from LoCosto will be
+  built, made more readable by removing further internal ifdefs on the
+  same condition.  The version to be built *without* TI_PS_FF_QUAD_BAND_SUPPORT
+  has been taken from the ALR source that miraculously survived in the
+  otherwise sanitized Leonardo semi-src.
+
 */
 
 #ifdef TI_PS_FF_QUAD_BAND_SUPPORT
 LOCAL U8 cs_add_whitelist_carriers(U16 p_results_size[2], U8 *r_std, U8 no_of_attempts, 
                                    SHORT *min_rxlev, T_POWER_MEAS **presults,
                                    U8 no_of_carriers_per_band[4])
-#else
-LOCAL U8 cs_add_whitelist_carriers(U16 p_results_size[2], U8 std, U8 no_of_attempts, 
-                                   SHORT *min_rxlev,
-                                   T_POWER_MEAS *presults,
-                                   U8 no_of_carriers_per_band[4])
-#endif
 {
   GET_INSTANCE_DATA;
   T_MPH_POWER_CNF* mph_power_cnf = alr_data->cs_data.p_power_cnf;
@@ -1970,15 +1984,12 @@
   U8  temp_rxlev;
   UBYTE x=0;
   T_POWER_ARRAY *parray, *last;
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
   U8 std, start_region, no_of_regions, k;
-#endif
 
   TRACE_FUNCTION ("cs_add_whitelist_carriers()");
 
   i_cnf = 0;
 
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
   if (region EQ BOTH_REGIONS)
   {
     if((!(p_results_size[EUROPEAN_REGION]) OR (presults[EUROPEAN_REGION] EQ NULL)) AND 
@@ -1987,14 +1998,10 @@
   }
   else if(!(p_results_size[region]) OR (presults EQ NULL))
   {
-#endif
     return i_cnf;
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
   }
-#endif
 
   /* Move the white list carriers to MPH_POWER_CNF array first */
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
   if (region EQ BOTH_REGIONS)
   {
     start_region = EUROPEAN_REGION;
@@ -2017,96 +2024,73 @@
     parray = presults[k]->power_array;
 
     for (i=0; (i<p_results_size[k] AND i_cnf < 32); )
-#else
-  for (i=0; (i<p_results_size[region] AND i_cnf < 32); )
-#endif
     {
-    /* Convert to GSM standard format from L1 format*/
-    arfcn = ARFCN_STD_TO_G23(parray->radio_freq,std);
-    /*lint -e661 (Warning -- Possible access of out-of-bounds) */
-    get_band_index_from_arfcn(arfcn, x, std);
-    if (parray->accum_power_result > (min_rxlev[x] - 1))
-    {
-    /*lint +e661 (Warning -- Possible access of out-of-bounds) */
-      if(srv_get_channel((T_LIST*)&mph_power_req->white_list.list, arfcn&ARFCN_MASK))
+      /* Convert to GSM standard format from L1 format*/
+      arfcn = ARFCN_STD_TO_G23(parray->radio_freq,std);
+      /*lint -e661 (Warning -- Possible access of out-of-bounds) */
+      get_band_index_from_arfcn(arfcn, x, std);
+      if (parray->accum_power_result > (min_rxlev[x] - 1))
       {
-
-        /* Channel is present in white list. Add this to top of MPH_POWER_CNF */
-        arfcn = STD_ADD_TO_ARFCN(arfcn, std);
-
-        /* US_BIT should be used to differentiate an US frequency channel. */
-        switch (std)
+        /*lint +e661 (Warning -- Possible access of out-of-bounds) */
+        if(srv_get_channel((T_LIST*)&mph_power_req->white_list.list, arfcn&ARFCN_MASK))
         {
-          case STD_1900:
-          case STD_850:
-          case STD_DUAL_US:
-            arfcn |= US_BIT;
-            break;
-          default:
-            break;
-        }
-        /*lint -e661 (Warning -- Possible access of out-of-bounds) */
-        where_to_add = cs_restrict_max_carriers_per_band(arfcn&ARFCN_MASK, std,
+
+          /* Channel is present in white list. Add this to top of MPH_POWER_CNF */
+          arfcn = STD_ADD_TO_ARFCN(arfcn, std);
+
+          /* US_BIT should be used to differentiate an US frequency channel. */
+          switch (std)
+          {
+            case STD_1900:
+            case STD_850:
+            case STD_DUAL_US:
+              arfcn |= US_BIT;
+              break;
+            default:
+              break;
+          }
+          /*lint -e661 (Warning -- Possible access of out-of-bounds) */
+          where_to_add = cs_restrict_max_carriers_per_band(arfcn&ARFCN_MASK, std,
                                        no_of_carriers_per_band, p_results_size, min_rxlev[x]);
-        /*lint +e661 (Warning -- Possible access of out-of-bounds) */
-        if(where_to_add NEQ DO_NOT_ADD)
-        {
-          /* White list carriers are always added at the top */
-          mph_power_cnf->arfcn[i_cnf]  = arfcn;
-          mph_power_cnf->rx_lev[i_cnf] = (U8)(parray->accum_power_result/no_of_attempts);
-          i_cnf++;
-        }
-        else
-        {
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
+          /*lint +e661 (Warning -- Possible access of out-of-bounds) */
+          if(where_to_add NEQ DO_NOT_ADD)
+          {
+            /* White list carriers are always added at the top */
+            mph_power_cnf->arfcn[i_cnf]  = arfcn;
+            mph_power_cnf->rx_lev[i_cnf] = (U8)(parray->accum_power_result/no_of_attempts);
+            i_cnf++;
+          }
+          else
+          {
             TRACE_EVENT_P2("[WL] [DO_NOT_ADD] [%d] : [%c]", arfcn&ARFCN_MASK,
                             (k ? 'A' :'E'));
-#else
-            TRACE_EVENT_P2("[WL] [DO_NOT_ADD] [%d] : [%c]", arfcn&ARFCN_MASK,
-                            (region ? 'A' :'E'));
-#endif
           }
 
           /* Exclude this carrier */
           parray->accum_power_result = min_rxlev[x]-1;
 
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
           last = presults[k]->power_array + (p_results_size[k] - 1);
-#else
-        last = presults->power_array + (p_results_size[region] - 1);
-#endif
 
-        /* Swapping the current carrier with the last carrier */
-        cs_power_array_swap_arfcn(parray, last);
+          /* Swapping the current carrier with the last carrier */
+          cs_power_array_swap_arfcn(parray, last);
+
+          /* Decrement the power array counter to exclude the above carrier */
+          p_results_size[k]--;
 
-        /* Decrement the power array counter to exclude the above carrier */
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
-          p_results_size[k]--;
-#else
-          p_results_size[region]--;
-#endif
-
-      } /* Present in White List */
-      else
+        } /* Present in White List */
+        else
+        {
+          i++; parray++;
+        }
+      } /* Active Carrier */
+      else 
       {
+        TRACE_EVENT_P2("[WL] [IA] [%d] : [%c]", parray->radio_freq,
+                        (k ? 'A' :'E'));
         i++; parray++;
       }
-    } /* Active Carrier */
-    else 
-    {
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
-        TRACE_EVENT_P2("[WL] [IA] [%d] : [%c]", parray->radio_freq,
-                        (k ? 'A' :'E'));
-#else
-        TRACE_EVENT_P2("[WL] [IA] [%d] : [%c]", parray->radio_freq,
-                        (region ? 'A' :'E'));
-#endif
-      i++; parray++;
-    }
-  } /* i < max */
-#ifdef TI_PS_FF_QUAD_BAND_SUPPORT
+    } /* i < max */
   }
-#endif
 
   /* Assign the total Number of white list channels */
   mph_power_cnf->num_of_white_list_chan = i_cnf;
@@ -2137,6 +2121,138 @@
 
   return (i_cnf);
 }
+#else	/* no TI_PS_FF_QUAD_BAND_SUPPORT */
+
+/*
+ * Version taken from the TCS211 ALR source, modified in a few places
+ * to work with the rest of ALR which is the version from LoCosto.
+ */
+
+LOCAL U8 cs_add_whitelist_carriers(U16 p_results_size[2], U8 std, U8 no_of_attempts, 
+                                   SHORT *min_rxlev,
+                                   T_POWER_MEAS *presults,
+                                   U8 no_of_carriers_per_band[4])
+{
+  GET_INSTANCE_DATA;
+  T_MPH_POWER_CNF* mph_power_cnf = alr_data->cs_data.p_power_cnf;
+  T_MPH_POWER_REQ* mph_power_req = alr_data->cs_data.p_power_req;
+  U8  i_cnf,j, where_to_add = DO_NOT_ADD;
+  U8  region = mph_power_req->white_list.region;
+  U16 i,arfcn, temp_arfcn;
+  U8  temp_rxlev;
+  UBYTE x;
+  T_POWER_ARRAY *parray, *last;
+
+  TRACE_FUNCTION ("cs_add_whitelist_carriers()");
+
+  i_cnf = 0;
+
+  if((p_results_size[region]) AND (presults NEQ NULL))
+  {
+    parray = presults->power_array;
+  }
+  else
+    return i_cnf;
+
+  /* Move the white list carriers to MPH_POWER_CNF array first */
+  for (i=0; (i<p_results_size[region] AND i_cnf < 32); )
+  {
+
+    /* Convert to GSM standard format from L1 format*/
+    arfcn = ARFCN_STD_TO_G23(parray->radio_freq,std);
+    get_band_index_from_arfcn(arfcn, x, std);
+    if (parray->accum_power_result > (min_rxlev[x] - 1))
+    {
+      if(srv_get_channel((T_LIST*)&mph_power_req->white_list.list, arfcn&ARFCN_MASK))
+      {
+
+        /* Channel is present in white list. Add this to top of MPH_POWER_CNF */
+        arfcn = STD_ADD_TO_ARFCN(arfcn, std);
+
+        /* US_BIT should be used to differentiate an US frequency channel. */
+        switch (std)
+        {
+          case STD_1900:
+          case STD_850:
+          case STD_DUAL_US:
+            arfcn |= US_BIT;
+            break;
+          default:
+            break;
+        }
+
+        where_to_add = cs_restrict_max_carriers_per_band(arfcn&ARFCN_MASK, std,
+                                       no_of_carriers_per_band, p_results_size,
+				       min_rxlev[x]);
+
+        if(where_to_add NEQ DO_NOT_ADD)
+        {
+          /* White list carriers are always added at the top */
+          mph_power_cnf->arfcn[i_cnf]  = arfcn;
+          mph_power_cnf->rx_lev[i_cnf] = (U8)(parray->accum_power_result/no_of_attempts);
+          i_cnf++;
+        }
+        else
+        {
+          TRACE_EVENT_P2("[WL] [DO_NOT_ADD] [%d] : [%c]", arfcn&ARFCN_MASK,
+                          (region ? 'A' :'E'));
+        }
+
+        /* Exclude this carrier */
+        parray->accum_power_result = min_rxlev[x]-1;
+
+        last = presults->power_array + (p_results_size[region] - 1);
+
+        /* Swapping the current carrier with the last carrier */
+        cs_power_array_swap_arfcn(parray, last);
+
+        /* Decrement the power array counter to exclude the above carrier */
+        p_results_size[region]--;
+
+      } /* Present in White List */
+      else
+      {
+        i++; parray++;
+      }
+    } /* Active Carrier */
+    else 
+    {
+      TRACE_EVENT_P2("[WL] [IA] [%d] : [%c]", parray->radio_freq,
+                      (region ? 'A' :'E'));
+      i++; parray++;
+    }
+  } /* i < max */
+
+  /* Assign the total Number of white list channels */
+  mph_power_cnf->num_of_white_list_chan = i_cnf;
+
+  TRACE_EVENT_P1("[WL] no. of channels : %d ",mph_power_cnf->num_of_white_list_chan);
+
+  /*
+   * Sort the white list carriers added to power_cnf array on the 
+   * basis of their field strength
+   */
+  for(i=0; i < i_cnf; i++)
+  {
+    for(j=i+1; j<i_cnf; j++)
+    {
+      if(mph_power_cnf->rx_lev[i] < mph_power_cnf->rx_lev[j])
+      {
+        temp_rxlev = mph_power_cnf->rx_lev[i];
+        temp_arfcn = mph_power_cnf->arfcn[i];
+
+        mph_power_cnf->rx_lev[i] = mph_power_cnf->rx_lev[j];
+        mph_power_cnf->arfcn[i]  = mph_power_cnf->arfcn[j];
+
+        mph_power_cnf->rx_lev[j] = temp_rxlev;
+        mph_power_cnf->arfcn[j]  = temp_arfcn;
+      }
+    }
+  }
+
+  return (i_cnf);
+}
+#endif
 
 /*
 +--------------------------------------------------------------------+
@@ -2414,4 +2530,3 @@
            sizeof (mph_power_cnf->rx_lev[0]) * (extra_cnf));
 
 }
-