#ifndef SENSOR #define SENSOR #include "connection.h" #include <string.h> using namespace std; /** * Enumeration used to determine the result type (which sub-class of Result) * @see Result#get_type */ enum Result_type{ /** * Means that the sub class is Rgb_color (used with the color sensor) * @see Rgb_color * @see Color_sensor#read */ RGB_RESULT=0, /** * Means that the sub class is Xyz_position (used with the tilt sensor) * @see Xyz_position * @see Tilt#read */ XYZ_RESULT=1, /** * Means that the sub class is ADC_ports (used with the PCF8591 ADC chip/sensor) * @see Adc_ports * @see Adc_8591#read */ ADC_RESULT=2 }; /** * Class used to return sensor readings when there is more than one return value * @see Sensor#read */ class Result{ public: /** * @return the result type (see the RESULT_TYPE enumeration) */ virtual Result_type get_type()=0; }; /** * Sensor port enumeration */ enum Sensor_port { /** * Port 1 */ IN_1 = 0, /** * Port 2 */ IN_2 = 1, /** * Port 3 */ IN_3 = 2, /** * Port 4 */ IN_4 = 3 }; /** * Sensor type enumeration */ enum Sensor_type { /** * No sensor configured */ NO_SENSOR = 0x00, /** * NXT or RCX touch sensor */ TOUCH = 0x01, /** * RCX temperature sensor (maybe it workes with the NXT temperature sensor?) */ TEMPERATURE = 0x02, /** * RCX light sensor */ REFLECTION = 0x03, /** * RCX rotation sensor */ ANGLE = 0x04, /** * NXT light sensor with LED on */ LIGHT_ACTIVE = 0x05, /** * NXT light sensor with LED off */ LIGHT_INACTIVE = 0x06, /** * NXT sound sensor with dB scaling */ SOUND_DB = 0x07, /** * NXT sound sensor with dBA scaling */ SOUND_DBA = 0x08, /** * Custom sensor type */ CUSTOM = 0x09, /** * I2C digital sensor */ LOWSPEED = 0x0A, /** * I2C digital sensor 9V */ LOWSPEED_9V = 0x0B, /** * Sonar sensor returning metric distance - only used as a return type can not be used to set-up a sensor */ SONAR_METRIC = 0x0C, /** * Sonar sensor returning inch distance - only used as a return type can not be used to set-up a sensor */ SONAR_INCH = 0x0D, /** * HiTechnic compass sensor - only used as a return type can not be used to set-up a sensor */ COMPASS = 0x0E, /** * PCF8574 I2C I/O chip - only used as a return type can not be used to set-up a sensor */ IO_8574_SENSOR = 0x0F, /** * PCF8591 8-bit ADC chip - only used as a return type can not be used to set-up a sensor */ ADC_8591_SENSOR = 0x10, /** * HiTechnic color sensor - only used as a return type can not be used to set-up a sensor */ COLOR = 0x11, /** * HiTechnic gyro sensor - only used as a return type can not be used to set-up a sensor */ GYRO = 0x12, /** * HiTechnic tilt sensor - only used as a return type can not be used to set-up a sensor */ TILT = 0x13 }; /** * Sensor mode enumeration */ enum Sensor_mode { /** * Raw value from 0 to 1023 */ RAW_MODE = 0x00, /** * Boolean value */ BOOL_MODE = 0x20, /** * Counts number of boolean transitions */ TRANSITION_MODE = 0x40, /** * Counts number of boolean periods */ PERIOD_MODE = 0x60, /** * Scales the raw value and returns a value from 0 to 100 */ PERCENT_MODE = 0x80, /** * Degrees in celsius */ CELSIUS_MODE = 0xA0, /** * Degrees in Fahrenheit */ FAHRENHEIT_MODE = 0xC0, /** * Rotation (16 ticks per revolution) */ ANGLE_MODE = 0xE0, }; /** * Class for analog sensors - also works as the base class for all other sensors */ class Sensor{ public: /** * Sensor constructor * @param port [which sensor port to use] * @param *connection [attach a connection] * @param sensor_type [set the sensor type] * @param sensor mode [set the sensor mode] */ Sensor(Sensor_port port, Connection* connection, Sensor_type sensor_type, Sensor_mode sensor_mode); virtual ~Sensor(); /** * Initiate the sensor (sets its type and mode) * @param reply [true = require reply from NXT; false = no reply from NXT] */ virtual void init(bool reply=false); /** * Get the sensor reading (mode dependent) * (init method will be called if the sensor has not been initialized) * @return the mode dependent sensor reading */ virtual int read(); /** * Get multiple sensor readings * (Dummy method does nothing - is implemented in some sub classes) * @param &result [reference where the sensor readings are placed] * @return 1 if sensor readings are placed in &result otherwise 0 */ virtual int read(Result &result); /** * Set a parameter on the sensor * (Dummy method does nothing - is implemented in some sub classes) */ virtual 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 the sensor reading as a string */ virtual string print(); /** * Get the sensor type * @return the sensor type */ virtual Sensor_type get_type(); /** * Get the sensor port * @return the sensor port */ virtual Sensor_port get_port(); /** * Get the sensor mode * @return the sensor mode */ virtual Sensor_mode get_mode(); /** * Get the I2C address * (Dummy method does nothing - is implemented in some sub class ) * @return the I2C address */ virtual unsigned char get_i2c_address(); protected: /** * Indicates whether or not the sensors has been initiated */ bool has_init; /** * Reset the sensor (sets its type and mode) * @param reply [true = require reply from NXT; false = no reply from NXT] */ void reset(bool reply=false); /** * Get the sensor values (updates the raw_AD_valued, normalized_AD_value, scaled_value, calibrated_value fields) */ void get_sensor_value(); /** * Get the mode dependent sensor reading * @return the updated scaled_value field */ int read_mode(); /** * Get the device dependent sensor reading * @return the updated raw_AD_value field */ unsigned int read_raw(); /** * Get the mode type dependent sensor reading * @return the updated normalized_AD_value field */ unsigned int read_normalized();//type dependent /** * Set the type and mode of the sensor */ void set_type_and_mode(Sensor_type type, Sensor_mode mode, bool reply=false); Connection *connection; Sensor_type sensor_type; Sensor_mode sensor_mode; Sensor_port sensor_port; unsigned int raw_AD_value;//device dependent unsigned int normalized_AD_value;//type dependent int scaled_value;//mode dependent int calibrated_value; //not used }; #endif