From 83512c89e58e7b54b677e3fb601624ba12dac859 Mon Sep 17 00:00:00 2001 From: Cyril Jourdan Date: Fri, 17 May 2013 10:49:19 +0200 Subject: 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. --- cesar/ce/rx/bitloading/fsm/src/fsm.c | 7 ++ cesar/ce/rx/bitloading/fsm/src/fsm/bl.fsm | 6 ++ cesar/ce/rx/bitloading/inc/transition.h | 72 +++++++++++++++++ cesar/ce/rx/bitloading/src/transition.c | 48 ++++++++++++ .../bitloading/test/intervals/inc/scenario_defs.h | 14 +++- .../intervals/src/scenario_intervals_actions.c | 6 ++ .../ce/rx/bitloading/test/intervals/src/test_fsm.c | 90 ++++++++++++++++++++++ cesar/ce/rx/bitloading/test/src/test_intervals.c | 2 +- 8 files changed, 243 insertions(+), 2 deletions(-) (limited to 'cesar/ce/rx') 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 @@ -65,6 +65,30 @@ ce_rx_bl_fsm__IDLE__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 (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. @@ -102,6 +126,30 @@ ce_rx_bl_fsm__INITIAL__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 (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. @@ -177,6 +225,30 @@ ce_rx_bl_fsm__INTERVALS__data ( sta_t *sta, 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). 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 @@ -423,6 +423,22 @@ ce_rx_bl_fsm__IDLE__data (ce_rx_t *ce_rx, return ce_rx_bl_fsm_next (IDLE, data); } +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, @@ -469,6 +485,22 @@ ce_rx_bl_fsm__INITIAL__data (ce_rx_t *ce_rx, return ce_rx_bl_fsm_next (INITIAL, data); } +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, @@ -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, " -- cgit v1.2.3