summaryrefslogtreecommitdiff
path: root/cesar
diff options
context:
space:
mode:
authorDavid Mercadie2011-09-01 11:55:30 +0200
committerCyril Jourdan2013-01-18 11:27:16 +0100
commit5e1f237c0d12a549b42ba8f15b33f5dbd05429c6 (patch)
tree9ba8cc199de9d154fad50377742ba1d2d82dadb9 /cesar
parent72fbccf22cc2f0779641a0cf66ec4421fe52c9bb (diff)
cesar/ce/rx/bl: measure treatments' refactoring when having data, closes #2552
- create function ce_rx_bl_data_treatment, - rewrite ce_rx_bl_fsm__TRACKING__data.
Diffstat (limited to 'cesar')
-rw-r--r--cesar/ce/rx/bitloading/inc/transition.h9
-rw-r--r--cesar/ce/rx/bitloading/src/transition.c376
2 files changed, 209 insertions, 176 deletions
diff --git a/cesar/ce/rx/bitloading/inc/transition.h b/cesar/ce/rx/bitloading/inc/transition.h
index fafba000b1..faca1a1739 100644
--- a/cesar/ce/rx/bitloading/inc/transition.h
+++ b/cesar/ce/rx/bitloading/inc/transition.h
@@ -20,6 +20,15 @@
BEGIN_DECLS
+typedef enum
+{
+ CE_RX_BL_TREATMENT_STATUS_NO_CHAN_CHANGE = 0,
+ CE_RX_BL_TREATMENT_STATUS_HIGH_PBERR,
+ CE_RX_BL_TREATMENT_STATUS_BER_TOO_LOW,
+ CE_RX_BL_TREATMENT_STATUS_BMU,
+ CE_RX_BL_TREATMENT_STATUS_NB
+} ce_rx_bl_treatment_status_t;
+
/**
* Handle reception of a sound event (not complete) in IDLE state.
* \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 40cca07a5c..8dc3ef47be 100644
--- a/cesar/ce/rx/bitloading/src/transition.c
+++ b/cesar/ce/rx/bitloading/src/transition.c
@@ -169,136 +169,21 @@ ce_rx_bl_stats_update (ce_rx_bitloading_t *bl,
bl->stats.prev_pberr_rate_mean = bl->stats.curr_pberr_rate_mean;
}
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__IDLE__sound_completed (
- ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_rx_bl__common_initial_sound_measure_received (ce_rx,
- sta,
- data.measure,
- true);
- return ce_rx_bl_fsm_next_branch (IDLE, sound_completed, no_mode_interval);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__IDLE__sound (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_rx_bl__common_initial_sound_measure_received (ce_rx,
- sta,
- data.measure,
- true);
- return ce_rx_bl_fsm_next (IDLE, sound);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__IDLE__data (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_debug_gpio_event
- (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_NORMAL, true);
- return ce_rx_bl_fsm_next (IDLE, data);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__INITIAL__sound_completed (
- ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_rx_bl__common_initial_sound_measure_received (ce_rx,
- sta,
- data.measure,
- false);
- return ce_rx_bl_fsm_next_branch (INITIAL,
- sound_completed,
- no_mode_interval);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__INITIAL__sound (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_rx_bl__common_initial_sound_measure_received (ce_rx,
- sta,
- data.measure,
- false);
- return ce_rx_bl_fsm_next (INITIAL, sound);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__INITIAL__data (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- ce_debug_gpio_event
- (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_NORMAL, true);
- return ce_rx_bl_fsm_next (INITIAL, data);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__TRACKING__sound_completed (
- ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
+static ce_rx_bl_treatment_status_t
+ce_rx_bl_data_treatment (ce_rx_t *ce_rx, sta_t *sta, ce_rx_bitloading_t *bl,
+ ce_rx_measure_mbox_t *measure, u8 expected_tmi)
{
- ce_debug_gpio_event
- (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_SOUND_COMPLETE, true);
- /* Maybe more than one sound complete flag. Let's ignore it. */
- return ce_rx_bl_fsm_next (TRACKING, sound_completed);
-}
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__TRACKING__sound (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- /* Check parameters. */
- dbg_assert (sta);
- dbg_assert (data.measure);
-
- 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 (TRACKING, sound);
-}
-
-
-ce_rx_bl_fsm_branch_t
-ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
- sta_t *sta,
- ce_rx_bitloading_fsm_event_param_t data)
-{
- dbg_assert (sta);
dbg_assert (ce_rx);
-
- uint i;
-
- /* Get measure. */
- ce_rx_measure_mbox_t *measure = data.measure;
+ dbg_assert (bl);
dbg_assert (measure);
-
+ dbg_assert (sta);
dbg_assert (sta->rx_tonemaps);
- sta->rx_tonemaps->sound_frame_counter = TONEMAP_SOUND_FRAME_COUNTER;
+ tonemap_t *tm = NULL;
bool tm_is_negotiated =
TONEMAP_INDEX_IS_NEGOTIATED (measure->rx_params.tmi_av);
- tonemap_t *tm;
if (tm_is_negotiated)
{
tm = sta->rx_tonemaps->tm[measure->rx_params.tmi_av];
@@ -319,17 +204,14 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
tm->nb_pb += measure->total_pb_count;
}
- ce_rx_bitloading_t *bl = &sta->ce_rx_bt;
- dbg_assert (bl);
-
/* Measure should only be processed if the TMI used is the one we are
* expecting. */
- if (sta->rx_tonemaps->default_tmi == measure->rx_params.tmi_av)
+ if (measure->rx_params.tmi_av == expected_tmi)
{
- /* Because default_tmi == tmi_av, we necessarily have the
+ /* Because expected_tmi == tmi_av, we necessarily have the
* corresponding tonemap. */
dbg_assert (tm);
-
+
/* Reset flag to resend tone map. */
bl->resend_tm = false;
@@ -352,9 +234,10 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
bl->stats.curr_nb_pb = measure->total_pb_count;
bl->stats.curr_nb_pb_crc_false = measure->false_pb_count;
bl->stats.curr_ber_sum = measure->ber_sum;
+ int i;
for (i = 0; i < CE_RX_BL_BER_SLIDING_MEAN_NB; i++)
bl->stats.curr_ber_mean[i] = bl->ber_sliding_mean[i];
- bl->stats.curr_pberr_rate_mean = sta->ce_rx_bt.pber.mean_q16;
+ bl->stats.curr_pberr_rate_mean = bl->pber.mean_q16;
/* High PB Error rate (not on small frame)? */
if (tm_is_negotiated
@@ -377,25 +260,7 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
[CE_RX_BL_DATE_CRITERIA_PBER],
cyg_current_time ()))
{
- ce_debug_gpio_event
- (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_HIGH_PB_ERROR_RATE,
- true);
- CE_RX_TRACE (RESTART_PB_ERR, sta->tei,
- bl->high_pb_error_rate_frame_counter);
- ce_rx_bl_stats_update (bl, sta,
- CE_RX_BL_RESTART_REASON_PBERR_HIGH);
-
- /* Reset PBER. */
- ce_rx_bl_pber_reset (&bl->pber);
- /* Reset BER margin update. */
- ce_rx_bl_bmu_reset (&bl->bmu);
-
- /* Restart CE. */
- ce_rx_bl__common__restart_ce (ce_rx, sta);
-
- return ce_rx_bl_fsm_next_branch (TRACKING,
- data,
- pb_err_rate_high);
+ return CE_RX_BL_TREATMENT_STATUS_HIGH_PBERR;
}
}
else
@@ -436,27 +301,11 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
&& ((u64) bsm[CE_RX_BL_BER_SLIDING_MEAN_SLOW]
< lower_bound))
{
- ce_debug_gpio_event (
- CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_BER_LOW,
- true);
- CE_RX_TRACE (RESTART_BER, sta->tei);
- ce_rx_bl_stats_update (bl, sta,
- CE_RX_BL_RESTART_REASON_BER_LOW);
-
- /* Reset PBER. */
- ce_rx_bl_pber_reset (&bl->pber);
- /* Reset BER margin update. */
- ce_rx_bl_bmu_reset (&bl->bmu);
-
- /* Restart CE. */
- ce_rx_bl__common__restart_ce (ce_rx, sta);
- return ce_rx_bl_fsm_next_branch (TRACKING,
- data,
- ber_too_low);
+ return CE_RX_BL_TREATMENT_STATUS_BER_TOO_LOW;
}
}
}
-
+
/* Increment BER margin frame counter. */
ce_rx_bl_bmu_new_frame (&bl->bmu, measure->total_pb_count);
@@ -471,15 +320,10 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
tm->ber_target, tm->fecrate,
bl->optimization_failed))
{
- ce_rx_bl_stats_update
- (bl, sta, CE_RX_BL_RESTART_REASON_BER_MARGIN_UPDATE);
CE_RX_TRACE (RESTART_BER_MARGIN_UPDATE, sta->tei,
tm->fecrate);
- /* Restart CE. */
- ce_rx_bl__common__restart_ce (ce_rx, sta);
- return ce_rx_bl_fsm_next_branch (TRACKING,
- data,
- ber_margin_update);
+
+ return CE_RX_BL_TREATMENT_STATUS_BMU;
}
}
}
@@ -500,9 +344,8 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
else if (lesseq_mod2p32 (bl->resend_tm_date, cyg_current_time ()))
{
/* Resend TM. */
- ce_rx_cp_send_mme_new_tone_map (ce_rx, sta,
- sta->rx_tonemaps->default_tmi, 0,
- false);
+ ce_rx_cp_send_mme_new_tone_map (ce_rx, sta, expected_tmi,
+ 0, false);
/* Increase statistics. */
ce_rx->stats.resend_tm++;
/* Reset timer and flag. */
@@ -510,9 +353,190 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
bl->resend_tm = false;
}
}
+
+ return CE_RX_BL_TREATMENT_STATUS_NO_CHAN_CHANGE;
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__IDLE__sound_completed (
+ ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_rx_bl__common_initial_sound_measure_received (ce_rx,
+ sta,
+ data.measure,
+ true);
+ return ce_rx_bl_fsm_next_branch (IDLE, sound_completed, no_mode_interval);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__IDLE__sound (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_rx_bl__common_initial_sound_measure_received (ce_rx,
+ sta,
+ data.measure,
+ true);
+ return ce_rx_bl_fsm_next (IDLE, sound);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__IDLE__data (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_debug_gpio_event
+ (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_NORMAL, true);
+ return ce_rx_bl_fsm_next (IDLE, data);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INITIAL__sound_completed (
+ ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_rx_bl__common_initial_sound_measure_received (ce_rx,
+ sta,
+ data.measure,
+ false);
+ return ce_rx_bl_fsm_next_branch (INITIAL,
+ sound_completed,
+ no_mode_interval);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INITIAL__sound (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_rx_bl__common_initial_sound_measure_received (ce_rx,
+ sta,
+ data.measure,
+ false);
+ return ce_rx_bl_fsm_next (INITIAL, sound);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__INITIAL__data (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
ce_debug_gpio_event
(CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_NORMAL, true);
- return ce_rx_bl_fsm_next_branch (TRACKING, data, no_channel_change);
+ return ce_rx_bl_fsm_next (INITIAL, data);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__TRACKING__sound_completed (
+ ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ ce_debug_gpio_event
+ (CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_SOUND_COMPLETE, true);
+ /* Maybe more than one sound complete flag. Let's ignore it. */
+ return ce_rx_bl_fsm_next (TRACKING, sound_completed);
+}
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__TRACKING__sound (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ /* Check parameters. */
+ dbg_assert (sta);
+ dbg_assert (data.measure);
+
+ 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 (TRACKING, sound);
+}
+
+
+ce_rx_bl_fsm_branch_t
+ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
+ sta_t *sta,
+ ce_rx_bitloading_fsm_event_param_t data)
+{
+ dbg_assert (sta);
+
+ ce_rx_bitloading_t *bl = &sta->ce_rx_bt;
+
+ switch (ce_rx_bl_data_treatment (ce_rx, sta, bl, data.measure,
+ sta->rx_tonemaps->default_tmi))
+ {
+ case CE_RX_BL_TREATMENT_STATUS_NO_CHAN_CHANGE:
+ ce_debug_gpio_event (
+ CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_NORMAL, true);
+ return ce_rx_bl_fsm_next_branch (TRACKING, data,
+ no_channel_change);
+ break;
+
+ case CE_RX_BL_TREATMENT_STATUS_HIGH_PBERR:
+ ce_debug_gpio_event (
+ CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_HIGH_PB_ERROR_RATE,
+ true);
+ CE_RX_TRACE (RESTART_PB_ERR, sta->tei,
+ bl->high_pb_error_rate_frame_counter);
+ ce_rx_bl_stats_update (bl, sta,
+ CE_RX_BL_RESTART_REASON_PBERR_HIGH);
+
+ /* Reset PBER. */
+ ce_rx_bl_pber_reset (&bl->pber);
+ /* Reset BER margin update. */
+ ce_rx_bl_bmu_reset (&bl->bmu);
+
+ /* Restart CE. */
+ ce_rx_bl__common__restart_ce (ce_rx, sta);
+ return ce_rx_bl_fsm_next_branch (TRACKING,
+ data,
+ pb_err_rate_high);
+ break;
+
+ case CE_RX_BL_TREATMENT_STATUS_BER_TOO_LOW:
+ ce_debug_gpio_event (
+ CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_DATA_BER_LOW,
+ true);
+ CE_RX_TRACE (RESTART_BER, sta->tei);
+ ce_rx_bl_stats_update (bl, sta,
+ CE_RX_BL_RESTART_REASON_BER_LOW);
+
+ /* Reset PBER. */
+ ce_rx_bl_pber_reset (&bl->pber);
+ /* Reset BER margin update. */
+ ce_rx_bl_bmu_reset (&bl->bmu);
+
+ /* Restart CE. */
+ ce_rx_bl__common__restart_ce (ce_rx, sta);
+ return ce_rx_bl_fsm_next_branch (TRACKING,
+ data,
+ ber_too_low);
+ break;
+
+ case CE_RX_BL_TREATMENT_STATUS_BMU:
+ ce_rx_bl_stats_update (bl, sta,
+ CE_RX_BL_RESTART_REASON_BER_MARGIN_UPDATE);
+
+ /* Restart CE. */
+ ce_rx_bl__common__restart_ce (ce_rx, sta);
+ return ce_rx_bl_fsm_next_branch (TRACKING,
+ data,
+ ber_margin_update);
+ default:
+ dbg_assert_default ();
+ }
}
ce_rx_bl_fsm_branch_t