*/
#include "Timer.h"
-module AdcStreamP {
+module AdcStreamP @safe() {
provides {
interface Init @atleastonce();
interface ReadStream<uint16_t>[uint8_t client];
/* Stream data */
struct list_entry_t {
uint16_t count;
- struct list_entry_t *next;
+ struct list_entry_t * ONE_NOK next;
};
struct list_entry_t *bufferQueue[NSTREAM];
- struct list_entry_t **bufferQueueEnd[NSTREAM];
- uint16_t *lastBuffer, lastCount;
+ struct list_entry_t * ONE_NOK * bufferQueueEnd[NSTREAM];
+ uint16_t * COUNT_NOK(lastCount) lastBuffer, lastCount;
- norace uint16_t *buffer, *pos, count;
+ norace uint16_t count;
+ norace uint16_t * COUNT_NOK(count) buffer;
+ norace uint16_t * BND_NOK(buffer, buffer+count) pos;
norace uint32_t now, period;
norace bool periodModified;
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
{
- struct list_entry_t *newEntry = (struct list_entry_t *)buf;
+ struct list_entry_t * ONE newEntry = TCAST(struct list_entry_t * ONE, buf);
if (!bufferQueueEnd[c]) // Can't post right now.
return FAIL;
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;
uint8_t c = client;
atomic entry = bufferQueue[c];
- for (; entry; entry = entry->next)
- signal ReadStream.bufferDone[c](FAIL, (uint16_t *)entry, entry->count);
+ for (; entry; entry = entry->next) {
+ uint16_t tmp_count __DEPUTY_UNUSED__ = entry->count;
+ signal ReadStream.bufferDone[c](FAIL, TCAST(uint16_t * COUNT_NOK(tmp_count),entry), entry->count);
+ }
atomic
{
}
else
{
+ uint16_t tmp_count;
bufferQueue[client] = entry->next;
if (!bufferQueue[client])
bufferQueueEnd[client] = &bufferQueue[client];
- pos = buffer = (uint16_t *)entry;
+ pos = buffer = NULL;
count = entry->count;
+ tmp_count = count;
+ pos = buffer = TCAST(uint16_t * COUNT_NOK(tmp_count), entry);
if (startNextAlarm)
nextAlarm();
return SUCCESS;
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();
+ }
}
}
else
{
*pos++ = data;
- if (!--count)
+ if (pos == buffer + count)
{
atomic
{
}
else
{
+ lastCount = count;
lastBuffer = buffer;
- lastCount = pos - buffer;
}
}
post bufferDone();