Dear All,
I'm trying to simultaneously support 2 sensors on a single shimmer mote. I want 
to individually access the 2 sensors (e.g. sampling at different times) and I'm 
are trying to use TinyOS Resource interface to share the ADC but I'm dealing 
with some problems: it seems that the ADC is correctly configured but I'm not 
signaled by the ADC correctly. It is like ADC.dataReady (I use interface 
Msp430Adc12MultiChannel as ADC) is getting signalled to each driver every time 
the ADC is sampled but sampling the two sensor with a different rate, instead 
of receiving a dataReady event for each sensor at the shortest sampling time I 
have the opposite behaviour. It looks like resource arbiter doesn't work (it 
seems that the Resource.release event is not called at the right moment), do 
you have any suggestion?
======================================================================
Here is the code of one of the two sensor, the other one is similar:
configuration HilAccSensorC
{
  provides interface Sensor;
}
implementation
{
  components MainC, Mma7260P;
  components new Msp430Adc12ClientAutoRVGC() as ADC;
  components HilAccSensorP, SensorsRegistryC;
  //-----------
 components LedsC;
 //----------
  ADC.AdcConfigure -> HilAccSensorP;
  HilAccSensorP.Resource -> ADC.Resource;
  HilAccSensorP.ADC -> ADC;
  MainC.SoftwareInit -> Mma7260P.Init;
  MainC.SoftwareInit -> HilAccSensorP.Init;
  //----------
 HilAccSensorP.Leds -> LedsC;
 //----------
  HilAccSensorP.Boot -> MainC;
  Sensor = HilAccSensorP;
  HilAccSensorP.Mma7260 -> Mma7260P;
  HilAccSensorP.SensorsRegistry -> SensorsRegistryC;
}
-----------------------------------------
#include "Msp430Adc12.h"
#include "Mma7260.h"
module HilAccSensorP {
  provides interface AdcConfigure<const msp430adc12_channel_config_t*>;
  provides interface Init;
  provides interface Sensor;
  uses interface Mma7260;
  uses interface Boot;
  uses interface SensorsRegistry;
  uses interface Msp430Adc12MultiChannel as ADC;
  uses interface Resource;
  //----------
  uses interface Leds;
  //----------
}
implementation {
    uint16_t accData[3],dbuff[3];
    uint8_t blinky = 0;
    uint8_t valueTypesList[3] = { CH_1, CH_2, CH_3 };
    uint8_t acquireTypesList[1] = { ALL };
 uint8_t enableADC;

  const msp430adc12_channel_config_t config = {
      inch: INPUT_CHANNEL_A3,
      sref: REFERENCE_VREFplus_AVss,
      ref2_5v: REFVOLT_LEVEL_2_5,
      adc12ssel: SHT_SOURCE_ACLK,
      adc12div: SHT_CLOCK_DIV_1,
      sht: SAMPLE_HOLD_4_CYCLES,
      sampcon_ssel: SAMPCON_SOURCE_SMCLK,
      sampcon_id: SAMPCON_CLOCK_DIV_1
  };
  adc12memctl_t memctl[2] = {
       { INPUT_CHANNEL_A4, REFVOLT_LEVEL_2_5, 0},
       { INPUT_CHANNEL_A5, REFVOLT_LEVEL_2_5, 1} };
  command error_t Init.init() {
    return SUCCESS;
  }

    event void Boot.booted() {
      call Mma7260.setSensitivity(RANGE_6_0G);

   // the driver self-registers to the sensor registry
   call SensorsRegistry.registerSensor(ACC_SENSOR);
   atomic {
    enableADC = 0;
  }
   }
    async command const msp430adc12_channel_config_t* 
AdcConfigure.getConfiguration()
    {
      return &config;
    }
    event void Resource.granted() {
      call ADC.configure(&config,memctl,2,dbuff,3,0);
    }
    command uint8_t Sensor.getSignificantBits() {
      return 12;
    }
    task void dataReady() {
      signal Sensor.acquisitionDone(SUCCESS, acquireTypesList[0]);
   call Leds.led0Toggle();
   call Resource.release();
    }

    command error_t Sensor.acquireData(enum AcquireTypes acquireType) {
      call Leds.led1Toggle();
   if (acquireType != acquireTypesList[0])
         return FAIL;
   atomic {
  enableADC = 1;
   }
   call Resource.request();
      return call ADC.getData();
    }
    async event void ADC.dataReady(uint16_t *data,uint16_t numSamples) {
      if(enableADC == 1)
   {
    atomic {
   enableADC = 0;

   if (numSamples > 3)
     numSamples = 3;
   memcpy(accData, data, sizeof(*data)*numSamples);
    }
    post dataReady();
   }
     }

    command uint16_t Sensor.getValue(enum ValueTypes valueType) {
   switch (valueType) {
          case CH_1 : return accData[0];
          case CH_2 : return accData[1];
          case CH_3 : return accData[2];
          default : return 0xffff;
        }
    }
    command void Sensor.getAllValues(uint16_t* buffer, uint8_t* valuesNr) {
   *valuesNr = sizeof valueTypesList;
   atomic {
           memcpy(buffer, accData, sizeof(*accData)*3);
      }
    }
    command enum SensorCode Sensor.getSensorCode() {
      return ACC_SENSOR;
    }
    command uint16_t Sensor.getSensorID() {
      return 0x2249; // the ID has been randomly choosen
    }
    command uint8_t* Sensor.getValueTypesList(uint8_t* valuesTypeNr) {
      *valuesTypeNr = sizeof valueTypesList;
      return valueTypesList;
    }
    command uint8_t* Sensor.getAcquireTypesList(uint8_t* acquireTypesNr) {
      *acquireTypesNr = sizeof acquireTypesList;
      return acquireTypesList;
    }
}

_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to