浏览代码

V1.1.4.1 增加了蓝牙UDS

CHENJIE-PC\QiXiang_CHENJIE 2 年之前
父节点
当前提交
194cc117ef
共有 2 个文件被更改,包括 151 次插入5 次删除
  1. 1 1
      src/AppGlobalVar.c
  2. 150 4
      src/AppTaskCan.c

+ 1 - 1
src/AppGlobalVar.c

@@ -16,7 +16,7 @@
 
 #include "AppGlobalVar.h"
 //*全局变量*//
-uint32 BleVersion = 0x01010301;         // ble的软件版本
+uint32 BleVersion = 0x01010401;         // ble的软件版本
 uint8 BleMacAddr[6];
 uint8 BleTargetMacAddr[6] = {0xBE, 0x84, 0xCC, 0x29, 0x3B, 0xCB};
 uint8 BleCurrentRole = 0;

+ 150 - 4
src/AppTaskCan.c

@@ -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;
 }