Ver código fonte

1、SMART进入方式由长按+改为TURBO档位短按进入;
2、晚上运行时间和开机次数记录和存储;
3、按键黏连故障解除后自动恢复;
4、推行等待超时改为10s退出;

Dail 1 ano atrás
pai
commit
1f97cc4e7b
5 arquivos alterados com 70 adições e 12 exclusões
  1. 11 0
      Src_app/can_process.c
  2. 1 4
      Src_app/eeprom.c
  3. 4 0
      Src_app/functional_safety_key.c
  4. 4 3
      Src_app/led_app.c
  5. 50 5
      Src_app/tasks.c

+ 11 - 0
Src_app/can_process.c

@@ -91,6 +91,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					}					
 					break;
 				}
+				case 0x1808://MC关机指令
+				{
+				  if(strncmp("SHUTDOWN", (char*)Data, DataLength) == 0)
+					{
+					  //...处理存储关键信息
+						EEPROM_DataUpdate();
+						SendData(ID_PBU_BC, MODE_REPORT, 0x1405, (uint8_t*)"READY");
+					}				
+					break;
+				}
 				//MC发送给PBU的指令
 				case 0x5009://在线检测
 				{
@@ -160,6 +170,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  if(strncmp("SHUTDOWN", (char*)Data, DataLength) == 0)
 					{
 					  //...处理存储关键信息
+						EEPROM_DataUpdate();
 						SendData(ID_PBU_BC, MODE_REPORT, 0x1405, (uint8_t*)"READY");
 					}					
 					break;

+ 1 - 4
Src_app/eeprom.c

@@ -217,12 +217,9 @@ static void CopyDataFromEEPROM(void)
 	Error_OK = ReadDataFromEEPROM(EEPROM_LOG_INFO_ADDR_OFFSET, Data_Buf, 16);
 	if(Error_OK == 0)
 	{
-	  #if 0 //Flash存储低位在前,不能直接赋值
-		memcpy(&(PBU_RunLog.RunTime), Data_Buf, 16);
-		#elif 1
 		PBU_RunLog.RunTime = Data_Buf[0] + (Data_Buf[1] << 8 ) + (Data_Buf[2] << 16 ) + (Data_Buf[3] << 24 );
 		PBU_RunLog.PowerOnCnt = Data_Buf[4] + (Data_Buf[5] << 8 ) + (Data_Buf[6] << 16 ) + (Data_Buf[7] << 24 );
-		#endif
+		PBU_RunLog.PowerOnCnt += 1;
 	}	
 	//读取自定义字符串1
 	Error_OK = ReadDataFromEEPROM(EEPROM_USER_INFO1_ADDR_OFFSET, Data_Buf, 16);

+ 4 - 0
Src_app/functional_safety_key.c

@@ -232,6 +232,7 @@ void Error_Key_Process(void)
 	else if(*(Key_Walk.ADC_result)>3000)
 	{
 		Key_Flag.walk_long_press = 0;
+		PBU_hardwareErrorCode.ERROR_Bit.Key_Walk = 0x00;
 		Flag2_1 = 0;
 	}	
 	
@@ -256,6 +257,7 @@ void Error_Key_Process(void)
 	else if(*(Key_Down.ADC_result)>3000)
 	{
 		Key_Flag.dec_long_press = 0;
+		PBU_hardwareErrorCode.ERROR_Bit.Key_Dec = 0x00;
 		Flag3_1 = 0;
 	}	
 
@@ -283,6 +285,7 @@ void Error_Key_Process(void)
 	else if(*(Key_Up.ADC_result)>3000)
 	{
 		Key_Flag.add_long_press = 0;
+		PBU_hardwareErrorCode.ERROR_Bit.Key_Add = 0x00;
 		Flag4_1 = 0;
 	}	
 	
@@ -309,6 +312,7 @@ void Error_Key_Process(void)
 	else 	if(*(Key_Light.ADC_result)>3000)
 	{
 		Key_Flag.light_long_press = 0;
+		PBU_hardwareErrorCode.ERROR_Bit.Key_Light = 0x00;
 		Flag6_1 = 0;
 	}
 }

+ 4 - 3
Src_app/led_app.c

@@ -42,7 +42,7 @@ uint32_t GetErrorCode(void)
 	else ErrorCodeTemp=77;
 	return ErrorCodeTemp;
 }
