/**
 * \file    sys_gpio.h
 * \brief   
 * 
 * \par     Copyright (c) 2018 UWE Technologies Corp., Ltd. All Rights Reserved.
 * \author  James
 * \date    2018-03-20
 * \version 
 * 
 * \history 
 *  Date        Note
 *  2018-03-20  Original Creation
 * 
 */
 
#ifndef __SYS_GPIO_H_
#define __SYS_GPIO_H_

#include "drv_gpio.h"
#include "sys_defs.h"


/** \brief System GPIO initialization
 *
 */
#define SYS_IO_VBUS_EN                  DRV_GPIO_0

#define SYS_IO_LED1                     DRV_GPIO_28

#define SYS_IO_LED2                     DRV_GPIO_30

#define SYS_IO_LED3                     DRV_GPIO_18

#define SYS_IO_LED4                     DRV_GPIO_19

#define SYS_IO_LED5                     DRV_GPIO_1

#define SYS_IO_LED6                     DRV_GPIO_2

#define SYS_IO_LED7                     DRV_GPIO_4

#define SYS_IO_VCONN1_EN                DRV_GPIO_5

#define SYS_IO_VCONN2_EN                DRV_GPIO_15

#define SYS_IO_VBUS_DET                 DRV_GPIO_6

#define SYS_IO_DC_CHIP_EN               DRV_GPIO_9

#define SYS_IO_SNK_REQUEST              DRV_GPIO_12

#define SYS_IO_PWM_350                  DRV_GPIO_14

#define SYS_IO_VBUS_DISCHARGE           DRV_GPIO_17

#define SYS_IO_OLED_DC                  DRV_GPIO_13

#define SYS_IO_SPI_CS                   DRV_GPIO_16

#define SYS_IO_SPI_SCL                  DRV_GPIO_20

#define SYS_IO_SPI_SDA                  DRV_GPIO_22

#define SYS_IO_OLED_RESET               DRV_GPIO_21

#define SYS_IO_PWM_OLED                 DRV_GPIO_3

           
void sys_gpio_init(void);


#define sys_gpio_snk_request_detected()        (!drv_gpio_val_get(SYS_IO_SNK_REQUEST))

#define sys_gpio_power_down_set(en)

#define sys_gpio_vbus_source_en_get()       drv_gpio_val_get(SYS_IO_VBUS_EN)
#define sys_gpio_vbus_source_en_set(flg)    drv_gpio_val_set(SYS_IO_VBUS_EN,flg)

#define sys_gpio_vbus_dc_en_get()           drv_gpio_val_get(SYS_IO_DC_CHIP_EN)
#define sys_gpio_vbus_dc_en_set(flg)        drv_gpio_val_set(SYS_IO_DC_CHIP_EN,(!flg))

#define sys_gpio_vconn1_set(en)             drv_gpio_val_set(SYS_IO_VCONN1_EN,en)
#define sys_gpio_vconn2_set(en)             drv_gpio_val_set(SYS_IO_VCONN2_EN,en)

#define sys_gpio_vconn1_get()               drv_gpio_val_get(SYS_IO_VCONN1_EN)
#define sys_gpio_vconn2_get()               drv_gpio_val_get(SYS_IO_VCONN2_EN)

#define sys_gpio_vbus_discharge_en_get()       drv_gpio_val_get(SYS_IO_VBUS_DISCHARGE)
#define sys_gpio_vbus_discharge_en_set(flg)    drv_gpio_val_set(SYS_IO_VBUS_DISCHARGE,flg)


#define SYS_USBC_VBUS_ADC_ID                DRV_ADC_CHN_DP1
/** VBUS ADC reference voltage constant = 1/(Rdown/(Rdown+Rup))
 *  Rdown = 200KOhm, Rup = 1000KOhm
 *  Constant = 1 / (100/(100+2000)) = 21
 */
#define SYS_USBC_VBUS_ADC_CONSTANT          (21U)


void sys_gpio_uart0_enable_set(bool_t en);
void sys_gpio_uart1_enable_set(bool_t en);

/** GPIO in capture sample codes */
void sys_gpio_in_capture_handler_init();
void sys_gpio_in_capture0_isr(u32_t arg);
void sys_gpio_in_capture1_isr(u32_t arg);


void sys_gpio_uart0_disable();
void sys_gpio_uart0_enable(void);

#if ((SYS_LED_ENABLED)&&(!SYS_SMG_DISPLAY_ENABLED))


typedef enum SYS_GPIO_SRC_CAP_LED_INDEX_e
{
    SYS_GPIO_SRC_CAP_LED_1,
    SYS_GPIO_SRC_CAP_LED_2, 
    SYS_GPIO_SRC_CAP_LED_3, 
    SYS_GPIO_SRC_CAP_LED_4, 
    SYS_GPIO_SRC_CAP_LED_5, 
    SYS_GPIO_SRC_CAP_LED_6, 
    SYS_GPIO_SRC_CAP_LED_7, 
    SYS_GPIO_SRC_CAP_LED_INVALID
} SYS_GPIO_BAT_CAP_LED_INDEX_t;

void sys_gpio_src_cap_led_control(u32_t bitmap);

#if 0  /* modified by James Gan - 2019-07-08, disabled Low effective */
#define sys_gpio_src_cap_led_bitmap(led_id)  ((~((1 << ((led_id)+1)) - 1)) & ((1 << SYS_LED_NUM) - 1))
#define sys_gpio_src_cap_led_off() \
    do { \
        sys_gpio_src_cap_led_control(((1<<SYS_LED_NUM)-1)); \
    } while(0)
#else
#define sys_gpio_src_cap_led_bitmap(led_id)  (((1 << ((led_id)+1)) - 1) & ((1 << SYS_LED_NUM) - 1))
#define sys_gpio_src_cap_led_off() \
    do { \
        sys_gpio_src_cap_led_control(0); \
    } while(0)
#endif /* #if 0 */


#define sys_gpio_src_cap_led_on(led_id) \
    do { \
        sys_gpio_src_cap_led_control((1 << (led_id))); \
    } while(0)

#define sys_gpio_src_cap_full_led_on() \
    do { \
        sys_gpio_src_cap_led_control(sys_gpio_src_cap_led_bitmap(SYS_GPIO_SRC_CAP_LED_7)); \
    } while(0)
#define sys_gpio_src_cap_full_led_off() \
    do { \
        sys_gpio_src_cap_led_control(0); \
    } while(0)


/*0: off; 1: first; 2: first+second ... */
#define sys_gpio_bat_cap_led_step_on(num) \
	do { \
		if (0 < (num)) \
		{ \
			sys_gpio_src_cap_led_control(sys_gpio_src_cap_led_bitmap((num) - 1)); \
		} else \
		{ \
			sys_gpio_src_cap_led_off(); \
		} \
	} while(0)

#else
#define sys_gpio_src_cap_led_off() 
#define sys_gpio_src_cap_led_on(pos)
#define sys_gpio_src_cap_full_led_on()
#define sys_gpio_src_cap_led_step_on(num)
#endif


#endif /* #ifndef __SYS_GPIO_H_ */


