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

📄 testmts300p.nc

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

module TestMts300P
{
  uses
  {
    interface Leds;
    interface Boot;
    interface Timer<TMilli> as MTS300Timer;
    // communication
    interface SplitControl as RadioControl;
    interface Packet as RadioPacket;
    interface AMSend as RadioSend;

    interface SplitControl as UartControl;
    interface Packet as UartPacket;
    interface AMSend as UartSend;
    // sensor components
    interface Mts300Sounder as Sounder;
   	interface Read<uint16_t> as Vref; //!< voltage
    interface Read<uint16_t> as Light;
    interface Read<uint16_t> as Temp;
   	interface Read<uint16_t> as Microphone; //!< Mic sensor
   	interface Read<uint16_t> as AccelX; //!< Accelerometer sensor
   	interface Read<uint16_t> as AccelY; //!< Accelerometer sensor
   	interface Read<uint16_t> as MagX; //!< magnetometer sensor
   	interface Read<uint16_t> as MagY; //!< magnetometer sensor

  }
}
implementation
{

  enum
  {
  	STATE_IDLE = 0,
  	STATE_VREF_START,
  	STATE_VREF_READY,      //!< smaple complete
  	STATE_LIGHT_START,
  	STATE_LIGHT_READY,     //!< smaple complete
  	STATE_TEMP_START,
  	STATE_TEMP_READY,      //!< smaple complete
  	STATE_MIC_START,
  	STATE_MIC_READY,      //!< smaple complete
  	STATE_ACCELX_START,
  	STATE_ACCELX_READY,      //!< smaple complete
  	STATE_ACCELY_START,
  	STATE_ACCELy_READY,      //!< smaple complete
  	STATE_MAGX_START,
  	STATE_MAGX_READY,      //!< smaple complete
  	STATE_MAGY_START,
  	STATE_MAGY_READY,      //!< smaple complete
  };

  bool sending_packet;
  bool packet_ready;
  uint8_t state;
  uint16_t counter = 0;
  message_t packet;
  Mts300Msg* pMsg;

  // Zero out the accelerometer, chrl@20070213
  norace uint16_t accel_ave_x, accel_ave_y;
  norace uint8_t accel_ave_points;


//////////////////////////////////////////////////////////////////////////////
//
//  packet sending
//
//////////////////////////////////////////////////////////////////////////////
  task void send_msg()
  {
    atomic packet_ready = FALSE;
    // check length of the allocated buffer to see if it is enough for our packet
    if (call RadioPacket.maxPayloadLength() < sizeof(Mts300Msg))
    {
      return ;
    }
    // OK, the buffer is large enough
    //pMsg->vref = counter;
    if (call UartSend.send(AM_BROADCAST_ADDR, &packet, sizeof(Mts300Msg)) == SUCCESS)
    {
      sending_packet = TRUE;
      call Leds.led2On();
    }
  }

//////////////////////////////////////////////////////////////////////////////
//
//  basic control routines
//
//////////////////////////////////////////////////////////////////////////////
  event void Boot.booted()
  {
    sending_packet = FALSE;
    packet_ready = FALSE;
    state = STATE_IDLE;
    pMsg = (Mts300Msg*)call RadioPacket.getPayload(&packet, sizeof(Mts300Msg));
    if (pMsg == NULL) {
      call Leds.led0On();
      return;
    }

    // Zero out the accelerometer, chrl@20070213
    accel_ave_x = 0;
    accel_ave_y = 0;
    accel_ave_points = ACCEL_AVERAGE_POINTS;

    call RadioControl.start();
    call UartControl.start();
  }

  event void RadioControl.startDone(error_t err)
  {
    if (err != SUCCESS)
    {
      call RadioControl.start();
    }
  }

  event void RadioControl.stopDone(error_t err)
  {
    // do nothing
  }

  event void UartControl.startDone(error_t err)
  {
    if (err == SUCCESS)
    {
      call Sounder.beep(1000);
      call MTS300Timer.startPeriodic( 1000 );
    }
    else
    {
      call UartControl.start();
    }
  }

  event void UartControl.stopDone(error_t err)
  {
    // do nothing
  }

//////////////////////////////////////////////////////////////////////////////
//
//  timer control routines
//
//////////////////////////////////////////////////////////////////////////////
  event void MTS300Timer.fired()
  {
    uint8_t l_state;
    atomic l_state = state;

    // Zero out the accelerometer, chrl@20070213
    if (accel_ave_points >0)
    {
      if (accel_ave_points == 1)
      {
        call MTS300Timer.stop();
        call MTS300Timer.startPeriodic(1000);
      }
      atomic state = STATE_ACCELX_START;
      call AccelX.read();
      return ;
    }

    call Leds.led1Toggle();

    if (sending_packet) return ;

    if (l_state == STATE_IDLE)
    {
      atomic state = STATE_VREF_START;
      call Vref.read();
      return ;
    }
  }

  /**
   * reference voltage data read
   *
   */
  event void Vref.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->vref = data;
    }
    else
    {
      pMsg->vref = 0;
    }
      atomic state = STATE_LIGHT_START;
      call Light.read();
  }

  /**
   * Light data read
   *
   */
  event void Light.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->light = data;
    }
    else
    {
      pMsg->light = 0;
    }
    atomic state = STATE_TEMP_START;
    call Temp.read();
