#include "../include/hal_lksmcu_iwdg.h"
#include "../include/hal_lksmcu_reg.h"
#include "../include/hal_lksmcu_wake.h"
#include "hal_lks32mc09x.h"

static uint32_t weak_irq_state    = 0;
static uint32_t weak_sys_clk_cfg  = 0;
static uint32_t weak_sys_clk_fen  = 0;
static uint32_t weak_sys_afe_reg0 = 0;
/**
 * @brief 进入深度休眠，并且使用IO唤醒
 * @param wake_up_io 指定唤醒IO引脚及其电平
 */
void HAL_WAKE_DeepSleepIoWeak(HAL_WAKE_UP_IO_x wake_up_io)
{
    __disable_irq(); // 关闭所有中断

    // weak_irq_state = NVIC->ISER[0];   // 保存中断状态
    // weak_sys_clk_cfg = SYS_CLK_CFG;   // 保存时钟配置
    // weak_sys_clk_fen = SYS_CLK_FEN;   // 保存时钟使能
    // weak_sys_afe_reg0 = SYS_AFE_REG0; // 保存模拟外设使能

    // GPIO_WAKE_POL = (wake_up_io >> 8) ? (wake_up_io & 0xFF) : 0; // 设置IO唤醒电平
    // GPIO_WAKE_EN = wake_up_io & 0xFF;                            // 设置IO唤醒电平
    // NVIC_EnableIRQ(WAKE_IRQn);                                   // 使能唤醒中断

    // NVIC->ICER[0] = 0xFFFFFFFF; // 关闭所有中断
    // NVIC->ICPR[0] = 0xFFFFFFFF; // 清除所有中断标志

    // __enable_irq(); // 使能全局中断，此时仅唤醒中断使能

    // HAL_REG_SYS_UNLOCK();
    // HAL_REG_WRITE(SYS_CLK_CFG, 0);                  // 关闭pll&时钟
    // HAL_REG_WRITE(SYS_CLK_FEN, 0);                  // 关闭所有数字外设时钟
    // HAL_REG_WRITE_BIT(SYS_AFE_REG0, 0xff00, BIT10); // 关闭所有模拟外设
    // HAL_REG_SET(SCB->SCR, (1UL << 2));              // 设置休眠模式为深度休眠
    __WFI(); // 进入深度休眠
}

/**
 * @brief 进入深度休眠，并且使用定时唤醒
 * @param mS 指定定时唤醒的时间，单位为毫秒
 */
void HAL_WAKE_DeepSleepTimedWakeUp(uint32_t mS)
{
    __disable_irq(); // 关闭所有中断

    // weak_irq_state = NVIC->ISER[0];   // 保存中断状态
    // weak_sys_clk_cfg = SYS_CLK_CFG;   // 保存时钟配置
    // weak_sys_clk_fen = SYS_CLK_FEN;   // 保存时钟使能
    // weak_sys_afe_reg0 = SYS_AFE_REG0; // 保存模拟外设使能

    // GPIO_WAKE_POL = 0; // 设置IO唤醒电平
    // GPIO_WAKE_EN = 0;  // 设置IO唤醒引脚

    // HAL_IWDG_SetWeakTimemS(HAL_IWDG_0, mS); // 设置看门狗唤醒时间
    // HAL_IWDG_Feed(HAL_IWDG_0);              // 喂狗

    // NVIC->ICER[0] = 0xFFFFFFFF; // 关闭所有中断
    // NVIC->ICPR[0] = 0xFFFFFFFF; // 清除所有中断标志
    // NVIC_EnableIRQ(WAKE_IRQn);  // 使能唤醒中断

    // __enable_irq(); // 使能全局中断，此时仅唤醒中断使能

    // HAL_REG_SYS_UNLOCK();
    // HAL_REG_WRITE(SYS_CLK_CFG, 0);                  // 关闭pll&时钟
    // HAL_REG_WRITE(SYS_CLK_FEN, 0);                  // 关闭所有数字外设时钟
    // HAL_REG_WRITE_BIT(SYS_AFE_REG0, 0xff00, BIT10); // 关闭所有模拟外设
    __WFI(); // 进入深度休眠
}

/**
 * @brief 进入深度休眠，并且使用IO唤醒和定时唤醒
 * @param wake_up_io 指定唤醒IO引脚及其电平
 * @param mS 指定定时唤醒的时间，单位为毫秒
 */
void HAL_WAKE_DeepSleepIoTimedWakeUp(HAL_WAKE_UP_IO_x wake_up_io, uint32_t mS)
{
    __disable_irq(); // 关闭所有中断

    // weak_irq_state = NVIC->ISER[0];   // 保存中断状态
    // weak_sys_clk_cfg = SYS_CLK_CFG;   // 保存时钟配置
    // weak_sys_clk_fen = SYS_CLK_FEN;   // 保存时钟使能
    // weak_sys_afe_reg0 = SYS_AFE_REG0; // 保存模拟外设使能

    // GPIO_WAKE_POL = wake_up_io >> 8;  // 设置IO唤醒电平
    // GPIO_WAKE_EN = wake_up_io & 0xFF; // 设置IO唤醒引脚

    // HAL_IWDG_SetWeakTimemS(HAL_IWDG_0, mS); // 设置看门狗唤醒时间
    // HAL_IWDG_Feed(HAL_IWDG_0);              // 喂狗

    // NVIC->ICER[0] = 0xFFFFFFFF; // 关闭所有中断
    // NVIC->ICPR[0] = 0xFFFFFFFF; // 清除所有中断标志
    // NVIC_EnableIRQ(WAKE_IRQn);  // 使能唤醒中断

    __enable_irq(); // 使能全局中断，此时仅唤醒中断使能

    HAL_REG_SYS_UNLOCK();
    HAL_REG_WRITE(SYS_CLK_CFG, 0);                  // 关闭pll&时钟
    HAL_REG_WRITE(SYS_CLK_FEN, 0);                  // 关闭所有数字外设时钟
    HAL_REG_WRITE_BIT(SYS_AFE_REG0, 0xff00, BIT10); // 关闭所有模拟外设
    __WFI();                                        // 进入深度休眠
}
