#pragma once
//
//    FILE: ADG729.h
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.1
//    DATE: 2024-07-03
// PURPOSE: Arduino Library for I2C ADG729 matrix switch. 2x4 Multiplexer.
//     URL: https://github.com/RobTillaart/ADG729
//          https://www.adafruit.com/product/5932


#include "Arduino.h"
#include "Wire.h"


#define ADG729_LIB_VERSION             (F("0.1.1"))


//  ERROR CODES (to be elaborated)
#define ADG729_OK                      0
#define ADG729_ERROR_I2C               -10  //  not used yet
#define ADG729_ERROR_CHANNEL           -20  //  not used yet



class ADG729
{
public:
  //  deviceAddress = 0x44 .. 0x47
  ADG729(uint8_t deviceAddress, TwoWire *wire = &Wire);

  bool    begin(uint8_t mask = 0x00);         //  default no channels enabled
  bool    isConnected();                      //  find address on I2C bus
  uint8_t getAddress();                       //  convenience function

  //  channel = 0..7
  uint8_t channelCount();
  bool    enableChannel(uint8_t channel);     //  enable channel NON exclusive
  bool    disableChannel(uint8_t channel);
  bool    selectChannel(uint8_t channel);     //  enable channel exclusive
  bool    isEnabled(uint8_t channel);
  bool    disableAllChannels();

  //  channel = 0..3
  //  sets both A and B with the same value.
  bool    enableAB(uint8_t channel);
  bool    disableAB(uint8_t channel);
  bool    selectAB(uint8_t channel);
  bool    isEnabledAB(uint8_t channel);
  //  A, B = 0..3
  //  sets A and B separately and uniquely.
  bool    select(uint8_t A, uint8_t B);


  //  mask = 0x00 .. 0xFF - every bit is a channel.
  //         although not for derived types.
  //  note 1:  these are set simultaneously.
  //  note 2:  these may include interrupt bits (in derived classes)
  bool    setChannelMask(uint8_t mask);
  uint8_t getChannelMask();


  //  set forced IO (default false)
  void    setForced(bool forced = false);
  bool    getForced();

  int     getError();


protected:
  uint8_t   _address;
  TwoWire*  _wire;
  uint8_t   _mask;    //  caching mask = status of channels
  bool      _forced;
  int       _error;
  uint8_t   _channels;
};


//  -- END OF FILE --