//    atomic state = STATE_MIC_START;
//    call Microphone.read();
  }

  /**
   * Temperature data read
   *
   */
  event void Temp.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->thermistor = data;
    }
    else
    {
      pMsg->thermistor = 0;
    }
    atomic state = STATE_MIC_START;
    call Microphone.read();
  }

  /**
   * Microphone data read
   *
   */
  event void Microphone.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->mic = data;
    }
    else
    {
      pMsg->mic = 0;
    }
//    atomic packet_ready = TRUE;
    atomic state = STATE_ACCELX_START;
    call AccelX.read();
  }

  /**
   * AccelX data read
   *
   */
  event void AccelX.readDone(error_t result, uint16_t data)
  {
    // Zero out the accelerometer, chrl@20061207
    if (accel_ave_points>0)
    {
      accel_ave_x = accel_ave_x + data;
      call AccelY.read();
      return ;
    }
      
    if (result == SUCCESS)
    {
      pMsg->accelX = data - accel_ave_x;
    }
    else
    {
      pMsg->accelX = 0;
    }
    atomic state = STATE_ACCELY_START;
    call AccelY.read();
  }

  /**
   * AccelY data read
   *
   */
  event void AccelY.readDone(error_t result, uint16_t data)
  {
    // Zero out the accelerometer, chrl@20061207
    if (accel_ave_points>0)
    {
      accel_ave_y = accel_ave_y + data;
      accel_ave_points--;
      if(accel_ave_points == 0)
      {
        accel_ave_x = accel_ave_x / ACCEL_AVERAGE_POINTS - 450;
        accel_ave_y = accel_ave_y / ACCEL_AVERAGE_POINTS - 450;
      }
      atomic state = STATE_IDLE;
      return ;
    }

    if (result == SUCCESS)
    {
      pMsg->accelY = data - accel_ave_y;
    }
    else
    {
      pMsg->accelY = 0;
    }
    atomic state = STATE_MAGX_START;
    call MagX.read();
  }

  /**
   * MagX data read
   *
   */
  event void MagX.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->magX = data;
    }
    else
    {
      pMsg->magX = 0;
    }
    atomic state = STATE_MAGY_START;
    call MagY.read();
  }

  /**
   * MagY data read
   *
   */
  event void MagY.readDone(error_t result, uint16_t data)
  {
    if (result == SUCCESS)
    {
      pMsg->magY = data;
    }
    else
    {
      pMsg->magY = 0;
    }
    atomic packet_ready = TRUE;
    post send_msg();
  }

  /**
   * Data packet sent to RADIO
   *
   */
  event void RadioSend.sendDone(message_t* bufPtr, error_t error)
  {
    if (&packet == bufPtr)
    {
      call Leds.led2Off();
    }
    else
    {
      call Leds.led0On();
    }
    sending_packet = FALSE;
    atomic state = STATE_IDLE;
  }

  /**
   * Data packet sent to UART
   *
   */
  event void UartSend.sendDone(message_t* bufPtr, error_t error)
  {
    if (&packet == bufPtr)
    {
      if (call RadioSend.send(AM_BROADCAST_ADDR, &packet, sizeof(Mts300Msg)) != SUCCESS)
      {
        call Leds.led0On();
        sending_packet = FALSE;
        atomic state = STATE_IDLE;
      }
    }
    else
    {
      call Leds.led0On();
      sending_packet = FALSE;
      atomic state = STATE_IDLE;
    }
  }

// end of the implementation
}

⌨️ 快捷键说明

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