summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorJalil Chemseddine2012-12-05 10:23:23 +0100
committerCyril Jourdan2013-01-18 11:53:54 +0100
commit5e442fe7016020dd5135cfd7b4c59c2c05446712 (patch)
tree0e919adb4bdd281a254cbc9178abd050df7730d1 /cesar
parentebeeb6b1e402655a0e7af814cd220efffb4a1076 (diff)
cesar/ce/rx/bl: keep measure of the frames before beacon period, refs #2362
For frames crossing the beacon period, the receiver sees frame date before beacon period start date. The measures for those frames were dropped whereas they are usable...
Diffstat (limited to 'cesar')
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm.c25
-rw-r--r--cesar/ce/rx/bitloading/inc/intervals.h14
-rw-r--r--cesar/ce/rx/bitloading/src/intervals.c26
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_intervals.c54
-rw-r--r--cesar/ce/rx/test/src/test_rx.c28
5 files changed, 66 insertions, 81 deletions
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm.c b/cesar/ce/rx/bitloading/fsm/src/fsm.c
index 46adc4ca23..e7c8cc0af4 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm.c
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm.c
@@ -92,24 +92,21 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
dbg_assert (measure);
/* Get interval information. */
- u16 start_date_atu, end_date_atu;
+ int interval;
+ s16 start_date_atu, end_date_atu;
/* Global by default. */
has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
- if (ce_rx_bl_intervals_measure_to_date (&measure->rx_params,
- &start_date_atu,
- &end_date_atu))
+ ce_rx_bl_intervals_measure_to_date (&measure->rx_params,&start_date_atu,
+ &end_date_atu);
+ interval = ce_rx_bl_intervals_measure_to_interval (sta->rx_tonemaps,
+ start_date_atu,
+ end_date_atu);
+ if (interval != CE_RX_MEASURE_NO_INTERVAL)
{
- int interval;
- interval = ce_rx_bl_intervals_measure_to_interval (sta->rx_tonemaps,
- start_date_atu,
- end_date_atu);
- if (interval != -1)
- {
- /* We are on an interval. */
- has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
- measure->fsm_id = interval % mac_interval_fsm_count_;
- }
+ /* We are on an interval. */
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ measure->fsm_id = interval % mac_interval_fsm_count_;
}
/* Is this measure a Sound ? */
diff --git a/cesar/ce/rx/bitloading/inc/intervals.h b/cesar/ce/rx/bitloading/inc/intervals.h
index 12824b1cbe..32a45535b6 100644
--- a/cesar/ce/rx/bitloading/inc/intervals.h
+++ b/cesar/ce/rx/bitloading/inc/intervals.h
@@ -32,15 +32,11 @@ BEGIN_DECLS
* at this address.
* \param end_date_atu end date (in ATU) corresponds to PPDU payload end.
* It must already be allocated, end date will be written at this address.
- * \return true if the dates are valid, false otherwise. Having a invalid
- * date mean the measure appear between two beacon periods. If false,
- * start_date_atu and end_date_atu stay unchanged. If true, values of
- * start_date_atu and end_date_atu are set.
*/
-bool
+void
ce_rx_bl_intervals_measure_to_date (pbproc_rx_params_t *rx_param,
- u16 *start_date_atu,
- u16 *end_date_atu);
+ s16 *start_date_atu,
+ s16 *end_date_atu);
/**
* Inform if a measure is on an interval or not and give this interval.
@@ -51,8 +47,8 @@ ce_rx_bl_intervals_measure_to_date (pbproc_rx_params_t *rx_param,
*/
int
ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
- u16 mea_start,
- u16 mea_end);
+ s16 mea_start,
+ s16 mea_end);
/*
* Reconstruct RX intervals based on fsm TMI.
diff --git a/cesar/ce/rx/bitloading/src/intervals.c b/cesar/ce/rx/bitloading/src/intervals.c
index fe21012cfc..332f66937a 100644
--- a/cesar/ce/rx/bitloading/src/intervals.c
+++ b/cesar/ce/rx/bitloading/src/intervals.c
@@ -21,27 +21,22 @@
#include "ce/rx/cp/inc/cp.h"
#include "ce_rx_bl_fsm_defs.h"
-bool
+void
ce_rx_bl_intervals_measure_to_date (pbproc_rx_params_t *rx_param,
- u16 *start_date_atu,
- u16 *end_date_atu)
+ s16 *start_date_atu,
+ s16 *end_date_atu)
{
dbg_assert (rx_param);
dbg_assert (start_date_atu);
dbg_assert (end_date_atu);
- /* Can't have beacon period start NTB > preamble start. */
- if (less_mod2p32 (rx_param->preamble_ntb,
- rx_param->beacon_period_start_ntb))
- return false;
-
/* Estimate the start date.
* As we don't know how in which mode we are, we take an average of hybrid
* and AV modes. */
u32 average_tck = ((MAC_PREAMBLE_HYBRID_TCK + MAC_FC_10_TCK + MAC_FC_AV_TCK)
+ (MAC_PREAMBLE_TCK + MAC_FC_AV_TCK)) / 2;
*start_date_atu = MAC_TCK_TO_ATU (
- ABS ((s32) (rx_param->preamble_ntb - rx_param->beacon_period_start_ntb))
+ ((s32) (rx_param->preamble_ntb - rx_param->beacon_period_start_ntb))
+ average_tck);
/* Estimate the end date. */
@@ -49,13 +44,12 @@ ce_rx_bl_intervals_measure_to_date (pbproc_rx_params_t *rx_param,
/* Check we didn't have overflowed. */
dbg_assert (*start_date_atu < *end_date_atu);
- return true;
}
int
ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
- u16 mea_start,
- u16 mea_end)
+ s16 mea_start,
+ s16 mea_end)
{
dbg_assert (tms);
dbg_assert (tms->intervals);
@@ -68,7 +62,9 @@ ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
/* We take the middle of the measure and see in which interval it is
* supposed to be. */
- u16 mea_middle = (mea_start + mea_end) / 2;
+ s16 mea_middle = (mea_start + mea_end) / 2;
+ if (mea_middle <= 0)
+ return -1;
/* Measure middle is contained in this interval. */
u8 int_num = tonemap_interval_find (tms, mea_middle);
@@ -81,8 +77,8 @@ ce_rx_bl_intervals_measure_to_interval (tonemaps_t *tms,
/* Get the start/end date of this interval. */
/* We remove 1 because the date correspond to the next interval. */
- u16 int_end = ints->interval[int_num].end_offset_atu - 1;
- u16 int_start;
+ s16 int_end = ints->interval[int_num].end_offset_atu - 1;
+ s16 int_start;
if (int_num == 0)
int_start = 0;
else
diff --git a/cesar/ce/rx/bitloading/test/src/test_intervals.c b/cesar/ce/rx/bitloading/test/src/test_intervals.c
index 764d6ab098..c319e2688e 100644
--- a/cesar/ce/rx/bitloading/test/src/test_intervals.c
+++ b/cesar/ce/rx/bitloading/test/src/test_intervals.c
@@ -72,8 +72,7 @@ void
test_suite_ce_rx_bl_intervals_measure_to_date (test_t t)
{
test_case_begin (t, "Time transformation from pbproc timing to ATU");
- u16 start = 0, end = 0;
- bool out;
+ s16 start = 0, end = 0;
pbproc_rx_params_t rxp;
test_begin (t, "Classic value")
@@ -81,40 +80,38 @@ test_suite_ce_rx_bl_intervals_measure_to_date (test_t t)
rxp.preamble_ntb = 2000000;
rxp.beacon_period_start_ntb = 1000000;
rxp.fl_tck = 1000;
- out = ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
- u16 computed_start = MAC_TCK_TO_ATU (
+ ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
+ s16 computed_start = MAC_TCK_TO_ATU (
((MAC_PREAMBLE_HYBRID_TCK + MAC_FC_10_TCK + MAC_FC_AV_TCK)
+ (MAC_PREAMBLE_TCK + MAC_FC_AV_TCK)) / 2 + 1000000);
test_fail_unless (computed_start == start);
- test_fail_unless (end == start + MAC_TCK_TO_ATU (rxp.fl_tck));
- test_fail_unless (out == true);
+ test_fail_unless (end == start + (s16) MAC_TCK_TO_ATU (rxp.fl_tck));
} test_end;
- test_begin (t, "Overflowed counter value")
+ test_begin (t, "Beacon period start after preamble")
{
- rxp.preamble_ntb = 1;
- rxp.beacon_period_start_ntb = 0xfffff000;
+ rxp.preamble_ntb = 1000;
+ rxp.beacon_period_start_ntb = 2000;
rxp.fl_tck = 1000;
- out = ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
- u16 computed_start = MAC_TCK_TO_ATU (
+ ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
+ s16 computed_start = MAC_TCK_TO_ATU (
((MAC_PREAMBLE_HYBRID_TCK + MAC_FC_10_TCK + MAC_FC_AV_TCK)
- + (MAC_PREAMBLE_TCK + MAC_FC_AV_TCK)) / 2 + (s32) (1 - 0xfffff000));
+ + (MAC_PREAMBLE_TCK + MAC_FC_AV_TCK)) / 2 + (s32) (1000 - 2000));
test_fail_unless (computed_start == start);
- test_fail_unless (end == start + MAC_TCK_TO_ATU (rxp.fl_tck));
- test_fail_unless (out == true);
+ test_fail_unless (end == start + (s16) MAC_TCK_TO_ATU (rxp.fl_tck));
} test_end;
- test_begin (t, "Invalid value: beacon period start after preamble")
+ test_begin (t, "Overflowed counter value")
{
- rxp.preamble_ntb = 1000;
- rxp.beacon_period_start_ntb = 2000;
+ rxp.preamble_ntb = 1;
+ rxp.beacon_period_start_ntb = 0xfffff000;
rxp.fl_tck = 1000;
- start = 0;
- end = 0;
- out = ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
- test_fail_unless (out == false);
- test_fail_unless (start == 0);
- test_fail_unless (end == 0);
+ ce_rx_bl_intervals_measure_to_date (&rxp, &start, &end);
+ s16 computed_start = MAC_TCK_TO_ATU (
+ ((MAC_PREAMBLE_HYBRID_TCK + MAC_FC_10_TCK + MAC_FC_AV_TCK)
+ + (MAC_PREAMBLE_TCK + MAC_FC_AV_TCK)) / 2 + (s32) (1 - 0xfffff000));
+ test_fail_unless (computed_start == start);
+ test_fail_unless (end == start + (s16) MAC_TCK_TO_ATU (rxp.fl_tck));
} test_end;
}
@@ -239,15 +236,16 @@ test_suite_ce_rx_bl_intervals_measure_to_event_master_test (
ce_rx_measure_mbox_t measure;
ce_rx_bitloading_fsm_event_param_t data;
int i;
- uint bp;
+ uint bp_tck, bp_atu;
ce_rx_bitloading_init (&sta.ce_rx_bt);
tms = tonemaps_alloc ();
- bp = MAC_TCK_TO_ATU (BSU_ACLF_BP_50HZ_TCK);
+ bp_tck = BSU_ACLF_BP_50HZ_TCK;
+ bp_atu = MAC_TCK_TO_ATU (bp_tck);
if (intervals)
{
for (i = 1; i <= 24; i++)
- mac_interval_append (tms, bp * i / 24, i);
+ mac_interval_append (tms, bp_atu * i / 24, i);
mac_interval_commit_changes (tms);
}
sta.rx_tonemaps = tms;
@@ -261,10 +259,10 @@ test_suite_ce_rx_bl_intervals_measure_to_event_master_test (
measure.rx_params.beacon_period_start_ntb = 0;
/* Measure is global. */
if (!mea_interval)
- measure.rx_params.fl_tck = 30000000;
+ measure.rx_params.fl_tck = bp_tck;
/* Measure is located on an interval */
else
- measure.rx_params.fl_tck = bp / 25;
+ measure.rx_params.fl_tck = bp_tck / 25;
*event = ce_rx_bl_fsm_measure_to_event (&sta, data);
*fsm_id = measure.fsm_id;
diff --git a/cesar/ce/rx/test/src/test_rx.c b/cesar/ce/rx/test/src/test_rx.c
index 955d1bb49b..df6008b185 100644
--- a/cesar/ce/rx/test/src/test_rx.c
+++ b/cesar/ce/rx/test/src/test_rx.c
@@ -122,24 +122,22 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
dbg_assert (measure);
/* Get interval information. */
- u16 start_date_atu, end_date_atu;
- measure->fsm_id = -1;
+ int interval;
+ s16 start_date_atu, end_date_atu;
/* Global by default. */
has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
- if (ce_rx_bl_intervals_measure_to_date (&measure->rx_params,
- &start_date_atu,
- &end_date_atu))
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ ce_rx_bl_intervals_measure_to_date (&measure->rx_params,
+ &start_date_atu,
+ &end_date_atu);
+ interval = ce_rx_bl_intervals_measure_to_interval (sta->rx_tonemaps,
+ start_date_atu,
+ end_date_atu);
+ if (interval != CE_RX_MEASURE_NO_INTERVAL)
{
- int interval;
- interval = ce_rx_bl_intervals_measure_to_interval (sta->rx_tonemaps,
- start_date_atu,
- end_date_atu);
- if (interval != -1)
- {
- /* We are on an interval. */
- has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
- measure->fsm_id = interval % mac_interval_fsm_count_;
- }
+ /* We are on an interval. */
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ measure->fsm_id = interval % mac_interval_fsm_count_;
}
/* Is this measure a Sound ? */