Radio Receiver Example

A simple Insense program to receive data from radio and print it out. The program expects to receive sensorReading structs from the radio. It prints out the values in the reading and sets the R/G/B LEDs to indicate high Temperature/Humiditiy/Light readings (compared to an average which it maintains).

// Sensor reading type
type sensorReading is struct(
    byte[] addr ;
    integer cycle ;
    integer photo ;
    integer solar ;
    real temp ;
    real humid
)
 
type IReceiver is interface (
    in RadioPacket radioChan ; out any stdoutChan ;
    out bool greenLed ; out sensorReading printerChan ;
    out sensorReading ledsChan
)
 
// Receiver component
component Receiver presents IReceiver {
 
	constructor() {
	}
 
	behaviour {
 
		// get something from the radio
		receive packet from radioChan
		//payload = packet.payload
		send any("\n") on stdoutChan
		send any(packet.addr[0]) on stdoutChan
		send any(".") on stdoutChan
		send any(packet.addr[1]) on stdoutChan
		// project out of any
		project packet.payload as value onto
			sensorReading : {
				send value on ledsChan
				send value on printerChan
			}
			default : {
				send any(" - sent garbage!") on stdoutChan
			}
	}
} 
 
// 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(": N") on stdOutChan
		send any(reading.addr[0]) on stdOutChan
		send any(".") on stdOutChan
		send any(reading.addr[1]) on stdOutChan
		send any(", It ") on stdOutChan
		send any(reading.cycle) on stdOutChan
		send any(", photo = ") on stdOutChan
		send any(reading.photo) on stdOutChan
		send any(", solar = ") on stdOutChan
		send any(reading.solar) on stdOutChan
		send any(", temp = ") on stdOutChan
		send any(reading.temp) on stdOutChan
		send any(", humid = ") on stdOutChan
		send any(reading.humid) on stdOutChan
	}
} 
 
// Interface for LED output component
type ILedOutput is interface ( in sensorReading input ; out ledState setLeds ;
				out bool redLed ; out bool greenLed ; out bool blueLed )
 
// LED output component
component LedOutput presents ILedOutput {
 
	avgTemp = 0.0
	avgSolar = 0
	avgHumid = 0.0
 
	constructor() {
	}
 
	behaviour {
		// turn of 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 }
	}
} 
 
rcvr = new Receiver()
pr = new Printer()
lo = new LedOutput()
 
connect rcvr.greenLed to leds.greenState
connect rcvr.stdoutChan to standardOut
connect rcvr.radioChan to radioIn.received
connect rcvr.ledsChan to lo.input
connect rcvr.printerChan to pr.input
 
connect pr.stdOutChan to standardOut
 
connect lo.setLeds to leds.setState
connect lo.redLed to leds.redState
connect lo.greenLed to leds.greenState
connect lo.blueLed to leds.blueState