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

📄 synclogc.nc

📁 tinyos-2.x.rar
💻 NC
字号:
/**
 * Test reading and writing to a log with lots of syncs. See README.txt for
 * more details.
 *
 * @author Mayur Maheshwari (mayur.maheshwari@gmail.com)
 * @author David Gay
 */

module SyncLogC
{
  uses {
    interface Leds;
    interface Boot;
    interface SplitControl as AMControl;
    interface LogWrite;
    interface LogRead;
    interface Timer<TMilli> as Timer0;
    interface Timer<TMilli> as Timer1;
    interface AMSend;
  }
}
implementation {

  uint16_t data = 0;
  uint16_t readings = 0;
  message_t pkt;
  bool busy = FALSE;
  bool logBusy = FALSE;

  task void sendTask();

  storage_cookie_t readCookie;
  storage_cookie_t writeCookie;

#define SAMPLING_FREQUENCY 2333
#define TIMER_PERIOD_MILLI 5120

  event void Boot.booted() {
    call AMControl.start();
  }

  event void AMControl.startDone(error_t err) {
    if (err == SUCCESS)
      call LogWrite.erase();
    else
      call AMControl.start();
  }

  event void LogWrite.eraseDone(error_t result) {
    call Timer1.startPeriodic(SAMPLING_FREQUENCY);
    call Timer0.startPeriodic(TIMER_PERIOD_MILLI);
  }
  
  event void Timer1.fired()
  {
    readings++;
    if (!logBusy)
      {
	logBusy = TRUE;
	call LogWrite.append(&readings, sizeof(readings));
      }
  }

  event void LogWrite.appendDone(void *buf, storage_len_t len, bool recordsLost, error_t result) {
    if (result == SUCCESS)
      call LogWrite.sync();
  }

  event void LogWrite.syncDone(error_t result) {
    logBusy = FALSE;
    call Leds.led2Toggle();
  }

  event void Timer0.fired() {
    call Timer1.stop();
    if (!logBusy)
      {
	call Leds.led0Toggle();
	logBusy = TRUE;
	call LogRead.read(&data, sizeof data);
      }
  }

  event void LogRead.readDone(void* buf, storage_len_t len, error_t error) {
    if (error == SUCCESS)
      if (len == sizeof data)
	post sendTask();
      else
	{
	  logBusy = FALSE;
	  call Timer1.startPeriodic(SAMPLING_FREQUENCY);
	}
  }

  typedef nx_struct {
    nx_uint16_t nodeid;
    nx_uint16_t payloadData;
  } SenseStoreRadioMsg;

  task void sendTask() {
    if (!busy)
      {
	SenseStoreRadioMsg* ssrpkt =
	  (SenseStoreRadioMsg*)(call AMSend.getPayload(&pkt, sizeof(SenseStoreRadioMsg)));
	ssrpkt->nodeid = TOS_NODE_ID;
	ssrpkt->payloadData = data;
	if (call AMSend.send(AM_BROADCAST_ADDR, &pkt, sizeof(SenseStoreRadioMsg)) == SUCCESS)
	  busy = TRUE;
      }
  }

  event void AMSend.sendDone(message_t* msg, error_t err) {
    if (&pkt == msg)
      {
	busy = FALSE;
	call LogRead.read(&data, sizeof data);
      }
  }

  event void LogRead.seekDone(error_t error) { }
  event void AMControl.stopDone(error_t err) { }
}

⌨️ 快捷键说明

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