summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorJérôme Jutteau2011-09-23 17:55:30 +0200
committerCyril Jourdan2013-01-18 11:53:44 +0100
commit54d22b2dc90686c4c8c6adb8411a18c2adb89d96 (patch)
treece665d5c752d63249cdc758bc877636864d91ad4 /cesar
parentaf08cd04895692bbfbc77474542d35ee16dca28a (diff)
cesar/ce/rx/bl: adjust global fsm transitions for intervals, refs #2366
Diffstat (limited to 'cesar')
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm1
-rw-r--r--cesar/ce/rx/bitloading/inc/intervals.h10
-rw-r--r--cesar/ce/rx/bitloading/inc/transition.h13
-rw-r--r--cesar/ce/rx/bitloading/src/intervals.c15
-rw-r--r--cesar/ce/rx/bitloading/src/transition.c64
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/Makefile9
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h11
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c4
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c307
-rw-r--r--cesar/ce/rx/inc/trace.h1
-rw-r--r--cesar/ce/rx/src/trace.c2
11 files changed, 427 insertions, 10 deletions
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm b/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
index 8f71f3bfea..d43e6d3dfe 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
@@ -97,6 +97,7 @@ INTERVALS:
Restart CE.
Copy the noise NRJ to initialize the mean/sum.
sound_completed -> .
+ data -> .
INTERVAL_TRACKING:
interval_sound -> INTERVAL_SOUND
diff --git a/cesar/ce/rx/bitloading/inc/intervals.h b/cesar/ce/rx/bitloading/inc/intervals.h
index 53d04648e9..12824b1cbe 100644
--- a/cesar/ce/rx/bitloading/inc/intervals.h
+++ b/cesar/ce/rx/bitloading/inc/intervals.h
@@ -74,6 +74,16 @@ ce_rx_bl_intervals_update_tmi (sta_t *sta, const bsu_aclf_bp_t bp_tck);
void
ce_rx_bl_intervals_reset (ce_rx_t *ce_rx, sta_t *sta, int fsm_id);
+/**
+ * Start intervals by allocating them, construct intervals and send a refresh
+ * MME.
+ * \param ce_rx CE RX context.
+ * \param sta station.
+ */
+
+void
+ce_rx_bl_intervals_start (ce_rx_t *ce_rx, sta_t *sta);
+
END_DECLS
#endif /* ce_rx_bitloading_inc_intervals_h */
diff --git a/cesar/ce/rx/bitloading/inc/transition.h b/cesar/ce/rx/bitloading/inc/transition.h
index faca1a1739..358e7b956e 100644
--- a/cesar/ce/rx/bitloading/inc/transition.h
+++ b/cesar/ce/rx/bitloading/inc/transition.h
@@ -165,6 +165,19 @@ ce_rx_bl_fsm__INTERVALS__sound_completed (
ce_rx_bitloading_fsm_event_param_t data);
/**
+ * Handle reception of a data event in INTERVALS state.
+ * \param ce_rx the CE RX context.
+ * \param sta the corresponding sta.
+ * \param data the data associated to the event.
+ * \return the next state.
+ */
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INTERVALS__data (
+ ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data);
+
+/**
* Handle reception of a sound on an interval (not complete) event in
* INTERVAL_TRACKING state (interval FSM).
* \param ce_rx the CE RX context.
diff --git a/cesar/ce/rx/bitloading/src/intervals.c b/cesar/ce/rx/bitloading/src/intervals.c
index 3798d09cd6..1d91d9db97 100644
--- a/cesar/ce/rx/bitloading/src/intervals.c
+++ b/cesar/ce/rx/bitloading/src/intervals.c
@@ -164,3 +164,18 @@ ce_rx_bl_intervals_reset (ce_rx_t *ce_rx, sta_t *sta, int fsm_id)
/* Send refresh TMI list with intervals. */
ce_rx_cp_send_mme_refresh_tmi_list (ce_rx, sta);
}
+
+void
+ce_rx_bl_intervals_start (ce_rx_t *ce_rx, sta_t *sta)
+{
+ dbg_assert (ce_rx);
+ dbg_assert (ce_rx->aclf);
+ dbg_assert (sta);
+ dbg_assert (sta->rx_tonemaps);
+ /* Allocate intervals structure. */
+ sta->intervals = ce_rx_bl_intervals_alloc (sta->rx_tonemaps->default_tmi);
+ /* Construct intervals. */
+ ce_rx_bl_intervals_update_tmi (sta, ce_rx->aclf->beacon_period_tck);
+ /* Send refresh TMI list with intervals. */
+ ce_rx_cp_send_mme_refresh_tmi_list (ce_rx, sta);
+}
diff --git a/cesar/ce/rx/bitloading/src/transition.c b/cesar/ce/rx/bitloading/src/transition.c
index 7742f274f2..eed4f03b43 100644
--- a/cesar/ce/rx/bitloading/src/transition.c
+++ b/cesar/ce/rx/bitloading/src/transition.c
@@ -376,11 +376,20 @@ ce_rx_bl_fsm__IDLE__sound_completed (
sta_t *sta,
ce_rx_bitloading_fsm_event_param_t data)
{
+ /* Compute default tone map and send it. */
ce_rx_bl__common_sound_measure_received (ce_rx,
sta,
data.measure,
true);
- return ce_rx_bl_fsm_next_branch (IDLE, sound_completed, no_mode_interval);
+ /* Construct and announce intervals. */
+ if (ce_rx_behavior == CE_RX_BEHAVIOR_INTERVALS_ENABLE)
+ {
+ ce_rx_bl_intervals_start (ce_rx, sta);
+ return ce_rx_bl_fsm_next_branch (IDLE, sound_completed, mode_interval);
+ }
+ else
+ return ce_rx_bl_fsm_next_branch (IDLE, sound_completed,
+ no_mode_interval);
}
ce_rx_bl_fsm_branch_t
@@ -415,9 +424,18 @@ ce_rx_bl_fsm__INITIAL__sound_completed (
sta,
data.measure,
false);
- return ce_rx_bl_fsm_next_branch (INITIAL,
- sound_completed,
- no_mode_interval);
+ /* Construct and announce intervals. */
+ if (ce_rx_behavior == CE_RX_BEHAVIOR_INTERVALS_ENABLE)
+ {
+ ce_rx_bl_intervals_start (ce_rx, sta);
+ return ce_rx_bl_fsm_next_branch (INITIAL,
+ sound_completed,
+ mode_interval);
+ }
+ else
+ return ce_rx_bl_fsm_next_branch (INITIAL,
+ sound_completed,
+ no_mode_interval);
}
ce_rx_bl_fsm_branch_t
@@ -557,8 +575,17 @@ ce_rx_bl_fsm__INTERVALS__sound (ce_rx_t *ce_rx,
sta_t *sta,
ce_rx_bitloading_fsm_event_param_t data)
{
- /* TODO, we should not execute this for the moment. */
- dbg_assert_default ();
+ ce_debug_gpio_event
+ (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_SOUND, true);
+ /* Restart CE in RX. */
+ CE_RX_TRACE (RESTART_FORCED, sta->tei);
+ ce_rx_bl_stats_update (&sta->ce_rx_bt, sta,
+ CE_RX_BL_RESTART_REASON_PEER_REQUEST);
+ ce_rx_bl__common__restart_ce_rx (ce_rx, sta);
+ /* Initialize sum of NSR. */
+ ce_rx_bl_nsr_sum_init (&sta->ce_rx_bt,
+ data.measure->chan_data,
+ data.measure->chan_data_count);
return ce_rx_bl_fsm_next (INTERVALS, sound);
}
@@ -568,12 +595,33 @@ ce_rx_bl_fsm__INTERVALS__sound_completed (
sta_t *sta,
ce_rx_bitloading_fsm_event_param_t data)
{
- /* TODO, we should not execute this for the moment. */
- dbg_assert_default ();
+ /* As in TRACKING, maybe more than one sound complete flag.
+ * Let's ignore it. */
return ce_rx_bl_fsm_next (INTERVALS, sound_completed);
}
ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INTERVALS__data (
+ ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Intervals may not be respected by remote peer if it is using default
+ * TMI or ROBO tonemap. */
+ dbg_assert (sta);
+ dbg_assert (sta->rx_tonemaps);
+ dbg_assert (data.measure);
+ uint tmi = data.measure->rx_params.tmi_av;
+ if (tmi != sta->rx_tonemaps->default_tmi
+ && TONEMAP_INDEX_IS_NEGOTIATED (tmi))
+ CE_RX_TRACE (WRONG_TMI, sta->tei, CE_RX_MEASURE_NO_INTERVAL, tmi,
+ sta->rx_tonemaps->default_tmi);
+
+ return ce_rx_bl_fsm_next (INTERVALS, data);
+}
+
+
+ce_rx_bl_fsm_branch_t
ce_rx_bl_fsm__INTERVAL_TRACKING__interval_sound (
ce_rx_t *ce_rx,
sta_t *sta,
diff --git a/cesar/ce/rx/bitloading/test/intervals/Makefile b/cesar/ce/rx/bitloading/test/intervals/Makefile
index 10805c0c59..e9e8a42648 100644
--- a/cesar/ce/rx/bitloading/test/intervals/Makefile
+++ b/cesar/ce/rx/bitloading/test/intervals/Makefile
@@ -1,5 +1,5 @@
# List of program to build.
-HOST_PROGRAMS = test_ce_intervals_fsm
+HOST_PROGRAMS = test_ce_intervals_fsm test_ce_fsm
# Base directory.
BASE = ../../../../..
@@ -11,6 +11,13 @@ test_ce_intervals_fsm_MODULES = lib ce/rx/bitloading/fsm ce/rx/bitloading \
ce/rx/cp/stub ce/common lib/scenario
test_ce_intervals_CONFIG_MODULES = cp
+test_ce_fsm_SOURCES = scenario_intervals_actions.c \
+ test_fsm.c scenario_intervals_events.c \
+ ../../src/ecos_stub.c
+test_ce_fsm_MODULES = lib ce/rx/bitloading/fsm ce/rx/bitloading \
+ ce/rx/cp/stub ce/common lib/scenario
+test_ce_fsm_CONFIG_MODULES = cp
+
ce_rx_bitloading_MODULE_SOURCES = transition.c intervals.c common.c pber.c \
ber_margin_update.c
mac_common_MODULE_SOURCES = interval.c
diff --git a/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h b/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
index 6f56e6c7ba..e8516c7f1e 100644
--- a/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
+++ b/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
@@ -35,7 +35,11 @@
INTERVAL_SOUND__interval_data, \
INTERVAL_SOUND_WAIT__interval_sound, \
INTERVAL_SOUND_WAIT__interval_sound_completed, \
- INTERVAL_SOUND_WAIT__interval_data
+ INTERVAL_SOUND_WAIT__interval_data, \
+ IDLE__sound_completed, \
+ INITIAL__sound_completed, \
+ INTERVALS__sound, \
+ INTERVALS__sound_completed
/* Actions with default parameters. */
#define __action(action) \
@@ -61,6 +65,11 @@ __action (INTERVAL_SOUND_WAIT__interval_sound);
__action (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action (INTERVAL_SOUND_WAIT__interval_data);
+__action (IDLE__sound_completed);
+__action (INITIAL__sound_completed);
+__action (INTERVALS__sound);
+__action (INTERVALS__sound_completed);
+
#undef __action
/* Scenario events. */
diff --git a/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c b/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
index c0fde0f6dc..4d62949adf 100644
--- a/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
+++ b/cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c
@@ -38,3 +38,7 @@ __action_def (INTERVAL_SOUND_WAIT__interval_sound);
__action_def (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action_def (INTERVAL_SOUND_WAIT__interval_data);
+__action_def (IDLE__sound_completed);
+__action_def (INITIAL__sound_completed);
+__action_def (INTERVALS__sound);
+__action_def (INTERVALS__sound_completed);
diff --git a/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
new file mode 100644
index 0000000000..da96df089b
--- /dev/null
+++ b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
@@ -0,0 +1,307 @@
+/* Cesar project {{{
+ *
+ * Copyright (C) 2010 Spidcom
+ *
+ * <<<Licence>>>
+ *
+ * }}} */
+/**
+ * \file ce/rx/bitloading/test/intervals/src/test_fsm.c
+ * \brief Test new FSM transitions for intervals.
+ * \ingroup test
+ */
+#include "common/std.h"
+
+#include "ce/rx/inc/rx.h"
+#include "ce/rx/bitloading/fsm/event.h"
+#include "ce/rx/bitloading/inc/ber.h"
+#include "ce/rx/bitloading/inc/pber.h"
+#include "ce/rx/inc/measure.h"
+#include "ce/common/mod.h"
+#include "mac/common/sta.h"
+#include "mac/common/tonemap.h"
+#include "ce_rx_bl_fsm_defs.h"
+
+#include "lib/test.h"
+#include "lib/scenario/scenario.h"
+#include "lib/preproc.h"
+#include "lib/rnd.h"
+
+#include <cyg/kernel/kapi.h>
+#include <string.h>
+
+u8 mac_interval_fsm_count_ = 6;
+u8 mac_interval_repetition_count_ = 4;
+u16 mac_interval_measure_shift_tolerance_ = 0;
+
+/**
+ * The configuration of the BER module.
+ */
+ce_rx_bl_ber_conf_t ce_rx_bl_ber_conf;
+
+/* Global CE/RX behavior stub. */
+ce_rx_behavior_t ce_rx_behavior = CE_RX_BEHAVIOR_INTERVALS_ENABLE;
+
+static void
+test_ce_rx_bl_fsm_IDLE (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, .tck_per_rtc = 1};
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+ ce_rx_measure_mbox_t measure;
+ u8 default_tmi = 0; /* ROBO */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = default_tmi;
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "IDLE, sound_completed while mode_interval is on");
+
+ test_begin (t, "The transition branch to mode_interval.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ IDLE__sound_completed, .sta = &sta, .measure = measure,
+ .branch = ce_rx_bl_fsm_next_branch (IDLE, sound_completed,
+ mode_interval));
+ 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_EVENT (
+ ce_rx_bl_nsr_compute_mean, .bl = &sta.ce_rx_bt);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_initial, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_set_first_free_tmi);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_ber_sliding_mean_update,
+ .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_new_tone_map,
+ .ce_rx = &ce, .peer = &sta,
+ .new_tmi = DEFAULT_NEW_TMI, .old_tmi = 0, .initial_ce = true);
+
+ /* Check intervals are updated with default tmi */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_clear, .tms = &rx_tms);
+ int j;
+ int total_ints = mac_interval_fsm_count_ *
+ mac_interval_repetition_count_;
+
+ for (j = 0; j < total_ints; j++)
+ {
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_append, .tms = &rx_tms, .tmi = DEFAULT_NEW_TMI);
+ }
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_commit_changes, .tms = &rx_tms);
+
+ /* - check MMe is sent */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_refresh_tmi_list, .ce_rx = &ce, .peer = &sta);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+
+ test_fail_unless (sta.rx_tonemaps->default_tmi == DEFAULT_NEW_TMI);
+ } test_end;
+
+ /* Clean. */
+ ce_rx_bl_intervals_free (sta.intervals);
+}
+
+static void
+test_ce_rx_bl_fsm_INITIAL (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, .tck_per_rtc = 1};
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+
+ ce_rx_measure_mbox_t measure;
+ u8 default_tmi = 0; /* ROBO */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = true;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = default_tmi;
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "INITIAL, sound_completed while mode_interval is on");
+
+ test_begin (t, "The transition branch to mode_interval.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INITIAL__sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next_branch (INITIAL,
+ sound_completed, mode_interval));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_sum_add, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_nsr_compute_mean, .bl = &sta.ce_rx_bt);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_initial, .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_set_first_free_tmi);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_bl_ber_sliding_mean_update,
+ .bl = &sta.ce_rx_bt);
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_new_tone_map,
+ .ce_rx = &ce, .peer = &sta,
+ .new_tmi = DEFAULT_NEW_TMI, .old_tmi = 0, .initial_ce = true);
+
+ /* Check intervals are updated with default tmi */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_clear, .tms = &rx_tms);
+ int j;
+ int total_ints = mac_interval_fsm_count_ *
+ mac_interval_repetition_count_;
+
+ for (j = 0; j < total_ints; j++)
+ {
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_append, .tms = &rx_tms, .tmi = DEFAULT_NEW_TMI);
+ }
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ mac_interval_commit_changes, .tms = &rx_tms);
+
+ /* - check MMe is sent */
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ ce_rx_cp_send_mme_refresh_tmi_list, .ce_rx = &ce, .peer = &sta);
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+
+ test_fail_unless (sta.rx_tonemaps->default_tmi == DEFAULT_NEW_TMI);
+ } test_end;
+
+ /* Clean. */
+ ce_rx_bl_intervals_free (sta.intervals);
+}
+
+static void
+test_ce_rx_bl_fsm_INTERVALS (test_t t)
+{
+ mac_config_t config;
+ config.tonemask_info.carrier_nb = PHY_CARRIER_NB;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].one_pb_data_tck = 0;
+ config.tonemask_info.tonemap_robo[PHY_MOD_ROBO].bits_per_symbol = 42;
+ bsu_aclf_t aclf;
+ *((bsu_aclf_bp_t*) &aclf.beacon_period_theo_tck) = BSU_ACLF_BP_50HZ_TCK;
+
+ ce_rx_t ce = { .mac_config = &config, .aclf = &aclf, };
+ scenario_globals_t globals = {
+ .ce = &ce,
+ };
+ /* Initialize an empty release list. */
+ tonemap_release_list_init (&ce.tonemap_release_list);
+
+ ce_rx_measure_mbox_t measure;
+ u8 tested_tmi = 0; /* ROBO mode makes test more simple */
+ int tested_fsm_id = CE_RX_MEASURE_NO_INTERVAL;
+ measure.fsm_id = tested_fsm_id;
+ measure.rx_params.sound = true;
+ measure.rx_params.sound_complete = false;
+
+ sta_t sta;
+ tonemaps_t rx_tms;
+ sta.rx_tonemaps = &rx_tms;
+ sta.rx_tonemaps->default_tmi = tested_tmi;
+ sta.intervals = ce_rx_bl_intervals_alloc (tested_tmi);
+ ce_rx_bitloading_init (&sta.ce_rx_bt);
+
+ test_case_begin (t, "INTERVALS, sound is received");
+
+ test_begin (t, "The FSM returns to INITIAL.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INTERVALS__sound, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, sound));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_EVENT (
+ tonemaps_reset, .tms = sta.rx_tonemaps);
+ 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);
+ } test_end;
+
+ /* Clean. */
+ /* Nothing need to be cleaned in the test because the scenario does it. */
+
+ test_case_begin (t, "INTERVALS, sound_completed is received");
+
+ test_begin (t, "The event is ignored.")
+ {
+ scenario_entry_t fsm_base[300];
+ int pos = 0;
+
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_ACTION (
+ INTERVALS__sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, sound_completed));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+}
+
+int
+main (int argc, char **argv)
+{
+ test_t t;
+ test_init (t, argc, argv);
+
+ test_suite_begin (t, "CE:RX:BL:INTERVALS: MAIN FSM");
+ ce_rx_bl_ber_conf_init();
+ test_ce_rx_bl_fsm_IDLE (t);
+ test_ce_rx_bl_fsm_INITIAL (t);
+ test_ce_rx_bl_fsm_INTERVALS (t);
+
+ /* Memory check. */
+ test_case_begin (t, "General");
+ test_begin (t, "Memory")
+ {
+ test_fail_unless (blk_check_memory ());
+ } test_end;
+
+ test_result (t);
+ return test_nb_failed (t) == 0 ? 0 : 1;
+}
+
+
diff --git a/cesar/ce/rx/inc/trace.h b/cesar/ce/rx/inc/trace.h
index 5018695cf2..517ab417b1 100644
--- a/cesar/ce/rx/inc/trace.h
+++ b/cesar/ce/rx/inc/trace.h
@@ -50,6 +50,7 @@ enum
CE_RX_TRACE_RESTART_BER,
CE_RX_TRACE_BMU_STATE,
CE_RX_TRACE_RESTART_BER_MARGIN_UPDATE,
+ CE_RX_TRACE_INTERVALS_SOUND_COMPLETE,
CE_RX_TRACE_INTERVAL_SOUND_COMPLETE,
CE_RX_TRACE_INTERVAL_DATA_PB_ERR,
CE_RX_TRACE_INTERVAL_DATA_BER
diff --git a/cesar/ce/rx/src/trace.c b/cesar/ce/rx/src/trace.c
index 68db6977b1..ae3b55162c 100644
--- a/cesar/ce/rx/src/trace.c
+++ b/cesar/ce/rx/src/trace.c
@@ -117,6 +117,8 @@ ce_rx_trace_init (ce_rx_t *ctx)
TIMESTAMP),
TRACE_EVENT (CE_RX_TRACE_RESTART_BER_MARGIN_UPDATE, "tei %d: "
"restart BER margin update (FEC rate: %u)", TIMESTAMP),
+ TRACE_EVENT (CE_RX_TRACE_INTERVALS_SOUND_COMPLETE, "tei %d: ",
+ TIMESTAMP),
TRACE_EVENT (CE_RX_TRACE_INTERVAL_SOUND_COMPLETE, "tei %d: "
"fsm_id %d: interval %d", TIMESTAMP),
TRACE_EVENT (CE_RX_TRACE_INTERVAL_DATA_PB_ERR, "tei %d: "