msp430refvoltarbiterimplp.nc

来自「tinyos-2.x.rar」· NC 代码 · 共 179 行

NC
179
字号
/*
 * Copyright (c) 2006, Technische Universität Berlin
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met:
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright 
 *   notice, this list of conditions and the following disclaimer in the 
 *   documentation and/or other materials provided with the distribution.
 * - Neither the name of the Technische Universität Berlin nor the names 
 *   of its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * - Revision -------------------------------------------------------------
 * $Revision: 1.5 $
 * $Date: 2007/04/05 13:42:36 $
 * @author: Jan Hauer <hauer@tkn.tu-berlin.de>
 * ========================================================================
 */

module Msp430RefVoltArbiterImplP
{
  provides interface Resource as ClientResource[uint8_t client];
  uses {
    interface Resource as AdcResource[uint8_t client];
    interface SplitControl as RefVolt_1_5V;
    interface SplitControl as RefVolt_2_5V;  
    interface AdcConfigure<const msp430adc12_channel_config_t*> as Config[uint8_t client];
  }
} implementation {
  enum {
    NO_OWNER = 0xFF,
  };
  norace uint8_t syncOwner = NO_OWNER;

  task void switchOff();
  
  async command error_t ClientResource.request[uint8_t client]()
  {
    return call AdcResource.request[client]();
  }
   
  async command error_t ClientResource.immediateRequest[uint8_t client]()
  {
    const msp430adc12_channel_config_t* settings = call Config.getConfiguration[client]();
    if (settings->sref == REFERENCE_VREFplus_AVss ||
        settings->sref == REFERENCE_VREFplus_VREFnegterm)
      // always fails, because of the possible start-up delay (and async-sync transition)
      return FAIL;
    else {
      return call AdcResource.immediateRequest[client]();
    }
  }

  event void AdcResource.granted[uint8_t client]()
  {
    const msp430adc12_channel_config_t* settings  = call Config.getConfiguration[client]();
    if (settings->sref == REFERENCE_VREFplus_AVss ||
        settings->sref == REFERENCE_VREFplus_VREFnegterm){
      error_t started;
      if (syncOwner != NO_OWNER){
        // very rare case, which can only occur 
        // if no FIFO task scheduler
        // is used (see comment below)
        call AdcResource.release[client]();
        call AdcResource.request[client]();
        return;
      }
      syncOwner = client;
      if (settings->ref2_5v == REFVOLT_LEVEL_1_5)
        started = call RefVolt_1_5V.start();
      else
        started = call RefVolt_2_5V.start();
      if (started != SUCCESS){
        syncOwner = NO_OWNER;
        call AdcResource.release[client]();
        call AdcResource.request[client]();
      }
    } else 
      signal ClientResource.granted[client]();
  }
   
  event void RefVolt_1_5V.startDone(error_t error)
  {
    if (syncOwner != NO_OWNER){
      // assumption: a client which has called request() must
      // not call release() before it gets the granted()
      signal ClientResource.granted[syncOwner]();
    }
  }
   
  event void RefVolt_2_5V.startDone(error_t error)
  {
    if (syncOwner != NO_OWNER){
      // assumption: a client which has called request() must
      // not call release() before it gets the granted()
      signal ClientResource.granted[syncOwner]();
    }
  }

  async command error_t ClientResource.release[uint8_t client]()
  {
    error_t error;
    if (syncOwner == client)
      post switchOff();  
    error = call AdcResource.release[client]();
    // If syncOwner == client then now there is an inconsistency between 
    // the state of syncOwner and the actual owner of the Resource 
    // (which is not owned by anyone, because it was just released). 
    // The switchOff() task will resolve this incosistency, but a 
    // client can call ClientResource.request() before this task is 
    // posted. However, since Resource.granted is signalled in task context,
    // with a FIFO task scheduler we can be sure that switchOff() will
    // always be executed before the next Resource.granted event is 
    // signalled. Unfortunately "TinyOS components MUST NOT assume a 
    // FIFO policy" (TEP106), that's why there is some additional check
    // in AdcResource.granted above.
    return error;
  }

  task void switchOff()
  {
    // update internal state
    if (syncOwner != NO_OWNER){
      if (call RefVolt_1_5V.stop() == SUCCESS){
        syncOwner = NO_OWNER;
      } else
        post switchOff();
    }
  }

  event void RefVolt_1_5V.stopDone(error_t error)
  {
  }
  
  event void RefVolt_2_5V.stopDone(error_t error)
  {
  }

  async command uint8_t ClientResource.isOwner[uint8_t client]()
  {
    return call AdcResource.isOwner[client]();
  }

  default event void ClientResource.granted[uint8_t client](){}
  default async command error_t AdcResource.request[uint8_t client]()
  {
    return FAIL;
  }
  default async command error_t AdcResource.immediateRequest[uint8_t client]()
  {
    return FAIL;
  }
  default async command bool AdcResource.isOwner[uint8_t client]() { return FALSE; }
  default async command error_t AdcResource.release[uint8_t client](){return FAIL;}
  const msp430adc12_channel_config_t defaultConfig = {INPUT_CHANNEL_NONE,0,0,0,0,0,0,0}; 
  default async command const msp430adc12_channel_config_t*
    Config.getConfiguration[uint8_t client]()
  { 
    return &defaultConfig;
  }
}  

⌨️ 快捷键说明

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