+ async command error_t MultiChannel.configure[uint8_t id](
+ const msp430adc12_channel_config_t *config,
+ adc12memctl_t *memctl, uint8_t numMemctl, uint16_t *buf,
+ uint16_t numSamples, uint16_t jiffies)
+ {
+ 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;
+#endif
+ atomic {
+ if (state & ADC_BUSY)
+ return EBUSY;
+ if (call ADCArbiterInfo.userId() == id){
+ adc12ctl1_t ctl1 = {
+ adc12busy: 0,
+ conseq: (numSamples > numMemctl+1) ? 3 : 1,
+ adc12ssel: config->adc12ssel,
+ adc12div: config->adc12div,
+ issh: 0,
+ shp: 1,
+ shs: (jiffies == 0) ? 0 : 1,
+ cstartadd: 0
+ };
+ adc12memctl_t firstMemctl = {
+ inch: config->inch,
+ sref: config->sref,
+ eos: 0
+ };
+ uint16_t i, mask = 1;
+ adc12ctl0_t ctl0 = call HplAdc12.getCtl0();
+ ctl0.msc = (jiffies == 0) ? 1 : 0;
+ ctl0.sht0 = config->sht;
+ ctl0.sht1 = config->sht;
+
+ state = MULTI_CHANNEL;
+ resultBufferStart = NULL;
+ resultBufferLength = numSamples;
+ resultBufferStart = buf;
+ resultBufferIndex = 0;
+ numChannels = numMemctl+1;
+ call HplAdc12.setCtl0(ctl0);
+ call HplAdc12.setCtl1(ctl1);
+ call HplAdc12.setMCtl(0, firstMemctl);
+ for (i=0; i<(numMemctl-1) && i < 14; i++){
+ memctl[i].eos = 0;
+ call HplAdc12.setMCtl(i+1, memctl[i]);
+ }
+ memctl[i].eos = 1;
+ call HplAdc12.setMCtl(i+1, memctl[i]);
+ call HplAdc12.setIEFlags(mask << (i+1));
+
+ if (jiffies){
+ state |= USE_TIMERA;
+ prepareTimerA(jiffies, config->sampcon_ssel, config->sampcon_id);
+ }
+ result = SUCCESS;
+ }
+ }
+ return result;
+ }
+
+ async command error_t MultiChannel.getData[uint8_t id]()
+ {
+ uint8_t i;
+ atomic {
+ if (call ADCArbiterInfo.userId() == id){
+ if (!resultBufferStart)
+ return EINVAL;
+ if (state & ADC_BUSY)
+ return EBUSY;
+ state |= ADC_BUSY;
+ clientID = id;
+ for (i=0; i<numChannels; i++)
+ configureAdcPin((call HplAdc12.getMCtl(i)).inch);
+ call HplAdc12.startConversion();
+ if (state & USE_TIMERA)
+ startTimerA();
+ return SUCCESS;
+ }
+ }
+ return FAIL;
+ }
+