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