/* Cesar project {{{ * * Copyright (C) 2007 Spidcom * * <<>> * * }}} */ /** * \file tx.c * \brief « brief description » * \ingroup « module » * * « long description » */ #include "common/std.h" #include #include "cp/cp.h" #include "cp/inc/context.h" #include "ce/tx.h" #include "ce/inc/tx.h" #define TXCE #include "ce/inc/cei.h" static txce_t txce_global; void txce_init (cp_t *cp_ctx, mac_store_t *mac_store_ctx, mac_config_t *mac_config_ctx) { dbg_assert (mac_store_ctx); dbg_assert (mac_config_ctx); txce_t *ctx = &txce_global; ctx->mac_store_ctx = mac_store_ctx; ctx->tonemask = mac_config_ctx->tonemask_info.tonemask; cyg_handle_t sys_clk = cyg_real_time_clock(); cyg_handle_t counter_hdl; cyg_clock_to_counter (sys_clk, &counter_hdl); cyg_alarm_create (counter_hdl, alarm_cb, (cyg_addrword_t) cp_ctx, &ctx->alarm_hdl, &ctx->alarm_obj); cp_ctx->txce = ctx; } void txce (cp_t *cp_ctx, uint stei, u32 mmtype, bitstream_t *stream_reader) { dbg_assert (cp_ctx); txce_t *ctx = cp_ctx->txce; if (stream_reader) { dbg_assert (mmtype == CM_CHAN_EST_IND || mmtype == CM_TM_UPDATE_IND); dbg_assert (stei>=MAC_TEI_STA_MIN && stei<=MAC_TEI_STA_MAX); // Get concerned tonemaps from stei. sta_t *source_sta = mac_store_sta_get (ctx->mac_store_ctx, stei); tonemaps_t *source_tms = source_sta->tx_tonemaps; cei_decode (source_tms, mmtype, stream_reader, ctx->tonemask); blk_release (source_sta); } cyg_tick_count_t next_expiration = txce_expiration_tonemaps_management (ctx); cyg_alarm_initialize (ctx->alarm_hdl, next_expiration, 0); } cyg_tick_count_t txce_expiration_tonemaps_management (txce_t *ctx) { dbg_assert (ctx); uint tei; cyg_tick_count_t lowest_expiration_date = 0xFFFFFFFFFFFFFFFFll; for (tei=MAC_TEI_STA_MIN; tei<=MAC_TEI_STA_MAX; tei++) { cyg_tick_count_t current_rtc_date = cyg_current_time(); sta_t *lsta = mac_store_sta_get (ctx->mac_store_ctx, tei); if (lsta) { tonemaps_t *tms = lsta->tx_tonemaps; if (tms) { cyg_tick_count_t expiration_date = tms->expiration_rtc_date; if (current_rtc_date >= expiration_date ) { int tmi; for (tmi = 0; tmitm[tmi]) tonemap_release (tms, tmi); //tms->intervals = NULL; tms->expiration_rtc_date = 0xFFFFFFFFFFFFFFFFll; } } else { if (lowest_expiration_date > expiration_date) { lowest_expiration_date = expiration_date; } } } blk_release (lsta); } } return lowest_expiration_date; } void alarm_cb (cyg_handle_t alarm_hdl, cyg_addrword_t data) { dbg_assert (data); cp_t *ctx = (cp_t *) data; txce (ctx, 0, 0, NULL); }