#ifndef SONAR_CLASS
#define SONAR_CLASS
#include "i2c.h"
#include "windows.h"
#include "connection.h"
//Modes
#define OFF 0x00
#define SINGLE_SHOT 0x01
#define CONTINUOUS_MEASUREMENT 0x02
#define EVENT_CAPTURE 0x03
#define REQUEST_WARM_RESET 0x04
//Sonar registers
#define SONAR_ADDRESS 0x02
#define INTERVAL 0x40
#define COMMAND 0x41
#define RESULT_1 0x42
#define RESULT_2 0x43
#define RESULT_3 0x44
#define RESULT_4 0x45
#define RESULT_5 0x46
#define RESULT_6 0x47
#define RESULT_7 0x48
#define RESULT_8 0x49
#define ZERO_VALUE 0x50
#define SCALE_FACTOR 0x51
#define SCALE_DIVISOR 0x52
#define FACTORY_ZERO_VALUE 0x11
#define FACTORY_SCALE_FACTOR 0x12
#define FACTORY_SCALE_DIVISOR 0x13
/**
* Enumeration for different sonar sensor modes
* @see Sonar
*/
enum Sonar_mode {
/**
* Sensor reading is returned in centimeters
*/
METRIC = 1,
/**
* Sensor reading is returned in inches
*/
INCH = 2
};
using namespace std;
/**
* Class for the NXT sonar (ultrasonic) sensor
*/
class Sonar: public I2c{
public:
/**
* Constructor for the sonar sensor (percent mode and LED on is default)
* @param port [which sensor port to use]
* @param *connection [attach a connection]
* @param mode [set the sonar mode to either METRIC or INCH (default is METRIC)]
*/
Sonar(Sensor_port port, Connection* connection, Sonar_mode mode=METRIC);
~Sonar();
/**
* Initiate the sensor
* @param reply [true = require reply from NXT; false = no reply from NXT]
*/
void init(bool reply=false);
/**
* Read the sensor value
* (init method will be called if the sensor has not been initialized)
* @return the sensor reading in either inches or centimeters
*/
int read();
/**
* Set the return value to be either inch or centimeter
* @param value [use either METRIC or INCH to indicate the return value of read()]
* @see Sonar_mode
*/
void set(unsigned int value);
/**
* Get the sensor reading as a string
* (init method will be called if the sensor has not been initialized)
* @return sensor reading as a string + either " CM" or " inch(s)"
*/
string print();
/**
* Get the sensor type
* @return either SONAR_METRIC or SONAR_INCH
*/
Sensor_type get_type();
protected:
Sonar_mode sonar_mode;
void off();
void write_register(int reg_adr, int value);
int read_register(int reg_adr);
void set_mode(int mode);
void sonar_reset();
//void set_sensor_mode(int mode);
};
#endif