Skip to content

File T67XX.h

File List > firmware > T67XX.h

Go to the documentation of this file

#ifndef T67XX_H
#define T67XX_H
#include <Arduino.h>
#include <Wire.h>

#define T67XX_DEFAULT_I2C_ADDR 0x15

#define T67XX_REG_VAL_ENABLE 0xFF00

#define T67XX_REG_VAL_DISABLE 0x0000

#define T67XX_READ_DELAY 10

#define T67XX_MEASURE_DELAY 2250

enum Modbus_FC {
  MODBUS_READ_COIL = 0x01,                        
  MODBUS_READ_DISCRETE_INPUT = 0x02,              
  MODBUS_READ_MULTIPLE_HOLDING_REGISTERS = 0x03,  
  MODBUS_READ_INPUT_REGISTERS = 0x04,             
  MODBUS_WRITE_SINGLE_COIL = 0x05,                
  MODBUS_WRITE_SINGLE_REGISTER = 0x06,            
  MODBUS_WRITE_MULTIPLE_COILS = 0x0F,             
  MODBUS_WRITE_MULTIPLE_REGISTERS = 0x10,         
};

enum T67XX_Registers {
  T67XX_REG_FIRMWARE = 0x1389,      
  T67XX_REG_STATUS = 0x138A,        
  T67XX_REG_PPM = 0x138B,           
  T67XX_REG_RESET = 0x03E8,         
  T67XX_REG_SPCAL = 0x03EC,         
  T67XX_REG_FLASH_UPDATE = 0x03ED,  
  T67XX_REG_ADDRESS = 0x0FA5,       
  T67XX_REG_ABC_LOGIC = 0x03EE,     
  T67XX_REG_MOD_MODE = 0x100B       
};

class T67XX {
public:
  T67XX(TwoWire* pWire = &Wire, uint8_t deviceAddress = T67XX_DEFAULT_I2C_ADDR)
    : _pWire(pWire), _deviceAddr(deviceAddress){};

  ~T67XX(){};

  bool begin(void);

  uint16_t readPPM(void);

  uint16_t getStatus(void);

  uint16_t getFirmwareVersion(void);

  void reset(void);
  void enableABCMode(void);

  void disableABCMode(void);
  uint8_t setSlaveAddress(uint8_t newAddress);

  void flashUpdate(void);

  bool beginCalibration(bool waitForCompletion = false);

  void endCalibration(void);

  String getStatusMsg(void);

  union StatusRegister {

    uint16_t raw_value;

    struct {
      uint16_t ERROR : 1;              
      uint16_t FLASH_ERROR : 1;        
      uint16_t CALIBRATION_ERROR : 1;  
      uint16_t : 7;                    
      uint16_t REBOOT : 1;             
      uint16_t WARMUP : 1;             
      uint16_t : 3;                    
      uint16_t SINGLE_POINT_CAL : 1;   
    } bits;
  };

private:
  uint8_t _data[6];

  uint8_t read8(uint16_t registerAddress);

  uint16_t read16(uint16_t registerAddress);

  uint8_t write8(uint16_t registerAddress, uint8_t data);

  uint16_t write16(uint16_t registerAddress, uint16_t data);

  TwoWire* _pWire;

  StatusRegister _status;

  uint8_t _deviceAddr;
};

#endif  // T67XX_H