/*
**
**                           Main.c
**
**
**********************************************************************/
/*
   Last committed:     $Revision: 00 $
   Last changed by:    $Author: $
   Last changed date:  $Date:  $
   ID:                 $Id:  $

**********************************************************************/
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"

int main(void)
{

///* Set Clocks *///
    //* AHB1 - GPIO-A, GPIO-D *//
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD, ENABLE);
    //* APB1 - Timer2 *//
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    //* APB2 - SYSCFG *//
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

///* GPIO *///
    //* Port A *//
    /* PA0 - UserButtonInput */
    GPIO_InitTypeDef GPIO_ButtonInput;
    GPIO_ButtonInput.GPIO_Pin   = GPIO_Pin_0; // PA0
    GPIO_ButtonInput.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_ButtonInput.GPIO_OType = GPIO_OType_PP;
    GPIO_ButtonInput.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_ButtonInput.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_ButtonInput);
    /* PA15 - PhaseInput */
    GPIO_InitTypeDef GPIO_PhaseInput;
    GPIO_PhaseInput.GPIO_Pin    = GPIO_Pin_15; // PA15
    GPIO_PhaseInput.GPIO_Mode   = GPIO_Mode_IN;
    GPIO_PhaseInput.GPIO_OType  = GPIO_OType_PP;
    GPIO_PhaseInput.GPIO_Speed  = GPIO_Speed_100MHz;
    GPIO_PhaseInput.GPIO_PuPd   = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_PhaseInput);
    //* Port D *//
    /* PD12,13,14,15 - LEDsOutput */
    GPIO_InitTypeDef GPIO_LEDsOutput;
    GPIO_LEDsOutput.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; // PD12, PD13, PD14, PD15
    GPIO_LEDsOutput.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_LEDsOutput.GPIO_OType = GPIO_OType_PP;
    GPIO_LEDsOutput.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_LEDsOutput.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_LEDsOutput);

///* Interrupts *///
    //* Interrupt PA15*//
    /* Set PA15 to EXTI Line 15 */
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource15);
    /* Set ExternTriggerLine 15 */
    EXTI_InitTypeDef EXTI_PA15;
    EXTI_PA15.EXTI_Line    = EXTI_Line15;
    EXTI_PA15.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_PA15.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_PA15.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_PA15);
    /* Set Trigger to ExternTriggerLine10:15 */
    NVIC_InitTypeDef NVIC_Line10_15;
    NVIC_Line10_15.NVIC_IRQChannel                   = EXTI15_10_IRQn;
    NVIC_Line10_15.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_Line10_15.NVIC_IRQChannelSubPriority        = 0;
    NVIC_Line10_15.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_Line10_15);

///* Timers *///
    //* Timer2 Configuration - max loopTime 4294.967296s; set to: LoopTime 5s - 1µs per step *//
    int TimerStepInt = 0.000001;    // in seconds
    int TimerPeriod  = 5;           // in seconds
    TIM_TimeBaseInitTypeDef TIM_Timer2;
    TIM_Timer2.TIM_ClockDivision      = TIM_CKD_DIV1;
    TIM_Timer2.TIM_CounterMode        = TIM_CounterMode_Up;
    TIM_Timer2.TIM_Period             = (TimerPeriod / TimerStepInt) - 1;
    TIM_Timer2.TIM_Prescaler          = (SystemCoreClock / (1 / TimerStepInt)) - 1;
    TIM_Timer2.TIM_RepetitionCounter  = 0;
    TIM_TimeBaseInit(TIM2, &TIM_Timer2);

    while(1)
    {

        /* Set BLUE LED Off from switch */
        int PA0BIT = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
        if (PA0BIT == Bit_SET)
        {
            GPIO_WriteBit(GPIOD, GPIO_Pin_15, Bit_RESET); //PD15 LED Off

        }
        else
        {
            GPIO_WriteBit(GPIOD, GPIO_Pin_15, Bit_SET); //PD15 LED On

        }

        printf("\fPA0 = %i\n",PA0BIT);

    }
}
