// ATT��������(GPIOģ��)
// ������Ѱ�Ƽ����޹�˾
// ����
// 2023-11-21

#include "includes.h"

// ��ʼ��ATT���õ���GPIO�ܽ�
void driver_attgpio_init()
{
    GPIO_InitTypeDef stGpio = {0};

    // ��֯GPIO��������
    stGpio.GPIO_Mode = GPIO_Mode_OUT;
    stGpio.GPIO_OType = GPIO_OType_PP;
    stGpio.GPIO_Speed = GPIO_Speed_2MHz;
    stGpio.GPIO_PuPd = GPIO_PuPd_NOPULL;

    // V1
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V1_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V1_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V1_PORT, &stGpio);

    // V2
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V2_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V2_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V2_PORT, &stGpio);

    // V3
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V3_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V3_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V3_PORT, &stGpio);

    // V4
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V4_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V4_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V4_PORT, &stGpio);

    // V5
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V5_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V5_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V5_PORT, &stGpio);

    // V6
    RCC_AHB1PeriphClockCmd(DRIVER_ATT_GPIO_V6_CLK, ENABLE);
    stGpio.GPIO_Pin = DRIVER_ATT_GPIO_V6_PIN;
    GPIO_Init(DRIVER_ATT_GPIO_V6_PORT, &stGpio);

    // ��˥��
    GPIO_WriteBit(DRIVER_ATT_GPIO_V6_PORT, DRIVER_ATT_GPIO_V6_PIN, (BitAction)1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V5_PORT, DRIVER_ATT_GPIO_V5_PIN, (BitAction)1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V4_PORT, DRIVER_ATT_GPIO_V4_PIN, (BitAction)1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V3_PORT, DRIVER_ATT_GPIO_V3_PIN, (BitAction)1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V2_PORT, DRIVER_ATT_GPIO_V2_PIN, (BitAction)1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V1_PORT, DRIVER_ATT_GPIO_V1_PIN, (BitAction)1);
}

// ������·˥��ATT
// byAtt:˥��ֵ�����ֵ63��ʾ0dB˥������Сֵ0��ʾ31.5dB˥��
// V1 V2 V3 V4 V5 V6
// 1  1  1  1  1  1  0dB
// 1  1  1  1  1  0  0.5dB
// 1  1  1  1  0  1  1dB
// 1  1  1  1  0  0  1.5dB
// 1  1  1  0  1  1  2dB
// 0  0  0  0  0  0  31.5dB
uint8 driver_attgpio_set_att(uint8 byAtt)
{
    uint8 byMask = 0x01;
    uint8 byValue = 0;

    // �����ݴ�����
    if (byAtt > 63)
    {
        return 0;
    }

    // ����V6
    byValue = byAtt & (byMask << 0);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V6_PORT, DRIVER_ATT_GPIO_V6_PIN, (BitAction)byValue);

    // ����V5
    byValue = byAtt & (byMask << 1);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V5_PORT, DRIVER_ATT_GPIO_V5_PIN, (BitAction)byValue);

    // ����V4
    byValue = byAtt & (byMask << 2);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V4_PORT, DRIVER_ATT_GPIO_V4_PIN, (BitAction)byValue);

    // ����V3
    byValue = byAtt & (byMask << 3);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V3_PORT, DRIVER_ATT_GPIO_V3_PIN, (BitAction)byValue);

    // ����V2
    byValue = byAtt & (byMask << 4);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V2_PORT, DRIVER_ATT_GPIO_V2_PIN, (BitAction)byValue);

    // ����V1
    byValue = byAtt & (byMask << 5);
    GPIO_WriteBit(DRIVER_ATT_GPIO_V1_PORT, DRIVER_ATT_GPIO_V1_PIN, (BitAction)byValue);

    return 1;
}
