#ifndef _MOTORCOMMU_
#define _MOTORCOMMU_

#include "gd32f4xx.h"
#include "cfifo.h"
/*
********************************************************************************************************
*                             dma缓冲区相关
********************************************************************************************************
*/
typedef struct 
{  
	 int16_t dmaTranFlag;              	/*dma发送是否在工作的标志位*/      
	 int32_t dmaSize;                	/*DMA缓冲区的大小*/
	 int32_t dmaOffset;              	/*获取数据在DMA缓冲区的偏移量*/
	 uint8_t *pDmaRsvBuff;              /*指向接收DMA缓冲区的首地址*/
	 uint8_t *pDmaTraBuff;             	/*指向发送DMA缓冲区的首地址*/
	 CfifoBuff dataRsvCfifo;          	/*接受数据的循环缓冲区，串口---（dma搬运）--->pDmaRsvBuff[]--->dataRsvCfifo.BUFF[]*/
	 CfifoBuff dataTraCfifo;            /*发送数据的循环缓冲区，dataTraCfifo.BUFF[]--->pDmaTraBuff[]---（dma搬运）--->串口*/
}CommuInfo_t;

#define DMA_TRANS_IDLE              0//dma当前未在发送数据
#define DMA_TRANS_BUSY              1//dma当前正在发送数据
#define DMA_BUFF_SIZE               256//dma缓冲区大小
extern CommuInfo_t g_commuDeal;//来自motorCommu.c

/*
********************************************************************************************************
*                             串口设备驱动初始化相关
********************************************************************************************************
*/
#define H_MOTOR         0//数组g_motorCommuInitBuff[MOTOR_NUM]位号
#define V_MOTOR         1

/*-------------485接收发送宏开关----------------------*/
#define H_COMMU_RS485_TX              gpio_bit_set(GPIOD, GPIO_PIN_10)//水平电机485发送
#define H_COMMU_RS485_RX              gpio_bit_reset(GPIOD, GPIO_PIN_10)//水平电机485接收
#define V_COMMU_RS485_TX              gpio_bit_set(GPIOC, GPIO_PIN_8)//垂直电机485发送
#define V_COMMU_RS485_RX              gpio_bit_reset(GPIOC, GPIO_PIN_8)//垂直电机485接收

/**
* @brief 串口设备通讯驱动初始化
* @param
* @return 
*/
void CommuDrvInit(void);

/**
* @brief    通过循环队列的方式进行数据的发送
            数据，表示已经接收到的包数量的变量减1
* @param    motorNo：电机号，H_MOTOR：水平电机，V_MOTOR：垂直电机
* @param    buffer：发送缓冲区
* @param    len：发送数据的长度(不得大于DMA_BUFF_SIZE)
* @return   写入发送缓冲区的长度
*/
int32_t CommuTransData(uint8_t motorNo, uint8_t* buffer, int32_t len);

/**
* @brief    从接收循环缓冲区中读取指定长度的数据到用户数组
* @param    motorNo：电机号，H_MOTOR：水平电机，V_MOTOR：垂直电机
* @param    userBuff：从接收循环缓冲区中接收数据的数组 
* @param    len：接收数据的长度
* @return   none
*/
void CommuRsvData(uint8_t motorNo, uint8_t* userBuff, uint32_t len);

/**
* @brief    与外部通讯的485或422接口,接收到的包数量
* @param    motorNo：电机号，H_MOTOR：水平电机，V_MOTOR：垂直电机
* @return   rs485或rs422接收到的包数量
*/
uint16_t GetRsvFrameNum(uint8_t motorNo);

/**
* @brief    与外部通讯的485或422接口,每从缓冲区读出一包
            数据，表示已经接收到的包数量的变量减1
* @param    motorNo：电机号，H_MOTOR：水平电机，V_MOTOR：垂直电机
* @return   null
*/
void DecRsvFrameNum(uint8_t motorNo);

///*用于结构体数组赋值，方便外部使用此结构体数组*/
//CommuHwInfo_t GetMotorCommuBuffStr(uint8_t motorNo);
#endif