<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10476">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: padd missing measurements with educated guess<br><br>At the moment the measurement calculation of osmo-bts works by<br>collecting the measurement reports the phy emits during a measurement<br>interval. Normally one would expect a well defind fixed number here, but<br>some phys will not emit a measurement report for lost blocks. Also<br>blocks and their reports may get lost because of cpu overload etc.<br><br>The computation that is executed at the end of the measurement interval<br>computes over all received measurement. This evenutally means that<br>missing measurements will not taken into account and the result will<br>look better than it is in reality.<br><br>To fix this, the interval must be of a defined size and in cases where<br>less measurements as expected were collected, the algorithm must make an<br>educated guess by replacing them with a 100%BER at -109dB measurement.<br><br>- make sure the algorithm works over a fixed interval<br>- replace missing measurements with an educated guess<br>- fix and extend uint-tests<br><br>Change-Id: Idd30fc07603ad7d042c1fb416e247c3bf7d35c8b<br>Related: OS#2987<br>---<br>M src/common/measurement.c<br>M tests/meas/meas_test.c<br>M tests/meas/meas_test.ok<br>A tests/meas/meas_testcases.h<br>4 files changed, 925 insertions(+), 727 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/76/10476/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index 01f1e5d..63bb0fb 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -348,7 +348,10 @@</span><br><span>  */</span><br><span> </span><br><span> /* compute Osmocom extended measurements for the given lchan */</span><br><span style="color: hsl(0, 100%, 40%);">-static void lchan_meas_compute_extended(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+static void lchan_meas_compute_extended(struct gsm_lchan *lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 unsigned int num_ul_meas_excess,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      unsigned int num_ul_meas_expect,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      struct bts_ul_meas *m_dummy)</span><br><span> {</span><br><span>    /* we assume that lchan_meas_check_compute() has already computed the mean value</span><br><span>      * and we can compute the min/max/variance/stddev from this */</span><br><span>@@ -368,8 +371,14 @@</span><br><span>         * compensated/pre-empted its transmission */</span><br><span> </span><br><span>    /* step 1: compute the sum of the squared difference of each value to mean */</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < lchan->meas.num_ul_meas; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct bts_ul_meas *m = &lchan->meas.uplink[i];</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < num_ul_meas_expect; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         struct bts_ul_meas *m;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i < lchan->meas.num_ul_meas)</span><br><span style="color: hsl(120, 100%, 40%);">+                        m = &lchan->meas.uplink[i+num_ul_meas_excess];</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+                  m = m_dummy;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>               int32_t diff = (int32_t)m->ta_offs_256bits - (int32_t)lchan->meas.ms_toa256;</span><br><span>           /* diff can now be any value of +65535 to -65535, so we can safely square it,</span><br><span>                 * but only in unsigned math.  As squaring looses the sign, we can simply drop</span><br><span>@@ -385,7 +394,7 @@</span><br><span>                         lchan->meas.ext.toa256_min = m->ta_offs_256bits;</span><br><span>       }</span><br><span>    /* step 2: compute the variance (mean of sum of squared differences) */</span><br><span style="color: hsl(0, 100%, 40%);">- sq_diff_sum = sq_diff_sum / lchan->meas.num_ul_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+       sq_diff_sum = sq_diff_sum / num_ul_meas_expect;</span><br><span>      /* as the individual summed values can each not exceed 2^32, and we're</span><br><span>    * dividing by the number of summands, the resulting value can also not exceed 2^32 */</span><br><span>       OSMO_ASSERT(sq_diff_sum <= UINT32_MAX);</span><br><span>@@ -394,6 +403,60 @@</span><br><span>    lchan->meas.flags |= LC_UL_M_F_OSMO_EXT_VALID;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Get the number of measurements that we expect for a specific lchan.</span><br><span style="color: hsl(120, 100%, 40%);">+ * (This is a static number that is defined by the specific slot layout of</span><br><span style="color: hsl(120, 100%, 40%);">+ * the channel) */</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_meas_num_expected(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_phys_chan_config pchan = ts_pchan(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (pchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* 24 for TCH + 1 for SACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+                return 25;</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* 24 half-blocks for TCH + 1 for SACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+            return 25;</span><br><span style="color: hsl(120, 100%, 40%);">+    case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+           /* 2 for SDCCH + 1 for SACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+               return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(120, 100%, 40%);">+   case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* 2 for SDCCH + 1 for SACCH */</span><br><span style="color: hsl(120, 100%, 40%);">+               return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return lchan->meas.num_ul_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* In DTX a subset of blocks must always be transmitted</span><br><span style="color: hsl(120, 100%, 40%);">+ * See also: GSM 05.08, chapter 8.3 Aspects of discontinuous transmission (DTX) */</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_meas_sub_num_expected(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      enum gsm_phys_chan_config pchan = ts_pchan(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (pchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* 1 block SDCCH, 2 blocks TCH */</span><br><span style="color: hsl(120, 100%, 40%);">+             return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* 1 block SDCCH, 4 half-blocks TCH */</span><br><span style="color: hsl(120, 100%, 40%);">+                return 5;</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+           /* no DTX here, all blocks must be present! */</span><br><span style="color: hsl(120, 100%, 40%);">+                return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(120, 100%, 40%);">+   case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              /* no DTX here, all blocks must be present! */</span><br><span style="color: hsl(120, 100%, 40%);">+                return 3;</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int lchan_meas_check_compute(struct gsm_lchan *lchan, uint32_t fn)</span><br><span> {</span><br><span>  struct gsm_meas_rep_unidir *mru;</span><br><span>@@ -403,6 +466,12 @@</span><br><span>      uint32_t irssi_sub_sum = 0;</span><br><span>  int32_t ta256b_sum = 0;</span><br><span>      unsigned int num_meas_sub = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int num_meas_sub_actual = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int num_meas_sub_added = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t num_ul_meas_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t num_ul_meas_excess = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t num_meas_sub_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bts_ul_meas m_dummy;</span><br><span>  int i;</span><br><span> </span><br><span>   /* if measurement period is not complete, abort */</span><br><span>@@ -410,14 +479,79 @@</span><br><span>           return 0;</span><br><span> </span><br><span>        /* if there are no measurements, skip computation */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (lchan->meas.num_ul_meas == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lchan->meas.num_ul_meas == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DMEAS, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Measurement reporting interval ended, but no measurements were collected!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsm_lchan_name(lchan));</span><br><span>                 return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DMEAS, LOGL_DEBUG, "%s Calculating measurement results for physical channel:%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm_lchan_name(lchan), gsm_pchan_name(ts_pchan(lchan->ts)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        num_ul_meas_expect = lchan_meas_num_expected(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lchan->meas.num_ul_meas < num_ul_meas_expect) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Note: Some phys will send no measurement indication at all</span><br><span style="color: hsl(120, 100%, 40%);">+          * when a block is lost. Also in DTX mode blocks are left out</span><br><span style="color: hsl(120, 100%, 40%);">+          * intentionally to save energy. It is not necessarly an error</span><br><span style="color: hsl(120, 100%, 40%);">+                 * when we get less measurements as we expect. */</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMEAS, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Number of UL measurements (%u) is less than expected (%u), will add %u dummy measurements\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsm_lchan_name(lchan), lchan->meas.num_ul_meas, num_ul_meas_expect, num_ul_meas_expect - lchan->meas.num_ul_meas);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (lchan->meas.num_ul_meas > num_ul_meas_expect) {</span><br><span style="color: hsl(120, 100%, 40%);">+              num_ul_meas_excess = lchan->meas.num_ul_meas - num_ul_meas_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DMEAS, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Number of UL measurements (%u) is more than expected (%u), will discard %u of the oldest measurements\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               gsm_lchan_name(lchan), lchan->meas.num_ul_meas, num_ul_meas_expect, num_ul_meas_excess);</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMEAS, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Number of UL measurements (%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_lchan_name(lchan), lchan->meas.num_ul_meas);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span>        /* compute the actual measurements */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     /* In cases where we have collect less measurements than we expect we</span><br><span style="color: hsl(120, 100%, 40%);">+  * must assume that we just did not receive the block because it was</span><br><span style="color: hsl(120, 100%, 40%);">+   * lost due to bad channel conditions. We set up a dummy measurement</span><br><span style="color: hsl(120, 100%, 40%);">+   * result here that reflects the worst possible result. In our</span><br><span style="color: hsl(120, 100%, 40%);">+         * calculation we will use this dummy to replace the missing</span><br><span style="color: hsl(120, 100%, 40%);">+   * measurements */</span><br><span style="color: hsl(120, 100%, 40%);">+    m_dummy = (struct bts_ul_meas) {</span><br><span style="color: hsl(120, 100%, 40%);">+              .ber10k = 10000, /* 100% ber */</span><br><span style="color: hsl(120, 100%, 40%);">+               .ta_offs_256bits = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         .c_i = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .is_sub = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .inv_rssi = 109</span><br><span style="color: hsl(120, 100%, 40%);">+       };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* step 1: add up */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < lchan->meas.num_ul_meas; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           struct bts_ul_meas *m = &lchan->meas.uplink[i];</span><br><span style="color: hsl(120, 100%, 40%);">+        num_meas_sub_expect = lchan_meas_sub_num_expected(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < num_ul_meas_expect; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         struct bts_ul_meas *m;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i < lchan->meas.num_ul_meas) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      m = &lchan->meas.uplink[i+num_ul_meas_excess];</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* We may add dummy SUB measurements, for the logtext</span><br><span style="color: hsl(120, 100%, 40%);">+                  * we count the number of SUB measurements that are</span><br><span style="color: hsl(120, 100%, 40%);">+                    * actually contained in the data. */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (m->is_sub)</span><br><span style="color: hsl(120, 100%, 40%);">+                             num_meas_sub_actual++;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      m = &m_dummy;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* Each measurement interval per definition contains</span><br><span style="color: hsl(120, 100%, 40%);">+                   * a well defined amound of sub measurements. If we</span><br><span style="color: hsl(120, 100%, 40%);">+                    * already padding lost measurements and we find that</span><br><span style="color: hsl(120, 100%, 40%);">+                  * we still miss some sub frames, we set the is_sub</span><br><span style="color: hsl(120, 100%, 40%);">+                    * flag in our dummy measurement right on spot so that</span><br><span style="color: hsl(120, 100%, 40%);">+                         * we get the correct amount of sub measurements when</span><br><span style="color: hsl(120, 100%, 40%);">+                  * the loop ends. */</span><br><span style="color: hsl(120, 100%, 40%);">+                  if ( num_ul_meas_expect - i <= num_meas_sub_expect - num_meas_sub) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               m->is_sub = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                             num_meas_sub_added++;</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span> </span><br><span>                ber_full_sum += m->ber10k;</span><br><span>                irssi_full_sum += m->inv_rssi;</span><br><span>@@ -430,20 +564,44 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* step 2: divide */</span><br><span style="color: hsl(0, 100%, 40%);">-    ber_full_sum = ber_full_sum / lchan->meas.num_ul_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-       irssi_full_sum = irssi_full_sum / lchan->meas.num_ul_meas;</span><br><span style="color: hsl(0, 100%, 40%);">-   ta256b_sum = ta256b_sum / lchan->meas.num_ul_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Check amount of SUB-Frame measurements */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (num_meas_sub_actual < num_meas_sub_expect) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DMEAS, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Number of SUB measurements (%u) is less than expected (%u), added %u dummy SUB measurements\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 gsm_lchan_name(lchan), num_meas_sub_actual, num_meas_sub_expect, num_meas_sub_added);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (num_meas_sub_actual > num_meas_sub_expect) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DMEAS, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%s Number of SUB measurements (%u) is more than expected (%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  gsm_lchan_name(lchan), num_meas_sub_actual, num_meas_sub_expect);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DMEAS, LOGL_DEBUG, "%s Number of measurements for SUB (%u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              gsm_lchan_name(lchan), num_meas_sub_actual);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (num_meas_sub) {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* step 2: divide */</span><br><span style="color: hsl(120, 100%, 40%);">+  ber_full_sum = ber_full_sum / num_ul_meas_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+     irssi_full_sum = irssi_full_sum / num_ul_meas_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+ ta256b_sum = ta256b_sum / num_ul_meas_expect;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (num_meas_sub != num_meas_sub_expect) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DMEAS, LOGL_ERROR, "%s Incorrect number of SUB measurements detected!\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+               /* The only way this can happen is when there are more then</span><br><span style="color: hsl(120, 100%, 40%);">+               * num_meas_sub_expect-num_meas_sub_expect measurements present</span><br><span style="color: hsl(120, 100%, 40%);">+                * and not enough of of them are tagged as is_sub, which means</span><br><span style="color: hsl(120, 100%, 40%);">+         * the logic that tags the measurements works incorrectly. (also</span><br><span style="color: hsl(120, 100%, 40%);">+               * some unittests trigger this behaviour) For cases where are</span><br><span style="color: hsl(120, 100%, 40%);">+          * indeed no SUB measurements present we set BER to 100% and</span><br><span style="color: hsl(120, 100%, 40%);">+           * level to lowest possible. If not enough or too much SUB</span><br><span style="color: hsl(120, 100%, 40%);">+             * measurements were collected we may move on we continue with</span><br><span style="color: hsl(120, 100%, 40%);">+         * the wrong amount of SUB measurements. */</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!num_meas_sub) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ber_sub_sum = 10000; /* 100% */</span><br><span style="color: hsl(120, 100%, 40%);">+               irssi_sub_sum = 120; /* -120 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span>             ber_sub_sum = ber_sub_sum / num_meas_sub;</span><br><span>            irssi_sub_sum = irssi_sub_sum / num_meas_sub;</span><br><span style="color: hsl(0, 100%, 40%);">-   } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DMEAS, LOGL_ERROR, "%s No measurements for SUB!!!\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-            /* The only situation in which this can occur is if the related uplink burst/block was</span><br><span style="color: hsl(0, 100%, 40%);">-           * missing, so let's set BER to 100% and level to lowest possible. */</span><br><span style="color: hsl(0, 100%, 40%);">-               ber_sub_sum = 10000; /* 100% */</span><br><span style="color: hsl(0, 100%, 40%);">-         irssi_sub_sum = 120; /* -120 dBm */</span><br><span>  }</span><br><span> </span><br><span>        LOGP(DMEAS, LOGL_INFO, "%s Computed TA256(% 4d) BER-FULL(%2u.%02u%%), RSSI-FULL(-%3udBm), "</span><br><span>@@ -466,14 +624,15 @@</span><br><span>               mru->full.rx_lev,</span><br><span>         mru->sub.rx_lev,</span><br><span>          mru->full.rx_qual,</span><br><span style="color: hsl(0, 100%, 40%);">-           mru->sub.rx_qual, num_meas_sub, lchan->meas.num_ul_meas);</span><br><span style="color: hsl(120, 100%, 40%);">+               mru->sub.rx_qual, num_meas_sub, num_ul_meas_expect);</span><br><span> </span><br><span>   lchan->meas.flags |= LC_UL_M_F_RES_VALID;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        lchan_meas_compute_extended(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+   lchan_meas_compute_extended(lchan, num_ul_meas_excess, num_ul_meas_expect, &m_dummy);</span><br><span> </span><br><span>        lchan->meas.num_ul_meas = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- /* send a signal indicating computation is complete */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    /* return 1 to indicte that the computation has been done and the next</span><br><span style="color: hsl(120, 100%, 40%);">+         * interval begins. */</span><br><span>       return 1;</span><br><span> }</span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index e889345..69e77aa 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -21,6 +21,8 @@</span><br><span> };</span><br><span> </span><br><span> #include "sysmobts_fr_samples.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "meas_testcases.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> void test_fn_sample(struct fn_sample *s, unsigned int len, uint8_t pchan, uint8_t tsmap)</span><br><span> {</span><br><span>@@ -63,161 +65,6 @@</span><br><span>  OSMO_ASSERT(tsmap_result == tsmap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define ULM(ber, ta, neg_rssi) \</span><br><span style="color: hsl(0, 100%, 40%);">-    { .ber10k = (ber), .ta_offs_256bits = (ta), .c_i = 1.0, .is_sub = 0, .inv_rssi = (neg_rssi) }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct meas_testcase {</span><br><span style="color: hsl(0, 100%, 40%);">-     const char *name;</span><br><span style="color: hsl(0, 100%, 40%);">-       /* input data */</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct bts_ul_meas *ulm;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int ulm_count;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t final_fn;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* results */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                int success;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t rx_lev_full;</span><br><span style="color: hsl(0, 100%, 40%);">-            uint8_t rx_qual_full;</span><br><span style="color: hsl(0, 100%, 40%);">-           int16_t toa256_mean;</span><br><span style="color: hsl(0, 100%, 40%);">-            int16_t toa256_min;</span><br><span style="color: hsl(0, 100%, 40%);">-             int16_t toa256_max;</span><br><span style="color: hsl(0, 100%, 40%);">-             uint16_t toa256_std_dev;</span><br><span style="color: hsl(0, 100%, 40%);">-        } res;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bts_ul_meas ulm1[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-    ULM(0, 0, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-  ULM(0, 256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, -256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct meas_testcase mtc1 = {</span><br><span style="color: hsl(0, 100%, 40%);">-   .name = "TOA256 Min-Max negative/positive",</span><br><span style="color: hsl(0, 100%, 40%);">-   .ulm = ulm1,</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm_count = ARRAY_SIZE(ulm1),</span><br><span style="color: hsl(0, 100%, 40%);">-  .final_fn = 25,</span><br><span style="color: hsl(0, 100%, 40%);">- .res = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .success = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-           .rx_lev_full = 110-90,</span><br><span style="color: hsl(0, 100%, 40%);">-          .rx_qual_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_mean = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-               .toa256_max = 256,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_min = -256,</span><br><span style="color: hsl(0, 100%, 40%);">-             .toa256_std_dev = 209,</span><br><span style="color: hsl(0, 100%, 40%);">-  },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bts_ul_meas ulm2[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 258, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 254, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 258, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 254, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct meas_testcase mtc2 = {</span><br><span style="color: hsl(0, 100%, 40%);">-    .name = "TOA256 small jitter around 256",</span><br><span style="color: hsl(0, 100%, 40%);">-     .ulm = ulm2,</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm_count = ARRAY_SIZE(ulm2),</span><br><span style="color: hsl(0, 100%, 40%);">-  .final_fn = 25,</span><br><span style="color: hsl(0, 100%, 40%);">- .res = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .success = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-           .rx_lev_full = 110-90,</span><br><span style="color: hsl(0, 100%, 40%);">-          .rx_qual_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_mean = 256,</span><br><span style="color: hsl(0, 100%, 40%);">-             .toa256_max = 258,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_min = 254,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_std_dev = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bts_ul_meas ulm3[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        ULM(0, 0, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-  ULM(0, 0, 80),</span><br><span style="color: hsl(0, 100%, 40%);">-  ULM(0, 0, 80),</span><br><span style="color: hsl(0, 100%, 40%);">-  ULM(0, 0, 100),</span><br><span style="color: hsl(0, 100%, 40%);">- ULM(0, 0, 100),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct meas_testcase mtc3 = {</span><br><span style="color: hsl(0, 100%, 40%);">-     .name = "RxLEv averaging",</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm = ulm3,</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm_count = ARRAY_SIZE(ulm3),</span><br><span style="color: hsl(0, 100%, 40%);">-  .final_fn = 25,</span><br><span style="color: hsl(0, 100%, 40%);">- .res = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .success = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-           .rx_lev_full = 110-90,</span><br><span style="color: hsl(0, 100%, 40%);">-          .rx_qual_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_mean = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-               .toa256_max = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                .toa256_min = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                .toa256_std_dev = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bts_ul_meas ulm4[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct meas_testcase mtc4 = {</span><br><span style="color: hsl(0, 100%, 40%);">-    .name = "Empty measurements",</span><br><span style="color: hsl(0, 100%, 40%);">- .ulm = ulm4,</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm_count = ARRAY_SIZE(ulm4),</span><br><span style="color: hsl(0, 100%, 40%);">-  .final_fn = 25,</span><br><span style="color: hsl(0, 100%, 40%);">- .res = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .success = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-           .rx_lev_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-               .rx_qual_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_mean = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-               .toa256_max = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                .toa256_min = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                .toa256_std_dev = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct bts_ul_meas ulm5[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        /* one 104 multiframe can at max contain 26 blocks (TCH/F),</span><br><span style="color: hsl(0, 100%, 40%);">-      * each of which can at maximum be 64 bits in advance (TA range) */</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-     ULM(0, 64*256, 90),</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct meas_testcase mtc5 = {</span><br><span style="color: hsl(0, 100%, 40%);">- .name = "TOA256 26 blocks with max TOA256",</span><br><span style="color: hsl(0, 100%, 40%);">-   .ulm = ulm5,</span><br><span style="color: hsl(0, 100%, 40%);">-    .ulm_count = ARRAY_SIZE(ulm5),</span><br><span style="color: hsl(0, 100%, 40%);">-  .final_fn = 25,</span><br><span style="color: hsl(0, 100%, 40%);">- .res = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .success = 1,</span><br><span style="color: hsl(0, 100%, 40%);">-           .rx_lev_full = 110-90,</span><br><span style="color: hsl(0, 100%, 40%);">-          .rx_qual_full = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-              .toa256_mean = 64*256,</span><br><span style="color: hsl(0, 100%, 40%);">-          .toa256_max = 64*256,</span><br><span style="color: hsl(0, 100%, 40%);">-           .toa256_min = 64*256,</span><br><span style="color: hsl(0, 100%, 40%);">-           .toa256_std_dev = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void reset_lchan_meas(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>   lchan->state = LCHAN_S_ACTIVE;</span><br><span>@@ -226,13 +73,16 @@</span><br><span> </span><br><span> static void test_meas_compute(const struct meas_testcase *mtc)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_lchan *lchan = &trx->ts[1].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_lchan *lchan;</span><br><span>     unsigned int i;</span><br><span>      unsigned int fn = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        printf("\nMeasurement Compute Test %s\n", mtc->name);</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("===========================================================\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Measurement Compute Test: %s\n", mtc->name);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan = &trx->ts[mtc->ts].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->ts->pchan = mtc->pchan;</span><br><span>      reset_lchan_meas(lchan);</span><br><span> </span><br><span>         /* feed uplink measurements into the code */</span><br><span>@@ -247,6 +97,8 @@</span><br><span>            OSMO_ASSERT(!(lchan->meas.flags & LC_UL_M_F_RES_VALID));</span><br><span>      } else {</span><br><span>             OSMO_ASSERT(lchan->meas.flags & (LC_UL_M_F_RES_VALID|LC_UL_M_F_OSMO_EXT_VALID));</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("number of measurements: %u\n",  mtc->ulm_count);</span><br><span style="color: hsl(120, 100%, 40%);">+         printf("parameter                | actual | expected\n");</span><br><span>          printf("meas.ext.toa256_min      | %6d | %6d\n",</span><br><span>                   lchan->meas.ext.toa256_min, mtc->res.toa256_min);</span><br><span>              printf("meas.ext.toa256_max      | %6d | %6d\n",</span><br><span>@@ -266,6 +118,7 @@</span><br><span>                 (lchan->meas.ext.toa256_std_dev != mtc->res.toa256_std_dev) ||</span><br><span>                 (lchan->meas.ul_res.full.rx_lev != mtc->res.rx_lev_full)) {</span><br><span>                        fprintf(stderr, "%s: Unexpected measurement result!\n", mtc->name);</span><br><span style="color: hsl(120, 100%, 40%);">+                      OSMO_ASSERT(false);</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span>@@ -296,7 +149,7 @@</span><br><span>          fprintf(stderr, "unable to to open bts\n");</span><br><span>                exit(1);</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span>     printf("\n");</span><br><span>      printf("***********************\n");</span><br><span>       printf("*** FULL RATE TESTS ***\n");</span><br><span>@@ -306,12 +159,14 @@</span><br><span>       test_fn_sample(test_fn_tch_f_ts_2_3, ARRAY_SIZE(test_fn_tch_f_ts_2_3), GSM_PCHAN_TCH_F, (1 << 2) | (1 << 3));</span><br><span>    test_fn_sample(test_fn_tch_f_ts_4_5, ARRAY_SIZE(test_fn_tch_f_ts_4_5), GSM_PCHAN_TCH_F, (1 << 4) | (1 << 5));</span><br><span>    test_fn_sample(test_fn_tch_f_ts_6_7, ARRAY_SIZE(test_fn_tch_f_ts_6_7), GSM_PCHAN_TCH_F, (1 << 6) | (1 << 7));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span>     printf("\n");</span><br><span>      printf("***********************\n");</span><br><span>       printf("*** HALF RATE TESTS ***\n");</span><br><span>       printf("***********************\n");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Test half rate */</span><br><span>         test_fn_sample(test_fn_tch_h_ts_2_ss0_ss1, ARRAY_SIZE(test_fn_tch_h_ts_2_ss0_ss1), GSM_PCHAN_TCH_H, (1 << 2));</span><br><span>         test_fn_sample(test_fn_tch_h_ts_3_ss0_ss1, ARRAY_SIZE(test_fn_tch_h_ts_3_ss0_ss1), GSM_PCHAN_TCH_H, (1 << 3));</span><br><span>@@ -319,12 +174,23 @@</span><br><span>         test_fn_sample(test_fn_tch_h_ts_5_ss0_ss1, ARRAY_SIZE(test_fn_tch_h_ts_5_ss0_ss1), GSM_PCHAN_TCH_H, (1 << 5));</span><br><span>         test_fn_sample(test_fn_tch_h_ts_6_ss0_ss1, ARRAY_SIZE(test_fn_tch_h_ts_6_ss0_ss1), GSM_PCHAN_TCH_H, (1 << 6));</span><br><span>         test_fn_sample(test_fn_tch_h_ts_7_ss0_ss1, ARRAY_SIZE(test_fn_tch_h_ts_7_ss0_ss1), GSM_PCHAN_TCH_H, (1 << 7));</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span>   test_meas_compute(&mtc1);</span><br><span>        test_meas_compute(&mtc2);</span><br><span>        test_meas_compute(&mtc3);</span><br><span>        test_meas_compute(&mtc4);</span><br><span>        test_meas_compute(&mtc5);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_meas_compute(&mtc_tch_f_complete);</span><br><span style="color: hsl(120, 100%, 40%);">+   test_meas_compute(&mtc_tch_f_dtx_with_lost_subs);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_meas_compute(&mtc_tch_f_dtx);</span><br><span style="color: hsl(120, 100%, 40%);">+        test_meas_compute(&mtc_tch_h_complete);</span><br><span style="color: hsl(120, 100%, 40%);">+   test_meas_compute(&mtc_tch_h_dtx_with_lost_subs);</span><br><span style="color: hsl(120, 100%, 40%);">+ test_meas_compute(&mtc_tch_h_dtx);</span><br><span style="color: hsl(120, 100%, 40%);">+        test_meas_compute(&mtc_overrun);</span><br><span style="color: hsl(120, 100%, 40%);">+  test_meas_compute(&mtc_sdcch4_complete);</span><br><span style="color: hsl(120, 100%, 40%);">+  test_meas_compute(&mtc_sdcch8_complete);</span><br><span> </span><br><span>     printf("Success\n");</span><br><span> </span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index 026899d..54ad110 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -1,572 +1,157 @@</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-***********************</span><br><span style="color: hsl(0, 100%, 40%);">-*** FULL RATE TESTS ***</span><br><span style="color: hsl(0, 100%, 40%);">-***********************</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> ===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10958=>010958/08/12/44/50, fn%104=38, rc=1, delta=10958</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11062=>011062/08/12/46/02, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11166=>011166/08/12/48/02, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11270=>011270/08/12/50/06, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11374=>011374/08/12/01/06, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11478=>011478/08/12/03/06, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11491=>011491/08/25/16/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11582=>011582/08/12/05/10, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11595=>011595/08/25/18/23, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11686=>011686/08/12/07/10, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11699=>011699/08/25/20/23, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11790=>011790/08/12/09/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11803=>011803/08/25/22/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11894=>011894/08/12/11/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11907=>011907/08/25/24/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11998=>011998/09/12/13/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12011=>012011/09/25/26/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12102=>012102/09/12/15/18, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12115=>012115/09/25/28/31, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12206=>012206/09/12/17/18, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12219=>012219/09/25/30/31, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12310=>012310/09/12/19/22, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12323=>012323/09/25/32/35, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12414=>012414/09/12/21/22, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12427=>012427/09/25/34/35, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12518=>012518/09/12/23/22, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12531=>012531/09/25/36/35, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=12622=>012622/09/12/25/26, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12635=>012635/09/25/38/39, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=5888=>005888/04/12/23/00, fn%104=64, rc=1, delta=5888</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=5992=>005992/04/12/25/00, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6096=>006096/04/12/27/00, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6200=>006200/04/12/29/04, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6213=>006213/04/25/42/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6304=>006304/04/12/31/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6317=>006317/04/25/44/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6408=>006408/04/12/33/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6421=>006421/04/25/46/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6512=>006512/04/12/35/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6525=>006525/04/25/48/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6616=>006616/04/12/37/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6629=>006629/04/25/50/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6720=>006720/05/12/39/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6733=>006733/05/25/01/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6824=>006824/05/12/41/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6837=>006837/05/25/03/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=6928=>006928/05/12/43/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6941=>006941/05/25/05/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7032=>007032/05/12/45/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7045=>007045/05/25/07/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7136=>007136/05/12/47/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7149=>007149/05/25/09/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7240=>007240/05/12/49/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7253=>007253/05/25/11/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7344=>007344/05/12/00/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7357=>007357/05/25/13/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7448=>007448/05/12/02/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7461=>007461/05/25/15/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7552=>007552/05/12/04/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7565=>007565/05/25/17/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7656=>007656/05/12/06/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7669=>007669/05/25/19/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7760=>007760/05/12/08/28, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7773=>007773/05/25/21/41, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7864=>007864/05/12/10/28, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7877=>007877/05/25/23/41, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7968=>007968/06/12/12/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7981=>007981/06/25/25/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8072=>008072/06/12/14/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8085=>008085/06/25/27/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8176=>008176/06/12/16/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8189=>008189/06/25/29/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8280=>008280/06/12/18/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8293=>008293/06/25/31/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8384=>008384/06/12/20/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8397=>008397/06/25/33/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8488=>008488/06/12/22/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8501=>008501/06/25/35/01, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8592=>008592/06/12/24/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8605=>008605/06/25/37/01, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8696=>008696/06/12/26/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8709=>008709/06/25/39/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8800=>008800/06/12/28/44, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8813=>008813/06/25/41/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8904=>008904/06/12/30/44, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8917=>008917/06/25/43/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9008=>009008/06/12/32/48, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9021=>009021/06/25/45/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9112=>009112/06/12/34/48, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9125=>009125/06/25/47/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9216=>009216/06/12/36/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9229=>009229/06/25/49/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9320=>009320/07/12/38/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9333=>009333/07/25/00/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9424=>009424/07/12/40/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9437=>009437/07/25/02/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9528=>009528/07/12/42/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9541=>009541/07/25/04/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9632=>009632/07/12/44/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=9645=>009645/07/25/06/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8618=>008618/06/12/50/14, fn%104=90, rc=1, delta=8618</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8722=>008722/06/12/01/18, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8826=>008826/06/12/03/18, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8930=>008930/06/12/05/18, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=8943=>008943/06/25/18/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9034=>009034/06/12/07/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9047=>009047/06/25/20/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9138=>009138/06/12/09/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9151=>009151/06/25/22/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9242=>009242/06/12/11/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9255=>009255/06/25/24/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9346=>009346/07/12/13/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9359=>009359/07/25/26/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9450=>009450/07/12/15/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9463=>009463/07/25/28/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9554=>009554/07/12/17/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9567=>009567/07/25/30/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9658=>009658/07/12/19/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9671=>009671/07/25/32/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9762=>009762/07/12/21/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9775=>009775/07/25/34/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9866=>009866/07/12/23/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9879=>009879/07/25/36/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9970=>009970/07/12/25/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=9983=>009983/07/25/38/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10074=>010074/07/12/27/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10087=>010087/07/25/40/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10178=>010178/07/12/29/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10191=>010191/07/25/42/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10282=>010282/07/12/31/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10295=>010295/07/25/44/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10386=>010386/07/12/33/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10399=>010399/07/25/46/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10490=>010490/07/12/35/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10503=>010503/07/25/48/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10594=>010594/07/12/37/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10607=>010607/07/25/50/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10698=>010698/08/12/39/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10711=>010711/08/25/01/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10802=>010802/08/12/41/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10815=>010815/08/25/03/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10906=>010906/08/12/43/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=10919=>010919/08/25/05/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11010=>011010/08/12/45/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11023=>011023/08/25/07/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11114=>011114/08/12/47/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11127=>011127/08/25/09/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11218=>011218/08/12/49/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11231=>011231/08/25/11/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11322=>011322/08/12/00/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11335=>011335/08/25/13/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11426=>011426/08/12/02/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11439=>011439/08/25/15/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11530=>011530/08/12/04/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11543=>011543/08/25/17/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11634=>011634/08/12/06/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11647=>011647/08/25/19/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11738=>011738/08/12/08/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11751=>011751/08/25/21/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11842=>011842/08/12/10/14, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11855=>011855/08/25/23/27, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11946=>011946/09/12/12/14, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11959=>011959/09/25/25/27, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=12050=>012050/09/12/14/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12063=>012063/09/25/27/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=12154=>012154/09/12/16/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12167=>012167/09/25/29/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-***********************</span><br><span style="color: hsl(0, 100%, 40%);">-*** HALF RATE TESTS ***</span><br><span style="color: hsl(0, 100%, 40%);">-***********************</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=8982=>008982/06/12/06/22, fn%104=38, rc=1, delta=8982</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9086=>009086/06/12/08/22, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9190=>009190/06/12/10/22, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9294=>009294/07/12/12/26, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9398=>009398/07/12/14/26, fn%104=38, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9411=>009411/07/25/27/39, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9502=>009502/07/12/16/30, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9515=>009515/07/25/29/43, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9606=>009606/07/12/18/30, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9619=>009619/07/25/31/43, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9710=>009710/07/12/20/30, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9723=>009723/07/25/33/43, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9814=>009814/07/12/22/34, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9827=>009827/07/25/35/47, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=9918=>009918/07/12/24/34, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=9931=>009931/07/25/37/47, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10022=>010022/07/12/26/38, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10035=>010035/07/25/39/51, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10126=>010126/07/12/28/38, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10139=>010139/07/25/41/51, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10230=>010230/07/12/30/38, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10243=>010243/07/25/43/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10334=>010334/07/12/32/42, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10347=>010347/07/25/45/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10438=>010438/07/12/34/42, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10451=>010451/07/25/47/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10542=>010542/07/12/36/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10555=>010555/07/25/49/07, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10646=>010646/08/12/38/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10659=>010659/08/25/00/07, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10750=>010750/08/12/40/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10763=>010763/08/25/02/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10854=>010854/08/12/42/50, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10867=>010867/08/25/04/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=10958=>010958/08/12/44/50, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=10971=>010971/08/25/06/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11062=>011062/08/12/46/02, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=11075=>011075/08/25/08/15, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11166=>011166/08/12/48/02, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=11179=>011179/08/25/10/15, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11270=>011270/08/12/50/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=11283=>011283/08/25/12/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11374=>011374/08/12/01/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=11387=>011387/08/25/14/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11478=>011478/08/12/03/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[1], fn=11491=>011491/08/25/16/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[2]->lchan[0], fn=11582=>011582/08/12/05/10, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10022=>010022/07/12/26/38, fn%104=38, rc=1, delta=10022</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10035=>010035/07/25/39/51, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10126=>010126/07/12/28/38, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10139=>010139/07/25/41/51, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10230=>010230/07/12/30/38, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10243=>010243/07/25/43/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10334=>010334/07/12/32/42, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10347=>010347/07/25/45/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10438=>010438/07/12/34/42, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10451=>010451/07/25/47/03, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10542=>010542/07/12/36/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10555=>010555/07/25/49/07, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10646=>010646/08/12/38/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10659=>010659/08/25/00/07, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10750=>010750/08/12/40/46, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10763=>010763/08/25/02/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10854=>010854/08/12/42/50, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10867=>010867/08/25/04/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=10958=>010958/08/12/44/50, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=10971=>010971/08/25/06/11, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11062=>011062/08/12/46/02, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11075=>011075/08/25/08/15, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11166=>011166/08/12/48/02, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11179=>011179/08/25/10/15, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11270=>011270/08/12/50/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11283=>011283/08/25/12/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11374=>011374/08/12/01/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11387=>011387/08/25/14/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11478=>011478/08/12/03/06, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11491=>011491/08/25/16/19, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11582=>011582/08/12/05/10, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11595=>011595/08/25/18/23, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11686=>011686/08/12/07/10, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11699=>011699/08/25/20/23, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11790=>011790/08/12/09/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11803=>011803/08/25/22/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11894=>011894/08/12/11/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=11907=>011907/08/25/24/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=11998=>011998/09/12/13/14, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=12011=>012011/09/25/26/27, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[0], fn=12102=>012102/09/12/15/18, fn%104=38, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[3]->lchan[1], fn=12115=>012115/09/25/28/31, fn%104=51, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7760=>007760/05/12/08/28, fn%104=64, rc=1, delta=7760</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7864=>007864/05/12/10/28, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=7968=>007968/06/12/12/32, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8072=>008072/06/12/14/32, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8176=>008176/06/12/16/32, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8189=>008189/06/25/29/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8280=>008280/06/12/18/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8293=>008293/06/25/31/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8384=>008384/06/12/20/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8397=>008397/06/25/33/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8488=>008488/06/12/22/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8501=>008501/06/25/35/01, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8592=>008592/06/12/24/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8605=>008605/06/25/37/01, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8696=>008696/06/12/26/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8709=>008709/06/25/39/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8800=>008800/06/12/28/44, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8813=>008813/06/25/41/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=8904=>008904/06/12/30/44, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=8917=>008917/06/25/43/05, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9008=>009008/06/12/32/48, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9021=>009021/06/25/45/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9112=>009112/06/12/34/48, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9125=>009125/06/25/47/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9216=>009216/06/12/36/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9229=>009229/06/25/49/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9320=>009320/07/12/38/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9333=>009333/07/25/00/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9424=>009424/07/12/40/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9437=>009437/07/25/02/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9528=>009528/07/12/42/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9541=>009541/07/25/04/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9632=>009632/07/12/44/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9645=>009645/07/25/06/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9736=>009736/07/12/46/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9749=>009749/07/25/08/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9840=>009840/07/12/48/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9853=>009853/07/25/10/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=9944=>009944/07/12/50/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=9957=>009957/07/25/12/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10048=>010048/07/12/01/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10061=>010061/07/25/14/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10152=>010152/07/12/03/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10165=>010165/07/25/16/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10256=>010256/07/12/05/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10269=>010269/07/25/18/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10360=>010360/07/12/07/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10373=>010373/07/25/20/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10464=>010464/07/12/09/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10477=>010477/07/25/22/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10568=>010568/07/12/11/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10581=>010581/07/25/24/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10672=>010672/08/12/13/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10685=>010685/08/25/26/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10776=>010776/08/12/15/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10789=>010789/08/25/28/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10880=>010880/08/12/17/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10893=>010893/08/25/30/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[0], fn=10984=>010984/08/12/19/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[4]->lchan[1], fn=10997=>010997/08/25/32/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5264=>005264/03/12/11/40, fn%104=64, rc=1, delta=5264</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5368=>005368/04/12/13/40, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5472=>005472/04/12/15/44, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5576=>005576/04/12/17/44, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5680=>005680/04/12/19/48, fn%104=64, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=5693=>005693/04/25/32/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5784=>005784/04/12/21/48, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=5797=>005797/04/25/34/09, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5888=>005888/04/12/23/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=5901=>005901/04/25/36/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=5992=>005992/04/12/25/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6005=>006005/04/25/38/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6096=>006096/04/12/27/00, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6109=>006109/04/25/40/13, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6200=>006200/04/12/29/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6213=>006213/04/25/42/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6304=>006304/04/12/31/04, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6317=>006317/04/25/44/17, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6408=>006408/04/12/33/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6421=>006421/04/25/46/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6512=>006512/04/12/35/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6525=>006525/04/25/48/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6616=>006616/04/12/37/08, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6629=>006629/04/25/50/21, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6720=>006720/05/12/39/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6733=>006733/05/25/01/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6824=>006824/05/12/41/12, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6837=>006837/05/25/03/25, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=6928=>006928/05/12/43/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=6941=>006941/05/25/05/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7032=>007032/05/12/45/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7045=>007045/05/25/07/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7136=>007136/05/12/47/16, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7149=>007149/05/25/09/29, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7240=>007240/05/12/49/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7253=>007253/05/25/11/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7344=>007344/05/12/00/20, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7357=>007357/05/25/13/33, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7448=>007448/05/12/02/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7461=>007461/05/25/15/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7552=>007552/05/12/04/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7565=>007565/05/25/17/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7656=>007656/05/12/06/24, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7669=>007669/05/25/19/37, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7760=>007760/05/12/08/28, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7773=>007773/05/25/21/41, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7864=>007864/05/12/10/28, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7877=>007877/05/25/23/41, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=7968=>007968/06/12/12/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=7981=>007981/06/25/25/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8072=>008072/06/12/14/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=8085=>008085/06/25/27/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8176=>008176/06/12/16/32, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=8189=>008189/06/25/29/45, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8280=>008280/06/12/18/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=8293=>008293/06/25/31/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8384=>008384/06/12/20/36, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=8397=>008397/06/25/33/49, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[0], fn=8488=>008488/06/12/22/40, fn%104=64, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[5]->lchan[1], fn=8501=>008501/06/25/35/01, fn%104=77, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8098=>008098/06/12/40/06, fn%104=90, rc=1, delta=8098</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8202=>008202/06/12/42/10, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8306=>008306/06/12/44/10, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8410=>008410/06/12/46/10, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8423=>008423/06/25/08/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8514=>008514/06/12/48/14, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8527=>008527/06/25/10/27, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8618=>008618/06/12/50/14, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8631=>008631/06/25/12/27, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8722=>008722/06/12/01/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8735=>008735/06/25/14/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8826=>008826/06/12/03/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8839=>008839/06/25/16/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=8930=>008930/06/12/05/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=8943=>008943/06/25/18/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9034=>009034/06/12/07/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9047=>009047/06/25/20/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9138=>009138/06/12/09/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9151=>009151/06/25/22/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9242=>009242/06/12/11/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9255=>009255/06/25/24/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9346=>009346/07/12/13/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9359=>009359/07/25/26/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9450=>009450/07/12/15/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9463=>009463/07/25/28/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9554=>009554/07/12/17/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9567=>009567/07/25/30/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9658=>009658/07/12/19/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9671=>009671/07/25/32/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9762=>009762/07/12/21/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9775=>009775/07/25/34/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9866=>009866/07/12/23/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9879=>009879/07/25/36/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=9970=>009970/07/12/25/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=9983=>009983/07/25/38/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10074=>010074/07/12/27/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10087=>010087/07/25/40/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10178=>010178/07/12/29/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10191=>010191/07/25/42/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10282=>010282/07/12/31/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10295=>010295/07/25/44/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10386=>010386/07/12/33/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10399=>010399/07/25/46/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10490=>010490/07/12/35/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10503=>010503/07/25/48/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10594=>010594/07/12/37/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10607=>010607/07/25/50/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10698=>010698/08/12/39/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10711=>010711/08/25/01/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10802=>010802/08/12/41/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10815=>010815/08/25/03/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=10906=>010906/08/12/43/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=10919=>010919/08/25/05/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11010=>011010/08/12/45/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11023=>011023/08/25/07/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11114=>011114/08/12/47/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11127=>011127/08/25/09/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11218=>011218/08/12/49/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11231=>011231/08/25/11/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11322=>011322/08/12/00/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11335=>011335/08/25/13/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11426=>011426/08/12/02/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11439=>011439/08/25/15/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[0], fn=11530=>011530/08/12/04/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[6]->lchan[1], fn=11543=>011543/08/25/17/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11738=>011738/08/12/08/10, fn%104=90, rc=1, delta=11738</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11842=>011842/08/12/10/14, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=11946=>011946/09/12/12/14, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12050=>012050/09/12/14/18, fn%104=90, rc=1, delta=104</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12063=>012063/09/25/27/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12154=>012154/09/12/16/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12167=>012167/09/25/29/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12258=>012258/09/12/18/18, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12271=>012271/09/25/31/31, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12362=>012362/09/12/20/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12375=>012375/09/25/33/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12466=>012466/09/12/22/22, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12479=>012479/09/25/35/35, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12570=>012570/09/12/24/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12583=>012583/09/25/37/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12674=>012674/09/12/26/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12687=>012687/09/25/39/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12778=>012778/09/12/28/26, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12791=>012791/09/25/41/39, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12882=>012882/09/12/30/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12895=>012895/09/25/43/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=12986=>012986/09/12/32/30, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=12999=>012999/09/25/45/43, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13090=>013090/09/12/34/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13103=>013103/09/25/47/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13194=>013194/09/12/36/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13207=>013207/09/25/49/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13298=>013298/10/12/38/34, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13311=>013311/10/25/00/47, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13402=>013402/10/12/40/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13415=>013415/10/25/02/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13506=>013506/10/12/42/38, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13519=>013519/10/25/04/51, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13610=>013610/10/12/44/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13623=>013623/10/25/06/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13714=>013714/10/12/46/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13727=>013727/10/25/08/03, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13818=>013818/10/12/48/42, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13831=>013831/10/25/10/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=13922=>013922/10/12/50/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=13935=>013935/10/25/12/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14026=>014026/10/12/01/46, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14039=>014039/10/25/14/07, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14130=>014130/10/12/03/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14143=>014143/10/25/16/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14234=>014234/10/12/05/50, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14247=>014247/10/25/18/11, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14338=>014338/10/12/07/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14351=>014351/10/25/20/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14442=>014442/10/12/09/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14455=>014455/10/25/22/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14546=>014546/10/12/11/02, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14559=>014559/10/25/24/15, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14650=>014650/11/12/13/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14663=>014663/11/25/26/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14754=>014754/11/12/15/06, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14767=>014767/11/25/28/19, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14858=>014858/11/12/17/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14871=>014871/11/25/30/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=14962=>014962/11/12/19/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=14975=>014975/11/25/32/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=15066=>015066/11/12/21/10, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=15079=>015079/11/25/34/23, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[0], fn=15170=>015170/11/12/23/14, fn%104=90, rc=1, delta=91</span><br><span style="color: hsl(0, 100%, 40%);">-Testing: ts[7]->lchan[1], fn=15183=>015183/11/25/36/27, fn%104=103, rc=1, delta=13</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-Measurement Compute Test TOA256 Min-Max negative/positive</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: TOA256 Min-Max negative/positive</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 25</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span> meas.ext.toa256_min      |   -256 |   -256</span><br><span> meas.ext.toa256_max      |    256 |    256</span><br><span> meas.ms_toa256           |      0 |      0</span><br><span style="color: hsl(0, 100%, 40%);">-meas.ext.toa256_std_dev  |    209 |    209</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |    250 |    250</span><br><span> meas.ul_res.full.rx_lev  |     20 |     20</span><br><span> meas.ul_res.full.rx_qual |      0 |      0</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Measurement Compute Test TOA256 small jitter around 256</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: TOA256 small jitter around 256</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 25</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span> meas.ext.toa256_min      |    254 |    254</span><br><span> meas.ext.toa256_max      |    258 |    258</span><br><span> meas.ms_toa256           |    256 |    256</span><br><span> meas.ext.toa256_std_dev  |      1 |      1</span><br><span> meas.ul_res.full.rx_lev  |     20 |     20</span><br><span style="color: hsl(0, 100%, 40%);">-meas.ul_res.full.rx_qual |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      0 |      7</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Measurement Compute Test RxLEv averaging</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: RxLEv averaging</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 5</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span> meas.ext.toa256_min      |      0 |      0</span><br><span> meas.ext.toa256_max      |      0 |      0</span><br><span> meas.ms_toa256           |      0 |      0</span><br><span> meas.ext.toa256_std_dev  |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |      5 |      5</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      7 |      7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Empty measurements</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: TOA256 26 blocks with max TOA256</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 26</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |      0 |      0</span><br><span> meas.ul_res.full.rx_lev  |     20 |     20</span><br><span> meas.ul_res.full.rx_qual |      0 |      0</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Measurement Compute Test Empty measurements</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-Measurement Compute Test TOA256 26 blocks with max TOA256</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Complete TCH/F measurement period (26 measurements, 3 sub-frames)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 25</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     20 |     20</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Incomplete TCH/F measurement period (16 measurements, 1 sub-frame)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 16</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  10485 |  10485</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |   7864 |   7864</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     14 |     14</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      7 |      7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Incomplete but normal TCH/F measurement period (16 measurements, 3 sub-frames)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 16</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  10485 |  10485</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |   7864 |   7864</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     14 |     14</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      7 |      7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Complete TCH/H measurement period (26 measurements, 5 sub-frames)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 25</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     20 |     20</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Incomplete TCH/H measurement period (14 measurements, 3 sub-frames)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 14</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |   9175 |   9175</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |   8132 |   8132</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     12 |     12</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      7 |      7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Incomplete but normal TCH/F measurement period (16 measurements, 5 sub-frames)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 16</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  10485 |  10485</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |   7864 |   7864</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     14 |     14</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      7 |      7</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: TCH/F measurement period with too much measurement values (overrun)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 59</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     20 |     20</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Complete SDCCH4 measurement period (3 measurements)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 3</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_min      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_max      |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ms_toa256           |  16384 |  16384</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ext.toa256_std_dev  |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_lev  |     20 |     20</span><br><span style="color: hsl(120, 100%, 40%);">+meas.ul_res.full.rx_qual |      0 |      0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Measurement Compute Test: Complete SDCCH8 measurement period (3 measurements)</span><br><span style="color: hsl(120, 100%, 40%);">+number of measurements: 3</span><br><span style="color: hsl(120, 100%, 40%);">+parameter                | actual | expected</span><br><span> meas.ext.toa256_min      |  16384 |  16384</span><br><span> meas.ext.toa256_max      |  16384 |  16384</span><br><span> meas.ms_toa256           |  16384 |  16384</span><br><span>diff --git a/tests/meas/meas_testcases.h b/tests/meas/meas_testcases.h</span><br><span>new file mode 100644</span><br><span>index 0000000..ecd5292</span><br><span>--- /dev/null</span><br><span>+++ b/tests/meas/meas_testcases.h</span><br><span>@@ -0,0 +1,588 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define ULM(ber, ta, sub, neg_rssi)                                        \</span><br><span style="color: hsl(120, 100%, 40%);">+     { .ber10k = (ber), .ta_offs_256bits = (ta), .c_i = 1.0, .is_sub = sub, .inv_rssi = (neg_rssi) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct meas_testcase {</span><br><span style="color: hsl(120, 100%, 40%);">+     const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* input data */</span><br><span style="color: hsl(120, 100%, 40%);">+      const struct bts_ul_meas *ulm;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int ulm_count;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t final_fn;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t ts;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_phys_chan_config pchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* results */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              int success;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t rx_lev_full;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t rx_qual_full;</span><br><span style="color: hsl(120, 100%, 40%);">+         int16_t toa256_mean;</span><br><span style="color: hsl(120, 100%, 40%);">+          int16_t toa256_min;</span><br><span style="color: hsl(120, 100%, 40%);">+           int16_t toa256_max;</span><br><span style="color: hsl(120, 100%, 40%);">+           uint16_t toa256_std_dev;</span><br><span style="color: hsl(120, 100%, 40%);">+      } res;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm1[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Note: The assumptions about the frame number and the subset</span><br><span style="color: hsl(120, 100%, 40%);">+         * allegiance is random since for the calculation only the amount</span><br><span style="color: hsl(120, 100%, 40%);">+      * is of relevance. This is true for all following testcases */</span><br><span style="color: hsl(120, 100%, 40%);">+       ULM(0, 0, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 1,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 1,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 256, 0,  90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, -256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc1 = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "TOA256 Min-Max negative/positive",</span><br><span style="color: hsl(120, 100%, 40%);">+ .ulm = ulm1,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm1),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 110-90,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .toa256_max = 256,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_min = -256,</span><br><span style="color: hsl(120, 100%, 40%);">+           .toa256_std_dev = 250,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm2[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 258, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 254, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc2 = {</span><br><span style="color: hsl(120, 100%, 40%);">+   .name = "TOA256 small jitter around 256",</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm = ulm2,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm2),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 256,</span><br><span style="color: hsl(120, 100%, 40%);">+           .toa256_max = 258,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_min = 254,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_std_dev = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm3[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 0, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 0, 0, 80),</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 0, 0, 80),</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 0, 0, 100),</span><br><span style="color: hsl(120, 100%, 40%);">+    ULM(0, 0, 0, 100),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc3 = {</span><br><span style="color: hsl(120, 100%, 40%);">+    .name = "RxLEv averaging",</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm = ulm3,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm3),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+             .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .toa256_max = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm4[] = {};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc4 = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "Empty measurements",</span><br><span style="color: hsl(120, 100%, 40%);">+       .ulm = ulm4,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm4),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .toa256_max = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm5[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* one 104 multiframe can at max contain 26 blocks (TCH/F),</span><br><span style="color: hsl(120, 100%, 40%);">+    * each of which can at maximum be 64 bits in advance (TA range) */</span><br><span style="color: hsl(120, 100%, 40%);">+   ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc5 = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .name = "TOA256 26 blocks with max TOA256",</span><br><span style="color: hsl(120, 100%, 40%);">+ .ulm = ulm5,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm5),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 110-90,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+                .toa256_max = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_min = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase models a good case as we can see it when all TCH</span><br><span style="color: hsl(120, 100%, 40%);">+ * and SACCH blocks are received */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_f_complete[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_f_complete = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "Complete TCH/F measurement period (26 measurements, 3 sub-frames)",</span><br><span style="color: hsl(120, 100%, 40%);">+        .ulm = ulm_tch_f_complete,</span><br><span style="color: hsl(120, 100%, 40%);">+    .ulm_count = ARRAY_SIZE(ulm_tch_f_complete),</span><br><span style="color: hsl(120, 100%, 40%);">+  .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 110-90,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+                .toa256_max = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_min = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase models an error case where two of 3 expected sub measurements</span><br><span style="color: hsl(120, 100%, 40%);">+ * are lost. The calculation logic must detect this and replace those</span><br><span style="color: hsl(120, 100%, 40%);">+ * measurements. Note that this example also lacks some blocks due to DTX,</span><br><span style="color: hsl(120, 100%, 40%);">+ * which is normal. */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_f_dtx_with_lost_subs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_f_dtx_with_lost_subs = {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* This testcase models a good case as we can see it when all TCH</span><br><span style="color: hsl(120, 100%, 40%);">+      * and SACCH blocks are received */</span><br><span style="color: hsl(120, 100%, 40%);">+   .name = "Incomplete TCH/F measurement period (16 measurements, 1 sub-frame)",</span><br><span style="color: hsl(120, 100%, 40%);">+       .ulm = ulm_tch_f_dtx_with_lost_subs,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm_tch_f_dtx_with_lost_subs),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 14,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 10485,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 7864,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase models a good-case with DTX. Some measurements are missing</span><br><span style="color: hsl(120, 100%, 40%);">+ * because no block was transmitted, all sub measurements are there. */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_f_dtx[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_f_dtx = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name = "Incomplete but normal TCH/F measurement period (16 measurements, 3 sub-frames)",</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm = ulm_tch_f_dtx,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ulm_count = ARRAY_SIZE(ulm_tch_f_dtx),</span><br><span style="color: hsl(120, 100%, 40%);">+       .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 14,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 10485,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 7864,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase models a good case as we can see it when all TCH</span><br><span style="color: hsl(120, 100%, 40%);">+ * and SACCH blocks are received */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_h_complete[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_h_complete = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "Complete TCH/H measurement period (26 measurements, 5 sub-frames)",</span><br><span style="color: hsl(120, 100%, 40%);">+        .ulm = ulm_tch_h_complete,</span><br><span style="color: hsl(120, 100%, 40%);">+    .ulm_count = ARRAY_SIZE(ulm_tch_h_complete),</span><br><span style="color: hsl(120, 100%, 40%);">+  .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_H,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 110-90,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+                .toa256_max = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_min = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_h_dtx_with_lost_subs[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_h_dtx_with_lost_subs = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .name = "Incomplete TCH/H measurement period (14 measurements, 3 sub-frames)",</span><br><span style="color: hsl(120, 100%, 40%);">+      .ulm = ulm_tch_h_dtx_with_lost_subs,</span><br><span style="color: hsl(120, 100%, 40%);">+  .ulm_count = ARRAY_SIZE(ulm_tch_h_dtx_with_lost_subs),</span><br><span style="color: hsl(120, 100%, 40%);">+        .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_H,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 12,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 9175,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 8132,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase models a good-case with DTX. Some measurements are missing</span><br><span style="color: hsl(120, 100%, 40%);">+ * because no block was transmitted, all sub measurements are there. */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_tch_h_dtx[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_tch_h_dtx = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name = "Incomplete but normal TCH/F measurement period (16 measurements, 5 sub-frames)",</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm = ulm_tch_h_dtx,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ulm_count = ARRAY_SIZE(ulm_tch_h_dtx),</span><br><span style="color: hsl(120, 100%, 40%);">+       .final_fn = 38,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_H,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 14,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 7,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 10485,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+              .toa256_std_dev = 7864,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* This testcase assumes that too many measurements were collected. This can</span><br><span style="color: hsl(120, 100%, 40%);">+ * happen when the measurement calculation for a previous cycle were not</span><br><span style="color: hsl(120, 100%, 40%);">+ * executed. In this case the older part of the excess data must be discarded.</span><br><span style="color: hsl(120, 100%, 40%);">+ * the calculation algorithm must make sure that the calculation only takes</span><br><span style="color: hsl(120, 100%, 40%);">+ * place on the last measurement interval */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_overrun[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        /* All measurements above must be discarded */</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 0, 90),          </span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_overrun = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name = "TCH/F measurement period with too much measurement values (overrun)",</span><br><span style="color: hsl(120, 100%, 40%);">+      .ulm = ulm_overrun,</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm_count = ARRAY_SIZE(ulm_overrun),</span><br><span style="color: hsl(120, 100%, 40%);">+ .final_fn = 25,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+     .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 110-90,</span><br><span style="color: hsl(120, 100%, 40%);">+                .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+                .toa256_max = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_min = 64*256,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SDCCH4 with all frames received */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_sdcch4_complete[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_sdcch4_complete = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "Complete SDCCH4 measurement period (3 measurements)",</span><br><span style="color: hsl(120, 100%, 40%);">+      .ulm = ulm_sdcch4_complete,</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm_count = ARRAY_SIZE(ulm_sdcch4_complete),</span><br><span style="color: hsl(120, 100%, 40%);">+ .final_fn = 88,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_CCCH_SDCCH4,</span><br><span style="color: hsl(120, 100%, 40%);">+       .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test SDCCH8 with all frames received */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct bts_ul_meas ulm_sdcch8_complete[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+        ULM(0, 64*256, 1, 90),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct meas_testcase mtc_sdcch8_complete = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "Complete SDCCH8 measurement period (3 measurements)",</span><br><span style="color: hsl(120, 100%, 40%);">+      .ulm = ulm_sdcch8_complete,</span><br><span style="color: hsl(120, 100%, 40%);">+   .ulm_count = ARRAY_SIZE(ulm_sdcch8_complete),</span><br><span style="color: hsl(120, 100%, 40%);">+ .final_fn = 66,</span><br><span style="color: hsl(120, 100%, 40%);">+       .ts = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+      .pchan = GSM_PCHAN_SDCCH8_SACCH8C,</span><br><span style="color: hsl(120, 100%, 40%);">+    .res = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .success = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+         .rx_lev_full = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+            .rx_qual_full = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+            .toa256_mean = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+         .toa256_max = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_min = 16384,</span><br><span style="color: hsl(120, 100%, 40%);">+          .toa256_std_dev = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10476">change 10476</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/10476"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Idd30fc07603ad7d042c1fb416e247c3bf7d35c8b </div>
<div style="display:none"> Gerrit-Change-Number: 10476 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>