#ifndef _SERVOMOTOR_H_
#define _SERVOMOTOR_H_

#include "motorCommu.h"
#include "modbus_crc.h"
#include "stdbool.h"
#include "ptz_type_select.h"

    #ifdef PTZ_MEDIUM_WORM_SERVO_MOTOR_24V
    /*
    ********************************************************************************************************
    *                             电机硬件相关
    ********************************************************************************************************
    */
    #define H_MOTOR_OPEN    gpio_bit_set(GPIOE,GPIO_PIN_0)      //水平电机电源打开
    #define H_MOTOR_STOP    gpio_bit_reset(GPIOE,GPIO_PIN_0)    //水平电机电源关闭
    #define V_MOTOR_OPEN    gpio_bit_set(GPIOE,GPIO_PIN_1)      //垂直电机电源打开
    #define V_MOTOR_STOP    gpio_bit_reset(GPIOE,GPIO_PIN_1)    //垂直电机电源关闭

    #define H_MOTOR_ADDR    0x01//水平电机地址
    #define V_MOTOR_ADDR    0x01//垂直电机地址
    /*
    ********************************************************************************************************
    *                             功能码命令
    ********************************************************************************************************
    */
    #define     READ_ONE_REG            0X03//读单个寄存器
    #define     READ_MULT_CONSE_REG     0X03//读多个连续的寄存器Read multiple consecutive registers
    #define     WRITE_ONE_REG           0X06//写单个寄存器
    #define     WRITE_MULT_CONSE_REG    0x10//写多个连续的寄存器

    #define     WRITE_ONE_REG_FRAME_NUM     8//写单个寄存器，数据帧的字节个数
    #define     READ_ONE_REG_FRAME_NUM      8//读单个寄存器，数据帧的字节个数
    /*
    ********************************************************************************************************
    *                             寄存器参数
    ********************************************************************************************************
    */
    /*基本控制参数H02*/
    #define H02_CONTR_MODE_SELEC        0X0200//（Control mode selection）控制模式选择0：速度模式，1：位置模式，2：转矩模式  
    #define H02_MOTOR_DIR_SELEC         0X0202//电机旋转方向选择
    /*DI/DO参数H03~H04*/
    #define H03_DI1_FUNC_SELEC          0X0302//DI1端子功能选择,一个 DI 功能选项只能关联一个 DI 端子，不可重复分配
    #define H03_DI1_LOGICAL_SELEC       0X0303//DI1端子逻辑选择
    #define H04_DO1_FUNC_SELEC          0X0400//DO1端子功能选择
    #define H04_DO1_LOGICAL_SELEC       0X0401//DO1端子逻辑选择

    /*速度控制参数H06*/
    #define H06_SPEED_COMMAND_SELEC     0X0602//速度指令选择
    #define H06_SPEED_COMMU_SET_VALUE   0X0603//速度指令通讯设置值,当 H06_02=0 时，通过此参数设定电机运行转速
    #define H06_SPEED_UP_SLOPE_VALUE    0X0605//速度指令加速斜坡时间常数
    #define H06_SPEED_DOWN_SLOPE_VALUE  0X0606//速度指令减速斜坡时间常数
    #define H06_SPEED_REACH_MAX         0X0618//速度到达信号阈值

    /*RS485通讯与功能参数H0C*/
    #define H0C_COMMU_PARAM_EEPR_UPDATE 0X0C13//MODBUS通讯写入是否更新到 EEPROM，设置1为写入

    /*监视只读参数*/
    #define READ_MOTOR_SPEED_NOW        0X0B00//读取电机滤波后的实时转速




    /**
    * @brief    伺服电机速度模式写单个寄存器
    * @param    motorNo：写垂直电机还是水平电机
    * @param    regAddr：要写的寄存器
    * @param    data：要向寄存器写入的数据
    * @return   false:写失败，当前DMA正在发送数据
    */
    uint8_t* WriteMotorOneReg(uint8_t motorNo, uint16_t regAddr, int16_t data);


    /**
    * @brief    伺服电机速度模式读单个寄存器
    * @param    motorNo：读垂直电机还是水平电机
    * @param    regAddr：要读的寄存器
    * @return   返回数组地址
    */
    uint8_t* ReadMotorOneReg(uint8_t motorNo, uint16_t regAddr);



    /**
    * @brief 伺服电机驱动初始化
    * @param
    * @return 
    */
    void servoMotorInit(void);
    #endif
#endif