/*
 * timer_flash_asymmetric.c
 *
 *  Created on: Nov 12, 2017
 *      Author: corrado
 */

#include <stdio.h>
#include "stm32_unict_lib.h"

int flash_on = 0;

int light_index = 0;
int light_values[5] = { 50, 100, 200, 400, 800 };

int main()
{
    GPIO_init(GPIOB);
    GPIO_init(GPIOC);

    GPIO_config_output(GPIOB,0);
    GPIO_config_output(GPIOC,2);
    GPIO_config_output(GPIOC,3);

    GPIO_config_input(GPIOB, 10);
    GPIO_config_EXTI(GPIOB, EXTI10);
    EXTI_enable(EXTI10, FALLING_EDGE);

    GPIO_config_input(GPIOB, 5);
    GPIO_config_EXTI(GPIOB, EXTI5);
    EXTI_enable(EXTI5, FALLING_EDGE);

    GPIO_config_input(GPIOB, 6);
    GPIO_config_EXTI(GPIOB, EXTI6);
    EXTI_enable(EXTI6, FALLING_EDGE);

    TIM_init(TIM2);
    TIM_config_timebase(TIM2, 420, 1000);
    // prescaler pari a 420
    // fcy = 84MHz
    // tempo di incremento del contatore = 0.005ms
    TIM_enable_irq(TIM2, IRQ_UPDATE);
    TIM_on(TIM2);

    for (;;) {
    }
}

void TIM2_IRQHandler(void)
{
	if (TIM_update_check(TIM2)) {
		if (flash_on) {
			if (GPIO_read(GPIOB,0)) {
				// era acceso, dobbiamo spegnerlo
				GPIO_write(GPIOB,0,0);
				TIM2->ARR = 800; // Toff
			}
			else {
				// era spento, dobbiamo accenderlo
				GPIO_write(GPIOB,0,1);
				TIM2->ARR = light_values[light_index]; // Ton
			}
		}
		else
			GPIO_write(GPIOB, 0, 1);
		TIM_update_clear(TIM2);
	}
}

// pushbutton 'X'
void EXTI15_10_IRQHandler(void)
{
	if (EXTI_isset(EXTI10)) {
		flash_on = !flash_on;
		EXTI_clear(EXTI10);
	}
}

void EXTI9_5_IRQHandler(void)
{
        if (EXTI_isset(EXTI5)) {
                // pushbutton 'Z'
        		if (flash_on && light_index > 0)
        			--light_index;
                EXTI_clear(EXTI5);
        }

        if (EXTI_isset(EXTI6)) {
                // pushbutton 'T'
        		if (flash_on && light_index < 4)
        			++light_index;
                EXTI_clear(EXTI6);
        }
}

