TestLplC.nc

/**
 * Simple test code for low-power-listening. Sends a sequence of packets,
 * changing the low-power-listening settings every ~32s. See README.txt
 * for more details.
 */

#include "Timer.h"

module TestLplC {
  uses {
    interface Leds;
    interface Boot;
    interface Receive;
    interface AMSend;
    interface Timer<TMilli> as MilliTimer;
    interface SplitControl;
    interface LowPowerListening;
  }
}
implementation {
  message_t packet;
  bool locked;
  uint8_t counter = 0, sendSkip;
  int16_t sendInterval;

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

  void nextLplState() {
    switch (counter >> 5) {
    case 0:
      sendSkip = 0;
      sendInterval = 0;
      call LowPowerListening.setLocalWakeupInterval(0);
      break;
    case 1:
      sendInterval = 100; /* Send to sleepy listener */
      break;
    case 2:
      sendInterval = -1; /* Send to listener like us */
      call LowPowerListening.setLocalWakeupInterval(250);
      break;
    case 3:
      sendInterval = 0; /* Send to awake listener */
      break;
    case 4:
      sendInterval = -1; /* Send to listener like us */
      call LowPowerListening.setLocalWakeupInterval(10);
      break;
    case 5:
      sendSkip = 7; /* Send every 7s */
      call LowPowerListening.setLocalWakeupInterval(2000);
    }
  }

  event void MilliTimer.fired() {
    counter++;
    if ((counter & 0x1F) == 0)
      nextLplState();

    if (!locked && ((counter & sendSkip) == sendSkip)) {
      if (sendInterval >= 0)
        call LowPowerListening.setRemoteWakeupInterval(&packet, sendInterval);
      if (call AMSend.send(AM_BROADCAST_ADDR, &packet, 0) == SUCCESS) {
        call Leds.led0On();
        locked = TRUE;
      }
    }
  }

  event message_t * Receive.receive(message_t * bufPtr, void * payload, uint8_t len) {
    call Leds.led1Toggle();
    return bufPtr;
  }

  event void AMSend.sendDone(message_t* bufPtr, error_t error) {
    if (&packet == bufPtr) {
      locked = FALSE;
      call Leds.led0Off();
    }
  }

  event void SplitControl.startDone(error_t err) {
    call MilliTimer.startPeriodic(1000);
  }

  event void SplitControl.stopDone(error_t err) { }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值