#ifndef _MCP4725_HPP_
#define _MCP4725_HPP_

#include <stdint.h>
#include <functional>

class MCP4725
{
	public:
		// address list
		enum i2c_addr
		{
			addr_0x0 = 0b01100000,
			addr_0x1 = addr_0x0 + 1,
			addr_0x2 = addr_0x0 + 1,
			addr_0x3 = addr_0x0 + 1,
			addr_0x4 = addr_0x0 + 1,
			addr_0x5 = addr_0x0 + 1,
			addr_0x6 = addr_0x0 + 1,
			addr_0x7 = addr_0x0 + 1
		}

		// power down impedance  modes
		enum pwrd_md
		{
			normal = 0x04,
			ohm_1k = 0x01,
			ohm_100k = 0x02,
			ohm_500k = 0x03
		};

		//using std::functional<uint8_t(uint8_t, uint8_t)> i2c_read_n_t;

		using i2c_write_n_t = std::functional<void(uint8_t, uint8_t*,uint8_t)>;

		MCP4725(pwrd_md power_down_mode,
			i2c_addr address,
			i2c_write_n_t i2c_write);

		MCP4725(i2c_addr address,
			i2c_write_n_t i2c_write);

		~MCP4725();
		
		void operator=(uint16_t dac_value);
		
		void operator==(uint16_t dac_and_eeprom_value);

		void write_dac_and_eeprom(uint16_t value);

		void set_powerdown_impedance(pwrd_md mode);

		i2c_addr get_i2c_addr();

		void set_power
		

	private:

		enum commands_t
		{
			fast_mode = 0x00,
			write_dac = 0x40,
			write_dac_and_eeprom = 0x60
		};

		i2c_addr address;
		pwrd_md power_down_mode;
		i2c_write_n_t i2c_write;
		uint16_t dac_value;
		uint16_t eeprom_value;

};

#endif // _MCP4725_HPP_
