#include "sx1276-Hal.h"

/**
 * 与单片机平台有关
 */
#include "gpio.h"
#include "spi.h"

/**
 * @brief 复位
 *
 * @param state 操作指令
 */
void SX1276SetReset( uint8_t state )
{
    if( state == RADIO_RESET_ON )
    {
        /* Set RESET pin to 0 */
				HAL_GPIO_WritePin( E32_RESET_GPIO_Port, E32_RESET_Pin, GPIO_PIN_RESET );	

    }
    else
    {
				HAL_GPIO_WritePin( E32_RESET_GPIO_Port, E32_RESET_Pin, GPIO_PIN_SET );	
    }
}

/**
 * @brief 寄存器写入(单个)
 *
 * @param addr 寄存器地址
 * @param data 写入内容
 */
void SX1276Write( uint8_t addr, uint8_t data )
{
    SX1276WriteBuffer( addr, &data, 1 );
}

/**
 * @brief 寄存器读取(单个)
 *
 * @param addr 寄存器地址
 * @param data 返回内容
 */
void SX1276Read( uint8_t addr, uint8_t *data )
{
    SX1276ReadBuffer( addr, data, 1 );
}

/**
 * @brief 寄存器写入(多个)
 *
 * @param addr 寄存器地址
 * @param buffer 指向写入内容缓存
 * @param size 写入数量
 */
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
		uint8_t cmd;
	
		cmd = addr | 0x80;
	
    /* NSS = 0 */
    HAL_GPIO_WritePin( SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);

	  /* SPI 先发送地址  */
		HAL_SPI_Transmit( &hspi1 , &cmd, 1, 0xFFFF );
	
	  /* SPI 再发送数据 */
		HAL_SPI_Transmit( &hspi1 , buffer, size, 0xFFFF );				
		
    /* NSS = 1 */
    HAL_GPIO_WritePin( SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET );	
}

/**
 * @brief 寄存器读取(多个)
 *
 * @param addr 寄存器地址
 * @param buffer 指向待读取缓存
 * @param size 读取数量
 */
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
		uint8_t cmd;
	
		cmd = addr & 0x7F;
	
    /* NSS = 0 */
    HAL_GPIO_WritePin( SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);

	  /* SPI 先发送地址 */
		HAL_SPI_Transmit( &hspi1 , &cmd, 1, 0xFFFF );	
		
	  /* SPI 再读取响应数据 */
		HAL_SPI_Receive( &hspi1 , buffer, size, 0xFFFF );			

    /* NSS = 1 */
    HAL_GPIO_WritePin( SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET );	
}

/**
 * @brief FIFO数据写入
 *
 * @param buffer 指向写入内容缓存
 * @param size 写入数量
 */
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
{
    SX1276WriteBuffer( 0, buffer, size );
}

/**
 * @brief FIFO数据读取
 *
 * @param buffer 指向读取内容缓存
 * @param size 读取数量
 */
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
{
    SX1276ReadBuffer( 0, buffer, size );
}

/**
 * @brief  读取DIO0电平状态
 *
 * @note DIO0与中断配置关联，主要为发送完成指示 / 接收完成指示
 * @return  高电平返回1，低电平返回0
 */
uint8_t SX1276ReadDio0( void )
{
    return HAL_GPIO_ReadPin( E32_DIO0_GPIO_Port , E32_DIO0_Pin );
}

/**
 * @brief  读取DIO1电平状态
 */
uint8_t SX1276ReadDio1( void )
{
		///@note 未使用
		return 0;
}

/**
 * @brief  读取DIO2电平状态
 */
uint8_t SX1276ReadDio2( void )
{
		///@note 未使用
    return 0;
}

/**
 * @brief  读取DIO3电平状态
 */
uint8_t SX1276ReadDio3( void )
{
		///@note 未使用
    return 0;
}

/**
 * @brief  读取DIO4电平状态
 */
uint8_t SX1276ReadDio4( void )
{
		///@note 未使用
    return 0;
}

/**
 * @brief  读取DIO5电平状态
 */
uint8_t SX1276ReadDio5( void )
{
		///@note 未使用
    return 0;
}

/**
 * @brief 切换射频开关
 *
 * @param txEnable 操作指令
 */
void SX1276WriteRxTx( uint8_t txEnable )
{
	  /* 切换到发送线路 */
    if( txEnable != 0 )
    {
				HAL_GPIO_WritePin( E32_RXEN_GPIO_Port, E32_RXEN_Pin, GPIO_PIN_RESET );	
				HAL_GPIO_WritePin( E32_TXEN_GPIO_Port, E32_TXEN_Pin, GPIO_PIN_SET );
    }
		/* 切换到接收线路 */
    else
    {
				HAL_GPIO_WritePin( E32_TXEN_GPIO_Port, E32_TXEN_Pin, GPIO_PIN_RESET );
				HAL_GPIO_WritePin( E32_RXEN_GPIO_Port, E32_RXEN_Pin, GPIO_PIN_SET );	
    }
}

/**
 * @brief 获取系统计时节拍 
 *
 * @note 注意为1ms计时
 * @return  返回计时节拍数
 */
uint32_t SX1276GetTickCounter(void)
{
		return HAL_GetTick();
}

/* ====================================================================== */

