]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/msp430/adc12/Msp430Adc12ImplP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / chips / msp430 / adc12 / Msp430Adc12ImplP.nc
index 65ef88e0781d50ff25a934a8a6425a9d82b9e903..e9e7f68e869dd8f07bee73dbd5bb08d86d407252 100644 (file)
@@ -34,7 +34,7 @@
  */
 
 #include <Msp430Adc12.h>
-module Msp430Adc12ImplP 
+module Msp430Adc12ImplP @safe()
 {
   provides {
     interface Init;
@@ -63,7 +63,11 @@ module Msp430Adc12ImplP
 }
 implementation
 { 
-#warning Accessing TimerA for ADC12 
+
+#ifdef ADC12_TIMERA_ENABLED
+  #warning Accessing TimerA for ADC12 
+#endif
+
   enum {
     SINGLE_DATA = 1,
     SINGLE_DATA_REPEAT = 2,
@@ -81,7 +85,6 @@ implementation
   
   uint16_t resultBufferLength;    /* length of buffer */
   uint16_t *COUNT_NOK(resultBufferLength) resultBufferStart;
-  uint16_t *BND_NOK(resultBufferStart, resultBufferStart+resultBufferLength) resultBuffer;         /* conversion results */
   uint16_t resultBufferIndex;     /* offset into buffer */
   uint8_t numChannels;            /* number of channels (multi-channel conversion) */
   uint8_t clientID;               /* ID of client that called getData() */
@@ -219,6 +222,10 @@ implementation
   {
     error_t result = ERESERVE;
 #ifdef ADC12_CHECK_ARGS
+#ifndef ADC12_TIMERA_ENABLED
+    if (jiffies>0) 
+      return EINVAL;
+#endif
     if (!config || jiffies == 1 || jiffies == 2)
       return EINVAL;
 #endif
@@ -267,6 +274,10 @@ implementation
   {
     error_t result = ERESERVE;
 #ifdef ADC12_CHECK_ARGS
+#ifndef ADC12_TIMERA_ENABLED
+    if (jiffies>0) 
+      return EINVAL;
+#endif
     if (!config || !buf || !length || jiffies == 1 || jiffies == 2)
       return EINVAL;
 #endif
@@ -296,8 +307,9 @@ implementation
         ctl0.sht1 = config->sht;
 
         state = MULTIPLE_DATA;
-        resultBuffer = buf;
+       resultBufferStart = NULL;
         resultBufferLength = length;
+        resultBufferStart = buf;
         resultBufferIndex = 0;
         call HplAdc12.setCtl0(ctl0);
         call HplAdc12.setCtl1(ctl1);
@@ -323,6 +335,10 @@ implementation
   {
     error_t result = ERESERVE;
 #ifdef ADC12_CHECK_ARGS
+#ifndef ADC12_TIMERA_ENABLED
+    if (jiffies>0) 
+      return EINVAL;
+#endif
     if (!config || !buf || !length || length > 16 || jiffies == 1 || jiffies == 2)
       return EINVAL;
 #endif
@@ -352,8 +368,9 @@ implementation
         ctl0.sht1 = config->sht;
 
         state = MULTIPLE_DATA_REPEAT;
-        resultBuffer = buf;
+       resultBufferStart = NULL;
         resultBufferLength = length;
+        resultBufferStart = buf;
         resultBufferIndex = 0;            
         
         call HplAdc12.setCtl0(ctl0);
@@ -378,7 +395,7 @@ implementation
   {
     atomic {
       if (call ADCArbiterInfo.userId() == id){
-        if (state & MULTIPLE_DATA_REPEAT && !resultBuffer)
+        if ((state & MULTIPLE_DATA_REPEAT) && !resultBufferStart)
           return EINVAL;
         if (state & ADC_BUSY)
           return EBUSY;
@@ -401,6 +418,10 @@ implementation
   {
     error_t result = ERESERVE;
 #ifdef ADC12_CHECK_ARGS
+#ifndef ADC12_TIMERA_ENABLED
+    if (jiffies>0) 
+      return EINVAL;
+#endif
     if (!config || !memctl || !numMemctl || numMemctl > 15 || !numSamples || 
         !buf || jiffies == 1 || jiffies == 2 || numSamples % (numMemctl+1) != 0)
       return EINVAL;
@@ -431,8 +452,9 @@ implementation
         ctl0.sht1 = config->sht;
 
         state = MULTI_CHANNEL;
-        resultBuffer = buf;
+       resultBufferStart = NULL;
         resultBufferLength = numSamples;
+        resultBufferStart = buf;
         resultBufferIndex = 0;
         numChannels = numMemctl+1;
         call HplAdc12.setCtl0(ctl0);
@@ -461,7 +483,7 @@ implementation
     uint8_t i;
     atomic {
       if (call ADCArbiterInfo.userId() == id){
-        if (!resultBuffer)
+        if (!resultBufferStart)
           return EINVAL;
         if (state & ADC_BUSY)
           return EBUSY;
@@ -522,6 +544,8 @@ implementation
   async event void HplAdc12.conversionDone(uint16_t iv)
   {
     bool overflow = FALSE;
+    uint16_t *resultBuffer;
+
     if (iv <= 4){ // check for overflow
       if (iv == 2)
         signal Overflow.memOverflow[clientID]();
@@ -550,7 +574,7 @@ implementation
       case MULTI_CHANNEL:
         {
           uint16_t i = 0, k;
-          resultBufferStart = resultBuffer;
+          resultBuffer = resultBufferStart + resultBufferIndex;
           do {
             *resultBuffer++ = call HplAdc12.getMem(i);
           } while (++i < numChannels);
@@ -562,13 +586,13 @@ implementation
             resultBufferIndex = 0;
             signal MultiChannel.dataReady[clientID](resultBuffer, 
                 overflow ? k : resultBufferLength);
-          } else call HplAdc12.enableConversion();
+          }
         }
         break;
       case MULTIPLE_DATA:
         {
           uint16_t i = 0, length, k;
-          resultBufferStart = resultBuffer;
+          resultBuffer = resultBufferStart + resultBufferIndex;
           if (resultBufferLength - resultBufferIndex > 16) 
             length = 16;
           else
@@ -597,15 +621,15 @@ implementation
       case MULTIPLE_DATA_REPEAT:
         {
           uint8_t i = 0;
-          resultBufferStart = resultBuffer;
+          resultBuffer = resultBufferStart;
           do {
             *resultBuffer++ = call HplAdc12.getMem(i);
           } while (++i < resultBufferLength);
           
-          resultBuffer = signal SingleChannel.multipleDataReady[clientID](
+          resultBufferStart = signal SingleChannel.multipleDataReady[clientID](
               resultBuffer-resultBufferLength,
               overflow ? 0 : resultBufferLength);
-          if (!resultBuffer)  
+          if (!resultBufferStart)  
             stopConversion();
           break;
         }
@@ -619,7 +643,7 @@ implementation
   }
    
   default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id](
-      uint16_t *buf, uint16_t length)
+      uint16_t *buf, uint16_t numSamples)
   {
     return 0;
   }