summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorCyril Jourdan2013-06-03 15:28:00 +0200
committerCyril Jourdan2013-06-14 15:47:13 +0200
commitab201b5e54d2c07c489cf7fac7bcb4581a5a7ab6 (patch)
treee17fbbfe7ae2473c3f3db4722331e84099a57dc1 /cesar
parentcc38f2802734a7d7adf8c9ba42c0228d74072d44 (diff)
cesar/ce/rx/bl/fsm: use PBProc interval matching computation, refs #4018
Instead of re-computing frame date and trying to match it on an interval. In the same time, correct management of sound frame SRC in the tests when we want to test the data case and update ce_rx_bl_fsm_measure_to_event stub in cesar/ce/rx/test.
Diffstat (limited to 'cesar')
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm.c59
-rw-r--r--cesar/ce/rx/bitloading/src/transition.c5
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c5
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_intervals.c22
-rw-r--r--cesar/ce/rx/test/src/test_rx.c58
5 files changed, 93 insertions, 56 deletions
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm.c b/cesar/ce/rx/bitloading/fsm/src/fsm.c
index 2e0a183b91..f8c1e756a2 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm.c
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm.c
@@ -98,42 +98,47 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_SOUND_COMPLETED;
else
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_SOUND;
+
+ if (measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNAVAILABLE
+ || measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNUSABLE)
+ {
+ /* If SRC indicates that it is directed to an interval, generate
+ * an interval event. This event can be directed to global FSM if
+ * matching failed or if intervals were freed since the reception
+ * of the frame. */
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ if (sta->intervals
+ && (measure->rx_params.interval_group != PBPROC_NO_INT_MATCH))
+ measure->fsm_id = measure->rx_params.interval_group;
+ else
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ }
+ else
+ {
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ }
+
+
}
/* This is a data. */
else
+ {
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_DATA;
- /* Get interval information. */
- 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;
- /* Interval's research is only done if received measure is a data or a
- * sound or sound complete with a SRC indicating that it is directed to
- * an interval. Other SRCs should be handled by global FSM, even if they
- * are received on a specific interval. */
- if (type == CE_RX_FSM_MEASURE_TO_EVENT_TYPE_DATA
- || measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNAVAILABLE
- || measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNUSABLE)
- {
- 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)
+ /* Data should be sent to intervals' FSMs only if they exists and
+ * matching succeded. In any other case, let the global FSM handle
+ * those frames. */
+ if (sta->intervals
+ && (measure->rx_params.interval_group != PBPROC_NO_INT_MATCH))
{
- /* We are on an interval. */
has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
- measure->fsm_id = interval % ce_rx_bl_intervals_fsm_count_;
+ measure->fsm_id = measure->rx_params.interval_group;
}
- else if (type != CE_RX_FSM_MEASURE_TO_EVENT_TYPE_DATA)
+ else
{
- /* Indicate that sound frame received is directed to an interval
- * but let the global fsm handle it as we can not match this
- * actual interval. */
- has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
}
}
diff --git a/cesar/ce/rx/bitloading/src/transition.c b/cesar/ce/rx/bitloading/src/transition.c
index eff97ade80..73bfb4a721 100644
--- a/cesar/ce/rx/bitloading/src/transition.c
+++ b/cesar/ce/rx/bitloading/src/transition.c
@@ -116,9 +116,12 @@ ce_rx_bl__common__restart_ce_rx (ce_rx_t *ce_rx, sta_t *sta)
/* In RX, reset default tone map and remove tone maps. */
tonemaps_reset (sta->rx_tonemaps, &ce_rx->tonemap_release_list);
- /* Free intervals. */
if (sta->intervals)
{
+ /* Tell PBProc that intervals no longer exist. */
+ mac_interval_clear (sta->rx_tonemaps);
+ mac_interval_commit_changes (sta->rx_tonemaps, 0);
+ /* Free intervals. */
ce_rx_bl_intervals_free (sta->intervals);
sta->intervals = NULL;
}
diff --git a/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
index f69fa5290a..e63afa8d76 100644
--- a/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
+++ b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
@@ -346,6 +346,11 @@ test_ce_rx_bl_fsm_INTERVALS (test_t t)
fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
tonemaps_reset, .tms = sta.rx_tonemaps);
fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_clear, .tms = sta.rx_tonemaps);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_commit_changes,
+ .tms = sta.rx_tonemaps, .group_intervals_nb = 0);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
ce_rx_bl_nsr_sum_init, .bl = &sta.ce_rx_bt);
fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
scenario_run (t, fsm_base, &globals);
diff --git a/cesar/ce/rx/bitloading/test/src/test_intervals.c b/cesar/ce/rx/bitloading/test/src/test_intervals.c
index 99a5f36cbd..50e1cd88d9 100644
--- a/cesar/ce/rx/bitloading/test/src/test_intervals.c
+++ b/cesar/ce/rx/bitloading/test/src/test_intervals.c
@@ -317,12 +317,15 @@ test_suite_ce_rx_bl_intervals_measure_to_event_master_test (
bp_atu = MAC_TCK_TO_ATU (bp_tck);
if (intervals)
{
+ sta.intervals = ce_rx_bl_intervals_alloc (&sta.ce_rx_bt,
+ TONEMAP_INDEX_NEGOTIATED_FIRST);
for (i = 1; i <= 24; i++)
mac_interval_append (tms, bp_atu * i / 24, i);
mac_interval_commit_changes (tms, ce_rx_bl_intervals_fsm_count_);
}
+ else
+ sta.intervals = NULL;
sta.rx_tonemaps = tms;
- sta.intervals = NULL;
data.measure = &measure;
/* Configure measure. */
@@ -332,14 +335,13 @@ test_suite_ce_rx_bl_intervals_measure_to_event_master_test (
measure.rx_params.sound_src = TONEMAP_SRC_INTERVAL_UNAVAILABLE;
else
measure.rx_params.sound_src = TONEMAP_SRC_INITIAL;
- measure.rx_params.preamble_ntb = 0;
- measure.rx_params.beacon_period_start_ntb = 0;
+
+ /* Measure is located on an interval. */
+ if (mea_interval && (!sound || src_interval))
+ measure.rx_params.interval_group = 0;
/* Measure is global. */
- if (!mea_interval)
- measure.rx_params.fl_tck = bp_tck;
- /* Measure is located on an interval */
else
- measure.rx_params.fl_tck = bp_tck / 25;
+ measure.rx_params.interval_group = -1;
*event = ce_rx_bl_fsm_measure_to_event (&sta, data);
*fsm_id = measure.fsm_id;
@@ -347,6 +349,8 @@ test_suite_ce_rx_bl_intervals_measure_to_event_master_test (
/* Clean. */
tonemaps_release (tms);
ce_rx_bitloading_uninit (&sta.ce_rx_bt);
+ if (sta.intervals)
+ ce_rx_bl_intervals_free (sta.intervals);
}
void
@@ -479,7 +483,7 @@ test_suite_ce_rx_bl_intervals_measure_to_event (test_t t)
/* Measure is positioned on an interval ? */
false,
/* SRC is interval specific ? */
- true,
+ false,
&out, &fsm_id);
test_fail_if (out != CE_RX_BL_FSM_EVENT_TYPE_data);
test_fail_if (fsm_id != -1);
@@ -495,7 +499,7 @@ test_suite_ce_rx_bl_intervals_measure_to_event (test_t t)
/* Measure is positioned on an interval ? */
true,
/* SRC is interval specific ? */
- true,
+ false,
&out, &fsm_id);
test_fail_if (out != CE_RX_BL_FSM_EVENT_TYPE_interval_data);
test_fail_if (fsm_id != 0);
diff --git a/cesar/ce/rx/test/src/test_rx.c b/cesar/ce/rx/test/src/test_rx.c
index b157851412..d6102538a4 100644
--- a/cesar/ce/rx/test/src/test_rx.c
+++ b/cesar/ce/rx/test/src/test_rx.c
@@ -121,25 +121,6 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
ce_rx_measure_mbox_t *measure = data.measure;
dbg_assert (measure);
- /* Get interval information. */
- 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;
- 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)
- {
- /* We are on an interval. */
- has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
- measure->fsm_id = interval % ce_rx_bl_intervals_fsm_count_;
- }
-
/* Is this measure a Sound ? */
if (measure->rx_params.sound)
{
@@ -147,11 +128,50 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_SOUND_COMPLETED;
else
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_SOUND;
+
+ if (measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNAVAILABLE
+ || measure->rx_params.sound_src == TONEMAP_SRC_INTERVAL_UNUSABLE)
+ {
+ /* If SRC indicates that it is directed to an interval, generate
+ * an interval event. This event can be directed to global FSM if
+ * matching failed or if intervals were freed since the reception
+ * of the frame. */
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ if (sta->intervals
+ && (measure->rx_params.interval_group != PBPROC_NO_INT_MATCH))
+ measure->fsm_id = measure->rx_params.interval_group;
+ else
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ }
+ else
+ {
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ }
+
+
}
/* This is a data. */
else
+ {
type = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_DATA;
+ /* Data should be sent to intervals' FSMs only if they exists and
+ * matching succeded. In any other case, let the global FSM handle
+ * those frames. */
+ if (sta->intervals
+ && (measure->rx_params.interval_group != PBPROC_NO_INT_MATCH))
+ {
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
+ measure->fsm_id = measure->rx_params.interval_group;
+ }
+ else
+ {
+ has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_GLOBAL;
+ measure->fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ }
+ }
+
return event_tab[has_interval][type];
}