-void ErrorCode_LEDDisplay( uint32_t ErrorCodeTemp )
+void ErrorCode_LEDDisplay( uint32_t ErrorCodeTemp ) //500ms
 {			
 	switch(ErrorCodeTemp)
 	{
@@ -311,12 +311,13 @@ void Led_Process(void)
 	static 	uint32_t 	 Delay1TimeCnt = 0;
 	static 	uint8_t 	 Flag1 = 0, ErrorFirstFlag=0;
 	static	uint32_t	 Error_TimeCnt =0;	
-	if( (PBU_ErrorCode.Code!=0)||(MC_ErrorCode.Code!=0))
+	
+	if((PBU_hardwareErrorCode.Code!=0) || (PBU_commErrorCode.Code!=0) || (MC_ErrorCode.Code!=0))
 	{		
 		if(ErrorFirstFlag == 0) //获取第一个故障码,故障码指示灯清零
 	  {
 		  ErrorFirstFlag = 1;	
-			ErrorCodeFinal=GetErrorCode();			     
+			ErrorCodeFinal = GetErrorCode();			     
 			Error_TimeCnt = SysTime_5ms;			
 		  LED_INIT();
 	  }

+ 50 - 5
Src_app/tasks.c

@@ -245,7 +245,8 @@ static void _Task_KeyScan(void)
 		//Key_Up按键处理
 		if(Key_Up.KeyStatus != Key_Status_NoPress )
 		{
-				if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
+			#if 0 //长按进入SMART,短按退出
+			if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
 			{
 					Key_Up.KeyStatus = Key_Status_NoPress;
 				//按键测试模式,按键置位
@@ -288,6 +289,40 @@ static void _Task_KeyScan(void)
 					}
 				}
 			}
+			#else //短按进入SMART
+			if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
+			{
+					Key_Up.KeyStatus = Key_Status_NoPress;
+				//按键测试模式,按键置位
+				if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
+				{
+						PBU_Test_Process.KeyTest_Status.Status_Bit.Add = 1;
+				}
+				//助力控制模式,调节档位
+				else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
+				{
+					if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
+					{
+						if(ControlCode.GearSt < PBU_ConfigParam.GearsNum) //0~4档
+						{
+							ControlCode.GearSt++;
+							PBU_AssitMode_Status.GearStBak_Smart++;
+							PBU_AssitMode_Status.GearStBak_Walk++;
+						}
+						else //到达4档后再次按下,会一直停留在SMART
+						{
+							PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
+						  PBU_AssitMode_Status.GearStBak_Smart = ControlCode.GearSt;
+						}
+					}					
+				}
+			}
+			else if(Key_Up.KeyStatus == Key_Status_LongPress)//长按
+			{
+			  Key_Up.KeyStatus = Key_Status_NoPress;
+				//...
+			}
+			#endif
 	 }
  }
 }
@@ -372,6 +407,7 @@ void HAL_SYSTICK_Callback(void)
 	static uint16_t TimeCnt_50ms = 0;	
 //	static uint16_t TimeCnt_100ms = 0;
 	static uint16_t TimeCnt_1000ms = 0;
+	static uint16_t TimeCnt_60000ms = 0;
 	
 	Scan_Key_ADC_Error();
 //	Vin_test_Check();	
@@ -422,7 +458,7 @@ void HAL_SYSTICK_Callback(void)
 				TimeCnt_1000ms = 0;
 			//更新ADC转换结果
 	//		_Task_ADC_Update();
-			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
+			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);			
 		}
 	}
 	else
@@ -430,6 +466,15 @@ void HAL_SYSTICK_Callback(void)
 		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET);
 	}
 	
+	//60s任务
+	TimeCnt_60000ms++;
+	if(TimeCnt_60000ms >= 60000)
+	{
+	  TimeCnt_60000ms = 0;
+		//运行时间记录
+		PBU_RunLog.RunTime++;
+	}
+	
 	MC_error_cnt++;
 	if(MC_error_cnt >= 3000)
 	{
@@ -460,7 +505,7 @@ void PBU_RunMode_Process(PBU_RunMode_t RunMode)
 					else
 					{
 //						ControlCode.GearSt = 0x00;
-						if(TimeCntDiff_5ms(PBU_AssitMode_Status.WalkDelayTimeCnt) > 600)//³¬Ê±600 * 5 = 3s£¬»Ö¸´ÖúÁ¦µµÎ»
+						if(TimeCntDiff_5ms(PBU_AssitMode_Status.WalkDelayTimeCnt) > 2000) //超时2000 * 500 = 10s自动退出Walk等待
 						{
 							ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Walk;
 							if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
@@ -785,8 +830,8 @@ void PBU_Error_Process(void)
   static uint32_t SendCodeTimeCnt = 0;
 
 	if(PBU_RunMode != PBU_RunMode_Updating)
-	{
-		PBU_ErrorCode.Code=(PBU_ErrorCode.Code|PBU_hardwareErrorCode.Code|PBU_commErrorCode.Code);//|PBU_TE_ErrorCode.Code);
+	{		
+		PBU_ErrorCode.Code = PBU_hardwareErrorCode.Code | PBU_commErrorCode.Code;
 		PBU_Error_senddata=PBU_ErrorCode.Code;
 		if(PBU_Error_senddata != 0)
 		{