/*
 * gpio.c
 *
 *  Created on: 2024年7月1日
 *      Author: psx
 */

#include "gpio.h"
#include "task.h"


void G_FFMOS_CON_Init(void)
{
    /* G_FFMOS_CON1  -->  PA15 */
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_WriteBit(GPIOA, GPIO_Pin_15, SET);             //关闭mos管,打开光伏输入

    /* G_FFMOS_CON2  -->  PB3 */
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_WriteBit(GPIOB, GPIO_Pin_3, SET);
}

void RUN_LED_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = RUN_LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(RUN_LED_GPIO, &GPIO_InitStructure);
}

void WDI_INPUT_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOC, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = WDI_INPUT_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(WDI_INPUT_GPIO, &GPIO_InitStructure);
}

void BEEP_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = BEEP_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(BEEP_GPIO, &GPIO_InitStructure);
}

void POW_OUT_CON_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = POW_OUT_CON_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(POW_OUT_CON_GPIO, &GPIO_InitStructure);

//    GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, SET);
    GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, RESET);
}

void EXTI2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void DSG_PROT_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_AFIO | RCC_PB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
    GPIO_Init(DSG_PROT_GPIO, &GPIO_InitStructure);

    /* GPIOB ----> EXTI_Line2 */
    EXTI_InitTypeDef EXTI_InitStructure;
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2); //指定中断/事件线的输入源,实际上是设定外部中断配置寄存器AFIO_EXTICRx的值,此处为PB2
    EXTI_InitStructure.EXTI_Line = EXTI_Line2;                  //EXTI中断/事件线选择,此处选择EXTI_Line2
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         //EXTI模式选择,此处选择为产生中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     //EXTI边沿触发事件,此处选择为下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   //使能EXTI线
    EXTI_Init(&EXTI_InitStructure);

    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;           //使能EXTI2中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //设置抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;         //设置子优先级为2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                            //中断优先级分组初始化
}

void EXTI2_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line2)==SET) { //EXTI_GetITStatus用来获取中断标志位状态,如果EXTI线产生中断则返回SET,否则返回RESET
//        printf("Run at EXTI\r\n");
        GPIO_WriteBit(DSG_PROT_GPIO, DSG_PROT_PIN, RESET);
        if (outputAgainFlag == 0) {
            Delay_Ms(1);
            GPIO_WriteBit(DSG_PROT_GPIO, DSG_PROT_PIN, SET);
//            TimeSliceOffset_Register(&m_outputAgain, Task_outputAgain
//                    , outputAgain_reloadVal, outputAgain_offset);
            outputAgainFlag = 1;
        }

        if (outputAgainFlag == 1) {
//            GPIO_WriteBit(POW_OUT_CON_GPIO, POW_OUT_CON_PIN, RESET);
            outputAgainFlag = 2;
        }

        EXTI_ClearITPendingBit(EXTI_Line2);  //清除中断标志位
    }
}

void EnPowerSupply_Init(void)
{
    RCC_PB2PeriphClockCmd(RCC_PB2Periph_GPIOB, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = EnPowerSupply_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(EnPowerSupply_GPIO, &GPIO_InitStructure);

//    GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, SET);
    GPIO_WriteBit(EnPowerSupply_GPIO, EnPowerSupply_PIN, RESET);
}