A simple Insense program which blinks the red green and blue LEDs at specified timer intervals.
/**
* This program flashes the red, free, and blue LEDs every 250ms, 500ms,
* and 1000ms respectively.
*
*/
//interface with three channels, one for each incoming timer tick
type blinkI is interface (in bool redChan ; in bool blueChan ; in bool greenChan)
component blink presents blinkI {
redState = true
blueState = true
greenState = true
constructor(){
setTimer(redChan , 0.25 , true)
setTimer(blueChan , 0.5 , true)
setTimer(greenChan , 1.0 , true)
}
behaviour {
select {
receive tick from redChan : {
setRedLedPower(redState)
redState := !redState
}
receive tick from blueChan : {
setBlueLedPower(blueState)
blueState := !blueState
}
receive tick from greenChan : {
setGreenLedPower(greenState)
greenState := !greenState
}
}
}
}
/**********************************************************/
blinker = new blink()
The corresponding nesC program for TinyOS is shown below.
configuration BlinkAppC
{
}
implementation
{
components MainC, BlinkC, LedsC;
components new TimerMilliC() as Timer0;
components new TimerMilliC() as Timer1;
components new TimerMilliC() as Timer2;
BlinkC -> MainC.Boot;
BlinkC.Timer0 -> Timer0;
BlinkC.Timer1 -> Timer1;
BlinkC.Timer2 -> Timer2;
BlinkC.Leds -> LedsC;
}
/*********************************************/
#include "Timer.h"
module BlinkC @safe()
{
uses interface Timer as Timer0;
uses interface Timer as Timer1;
uses interface Timer as Timer2;
uses interface Leds;
uses interface Boot;
}
implementation
{
event void Boot.booted()
{
call Timer0.startPeriodic( 250 );
call Timer1.startPeriodic( 500 );
call Timer2.startPeriodic( 1000 );
}
event void Timer0.fired()
{
dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string());
call Leds.led0Toggle();
}
event void Timer1.fired()
{
dbg("BlinkC", "Timer 1 fired @ %s \n", sim_time_string());
call Leds.led1Toggle();
}
event void Timer2.fired()
{
dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string());
call Leds.led2Toggle();
}
}