|
@@ -7,8 +7,14 @@
|
|
|
#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 uint32 timerConuter = 0;
|
|
|
static void UdsAns(bool PosFlg,uint8 UdsService,uint8 UdsSubService,uint8 Idx,uint8 *AnsData,uint8 AnsDataLen);
|
|
|
void udsService(uint8 *DataIn);
|
|
|
+static void dataInit();
|
|
|
+static void appFunc();
|
|
|
+static void CanSend100ms(void);
|
|
|
+static void CanDecode(uint32 AskCanID, uint8 AskData[]);
|
|
|
+static void uartDataDecode(uint8 Data[]);
|
|
|
static void vCanRxCallback(TimerHandle_t pxTimer)
|
|
|
{
|
|
|
uint32 ulTimerID;
|
|
@@ -16,9 +22,9 @@ static void vCanRxCallback(TimerHandle_t pxTimer)
|
|
|
if(ulTimerID==0)
|
|
|
{
|
|
|
Can_MainFunction_Read();
|
|
|
+ timerConuter++;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
void CanTask()
|
|
|
{
|
|
|
CanRecvQueueHandle = xQueueCreate(16, sizeof(Can_Msg_Type_Data)); // CAN获取消息队列创建
|
|
@@ -32,7 +38,10 @@ void CanTask()
|
|
|
TimerHandle_t monitorTimer1ms;
|
|
|
monitorTimer1ms = xTimerCreate("monitor1ms",1,pdTRUE,(void *)0,vCanRxCallback);
|
|
|
xTimerStart(monitorTimer1ms,0);
|
|
|
-
|
|
|
+ uint32 canRecvDelay = 0;
|
|
|
+ sint8 QueueRet = -1;
|
|
|
+ uint8 uartData[10] = {0};
|
|
|
+ uint32 canSendCounter = 0;
|
|
|
while (TRUE)
|
|
|
{
|
|
|
switch (CanState)
|
|
@@ -45,23 +54,403 @@ void CanTask()
|
|
|
case 1:
|
|
|
{
|
|
|
memset(&CanRxMsg, 0, sizeof(CanRxMsg));
|
|
|
- // Can_MainFunction_Read();
|
|
|
- BaseType_t ret = xQueueReceive(CanRecvQueueHandle, &CanRxMsg, 0);
|
|
|
+ BaseType_t ret = xQueueReceive(CanRecvQueueHandle, &CanRxMsg, 10);
|
|
|
if (ret == pdPASS)
|
|
|
{
|
|
|
- BleCanTransmit(CanRxMsg.id, CanRxMsg.data);
|
|
|
+ CanDecode(CanRxMsg.id, CanRxMsg.data);
|
|
|
+ canRecvDelay = 0;
|
|
|
}
|
|
|
- BaseType_t ret2 = xQueueReceive(Uart2ToCanDataHandle,&CanAskData,10);//带有校验码
|
|
|
- if (ret2 == pdPASS)
|
|
|
+ else
|
|
|
{
|
|
|
- CanDataAsk(CanAskData);
|
|
|
+ canRecvDelay = canRecvDelay + 10;
|
|
|
+ }
|
|
|
+ if(canRecvDelay>10*1000)
|
|
|
+ {
|
|
|
+ canRecvDelay = 0;
|
|
|
+ dataInit();
|
|
|
+ }
|
|
|
+ QueueRet = xQueueReceive(McuDataSendHandle,uartData,0);
|
|
|
+ if(QueueRet==pdPASS)//串口数据解析
|
|
|
+ {
|
|
|
+ uartDataDecode(uartData);// 解码
|
|
|
+ }
|
|
|
+ if((timerConuter - canSendCounter)>100)//100ms
|
|
|
+ {
|
|
|
+ canSendCounter = timerConuter;
|
|
|
+ appFunc();
|
|
|
+ CanSend100ms();
|
|
|
}
|
|
|
-// vTaskDelay(pdMS_TO_TICKS(10));
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+static void uartDataDecode(uint8 Data[])
|
|
|
+{
|
|
|
+
|
|
|
+ uint8 CmdIndex = Data[0];
|
|
|
+ BleRecvDataFromUart2 DataSend={0,NULL};
|
|
|
+ uint8 ReadLen = 0;
|
|
|
+ sint8 McuDataRet = -1;
|
|
|
+ switch (CmdIndex)
|
|
|
+ {
|
|
|
+ case 0x01: //心跳数据,为了维持通讯
|
|
|
+ {
|
|
|
+ uint16 CrcChkCal = 0;
|
|
|
+ ReadLen = 9;
|
|
|
+ DataSend.RealLen = ReadLen;
|
|
|
+ DataSend.DataPtr = malloc(ReadLen+1);
|
|
|
+ memset(DataSend.DataPtr,0x00,ReadLen+1);
|
|
|
+ *(DataSend.DataPtr+0) = 0x11;
|
|
|
+ *(DataSend.DataPtr+1) = 0x02;
|
|
|
+ *(DataSend.DataPtr+2) = 0x00;
|
|
|
+ *(DataSend.DataPtr+3) = 0x01;
|
|
|
+ CrcChkCal = CRC16_Modbus(DataSend.DataPtr,ReadLen-2);
|
|
|
+ *(DataSend.DataPtr+7) = CrcChkCal;
|
|
|
+ *(DataSend.DataPtr+8) = CrcChkCal>>8;
|
|
|
+ McuDataRet= xQueueSend(McuDataRecvHandle,&DataSend,1000*2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x02: //获取换电控制器信息
|
|
|
+ {
|
|
|
+ uint16 CrcChkCal = 0;
|
|
|
+ ReadLen = 51;
|
|
|
+ DataSend.RealLen = ReadLen;
|
|
|
+ DataSend.DataPtr = malloc(ReadLen+1);
|
|
|
+ memset(DataSend.DataPtr,0x00,ReadLen+1);
|
|
|
+ *(DataSend.DataPtr+7*0 + 0) = 0x21;
|
|
|
+ *(DataSend.DataPtr+7*0 + 1) = unlockFlg;
|
|
|
+ *(DataSend.DataPtr+7*0 + 2) = lockFlg;
|
|
|
+ *(DataSend.DataPtr+7*0 + 3) = VehPowerMode;
|
|
|
+ *(DataSend.DataPtr+7*1) = 0x22;
|
|
|
+ *(DataSend.DataPtr+7*2) = 0x23;
|
|
|
+ *(DataSend.DataPtr+7*3) = 0x24;
|
|
|
+ *(DataSend.DataPtr+7*4) = 0x25;
|
|
|
+ *(DataSend.DataPtr+7*5) = 0x26;
|
|
|
+ *(DataSend.DataPtr+7*6) = 0x27;
|
|
|
+ CrcChkCal = CRC16_Modbus(DataSend.DataPtr,ReadLen-2);
|
|
|
+ *(DataSend.DataPtr+49) = CrcChkCal;
|
|
|
+ *(DataSend.DataPtr+50) = CrcChkCal>>8;
|
|
|
+ McuDataRet= xQueueSend(McuDataRecvHandle,&DataSend,1000*2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x03: //获得车辆信息
|
|
|
+ {
|
|
|
+ uint16 CrcChkCal = 0;
|
|
|
+ ReadLen = 37;
|
|
|
+ DataSend.RealLen = ReadLen;
|
|
|
+ DataSend.DataPtr = malloc(ReadLen+1);
|
|
|
+ memset(DataSend.DataPtr,0x00,ReadLen+1);
|
|
|
+ *(DataSend.DataPtr+7*0 + 0) = 0x31;
|
|
|
+ *(DataSend.DataPtr+7*0 + 1) = EPBWorkingSts;
|
|
|
+ *(DataSend.DataPtr+7*0 + 2) = BrakeSwitchSts;
|
|
|
+ *(DataSend.DataPtr+7*0 + 3) = 0x00;
|
|
|
+ *(DataSend.DataPtr+7*0 + 3) = VehPowerMode;
|
|
|
+ *(DataSend.DataPtr+7*1) = 0x32;
|
|
|
+ *(DataSend.DataPtr+7*2) = 0x33;
|
|
|
+ *(DataSend.DataPtr+7*3) = 0x34;
|
|
|
+ *(DataSend.DataPtr+7*4) = 0x35;
|
|
|
+ CrcChkCal = CRC16_Modbus(DataSend.DataPtr,ReadLen-2);
|
|
|
+ *(DataSend.DataPtr+35) = CrcChkCal;
|
|
|
+ *(DataSend.DataPtr+36) = CrcChkCal>>8;
|
|
|
+ McuDataRet= xQueueSend(McuDataRecvHandle,&DataSend,1000*2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x04: //获取电池信息
|
|
|
+ {
|
|
|
+ uint16 CrcChkCal = 0;
|
|
|
+ ReadLen = 16*7+2;
|
|
|
+ DataSend.RealLen = ReadLen;
|
|
|
+ DataSend.DataPtr = malloc(ReadLen+1);
|
|
|
+ memset(DataSend.DataPtr,0x00,ReadLen+1);
|
|
|
+ *(DataSend.DataPtr+7*0) = 0x40;
|
|
|
+ *(DataSend.DataPtr+7*1) = 0x41;
|
|
|
+ *(DataSend.DataPtr+7*2) = 0x42;
|
|
|
+ *(DataSend.DataPtr+7*3) = 0x43;
|
|
|
+ *(DataSend.DataPtr+7*4) = 0x44;
|
|
|
+ *(DataSend.DataPtr+7*5) = 0x45;
|
|
|
+ *(DataSend.DataPtr+7*6) = 0x46;
|
|
|
+ *(DataSend.DataPtr+7*7) = 0x47;
|
|
|
+ *(DataSend.DataPtr+7*8) = 0x48;
|
|
|
+ *(DataSend.DataPtr+7*9) = 0x49;
|
|
|
+ *(DataSend.DataPtr+7*10) = 0x4A;
|
|
|
+ *(DataSend.DataPtr+7*11) = 0x4B;
|
|
|
+ *(DataSend.DataPtr+7*12) = 0x4C;
|
|
|
+ *(DataSend.DataPtr+7*13) = 0x4D;
|
|
|
+ *(DataSend.DataPtr+7*14) = 0x4E;
|
|
|
+ *(DataSend.DataPtr+7*15) = 0x4F;
|
|
|
+ CrcChkCal = CRC16_Modbus(DataSend.DataPtr,ReadLen-2);
|
|
|
+ *(DataSend.DataPtr+112) = CrcChkCal;
|
|
|
+ *(DataSend.DataPtr+113) = CrcChkCal>>8;
|
|
|
+ McuDataRet= xQueueSend(McuDataRecvHandle,&DataSend,1000*2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x05: //握手
|
|
|
+ {
|
|
|
+ uint16 CrcChkCal = 0;
|
|
|
+ ReadLen = 1*7+2;
|
|
|
+ DataSend.RealLen = ReadLen;
|
|
|
+ DataSend.DataPtr = malloc(ReadLen+1);
|
|
|
+ memset(DataSend.DataPtr,0x00,ReadLen+1);
|
|
|
+ *(DataSend.DataPtr+7*0) = 0x51;
|
|
|
+ CrcChkCal = CRC16_Modbus(DataSend.DataPtr,ReadLen-2);
|
|
|
+ *(DataSend.DataPtr+1*7+0) = CrcChkCal;
|
|
|
+ *(DataSend.DataPtr+1*7+1) = CrcChkCal>>8;
|
|
|
+ McuDataRet= xQueueSend(McuDataRecvHandle,&DataSend,1000*2);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x06: //解锁
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x07: //锁紧
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x08: //完成换电
|
|
|
+ {
|
|
|
+ swapBattDone = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x09: //强制解锁,强制上升
|
|
|
+ {
|
|
|
+ unlockCmdFlg = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0A: //强制锁紧,强制下降
|
|
|
+ {
|
|
|
+ lockCmdFlg = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0B: //回到行车状态
|
|
|
+ {
|
|
|
+ swapBattDone = 0;
|
|
|
+ backToDrv = 1;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0C: //顶板举升
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0D: //顶板下降
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0E: //换电开始自动解锁
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x0F: //换电完成自动锁紧
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x10: //除尘开始
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x11: //除尘关闭
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x12: //切换到无线通信状态
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x13: //进入换电状态
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case 0x14: //急停指令
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(McuDataRet!=pdPASS)//发送不成功则释放
|
|
|
+ {
|
|
|
+ if(DataSend.DataPtr != NULL)
|
|
|
+ {
|
|
|
+ free(DataSend.DataPtr);
|
|
|
+ }
|
|
|
+ DataSend.DataPtr = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+/*通讯板串口转CAN函数*/
|
|
|
+static void CanSend100ms(void)
|
|
|
+{
|
|
|
+ Can_Msg_Type CanTxMsg;
|
|
|
+ uint8 DataSend[8]={0};
|
|
|
+ uint8 cmdIdx = 1;
|
|
|
+ switch(cmdIdx)
|
|
|
+ {
|
|
|
+ case 1:
|
|
|
+ /*301发送*/
|
|
|
+ memset(DataSend,0x00,8);
|
|
|
+ DataSend[0] = packReadySts;
|
|
|
+ DataSend[1] = 0;
|
|
|
+ DataSend[2] = 0;
|
|
|
+ DataSend[3] = 0;
|
|
|
+ DataSend[4] = 0;
|
|
|
+ DataSend[5] = 0;
|
|
|
+ DataSend[6] = 0;
|
|
|
+ DataSend[7] = 0;
|
|
|
+ CanTxMsg.id = 0x301;
|
|
|
+ CanTxMsg.idFrame = CAN_STANDARD_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = DataSend;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
+// break;
|
|
|
+ case 2:
|
|
|
+ /*302发送*/
|
|
|
+ memset(DataSend,0x00,8);
|
|
|
+ DataSend[0] = ((installPackNum<<4)|installPackLoc)&0xFF;
|
|
|
+ DataSend[1] = cmdSwapBatt;
|
|
|
+ DataSend[2] = 0;
|
|
|
+ DataSend[3] = 0;
|
|
|
+ DataSend[4] = 0;
|
|
|
+ DataSend[5] = 0;
|
|
|
+ DataSend[6] = 0;
|
|
|
+ DataSend[7] = 0;
|
|
|
+ CanTxMsg.id = 0x302;
|
|
|
+ CanTxMsg.idFrame = CAN_STANDARD_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = DataSend;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
+// break;
|
|
|
+ case 3:
|
|
|
+ /*303发送*/
|
|
|
+ if(BleConnectEnable==1)
|
|
|
+ {
|
|
|
+ memcpy(canTargetMac,BleTargetMacAddr,6);
|
|
|
+ memset(DataSend,0x00,8);
|
|
|
+ DataSend[0] = 0;
|
|
|
+ DataSend[1] = connecMacUb;
|
|
|
+ DataSend[2] = canTargetMac[0];
|
|
|
+ DataSend[3] = canTargetMac[1];
|
|
|
+ DataSend[4] = canTargetMac[2];
|
|
|
+ DataSend[5] = canTargetMac[3];
|
|
|
+ DataSend[6] = canTargetMac[4];
|
|
|
+ DataSend[7] = canTargetMac[5];
|
|
|
+ CanTxMsg.id = 0x303;
|
|
|
+ CanTxMsg.idFrame = CAN_STANDARD_ID_TYPE;
|
|
|
+ CanTxMsg.sdu = DataSend;
|
|
|
+ CanTxMsg.length = 8;
|
|
|
+ CanIf_SendMessage(0, CanTxMsg);
|
|
|
+ connecMacUb++;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return;
|
|
|
+}
|
|
|
+static void CanDecode(uint32 AskCanID, uint8 AskData[])
|
|
|
+{
|
|
|
+ switch(AskCanID)
|
|
|
+ {
|
|
|
+ case 0x201:
|
|
|
+ PackExcSts= AskData[0];
|
|
|
+ VehPowerMode = (AskData[1]>>3)&0x01;
|
|
|
+ GearSts = (AskData[1]>>4)&0x01;
|
|
|
+ EPBWorkingSts = (AskData[1]>>5)&0x01;
|
|
|
+ BrakeSwitchSts = (AskData[1]>>6)&0x01;
|
|
|
+ DoorSts = (AskData[1]>>7)&0x01;
|
|
|
+ SteeringWheelAngle = ((AskData[2]&0x07)<<13)|(AskData[2]<<5)|(AskData[3]>>3);
|
|
|
+ BattSwappingAllw = (AskData[3]>>2)&0x01;
|
|
|
+ BlueDisconnectFailFlg = (AskData[3]>>1)&0x01;
|
|
|
+ AllPackPwrDnSts= (AskData[4]>>4)&0x0F;
|
|
|
+ break;
|
|
|
+ case 0x202:
|
|
|
+ break;
|
|
|
+ case 0x203:
|
|
|
+ carBleConnectSts = AskData[0]&0x0F;
|
|
|
+ BleConnectFlg = carBleConnectSts;
|
|
|
+ break;
|
|
|
+ case 0x205:
|
|
|
+ lockAndUnlockSensor[0] = (AskData[1]>>4)&0x0F;
|
|
|
+ lockAndUnlockSensor[1] = (AskData[1])&0x0F;
|
|
|
+ lockAndUnlockSensor[2] = (AskData[2]>>4)&0x0F;
|
|
|
+ lockAndUnlockSensor[3] = (AskData[2])&0x0F;
|
|
|
+ for(uint8 i=0;i<4;i++)
|
|
|
+ {
|
|
|
+ if(lockAndUnlockSensor[i]==0x01)
|
|
|
+ {
|
|
|
+ setbit(lockFlg,i);
|
|
|
+ clrbit(unlockFlg,i);
|
|
|
+ }
|
|
|
+ else if(lockAndUnlockSensor[i]==0x02)
|
|
|
+ {
|
|
|
+ setbit(unlockFlg,i);
|
|
|
+ clrbit(lockFlg,i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+static void dataInit()
|
|
|
+{
|
|
|
+ uint8 AskData[8] = {0};
|
|
|
+ PackExcSts= AskData[0];
|
|
|
+ VehPowerMode = (AskData[1]>>3)&0x01;
|
|
|
+ GearSts = (AskData[1]>>4)&0x01;
|
|
|
+ EPBWorkingSts = (AskData[1]>>5)&0x01;
|
|
|
+ BrakeSwitchSts = (AskData[1]>>6)&0x01;
|
|
|
+ DoorSts = (AskData[1]>>7)&0x01;
|
|
|
+ SteeringWheelAngle = ((AskData[2]&0x07)<<13)|(AskData[2]<<5)|(AskData[3]>>3);
|
|
|
+ BattSwappingAllw = (AskData[3]>>2)&0x01;
|
|
|
+ BlueDisconnectFailFlg = (AskData[3]>>1)&0x01;
|
|
|
+ AllPackPwrDnSts= (AskData[4]>>4)&0x0F;
|
|
|
+ carBleConnectSts = AskData[0]&0x0F;
|
|
|
+}
|
|
|
+static void appFunc()
|
|
|
+{
|
|
|
+ if(BleDisconnectEnable==1)
|
|
|
+ {
|
|
|
+ connecMacUb = 0;
|
|
|
+ cmdSwapBatt = 2;
|
|
|
+ packReadySts = 0;
|
|
|
+ installPackNum = 0;
|
|
|
+ installPackLoc = 0;
|
|
|
+ cmdSwapBatt = 0;
|
|
|
+ }
|
|
|
+ if(carBleConnectSts==1)//蓝牙连接成功
|
|
|
+ {
|
|
|
+ xSemaphoreGive(ConnSemaphore);
|
|
|
+ cmdSwapBatt = 0;
|
|
|
+ }
|
|
|
+ if(unlockCmdFlg)//开始换电
|
|
|
+ {
|
|
|
+ installPackNum = 1;
|
|
|
+ installPackLoc = 1;
|
|
|
+ cmdSwapBatt = 1;
|
|
|
+ }
|
|
|
+ if(swapBattDone)//锁紧到位
|
|
|
+ {
|
|
|
+ packReadySts = 1;
|
|
|
+ connecMacUb = 0;
|
|
|
+ unlockCmdFlg = 0;
|
|
|
+ }
|
|
|
+ if(PackExcSts==0x03)//换电电池检测完成
|
|
|
+ {
|
|
|
+ packReadySts = 0;
|
|
|
+ installPackNum = 0;
|
|
|
+ installPackLoc = 0;
|
|
|
+ cmdSwapBatt = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*常规蓝牙程序函数*/
|
|
|
static void CanDataAsk(QueueDataTrans_Type AskData)
|
|
|
{
|
|
|
Can_Msg_Type CanTxMsg;
|