|
@@ -7,7 +7,8 @@
|
|
|
#include "AppTaskCan.h"
|
|
|
static void CanDataAsk(QueueDataTrans_Type AskData);
|
|
|
uint8 DataPackCounter[21] = {1,1,7,5,16,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
|
|
|
-
|
|
|
+static void UdsAns(bool PosFlg,uint8 UdsService,uint8 UdsSubService,uint8 Idx,uint8 *AnsData,uint8 AnsDataLen);
|
|
|
+void udsService(uint8 *DataIn);
|
|
|
static void vCanRxCallback(TimerHandle_t pxTimer)
|
|
|
{
|
|
|
uint32 ulTimerID;
|
|
@@ -164,6 +165,11 @@ void BleCanTransmit(uint32 AskCanID, uint8 AskData[])
|
|
|
}
|
|
|
PackState = 0;
|
|
|
}
|
|
|
+ CanTxMsg.id = AnsCanID;
|
|
|
+ CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
return;
|
|
|
}
|
|
|
case 0X1CEE0001: //查询
|
|
@@ -187,6 +193,11 @@ void BleCanTransmit(uint32 AskCanID, uint8 AskData[])
|
|
|
AnsData[6] = (BleMacAddr[5]) & 0xFF;
|
|
|
}
|
|
|
AnsCanID = 0X1CEF0001;
|
|
|
+ CanTxMsg.id = AnsCanID;
|
|
|
+ CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
break;
|
|
|
}
|
|
|
case 0X1CEE0002: //连接控制
|
|
@@ -215,6 +226,11 @@ void BleCanTransmit(uint32 AskCanID, uint8 AskData[])
|
|
|
AnsData[1] = 3;
|
|
|
}
|
|
|
AnsCanID = 0X1CEF0002;
|
|
|
+ CanTxMsg.id = AnsCanID;
|
|
|
+ CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
break;
|
|
|
}
|
|
|
case 0X1CEE0003: //角色控制
|
|
@@ -232,6 +248,11 @@ void BleCanTransmit(uint32 AskCanID, uint8 AskData[])
|
|
|
AnsData[1] = BleSetRole;
|
|
|
}
|
|
|
AnsCanID = 0X1CEF0003;
|
|
|
+ CanTxMsg.id = AnsCanID;
|
|
|
+ CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
break;
|
|
|
}
|
|
|
case 0X1CEE0004: //蓝牙开关机控制
|
|
@@ -257,16 +278,141 @@ void BleCanTransmit(uint32 AskCanID, uint8 AskData[])
|
|
|
AnsData[1] = AskData[1];
|
|
|
}
|
|
|
AnsCanID = 0X1CEF0004;
|
|
|
+ CanTxMsg.id = AnsCanID;
|
|
|
+ CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x1C00EBEA:
|
|
|
+ {
|
|
|
+ udsService(AskData);
|
|
|
break;
|
|
|
}
|
|
|
default:
|
|
|
return;
|
|
|
break;
|
|
|
}
|
|
|
- CanTxMsg.id = AnsCanID;
|
|
|
+ return;
|
|
|
+}
|
|
|
+void udsService(uint8 *DataIn)
|
|
|
+{
|
|
|
+ static uint8 udsMode = 0;
|
|
|
+ uint8 UdsService = *(DataIn + 0);
|
|
|
+ uint8 UdsSubService = *(DataIn + 1);
|
|
|
+ uint8 AnsData[8]={0};
|
|
|
+ switch(UdsService)
|
|
|
+ {
|
|
|
+ case 0x10:
|
|
|
+ {
|
|
|
+ if(UdsSubService==0x01)
|
|
|
+ {
|
|
|
+ udsMode = 1;
|
|
|
+ UdsAns(true,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ }
|
|
|
+ else if(*(DataIn+1)==0x02)
|
|
|
+ {
|
|
|
+ if(udsMode==1||udsMode==2)
|
|
|
+ {
|
|
|
+ udsMode = 2;
|
|
|
+ UdsAns(true,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ udsMode = 0;
|
|
|
+ UdsAns(false,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ udsMode = 0;
|
|
|
+ UdsAns(false,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x22:
|
|
|
+ {
|
|
|
+ if(udsMode==2)
|
|
|
+ {
|
|
|
+ switch(UdsSubService)
|
|
|
+ {
|
|
|
+ case 0x01://软件版本查询
|
|
|
+ {
|
|
|
+ AnsData[0] = (BleVersion >> 24) & 0xFF;
|
|
|
+ AnsData[1] = (BleVersion >> 16) & 0xFF;
|
|
|
+ AnsData[2] = (BleVersion >> 8) & 0xFF;
|
|
|
+ AnsData[3] = (BleVersion >> 0) & 0xFF;
|
|
|
+ UdsAns(true,UdsService,UdsSubService,0x00,AnsData,4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x02://MAC地址查询
|
|
|
+ {
|
|
|
+ memcpy(AnsData,BleMacAddr,6);
|
|
|
+ for(uint8 i=0;i<2;i++)
|
|
|
+ {
|
|
|
+ UdsAns(true,UdsService,UdsSubService,i,&AnsData[i*4],4);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x03://角色查询
|
|
|
+ {
|
|
|
+ AnsData[0] = (BleCurrentRole) & 0xFF;
|
|
|
+ UdsAns(true,UdsService,UdsSubService,0x00,AnsData,1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x04://连接查询
|
|
|
+ {
|
|
|
+ AnsData[0] = (BleConnectFlg) & 0xFF;
|
|
|
+ UdsAns(true,UdsService,UdsSubService,0x00,AnsData,1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ UdsAns(false,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ UdsAns(false,UdsService,UdsSubService,0x00,NULL,0);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ {
|
|
|
+ UdsAns(false,0x00,0x00,0x00,NULL,0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+static void UdsAns(bool PosFlg,uint8 UdsService,uint8 UdsSubService,uint8 Idx,uint8 *AnsData,uint8 AnsDataLen)
|
|
|
+{
|
|
|
+ Can_Msg_Type CanTxMsg;
|
|
|
+ uint32 CanAnsId = 0x1C00EAEB;
|
|
|
+ uint8 SendData[8] = {0};
|
|
|
+ if(PosFlg)
|
|
|
+ {
|
|
|
+ SendData[0] = 0x78;
|
|
|
+ SendData[1] = UdsService;
|
|
|
+ SendData[2] = UdsSubService;
|
|
|
+ SendData[3] = Idx;
|
|
|
+ if(AnsData!=NULL&&AnsDataLen!=0x00)
|
|
|
+ {
|
|
|
+ memcpy(&SendData[4],AnsData,AnsDataLen);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SendData[0] = 0x7F;
|
|
|
+ SendData[1] = UdsService;
|
|
|
+ SendData[2] = UdsSubService;
|
|
|
+ SendData[3] = 0x00;
|
|
|
+ }
|
|
|
+ CanTxMsg.id = CanAnsId;
|
|
|
CanTxMsg.idFrame = CAN_EXTENDED_ID_TYPE;
|
|
|
- CanTxMsg.sdu = AnsData;
|
|
|
+ CanTxMsg.sdu = SendData;
|
|
|
CanTxMsg.length = 8;
|
|
|
CanIf_SendMessage(0, CanTxMsg);
|
|
|
- return;
|
|
|
}
|