/*
 * @File name    : driver_iic.h
 * @Author       : Bluetrum IOT Team
 * @Date         : 2023-02-15
 * @Description  : This file contains all the functions prototypes for the IIC library.
 * 
 * Copyright (c) by Bluetrum, All Rights Reserved.
 */
#ifndef _DRIVER_IIC_H
#define _DRIVER_IIC_H

#include "driver_com.h"

/**
 * @brief IIC IT and Flag Definition
 */
typedef enum {
    IIC_IT_DONE             = 0x01,
    IIC_IT_ACK              = 0x02,
} IIC_IT_TYPEDEF;

/**
 * @brief IIC Clock Source Enumeration
 */
typedef enum {
    IIC_CLK_RC2M            = 0x00000000,
    IIC_CLK_X24MDIV8        = 0x00800000,
} IIC_CLK_SOURCE_TYPEDEF;

/**
 * @brief IIC Role Mode Enumeration
 */
typedef enum {
    IIC_ROLE_MODE_MASTER                    = 0,
    IIC_ROLE_MODE_SLAVE                     = 1,
} IIC_ROLE_MODE_TYPEDEF;

/**
 * @brief IIC Data Sample Edge Selection In Slave Mode.
 */
typedef enum {
    IIC_SMP_SEL_FALLING                     = 0,
    IIC_SMP_SEL_RISING                      = 1,
} IIC_SMP_SEL_TYPEDEF;

/**
 * @brief IIC Transmit Direction Enumeration
 */
typedef enum {
    IIC_SEND_MODE           = 1,
    IIC_RECEIVE_MODE        = 2,
} IIC_TRANSMIT_MODE;

/**
 * @brief IIC Init Structure
 */
typedef struct {
    uint8_t                 scl_pose_div;
    uint8_t                 sda_hold_cnt;
    IIC_CLK_SOURCE_TYPEDEF  clk_source;
    IIC_ROLE_MODE_TYPEDEF   mode_sel;
} iic_init_typedef;

//--------------- Function used to configure iic or transmit data ---------------//
void iic_init(iic_init_typedef *iic_init_struct);
void iic_deinit(void);
void iic_cmd(FUNCTIONAL_STATE state);
STATUS_STATE iic_send_data(uint8_t dev_addr, uint16_t reg_addr, uint32_t data, uint8_t len, uint8_t timeout_ms);
STATUS_STATE iic_receive_data(uint8_t dev_addr, uint16_t reg_addr, uint32_t *data, uint8_t len, uint8_t timeout_ms);
//------------------- Function used to configure interrupt -------------------//
void iic_pic_config(isr_t isr, int pr, IIC_IT_TYPEDEF interrupt_type, FUNCTIONAL_STATE state);
FLAG_STATE iic_get_flag(IIC_IT_TYPEDEF interrupt_type);
void iic_clear_all_flag(void);
void iic_send_nack_en(FUNCTIONAL_STATE state);
void iic_smp_sel(IIC_SMP_SEL_TYPEDEF edge);

#endif // _DRIVER_IIC_H
