*/
#include <Msp430Adc12.h>
-module Msp430Adc12ImplP
+module Msp430Adc12ImplP @safe()
{
provides {
interface Init;
interface Msp430Adc12MultiChannel as MultiChannel[uint8_t id];
interface Msp430Adc12Overflow as Overflow[uint8_t id];
interface AsyncStdControl as DMAExtension[uint8_t id];
- }
- uses {
+ }
+ uses {
interface ArbiterInfo as ADCArbiterInfo;
- interface HplAdc12;
+ interface HplAdc12;
interface Msp430Timer as TimerA;;
interface Msp430TimerControl as ControlA0;
interface Msp430TimerControl as ControlA1;
interface HplMsp430GeneralIO as Port65;
interface HplMsp430GeneralIO as Port66;
interface HplMsp430GeneralIO as Port67;
- }
+ }
}
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() */
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);
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;
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;
}