📄 neighborhoodp.nc
字号:
/*
* Copyright (c) 2007, Vanderbilt University
* All rights reserved.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose, without fee, and without written agreement is
* hereby granted, provided that the above copyright notice, the following
* two paragraphs and the author appear in all copies of this software.
*
* IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT
* UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
* ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* Author: Miklos Maroti
*/
#include <Neighborhood.h>
module NeighborhoodP
{
provides
{
interface Init;
interface Neighborhood;
interface NeighborhoodFlag[uint8_t bit];
}
}
implementation
{
tasklet_norace am_addr_t nodes[NEIGHBORHOOD_SIZE];
tasklet_norace uint8_t ages[NEIGHBORHOOD_SIZE];
tasklet_norace uint8_t flags[NEIGHBORHOOD_SIZE];
tasklet_norace uint8_t time;
tasklet_norace uint8_t last;
command error_t Init.init()
{
uint8_t i;
for(i = 0; i < NEIGHBORHOOD_SIZE; ++i)
nodes[i] = AM_BROADCAST_ADDR;
return SUCCESS;
}
inline tasklet_async command am_addr_t Neighborhood.getNode(uint8_t index)
{
return nodes[index];
}
inline tasklet_async command uint8_t Neighborhood.getAge(uint8_t index)
{
return time - ages[index];
}
tasklet_async uint8_t command Neighborhood.getIndex(am_addr_t node)
{
uint8_t i;
if( nodes[last] == node )
return last;
for(i = 0; i < NEIGHBORHOOD_SIZE; ++i)
{
if( nodes[i] == node )
{
last = i;
break;
}
}
return i;
}
tasklet_async uint8_t command Neighborhood.insertNode(am_addr_t node)
{
uint8_t i;
uint8_t maxAge;
if( nodes[last] == node )
{
if( ages[last] == time )
return last;
ages[last] = ++time;
maxAge = 0x80;
}
else
{
uint8_t oldest = 0;
maxAge = 0;
for(i = 0; i < NEIGHBORHOOD_SIZE; ++i)
{
uint8_t age;
if( nodes[i] == node )
{
last = i;
if( ages[i] == time )
return i;
ages[i] = ++time;
maxAge = 0x80;
break;
}
age = time - ages[i];
if( age > maxAge )
{
maxAge = age;
oldest = i;
}
}
if( i == NEIGHBORHOOD_SIZE )
{
signal Neighborhood.evicted(oldest);
last = oldest;
nodes[oldest] = node;
ages[oldest] = ++time;
flags[oldest] = 0;
}
}
if( (time & 0x7F) == 0x7F && maxAge >= 0x7F )
{
for(i = 0; i < NEIGHBORHOOD_SIZE; ++i)
{
if( (ages[i] | 0x7F) != time )
ages[i] = time & 0x80;
}
}
return last;
}
inline tasklet_async command bool NeighborhoodFlag.get[uint8_t bit](uint8_t index)
{
return flags[index] & (1 << bit);
}
inline tasklet_async command void NeighborhoodFlag.set[uint8_t bit](uint8_t index)
{
flags[index] |= (1 << bit);
}
inline tasklet_async command void NeighborhoodFlag.clear[uint8_t bit](uint8_t index)
{
flags[index] &= ~(1 << bit);
}
tasklet_async command void NeighborhoodFlag.clearAll[uint8_t bit]()
{
uint8_t i;
bit = ~(1 << bit);
for(i = 0; i < NEIGHBORHOOD_SIZE; ++i)
flags[i] &= bit;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -