summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/bitloading
diff options
context:
space:
mode:
authorJérôme Jutteau2011-11-04 11:27:35 +0100
committerCyril Jourdan2013-01-18 11:53:46 +0100
commitedacf4021c732eab33b0a57dfb5205e6a3044038 (patch)
tree4923e6c5ae70ba92b7d919f64d638245feb66911 /cesar/ce/rx/bitloading
parent1b5b86c9dc5947513ab24a1535c322d037e1ead7 (diff)
cesar/ce/rx/bl: adapt event handling for intervals, refs #2366
Diffstat (limited to 'cesar/ce/rx/bitloading')
-rw-r--r--cesar/ce/rx/bitloading/fsm/src/fsm.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/cesar/ce/rx/bitloading/fsm/src/fsm.c b/cesar/ce/rx/bitloading/fsm/src/fsm.c
index c45f00ab0b..6a178cd369 100644
--- a/cesar/ce/rx/bitloading/fsm/src/fsm.c
+++ b/cesar/ce/rx/bitloading/fsm/src/fsm.c
@@ -26,24 +26,38 @@ ce_rx_bl_fsm_handle_event (ce_rx_t *ce_rx, sta_t *sta, ce_rx_bl_fsm_event_type_t
{
/* Check parameters. */
dbg_assert (sta);
- ce_rx_bl_fsm_state_t fsm = sta->ce_rx_bt.fsm;
- dbg_assert (fsm < CE_RX_BL_FSM_STATE_NB);
+ dbg_assert (data.measure);
+ ce_rx_bl_fsm_state_t *fsm;
+ if (data.measure->fsm_id == CE_RX_MEASURE_NO_INTERVAL)
+ fsm = &sta->ce_rx_bt.fsm;
+ else
+ {
+ dbg_assert (sta->intervals);
+ fsm = &sta->intervals->intervals[data.measure->fsm_id]->fsm;
+ }
+ ce_rx_bl_fsm_state_t old_fsm = *fsm;
+
+ dbg_assert (*fsm < CE_RX_BL_FSM_STATE_NB);
dbg_assert (e < CE_RX_BL_FSM_EVENT_TYPE_NB);
/* Get transition. */
- ce_rx_bl_fsm_transition_t tr = ce_rx_bl_fsm_transition_table[fsm][e];
+ ce_rx_bl_fsm_transition_t tr = ce_rx_bl_fsm_transition_table[*fsm][e];
/* A non managed event is an error. */
dbg_assert (tr);
/* Run transition. */
ce_rx_bl_fsm_branch_t br = tr (ce_rx, sta, data);
- dbg_assert (((br >> 16) & 0xff) == fsm);
+ dbg_assert (((br >> 16) & 0xff) == *fsm);
dbg_assert (((br >> 8) & 0xff) == e);
- sta->ce_rx_bt.fsm = br & 0xff;
+ *fsm = br & 0xff;
- if (fsm != sta->ce_rx_bt.fsm)
- CE_RX_TRACE (FSM_FROM_TO, sta->tei, fsm, e, sta->ce_rx_bt.fsm);
- ce_debug_gpio_event
- (CE_DEBUG_GPIO_EVENT_CE_RX_BL_FSM_IDLE + sta->ce_rx_bt.fsm, true);
+ /* Trace transition. */
+ if (old_fsm != *fsm)
+ CE_RX_TRACE (FSM_FROM_TO, sta->tei,
+ data.measure->fsm_id, old_fsm, e, *fsm);
+
+ if (data.measure->fsm_id == CE_RX_MEASURE_NO_INTERVAL)
+ ce_debug_gpio_event
+ (CE_DEBUG_GPIO_EVENT_CE_RX_BL_FSM_IDLE + sta->ce_rx_bt.fsm, true);
ce_debug_gpio_event
(CE_DEBUG_GPIO_EVENT_CE_RX_BL_MEASURE_NONE, false);
}