⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binaryinterferencemodelc.nc

📁 tinyos-2.x.rar
💻 NC
字号:
// $Id: BinaryInterferenceModelC.nc,v 1.4 2006/12/12 18:23:32 vlahan Exp $
/*
 * "Copyright (c) 2005 Stanford 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 STANFORD 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 STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 * 
 * STANFORD 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 STANFORD UNIVERSITY
 * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
 * ENHANCEMENTS, OR MODIFICATIONS."
 */

/**
 * A binary interference model with length-independent packet error
 * rates (the old TOSSIM-packet story).
 *
 * @author Philip Levis
 * @date   December 2 2005
 */ 

#include <sim_binary.h>

module BinaryInterferenceModelC {
  provides interface SimpleRadioModel as Model;
}

implementation {

  message_t* outgoing;
  bool requestAck;
  
  void sim_binary_ack_handle(sim_event_t* evt)  {
    if (outgoing != NULL && requestAck) {
      signal Model.acked(outgoing);
    }
  }

  sim_event_t receiveEvent;
  sim_time_t clearTime = 0;
  bool collision = FALSE;
  message_t* incoming = NULL;
  int incomingSource;

  
  command bool Model.clearChannel() {
    dbg("Binary", "Checking clear channel @ %s: %i\n", sim_time_string(), (clearTime < sim_time()));
    return clearTime < sim_time();
  }

  
  void sim_schedule_ack(int source, sim_time_t time) {
    sim_event_t* ackEvent = (sim_event_t*)malloc(sizeof(sim_event_t));
    ackEvent->mote = source;
    ackEvent->force = 0;
    ackEvent->cancelled = 0;
    ackEvent->time = time;
    ackEvent->handle = sim_binary_ack_handle;
    ackEvent->cleanup = sim_queue_cleanup_event;
    sim_queue_insert(ackEvent);
  }
  
  void sim_binary_receive_handle(sim_event_t* evt) {
    // If there was no collision, and we pass the loss
    // rate...
    if (!collision) {
      double loss = sim_binary_loss(incomingSource, sim_node());
      int randVal = sim_random() % 1000000;
      dbg("Binary", "Handling receive event for %i.\n", sim_node());
      loss *= 1000000.0;
      if (randVal < (int)loss) {
	signal Model.receive(incoming);

	loss = sim_binary_loss(sim_node(), incomingSource);
	randVal = sim_random() % 1000000;
	loss *= 1000000.0;
	if (randVal < (int)loss) {
	  sim_schedule_ack(incomingSource, sim_time());
	}
      }
      else {
	dbg("Binary", "Packet lost.\n");
      }
    }
    else {
      dbg("Binary", "Receive event for %i was a collision.\n", sim_node());
    }
    incoming = NULL;
  }

  void enqueue_receive_event(int source, sim_time_t endTime, message_t* msg) {
    if (incoming == NULL) {
      dbg("Binary", "Formatting reception event for %i.\n", sim_node());
      receiveEvent.time = endTime;
      receiveEvent.mote = sim_node();
      receiveEvent.cancelled = 0;
      receiveEvent.force = 0;
      receiveEvent.handle = sim_binary_receive_handle;
      receiveEvent.cleanup = sim_queue_cleanup_none;
      incoming = msg;
      sim_queue_insert(&receiveEvent);
      incoming = msg;
      incomingSource = source;
    }
  }
  
  void sim_binary_put(int dest, message_t* msg, sim_time_t endTime, bool receive) {
    int prevNode = sim_node();
    sim_set_node(dest);
    if (clearTime < sim_time() && receive) {
      dbg("Binary", "Enqueing reception event for %i.\n", dest);
      enqueue_receive_event(prevNode, endTime - 1, msg);
      collision = FALSE;
    }
    else {
      collision = TRUE;
    }
    if (endTime > clearTime) {
      clearTime = endTime;
    }
    sim_set_node(prevNode);
  }


  command void Model.putOnAirToAll(message_t* msg, bool ack, sim_time_t endTime) {
    link_t* link = sim_binary_first(sim_node());
    requestAck = FALSE;
    outgoing = msg;
    dbg("Binary", "Node %i broadcasting, first link is 0x%p.\n", sim_node(), sim_binary_first(sim_node()));
    while (link != NULL) {
      int other = link->mote;
      dbg("Binary", "Node %i transmitting to %i.\n", sim_node(), other);
      sim_binary_put(other, msg, endTime, TRUE);
      link = sim_binary_next(link);
    }
  }

  command void Model.putOnAirTo(int dest, message_t* msg, bool ack, sim_time_t endTime) {
    link_t* link = sim_binary_first(sim_node());
    requestAck = ack;
    outgoing = msg;
    
    while (link != NULL) {
      int other = link->mote;
      sim_binary_put(other, msg, endTime, other == dest);
      dbg("Binary", "Node %i transmitting to %i.\n", sim_node(), dest);
      link = sim_binary_next(link);
    }
  }
    

  
  
 default event void Model.receive(message_t* msg) {}


}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -