*/
#include <Msp430Adc12.h>
-module Msp430Adc12ImplP
+module Msp430Adc12ImplP @safe()
{
provides {
interface Init;
}
implementation
{
-#warning Accessing TimerA for ADC12
+
+#ifdef ADC12_TIMERA_ENABLED
+ #warning Accessing TimerA for ADC12
+#endif
+
enum {
SINGLE_DATA = 1,
SINGLE_DATA_REPEAT = 2,
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() */
{
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
{
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
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);
{
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
ctl0.sht1 = config->sht;
state = MULTIPLE_DATA_REPEAT;
- resultBuffer = buf;
+ resultBufferStart = NULL;
resultBufferLength = length;
+ resultBufferStart = buf;
resultBufferIndex = 0;
call HplAdc12.setCtl0(ctl0);
{
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;
{
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;
ctl0.sht1 = config->sht;
state = MULTI_CHANNEL;
- resultBuffer = buf;
+ resultBufferStart = NULL;
resultBufferLength = numSamples;
+ resultBufferStart = buf;
resultBufferIndex = 0;
numChannels = numMemctl+1;
call HplAdc12.setCtl0(ctl0);
uint8_t i;
atomic {
if (call ADCArbiterInfo.userId() == id){
- if (!resultBuffer)
+ if (!resultBufferStart)
return EINVAL;
if (state & ADC_BUSY)
return EBUSY;
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]();
case MULTI_CHANNEL:
{
uint16_t i = 0, k;
- resultBufferStart = resultBuffer;
+ resultBuffer = resultBufferStart + resultBufferIndex;
do {
*resultBuffer++ = call HplAdc12.getMem(i);
} while (++i < numChannels);
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
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;
}
}
default async event uint16_t* SingleChannel.multipleDataReady[uint8_t id](
- uint16_t *buf, uint16_t length)
+ uint16_t *buf, uint16_t numSamples)
{
return 0;
}