VoltageM.nc
上传用户:joranyuan
上传日期:2022-06-23
资源大小:3306k
文件大小:3k
源码类别:

网络

开发平台:

Others

  1. // $Id: VoltageM.nc,v 1.1.1.1 2005/04/22 04:26:45 acwarrie Exp $
  2. /*         tab:2
  3.  *
  4.  *
  5.  * "Copyright (c) 2000-2005 The Regents of the University  of California.  
  6.  * All rights reserved.
  7.  *
  8.  * Permission to use, copy, modify, and distribute this software and its
  9.  * documentation for any purpose, without fee, and without written agreement is
  10.  * hereby granted, provided that the above copyright notice, the following
  11.  * two paragraphs and the author appear in all copies of this software.
  12.  * 
  13.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  14.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  15.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  16.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17.  * 
  18.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  19.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  20.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  21.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  22.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
  23.  *
  24.  */
  25. /**
  26.  * Module for measuring supply voltage (Vcc) on mica2. Value returned
  27.  * by dataReady() is in millivolts.
  28.  *
  29.  * @author Jonathan Hui <jwhui@cs.berkeley.edu>
  30.  */
  31. module VoltageM {
  32.   provides {
  33.     interface ADC as Voltage;
  34.     interface StdControl;
  35.   }
  36.   uses {
  37.     interface ADC;
  38.     interface ADCControl;
  39.   }
  40. }
  41. implementation {
  42.   uint8_t state;
  43.   uint16_t voltage;
  44.   enum {
  45.     S_IDLE,
  46.     S_GET_DATA,
  47.   };
  48.   command result_t StdControl.init() {
  49.     atomic state = S_IDLE;
  50.     return SUCCESS;
  51.   }
  52.   command result_t StdControl.start() {
  53.     result_t result;
  54.     result = call ADCControl.init();
  55.     result = rcombine(call ADCControl.bindPort(TOS_ADC_VOLTAGE_PORT,
  56.        TOSH_ACTUAL_VOLTAGE_PORT),
  57.       result);
  58.     return result;
  59.   }
  60.   command result_t StdControl.stop() {
  61.     return SUCCESS;
  62.   }
  63.   async command result_t Voltage.getData() {
  64.     uint8_t tmpState;
  65.     atomic tmpState = state;
  66.     if (tmpState != S_IDLE)
  67.       return FAIL;
  68.     TOSH_MAKE_BAT_MON_OUTPUT();
  69.     TOSH_SET_BAT_MON_PIN();
  70.     
  71.     if (call ADC.getData() == FAIL)
  72.       return FAIL;
  73.     atomic state = S_GET_DATA;
  74.     return SUCCESS;
  75.   }
  76.   
  77.   /*
  78.    * Not supported.
  79.    */
  80.   async command result_t Voltage.getContinuousData() {
  81.     return FAIL;
  82.   }
  83.   task void signalReady() {
  84.     uint32_t tmpVoltage;
  85.     // Vbatt = (Vref*ADC_FS/ADC_Count)
  86.     atomic {
  87.       tmpVoltage = (uint32_t)1223*1024;
  88.       tmpVoltage /= voltage;
  89.       state = S_IDLE;
  90.     }
  91.     signal Voltage.dataReady(tmpVoltage);
  92.   }
  93.   async event result_t ADC.dataReady(uint16_t data) {
  94.     
  95.     TOSH_CLR_BAT_MON_PIN();
  96.     atomic voltage = data;
  97.     post signalReady();
  98.     return SUCCESS;
  99.   }
  100. }