summaryrefslogtreecommitdiff
path: root/cesar/ce/rx
diff options
context:
space:
mode:
authorCyril Jourdan2013-05-17 10:49:19 +0200
committerCyril Jourdan2013-05-24 08:42:30 +0200
commit83512c89e58e7b54b677e3fb601624ba12dac859 (patch)
treee4ef271397b58f8b62747e4fc7f532b4f9b1d1f3 /cesar/ce/rx
parentfe3068ed91a25903b167e951cdd128ad52ec47c8 (diff)
cesar/ce/rx/bl: handle interval_sound events in global FSM, closes #3957
The goal is to avoid that sound directed to an interval we can not match are treated by global FSM as sound events, what causes a global CE restart. This can lead to too many CE restarts and to an accumulation of measure in CE's mailbox, which leads to the observed assert.
Diffstat (limited to 'cesar/ce/rx')
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm.c7
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm6
-rw-r--r--cesar/ce/rx/bitloading/inc/transition.h72
-rw-r--r--cesar/ce/rx/bitloading/src/transition.c48
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h14
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/scenario_intervals_actions.c6
-rw-r--r--cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c90
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_intervals.c2
8 files changed, 243 insertions, 2 deletions
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm.c b/cesar/ce/rx/bitloading/fsm/src/fsm.c
index 8fab52c793..2e0a183b91 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm.c
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm.c
@@ -128,6 +128,13 @@ ce_rx_bl_fsm_measure_to_event (sta_t *sta,
has_interval = CE_RX_FSM_MEASURE_TO_EVENT_TYPE_INTERVAL;
measure->fsm_id = interval % ce_rx_bl_intervals_fsm_count_;
}
+ else if (type != CE_RX_FSM_MEASURE_TO_EVENT_TYPE_DATA)
+ {
+ /* 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;
+ }
}
return event_tab[has_interval][type];
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm b/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
index c69d043a0d..e82fa44f57 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm
@@ -54,6 +54,8 @@ IDLE:
Compute tone map.
data -> .
Should not happen?
+ interval_sound -> .
+ interval_sound_completed -> .
INITIAL:
sound -> .
@@ -68,6 +70,8 @@ INITIAL:
Compute the NSR mean.
Compute tone map.
data -> .
+ interval_sound -> .
+ interval_sound_completed -> .
TRACKING:
sound -> INITIAL
@@ -97,6 +101,8 @@ INTERVALS:
Copy the noise NRJ to initialize the mean/sum.
sound_completed -> .
data -> .
+ interval_sound -> .
+ interval_sound_completed -> .
INTERVAL_TRACKING:
interval_sound -> INTERVAL_SOUND
diff --git a/cesar/ce/rx/bitloading/inc/transition.h b/cesar/ce/rx/bitloading/inc/transition.h
index 358e7b956e..f1930a16f8 100644
--- a/cesar/ce/rx/bitloading/inc/transition.h
+++ b/cesar/ce/rx/bitloading/inc/transition.h
@@ -66,6 +66,30 @@ ce_rx_bl_fsm__IDLE__data (ce_rx_t *ce_rx,
ce_rx_bitloading_fsm_event_param_t data);
/**
+ * Handle reception of a sound on an interval (complete) event in IDLE
+ * 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__IDLE__interval_sound_completed (
+ 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
+ * IDLE 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__IDLE__interval_sound (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data);
+
+/**
* Handle reception of a sound event (not complete) in INITIAL state.
* \param ce_rx the CE RX context.
* \param sta the corresponding sta.
@@ -103,6 +127,30 @@ ce_rx_bl_fsm__INITIAL__data (ce_rx_t *ce_rx,
ce_rx_bitloading_fsm_event_param_t data);
/**
+ * Handle reception of a sound on an interval (complete) event in INITIAL
+ * 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__INITIAL__interval_sound_completed (
+ 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
+ * INITIAL 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__INITIAL__interval_sound (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data);
+
+/**
* Handle reception of a sound event (not complete) in TRACKING state.
* \param ce_rx the CE RX context.
* \param sta the corresponding sta.
@@ -178,6 +226,30 @@ ce_rx_bl_fsm__INTERVALS__data (
ce_rx_bitloading_fsm_event_param_t data);
/**
+ * Handle reception of a sound on an interval (complete) 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__interval_sound_completed (
+ 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
+ * 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__interval_sound (
+ 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/transition.c b/cesar/ce/rx/bitloading/src/transition.c
index e433979fa9..440f84f667 100644
--- a/cesar/ce/rx/bitloading/src/transition.c
+++ b/cesar/ce/rx/bitloading/src/transition.c
@@ -424,6 +424,22 @@ ce_rx_bl_fsm__IDLE__data (ce_rx_t *ce_rx,
}
ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__IDLE__interval_sound_completed (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (IDLE, interval_sound_completed);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__IDLE__interval_sound (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (IDLE, interval_sound);
+}
+
+ce_rx_bl_fsm_branch_t
ce_rx_bl_fsm__INITIAL__sound_completed (
ce_rx_t *ce_rx,
sta_t *sta,
@@ -470,6 +486,22 @@ ce_rx_bl_fsm__INITIAL__data (ce_rx_t *ce_rx,
}
ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INITIAL__interval_sound_completed (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (INITIAL, interval_sound_completed);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INITIAL__interval_sound (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (INITIAL, interval_sound);
+}
+
+ce_rx_bl_fsm_branch_t
ce_rx_bl_fsm__TRACKING__sound_completed (
ce_rx_t *ce_rx,
sta_t *sta,
@@ -625,6 +657,22 @@ ce_rx_bl_fsm__INTERVALS__data (
return ce_rx_bl_fsm_next (INTERVALS, data);
}
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INTERVALS__interval_sound_completed (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (INTERVALS, interval_sound_completed);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INTERVALS__interval_sound (
+ ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Some sound frames can be misdirected. Ignore them. */
+ return ce_rx_bl_fsm_next (INTERVALS, interval_sound);
+}
+
ce_rx_bl_fsm_branch_t
ce_rx_bl_fsm__INTERVAL_TRACKING__interval_sound (
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 f6e660ed44..1725a92f40 100644
--- a/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
+++ b/cesar/ce/rx/bitloading/test/intervals/inc/scenario_defs.h
@@ -37,9 +37,15 @@
INTERVAL_SOUND_WAIT__interval_sound_completed, \
INTERVAL_SOUND_WAIT__interval_data, \
IDLE__sound_completed, \
+ IDLE__interval_sound, \
+ IDLE__interval_sound_completed, \
INITIAL__sound_completed, \
+ INITIAL__interval_sound, \
+ INITIAL__interval_sound_completed, \
INTERVALS__sound, \
- INTERVALS__sound_completed
+ INTERVALS__sound_completed, \
+ INTERVALS__interval_sound, \
+ INTERVALS__interval_sound_completed
/* Actions with default parameters. */
#define __action(action) \
@@ -66,9 +72,15 @@ __action (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action (INTERVAL_SOUND_WAIT__interval_data);
__action (IDLE__sound_completed);
+__action (IDLE__interval_sound);
+__action (IDLE__interval_sound_completed);
__action (INITIAL__sound_completed);
+__action (INITIAL__interval_sound);
+__action (INITIAL__interval_sound_completed);
__action (INTERVALS__sound);
__action (INTERVALS__sound_completed);
+__action (INTERVALS__interval_sound);
+__action (INTERVALS__interval_sound_completed);
#undef __action
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 4d62949adf..b33183741c 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
@@ -39,6 +39,12 @@ __action_def (INTERVAL_SOUND_WAIT__interval_sound_completed);
__action_def (INTERVAL_SOUND_WAIT__interval_data);
__action_def (IDLE__sound_completed);
+__action_def (IDLE__interval_sound);
+__action_def (IDLE__interval_sound_completed);
__action_def (INITIAL__sound_completed);
+__action_def (INITIAL__interval_sound);
+__action_def (INITIAL__interval_sound_completed);
__action_def (INTERVALS__sound);
__action_def (INTERVALS__sound_completed);
+__action_def (INTERVALS__interval_sound);
+__action_def (INTERVALS__interval_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
index 6d9caff593..f69fa5290a 100644
--- a/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
+++ b/cesar/ce/rx/bitloading/test/intervals/src/test_fsm.c
@@ -66,6 +66,36 @@ test_ce_rx_bl_fsm_IDLE (test_t t)
sta.rx_tonemaps->default_tmi = default_tmi;
ce_rx_bitloading_init (&sta.ce_rx_bt);
+ test_case_begin (t, "IDLE, interval_sound 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 (
+ IDLE__interval_sound, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (IDLE, interval_sound));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "IDLE, interval_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 (
+ IDLE__interval_sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (IDLE, interval_sound_completed));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
test_case_begin (t, "IDLE, sound_completed while mode_interval is on");
test_begin (t, "The transition branch to mode_interval.")
@@ -152,6 +182,36 @@ test_ce_rx_bl_fsm_INITIAL (test_t t)
sta.rx_tonemaps->default_tmi = default_tmi;
ce_rx_bitloading_init (&sta.ce_rx_bt);
+ test_case_begin (t, "INITIAL, interval_sound 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 (
+ INITIAL__interval_sound, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INITIAL, interval_sound));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "INITIAL, interval_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 (
+ INITIAL__interval_sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INITIAL, interval_sound_completed));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
test_case_begin (t, "INITIAL, sound_completed while mode_interval is on");
test_begin (t, "The transition branch to mode_interval.")
@@ -242,6 +302,36 @@ test_ce_rx_bl_fsm_INTERVALS (test_t t)
sta.intervals = ce_rx_bl_intervals_alloc (&sta.ce_rx_bt, tested_tmi);
ce_rx_bitloading_init (&sta.ce_rx_bt);
+ test_case_begin (t, "INTERVALS, interval_sound 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__interval_sound, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, interval_sound));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
+ test_case_begin (t, "INTERVALS, interval_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__interval_sound_completed, .sta = &sta,
+ .measure = measure,
+ .branch = ce_rx_bl_fsm_next (INTERVALS, interval_sound_completed));
+ fsm_base[pos++] = (scenario_entry_t) SCENARIO_END;
+ scenario_run (t, fsm_base, &globals);
+ } test_end;
+
test_case_begin (t, "INTERVALS, sound is received");
test_begin (t, "The FSM returns to INITIAL.")
diff --git a/cesar/ce/rx/bitloading/test/src/test_intervals.c b/cesar/ce/rx/bitloading/test/src/test_intervals.c
index a12de594d0..6960e997af 100644
--- a/cesar/ce/rx/bitloading/test/src/test_intervals.c
+++ b/cesar/ce/rx/bitloading/test/src/test_intervals.c
@@ -392,7 +392,7 @@ test_suite_ce_rx_bl_intervals_measure_to_event (test_t t)
/* SRC is interval specific ? */
true,
&out, &fsm_id);
- test_fail_if (out != CE_RX_BL_FSM_EVENT_TYPE_sound);
+ test_fail_if (out != CE_RX_BL_FSM_EVENT_TYPE_interval_sound);
test_fail_if (fsm_id != -1);
} test_end;
test_begin (t, "Measure to event conversion, sound, intervals, "