Radio Sender Example

Simple Insense program requesting sensor readings and sending results on broadcast radio and using the LEDs to indicate increases in temperature (red), humidity (green) and light (blue). The SenorReader component gets readings from the sensors, puts them into a struct and sends the struct to the PrintOutput and LedOutput components for printing and LED display respectively.

Apart from the three components defined here, the Insense Runtime also defines component channels for each of the following:

  • LEDs
  • visible light (photo) sensor
  • total solar radiation light (solar) sensor
  • temperature sensor
  • humidity sensor
  • button sensor
  • radioIn and radioOut
  • as well as a standard output channel
// Sensor reading type
type sensorReading is struct(
    byte[] addr ;
    integer cycle ;
    integer photo ;
    integer solar ;
    real temp ;
    real humid 
)
 
 
// Interface for Sender component
type ISender is interface (
    out bool photoRequestChan ; in integer photoValueChan ; 
	out bool solarRequestChan ; in integer solarValueChan ; 
	out bool tempRequestChan ; in real tempValueChan ; 
	out bool humidityRequestChan ; in real humidityValueChan ;
	out sensorReading printerChan ; out sensorReading ledsChan ;
	out any radioChan ; out bool blueLed
)
 
// Sender component
component Sender presents ISender {
 
	cycle = 0
	nodeAddr = getRadioNodeAddress()
 
	constructor() {
	}
 
	behaviour {
 
		// get photo sensor reading
		send true on photoRequestChan
		receive photoValue from photoValueChan 
 
		// get solar sensor reading
		send true on solarRequestChan
		receive solarValue from solarValueChan 
 
		// get temp reading
		send true on tempRequestChan
		receive tempValue from tempValueChan
 
		// get humidity reading 
		send true on humidityRequestChan
		receive humidityValue from humidityValueChan
 
		// put readings into struct
		reading = new sensorReading(nodeAddr, cycle, photoValue, solarValue, tempValue, humidityValue)
 
		// send reading struct to printer, leds, and over the radio
		send reading on printerChan
		send reading on ledsChan
		send any(reading) on radioChan
 
		// increment cycle counter
		cycle := cycle + 1
	}
} 
 
 
// Interface for Printer component sending readings 
// and explanatory text to standard output
type IPrinter is interface (
    in sensorReading input ;
    out any stdOutChan
)
 
// Standard output and radio printer component
component Printer presents IPrinter {
 
	constructor() {	
	}
 
	behaviour {
		// get reading struct
		receive reading from input
 
		// send text+readings in struct on stdout
		send any("\nCycle ") on stdOutChan
		send any(reading.cycle) on stdOutChan
		send any(":\tphoto = ") on stdOutChan
		send any(reading.photo) on stdOutChan
		send any("\tsolar = ") on stdOutChan
		send any(reading.solar) on stdOutChan
		send any("\ttemp = ") on stdOutChan
		send any(reading.temp) on stdOutChan
		send any("\thumid = ") on stdOutChan
		send any(reading.humid) on stdOutChan
	}
} 
 
 
 
 
 
// Interface for LED output component
type ledOutput is interface (
    in sensorReading input ; 
    out ledState setLeds ;
    out bool redLed ;
    out bool greenLed ;
    out bool blueLed
)
 
// LED output component
component LedOutput presents ledOutput {
 
	avgTemp = 0.0
	avgSolar = 0
	avgHumid = 0.0
 
	constructor() {	
	}
 
	behaviour {
		// turn off all LEDs using led setState channel
		send RedOffGreenOffBlueOff on setLeds
 
		// get sensor readings
		receive reading from input 
 
		// represent readings via LEDs, R/G/B for high Temp/Humidity/Light 
		send ((reading.solar - avgSolar) > 20) on blueLed
		send ((reading.humid - avgHumid ) > 2.0) on greenLed
		send ((reading.temp - avgTemp) > 0.2) on redLed
 
		// adjust averages
		if reading.temp > avgTemp  then { avgTemp := avgTemp + 0.1 }
		else { avgTemp := avgTemp - 0.1 }
		if reading.humid > avgHumid  then { avgHumid := avgHumid + 0.5 }
		else { avgHumid := avgHumid - 0.5 }		
		if reading.solar > avgSolar then { avgSolar := avgSolar + 1 }
		else { avgSolar := avgSolar - 1 }				
	}
} 
 
 
 
lo = new LedOutput()
pr = new Printer()
sr = new Sender()
 
connect sr.photoRequestChan to lightHumidTempSensor.photoRequest
connect sr.photoValueChan to lightHumidTempSensor.photoOutput
connect sr.solarRequestChan to lightHumidTempSensor.solarRequest
connect sr.solarValueChan to lightHumidTempSensor.solarOutput
connect sr.tempRequestChan to lightHumidTempSensor.tempRequest
connect sr.tempValueChan to lightHumidTempSensor.tempOutput
connect sr.humidityRequestChan to lightHumidTempSensor.humidRequest
connect sr.humidityValueChan to lightHumidTempSensor.humidOutput
connect sr.printerChan to pr.input
connect sr.ledsChan to lo.input
connect sr.radioChan to radioOut.broadcast
 
connect sr.blueLed to leds.blueState
 
connect lo.setLeds to leds.setState
connect lo.redLed to leds.redState
connect lo.greenLed to leds.greenState
connect lo.blueLed to leds.blueState
 
connect pr.stdOutChan to standardOut