Michael Ernst Peter / PM2_Libary

Dependencies:   LSM9DS1 RangeFinder FastPWM

Dependents:   PM2_Example_PES_board PM2_Example_PES_board PM2_Example_PES_board PM2_Example_PES_board ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SensorBar.h Source File

SensorBar.h

00001 #ifndef SensorBar_H
00002 #define SensorBar_H
00003 
00004 #include <mbed.h>
00005 #include "AvgFilter.h"
00006 #include "ThreadFlag.h"
00007 
00008 #define     REG_INPUT_DISABLE_B     0x00    //  RegInputDisableB Input buffer disable register _ I/O[15_8] (Bank B) 0000 0000
00009 #define     REG_INPUT_DISABLE_A     0x01    //  RegInputDisableA Input buffer disable register _ I/O[7_0] (Bank A) 0000 0000
00010 #define     REG_LONG_SLEW_B         0x02    //  RegLongSlewB Output buffer long slew register _ I/O[15_8] (Bank B) 0000 0000
00011 #define     REG_LONG_SLEW_A         0x03    //  RegLongSlewA Output buffer long slew register _ I/O[7_0] (Bank A) 0000 0000
00012 #define     REG_LOW_DRIVE_B         0x04    //  RegLowDriveB Output buffer low drive register _ I/O[15_8] (Bank B) 0000 0000
00013 #define     REG_LOW_DRIVE_A         0x05    //  RegLowDriveA Output buffer low drive register _ I/O[7_0] (Bank A) 0000 0000
00014 #define     REG_PULL_UP_B           0x06    //  RegPullUpB Pull_up register _ I/O[15_8] (Bank B) 0000 0000
00015 #define     REG_PULL_UP_A           0x07    //  RegPullUpA Pull_up register _ I/O[7_0] (Bank A) 0000 0000
00016 #define     REG_PULL_DOWN_B         0x08    //  RegPullDownB Pull_down register _ I/O[15_8] (Bank B) 0000 0000
00017 #define     REG_PULL_DOWN_A         0x09    //  RegPullDownA Pull_down register _ I/O[7_0] (Bank A) 0000 0000
00018 #define     REG_OPEN_DRAIN_B        0x0A    //  RegOpenDrainB Open drain register _ I/O[15_8] (Bank B) 0000 0000
00019 #define     REG_OPEN_DRAIN_A        0x0B    //  RegOpenDrainA Open drain register _ I/O[7_0] (Bank A) 0000 0000
00020 #define     REG_POLARITY_B          0x0C    //  RegPolarityB Polarity register _ I/O[15_8] (Bank B) 0000 0000
00021 #define     REG_POLARITY_A          0x0D    //  RegPolarityA Polarity register _ I/O[7_0] (Bank A) 0000 0000
00022 #define     REG_DIR_B               0x0E    //  RegDirB Direction register _ I/O[15_8] (Bank B) 1111 1111
00023 #define     REG_DIR_A               0x0F    //  RegDirA Direction register _ I/O[7_0] (Bank A) 1111 1111
00024 #define     REG_DATA_B              0x10    //  RegDataB Data register _ I/O[15_8] (Bank B) 1111 1111*
00025 #define     REG_DATA_A              0x11    //  RegDataA Data register _ I/O[7_0] (Bank A) 1111 1111*
00026 #define     REG_INTERRUPT_MASK_B    0x12    //  RegInterruptMaskB Interrupt mask register _ I/O[15_8] (Bank B) 1111 1111
00027 #define     REG_INTERRUPT_MASK_A    0x13    //  RegInterruptMaskA Interrupt mask register _ I/O[7_0] (Bank A) 1111 1111
00028 #define     REG_SENSE_HIGH_B        0x14    //  RegSenseHighB Sense register for I/O[15:12] 0000 0000
00029 #define     REG_SENSE_LOW_B         0x15    //  RegSenseLowB Sense register for I/O[11:8] 0000 0000
00030 #define     REG_SENSE_HIGH_A        0x16    //  RegSenseHighA Sense register for I/O[7:4] 0000 0000
00031 #define     REG_SENSE_LOW_A         0x17    //  RegSenseLowA Sense register for I/O[3:0] 0000 0000
00032 #define     REG_INTERRUPT_SOURCE_B  0x18    //  RegInterruptSourceB Interrupt source register _ I/O[15_8] (Bank B) 0000 0000
00033 #define     REG_INTERRUPT_SOURCE_A  0x19    //  RegInterruptSourceA Interrupt source register _ I/O[7_0] (Bank A) 0000 0000
00034 #define     REG_EVENT_STATUS_B      0x1A    //  RegEventStatusB Event status register _ I/O[15_8] (Bank B) 0000 0000
00035 #define     REG_EVENT_STATUS_A      0x1B    //  RegEventStatusA Event status register _ I/O[7_0] (Bank A) 0000 0000
00036 #define     REG_LEVEL_SHIFTER_1     0x1C    //  RegLevelShifter1 Level shifter register 0000 0000
00037 #define     REG_LEVEL_SHIFTER_2     0x1D    //  RegLevelShifter2 Level shifter register 0000 0000
00038 #define     REG_CLOCK               0x1E    //  RegClock Clock management register 0000 0000
00039 #define     REG_MISC                0x1F    //  RegMisc Miscellaneous device settings register 0000 0000
00040 #define     REG_LED_DRIVER_ENABLE_B 0x20    //  RegLEDDriverEnableB LED driver enable register _ I/O[15_8] (Bank B) 0000 0000
00041 #define     REG_LED_DRIVER_ENABLE_A 0x21    //  RegLEDDriverEnableA LED driver enable register _ I/O[7_0] (Bank A) 0000 0000
00042 // Debounce and Keypad Engine
00043 #define     REG_DEBOUNCE_CONFIG     0x22    //  RegDebounceConfig Debounce configuration register 0000 0000
00044 #define     REG_DEBOUNCE_ENABLE_B   0x23    //  RegDebounceEnableB Debounce enable register _ I/O[15_8] (Bank B) 0000 0000
00045 #define     REG_DEBOUNCE_ENABLE_A   0x24    //  RegDebounceEnableA Debounce enable register _ I/O[7_0] (Bank A) 0000 0000
00046 #define     REG_KEY_CONFIG_1        0x25    //  RegKeyConfig1 Key scan configuration register 0000 0000
00047 #define     REG_KEY_CONFIG_2        0x26    //  RegKeyConfig2 Key scan configuration register 0000 0000
00048 #define     REG_KEY_DATA_1          0x27    //  RegKeyData1 Key value (column) 1111 1111
00049 #define     REG_KEY_DATA_2          0x28    //  RegKeyData2 Key value (row) 1111 1111
00050 // LED Driver (PWM, blinking, breathing)
00051 #define     REG_T_ON_0              0x29    //  RegTOn0 ON time register for I/O[0] 0000 0000
00052 #define     REG_I_ON_0              0x2A    //  RegIOn0 ON intensity register for I/O[0] 1111 1111
00053 #define     REG_OFF_0               0x2B    //  RegOff0 OFF time/intensity register for I/O[0] 0000 0000
00054 #define     REG_T_ON_1              0x2C    //  RegTOn1 ON time register for I/O[1] 0000 0000
00055 #define     REG_I_ON_1              0x2D    //  RegIOn1 ON intensity register for I/O[1] 1111 1111
00056 #define     REG_OFF_1               0x2E    //  RegOff1 OFF time/intensity register for I/O[1] 0000 0000
00057 #define     REG_T_ON_2              0x2F    //  RegTOn2 ON time register for I/O[2] 0000 0000
00058 #define     REG_I_ON_2              0x30    //  RegIOn2 ON intensity register for I/O[2] 1111 1111
00059 #define     REG_OFF_2               0x31    //  RegOff2 OFF time/intensity register for I/O[2] 0000 0000
00060 #define     REG_T_ON_3              0x32    //  RegTOn3 ON time register for I/O[3] 0000 0000
00061 #define     REG_I_ON_3              0x33    //  RegIOn3 ON intensity register for I/O[3] 1111 1111
00062 #define     REG_OFF_3               0x34    //  RegOff3 OFF time/intensity register for I/O[3] 0000 0000
00063 #define     REG_T_ON_4              0x35    //  RegTOn4 ON time register for I/O[4] 0000 0000
00064 #define     REG_I_ON_4              0x36    //  RegIOn4 ON intensity register for I/O[4] 1111 1111
00065 #define     REG_OFF_4               0x37    //  RegOff4 OFF time/intensity register for I/O[4] 0000 0000
00066 #define     REG_T_RISE_4            0x38    //  RegTRise4 Fade in register for I/O[4] 0000 0000
00067 #define     REG_T_FALL_4            0x39    //  RegTFall4 Fade out register for I/O[4] 0000 0000
00068 #define     REG_T_ON_5              0x3A    //  RegTOn5 ON time register for I/O[5] 0000 0000
00069 #define     REG_I_ON_5              0x3B    //  RegIOn5 ON intensity register for I/O[5] 1111 1111
00070 #define     REG_OFF_5               0x3C    //  RegOff5 OFF time/intensity register for I/O[5] 0000 0000
00071 #define     REG_T_RISE_5            0x3D    //  RegTRise5 Fade in register for I/O[5] 0000 0000
00072 #define     REG_T_FALL_5            0x3E    //  RegTFall5 Fade out register for I/O[5] 0000 0000
00073 #define     REG_T_ON_6              0x3F    //  RegTOn6 ON time register for I/O[6] 0000 0000
00074 #define     REG_I_ON_6              0x40    //  RegIOn6 ON intensity register for I/O[6] 1111 1111
00075 #define     REG_OFF_6               0x41    //  RegOff6 OFF time/intensity register for I/O[6] 0000 0000
00076 #define     REG_T_RISE_6            0x42    //  RegTRise6 Fade in register for I/O[6] 0000 0000
00077 #define     REG_T_FALL_6            0x43    //  RegTFall6 Fade out register for I/O[6] 0000 0000
00078 #define     REG_T_ON_7              0x44    //  RegTOn7 ON time register for I/O[7] 0000 0000
00079 #define     REG_I_ON_7              0x45    //  RegIOn7 ON intensity register for I/O[7] 1111 1111
00080 #define     REG_OFF_7               0x46    //  RegOff7 OFF time/intensity register for I/O[7] 0000 0000
00081 #define     REG_T_RISE_7            0x47    //  RegTRise7 Fade in register for I/O[7] 0000 0000
00082 #define     REG_T_FALL_7            0x48    //  RegTFall7 Fade out register for I/O[7] 0000 0000
00083 #define     REG_T_ON_8              0x49    //  RegTOn8 ON time register for I/O[8] 0000 0000
00084 #define     REG_I_ON_8              0x4A    //  RegIOn8 ON intensity register for I/O[8] 1111 1111
00085 #define     REG_OFF_8               0x4B    //  RegOff8 OFF time/intensity register for I/O[8] 0000 0000
00086 #define     REG_T_ON_9              0x4C    //  RegTOn9 ON time register for I/O[9] 0000 0000
00087 #define     REG_I_ON_9              0x4D    //  RegIOn9 ON intensity register for I/O[9] 1111 1111
00088 #define     REG_OFF_9               0x4E    //  RegOff9 OFF time/intensity register for I/O[9] 0000 0000
00089 #define     REG_T_ON_10             0x4F    //  RegTOn10 ON time register for I/O[10] 0000 0000
00090 #define     REG_I_ON_10             0x50    //  RegIOn10 ON intensity register for I/O[10] 1111 1111
00091 #define     REG_OFF_10              0x51    //  RegOff10 OFF time/intensity register for I/O[10] 0000 0000
00092 #define     REG_T_ON_11             0x52    //  RegTOn11 ON time register for I/O[11] 0000 0000
00093 #define     REG_I_ON_11             0x53    //  RegIOn11 ON intensity register for I/O[11] 1111 1111
00094 #define     REG_OFF_11              0x54    //  RegOff11 OFF time/intensity register for I/O[11] 0000 0000
00095 #define     REG_T_ON_12             0x55    //  RegTOn12 ON time register for I/O[12] 0000 0000
00096 #define     REG_I_ON_12             0x56    //  RegIOn12 ON intensity register for I/O[12] 1111 1111
00097 #define     REG_OFF_12              0x57    //  RegOff12 OFF time/intensity register for I/O[12] 0000 0000
00098 #define     REG_T_RISE_12           0x58    //  RegTRise12 Fade in register for I/O[12] 0000 0000
00099 #define     REG_T_FALL_12           0x59    //  RegTFall12 Fade out register for I/O[12] 0000 0000
00100 #define     REG_T_ON_13             0x5A    //  RegTOn13 ON time register for I/O[13] 0000 0000
00101 #define     REG_I_ON_13             0x5B    //  RegIOn13 ON intensity register for I/O[13] 1111 1111
00102 #define     REG_OFF_13              0x5C    //  RegOff13 OFF time/intensity register for I/O[13] 0000 0000
00103 #define     REG_T_RISE_13           0x5D    //  RegTRise13 Fade in register for I/O[13] 0000 0000
00104 #define     REG_T_FALL_13           0x5E    //  RegTFall13 Fade out register for I/O[13] 0000 0000
00105 #define     REG_T_ON_14             0x5F    //  RegTOn14 ON time register for I/O[14] 0000 0000
00106 #define     REG_I_ON_14             0x60    //  RegIOn14 ON intensity register for I/O[14] 1111 1111
00107 #define     REG_OFF_14              0x61    //  RegOff14 OFF time/intensity register for I/O[14] 0000 0000
00108 #define     REG_T_RISE_14           0x62    //  RegTRise14 Fade in register for I/O[14] 0000 0000
00109 #define     REG_T_FALL_14           0x63    //  RegTFall14 Fade out register for I/O[14] 0000 0000
00110 #define     REG_T_ON_15             0x64    //  RegTOn15 ON time register for I/O[15] 0000 0000
00111 #define     REG_I_ON_15             0x65    //  RegIOn15 ON intensity register for I/O[15] 1111 1111
00112 #define     REG_OFF_15              0x66    //  RegOff15 OFF time/intensity register for I/O[15] 0000 0000
00113 #define     REG_T_RISE_15           0x67    //  RegTRise15 Fade in register for I/O[15] 0000 0000
00114 #define     REG_T_FALL_15           0x68    //  RegTFall15 Fade out register for I/O[15] 0000 0000
00115 //  Miscellaneous
00116 #define     REG_HIGH_INPUT_B        0x69    //  RegHighInputB High input enable register _ I/O[15_8] (Bank B) 0000 0000
00117 #define     REG_HIGH_INPUT_A        0x6A    //  RegHighInputA High input enable register _ I/O[7_0] (Bank A) 0000 0000
00118 //  Software Reset
00119 #define     REG_RESET               0x7D    //  RegReset Software reset register 0000 0000
00120 #define     REG_TEST_1              0x7E    //  RegTest1 Test register 0000 0000
00121 #define     REG_TEST_2              0x7F    //  RegTest2 Test register 0000 0000
00122 
00123 #define RECEIVE_TIMEOUT_VALUE 1000  // Timeout for I2C receive
00124 
00125 // These are used for setting LED driver to linear or log mode:
00126 #define LINEAR      0
00127 #define LOGARITHMIC 1
00128 
00129 // These are used for clock config:
00130 #define INTERNAL_CLOCK  2
00131 #define EXTERNAL_CLOCK  1
00132 
00133 class SensorBar
00134 {
00135 public:
00136     //New functions for bar specific operation
00137     SensorBar(I2C& i2c, float distAxisToSensor = 0.12f);
00138     virtual ~SensorBar();
00139 
00140     //Functions pulled from the SX1509 driver
00141     // void debounceConfig( uint8_t configValue );
00142     // void debounceEnable( uint8_t pin );
00143     // unsigned int interruptSource();
00144     // void configClock( uint8_t oscSource = 2, uint8_t oscPinFunction = 0, uint8_t oscFreqOut = 0, uint8_t oscDivider = 1 );
00145 
00146     void setBarStrobe();    // to only illuminate while reading line
00147     void clearBarStrobe();  // to illuminate all the time
00148     void setInvertBits();   // to make the bar functions look for a white line on dark surface
00149     void clearInvertBits(); // to make the bar look for a dark line on a reflective surface
00150 
00151     uint8_t getRaw();
00152     int8_t getBinaryPosition();
00153     float getAngleRad();
00154     float getAvgAngleRad();
00155     uint8_t getNrOfLedsActive();
00156     bool isAnyLedActive();
00157 
00158 private:
00159     //Holding variables
00160     uint8_t lastBarRawValue;
00161     uint8_t lastBarPositionValue;
00162     float distAxisToSensor;
00163 
00164     //Settings
00165     uint8_t deviceAddress; // I2C Address of SX1509
00166     uint8_t barStrobe; // 0 = always on, 1 = power saving by IR LED strobe
00167     uint8_t invertBits; // 1 = invert
00168 
00169     // Pin definitions:
00170     uint8_t pinInterrupt;
00171     uint8_t pinOscillator;
00172     uint8_t pinReset;
00173 
00174     bool begin();        // Run this once during initialization to configure the SX1509 as a sensor bar
00175     void reset();
00176 
00177     // Read Functions:
00178     uint8_t readByte(uint8_t registerAddress);
00179     unsigned int readWord(uint8_t registerAddress);
00180     void readBytes(uint8_t firstRegisterAddress, char * destination, uint8_t length);
00181     // Write functions:
00182     void writeByte(uint8_t registerAddress, uint8_t writeValue);
00183     void writeWord(uint8_t registerAddress, unsigned int writeValue);
00184     void writeBytes(uint8_t firstRegisterAddress, uint8_t * writeArray, uint8_t length);
00185 
00186     I2C& i2c;
00187 
00188     static const float TS;
00189 
00190     static const char REG_I_ON[16];
00191     static const char REG_T_ON[16];
00192     static const char REG_OFF[16];
00193     static const char REG_T_RISE[16];
00194     static const char REG_T_FALL[16];
00195 
00196     ThreadFlag threadFlag;
00197     Thread     thread;
00198     Ticker     ticker;
00199 
00200     float angle, avg_angle;
00201     uint8_t nrOfLedsActive;
00202     AvgFilter avg_filter;
00203     bool is_first_avg;
00204 
00205     void update();
00206     float updateAngleRad();
00207     uint8_t updateNrOfLedsActive();
00208     void sendThreadFlag();
00209 };
00210 
00211 #endif /* SensorBar_H */
00212 
00213 //****************************************************************************//
00214 //
00215 //  Circular Buffer
00216 //
00217 //****************************************************************************//
00218 
00219 //Class CircularBuffer is int16_t
00220 //Does not care about over-running real data ( if request is outside length's bounds ).
00221 //For example, the underlying machine writes [48], [49], [0], [1] ...
00222 
00223 /*
00224 namespace name
00225 {
00226 class CircularBuffer
00227 {
00228 public:
00229     CircularBuffer( uint16_t inputSize );
00230     ~CircularBuffer();
00231     int16_t getElement( uint16_t ); //zero is the push location
00232     void pushElement( int16_t );
00233     int16_t averageLast( uint16_t );
00234     uint16_t recordLength();
00235 private:
00236     uint16_t cBufferSize;
00237     int16_t *cBufferData;
00238     int16_t cBufferLastPtr;
00239     uint8_t cBufferElementsUsed;
00240 };
00241 }
00242 */