// KCO 2010.6.8
// main.c
#include "common.h"
#include "lcd.h"
#include "key.h"
#include "adc.h"
#include "i2c_eep.h"
#include "spi.h"

int mcnt=0;

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM1_TimeBaseInitStruct;

extern EEPROM_Info eeprom;
u32 eep_addr=0;

u8  spi_tx_run=1;

extern u16 spi2_rx_data[];
extern u8 spi2_rx_idx, spi2_rx_flag;
u16 spi1_tx_data[20];

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){
int i;
	switch(c){
		case 0: 
            for(i=0;i<8;i++) spi1_tx_data[i] = 0;
            send_spi1_datas(8, spi1_tx_data);
 			break;
		case 1:
            for(i=0;i<8;i++) spi1_tx_data[i] = 0xffff;
            send_spi1_datas(8, spi1_tx_data);
            break;
		case 2:
            for(i=0;i<8;i++) spi1_tx_data[i] = 0x3333;
            send_spi1_datas(8, spi1_tx_data);
			break;
		case 3:
            for(i=0;i<8;i++) spi1_tx_data[i] = 0xaaaa;
            send_spi1_datas(8, spi1_tx_data);
			break;
		case 4:
            spi_tx_run ^= 1;
            if(spi_tx_run){
                lcd_gotoxy(16,0);
                lcd_puts(" RUN");
            }
            else{
                lcd_gotoxy(16,0);
                lcd_puts("STOP");
            }
 			break;
		default:	
			break;
	}
}

void	key_up_proc(BYTE c){
	switch(c){
		case 0:
			break;
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		default:	
			break;
	}
}

BYTE	key_cnt=0;
void	key_cont_proc(BYTE c){
	switch(c){
		case 0:
			break;
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			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;

void main(void){
int i;
    /* 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();
    init_i2c_eep(AT24C16);  // for AT24C16
    init_spi1();    // SPI1: master mode    
    init_spi2();    // SPI2: slave mode

	lcd_gotoxy(0,0);
	lcd_puts("*** SPI Test *** RUN");
    while(1){
        if(spi2_rx_flag){
            spi2_rx_flag = 0;
            lcd_gotoxy(0,2);
            for(i=0;i<4;i++){
                lcd_hex4(spi2_rx_data[i]);
                lcd_putc(',');
            }

            lcd_gotoxy(0,3);
            for(i=0;i<4;i++){
                lcd_hex4(spi2_rx_data[4+i]);
                lcd_putc(',');
            }
            spi2_rx_idx = 0;
        }
	    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;
		}
	    if(flag_300ms){
	    	flag_300ms = 0;

            ON_LED2;    adc8_data = get_adc(8); OFF_LED2;
            lcd_gotoxy(0,1);    lcd_printf("mcnt=%04X",mcnt++);
            lcd_gotoxy(10,1);   lcd_printf("VR=%4d",adc8_data);

            if(spi_tx_run){
                for(i=0;i<8;i++) spi1_tx_data[i] = mcnt + i;
                send_spi1_datas(8, spi1_tx_data);
/*
                send_spi1_data(mcnt);
                send_spi1_data(mcnt+1);
                send_spi1_data(mcnt+2);
                send_spi1_data(mcnt+3);
                send_spi1_data(mcnt+4);
                send_spi1_data(mcnt+5);
                send_spi1_data(mcnt+6);
                send_spi1_data(mcnt+7);
*/
            }
		}
    }
}
