/*
 * @Author: qianziyang qianzy@bmser.com
 * @Date: 2023-06-07 13:24:53
 * @LastEditors: qianziyang qianzy@bmser.com
 * @LastEditTime: 2023-06-07 13:44:40
 * @FilePath: /rk3568_sdk/bmser_app/xieneng_can/src/lib_src/j1939/j1939_dtc.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#ifndef J1939_DTC_H_
#define J1939_DTC_H_

#include "j1939.h"

//***更新DTC***//
#define UPDATE_DTC(DTC_INFO, SPN, FMI, OC, CM)  {(DTC_INFO).spn = (SPN); (DTC_INFO).fmi = (FMI); (DTC_INFO).oc = (OC); (DTC_INFO).cm = (CM);}

#define J1939_WRITE_LT_INT8U(ADDRESS, POS, VALUE) {(ADDRESS)[(POS)++] = (uint8_T)(VALUE);}
#define J1939_WRITE_LT_INT8U_WITH_BUFF_SIZE(ADDRESS, POS, VALUE, SIZE)    {if((POS) < (SIZE))J1939_WRITE_LT_INT8U(ADDRESS, POS, VALUE);}

//***写DTC***//
#define WRITE_DTC(BUFF, INDEX, MAX, SPN, FMI, OC, CM)    {\
    J1939_WRITE_LT_INT8U_WITH_BUFF_SIZE(j1939_dtc_tx_msg.data, index, (uint8_T)(SPN), j1939_dtc_tx_msg.msg_max_len);\
    J1939_WRITE_LT_INT8U_WITH_BUFF_SIZE(j1939_dtc_tx_msg.data, index, (uint8_T)((SPN)>>8), j1939_dtc_tx_msg.msg_max_len);\
    J1939_WRITE_LT_INT8U_WITH_BUFF_SIZE(j1939_dtc_tx_msg.data, index, ((FMI)&0x1F)|((SPN)>>16&0x07)<<5, j1939_dtc_tx_msg.msg_max_len);\
    J1939_WRITE_LT_INT8U_WITH_BUFF_SIZE(j1939_dtc_tx_msg.data, index, ((OC)&0x7F)|(CM)<<7, j1939_dtc_tx_msg.msg_max_len);}

//***写DTC***//
#define WRITE_DTC_NONE(BUFF, INDEX, MAX)      WRITE_DTC(BUFF, INDEX, MAX, 0, 0, 0, 0)

//***函数声明***//
J1939Result J1939_DTCInit(J1939Context* J1939_PAGED context);
J1939Result j1939_dtc_trouble_on(J1939Context* J1939_PAGED context, J1939DtcInfo* J1939_PAGED dtc_info);
J1939Result j1939_dtc_trouble_off(J1939Context* J1939_PAGED context, J1939DtcInfo* J1939_PAGED dtc_info);
J1939Result j1939_dtc_reset_all_dtc(J1939Context* J1939_PAGED context);
void j1939_dtc_poll(J1939Context* J1939_PAGED context, uint32_T tick);

#endif
