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

📄 testislc.nc

📁 tinyos2.0版本驱动
💻 NC
字号:
#include "Timer.h"
#include "I2C.h"
#include "TestISLMsg.h"

module TestISLC @safe()
{
  uses
  {
    interface Leds;
    interface Boot;
    interface Timer<TMilli> as Timer;
    interface SplitControl as SerialControl;
    interface Packet;
    interface AMSend;
    interface I2CPacket<TI2CBasicAddr>;
    interface Resource;
    interface GeneralIO as PD_Enable;  
  }
}

implementation
{
  
  uint8_t test[8];
  message_t packet;
  
  event void Boot.booted()
  {
    call PD_Enable.makeOutput();
    call PD_Enable.clr();
    call SerialControl.start();
  }
  
  event void SerialControl.startDone(error_t error)
  {
	//test[0]=0x00;
	//test[1]=0x00;
	test[0]=0x00;
	call Resource.request();
	//call Timer.startOneShot(5000);
  }
  
  event void SerialControl.stopDone(error_t error){ }
  
  event void Timer.fired()
  {
    int i;
    for(i=0;i<8;i++)
    {
      test[i] = 0;
    }
    call Resource.request();
  }
  
  event void Resource.granted()
  {
    //uint8_t len;
    //len = sizeof(test);
    if(call I2CPacket.write(I2C_START | I2C_STOP, ISL_ADDR, 1, test) == SUCCESS)
    {
      call Leds.led0Toggle();
      return;
    }
  }
  
  task void ReadDone()
  {
    TestISLMsg *ptr = (TestISLMsg *)call Packet.getPayload(&packet, sizeof(TestISLMsg));
    if (call Packet.maxPayloadLength() < sizeof(TestISLMsg)) 
    {
      return;
    }
	ptr->Imote_light[0] = test[1];
    ptr->Imote_light[1] = test[2];
    ptr->Imote_light[2] = test[3];
    ptr->Imote_light[3] = test[4];
    //ptr->Imote_light[2] = test[5];
    //ptr->Imote_light[2] = test[6];
    call AMSend.send(AM_BROADCAST_ADDR, &packet, sizeof(TestISLMsg));
    call Leds.led1Toggle();
	return;
  }
  
  async event void I2CPacket.readDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data)
  {
	post ReadDone();
	//这个功能如果直接实现就会报警告,
	/*
	TestISLC.nc:69: warning: `Packet.getPayload' called asynchronously from `I2CPacket.writeDone'
	TestISLC.nc:69: warning: `Packet.getPayload' called asynchronously from `I2CPacket.writeDone'
	TestISLC.nc:70: warning: `Packet.maxPayloadLength' called asynchronously from `I2CPacket.writeDone'
	TestISLC.nc:80: warning: `AMSend.send' called asynchronously from `I2CPacket.writeDone'
	*/
    call Resource.release();
    call Leds.led2Toggle();
    return;
  }
  
  task void I2CRead()
  {
    call I2CPacket.read(I2C_START | I2C_STOP, ISL_ADDR, 4, test);
  }
  
    async event void I2CPacket.writeDone(error_t error, uint16_t addr, uint8_t length, uint8_t* data)
  {
    post I2CRead();
    return;
  }  
  
    task void StartTimerOneShot()
  {
    call Timer.startOneShot(1000);
  }
  
  event void AMSend.sendDone(message_t* bufPtr, error_t error) 
  {
    post StartTimerOneShot();
    return;
  }
  
  //首先向I2C做write,writeDone触发read,readDone中完成向串口的发送?那么Timer应该怎么保证?
  //writeDone,readDone的参数data已经可以把数据对应到定义的格式里吗?具体传值?
}

⌨️ 快捷键说明

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