summaryrefslogtreecommitdiff
path: root/cesar/ce
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/ce')
-rw-r--r--cesar/ce/rx/bitloading/inc/intervals.h4
-rw-r--r--cesar/ce/rx/bitloading/src/intervals.c24
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_intervals.c44
3 files changed, 55 insertions, 17 deletions
diff --git a/cesar/ce/rx/bitloading/inc/intervals.h b/cesar/ce/rx/bitloading/inc/intervals.h
index 350e52d0c5..7a5a7bc141 100644
--- a/cesar/ce/rx/bitloading/inc/intervals.h
+++ b/cesar/ce/rx/bitloading/inc/intervals.h
@@ -17,6 +17,7 @@
*/
#include "mac/pbproc/pbproc.h"
+#include "bsu/aclf/aclf.h"
BEGIN_DECLS
@@ -54,9 +55,10 @@ ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
/*
* Reconstruct RX intervals based on fsm TMI.
* \param sta station.
+ * \param bp_tck theoretical beacon period in ticks.
*/
void
-ce_rx_bl_intervals_update_tmi (sta_t *sta);
+ce_rx_bl_intervals_update_tmi (sta_t *sta, const bsu_aclf_bp_t bp_tck);
END_DECLS
diff --git a/cesar/ce/rx/bitloading/src/intervals.c b/cesar/ce/rx/bitloading/src/intervals.c
index 91b6f88f91..3ae01b1744 100644
--- a/cesar/ce/rx/bitloading/src/intervals.c
+++ b/cesar/ce/rx/bitloading/src/intervals.c
@@ -100,26 +100,34 @@ ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
}
void
-ce_rx_bl_intervals_update_tmi (sta_t *sta)
+ce_rx_bl_intervals_update_tmi (sta_t *sta, const bsu_aclf_bp_t bp_tck)
{
dbg_assert (sta);
dbg_assert (sta->intervals);
int i;
+ u8 res;
ce_rx_bitloading_intervals_t *its = sta->intervals;
- dbg_assert (sta->rx_tonemaps->intervals->intervals_nb > 0);
- u16 bp = sta->rx_tonemaps->intervals->interval
- [sta->rx_tonemaps->intervals->intervals_nb - 1].end_offset_atu;
- int total_ints = mac_interval_fsm_count_
+
+ u16 bp_atu = MAC_TCK_TO_ATU (bp_tck);
+ int total_ints = mac_interval_fsm_count_
* mac_interval_repetition_count_;
mac_interval_clear (sta->rx_tonemaps);
- for (i = 0; i < total_ints; i++)
+ for (i = 0; i < total_ints - 1; i++)
{
- mac_interval_append (
+ res = mac_interval_append (
sta->rx_tonemaps,
- bp * (i + 1) / total_ints,
+ bp_atu * (i + 1) / total_ints,
its->tmi[i % mac_interval_fsm_count_]);
+ dbg_assert (res == i + 1);
}
+ /* Last interval duration is increased to fit with max theoretical beacon
+ * period duration. */
+ res = mac_interval_append (
+ sta->rx_tonemaps,
+ bp_atu + MAC_TCK_TO_ATU (HPAV_BEACON_BTO_MAX_TCK),
+ its->tmi[(total_ints - 1) % mac_interval_fsm_count_]);
+ dbg_assert (res == total_ints);
mac_interval_commit_changes (sta->rx_tonemaps);
}
diff --git a/cesar/ce/rx/bitloading/test/src/test_intervals.c b/cesar/ce/rx/bitloading/test/src/test_intervals.c
index de72ce7eda..5bb8050fde 100644
--- a/cesar/ce/rx/bitloading/test/src/test_intervals.c
+++ b/cesar/ce/rx/bitloading/test/src/test_intervals.c
@@ -408,23 +408,20 @@ test_suite_ce_rx_bl_intervals_update_tmi (test_t t)
{
test_case_begin (t, "Update TMI of intervals.");
- test_begin (t, "simple test")
+ test_begin (t, "Check TMIs are correctly set")
{
int i;
sta_t sta;
sta_init (&sta, 42);
- mac_interval_clear (sta.rx_tonemaps);
- mac_interval_append (sta.rx_tonemaps, 1000, 42);
- mac_interval_commit_changes (sta.rx_tonemaps);
-
sta.intervals = ce_rx_bl_intervals_alloc (0);
for (i = 0; i < mac_interval_fsm_count_; i++)
sta.intervals->tmi[i] = i;
-
- ce_rx_bl_intervals_update_tmi (&sta);
-
+ ce_rx_bl_intervals_update_tmi (&sta, BSU_ACLF_BP_50HZ_TCK);
tonemap_intervals_t *ints = sta.rx_tonemaps->intervals;
+ test_fail_if (ints->intervals_nb != mac_interval_fsm_count_
+ * mac_interval_repetition_count_);
+
for (i = 0; i < ints->intervals_nb; i++)
test_fail_unless
(i % mac_interval_fsm_count_ == ints->interval[i].tmi);
@@ -432,6 +429,37 @@ test_suite_ce_rx_bl_intervals_update_tmi (test_t t)
sta.intervals = NULL;
sta_uninit (&sta);
} test_end;
+
+ test_begin (t, "Check end offset of intervals")
+ {
+ int i;
+ uint j;
+ sta_t sta;
+ sta_init (&sta, 42);
+
+ sta.intervals = ce_rx_bl_intervals_alloc (0);
+
+ bsu_aclf_bp_t bp_th_tck[3] = {BSU_ACLF_BP_50HZ_TCK,
+ BSU_ACLF_BP_55HZ_TCK,
+ BSU_ACLF_BP_60HZ_TCK};
+
+ for (j = 0; j < COUNT (bp_th_tck); j++)
+ {
+ tonemap_intervals_t *ints = sta.rx_tonemaps->intervals;
+ u16 bp_atu = MAC_TCK_TO_ATU (bp_th_tck[j]
+ + HPAV_BEACON_BTO_MAX_TCK);
+
+ ce_rx_bl_intervals_update_tmi (&sta, bp_th_tck[j]);
+
+ for (i = 0; i < ints->intervals_nb; i++)
+ test_fail_unless (bp_atu * (i + 1) / ints->intervals_nb ==
+ ints->interval[i].end_offset_atu);
+ }
+
+ ce_rx_bl_intervals_free (sta.intervals);
+ sta.intervals = NULL;
+ sta_uninit (&sta);
+ } test_end;
}
void