/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package project.latex.balloon.sensor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
/**
*
* @author will
*
* Class for interfacing with DHT11 temperature sensor. The class calls a Python script
* to get the temperature value from the sensor, as driver software for the sensor is
* written in Python.
*
*/
public class TemperatureSensorController implements SensorController {
private static final Logger logger = Logger.getLogger(TemperatureSensorController.class);
private final String temperatureKey;
private final int pin;
// Name used by Python script for the DHT11 sensor.
private final String sensorType = "11";
public TemperatureSensorController(String temperatureKey, int pin) {
this.temperatureKey = temperatureKey;
this.pin = pin;
}
@Override
public Map<String, Object> getCurrentData() throws SensorReadFailedException {
logger.info(String.format("Getting %s sensor reading", temperatureKey));
Process temperatureSensorScript;
InputStream inputStream = null;
try
{
// Run the encode script.
temperatureSensorScript = Runtime.getRuntime().exec(
String.format("python scripts/temperatureSensor.py %s %d", sensorType, pin));
// Wait for script to terminate.
temperatureSensorScript.waitFor();
// Get the output from the script.
inputStream = temperatureSensorScript.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String output = bufferedReader.readLine();
logger.info(String.format("%s sensor read output: %s", temperatureKey, output));
try {
// Temperature in Celcius.
double temperatureReading = Double.parseDouble(output);
Map<String, Object> temperature = new HashMap();
temperature.put(temperatureKey, temperatureReading);
return temperature;
} catch (NumberFormatException e) {
throw new SensorReadFailedException(String.format("%s", output));
}
}
catch (IOException | InterruptedException e)
{
throw new SensorReadFailedException("Could not run temperatureSensor.py");
} finally {
try {
inputStream.close();
} catch (Exception e) {}
}
}
}