Changes to RoverSensor API

Signed-off-by: Mustafa Ozcelikors <mozcelikors@gmail.com>
diff --git a/rover/include/roverapi/rover_sensor.hpp b/rover/include/roverapi/rover_sensor.hpp
new file mode 100644
index 0000000..85173c7
--- /dev/null
+++ b/rover/include/roverapi/rover_sensor.hpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2017 FH Dortmund and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *    Rover Sensor API - Interfaces for Rover sensors application development
+ *    Header file
+ *
+ * Contributors:
+ *    M.Ozcelikors <mozcelikors@gmail.com>, modified C++ API 04.12.2017
+ *    										created C++ API 17.11.2017
+ *    										initial QMC5883L driver implemented 30.11.2017
+ *    David Schmelter, Fraunhofer IEM - compass sensor initial implementation
+ *    Gael Blondelle, Eclipse Foundation - initial API and parameters
+ *
+ */
+
+#ifndef API_ROVER_SENSORS_HPP_
+#define API_ROVER_SENSORS_HPP_
+
+#include <stdint.h>
+#include <stdio.h>
+#include <unistd.h>
+
+
+//To debug the application, uncomment the following
+//#define DEBUG 1
+
+
+namespace rover
+{
+	/**
+	 * @brief RoverSensorID_t defines the sensor location ID of the proximity sensors on the rover
+	 */
+	enum RoverSensorID_t {	ROVER_REAR_RIGHT = 0,
+							ROVER_REAR_LEFT = 1,
+							ROVER_FRONT_RIGHT = 2,
+							ROVER_FRONT_LEFT = 3,
+							ROVER_FRONT = 4,
+							ROVER_REAR = 5};
+
+	/**
+	 * @brief RoverSensor class is an abstract class to define interface between common sensors used in the rover.
+	 */
+	class RoverSensor
+	{
+		public:
+			/**
+			 * @brief Virtual function (interface) for setting up sensors
+			 * @return void
+			 */
+			virtual void initialize (void) = 0;
+
+			/**
+			 * @brief Virtual function (interface) for reading from sensors
+			 * @return sensor_val Sensor value read from sensor
+			 */
+			virtual float read (void) = 0;
+
+			/**
+			 * @brief Destructor for the RoverSensor class
+			 */
+			virtual ~RoverSensor() {};
+
+	};
+}
+
+
+
+#endif /* API_ROVER_SENSORS_HPP_ */
diff --git a/rover/include/roverapi/rover_sensors.hpp b/rover/include/roverapi/rover_sensors.hpp
deleted file mode 100644
index 4eddcee..0000000
--- a/rover/include/roverapi/rover_sensors.hpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2017 FH Dortmund and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Description:
- *    Rover Sensors API - Interfaces for Rover sensors application development
- *    Header file
- *
- * Contributors:
- *    M.Ozcelikors <mozcelikors@gmail.com>, created C++ API 17.11.2017
- *    										initial QMC5883L driver implemented 30.11.2017
- *    David Schmelter, Fraunhofer IEM - compass sensor initial implementation
- *    Gael Blondelle, Eclipse Foundation - initial API and parameters
- *
- */
-
-#ifndef API_ROVER_SENSORS_HPP_
-#define API_ROVER_SENSORS_HPP_
-
-#include <stdint.h>
-#include <stdio.h>
-#include <unistd.h>
-
-
-//To debug the application, uncomment the following
-//#define DEBUG 1
-
-
-namespace rover
-{
-	/**
-	 * @brief RoverSensors class contains member functions to setup and read from embedded sensors from rover's RoverSenseLayer sensor layer.
-	 */
-	class RoverSensors
-	{
-		private:
-			/* Pins of ultrasonic sensors */
-			/**
-			 * @brief Groove Sensor Pin for Front Sensor Socket (in wiringPi format)
-			 */
-			static const int SIG0 = 0; //BCM-17   ->  WiringPi 0   //Same as ECHO0 pin, if some one wants to replace front sr04 with groove sensor
-
-			/**
-			 *  @brief Groove Sensor Pin for Rear Sensor Socket (in wiringPi format)
-			 */
-			static const int SIG1 = 2; //BCM-27   ->  WiringPi 2   //Same as ECHO1 pin, if some one wants to replace back sr04 with groove sensor
-
-			/**
-			 *  @brief HC-SR04 Sensor Trigger Pin for Front Sensor Socket (in wiringPi format)
-			 */
-			static const int TRIG0 = 7; //BCM-4   ->  WiringPi 7
-			/**
-			 *  @brief HC-SR04 Sensor Echo Pin for Front Sensor Socket (in wiringPi format)
-			 */
-			static const int ECHO0 = 0; //BCM-17   ->  WiringPi 0
-
-			/**
-			 *  @brief HC-SR04 Sensor Trigger Pin for Rear Sensor Socket (in wiringPi format)
-			 */
-			static const int TRIG1 = 1; //BCM-18   ->  WiringPi 1
-			/**
-			 *  @brief HC-SR04 Sensor Echo Pin for Rear Sensor Socket (in wiringPi format)
-			 */
-			static const int ECHO1 = 2; //BCM-27   ->  WiringPi 2
-
-			/* Definitions related to DHT22 sensor */
-			/**
-			 *  @brief DHT22 sensor pin in wiringPi format
-			 */
-			static const int DHT22_RPI_PIN = 24;  //BCM19  -> wiringPi 24
-			static const int MAX_TIMINGS = 85;
-
-			/* Definitions related to compass sensor */
-			/**
-			 *  @brief Address for compass sensor
-			 */
-			int HMC588L_ADDRESS = 0x1E; //0x1E;
-			/**
-			 *  @brief Calibration duration for compass sensor
-			 */
-			int CALIBRATION_DURATION = 10000; //compass calibration has a duration of 5 seconds
-			/**
-			 *  @brief Declination angle / correction factor for compass sensor
-			 */
-			float DECLINATION_ANGLE = 0.0413; //correction factor for location Paderborn
-
-			/**
-			 * @brief Calibration variable for HMC588L
-			 */
-			unsigned int calibration_start;
-
-		public:
-
-			/* Rover Sensor IDs */
-			/**
-			 * @brief Static definition to indicate rover's front ultrasonic sensor socket
-			 */
-			static const int ROVER_FRONT = 0;
-
-			/**
-			 * @brief Static definition to indicate rover's rear ultrasonic sensor socket
-			 */
-			static const int ROVER_REAR = 1;
-
-			/* Rover Infrared Sensor IDs */
-			/**
-			 * @brief Static definition to indicate rover's rear-right infrared sensor
-			 */
-			static const int ROVER_REAR_RIGHT = 0;
-
-			/**
-			 * @brief Static definition to indicate rover's rear-left infrared sensor
-			 */
-			static const int ROVER_REAR_LEFT = 1;
-
-			/**
-			 * @brief Static definition to indicate rover's front-right infrared sensor
-			 */
-			static const int ROVER_FRONT_RIGHT = 2;
-
-			/**
-			 * @brief Static definition to indicate rover's front-left infrared sensor
-			 */
-			static const int ROVER_FRONT_LEFT = 3;
-
-			/**
-			 * @brief Initializes the sensors
-			 * @return void
-			 */
-			void initialize();
-
-			/***
-			 * @brief Constructor for the RoverSensors class.
-			 */
-			explicit RoverSensors();
-
-			/**
-			 * @brief Sets up the HC-SR04 ultrasonic sensor
-			 * @return void
-			 */
-			void setupHCSR04UltrasonicSensor(int sensor_id);
-
-			/**
-			 * @brief Reads from HC-SR04 ultrasonic sensor in centimeters. sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor.
-			 * @param sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor.
-			 * @return sensor_val in centimeters
-			 */
-			int readHCSR04UltrasonicSensor (int sensor_id);
-
-			/**
-			 * @brief Sets up the groove ultrasonic sensor
-			 * @return void
-			 */
-			void setupGrooveUltrasonicSensor (void);
-
-			/**
-			 * @brief Reads from groove ultrasonic sensor in centimeters. sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor.
-			 * @param sensor_id RoverSensors::ROVER_FRONT: Front ultrasonic sensor, RoverSensors::ROVER_REAR: Rear ultrasonic sensor.
-			 * @return sensor_val in centimeters
-			 */
-			int readGrooveUltrasonicSensor (int sensor_id);
-
-			/**
-			 * @brief Sets up the infrared sensors and Analog to digital converter
-			 * @return void
-			 */
-			void setupInfraredSensors (void);
-
-			/**
-			 * @brief Reads from infrared sensor in centimeters (float).
-			 * @param infrared_sensor_id Indicates the channel of which on-board sensor is addressed. RoverSensors::ROVER_REAR_RIGHT: Rear-right, RoverSensors::ROVER_REAR_LEFT: Rear-left, RoverSensors::ROVER_FRONT_RIGHT: Front-right, RoverSensors::ROVER_FRONT_LEFT: Front-left.
-			 * @return sensor_val in centimeters (float).
-			 */
-			float readInfraredSensor (int infrared_sensor_id);
-
-			/**
-			 * @brief Sets up the bearing sensor Sunfounder HMC5883L and its I2C interface
-			 * @return void
-			 */
-			void setupBearingHMC5883L (void);
-
-			/**
-			 * @brief Starts calibration for the bearing sensor
-			 * @return void
-			 */
-			void calibrateBearingSensor (void);
-
-			/**
-			 * @brief Sets the HMC588L Address
-			 * @return void
-			 */
-			void setHMC588LAddress (int address);
-
-			/**
-			 * @brief Sets the HMC588L Caliration Duration
-			 * @return void
-			 */
-			void setHMC588LCalibrationPeriod(int period);
-
-			/**
-			 * @brief Sets the HMC588L Declination angle
-			 * @return void
-			 */
-			void setHMC588LDeclinationAngle (float angle);
-
-			/**
-			 * @brief Reads the bearing value from Bearing sensor Sunfounder HMC5883L (float).
-			 * @return bearing_val in degrees (float).
-			 */
-			float readBearingHMC5883L (void);
-
-			/**
-			 * @brief Reads the temperature value in Celcius degrees from DHT22 temperature and humidity sensor (float).
-			 * @return temperature_val in Celcius degrees (float).
-			 */
-			float readTemperature (void);
-
-			/**
-			 * @brief Reads the humidity value in percentage from DHT22 temperature and humidity sensor (float).
-			 * @return humidity_val in percentage (float).
-			 */
-			float readHumidity (void);
-
-			/**
-			 * @brief Sets up the bearing sensor with QMC5883L chip and its I2C interface
-			 * @return void
-			 */
-			void setupBearingQMC5883L (void);
-
-			/**
-			 * @brief Reads the bearing value from Bearing sensor with QMC5883L chip (float).
-			 * @return bearing_val in degrees (float).
-			 */
-			float readBearingQMC5883L (void);
-	};
-}
-
-
-
-#endif /* API_ROVER_SENSORS_HPP_ */
diff --git a/rover/src/roverapi/rover_sensors.cpp b/rover/src/roverapi/rover_sensors.cpp
deleted file mode 100644
index 0e96497..0000000
--- a/rover/src/roverapi/rover_sensors.cpp
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright (c) 2017 FH Dortmund and others
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Description:
- *    Rover Sensors API - Interfaces for Rover sensors application development
- *
- * Contributors:
- *    M.Ozcelikors <mozcelikors@gmail.com>, created C++ API 17.11.2017
- *    										initial QMC5883L driver implemented 30.11.2017
- *    David Schmelter, Fraunhofer IEM - compass sensor initial implementation
- *    Gael Blondelle - initial API and parameters
- *
- */
-
-#include <roverapi/basic_psys_rover.h>
-#include <roverapi/rover_sensors.hpp>
-#include <mcp3004.h>
-#include <wiringPiI2C.h>
-#include <math.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <unistd.h>
-
-static int i2c_hmc588l_fd = -1;
-
-static int16_t xMinRaw = 0;
-static int16_t xMaxRaw = 0;
-static int16_t yMaxRaw = 0;
-static int16_t yMinRaw = 0;
-
-rover::RoverSensors::RoverSensors()
-{
-	this->calibration_start = 0;
-}
-
-void rover::RoverSensors::initialize (void)
-{
-	//wiringPiSetup();
-
-	this->setupHCSR04UltrasonicSensor(this->ROVER_FRONT);
-	this->setupHCSR04UltrasonicSensor(this->ROVER_REAR);
-	this->setupInfraredSensors();
-	this->setupBearingHMC5883L();
-	this->setupBearingQMC5883L();
-}
-
-void rover::RoverSensors::setupHCSR04UltrasonicSensor (int sensor_id)
-{
-	int trig_pin, echo_pin;
-
-	if (sensor_id == this->ROVER_FRONT)
-	{
-		trig_pin = this->TRIG1;
-		echo_pin = this->ECHO1;
-	}
-	else if (sensor_id == this->ROVER_REAR)
-	{
-		trig_pin = this->TRIG0;
-		echo_pin = this->ECHO0;
-	}
-	else
-	{
-		printf ("Invalid Sensor ID for the Ultrasonic Sensor to function setupHCSR04UltrasonicSensor.\n");
-	}
-
-    pinMode(trig_pin, OUTPUT);
-    pinMode(echo_pin, INPUT);
-
-    //TRIG pin must start LOW
-    digitalWrite(trig_pin, LOW);
-    delayMicroseconds(2);
-}
-
-int rover::RoverSensors::readHCSR04UltrasonicSensor (int sensor_id)
-{
-	int trig_pin, echo_pin;
-
-	if (sensor_id == this->ROVER_FRONT)
-	{
-		trig_pin = this->TRIG1;
-		echo_pin = this->ECHO1;
-	}
-	else if (sensor_id == this->ROVER_REAR)
-	{
-		trig_pin = this->TRIG0;
-		echo_pin = this->ECHO0;
-	}
-	else
-	{
-		printf ("Invalid Sensor ID for the Ultrasonic Sensor to function readHCSR04UltrasonicSensor.\n");
-	}
-
-	int distance = 0;
-    //Send trig pulse
-    digitalWrite(trig_pin, HIGH);
-    delayMicroseconds(10);
-    digitalWrite(trig_pin, LOW);
-
-    //Wait for echo start
-    long startTime = micros();
-    while(digitalRead(echo_pin) == LOW && micros() < startTime + 100000);
-
-    //Wait for echo end
-    startTime = micros();
-    while(digitalRead(echo_pin) == HIGH);
-    long travelTime = micros() - startTime;
-
-    //Get distance in cm
-    distance = travelTime * 34300;
-	distance = distance / 1000000;
-	distance = distance / 2;
-	// The below protection is to ensure there is no value fluctuation due to timeout
-	if (distance > 40 )
-		distance = 40;
-
-	//	printf("dist=%d\n",distance);
-    return distance;
-}
-
-void rover::RoverSensors::setupGrooveUltrasonicSensor(void) {
-	//wiringPiSetup();   //Since this can only be used once in a program, we do it in main and comment this.
-}
-
-int rover::RoverSensors::readGrooveUltrasonicSensor (int sensor_id)
-{
-	int sig_pin;
-
-	if (sensor_id == this->ROVER_FRONT)
-	{
-		sig_pin = this->SIG1;
-	}
-	else if (sensor_id == this->ROVER_REAR)
-	{
-		sig_pin = this->SIG0;
-	}
-	else
-	{
-		printf ("Invalid Sensor ID for the Ultrasonic Sensor to function readGrooveUltrasonicSensor.\n");
-	}
-
-	long startTime, stopTime, elapsedTime, distance = 0;
-	pinMode(sig_pin, OUTPUT);
-	digitalWrite(sig_pin, LOW);
-	delayMicroseconds(2);
-	digitalWrite(sig_pin, HIGH);
-	delayMicroseconds(5);
-	digitalWrite(sig_pin, LOW);
-	pinMode(sig_pin,INPUT);
-
-	startTime = micros();
-	while (digitalRead(sig_pin) == LOW  );
-	startTime = micros();
-	// For values above 40cm, groove sensor is unable to receive signals which causes it to stuck
-	// This is resolved by adding the timeout below.
-	// However, this timeout cause values bigger than 40 to fluctuate
-	while (digitalRead(sig_pin) == HIGH && micros() < startTime + 100000);
-	stopTime = micros();
-	elapsedTime = stopTime - startTime;
-	distance = elapsedTime / 29 /2;
-	// The below protection is to ensure there is no value fluctuation
-	if (distance > 40 )
-		distance = 40;
-	return distance;
-}
-
-void rover::RoverSensors::setupInfraredSensors (void)
-{
-	/* Init the analog digital converter */
-	mcp3004Setup (BASE, SPI_CHAN); // 3004 and 3008 are the same 4/8 channels
-}
-
-float rover::RoverSensors::readInfraredSensor (int infrared_sensor_id)
-{
-	float x;
-	float y = analogRead (BASE+infrared_sensor_id);
-
-	if (infrared_sensor_id != this->ROVER_FRONT_LEFT &&
-			infrared_sensor_id != this->ROVER_FRONT_RIGHT &&
-			infrared_sensor_id != this->ROVER_REAR_LEFT &&
-			infrared_sensor_id != this->ROVER_REAR_RIGHT)
-	{
-		printf ("Invalid Sensor ID for the Infrared Sensor to function readInfraredSensor.\n");
-	}
-
-	// 1/cm to output voltage is almost linear between
-	// 80cm->0,4V->123
-	// 6cm->3,1V->961
-	// => y=5477*x+55 => x= (y-55)/5477
-	if (y<123){
-		x=100.00;
-	} else {
-		float inverse = (y-55)/5477;
-		//printf("inverse=%f\n",inverse);
-	// x is the distance in cm
-		x = 1/inverse;
-	}
-
-	return x;
-}
-
-void rover::RoverSensors::calibrateBearingSensor (void)
-{
-	this->calibration_start = millis();
-}
-
-void rover::RoverSensors::setupBearingQMC5883L(void)
-{
-	this->setHMC588LAddress(0x0D);
-	this->setHMC588LCalibrationPeriod(10000);
-	this->setHMC588LDeclinationAngle(0.0413);
-
-	if ((i2c_hmc588l_fd = wiringPiI2CSetup(this->HMC588L_ADDRESS)) < 0)
-	{
-		printf("Failed to initialize HMC588L compass sensor");
-	}
-
-	if (i2c_hmc588l_fd >= 0)
-	{
-		wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x0B, 0x01); //init SET/PERIOD register
-
-		/*
-		Define
-		OSR = 512
-		Full Scale Range = 8G(Gauss)
-		ODR = 200HZ
-		set continuous measurement mode
-		*/
-		wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x09, 0x1D);
-	}
-
-	this->calibration_start = millis();
-
-	//
-	// To do a software reset
-	// wiringPiI2CWriteReg8 (i2c_hmc588l_fd, 0x0A, 0x80);
-	//
-
-}
-
-float rover::RoverSensors::readBearingQMC5883L(void)
-{
-	int8_t buffer[6];
-
-	//wiringPiI2CWrite (i2c_hmc588l_fd, 0x00); //Start with register 3
-	//delay(25);
-
-	buffer[0] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x00); //LSB x
-	buffer[1] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x01); //MSB x
-	buffer[2] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x02); //LSB y
-	buffer[3] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x03); //MSB y
-	buffer[4] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x04); //LSB z
-	buffer[5] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x05); //MSB z
-
-	int16_t xRaw = (((int16_t) buffer[1] << 8) & 0xff00) | buffer[0];
-	int16_t yRaw = (((int16_t) buffer[3] << 8) & 0xff00) | buffer[2];
-#ifdef DEBUG
-	printf ("%d %d\n",xRaw,yRaw);
-#endif
-
-	//if calibration is active calculate minimum and maximum x/y values for calibration
-	if (millis() <= this->calibration_start + this->CALIBRATION_DURATION) {
-		if (xRaw < xMinRaw) {
-			xMinRaw = xRaw;
-		}
-		if (xRaw > xMaxRaw) {
-			xMaxRaw = xRaw;
-		}
-		if (yRaw < yMinRaw) {
-			yMinRaw = yRaw;
-		}
-		if (yRaw > yMaxRaw) {
-			yMaxRaw = yRaw;
-		}
-	}
-
-	//calibration: move and scale x coordinates based on minimum and maximum values to get a unit circle
-	float xf = xRaw - (float) (xMinRaw + xMaxRaw) / 2.0f;
-	xf = xf / (xMinRaw + xMaxRaw) * 2.0f;
-
-	//calibration: move and scale y coordinates based on minimum and maximum values to get a unit circle
-	float yf = yRaw - (float) (yMinRaw + yMaxRaw) / 2.0f;
-	yf = yf / (yMinRaw + yMaxRaw) * 2.0f;
-
-	float bearing = atan2(yf, xf);
-#ifdef DEBUG
-	printf("%f, bearing\n", bearing);
-#endif
-
-	//location specific magnetic field correction
-	bearing += this->DECLINATION_ANGLE;
-
-	if (bearing < 0) {
-		bearing += 2 * M_PI;
-	}
-
-	if (bearing > 2 * M_PI) {
-		bearing -= 2 * M_PI;
-	}
-
-	float headingDegrees = bearing * (180.0 / M_PI);
-#ifdef DEBUG
-	printf("%lf, headingDegrees\n", headingDegrees);
-#endif
-	return headingDegrees;
-
-
-}
-
-void rover::RoverSensors::setupBearingHMC5883L(void)
-{
-	this->setHMC588LAddress(0x1E);
-	this->setHMC588LCalibrationPeriod(10000);
-	this->setHMC588LDeclinationAngle(0.0413);
-
-#ifdef DEBUG
-	printf ("HMC588L Address is: %x\n", this->HMC588L_ADDRESS);
-	printf ("HMC588L Calibration period is %d\n", this->CALIBRATION_DURATION);
-	printf ("HMC588L Declination angle is %f\n", this->DECLINATION_ANGLE);
-#endif
-
-	if ((i2c_hmc588l_fd = wiringPiI2CSetup(this->HMC588L_ADDRESS)) < 0) {
-		printf("Failed to initialize HMC588L compass sensor");
-	}
-
-	if (i2c_hmc588l_fd >= 0) {
-		int8_t gain = 5;
-
-		wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x00, 0x70); // 8-average, 15 Hz default, positive self test measurement
-		wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x01, gain << 5); // Gain
-		wiringPiI2CWriteReg8(i2c_hmc588l_fd, 0x02, 0x00); // Continuous-measurement mode
-	}
-
-	this->calibration_start = millis();
-}
-
-float rover::RoverSensors::readBearingHMC5883L(void)
-{
-	int8_t buffer[6];
-
-	//potential optimization: wiringPiI2CReadReg16
-	buffer[0] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x03); //MSB x
-	buffer[1] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x04); //LSB x
-	buffer[2] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x05); //MSB z
-	buffer[3] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x06); //LSB z
-	buffer[4] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x07); //MSB y
-	buffer[5] = wiringPiI2CReadReg8(i2c_hmc588l_fd, 0x08); //LSB y
-
-	int16_t xRaw = (((int16_t) buffer[0] << 8) & 0xff00) | buffer[1];
-	//int16_t zRaw = (((int16_t) buffer[2] << 8) & 0xff00) | buffer[3];
-	int16_t yRaw = (((int16_t) buffer[4] << 8) & 0xff00) | buffer[5];
-
-	//if calibration is active calculate minimum and maximum x/y values for calibration
-	if (millis() <= this->calibration_start + this->CALIBRATION_DURATION) {
-		if (xRaw < xMinRaw) {
-			xMinRaw = xRaw;
-		}
-		if (xRaw > xMaxRaw) {
-			xMaxRaw = xRaw;
-		}
-		if (yRaw < yMinRaw) {
-			yMinRaw = yRaw;
-		}
-		if (yRaw > yMaxRaw) {
-			yMaxRaw = yRaw;
-		}
-	}
-
-	//calibration: move and scale x coordinates based on minimum and maximum values to get a unit circle
-	float xf = xRaw - (float) (xMinRaw + xMaxRaw) / 2.0f;
-	xf = xf / (xMinRaw + xMaxRaw) * 2.0f;
-
-	//calibration: move and scale y coordinates based on minimum and maximum values to get a unit circle
-	float yf = yRaw - (float) (yMinRaw + yMaxRaw) / 2.0f;
-	yf = yf / (yMinRaw + yMaxRaw) * 2.0f;
-
-	float bearing = atan2(yf, xf);
-#ifdef DEBUG
-	printf("%f, bearing\n", bearing);
-#endif
-
-	//location specific magnetic field correction
-	bearing += this->DECLINATION_ANGLE;
-
-	if (bearing < 0) {
-		bearing += 2 * M_PI;
-	}
-
-	if (bearing > 2 * M_PI) {
-		bearing -= 2 * M_PI;
-	}
-
-	float headingDegrees = bearing * (180.0 / M_PI);
-#ifdef DEBUG
-	printf("%lf, headingDegrees\n", headingDegrees);
-#endif
-	return headingDegrees;
-}
-
-float rover::RoverSensors::readTemperature (void)
-{
-	int data[5] = { 0, 0, 0, 0, 0 };
-
-	uint8_t laststate;
-	uint8_t counter;
-	uint8_t j;
-	uint8_t i;
-
-	int try_again = 1;
-	float f, h, c;
-
-	while (try_again == 1)
-	{
-		data[0] = data[1] = data[2] = data[3] = data[4] = 0;
-		laststate = HIGH;
-		counter = 0;
-		j = 0;
-
-		/* pull pin down for 18 milliseconds */
-		pinMode( this->DHT22_RPI_PIN, OUTPUT );
-		digitalWrite( this->DHT22_RPI_PIN, LOW );
-		delay( 18 );
-
-		/* prepare to read the pin */
-		pinMode( this->DHT22_RPI_PIN, INPUT );
-
-		/* detect change and read data */
-		for ( i = 0; i < this->MAX_TIMINGS; i++ )
-		{
-			counter = 0;
-			while ( digitalRead( this->DHT22_RPI_PIN ) == laststate )
-			{
-				counter++;
-				delayMicroseconds( 1 );
-				if ( counter == 255 )
-				{
-					break;
-				}
-			}
-			laststate = digitalRead( this->DHT22_RPI_PIN );
-
-			if ( counter == 255 )
-				break;
-
-			/* ignore first 3 transitions */
-			if ( (i >= 4) && (i % 2 == 0) )
-			{
-				/* shove each bit into the storage bytes */
-				data[j / 8] <<= 1;
-				if ( counter > 16 )
-					data[j / 8] |= 1;
-				j++;
-			}
-		}
-
-		/*
-		 * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
-		 * print it out if data is good
-		 */
-		if ( (j >= 40) &&
-			 (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
-		{
-			h = (float)((data[0] << 8) + data[1]) / 10;
-			if ( h > 100 )
-			{
-				h = data[0];	// for DHT11
-			}
-			c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
-			if ( c > 125 )
-			{
-				c = data[2];	// for DHT11
-			}
-			if ( data[2] & 0x80 )
-			{
-				c = -c;
-			}
-			f = c * 1.8f + 32;
-#ifdef DEBUG
-			printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
-#endif
-			try_again = 0;
-		}
-		else
-		{
-			/* Data not good */
-			try_again = 1;
-			//printf ("Data not good, skipping\n");
-
-		}
-	}
-
-	/* Return temperature */
-	return c;
-}
-
-float rover::RoverSensors::readHumidity (void)
-{
-	int data[5] = { 0, 0, 0, 0, 0 };
-
-	uint8_t laststate;
-	uint8_t counter;
-	uint8_t j;
-	uint8_t i;
-
-	int try_again = 1;
-	float f, h, c;
-
-	while (try_again == 1)
-	{
-		data[0] = data[1] = data[2] = data[3] = data[4] = 0;
-		laststate = HIGH;
-		counter = 0;
-		j = 0;
-
-		/* pull pin down for 18 milliseconds */
-		pinMode( this->DHT22_RPI_PIN, OUTPUT );
-		digitalWrite( this->DHT22_RPI_PIN, LOW );
-		delay( 18 );
-
-		/* prepare to read the pin */
-		pinMode( this->DHT22_RPI_PIN, INPUT );
-
-		/* detect change and read data */
-		for ( i = 0; i < this->MAX_TIMINGS; i++ )
-		{
-			counter = 0;
-			while ( digitalRead( this->DHT22_RPI_PIN ) == laststate )
-			{
-				counter++;
-				delayMicroseconds( 1 );
-				if ( counter == 255 )
-				{
-					break;
-				}
-			}
-			laststate = digitalRead( this->DHT22_RPI_PIN );
-
-			if ( counter == 255 )
-				break;
-
-			/* ignore first 3 transitions */
-			if ( (i >= 4) && (i % 2 == 0) )
-			{
-				/* shove each bit into the storage bytes */
-				data[j / 8] <<= 1;
-				if ( counter > 16 )
-					data[j / 8] |= 1;
-				j++;
-			}
-		}
-
-		/*
-		 * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
-		 * print it out if data is good
-		 */
-		if ( (j >= 40) &&
-			 (data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
-		{
-			h = (float)((data[0] << 8) + data[1]) / 10;
-			if ( h > 100 )
-			{
-				h = data[0];	// for DHT11
-			}
-			c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
-			if ( c > 125 )
-			{
-				c = data[2];	// for DHT11
-			}
-			if ( data[2] & 0x80 )
-			{
-				c = -c;
-			}
-			f = c * 1.8f + 32;
-#ifdef DEBUG
-			printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
-#endif
-			try_again = 0;
-		}
-		else
-		{
-			/* Data not good */
-			try_again = 1;
-			//printf ("Data not good, skipping\n");
-		}
-	}
-
-	/* Return humidity */
-	return h;
-}
-
-void rover::RoverSensors::setHMC588LAddress (int address)
-{
-	this->HMC588L_ADDRESS = address;
-}
-
-void rover::RoverSensors::setHMC588LDeclinationAngle (float angle)
-{
-	this->DECLINATION_ANGLE = angle;
-}
-
-void rover::RoverSensors::setHMC588LCalibrationPeriod(int period)
-{
-	this->CALIBRATION_DURATION = period;
-}