includes OscopeMsg;
/**
* This module implements the OscilloscopeM component, which
* periodically takes sensor readings and sends a group of readings
* over the UART. BUFFER_SIZE defines the number of readings sent
* in a single packet. The Yellow LED is toggled whenever a new
* packet is sent, and the red LED is turned on when the sensor
* reading is above some constant value.
*/
module OscilloscopeM
{
provides interface StdControl;
uses {
interface Timer;
interface Leds;
interface StdControl as SensorControl;
interface ADC;
interface StdControl as CommControl;
interface SendMsg as DataMsg;
interface ReceiveMsg as ResetCounterMsg;
}
}
implementation
{
uint8_t packetReadingNumber;
uint16_t readingNumber;
TOS_Msg msg[2];
uint8_t currentMsg;
/**
* Used to initialize this component.
*/
command result_t StdControl.init() {
call Leds.init();
call Leds.yellowOff(); call Leds.redOff(); call Leds.greenOff();
//turn on the sensors so that they can be read.
call SensorControl.init();
call CommControl.init();
atomic {
currentMsg = 0;
packetReadingNumber = 0;
readingNumber = 0;
}
dbg(DBG_BOOT, "OSCOPE initialized\n");
return SUCCESS;
}
/**
* Starts the SensorControl and CommControl components.
* @return Always returns SUCCESS.
*/
command result_t StdControl.start() {
call SensorControl.start();
call Timer.start(TIMER_REPEAT, 125);
call CommControl.start();
return SUCCESS;
}
/**
* Stops the SensorControl and CommControl components.
* @return Always returns SUCCESS.
*/
command result_t StdControl.stop() {
call SensorControl.stop();
call Timer.stop();
call CommControl.stop();
return SUCCESS;
}
task void dataTask() {
struct OscopeMsg *pack;
atomic {
pack = (struct OscopeMsg *)msg[currentMsg].data;
packetReadingNumber = 0;
pack->lastSampleNumber = readingNumber;
}
pack->channel = 1;
pack->sourceMoteID = TOS_LOCAL_ADDRESS;
/* Try to send the packet. Note that this will return
* failure immediately if the packet could not be queued for
* transmission.
*/
if (call DataMsg.send(TOS_BCAST_ADDR, sizeof(struct OscopeMsg),
&msg[currentMsg]))
{
atomic {
currentMsg ^= 0x1;
}
call Leds.yellowToggle();
}
}
/**
* Signalled when data is ready from the ADC. Stuffs the sensor
* reading into the current packet, and sends off the packet when
* BUFFER_SIZE readings have been taken.
* @return Always returns SUCCESS.
*/
async event result_t ADC.dataReady(uint16_t data) {
struct OscopeMsg *pack;
atomic {
pack = (struct OscopeMsg *)msg[currentMsg].data;
pack->data[packetReadingNumber++] = data;
readingNumber++;
dbg(DBG_USR1, "data_event\n");
if (packetReadingNumber == BUFFER_SIZE) {
post dataTask();
}
}
if (data > 0x0300)
call Leds.redOn();
else
call Leds.redOff();
return SUCCESS;
}
/**
* Signalled when the previous packet has been sent.
* @return Always returns SUCCESS.
*/
event result_t DataMsg.sendDone(TOS_MsgPtr sent, result_t success) {
return SUCCESS;
}
/**
* Signalled when the clock ticks.
* @return The result of calling ADC.getData().
*/
event result_t Timer.fired() {
return call ADC.getData();
}
/**
* Signalled when the reset message counter AM is received.
* @return The free TOS_MsgPtr.
*/
event TOS_MsgPtr ResetCounterMsg.receive(TOS_MsgPtr m) {
atomic {
readingNumber = 0;
}
return m;
}
}
No comments:
Post a Comment