ver 26.3.17.1

- Drive_Mode.c 수정
  : RC - ACU handover 전환 로직 보완
  : RC -> ACU / ACU -> RC 전환 시 5km/h 이하에서만 Permit 되도록 수정
  : 5km/h 초과 시 Handover Phase가 In Progress가 되도록 수정
  : handover 속도 조건에 차속 피드백 외 제어 명령 속도 조건 추가
  : ACU -> RC 전환 시 RC 속도 명령 5km/h 이하 조건 추가
  : RC -> ACU 전환 시 ACU 속도 명령 5km/h 이하 조건 추가
  : handover 진행 중 요청/제어 주체 해제 시 비상정지 진입 조건 보완
  : ACU -> RC 진행 중 ACU Drive Mode 해제 시 Emergency 진입
  : RC -> ACU 진행 중 RC ACU 요청 해제 시 Emergency 진입
  : 관련 Handover/Emergency 상태 변수 설정 보완

- Drive_Mode.c/ExecuteEmergencyMode 함수 수정
  : Handover conflict 발생 후 RC manual 요청으로 복구 가능하도록 조건 보완
This commit is contained in:
3minbe 2026-03-17 19:48:28 +09:00
parent 3dd57671c9
commit 99ad012576
5 changed files with 11123 additions and 11008 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,16 +7,26 @@ static bool IsVehicleStopped(void)
return (GV_VCU_Vx_Fbk < 1.0f); return (GV_VCU_Vx_Fbk < 1.0f);
} }
static bool IsVehicleBelowHandoverSpeed(void)
{
return (GV_VCU_Vx_Fbk <= 5.0f);
}
static bool IsRcHandoverReady(void)
{
return IsVehicleBelowHandoverSpeed() && (GV_RC_Vx_Command <= 5U);
}
static bool IsAcuHandoverReady(void)
{
return IsVehicleBelowHandoverSpeed() && (GV_ACU_Vx_Command <= 5U);
}
static bool HasAcuRequest(void) static bool HasAcuRequest(void)
{ {
return (GV_ACU_Drive_mode == 1U); return (GV_ACU_Drive_mode == 1U);
} }
static bool IsParkGear(void)
{
return (GV_VCU_GearSelStat == 0U);
}
static bool IsRcParkRequest(void) static bool IsRcParkRequest(void)
{ {
return (GV_RC_GearSelStat == 0U); return (GV_RC_GearSelStat == 0U);
@ -26,6 +36,10 @@ static uint8_t s_prevRcManualOn = 0U;
static uint8_t s_prevRcAutoOn = 0U; static uint8_t s_prevRcAutoOn = 0U;
static RcModeReq_e s_lastRcModeReq = RC_REQ_DEFAULT; static RcModeReq_e s_lastRcModeReq = RC_REQ_DEFAULT;
static RcModeReq_e s_rcModeReqRaw = RC_REQ_NONE; static RcModeReq_e s_rcModeReqRaw = RC_REQ_NONE;
static bool s_acuToRcHandoverActive = false;
static bool s_rcToAcuHandoverActive = false;
static bool s_acuToRcSourceSeen = false;
static bool s_rcToAcuSourceSeen = false;
static DriveMode_e curMode = DRIVE_MODE_DEFAULT; static DriveMode_e curMode = DRIVE_MODE_DEFAULT;
static DriveMode_e nextMode = DRIVE_MODE_DEFAULT; static DriveMode_e nextMode = DRIVE_MODE_DEFAULT;
@ -182,6 +196,48 @@ void CheckDriveMode(void)
{ {
requestedRcMode = s_rcModeReqRaw; requestedRcMode = s_rcModeReqRaw;
if (s_acuToRcHandoverActive &&
(curMode == DRIVE_MODE_ACU) &&
!IsRcHandoverReady() &&
!HasAcuRequest())
{
nextMode = DRIVE_MODE_EMERGENCY;
nextPhase = HO_HOLD;
GV_VCU_EmergencyCause = EMG_HO_CONFLICT;
GV_RC_ModeReq = s_rcModeReqRaw;
Time_SetAutoOnWait(false);
s_acuToRcHandoverActive = false;
s_acuToRcSourceSeen = false;
return;
}
if (s_rcToAcuHandoverActive &&
(curMode == DRIVE_MODE_RC) &&
!IsAcuHandoverReady() &&
(GV_RC_ACU_Drive_Mode == 0U))
{
nextMode = DRIVE_MODE_EMERGENCY;
nextPhase = HO_HOLD;
GV_VCU_EmergencyCause = EMG_HO_CONFLICT;
GV_RC_ModeReq = s_rcModeReqRaw;
Time_SetAutoOnWait(false);
s_rcToAcuHandoverActive = false;
s_rcToAcuSourceSeen = false;
return;
}
if (requestedRcMode != RC_REQ_MANUAL)
{
s_acuToRcHandoverActive = false;
s_acuToRcSourceSeen = false;
}
if (requestedRcMode != RC_REQ_AUTO)
{
s_rcToAcuHandoverActive = false;
s_rcToAcuSourceSeen = false;
}
if ((curMode == DRIVE_MODE_EMERGENCY) && if ((curMode == DRIVE_MODE_EMERGENCY) &&
(GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL) && (GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL) &&
(requestedRcMode != RC_REQ_MANUAL)) (requestedRcMode != RC_REQ_MANUAL))
@ -195,7 +251,8 @@ void CheckDriveMode(void)
if ((curMode == DRIVE_MODE_EMERGENCY) && if ((curMode == DRIVE_MODE_EMERGENCY) &&
(GV_VCU_EmergencyCause == EMG_HO_CONFLICT) && (GV_VCU_EmergencyCause == EMG_HO_CONFLICT) &&
(requestedRcMode != RC_REQ_DEFAULT)) (requestedRcMode != RC_REQ_DEFAULT) &&
(requestedRcMode != RC_REQ_MANUAL))
{ {
nextMode = DRIVE_MODE_EMERGENCY; nextMode = DRIVE_MODE_EMERGENCY;
nextPhase = HO_HOLD; nextPhase = HO_HOLD;
@ -206,7 +263,9 @@ void CheckDriveMode(void)
if (!((curMode == DRIVE_MODE_EMERGENCY) && if (!((curMode == DRIVE_MODE_EMERGENCY) &&
(((GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL) && (requestedRcMode != RC_REQ_MANUAL)) || (((GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL) && (requestedRcMode != RC_REQ_MANUAL)) ||
((GV_VCU_EmergencyCause == EMG_HO_CONFLICT) && (requestedRcMode != RC_REQ_DEFAULT))))) ((GV_VCU_EmergencyCause == EMG_HO_CONFLICT) &&
(requestedRcMode != RC_REQ_DEFAULT) &&
(requestedRcMode != RC_REQ_MANUAL)))))
GV_VCU_EmergencyCause = EMG_NONE; GV_VCU_EmergencyCause = EMG_NONE;
switch (requestedRcMode) switch (requestedRcMode)
@ -259,19 +318,23 @@ void CheckDriveMode(void)
break; break;
case RC_REQ_MANUAL: case RC_REQ_MANUAL:
if (curMode == DRIVE_MODE_ACU && !IsVehicleStopped()) if (curMode == DRIVE_MODE_ACU && !IsRcHandoverReady())
{ {
nextPhase = HO_HOLD; s_acuToRcHandoverActive = true;
nextMode = DRIVE_MODE_EMERGENCY; if (HasAcuRequest())
GV_VCU_EmergencyCause = EMG_HO_CONFLICT; s_acuToRcSourceSeen = true;
nextPhase = HO_INPROG;
} }
else if (curMode == DRIVE_MODE_ACU && nextPhase != HO_HOLD) else if (curMode == DRIVE_MODE_ACU)
{ {
nextPhase = HO_PERMIT; nextPhase = HO_PERMIT;
if (!HasAcuRequest()) if (!HasAcuRequest())
{ {
nextMode = DRIVE_MODE_DEFAULT; nextMode = DRIVE_MODE_RC;
nextPhase = HO_NONE; nextPhase = HO_NONE;
s_acuToRcHandoverActive = false;
s_acuToRcSourceSeen = false;
} }
} }
else if (curMode == DRIVE_MODE_DEFAULT && IsVehicleStopped()) else if (curMode == DRIVE_MODE_DEFAULT && IsVehicleStopped())
@ -297,6 +360,36 @@ void CheckDriveMode(void)
nextMode = DRIVE_MODE_EMERGENCY; nextMode = DRIVE_MODE_EMERGENCY;
GV_VCU_EmergencyCause = EMG_HO_CONFLICT; GV_VCU_EmergencyCause = EMG_HO_CONFLICT;
} }
else if ((curMode == DRIVE_MODE_RC) &&
(GV_RC_Drive_Mode == 0U) &&
(GV_RC_ACU_Drive_Mode == 1U) &&
!IsAcuHandoverReady())
{
s_rcToAcuHandoverActive = true;
nextPhase = HO_INPROG;
}
else if ((curMode == DRIVE_MODE_RC) &&
(GV_RC_Drive_Mode == 0U) &&
(GV_RC_ACU_Drive_Mode == 1U))
{
s_rcToAcuHandoverActive = true;
nextPhase = HO_PERMIT;
if (HasAcuRequest())
{
nextMode = DRIVE_MODE_ACU;
nextPhase = HO_NONE;
s_rcToAcuHandoverActive = false;
s_rcToAcuSourceSeen = false;
}
else
{
autoWaitOn = true;
if (Time_GetAutoOnWaitSec() >= 30U)
{
nextPhase = HO_HOLD;
}
}
}
else if ((curMode == DRIVE_MODE_DEFAULT) && (GV_VCU_HandoverPhase == HO_HOLD)) else if ((curMode == DRIVE_MODE_DEFAULT) && (GV_VCU_HandoverPhase == HO_HOLD))
{ {
nextMode = DRIVE_MODE_DEFAULT; nextMode = DRIVE_MODE_DEFAULT;
@ -463,12 +556,12 @@ void ExecuteEmergencyMode()
// Keep emergency latched for handover speed-fail until RC requests MANUAL. // Keep emergency latched for handover speed-fail until RC requests MANUAL.
if (!isEmergency && GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL && s_rcModeReqRaw != RC_REQ_MANUAL) if (!isEmergency && GV_VCU_EmergencyCause == EMG_HO_SPD_COND_FAIL && s_rcModeReqRaw != RC_REQ_MANUAL)
nextMode = DRIVE_MODE_EMERGENCY; nextMode = DRIVE_MODE_EMERGENCY;
else if (!isEmergency && GV_VCU_EmergencyCause == EMG_HO_CONFLICT && s_rcModeReqRaw != RC_REQ_DEFAULT) else if (!isEmergency && GV_VCU_EmergencyCause == EMG_HO_CONFLICT &&
s_rcModeReqRaw != RC_REQ_DEFAULT && s_rcModeReqRaw != RC_REQ_MANUAL)
nextMode = DRIVE_MODE_EMERGENCY; nextMode = DRIVE_MODE_EMERGENCY;
// Exit emergency mode when no emergency source remains. // Exit emergency mode when no emergency source remains.
else if(!isEmergency && !isEmergencyVcu && else if(!isEmergency && !isEmergencyVcu &&
GV_VCU_EmergencyCause != EMG_HO_CONFLICT &&
s_rcModeReqRaw == RC_REQ_MANUAL && s_rcModeReqRaw == RC_REQ_MANUAL &&
IsRcParkRequest()) IsRcParkRequest())
nextMode = DRIVE_MODE_RC; nextMode = DRIVE_MODE_RC;

View File

@ -7,7 +7,7 @@ void SET_SW_VER(void)
{ {
GV_YEAR = 26; GV_YEAR = 26;
GV_Month = 3; GV_Month = 3;
GV_Day = 13; GV_Day = 17;
GV_Ver = 1; GV_Ver = 1;
GV_CAR_NUM = 240623; GV_CAR_NUM = 240623;
} }