X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tos%2Fchips%2Fmsp430%2Fadc12%2FAdcStreamP.nc;h=a7f623865782e034497c650cd07825ea98949ec8;hb=e9bfab607e051bae6afb47b44892ce37541d1b44;hp=864f6786cc1fcc9db9b68d79cd2c491f4dc2ee25;hpb=ba6f62eb5b69d2ab9b63b8ff12c0d230060f8daf;p=tinyos-2.x.git diff --git a/tos/chips/msp430/adc12/AdcStreamP.nc b/tos/chips/msp430/adc12/AdcStreamP.nc index 864f6786..a7f62386 100644 --- a/tos/chips/msp430/adc12/AdcStreamP.nc +++ b/tos/chips/msp430/adc12/AdcStreamP.nc @@ -43,7 +43,7 @@ */ #include "Timer.h" -module AdcStreamP { +module AdcStreamP @safe() { provides { interface Init @atleastonce(); interface ReadStream[uint8_t client]; @@ -71,7 +71,7 @@ implementation { }; struct list_entry_t *bufferQueue[NSTREAM]; struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM]; - uint16_t * ONE_NOK lastBuffer, lastCount; + uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount; norace uint16_t count; norace uint16_t * COUNT_NOK(count) buffer; @@ -93,7 +93,8 @@ implementation { call SingleChannel.getData[client](); } - command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { + error_t postBuffer(uint8_t c, uint16_t *buf, uint16_t n) + { if (n < sizeof(struct list_entry_t)) return ESIZE; atomic @@ -111,6 +112,10 @@ implementation { return SUCCESS; } + command error_t ReadStream.postBuffer[uint8_t c](uint16_t *buf, uint16_t n) { + return postBuffer(c, buf, n); + } + task void readStreamDone() { uint8_t c = client; uint32_t actualPeriod = period; @@ -187,6 +192,7 @@ implementation { bufferQueue[client] = entry->next; if (!bufferQueue[client]) bufferQueueEnd[client] = &bufferQueue[client]; + pos = buffer = NULL; count = entry->count; tmp_count = count; pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry); @@ -203,8 +209,12 @@ implementation { msp430adc12_channel_config_t config = *call AdcConfigure.getConfiguration[c](); config.sampcon_ssel = SAMPCON_SOURCE_SMCLK; // assumption: SMCLK runs at 1 MHz config.sampcon_id = SAMPCON_CLOCK_DIV_1; - call SingleChannel.configureMultiple[c]( &config, pos, count, period); - call SingleChannel.getData[c](); + if (call SingleChannel.configureMultiple[c]( &config, pos, count, period) == SUCCESS) + call SingleChannel.getData[c](); + else { + postBuffer(c, pos, count); + post readStreamFail(); + } } } @@ -242,7 +252,7 @@ implementation { else { *pos++ = data; - if (!--count) + if (pos == buffer + count) { atomic { @@ -255,8 +265,8 @@ implementation { } else { + lastCount = count; lastBuffer = buffer; - lastCount = pos - buffer; } } post bufferDone();