#include "power_sleep_wake.h"
#include "pwr_sleep.h"

// ***********************************
// * 自动睡眠时间:  10s
// * 唤醒条件:      PB5 下降沿
// * 休眠条件:      PB5 持续3s低电平后恢复高电平
// * 唤醒条件:      PB5 持续3s低电平
// ***********************************

u32 tmr3_reg[2];
u8 sleep_flag = 0;

// 保存已使能的自定义外设
AT(.com_text.sleep)
void sleep_process_do(void)
{
    tmr3_reg[0] = TMR3->con;
    tmr3_reg[1] = TMR3->pr;
    TMR3->cnt = 0;
    TMR3->cpnd = (-1L);
    tmr_cmd(TMR3, DISABLE);
}

// 恢复自定义外设
AT(.com_text.sleep)
void wake_process_do(void)
{
    TMR3->con = tmr3_reg[0];
    TMR3->pr = tmr3_reg[1];
    tmr_cmd(TMR3, ENABLE);
}

AT(.com_rodata.isr)
const char str_2[] = "timer3_sleep_isq  \r\n";

// 自动休眠计时器
AT(.com_text.isr)
void timer3_sleep_isq(void)
{
    if (tmr_get_flag(TMR3, TMR_FLAG_UPDATE2) != RESET) {
        tmr_clear_flag(TMR3, TMR_FLAG_UPDATE2);
        sleep_flag = 1;
        printk(str_2);
    }
}


// 初始化控制IO和定时器
void power_sleep_wake_config(void)
{
    gpio_init_typedef gpio_init_structure;
    tmr_base_init_typedef tmr_base_init_struct;
    pmu_init(ENABLE);       // limit buck current.
    clock_gate1_cmd(CLOCK_GATE1_TMR3, ENABLE);

    gpio_init_structure.gpio_pin = GPIO_PIN_5;
    gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
    gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
    gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
    gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
    gpio_init(GPIOB_REG, &gpio_init_structure);

    tmr_base_init_struct.clock_source = TMR_INC_SOURCE;
    tmr_base_init_struct.increase_clock = TMR_COUNTER_RISING;
    tmr_base_init_struct.period = 5 * 1000000;                     // 5S
    tmr_base_init_struct.pwm_mode = TMR_PWM_MODE_NULL;
    tmr_base_init(TMR3, &tmr_base_init_struct);
    tmr_pic_config(TMR3, timer3_sleep_isq, 0, TMR_IT_UPDATE2, ENABLE);
}

void power_sleep_wake_init(void)
{
    power_sleep_wake_config();  //初始化定时器和按键
    tmr_cmd(TMR3, ENABLE);      //使能定时器
}



// 测试函数
rtc_clk_typedef clk_struct_test;
void power_sleep_wake_example(void)
{

    static u32 delay_cnt1, delay_cnt2;
    static u8 flag = 0;

    if (tick_check_expire(delay_cnt1, 500)) {
            printf("before:clk_struct_test.clk_source_sel  = %d %d-%d %x\r\n",RTCCON0,TMR3->cnt,TMR3->pr,(TMR3->con)&TMR_FLAG_UPDATE2);
        delay_cnt1 = tick_get();
    }

    if (sleep_flag == 1) {
        if(ble_is_connect())
        {
            ble_update_conn_param(800,0,400);
        }
        else
        {
            ble_set_adv_interval(1600);
        }
        delay_5ms(10);
        sleep_enter();
        sleep_flag = 0;
        delay_cnt2 = tick_get();
    }

    if (gpio_read_bit(GPIOB_REG, GPIO_PIN_5) == SET) {      // 松开
        flag = 0;
    } else {    // 按下
        if (flag == 0) {
            flag = 1;
            printf("key down.\n");
            tmr_set_counter(TMR3, 0);
        }
    }

    // 长按: 3s~10s
    if (flag) {
        if (tick_check_expire(delay_cnt2, 3000)) {
            printf("Long press.\n");
            while (gpio_read_bit(GPIOB_REG, GPIO_PIN_5) == RESET);
            pwrdwn_enter();
        }
    } else {
        delay_cnt2 = tick_get();
    }
}
