#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#define PORT0_NI DT_NODELABEL(gpio0)
#define PORT1_NI DT_NODELABEL(gpio1)
const struct  device *port0 = DEVICE_DT_GET(PORT0_NI);
const struct  device *port1 = DEVICE_DT_GET(PORT1_NI);

#define LED_G 6
#define Butt 6

bool F_Butt_Off;
uint16_t Count_Butt;

// static void TIMER1_IRQHandler(void)
// {
//         if(NRF_TIMER1->EVENTS_COMPARE[0] != 0)
//         {
//                 NRF_TIMER1->EVENTS_COMPARE[0]=0;  
//                 gpio_pin_toggle(port0,LED_G);
//                 printf("Ubehlo 5 sekund.\n");
//         }
      
// }

// static void Start_Timer1(void)
// {
//         NRF_TIMER1->TASKS_CLEAR = 1;
//         NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer;
//         NRF_TIMER1->SHORTS = TIMER_SHORTS_COMPARE0_CLEAR_Enabled;       // automaticky vynuluje TIMER4 po compare ???
        
//         NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_24Bit;
//         NRF_TIMER1->PRESCALER = 9;   // nie je možné použiť v Counter mode = 512
//         NRF_TIMER1->CC[0] = 156250;       // set value compare register 0 = 16MHz / 156250 / 512 = 5s = 0,2Hz
        
//         NRF_TIMER1->INTENSET = (TIMER_INTENCLR_COMPARE0_Enabled << TIMER_INTENCLR_COMPARE0_Pos);        // enable interrupt compare CC[0]

//         IRQ_DIRECT_CONNECT(TIMER1_IRQn, IRQ_PRIO_LOWEST, TIMER1_IRQHandler, 0);
//         irq_enable(TIMER1_IRQn);
//         NRF_TIMER1->TASKS_START=1;
// }


static void RTC0_IRQHandler(void)
{
        if(NRF_RTC0->EVENTS_COMPARE[1]!=0)
        {
                NRF_RTC0->EVENTS_COMPARE[1]=0;
                NRF_RTC0->TASKS_CLEAR=1;
                // gpio_pin_toggle(port0,LED_G);
                //gpio_pin_set(port0,LED_G,0);
                //printf("RTC0 IRQ 5 sec.\n");
                // uint32_t RTC0_Value;
                // RTC0_Value = NRF_RTC0->COUNTER;
                // printk("RTC0 = %d\n\r", RTC0_Value);
        }
}

static void Start_RTC0(void)
{
        NRF_RTC0->TASKS_STOP=1;
        NRF_RTC0->TASKS_CLEAR=1;
        NRF_RTC0->PRESCALER=0;
        
        NRF_RTC0->INTENSET=(RTC_INTENSET_COMPARE1_Enabled << RTC_INTENSET_COMPARE1_Pos);        
        // NRF_RTC0->INTENSET=( 1<<16);
        NRF_RTC0->EVTENSET=(RTC_EVTENSET_COMPARE1_Enabled << RTC_EVTENSET_COMPARE1_Pos);     
        //NRF_RTC0->EVTENSET=(1<<16);
        NRF_RTC0->CC[1]=163840;                //163840;
        IRQ_DIRECT_CONNECT(RTC0_IRQn, IRQ_PRIO_LOWEST, RTC0_IRQHandler,0);
        irq_enable(RTC0_IRQn);
        NRF_RTC0->TASKS_START=1;
}

int main(void)
{
        gpio_pin_configure(port0, LED_G, GPIO_OUTPUT);
        // Nastavenie pre Port1 - pin 6 = P1.06, Priamo register PIN_CFG
        NRF_P1->PIN_CNF[Butt] = 0b1100;

        gpio_pin_set(port0, LED_G, 0);

        // __disable_irq();
        irq_disable(RTC1_IRQn);
        
        Start_RTC0();

        // Start_Timer1();

        while(1)
        {
                if(gpio_pin_get(port1, Butt))
                {
                        F_Butt_Off=1;
                        Count_Butt=0;
                        //gpio_pin_set(port0, LED_G, 1);
                }
                else
                {
                        if(++Count_Butt>32000)
                        {
                                Count_Butt=32000;
                                //gpio_pin_set(port0, LED_G, 0);
                        }
                }

                if(Count_Butt==32000)
                {
                        if(F_Butt_Off)
                        {
                                F_Butt_Off=0;
                                // gpio_pin_toggle(port0,LED_G);
                                NRF_RTC0->TASKS_CLEAR=1;
                                gpio_pin_set(port0,LED_G, 1);

                                NRF_P1->PIN_CNF[Butt] = 0;

                                //printk("WFI activated.\n");
                                uint32_t RTC0_Value;
                                RTC0_Value = NRF_RTC0->COUNTER;
                                //printk("RTC0 = %d\n\r", RTC0_Value);
                                __WFI();
                                RTC0_Value = NRF_RTC0->COUNTER;
                                //printk("WakeUP - RTC0 = %d\n\r", RTC0_Value);
                                gpio_pin_set(port0,LED_G, 0);

                                NRF_P1->PIN_CNF[Butt] = 0b1100;
                        }
                }

                // if(NRF_RTC0->EVENTS_COMPARE[1]!=0)
                // {
                //         NRF_RTC0->EVENTS_COMPARE[1]=0;
                //         NRF_RTC0->TASKS_CLEAR=1;
                //         uint32_t RTC0_Value;
                //         RTC0_Value = NRF_RTC0->COUNTER;
                //         // k_msleep(100);
                //         printk("RTC0 = %d\n\r", RTC0_Value);

                //         gpio_pin_toggle(port0,LED_G);
                //         // k_msleep(100);
                //         printk("Ubehlo 5 sekund.\n");
                // }

        }

        return 0;
}
