
#include "board.h"
#include "stm32f10x.h"



/*

输入通道对应关系
PC3|PC2|PC1|PC0|PB9|PB8|PB7|PB6|PB5|PC12
IN0|IN1|IN2|IN3|IN4|IN5|IN6|IN7|IN8|IN9

*/

#define GPIO_Initer() {.GPIO_Speed=GPIO_Speed_50MHz,\
  .GPIO_Mode=GPIO_Mode_IPU,\
}


typedef struct{
  const char *name;
  void (*gpio_clock_fun)(uint32_t,FunctionalState);
  uint32_t gpio_rcc;
  GPIO_TypeDef *gpio_base;
  uint16_t gpio_pin;
  volatile uint32_t *bitmap_pin;
}gpioin_dtb;




static const gpioin_dtb g_dtb[]={
  {
    .name="gpioin0",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOC,
    .gpio_base=GPIOC,
    .gpio_pin=3,
    .bitmap_pin=&PININ(C,3),
  },
  {
    .name="gpioin1",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOC,
    .gpio_base=GPIOC,
    .gpio_pin=2,
    .bitmap_pin=&PININ(C,2),
  },
  {
    .name="gpioin2",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOC,
    .gpio_base=GPIOC,
    .gpio_pin=1,
    .bitmap_pin=&PININ(C,1),
  },
  {
    .name="gpioin3",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOC,
    .gpio_base=GPIOC,
    .gpio_pin=0,
    .bitmap_pin=&PININ(C,0),
  },
  {
    .name="gpioin4",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOB,
    .gpio_base=GPIOB,
    .gpio_pin=9,
    .bitmap_pin=&PININ(B,9),
  },
  {
    .name="gpioin5",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOB,
    .gpio_base=GPIOB,
    .gpio_pin=8,
    .bitmap_pin=&PININ(B,8),
  },
  {
    .name="gpioin6",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOB,
    .gpio_base=GPIOB,
    .gpio_pin=7,
    .bitmap_pin=&PININ(B,7),
  },
  {
    .name="gpioin7",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOB,
    .gpio_base=GPIOB,
    .gpio_pin=6,
    .bitmap_pin=&PININ(B,6),
  },
  {
    .name="gpioin8",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOB,
    .gpio_base=GPIOB,
    .gpio_pin=5,
    .bitmap_pin=&PININ(B,5),
  },
  {
    .name="gpioin9",
    .gpio_clock_fun=RCC_APB2PeriphClockCmd,
    .gpio_rcc=RCC_APB2Periph_GPIOC,
    .gpio_base=GPIOC,
    .gpio_pin=12,
    .bitmap_pin=&PININ(C,12),
  },
};


typedef struct{
  const gpioin_dtb *dtb;
}self_data;


static self_data g_self[LENGTH(g_dtb)];


def_find_fun(gpioin_dtb,g_dtb)




static int init(gpioin_def *g)
{
  param_check(g);
  if(g->private_data) return 0;
  GPIO_InitTypeDef init=GPIO_Initer();
  int index;
  const gpioin_dtb *dtb=find(g->name,&index);
  self_data *self=&g_self[index];
  self->dtb=dtb;
  g->private_data=self;

  dtb->gpio_clock_fun(dtb->gpio_rcc,ENABLE);
	init.GPIO_Pin = 1<<dtb->gpio_pin;	 
	GPIO_Init(dtb->gpio_base, &init);	
  return 0;
}


static int deinit(gpioin_def *g)
{
  return 0;
}


static int state(gpioin_def *g)
{
  param_check(g);
  param_check(g->private_data);
  self_data *self=g->private_data;
  // 电路上0为导通，逻辑上1为真，这里反向
  return !(*self->dtb->bitmap_pin);
}



gpioin_init_export(gpioin0,init,deinit,state,0)
gpioin_init_export(gpioin1,init,deinit,state,0)
gpioin_init_export(gpioin2,init,deinit,state,0)
gpioin_init_export(gpioin3,init,deinit,state,0)
gpioin_init_export(gpioin4,init,deinit,state,0)
gpioin_init_export(gpioin5,init,deinit,state,0)
gpioin_init_export(gpioin6,init,deinit,state,0)
gpioin_init_export(gpioin7,init,deinit,state,0)
gpioin_init_export(gpioin8,init,deinit,state,0)
gpioin_init_export(gpioin9,init,deinit,state,0)


