#include "Int_Encoder.h"

// 函数：调整ABZ输出分辨率，step为分辨率
void Int_Encoder_set_resolution(uint16_t step)
{
    HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_SET);   // 给芯片上电
    HAL_GPIO_WritePin(ENCODER_MODE_GPIO_Port, ENCODER_MODE_Pin, GPIO_PIN_SET); // 切换到I2C模式

    // 配置I2C

    Dri_I2C_Init();

    // 按照手册给指定寄存器发送指定数据
    Dri_I2C_Start();
    Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE); // 发送从机地址

    Dri_I2C_WriteReg(0x09, 0xB3);
    Dri_I2C_WriteReg(0x0A, 0x05);
    Dri_I2C_Stop();
    HAL_Delay(1000); // 等待EEPROM编程完成

    // 按照手册给芯片重新上电
    HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(ENCODER1_EN_GPIO_Port, ENCODER1_EN_Pin, GPIO_PIN_SET);

    // ABZ_RES一共十位，低8位在0x31寄存器中，高两位在0x30寄存器中的最低两位
    // 读取ABZ_RES高两位所在寄存器的数据，保留不能修改的bits

    uint8_t data = Dri_I2C_ReadReg(ENCODER_I2C_ADDR_READ, ENCODER_ABZ_RES_H);
    // debug_printf("read data = 0x%02x", data);
    uint8_t step_h = step >> 8;

    // 需要写入高两位
    for (uint8_t i = 0; i < 2; i++)
    {
        if (step_h & (1 << i))
            data |= (1 << i);
        else
            data &= ~(1 << i);
    }
    // debug_printf("write data = 0x%02x", data);

    HAL_Delay(1000);

    Dri_I2C_Start();
    Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE);
    Dri_I2C_WriteReg(ENCODER_ABZ_RES_H, data);
    Dri_I2C_Stop();

    Dri_I2C_Start();
    Dri_I2C_WriteAddr(ENCODER_I2C_ADDR_WRITE);
    Dri_I2C_WriteReg(ENCODER_ABZ_RES_L, step & 0xFF);
    Dri_I2C_Stop();
}

void Int_Encoder_start(void)
{
    // 初始化编码器的引脚(之前用作软件I2C)
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = ENCODER1_A_Pin | ENCODER1_B_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void Int_Encoder_Init(void)
{
    DWT_init();
    Int_Encoder_set_resolution(0x03FF);
    Int_Encoder_start();
    HAL_TIM_Base_Start_IT(&htim12);
}
