#ifndef __MGOS_GPIO_H
#define __MGOS_GPIO_H

#include "mgos.h"

enum mgos_gpio_mode {
  MGOS_GPIO_MODE_INPUT  = 0, /* input mode */
  MGOS_GPIO_MODE_OUTPUT = 1  /* output mode */
};

enum mgos_gpio_pull_type {
  MGOS_GPIO_PULL_NONE = 0,
  MGOS_GPIO_PULL_UP   = 1, /* pin is pilled to the high voltage */
  MGOS_GPIO_PULL_DOWN = 2  /* pin is pulled to the low voltage */
};

enum mgos_gpio_int_mode {
  MGOS_GPIO_INT_NONE     = 0,
  MGOS_GPIO_INT_EDGE_POS = 1, /* positive edge */
  MGOS_GPIO_INT_EDGE_NEG = 2, /* negative edge */
  MGOS_GPIO_INT_EDGE_ANY = 3, /* any edge - positive or negative */
  MGOS_GPIO_INT_LEVEL_HI = 4, /* high voltage level */
  MGOS_GPIO_INT_LEVEL_LO = 5  /* low voltage level */
};

typedef void (*mgos_gpio_int_handler_f)(int pin, void *arg);

bool mgos_gpio_set_mode(int pin, enum mgos_gpio_mode mode);
void mgos_gpio_write(int pin, bool level);

bool mgos_gpio_set_button_handler(int pin, enum mgos_gpio_pull_type pull_type,
                                  enum mgos_gpio_int_mode int_mode,
                                  int debounce_ms, mgos_gpio_int_handler_f cb,
                                  void *arg);
bool mgos_gpio_read(int pin);

void mgos_gpio_inject(int pin);


#endif // __MGOS_GPIO_H