// Multi, none
components new TestAdcMultiC(CONFIG_AVCC,
- SUPPLY_VOLTAGE_HALF_CHANNEL, REFERENCE_AVcc_AVss) as TestMulti1,
+ TEMPERATURE_DIODE_CHANNEL, REFERENCE_AVcc_AVss) as TestMulti1,
new Msp430Adc12ClientC() as Wrapper4;
TestMulti1 -> MainC.Boot;
// Multi, RefVolt
components new TestAdcMultiC(CONFIG_VREF,
- SUPPLY_VOLTAGE_HALF_CHANNEL, REFERENCE_VREFplus_AVss) as TestMulti2,
+ TEMPERATURE_DIODE_CHANNEL, REFERENCE_VREFplus_AVss) as TestMulti2,
new Msp430Adc12ClientAutoRVGC() as Wrapper5;
TestMulti2 -> MainC.Boot;
{
#define BUFFER_SIZE 100
+#define NUM_REPETITIONS 5
const msp430adc12_channel_config_t config = {inch, sref, ref2_5v, adc12ssel, adc12div, sht, sampcon_ssel, sampcon_id};
adc12memctl_t memCtl = {inch2, sref2};
norace uint8_t state;
uint16_t buffer[BUFFER_SIZE];
+ norace uint8_t count = 0;
void task getData();
void task signalFailure()
event void Boot.booted()
{
- state = 0;
+ count = NUM_REPETITIONS;
post getData();
}
async event void MultiChannel.dataReady(uint16_t *buf, uint16_t numSamples)
{
- if (assertData(buf, numSamples) && state++ == 0)
- post signalSuccess();
- else
+ if (!assertData(buf, numSamples)){
post signalFailure();
- call Resource.release();
+ } else if (count){
+ count--;
+ call MultiChannel.getData();
+ } else {
+ post signalSuccess();
+ call Resource.release();
+ }
}
command error_t Notify.enable(){}
implementation
{
#define BUFFER_SIZE 100
+#define NUM_REPETITIONS 5
const msp430adc12_channel_config_t config = {inch, sref, ref2_5v, adc12ssel, adc12div, sht, sampcon_ssel, sampcon_id};
- uint8_t state;
- norace uint8_t numDone;
+ norace uint8_t state;
+ norace uint8_t count = 0;
uint16_t buffer[BUFFER_SIZE];
void task getData();
+ enum {
+ SINGLE_DATA,
+ SINGLE_DATA_REPEAT,
+ MULTIPLE_DATA,
+ MULTIPLE_DATA_REPEAT,
+ };
+
void task signalFailure()
{
event void Boot.booted()
{
- state = 0;
+ state = SINGLE_DATA;
post getData();
}
event void Resource.granted()
{
+ count = NUM_REPETITIONS;
switch(state)
{
- case 0: state++;
- if (call SingleChannel.configureSingleRepeat(&config, 0) == SUCCESS)
+ case SINGLE_DATA:
+ if (call SingleChannel.configureSingle(&config) == SUCCESS)
call SingleChannel.getData();
break;
- case 1: state++;
- if (call SingleChannel.configureSingle(&config) == SUCCESS)
+ case SINGLE_DATA_REPEAT:
+ if (call SingleChannel.configureSingleRepeat(&config, 10) == SUCCESS)
call SingleChannel.getData();
break;
- case 2: state++;
- if (call SingleChannel.configureMultiple(&config, buffer, BUFFER_SIZE, 0) == SUCCESS)
+ case MULTIPLE_DATA:
+ if (call SingleChannel.configureMultiple(&config, buffer, BUFFER_SIZE, 10) == SUCCESS)
call SingleChannel.getData();
break;
- case 3: state++;
- if (call SingleChannel.configureMultipleRepeat(&config, buffer, 16, 0) == SUCCESS)
+ case MULTIPLE_DATA_REPEAT:
+ if (call SingleChannel.configureMultipleRepeat(&config, buffer, 16, 10) == SUCCESS)
call SingleChannel.getData();
break;
default: call Resource.release();
- if (numDone == state)
- signal Notify.notify(TRUE);
+ signal Notify.notify(TRUE);
break;
}
}
async event error_t SingleChannel.singleDataReady(uint16_t data)
{
- numDone++;
assertData(&data, 1);
+ switch(state)
+ {
+ case SINGLE_DATA:
+ if (count){
+ count--;
+ call SingleChannel.getData();
+ return SUCCESS;
+ }
+ break;
+ case SINGLE_DATA_REPEAT:
+ if (count){
+ count--;
+ return SUCCESS;
+ }
+ break;
+ }
call Resource.release();
+ state++;
post getData();
return FAIL;
}
async event uint16_t* SingleChannel.multipleDataReady(uint16_t *buf, uint16_t length)
{
- numDone++;
assertData(buf, length);
+ switch(state)
+ {
+ case MULTIPLE_DATA:
+ if (count){
+ count--;
+ call SingleChannel.getData();
+ return 0;
+ }
+ break;
+ case MULTIPLE_DATA_REPEAT:
+ if (count){
+ count--;
+ return buf;
+ }
+ }
call Resource.release();
+ state++;
post getData();
return 0;
}
{
atomic {
if (call ADCArbiterInfo.userId() == id){
- if (state & MULTIPLE_DATA_REPEAT && !resultBufferStart)
+ if ((state & MULTIPLE_DATA_REPEAT) && !resultBufferStart)
return EINVAL;
if (state & ADC_BUSY)
return EBUSY;
case MULTI_CHANNEL:
{
uint16_t i = 0, k;
- resultBuffer = resultBufferStart;
+ 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: