Commit 54075b63 authored by 黄国庆's avatar 黄国庆

feat:移植SIF一线通文件

parent 984eb287
#include "wmhcomm.h"
#include "wmhcommdata.h"
#include "mwwmhcomm.h"
#include "TYW_stdint.h"
#include "string.h"
#include "Task.h"
#include "CAN_Communication_Matrix.h"
const WMH_COMM_INIT_FRAME_T WMHCommRecvInitList[EM_WMH_COMM_RECV_MSG_TOTAL] = {
{0x80u, 1000u, COMM_DATA_UNION_WI_BOX_LENGTH_0X80, 5000u, 1u, WMHCommDataWiBox_0x80.Bytes, WMHCommFrameCallBack_WiBox_0x80, WMHCommFrameTimeoutFunc_WiBox80, WMHCommFrameCheckSumFunc},
};
const WMH_COMM_INIT_FRAME_T WMHCommSendInitList[EM_WMH_COMM_SEND_MSG_TOTAL] = {
{0x90u, 1000u, COMM_DATA_UNION_WI_BOX_LENGTH_0X90, 10000u, 1u, WMHCommDataWiBox_0x90.Bytes, WMHCommFrameCallBack_Icm, WMHCommFrameTimeoutFunc_WiBox_90, WMHCommFrameCheckSumFunc},
{0x91u, 1000u, COMM_DATA_UNION_WI_BOX_LENGTH_0X91, 10000u, 1u, WMHCommDataWiBox_0x91.Bytes, WMHCommFrameCallBack_Icm, WMHCommFrameTimeoutFunc_WiBox_91, WMHCommFrameCheckSumFunc},
{0x92u, 1000u, COMM_DATA_UNION_WI_BOX_LENGTH_0X92, 10000u, 1u, WMHCommDataWiBox_0x92.Bytes, WMHCommFrameCallBack_Icm, WMHCommFrameTimeoutFunc_WiBox_92, WMHCommFrameCheckSumFunc},
};
uint32_t WMHCommRecvMessageTimeout[EM_WMH_COMM_RECV_MSG_TOTAL] = {0};
uint32_t WMHCommSendMessageTimeout[EM_WMH_COMM_SEND_MSG_TOTAL] = {0};
uint32_t WMHCommAnalysisPos = 0;
void WMHCommInit(void)
{
uint8_t i = 0;
for (i = 0; i < EM_WMH_COMM_RECV_MSG_TOTAL; i++) {
(void)memset(WMHCommRecvInitList[i].SignalList, 0, WMHCommRecvInitList[i].DLC);
WMHCommRecvMessageTimeout[i] = WMHCommRecvInitList[i].TimeoutMax;
}
for (i = 0; i < EM_WMH_COMM_SEND_MSG_TOTAL; i++) {
(void)memset(WMHCommSendInitList[i].SignalList, 0, WMHCommSendInitList[i].DLC);
WMHCommSendMessageTimeout[i] = WMHCommSendInitList[i].TimeoutMax;
}
WMHCommAnalysisPos = 0;
}
void WMHCommFramePackedTransmit(EM_WMH_COMM_SEND_MSG_T MsgIdx)
{
uint8_t data[64] = {0};
uint8_t length = 0;
if ((MsgIdx < EM_WMH_COMM_SEND_MSG_TOTAL) && (MsgIdx > 0)){
if ((WMHCommSendInitList[MsgIdx].DLC + 4) <= 64) {
if (WMHCommSendInitList[MsgIdx].FrameCallBackFunc != NULL_P) {
WMHCommSendInitList[MsgIdx].FrameCallBackFunc();
}
data[0] = WMHCommSendInitList[MsgIdx].ID;//id
data[1] = WMH_COMM_PROTOCOL_VERSION;//主协议版本号
data[2] = WMHCommSendInitList[MsgIdx].DLC + 1u;//数据长度
(void)memcpy(&data[3], WMHCommSendInitList[MsgIdx].SignalList, WMHCommSendInitList[MsgIdx].DLC);
data[3 + WMHCommSendInitList[MsgIdx].DLC] = WMHCommSendInitList[MsgIdx].FrameGetCheckSum(WMHCommSendInitList[MsgIdx].ID, WMHCommSendInitList[MsgIdx].DLC, data[1], WMHCommSendInitList[MsgIdx].SignalList);
length = WMHCommSendInitList[MsgIdx].DLC + 4u;
mwWMHCommTransmitBytes(data, length);
WMHCommSendMessageTimeout[MsgIdx] = WMHCommSendInitList[MsgIdx].TimeoutMax;
}
}
else if(MsgIdx == 0)
{
if ((WMHCommSendInitList[MsgIdx].DLC + 4) <= 64) {
if (WMHCommSendInitList[MsgIdx].FrameCallBackFunc != NULL_P) {
WMHCommSendInitList[MsgIdx].FrameCallBackFunc();
}
data[0] = WMHCommSendInitList[MsgIdx].ID;//id
data[1] = WMH_COMM_PROTOCOL_VERSION;//主协议版本号
data[2] = WMHCommSendInitList[MsgIdx].DLC + 1u;//数据长度
(void)memcpy(&data[3], WMHCommSendInitList[MsgIdx].SignalList, WMHCommSendInitList[MsgIdx].DLC);
data[3 + WMHCommSendInitList[MsgIdx].DLC] = WMHCommSendInitList[MsgIdx].FrameGetCheckSum(WMHCommSendInitList[MsgIdx].ID, WMHCommSendInitList[MsgIdx].DLC, data[1], WMHCommSendInitList[MsgIdx].SignalList);
length = WMHCommSendInitList[MsgIdx].DLC + 4u;
mwWMHCommTransmitBytes_90(data, length);
WMHCommSendMessageTimeout[MsgIdx] = WMHCommSendInitList[MsgIdx].TimeoutMax;
}
}
}
void WMHCommFrameUnpacked(uint8_t *data, uint32_t length)
{
uint32_t i = EM_WMH_COMM_RECV_MSG_WI_BOX_0x80;
if (length > 0) {
if (data[0] == WMHCommRecvInitList[i].ID) {
if ((data[2] == (WMHCommRecvInitList[i].DLC + 1)) && (length == (WMHCommRecvInitList[i].DLC + 4))) {
if (data[length - 1] == WMHCommRecvInitList[i].FrameGetCheckSum(data[0], WMHCommRecvInitList[i].DLC, data[1], &data[3])) {
(void)memcpy(WMHCommRecvInitList[i].SignalList, &data[3], WMHCommRecvInitList[i].DLC);
if (WMHCommRecvInitList[i].FrameCallBackFunc != NULL_P) {
WMHCommRecvInitList[i].FrameCallBackFunc();
}
WMHCommRecvMessageTimeout[i] = WMHCommRecvInitList[i].TimeoutMax;
Can_Msg_Tx_Overwrite(&CAN_CH4_CanMsgTxOp,0u,1u,1000u);
}
}
}
}
}
void WMHCommTimeoutService(uint32_t TimerDelta)
{
uint8_t i = 0;
for (i = 0; i < EM_WMH_COMM_RECV_MSG_TOTAL; i++) {
if (WMHCommRecvMessageTimeout[i] > TimerDelta) {
WMHCommRecvMessageTimeout[i] -= TimerDelta;
} else {
if (WMHCommRecvMessageTimeout[i] > 0) {
if (WMHCommRecvInitList[i].FrameTimeoutFunc != NULL_P) {
WMHCommRecvInitList[i].FrameTimeoutFunc();
}
}
WMHCommRecvMessageTimeout[i] = 0;
}
}
for (i = 0; i < EM_WMH_COMM_SEND_MSG_TOTAL; i++) {
if (WMHCommSendMessageTimeout[i] > TimerDelta) {
WMHCommSendMessageTimeout[i] -= TimerDelta;
} else {
if (WMHCommSendMessageTimeout[i] > 0) {
if (WMHCommSendInitList[i].FrameTimeoutFunc != NULL_P) {
WMHCommSendInitList[i].FrameTimeoutFunc();
}
}
WMHCommSendMessageTimeout[i] = 0;
}
}
}
uint32_t WMHCommServiceCnts = 0;
void WMHCommService(uint32_t TimerDelta)
{
uint8_t data[64] = {0};
uint32_t length = 0;
uint32_t tmpPos = 0;
uint8_t *tmpAddr = NULL_P;
uint8_t i = 0;
WMHCommTimeoutService(TimerDelta);
WMHCommServiceCnts += TimerDelta;
if (WMHCommServiceCnts >= 50) {
WMHCommServiceCnts = 0;
//mwWMHCommTransmitBytes(tmpBuffer, length);
tmpAddr = mwWMHCommGetRecvData(&length, &tmpPos);
if (tmpAddr != NULL_P) {
i = 0;
while (WMHCommAnalysisPos != tmpPos) {
data[i++] = (tmpAddr[WMHCommAnalysisPos++]);
WMHCommAnalysisPos = WMHCommAnalysisPos % length;
}
// if (SYS_OPR_STAT_IGN_ON)
// {
WMHCommFrameUnpacked(data, i);
// }
}
}
}
uint8_t WMHCommFrameGetRecvTimeoutSt(uint8_t n)
{
uint8_t ret = 0;
if (n < EM_WMH_COMM_RECV_MSG_TOTAL) {
ret = (uint8_t)(WMHCommRecvMessageTimeout[n] == 0);
}
return ret;
}
#ifndef __WMH_COMM_H_
#define __WMH_COMM_H_
#include "TYW_stdint.h"
#define NULL_P (void *)0
typedef struct {
uint8_t ID; //ID;
uint16_t Peroid; //报文周期,单位ms;
uint8_t DLC; //报文长度;
uint16_t TimeoutMax; //最大超时时间,单位ms;
uint8_t RecoverContinueCnts; //报文超时后连续收到RecoverContinueCnts条判定报文恢复,报文周期不超过Peroid*1.2,填0或1为收到1条报文即判定报文恢复;
uint8_t *SignalList; //信号列表数组
void (*FrameCallBackFunc)(void); //收到报文时会调用该回调函数;
void (*FrameTimeoutFunc)(void); //TimeoutMax超时时会调用FrameTimeoutFunc(0),TimeoutLv[0]超时时调用FrameTimeoutFunc(1),TimeoutLv[1]超时时调用FrameTimeoutFunc(2),TimeoutLv[2]超时时调用FrameTimeoutFunc(3);
uint8_t (*FrameGetCheckSum)(uint32_t ID, uint8_t DLC, uint8_t ProtocolVersion, uint8_t *data); //接收报文时调用该函数,返回1表示checksum正确,0表示错误,如果错误,则不会调用FrameAnalysisFunc函数
} WMH_COMM_INIT_FRAME_T;
typedef enum {
EM_WMH_COMM_RECV_MSG_WI_BOX_0x80 = 0,
// EM_WMH_COMM_RECV_MSG_WI_BOX_0x91,
// EM_WMH_COMM_RECV_MSG_WI_BOX_0x92,
EM_WMH_COMM_RECV_MSG_TOTAL,
} EM_WMH_COMM_RECV_MSG_T;
typedef enum {
// EM_WMH_COMM_SEND_MSG_ICM_0x80 = 0,
EM_WMH_COMM_SEND_MSG_ICM_0x90 = 0,
EM_WMH_COMM_SEND_MSG_ICM_0x91,
EM_WMH_COMM_SEND_MSG_ICM_0x92,
EM_WMH_COMM_SEND_MSG_TOTAL,
} EM_WMH_COMM_SEND_MSG_T;
extern void WMHCommInit(void);
extern void WMHCommService(uint32_t TimerDelta);
extern void WMHCommFramePackedTransmit(EM_WMH_COMM_SEND_MSG_T MsgIdx);
extern uint8_t WMHCommFrameGetRecvTimeoutSt(uint8_t n);
#endif
#include "wmhcomm.h"
#include "wmhcommdata.h"
#include "TYW_stdint.h"
#include "string.h"
uint8_t WMHCommFrameCheckSumFunc(uint32_t ID, uint8_t DLC, uint8_t ProtocolVersion, uint8_t *data)
{
uint32_t ret = 0;
uint8_t i = 0;
ret += ID;
ret += ProtocolVersion;
ret += DLC + 1;
for (i = 0; i < DLC; i++) {
ret += data[i];
}
return (uint8_t)(ret & 0xFF);
}
/*******************************************************************************************
* Recv Message
*******************************************************************************************/
extern const WMH_COMM_INIT_FRAME_T WMHCommRecvInitList[EM_WMH_COMM_RECV_MSG_TOTAL];
COMM_DATA_UNION_WI_BOX_0x80 WMHCommDataWiBox_0x80;
COMM_DATA_UNION_WI_BOX_0x90 WMHCommDataWiBox_0x90;
COMM_DATA_UNION_WI_BOX_0x91 WMHCommDataWiBox_0x91;
COMM_DATA_UNION_WI_BOX_0x92 WMHCommDataWiBox_0x92;
void WMHCommFrameCallBack_WiBox_0x80(void)
{
uint8_t tmpCond = 0;
}
void WMHCommFrameCallBack_WiBox_0x90(void)
{
uint8_t tmpCond = 0;
}
void WMHCommFrameCallBack_WiBox_0x91(void)
{
uint8_t tmpCond = 0;
}
void WMHCommFrameTimeoutFunc_WiBox(void)
{
// 替代第一个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X90; i++) {
WMHCommDataWiBox_0x90.Bytes[i] = 0;
}
// 替代第二个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X91; i++) {
WMHCommDataWiBox_0x91.Bytes[i] = 0;
}
// 替代第三个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X92; i++) {
WMHCommDataWiBox_0x92.Bytes[i] = 0;
}
}
void WMHCommFrameTimeoutFunc_WiBox_90(void)
{
// 替代第一个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X90; i++) {
WMHCommDataWiBox_0x90.Bytes[i] = 0;
}
}
void WMHCommFrameTimeoutFunc_WiBox_91(void)
{
// 替代第二个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X91; i++) {
WMHCommDataWiBox_0x91.Bytes[i] = 0;
}
}
void WMHCommFrameTimeoutFunc_WiBox_92(void)
{
// 替代第三个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X92; i++) {
WMHCommDataWiBox_0x92.Bytes[i] = 0;
}
}
void WMHCommFrameTimeoutFunc_WiBox80(void)
{
// 替代第一个 memset
for (int i = 0; i < COMM_DATA_UNION_WI_BOX_LENGTH_0X80; i++) {
WMHCommDataWiBox_0x80.Bytes[i] = 0;
}
}
/*******************************************************************************************
* Send Message
*******************************************************************************************/
COMM_DATA_UNION_ICM WMHCommDataIcm;
// uint8_t count = 0;
void WMHCommFrameCallBack_Icm(void)
{
// uint8_t CardKind = 0;
// //EM_FUEL_STATE_T tmpSt = GetFuelModuleState();
// uint32_t tmpVal = Data_ODO_Read() / 10u;
// WMHCommDataIcm.bits.Mileage_H = 0x11;
// WMHCommDataIcm.bits.Mileage_M = 0x33;
// WMHCommDataIcm.bits.Mileage_L = 0x44;
// //if(WMHCommDataWiBox_0x92.bits.Inquire == 0x11)
// {
// if (tmpVal > 9999999) {
// tmpVal = 9999999;
// }
// // WMHCommDataIcm.bits.Mileage_H = (tmpVal >> 16) & 0xFF;
// // WMHCommDataIcm.bits.Mileage_M = (tmpVal >> 8) & 0xFF;
// // WMHCommDataIcm.bits.Mileage_L = (tmpVal) & 0xFF;
// WMHCommDataIcm.bits.Mileage_H = 0x11;
// WMHCommDataIcm.bits.Mileage_M = 0x33;
// WMHCommDataIcm.bits.Mileage_L = 0x44;
// }
// if(WMHCommDataWiBox_0x92.bits.Inquire == 0x22)
// {
// count = WMHCommDataWiBox_0x92.bits.Card_H / 16;
// if(NFC_CARD[count-1][1] == 0)
// {
// CardKind = 2;
// }
// else
// {
// CardKind = 1;
// }
// WMHCommDataIcm.bits.CardKind = CardKind;
// WMHCommDataIcm.bits.CardNum = count*16+count;
// WMHCommDataIcm.bits.CardID1 = NFC_CARD[count-1][2];
// WMHCommDataIcm.bits.CardID2 = NFC_CARD[count-1][3];
// WMHCommDataIcm.bits.CardID3 = NFC_CARD[count-1][4];
// WMHCommDataIcm.bits.CardID4 = NFC_CARD[count-1][5];
// WMHCommDataIcm.bits.CardTotal = Study_CardCount;
// }
// else
// {
// count = 0;
// WMHCommDataIcm.bits.CardKind = 0;
// WMHCommDataIcm.bits.CardNum = 0;
// WMHCommDataIcm.bits.CardID1 = 0;
// WMHCommDataIcm.bits.CardID2 = 0;
// WMHCommDataIcm.bits.CardID3 = 0;
// WMHCommDataIcm.bits.CardID4 = 0;
// WMHCommDataIcm.bits.CardTotal = 0;
// }
// if(WMHCommDataWiBox_0x92.bits.NfcOperate == 0x11)
// {
// WMHCommDataIcm.bits.AddCardStatus = Add_Card_Status;
// if(WMHCommDataIcm.bits.AddCardStatus == 2)
// {
// WMHCommDataIcm.bits.CardKind = NFC_CARD[NFC_Empty_card][1];
// WMHCommDataIcm.bits.CardNum = (NFC_Empty_card + 1)*17;
// WMHCommDataIcm.bits.CardID1 = NFC_CARD[NFC_Empty_card][2];
// WMHCommDataIcm.bits.CardID2 = NFC_CARD[NFC_Empty_card][3];
// WMHCommDataIcm.bits.CardID3 = NFC_CARD[NFC_Empty_card][4];
// WMHCommDataIcm.bits.CardID4 = NFC_CARD[NFC_Empty_card][5];
// WMHCommDataIcm.bits.CardTotal = Study_CardCount;
// }
// else if(WMHCommDataIcm.bits.AddCardStatus == 1)
// {
// WMHCommDataIcm.bits.CardKind = 0;
// WMHCommDataIcm.bits.CardNum = (NFC_Empty_card + 1)*17;
// WMHCommDataIcm.bits.CardID1 = 0;
// WMHCommDataIcm.bits.CardID2 = 0;
// WMHCommDataIcm.bits.CardID3 = 0;
// WMHCommDataIcm.bits.CardID4 = 0;
// WMHCommDataIcm.bits.CardTotal = Study_CardCount;
// }
// else
// {
// WMHCommDataIcm.bits.CardKind = 0;
// WMHCommDataIcm.bits.CardNum = 0;
// WMHCommDataIcm.bits.CardID1 = 0;
// WMHCommDataIcm.bits.CardID2 = 0;
// WMHCommDataIcm.bits.CardID3 = 0;
// WMHCommDataIcm.bits.CardID4 = 0;
// WMHCommDataIcm.bits.CardTotal = Study_CardCount;
// }
// WMHCommDataIcm.bits.RemoveCardStatus = 0;
// }
// else if(WMHCommDataWiBox_0x92.bits.NfcOperate == 0x22)
// {
// WMHCommDataIcm.bits.RemoveCardStatus = 2;
// WMHCommDataIcm.bits.AddCardStatus = 0;
// }
// else
// {
// WMHCommDataIcm.bits.AddCardStatus = 0xFF;
// WMHCommDataIcm.bits.RemoveCardStatus = 0xFF;
// }
// WMHCommDataIcm.bits.Reserved = 0xFF;
// WMHCommDataWiBox_0x90.bits.Espeed_L = 0xDD;
}
void WMHCommFrameTimeoutFunc_Icm(void)
{
//if((WMHCommDataWiBox_0x92.bits.Inquire != 0)||(WMHCommDataWiBox_0x92.bits.NfcOperate != 0 ))
{
//WMHCommFramePackedTransmit(EM_WMH_COMM_SEND_MSG_ICM_0x80);
}
}
This diff is collapsed.
This diff is collapsed.
#ifndef __MW_WMH_COMM_H_
#define __MW_WMH_COMM_H_
#include "TYW_stdint.h"
#define NULL_P (void *)0
typedef enum {
EM_WMH_COMM_PIN_TX_IDX = 0, //91,92
EM_WMH_COMM_PIN_TX_ID_0x90, //90
EM_WMH_COMM_PIN_RX_ID_wibox,
EM_WMH_COMM_PIN_TOTAL,
} EM_WMH_COMM_PIN_T;
// static const IO_NUM_ENUM mwWMHCommPin[EM_WMH_COMM_PIN_TOTAL] = {
// IO_NUM_MCU_ONE_LINE_COMM_TX,
// IO_NUM_MCU_ONE_LINE_COMM_RX,
// };
typedef enum {
EM_WMH_COMM_FRAME_STANDBAY = 0,
EM_WMH_COMM_FRAME_START,
EM_WMH_COMM_FRAME_LOGIC_1,
EM_WMH_COMM_FRAME_LOGIC_0,
EM_WMH_COMM_FRAME_STOP,
EM_WMH_COMM_FRAME_TOTAL,
} EM_WMH_COMM_FRAME_T;
typedef struct {
uint32_t LowLevelTime; // us
uint32_t HighLevelTime; // us
} MW_WMH_COMM_TIMER_T;
typedef struct {
MW_WMH_COMM_TIMER_T Standard;
MW_WMH_COMM_TIMER_T UpperLimit;
MW_WMH_COMM_TIMER_T LowerLimit;
} MW_WMH_COMM_SEQUENTIAL_T;
extern void mwWMHCommInit(void);
extern void mwWMHCommRecvIsr_0x90(uint32_t tmpCnts);
extern void mwWMHCommRecvIsr_wibox(uint32_t tmpCnts);
extern void mwWMHCommSendIsr(uint32_t tmpCnts);
extern void mwWMHCommSendIsr_90(uint32_t tmpCnts);
extern void mwWMHCommTransmitBytes(uint8_t *data, uint32_t length);
extern void mwWMHCommTransmitBytes_90(uint8_t *data, uint32_t length);
extern uint8_t *mwWMHCommGetRecvData(uint32_t *BufferLen, uint32_t *RecvPos);
extern void mwWMHCommRecvByte_0x90(uint8_t data);
extern void mwWMHCommRecvByte_wibox(uint8_t data);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment