#ifndef BMSER_CAN_J1939_SEND_H__
#define BMSER_CAN_J1939_SEND_H__

#include "can_inf.h"
#include "bmser_can_init.h"

/**@brief       总控与主控交互(发送)的初始化
 * @param[in]   BMSER_CAN_BUS_CFG_TABLE_S
 * @return      int32_t
 * @retval      0:正常；-1:异常
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-15   JYG  创建初始版本\n
 */
int32_t J1939SendMsg_Init(BMSER_CAN_BUS_CFG_TABLE_S* cfg_table);

/*-------------------------------------------------------s----------------------------------
 * @brief      定时请求DB消息与更新通讯状态（周期10ms）
 * @param[in]   void
 * @return      int32_t
 * @retval      0:正常；-1:异常
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-26               创建初始版本            \n
*-----------------------------------------------------------------------------------------*/
void J1939SendMsg_Step_Runnable(void);

/**@brief       写响应消息发送
 * @param[in]   uint32_t canId
 * @param[in]   uint8_t *cfgInfo
 * @param[in]   uint8_t cfgInfoLen
 * @return      int32_t
 * @retval      0:正常；-1:异常
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-15   jyg  创建初始版本\n
 * 2023-05-08   jyg         增加对空指针与设备ID有效性判断，修正结构体中的内容\n
 * 2023-05-09   jyg         修正匹配的类型\n
 */
int32_t J1939_WriteRespCallback(uint32_t canId,uint8_t *cfgInfo,uint8_t cfgInfoLen);


/**@brief       给每簇的设备发送CAN消息(如果写入fifo失败，直接向下发送，并进行错误计数)
 * @param[in]   devId       主控设备ID，可参考BMS_DB_DEV_TYPE_ENUM
 * @param[in]   msgType     目前只支持CANRBUS_WRITE_REG
 * @param[in]   regAddr     DB地址
 * @param[in]   regValue    写入数据
 * @return      void
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-26   jyg         创建初始版本\n
 */
// Std_Ret_Type HubMainDbJ1939_SendClusterMsg(uint16_t devId,uint16_t msgType,uint32_t regAddr, uint16_t regValue);

/**@brief       向主控can发送DB写入消息(不检查写响应)
 * @param[in]   devId       主控设备ID，可参考BMS_DB_DEV_TYPE_ENUM
 * @param[in]   msgType     目前只支持CANRBUS_WRITE_REG
 * @param[in]   regAddr     DB地址
 * @param[in]   regValue    写入数据
 * @return      void
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-26   jyg         创建初始版本\n
 */
Std_Ret_Type HubMainDbJ1939_SendClusterMsgWithoutRespCheck(uint16_t devId,uint16_t msgType,uint32_t regAddr, uint16_t regValue);

/**@brief       向主控can连续发送多个DB写入消息(不检查写响应)
 * @param[in]   devId       主控设备ID，可参考BMS_DB_DEV_TYPE_ENUM
 * @param[in]   msgType     目前只支持CANRBUS_WRITE_REG
 * @param[in]   regAddr     DB地址
 * @param[in]   regNum      数据个数
 * @param[in]   *regValue   写入数据
 * @return      void
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-26   jyg         创建初始版本\n
 */
Std_Ret_Type HubMainDbJ1939_SendClusterMultiMsgWithoutRespCheck(uint16_t devId,uint16_t msgType,uint32_t regAddr, uint16_t regNum, uint16_t* regValue);

/*只用来组态屏显示，不用做策略判断*/
/**@brief       获取通讯错误码
 * @param[in]   void
 * @return      void 
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-27   jyg         Create        \n
 */
// uint32_t HubMainDbJ1939_RecordCommunicationErrorCode(void);

/**@brief       获取簇通讯状态
 * @param[in]   void
 * @return      void 
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-27   jyg         Create        \n
 */
// uint16_t HubMainDbJ1939_GetClusterCommunicationState(uint16_t clusterIndex);

/**@brief       获取第一个通讯正常的簇编号
 * @param[in]   void
 * @return      void 
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2023-04-27   jyg         Create        \n
 */
// uint16_t HubMainDbJ1939_GetFristCommNormalCluster(void);

/**@brief       清除总主通信错误状态信息
 *              
 * @param[in]   void
 * @return
 * @retval      None
 *
 * @par         modify    log
 * Date        Author     Description             \n
 * 2022-11-11     xzh      Create             \n
 * 2023-01-10   zzk         区分BAU最大簇数和使能簇数\n
 */
// void HubMainDbJ1939_ResetFault_RackCommState(void);

/**@brief       收到簇消息后，重置通讯正常
 * @param[in]   void
 * @return      void 
 * @retval      void
 * @par         修改日志:
 * Date         Author      Description           \n
 * 2018-08-22   xxx         Create        \n
 * 2023-03-01   zzk         区分BAU最大簇数和使能簇数\n
 */
// int32_t HubMainDbJ1939_RxCommunicationState(uint16_t clusterIndex);

#endif

