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