1 #pragma once 2 3 #include "DomoticzHardware.h" 4 5 typedef union _i2c_data 6 { 7 uint8_t byte[2]; 8 uint16_t word; 9 } i2c_data; 10 11 class I2C : public CDomoticzHardwareBase 12 { 13 public: 14 enum _eI2CType 15 { 16 I2CTYPE_UNKNOWN = 0, 17 I2CTYPE_BMP085, 18 I2CTYPE_HTU21D, 19 I2CTYPE_TSL2561, 20 I2CTYPE_PCF8574, 21 I2CTYPE_BME280, 22 I2CTYPE_MCP23017 23 }; 24 explicit I2C(const int ID, const _eI2CType DevType, const std::string &Address, const std::string &SerialPort, const int Mode1); 25 ~I2C(); 26 bool WriteToHardware(const char *pdata, const unsigned char length) override; 27 private: 28 bool StartHardware() override; 29 bool StopHardware() override; 30 void HTU21D_ReadSensorDetails(); 31 void bmp_Read_BMP_SensorDetails(); 32 void bmp_Read_BME_SensorDetails(); 33 34 bool readBME280ID(const int fd, int &ChipID, int &Version); 35 bool readBME280All(const int fd, float &temp, float &pressure, int &humidity); 36 37 void Do_Work(); 38 39 bool i2c_test(const char *I2CBusName); 40 int i2c_Open(const char *I2CBusName); 41 42 int ReadInt(int fd, uint8_t *devValues, uint8_t startReg, uint8_t bytesToRead); 43 int WriteCmd(int fd, uint8_t devAction); 44 int WriteCmdAddr(const int fd, const uint8_t CmdAddr, const uint8_t devAction); 45 46 private: 47 std::shared_ptr<std::thread> m_thread; 48 49 _eI2CType m_dev_type; 50 uint8_t m_i2c_addr; 51 std::string m_ActI2CBus; 52 bool m_invert_data; 53 54 55 // BMP085 stuff 56 //Forecast 57 uint8_t bmp_CalculateForecast(const float pressure); 58 uint8_t CalculateForecast(const float pressure); 59 float m_LastPressure; 60 int m_LastMinute; 61 float m_pressureSamples[180]; 62 int m_minuteCount; 63 bool m_firstRound; 64 float m_pressureAvg[7]; 65 int m_LastForecast; 66 unsigned char m_LastSendForecast; 67 int bmp_Calibration(int fd); 68 int bmp_WaitForConversion(int fd); 69 int bmp_GetPressure(int fd, double *Pres); 70 int bmp_GetTemperature(int fd, double *Temp); 71 72 double bmp_altitude(double p); 73 double bmp_qnh(double p, double StationAlt); 74 double bmp_ppl_DensityAlt(double PAlt, double Temp); 75 76 // Calibration values - These are stored in the BMP085/180 77 short int bmp_ac1; 78 short int bmp_ac2; 79 short int bmp_ac3; 80 unsigned short int bmp_ac4; 81 unsigned short int bmp_ac5; 82 unsigned short int bmp_ac6; 83 short int bmp_b1; 84 short int bmp_b2; 85 int bmp_b5; 86 short int bmp_mb; 87 short int bmp_mc; 88 short int bmp_md; 89 90 // HTU21D stuff 91 int HTU21D_checkCRC8(uint16_t data); 92 int HTU21D_GetHumidity(int fd, float *Pres); 93 int HTU21D_GetTemperature(int fd, float *Temp); 94 95 // TSL2561 stuff 96 void TSL2561_ReadSensorDetails(); 97 void TSL2561_Init(); 98 99 // PCF8574 100 void PCF8574_ReadChipDetails(); 101 int PCF8574_WritePin(uint8_t pin_number, uint8_t value); 102 int readByteI2C(int fd, uint8_t *byte, uint8_t i2c_addr); 103 int writeByteI2C(int fd, uint8_t byte, uint8_t i2c_addr); 104 105 // MCP23017 106 void MCP23017_Init(); 107 void MCP23017_ReadChipDetails(); 108 int MCP23017_WritePin(uint8_t pin_number, uint8_t value); 109 int I2CWriteReg16(int fd, uint8_t reg, uint16_t value); 110 int I2CReadReg16(int fd, unsigned char reg, i2c_data *data); 111 }; 112 113