#pragma once

#include "FreeRTOS.h"
#include "event_groups.h"
#include "avr/io.h"
#include "avr/interrupt.h"
// #include "stdlib.h"
// #include "stdint.h"
// #include "string.h"
#include "stdbool.h"
#include "stdio.h"

#ifdef __cplusplus
extern "C"
{
#endif

	typedef enum
	{
		AVR_FAIL = -1,
		AVR_OK,
		AVR_ERR_NO_MEM,
		AVR_ERR_INVALID_ARG,
		AVR_ERR_INVALID_STATE,
		AVR_ERR_INVALID_SIZE,
		AVR_ERR_NOT_FOUND,
		AVR_ERR_NOT_SUPPORTED,
		AVR_ERR_TIMEOUT,
		AVR_ERR_INVALID_RESPONSE,
		AVR_ERR_INVALID_CRC,
		AVR_ERR_INVALID_VERSION,
		AVR_ERR_NOT_FINISHED,
		AVR_ERR_NOT_ALLOWED
	} avr_err_t;

	avr_err_t zh_avr_i2c_master_init(const bool pullup);
	avr_err_t zh_avr_i2c_master_probe(const uint8_t addr, TickType_t xTicksToWait);
	avr_err_t zh_avr_i2c_master_transmit(const uint8_t addr, uint8_t *data, uint8_t size, TickType_t xTicksToWait);
	avr_err_t zh_avr_i2c_master_receive(const uint8_t addr, uint8_t *data, uint8_t size, TickType_t xTicksToWait);
	avr_err_t zh_avr_i2c_master_transmit_receive(const uint8_t addr, uint8_t *write_data, uint8_t write_size, uint8_t *read_data, uint8_t read_size, size_t delay);

#ifdef __cplusplus
}
#endif