#include "parking_sensor.h"
#include "common.h"
#include "uart_log.h"



// 全局变量
volatile uint32_t pulse_time = 0;     // 脉宽时间
volatile float distance_cm = 0.0;      // 距离
volatile uint8_t capture_state = 0;   // 捕获状态标志
volatile uint8_t last_pd14_state = 0;  // 上一次 PD14 的状态


// 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
    // 根据引脚号选择配置寄存器
    if (pin < 8) {
        // 配置低 8 位（PE0 - PE7）
        GPIOE->CRL &= ~(0xF << (pin * 4));  // 清除该引脚的配置
        GPIOE->CRL |= (mode << (pin * 4));  // 设置该引脚的模式
    } else {
        // 配置高 8 位（PE8 - PE15）
        GPIOE->CRH &= ~(0xF << ((pin - 8) * 4));  // 清除该引脚的配置
        GPIOE->CRH |= (mode << ((pin - 8) * 4));  // 设置该引脚的模式
    }
		GPIOE->BRR = 0xFC00; 
}

// 发送触发信号
void SendTriggerSignal(uint8_t pin) {

	  Delay(4, 'u'); 
    GPIOE->BSRR = (1 << pin);   // 设置 PE14 为高电平
    Delay(15, 'u');            // 延时 10 微秒
    GPIOE->BRR = (1 << pin);    // 设置 PE14 为低电平
}

// 初始化 TIM2 捕获模式
void TIM2_Capture_Init(void)
{
// 使能TIM2时钟
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

    // 设置预分频器，使TIM2计数频率为1MHz
    TIM2->PSC = 72 - 1;  // 72MHz / 72 = 1MHz

    // 设置自动重装载寄存器
    TIM2->ARR =29999;// 0xFFFF;

    // 选择计数模式
    TIM2->CR1 &= ~TIM_CR1_DIR;
}

// TIM2 中断服务程序，捕获脉宽
void Parking_Sensor_Interruption(void) {
    uint8_t pd14_level = (GPIOD->IDR & GPIO_IDR_IDR14) ? 1 : 0;
    if (pd14_level != last_pd14_state) {  // 检测到电平变化
        if (pd14_level == 1 && capture_state == 0) {  // 上升沿
            TIM2->CNT = 0;               // 清零计数器
            TIM2->CR1 |= TIM_CR1_CEN;    // 启动计数器
            capture_state = 1;           // 标记上升沿已捕获，等待下降沿
        } else if (pd14_level == 0 && capture_state == 1) { // 下降沿且上升沿已捕获
            pulse_time = TIM2->CNT;        // 读取当前计数器值作为脉宽时间
            TIM2->CR1 &= ~TIM_CR1_CEN;   // 关闭计数器
            TIM2->CNT = 0;               // 清零计数器
            capture_state = 0;           // 重置捕获状态
            // 计算距离
            distance_cm = CALCULATE_DISTANCE(pulse_time);
        }
				EXTI->PR |= EXTI_PR_PR14;  // 清除中断标志位
        last_pd14_state = pd14_level;
    }
}
