// Include MicroPython API.
#include "py/runtime.h"

enum {
    IOE_PIN_IN      = 0b00010,
    IOE_PIN_IN_PU   = 0b10000,
    IOE_PIN_OUT     = 0b00001,
    IOE_PIN_OD      = 0b00011,
    IOE_PIN_PWM     = 0b00101,
    IOE_PIN_ADC     = 0b01010,

    IOE_NUM_PINS    = 14,

    IOE_LOW         = 0,
    IOE_HIGH        = 1,
};

/***** Extern of Class Definition *****/
extern const mp_obj_type_t breakout_ioexpander_BreakoutIOExpander_type;

/***** Extern of Class Methods *****/
extern void BreakoutIOExpander_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
extern mp_obj_t BreakoutIOExpander_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args);
extern mp_obj_t BreakoutIOExpander_get_chip_id(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_set_address(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_get_adc_vref(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_set_adc_vref(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_enable_interrupt_out(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_disable_interrupt_out(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_get_interrupt_flag(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_clear_interrupt_flag(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_set_pin_interrupt(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_pwm_load(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_pwm_loading(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_pwm_clear(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_pwm_clearing(mp_obj_t self_in);
extern mp_obj_t BreakoutIOExpander_set_pwm_control(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_set_pwm_period(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_get_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_set_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_input(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_input_as_voltage(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_output(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_setup_rotary_encoder(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutIOExpander_read_rotary_encoder(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);