summaryrefslogtreecommitdiff
path: root/cesar/cp/beacon/src/beacon.c
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/cp/beacon/src/beacon.c')
-rw-r--r--cesar/cp/beacon/src/beacon.c59
1 files changed, 41 insertions, 18 deletions
diff --git a/cesar/cp/beacon/src/beacon.c b/cesar/cp/beacon/src/beacon.c
index f1534c526b..dd66044f04 100644
--- a/cesar/cp/beacon/src/beacon.c
+++ b/cesar/cp/beacon/src/beacon.c
@@ -62,10 +62,13 @@ cp_beacon_timer_expires (cp_t *ctx)
static bsu_beacon_t *
cp_get_next_beacon_shared_memory (cp_t *ctx)
{
+ bsu_beacon_t *next_beacon_shared_memory =
+ &ctx->beacon.shared_mem[ctx->beacon.shared_mem_slot_id];
+
ctx->beacon.shared_mem_slot_id++;
ctx->beacon.shared_mem_slot_id %= CP_SHARED_MEM_SLOT_NB;
- return &ctx->beacon.shared_mem[ctx->beacon.shared_mem_slot_id];
+ return next_beacon_shared_memory;
}
static
@@ -307,8 +310,6 @@ cp_beacon_sta_compute_schedules (cp_t *ctx, bsu_beacon_t *beacon_data)
uint i, j;
-// TODO remove if we really drop this solution cp_pwl_update (ctx, beacon_data->bsu_params.bpsd_date, 4);
-
/** Organize the schedules contained in beacon_data as a set. */
set_t set_schedules;
cp_cco_bw_alloc_t *sched;
@@ -455,25 +456,44 @@ cp_beacon_countdowns (cp_t *ctx)
{
dbg_assert (ctx);
- // TODO : use bpsd from aclfs
- if (less_mod2p32 (ctx->pwl.bp_avln_ntb[1], mac_ntb()))
+ // TODO DM: is this test really usefull?
+ if (less_mod2p32 (ctx->beacon.countdown_limit_date, phy_date (ctx->phy)))
{
+ u32 intervals;
+
+ /** Check the interval:
+ * We want to know how many beacon period elapsed. */
+ u32 bp = bsu_aclf_beacon_period (ctx->bsu_aclf);
+ dbg_assert (bp);
+
+ bsu_aclf_beacon_period_start_date (ctx->bsu_aclf, &intervals, 1);
+
+ intervals = (intervals + bp/2 - ctx->beacon.last_countdown_date) / bp;
+
+ dbg_assert (intervals > 7); ² // we missed too many periods.
+
+ ctx->beacon.last_countdown_date = ctx->beacon.countdown_limit_date;
+
+ /** Update the countdown limit for next time. */
+ ctx->beacon.countdown_limit_date =
+ bsu_aclf_beacon_period_start_date_next (ctx->bsu_aclf);
+
/* Snid... */
if (ctx->beacon.snids.snidcd)
{
- if (ctx->beacon.snids.snidcd - 1 == 0)
+ if (ctx->beacon.snids.snidcd <= intervals)
{
ctx->beacon.snids.snidcd = 0;
cp_sta_own_data_set_snid (ctx, ctx->beacon.snids.snid);
}
else
- ctx->beacon.snids.snidcd --;
+ ctx->beacon.snids.snidcd -= intervals;
}
/* Hybrid mode... */
if (ctx->beacon.hm.hmcd)
{
- if (ctx->beacon.hm.hmcd - 1 == 0)
+ if (ctx->beacon.hm.hmcd <= intervals)
{
cp_sta_own_data_t *own = cp_sta_mgr_get_sta_own_data (ctx);
@@ -481,13 +501,13 @@ cp_beacon_countdowns (cp_t *ctx)
own->hybrid_mode = ctx->beacon.hm.hm;
}
else
- ctx->beacon.hm.hmcd --;
+ ctx->beacon.hm.hmcd -= intervals;
}
/* Handover in progress... */
if (ctx->beacon.hoip.hoipcd)
{
- if (ctx->beacon.hoip.hoipcd - 1 == 0)
+ if (ctx->beacon.hoip.hoipcd <= intervals)
{
cp_sta_t *sta;
cp_net_t *net;
@@ -508,20 +528,21 @@ cp_beacon_countdowns (cp_t *ctx)
}
}
else
- ctx->beacon.hoip.hoipcd --;
+ ctx->beacon.hoip.hoipcd -= intervals;
}
/* EKS ... */
if (ctx->beacon.eks.kccd)
{
- if (ctx->beacon.eks.kccd - 1 == 0)
+ if (ctx->beacon.eks.kccd <= intervals)
{
if (ctx->beacon.eks.kbc == CP_BEACON_EKS_KBC_NEK)
ctx->beacon.nek_index = !ctx->beacon.nek_index;
- ctx->beacon.eks.kccd --;
+
+ ctx->beacon.eks.kccd = 0;
}
else
- ctx->beacon.eks.kccd --;
+ ctx->beacon.eks.kccd -= intervals;
}
}
}
@@ -550,6 +571,8 @@ cp_beacon_init (cp_t *ctx)
// Initialise the mem_share_slot_id so that the next slot is 0.
ctx->beacon.shared_mem_slot_id = CP_SHARED_MEM_SLOT_NB - 1;
+ ctx->beacon.last_countdown_date = phy_date (ctx->phy);
+ ctx->beacon.countdown_limit_date = ctx->beacon.last_countdown_date;
/* Setup beacon indicator. */
GPIO_SETUP (LED_BEACON_TX_RX, GPIO_DIRECTION_OUT);
@@ -903,11 +926,11 @@ cp_beacon_reconfigure_timer (cp_t *ctx, bool cco)
u32 date;
if (cco)
- date = 0 - CP_TIMER_OFFSET_CCO -
- ctx->mac_config->ntb_offset_tck;
+ date = bsu_aclf_beacon_period_start_date_next (ctx->bsu_aclf) -
+ CP_TIMER_OFFSET_CCO - ctx->mac_config->ntb_offset_tck;
else
- date = 0 + CP_TIMER_OFFSET_STA -
- ctx->mac_config->ntb_offset_tck;
+ date = bsu_aclf_beacon_period_start_date_next (ctx->bsu_aclf) +
+ CP_TIMER_OFFSET_STA - ctx->mac_config->ntb_offset_tck;
// Program the timer.
hal_timer_instance_cancel (ctx->hal_timer, &ctx->beacon.leon_timer);