#ifndef _PINNAMES_H_
#define _PINNAMES_H_

#include "cmsis.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    PORT_A = 0,
    PORT_B = 1,
    PORT_C = 2,
    PORT_D = 3,
    PORT_E = 4,
    PORT_F = 5,
    PORT_G = 6,
    PORT_H = 7,
    PORT_I = 8,
    PORT_J = 9,
    PORT_K = 10,

    PORT_V = 11,
    PORT_U = 12,
    PORT_MAX
} GPIO_PORT;

#define RTL_PIN_PERI(FUN, IDX, SEL) ((int)(((FUN) << 8) | ((IDX)<<4) | (SEL)))
#define RTL_PIN_FUNC(FUN, SEL)      ((int)(((FUN) << 7) | (SEL)))
#define RTL_GET_PERI_SEL(peri)      ((int)((peri)&0x0F))
#define RTL_GET_PERI_IDX(peri)      ((int)(((peri) >> 4)&0x0F))

typedef enum {
    PIN_INPUT=0,
    PIN_OUTPUT
} PinDirection;

typedef enum {
    PA_0  = (PORT_A<<4|0),
    PA_1  = (PORT_A<<4|1),
    PA_2  = (PORT_A<<4|2),
    PA_3  = (PORT_A<<4|3),
    PA_4  = (PORT_A<<4|4),
    PA_5  = (PORT_A<<4|5),
    PA_6  = (PORT_A<<4|6),
    PA_7  = (PORT_A<<4|7),

    PB_0  = (PORT_B<<4|0),
    PB_1  = (PORT_B<<4|1),
    PB_2  = (PORT_B<<4|2),
    PB_3  = (PORT_B<<4|3),
    PB_4  = (PORT_B<<4|4),
    PB_5  = (PORT_B<<4|5),
    PB_6  = (PORT_B<<4|6),
    PB_7  = (PORT_B<<4|7),

    PC_0  = (PORT_C<<4|0),
    PC_1  = (PORT_C<<4|1),
    PC_2  = (PORT_C<<4|2),
    PC_3  = (PORT_C<<4|3),
    PC_4  = (PORT_C<<4|4),
    PC_5  = (PORT_C<<4|5),
    PC_6  = (PORT_C<<4|6),
    PC_7  = (PORT_C<<4|7),
    PC_8  = (PORT_C<<4|8),
    PC_9  = (PORT_C<<4|9),

    PD_0  = (PORT_D<<4|0),
    PD_1  = (PORT_D<<4|1),
    PD_2  = (PORT_D<<4|2),
    PD_3  = (PORT_D<<4|3),
    PD_4  = (PORT_D<<4|4),
    PD_5  = (PORT_D<<4|5),
    PD_6  = (PORT_D<<4|6),
    PD_7  = (PORT_D<<4|7),
    PD_8  = (PORT_D<<4|8),
    PD_9  = (PORT_D<<4|9),
  
    PE_0  = (PORT_E<<4|0),
    PE_1  = (PORT_E<<4|1),
    PE_2  = (PORT_E<<4|2),
    PE_3  = (PORT_E<<4|3),
    PE_4  = (PORT_E<<4|4),
    PE_5  = (PORT_E<<4|5),
    PE_6  = (PORT_E<<4|6),
    PE_7  = (PORT_E<<4|7),
    PE_8  = (PORT_E<<4|8),
    PE_9  = (PORT_E<<4|9),
    PE_A  = (PORT_E<<4|10),
  
    PF_0  = (PORT_F<<4|0),
    PF_1  = (PORT_F<<4|1),
    PF_2  = (PORT_F<<4|2),
    PF_3  = (PORT_F<<4|3),
    PF_4  = (PORT_F<<4|4),
    PF_5  = (PORT_F<<4|5),
//    PF_6  = (PORT_F<<4|6),
//    PF_7  = (PORT_F<<4|7),

    PG_0  = (PORT_G<<4|0),
    PG_1  = (PORT_G<<4|1),
    PG_2  = (PORT_G<<4|2),
    PG_3  = (PORT_G<<4|3),
    PG_4  = (PORT_G<<4|4),
    PG_5  = (PORT_G<<4|5),
    PG_6  = (PORT_G<<4|6),
    PG_7  = (PORT_G<<4|7),

    PH_0  = (PORT_H<<4|0),
    PH_1  = (PORT_H<<4|1),
    PH_2  = (PORT_H<<4|2),
    PH_3  = (PORT_H<<4|3),
    PH_4  = (PORT_H<<4|4),
    PH_5  = (PORT_H<<4|5),
    PH_6  = (PORT_H<<4|6),
    PH_7  = (PORT_H<<4|7),

    PI_0  = (PORT_I<<4|0),
    PI_1  = (PORT_I<<4|1),
    PI_2  = (PORT_I<<4|2),
    PI_3  = (PORT_I<<4|3),
    PI_4  = (PORT_I<<4|4),
    PI_5  = (PORT_I<<4|5),
    PI_6  = (PORT_I<<4|6),
    PI_7  = (PORT_I<<4|7),

    PJ_0  = (PORT_J<<4|0),
    PJ_1  = (PORT_J<<4|1),
    PJ_2  = (PORT_J<<4|2),
    PJ_3  = (PORT_J<<4|3),
    PJ_4  = (PORT_J<<4|4),
    PJ_5  = (PORT_J<<4|5),
    PJ_6  = (PORT_J<<4|6),
//    PJ_7  = (PORT_J<<4|7),

    PK_0  = (PORT_K<<4|0),
    PK_1  = (PORT_K<<4|1),
    PK_2  = (PORT_K<<4|2),
    PK_3  = (PORT_K<<4|3),
    PK_4  = (PORT_K<<4|4),
    PK_5  = (PORT_K<<4|5),
    PK_6  = (PORT_K<<4|6),
//    PK_7  = (PORT_K<<4|7),

    AD_1  = (PORT_V<<4|1),
    AD_2  = (PORT_V<<4|2),
    AD_3  = (PORT_V<<4|3),

    DA_0  = (PORT_U<<4|0),
    DA_1  = (PORT_U<<4|1),
    // Arduino connector namings
/*
    A0          = PA_0,
    A1          = PA_1,
    A2          = PA_4,
    A3          = PB_0,
    A4          = PC_1,
    A5          = PC_0,
    D0          = PA_3,
    D1          = PA_2,
    D2          = PA_10,
    D3          = PB_3,
    D4          = PB_5,
    D5          = PB_4,
    D6          = PB_10,
    D7          = PA_8,
    D8          = PA_9,
    D9          = PC_7,
    D10         = PB_6,
    D11         = PA_7,
    D12         = PA_6,
    D13         = PA_5,
    D14         = PB_9,
    D15         = PB_8,


    // Generic signals namings
    LED1        = PB_4,
    LED2        = PB_5,
    LED3        = PB_6,
    LED4        = PB_7,
    USER_BUTTON = PA_3,
    SERIAL_TX   = PA_7,
    SERIAL_RX   = PA_6,
    USBTX       = PA_7,
    USBRX       = PA_6,
    I2C_SCL     = PC_5,
    I2C_SDA     = PC_4,
    SPI_MOSI    = PC_2,
    SPI_MISO    = PC_3,
    SPI_SCK     = PC_1,
    SPI_CS      = PC_0,
    PWM_OUT     = PD_4,
*/
    // Not connected
    NC = (uint32_t)0xFFFFFFFF
} PinName;

typedef enum {
    PullNone  = 0,
    PullUp    = 1,
    PullDown  = 2,
    OpenDrain = 3,
    PullDefault = PullNone
} PinMode;

#define PORT_NUM(pin) (((uint32_t)(pin) >> 4) & 0xF)
#define PIN_NUM(pin)  ((uint32_t)(pin) & 0xF)

#ifdef __cplusplus
}
#endif

#endif