// KCO 2010.6.5
// main.c
#include "common.h"
#include "lcd.h"
#include "key.h"
#include "adc.h"

int mcnt=0;

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;

void gpio_init(void){
    //*********************** GPIO Init *****************************
    // Enable GPIO clock and release reset
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
                         RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC,
                         ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA |
                         RCC_APB2Periph_GPIOB |
                         RCC_APB2Periph_GPIOC,
                         DISABLE);
    // GPIO init.
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | 
       GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | 
       GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    OFF_LED1;    OFF_LED2;   OFF_LED3;   OFF_LED4;
    OFF_LED5;    OFF_LED6;   OFF_LED7;   OFF_LED8;
}
void timer1_init(void){
    //************************ Timer1 Init **************************
    // Enable Timer1 clock and release reset
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1,DISABLE);
    
    // Set timer period 100 usec
    TIM1_TimeBaseInitStruct.TIM_Prescaler = 72-1;  // 1us resolution
    TIM1_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM1_TimeBaseInitStruct.TIM_Period = 100-1;  // 100 us
    TIM1_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV2;   // for 36MHz
    TIM1_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseInitStruct);
    // Clear update interrupt bit
    TIM_ClearITPendingBit(TIM1,TIM_FLAG_Update);
    // Enable update interrupt
    TIM_ITConfig(TIM1,TIM_FLAG_Update,ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    // Enable timer counting
    TIM_Cmd(TIM1,ENABLE);
}

void TIM1_UP_IRQHandler(void){  // Timer1 interrupt routine
    // Clear update interrupt bit
    TIM_ClearITPendingBit(TIM1,TIM_FLAG_Update);
    check_period_flag();
    T_LED1;
}
void	key_down_proc(BYTE c){
	lcd_gotoxy(0,3);
	switch(c){
		case 0:
			lcd_puts("DN0");
			break;
		case 1:
			lcd_puts("DN1");
			break;
		case 2:
			lcd_puts("DN2");
			break;
		case 3:
			lcd_puts("DN3");
			break;
		case 4:
			lcd_puts("DN4");
			break;
		default:	
			break;
	}
}

void	key_up_proc(BYTE c){
	lcd_gotoxy(0,3);
	switch(c){
		case 0:
			lcd_puts("UP0");
			break;
		case 1:
			lcd_puts("UP1");
			break;
		case 2:
			lcd_puts("UP2");
			break;
		case 3:
			lcd_puts("UP3");
			break;
		case 4:
			lcd_puts("UP4");
			break;
		default:	
			break;
	}
}
BYTE	key_cnt=0;
void	key_cont_proc(BYTE c){
	lcd_gotoxy(5,3);
	switch(c){
		case 0:
			lcd_hex2(key_cnt++);
			break;
		case 1:
			lcd_hex2(key_cnt++);
			break;
		case 2:
			lcd_hex2(key_cnt++);
			break;
		case 3:
			lcd_hex2(key_cnt++);
			break;
		case 4:
			lcd_hex2(key_cnt++);
			break;
		default:	
			break;
	}
}

WORD	key_code;
void	key_process(void){
WORD	i,c;
	key_code = key5_proc();
	for(i=0;i<5;i++){
	  	c = (key_code>>(2*i) )& 0x03;
		if(c == KEY_CONT) key_cont_proc(i);
		else if(c == KEY_DOWN) key_down_proc(i);
		else if(c == KEY_UP) key_up_proc(i);
	}
}

u16 adc8_data;

int main(void){

    /* Setup STM32 system (clock, PLL and Flash configuration) */
    SystemInit();
    
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    
    gpio_init();
    timer1_init();
	lcd_init(20,4);
    key_init();
    init_adc();

	lcd_gotoxy(0,0);
	lcd_puts("*** ADC Test ***");

    while(1){
	    if(flag_1ms){
	    	flag_1ms = 0;
	    }
	    if(flag_2ms){
	    	flag_2ms = 0;
	    }
	    if(flag_10ms){
	    	flag_10ms = 0;
			key_process();
		}
	    if(flag_100ms){
	    	flag_100ms = 0;
            
            ON_LED2;
            adc8_data = get_adc(8);
            OFF_LED2;
            lcd_gotoxy(0,1);
            lcd_printf("mcnt=%04X",mcnt++);
            lcd_gotoxy(0,2);
            lcd_printf("ADC8=%04X(%5d)",adc8_data,adc8_data);
		}
	    if(flag_300ms){
	    	flag_300ms = 0;
		}
    }
}
