#include <stdio.h>
#include <string.h>
#include "esp_sleep.h"
#include "nvs.h"
#include "nvs_flash.h"
#include "soc/rtc_cntl_reg.h"
#include "soc/sens_reg.h"
#include "driver/gpio.h"
#include "driver/rtc_io.h"
#include "driver/adc.h"
#include "driver/dac.h"
#include "esp32/ulp.h"
#include "ulp_main.h"
#include "ulp-activity.h"

extern const uint8_t ulp_main_bin_start[] asm("_binary_ulp_main_bin_start");
extern const uint8_t ulp_main_bin_end[]   asm("_binary_ulp_main_bin_end");
int uS_TO_S_FACTOR = 1000000;

// void ulp_sleep(float time_to_sleep)
// {
//     /* Reset sample counter */
//     ulp_sample_counter = 0;

//     /* Start the program */
//     esp_err_t err = ulp_run(&ulp_entry - RTC_SLOW_MEM);
//     ESP_ERROR_CHECK(err);

//     printf("\n\nRodando ULP\n\n");
//     ESP_ERROR_CHECK( esp_sleep_enable_ulp_wakeup() );
//     esp_deep_sleep(20*uS_TO_S_FACTOR);
// }

void init_ulp_config(int variation_limit)
{
    esp_err_t err = ulp_load_binary(0, ulp_main_bin_start,
            (ulp_main_bin_end - ulp_main_bin_start) / sizeof(uint32_t));
    ESP_ERROR_CHECK(err);

    /* Configure ADC channel */
    /* Note: when changing channel here, also change 'adc_channel' constant
       in adc.S */
    adc1_config_channel_atten(ADC1_CHANNEL_6, ADC_ATTEN_DB_11);
    adc1_config_width(ADC_WIDTH_BIT_12);
    adc1_ulp_enable();
    

    /* Set low and high thresholds, approx. 1.35V - 1.75V*/
    ulp_low_thr = variation_limit;
    ulp_high_thr = 2000;

    /* Set ULP wake up period to 1s */
    ulp_set_wakeup_period(0, 1 * 1000 * 1000);

    /* Disconnect GPIO12 and GPIO15 to remove current drain through
     * pullup/pulldown resistors.
     * GPIO12 may be pulled high to select flash voltage.
     */
    //rtc_gpio_isolate(GPIO_NUM_12);
    //rtc_gpio_isolate(GPIO_NUM_15);
    
    //esp_sleep_enable_timer_wakeup(30 * uS_TO_S_FACTOR);
    esp_deep_sleep_disable_rom_logging(); // suppress boot messages
}


