95 lines
3.0 KiB
C
95 lines
3.0 KiB
C
#include "contiki.h"
|
|
#include <stdio.h> /* For printf() */
|
|
|
|
#include "dev/sht11-sensor.h"
|
|
#include "dev/light-sensor.h"
|
|
|
|
#define MAX_VALUES 4 // Number of values used in averaging process
|
|
|
|
static process_event_t event_data_ready; // Application specific event value
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* We declare the two processes */
|
|
PROCESS(temp_process, "Temperature process");
|
|
PROCESS(print_process, "Print process");
|
|
|
|
/* We require the processes to be started automatically */
|
|
AUTOSTART_PROCESSES(&temp_process, &print_process);
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Implementation of the first process */
|
|
PROCESS_THREAD(temp_process, ev, data)
|
|
{
|
|
/* Variables are declared static to ensure their values are kept */
|
|
/* between kernel calls. */
|
|
static struct etimer timer;
|
|
static int count = 0;
|
|
|
|
// Any process must start with this.
|
|
PROCESS_BEGIN();
|
|
|
|
// Allocate the required event
|
|
event_data_ready = process_alloc_event();
|
|
|
|
// Initialise the temperature sensor
|
|
SENSORS_ACTIVATE(light_sensor); // need this for sky-mote emulation
|
|
SENSORS_ACTIVATE(sht11_sensor);
|
|
|
|
// Initialise variables
|
|
count = 0;
|
|
|
|
// Set the etimer module to generate a periodic event
|
|
etimer_set(&timer, CLOCK_CONF_SECOND);
|
|
|
|
static int myData;
|
|
while (1)
|
|
{
|
|
// Wait here for the timer to expire
|
|
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
|
|
|
|
// this is temperature process
|
|
count++;
|
|
//int tempVal = sht11_sensor.value(SHT11_SENSOR_TEMP_SKYSIM); // For Cooja Sim
|
|
int tempVal = sht11_sensor.value(SHT11_SENSOR_TEMP); // For XM1000 mote
|
|
printf("[temperature process] temp=%d\n", tempVal);
|
|
|
|
// Check if enough samples are collected
|
|
if (count==MAX_VALUES)
|
|
{
|
|
// Transfer the last read raw temperature reading for passing
|
|
myData = tempVal;
|
|
|
|
// Reset variables
|
|
count = 0;
|
|
|
|
// Post an event to the print process
|
|
// and pass a pointer to the last measure as data
|
|
printf("[temperature process] passing value %d\n", myData);
|
|
process_post(&print_process, event_data_ready, &myData);
|
|
}
|
|
|
|
// Reset the timer so it will generate another event
|
|
etimer_reset(&timer);
|
|
}
|
|
|
|
// Any process must end with this, even if it is never reached.
|
|
PROCESS_END();
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Implementation of the second process */
|
|
PROCESS_THREAD(print_process, ev, data)
|
|
{
|
|
PROCESS_BEGIN();
|
|
|
|
while (1)
|
|
{
|
|
// Wait until we get a data_ready event
|
|
PROCESS_WAIT_EVENT_UNTIL(ev == event_data_ready);
|
|
|
|
// Use 'data' variable to retrieve data and then display it
|
|
int myData = *(int *)data; // cast to an integer pointer
|
|
printf("[print process] data ready, received value = %d\n", myData);
|
|
}
|
|
PROCESS_END();
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|