#include "can_inf.h"
#include "can_base.h"


/**
 * @brief       can初始化
 * @param[in]   CAN_INF_CFG_STRU *pCanInitCfg can初始化配置
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_init(CAN_INF_CFG_STRU *pCanInitCfg)
{
    int32_t ret = 0;
    if(pCanInitCfg == NULL)
    {
        return -1;
    }

    ret |= can_init(pCanInitCfg->canObjId);
    ret |= can_set_bitrate(pCanInitCfg->canObjId,pCanInitCfg->canBitRate);

    return ret;
}

/**
 * @brief       设置can滤波
 * @param[in]   uint32_t canObjId
 * @param[in]   CAN_INF_FILTER_STRU *pCanFilter 过滤配置
 * @param[in]   uint32_t filterNum  滤波配置数量
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_canFilterConfig(uint32_t canObjId, CanFilter *pCanFilter, uint32_t filterNum)
{
    return can_setFilter(canObjId,pCanFilter,filterNum);
}

/**
 * @brief       发送CAN数据
 * @param[in]   uint32_t canObjId
 * @param[in]   CanMsg *txMsg can数据
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_sendMsg(uint32_t canObjId, CanMsg *txMsg)
{
    return can_send(canObjId,txMsg);
}

/**
 * @brief       接收CAN数据
 * @param[in]   uint32_t canObjId
 * @param[in]   CanMsg *rxMsg can数据
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2022-10-20           JHC        创建初始版本          \n
*/
int32_t canInf_recvMsg(uint32_t canObjId, CanMsg *rxMsg)
{
    return can_rcv(canObjId,rxMsg);
}

/**
 * @brief       获取can状态(检测bus off使用)
 * @param[in]   uint32_t canObjId   canID
 * @param[out]  int *state          状态
 * @return      int32_t
 * @retval      1: up; 0: down; -1: unknown
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-02-01           QZY        创建初始版本          \n
*/
int32_t canInf_getState(uint32_t canObjId, int *state)
{
    int fd;
    char path[128];
    char st[10] = {0};

    memset(path, 0, sizeof(path));
    snprintf(path, sizeof(path), "/sys/class/net/can%d/operstate", canObjId);  

    fd = open(path, O_RDONLY);
    if (fd < 0) {
        dy_syslog(LOG_ERR, "failed to open can operstate for reading!");
        return -1;
    }

    if (read(fd, &st, 2) < 0) {
        dy_syslog(LOG_ERR, "failed to read can state!");
        close(fd);
        return -1;
    }
    // 取2个字符判断can状态为'up'，'down'或其他状态
    if (strncmp(st, "up", 2) == 0) {
        *state = CAN_STATE_UP;
    } else if (strncmp(st, "do", 2) == 0) {
        *state = CAN_STATE_DOWN;
    } else {
        // unknown状态或其他状态
        *state = CAN_STATE_UNKNOWN;
    }
    close(fd);
    return 0;
}

/**
 * @brief       重启can
 * @param[in]   uint32_t canObjId
 * @return      int32_t
 * @retval      0:正常  !0:错误
 * @par         修改日志:
 * Date                Author     Description           \n
 * 2024-02-01           QZY        创建初始版本          \n
*/
int32_t canInf_reOpen(uint32_t canObjId)
{
    return can_reopen(canObjId);
}