I2C device discovery and printout of known device names

Revision:
0:df49b3ed3502
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i2cDevices.h	Thu Jan 10 17:44:10 2019 +0000
@@ -0,0 +1,207 @@
+#ifndef I2CDEVICES_H
+#define I2CDEVICES_H
+
+#include "DevI2C.h"
+
+//if the use of low-level I2C routines is required, uncomment out the next two lines 
+//#define I2CLOWLEVEL     1   
+//#warning "using low level I2C routines"
+
+/** Software routines that show the I2C devices connected to the I2C bus. The
+ *  routine also sets flags that indicate certain I2C devices have been 
+ *  detected.  Those flags are within a "typedef" structure.
+ *
+ * NOTE: Requires the external definition of the user console: "RawSerial pc;"
+ *
+ * @code
+ * #include "mbed.h"
+ * #include "i2cDevices.h"
+ *
+ * RawSerial pc(USBTX, USBRX);
+ * DigitalOut led1(LED1);
+ *
+ * #define SDA         PTE0     //i2c bus for KL25Z
+ * #define SCL         PTE1
+ *
+ * I2C i2c1(SDA, SCL);
+ * i2c_discovery i2c_d(SDA, SCL, "i2c_d");
+ * i2c_discovery::i2cDeviceFlags i2c_flags = {};
+ *
+ * int main() {
+ *     pc.baud(230400);
+ *     i2c1.frequency(400000);
+ *     pc.print("\r\n\r\nbegin....\r\n");
+ *     i2c_d.find_i2c(i2c_flags);
+ *     if(i2c_flags.PCA9955_0 == true) {
+ *         pc.printf("Device detected!\r\n");
+ *     } else {
+ *         pc.printf("Device not found!!!\r\n");
+ *     }
+ *     while(1) {
+ *         led1 = !led1;
+ *         wait(1.0);
+ *     }
+ * }
+ *
+ * @endcode
+ */
+
+//used to define terminal text output color
+#define COLOR_TERM
+#ifdef COLOR_TERM
+    #define DOBLUE      "\033[0;34;2m"
+    #define DOMAGENTA   "\033[0;35;2m"
+    #define DONONE      "\033[0m"
+#else
+    #define DOBLUE      ""
+    #define DOMAGENTA   ""
+    #define DONONE      ""
+#endif
+
+//list of i2c device possibilities
+#define I2C_0x02    "PCA9955-GGG"
+#define I2C_0x06    "SHT1x"
+#define I2C_0x0C    "AK8975"
+
+#define I2C_0x1C    "MAG3110"
+
+#define I2C_0x20    "VEML6040, VEML6075"
+
+#define I2C_0x38    "MMA8451-0, FXOS8700CQ-2"
+#define I2C_0x3A    "MMA8451-1, FXOS8700CQ-1"
+#define I2C_0x3C    "FXOS8700CQ-0, LIS3MDL"
+#define I2C_0x3E    "FXOS8700CQ-3"
+
+#define I2C_0x42    "MCP23017-b"
+#define I2C_0x44    "MCP23017-c"
+#define I2C_0x46    "MCP23017-d"
+
+#define I2C_0x50    "MAX5387-ggg"
+#define I2C_0x52    "MAX5387-ggv, VL53L0X"
+#define I2C_0x54    "MAX5387-gvg"
+#define I2C_0x56    "MAX5387-gvv"
+#define I2C_0x58    "MAX5387-vgg"
+#define I2C_0x5A    "MAX5387-vgv"
+#define I2C_0x5C    "MAX5387-vvg"
+#define I2C_0x5E    "MAX5387-vvv"
+
+#define I2C_0x70    "VEML6070-ld/c"
+#define I2C_0x72    "VEML6070-hd"
+
+#define I2C_0x80    "Si7005, Si7021, HTU21D, HDC1080, INA2xx/MAX7300-gg"
+#define I2C_0x82    "INA2xx/MAX7300-gv"
+#define I2C_0x84    "INA2xx/MAX7300-gd"
+#define I2C_0x86    "INA2xx/MAX7300-gc"
+#define I2C_0x88    "INA2xx/MAX7300-vg"
+#define I2C_0x8A    "INA2xx/MAX7300-vv"
+#define I2C_0x8C    "INA2xx/MAX7300-vd"
+#define I2C_0x8E    "INA2xx/MAX7300-vc"
+
+#define I2C_0x90    "AD7416-a, LM75, INA2xx/MAX7300-dg"
+#define I2C_0x92    "MAX9768, INA2xx/MAX7300-dv"
+#define I2C_0x94    "INA2xx/MAX7300-dd"
+#define I2C_0x96    "INA2xx/MAX7300-dc"
+#define I2C_0x98    "INA2xx/MAX7300-cg"
+#define I2C_0x9A    "INA2xx/MAX7300-cv"
+#define I2C_0x9C    "INA2xx/MAX7300-cd"
+#define I2C_0x9E    "INA2xx/MAX7300-cc"
+
+#define I2C_0xA0    "24FC512-000, 24AA02-b0"
+#define I2C_0xA2    "24AA02-b1"
+#define I2C_0xA4    "24AA02-b2"
+#define I2C_0xA6    "24AA02-b3"
+#define I2C_0xA8    "24AA02-b4"
+#define I2C_0xAA    "MMA8491, 24AA02-b5, BQ27xx0, BQ34Z100-G1"
+#define I2C_0xAC    "24AA02-b6, M24SR64-Y"
+#define I2C_0xAE    "24AA02-b7"
+
+#define I2C_0xB4    "CCS811-0"
+#define I2C_0xB6    "CCS811-1"
+#define I2C_0xBA    "LPS22HB"
+#define I2C_0xBE    "HTS221"
+
+#define I2C_0xC0    "MPL3115A2, MLX90620-ram, PCA9955-0"
+#define I2C_0xC2    "SCD30"
+
+#define I2C_0xD0    "M41T11, DS1307, DS3232M, MCU9150-0"
+#define I2C_0xD2    "MCU9150-1"
+#define I2C_0xD4    "LSM6DSL"
+#define I2C_0xDE    "MCP7941x-rtc"
+
+#define I2C_0xE0    "PCA9955-AllCall"
+#define I2C_0xEC    "MS5611-cs1, BME280-cs0, PCA9955-SubCall"
+#define I2C_0xEE    "MS5611-cs0, BME280-cs1, BMP-05"
+
+/** Create an i2c controller class
+ *
+ * @param i2c class class
+ *
+ */
+class i2c_discovery
+{
+    public:
+    /** Structure which is used to exchange indicate certain
+     *  devices of interest is detected or not by this routine.
+     */    
+    typedef struct {
+        bool rtcDS_ok;          /*!< i2c address 0xd0 */
+        bool ms5611_ok;         /*!< i2c address 0xee */
+        bool bme280_cs0_ok;     /*!< i2c address 0xec */
+        bool bme280_cs1_ok;     /*!< i2c address 0xee */
+        bool mma8451cs1_ok;     /*!< i2c address 0x3a */
+        bool HTU21D_ok;         /*!< i2c address 0x80 */
+        bool INA219_MAX7300_gg_ok; /*!< i2c address 0x80 */
+        bool INA230_MAX7300_gg_ok; /*!< i2c address 0x80 */
+        bool PCA9955_GGG_ok;    /*!< i2c address 0xc0 */
+        bool VEML60xx_ok;       /*!< i2c address 0x20 */
+        bool VEML6070_ok;       /*!< i2c address 0x70 */
+        bool eeprom000_ok;      /*!< i2c address 0xa0 */
+        bool mlx90620_ok;       /*!< i2c address 0xc0 */
+        bool SCD30_ok;          /*!< i2c address 0xc2 */
+        bool bq27210_ok;        /*!< i2c address 0xaa */
+        bool ccs811_0_ok;       /*!< i2c address 0xb4 */
+        bool ccs811_1_ok;       /*!< i2c address 0xb6 */
+        bool mcp7941x_ok;       /*!< i2c address 0xde */
+    } i2cDeviceFlags;
+
+    /**
+     * Constructor, uses default I2C clock speed
+     * - Fixed at I2C address 0x80
+     * - I2C speed set to 400KHz
+     *
+     * @param sda - mbed I2C interface pin
+     * @param scl - mbed I2C interface pin
+     * @param name - name of i2c_discovery
+     */
+    i2c_discovery(PinName sda, PinName scl, const char* name);
+    
+    /**
+     * Clear I2C device Flags
+     * 
+     * @param i2cDeviceFlags pointer
+     *
+     * @return --none--
+    */    
+    void clearFlags(i2cDeviceFlags& i2cFlags);
+    
+    /**
+     * Go and search for I2C devices
+     * 
+     * @param i2cDeviceFlags pointer
+     *
+     * @return count - number of i2c devices detected
+    */     
+    int find_i2c(i2cDeviceFlags& i2cFlags);
+    
+    private:
+
+    int showI2C(i2cDeviceFlags& i2cFlags, char addr);
+    int dispI2C(i2cDeviceFlags& i2cFlags);
+    
+    protected:
+    
+    DevI2C _i2c;
+
+};
+
+#endif