#ifndef _MOTORCOMMU_H_
#define _MOTORCOMMU_H_

#include "gd32f4xx.h"
#include "stdbool.h"
#include "string.h"
#include "ptz_type_select.h"

    #ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V

    /*
    ********************************************************************************************************
    *                             dma缓冲区相关
    ********************************************************************************************************
    */
    typedef struct 
    {  
         int16_t dmaTranFlag;              	/*dma发送是否在工作的标志位*/      
         int32_t dmaSize;                	/*DMA接收缓冲区的大小*/
         uint8_t *pDmaRsvBuff;              /*指向接收DMA缓冲区的首地址*/
    }CommuInfo_t;

    #define DMA_TRANS_IDLE              0//dma当前未在发送数据
    #define DMA_TRANS_BUSY              1//dma当前正在发送数据
    #define DMA_BUFF_SIZE               64//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    数据的发送
    * @param    motorNo：电机号，H_MOTOR：水平电机，V_MOTOR：垂直电机
    * @param    buffer：需要发送的数据
    * @param    len：发送数据的长度
    * @return   ture:DMA空闲当前数据可以发送；false：DMA正在发送数据，当前数据不能发送
    */
    bool CommuTransData(uint8_t motorNo, uint8_t* buffer, int32_t len);

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


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