Project 2 Adaptive Cruise Control


subsystem of driver

subsystem of lead vehicle

code generated out of the model
/*
* File: mbdpro1.c
*
* Code generated for Simulink model 'mbdpro1'.
*
* Model version : 1.20
* Simulink Coder version : 9.3 (R2020a) 18-Nov-2019
* C/C++ source code generated on : Fri Apr 7 13:50:54 2023
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "mbdpro1.h"
#include "mbdpro1_private.h"
/* Named constants for Chart: '/Chart' */
#define IN_LeadVehicle_Detected_Follow ((uint8_T)1U)
#define IN_LeadVehicle_Detected_Resume ((uint8_T)2U)
#define IN_LeadVehicle_Not_Detected_Res ((uint8_T)4U)
#define IN_LeadVehicle_Speed_equal_Set_ ((uint8_T)5U)
#define IN_LeadVehicle_Speed_lessthan_S ((uint8_T)6U)
#define mbd_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define mbdpro1_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define mbdpro1_IN_OFF_Mode ((uint8_T)1U)
#define mbdpro1_IN_ON_Mode ((uint8_T)2U)
#define mbdpro1_IN_STANDBY_Mode ((uint8_T)3U)
/* Block states (default storage) */
DW_mbdpro1_T mbdpro1_DW;
/* External inputs (root inport signals with default storage) */
ExtU_mbdpro1_T mbdpro1_U;
/* Real-time model */
RT_MODEL_mbdpro1_T mbdpro1_M_;
RT_MODEL_mbdpro1_T *const mbdpro1_M = &mbdpro1_M_;
/* Forward declaration for local functions */
static void mbdpro1_ON_Mode(real_T *Acceleration_Mode, const real_T *Add, const
real_T *Add_h);
/* Function for Chart: '/Chart' */
static void mbdpro1_ON_Mode(real_T *Acceleration_Mode, const real_T *Add, const
real_T *Add_h)
{
/* Inport: '/CruiseSwitch' incorporates:
* Inport: '/SetSwitch'
*/
if (mbdpro1_U.CruiseSwitch == 0.0) {
mbdpro1_DW.is_ON_Mode = mbdpro1_IN_NO_ACTIVE_CHILD;
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_OFF_Mode;
*Acceleration_Mode = 0.0;
} else if (mbdpro1_U.SetSwitch == 0.0) {
mbdpro1_DW.is_ON_Mode = mbdpro1_IN_NO_ACTIVE_CHILD;
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_STANDBY_Mode;
*Acceleration_Mode = 1.0;
} else {
switch (mbdpro1_DW.is_ON_Mode) {
case IN_LeadVehicle_Detected_Follow:
*Acceleration_Mode = 2.0;
/* Inport: '/RadarInput_DriveVehicle' incorporates:
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if (mbdpro1_U.RadarInput_DriveVehicle == 0.0) {
mbdpro1_DW.is_ON_Mode = mbd_IN_LeadVehicle_Not_Detected;
*Acceleration_Mode = 1.0;
} else {
if (((mbdpro1_U.RadarInput_DriveVehicle == 1.0) && (*Add_h <
mbdpro1_U.Set_Speed)) || (mbdpro1_U.Time_Gap < mbdpro1_U.Set_Gap))
{
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
*Acceleration_Mode = 4.0;
}
}
break;
case IN_LeadVehicle_Detected_Resume:
*Acceleration_Mode = 3.0;
/* Inport: '/RadarInput_DriveVehicle' incorporates:
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if (mbdpro1_U.RadarInput_DriveVehicle == 0.0) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
*Acceleration_Mode = 1.0;
} else if ((*Add == mbdpro1_U.Set_Speed) && (*Add_h >= mbdpro1_U.Set_Speed)
&& (mbdpro1_U.Time_Gap >= mbdpro1_U.Set_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow;
*Acceleration_Mode = 2.0;
} else {
if ((*Add < mbdpro1_U.Set_Speed) && (*Add_h > *Add) &&
(mbdpro1_U.Time_Gap >= mbdpro1_U.Set_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
*Acceleration_Mode = 5.0;
}
}
break;
case mbd_IN_LeadVehicle_Not_Detected:
*Acceleration_Mode = 1.0;
/* Inport: '/RadarInput_DriveVehicle' incorporates:
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if (((mbdpro1_U.RadarInput_DriveVehicle == 1.0) && (*Add_h <
mbdpro1_U.Set_Speed)) || (mbdpro1_U.Time_Gap < mbdpro1_U.Set_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
*Acceleration_Mode = 4.0;
} else {
if ((mbdpro1_U.RadarInput_DriveVehicle == 1.0) && (*Add ==
mbdpro1_U.Set_Speed) && (*Add_h >= mbdpro1_U.Set_Speed) &&
(mbdpro1_U.Time_Gap >= mbdpro1_U.Set_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow;
*Acceleration_Mode = 2.0;
}
}
break;
case IN_LeadVehicle_Not_Detected_Res:
*Acceleration_Mode = 1.0;
break;
case IN_LeadVehicle_Speed_equal_Set_:
*Acceleration_Mode = 5.0;
/* Inport: '/RadarInput_DriveVehicle' incorporates:
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if ((mbdpro1_U.RadarInput_DriveVehicle == 0.0) || (*Add <=
mbdpro1_U.Set_Speed)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Not_Detected_Res;
*Acceleration_Mode = 1.0;
} else if (((*Add < mbdpro1_U.Set_Speed) && (*Add_h > *Add)) ||
(mbdpro1_U.Time_Gap >= mbdpro1_U.Set_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Detected_Resume;
*Acceleration_Mode = 3.0;
} else {
if (((*Add_h < mbdpro1_U.Set_Speed) && (*Add_h < *Add)) || (0.75 *
mbdpro1_U.Set_Gap == mbdpro1_U.Time_Gap)) {
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Speed_lessthan_S;
*Acceleration_Mode = 4.0;
}
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
*Acceleration_Mode = 4.0;
/* Inport: '/Set_Speed' incorporates:
* Inport: '/RadarInput_DriveVehicle'
* Inport: '/Set_Gap'
* Inport: '/Time_Gap'
*/
if ((*Add_h * 1.25 >= *Add) && (*Add_h * 0.75 <= *Add) && (*Add <
mbdpro1_U.Set_Speed) && (mbdpro1_U.Time_Gap <= 1.25 *
mbdpro1_U.Set_Gap) && (mbdpro1_U.Time_Gap >= 0.75 * mbdpro1_U.Set_Gap))
{
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Speed_equal_Set_;
*Acceleration_Mode = 5.0;
} else {
if ((mbdpro1_U.RadarInput_DriveVehicle == 0.0) && (*Add ==
mbdpro1_U.Set_Speed)) {
mbdpro1_DW.is_ON_Mode = mbd_IN_LeadVehicle_Not_Detected;
*Acceleration_Mode = 1.0;
}
}
break;
}
}
/* End of Inport: '/CruiseSwitch' */
}
/* Model step function */
void mbdpro1_step(void)
{
real_T Add;
real_T Add_h;
/* Sum: '/Add' incorporates:
* Delay: '/Delay'
* Inport: '/CameraInput_DriveVehicle'
* Inport: '/RadarInput_DriveVehicle'
*/
Add = (mbdpro1_U.CameraInput_DriveVehicle + mbdpro1_U.RadarInput_DriveVehicle)
+ mbdpro1_DW.Delay_DSTATE;
/* Sum: '/Add' incorporates:
* Inport: '/CameraInput_LeadVehicle'
* Inport: '/RadarInput_LeadVehicle'
*/
Add_h = mbdpro1_U.CameraInput_LeadVehicle + mbdpro1_U.RadarInput_LeadVehicle;
/* Chart: '/Chart' incorporates:
* Inport: '/CruiseSwitch'
* Inport: '/SetSwitch'
*/
if (mbdpro1_DW.is_active_c3_mbdpro1 == 0U) {
mbdpro1_DW.is_active_c3_mbdpro1 = 1U;
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_OFF_Mode;
/* Update for Delay: '/Delay' */
mbdpro1_DW.Delay_DSTATE = 0.0;
} else {
switch (mbdpro1_DW.is_c3_mbdpro1) {
case mbdpro1_IN_OFF_Mode:
/* Update for Delay: '/Delay' */
mbdpro1_DW.Delay_DSTATE = 0.0;
if (mbdpro1_U.CruiseSwitch == 1.0) {
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_STANDBY_Mode;
/* Update for Delay: '/Delay' */
mbdpro1_DW.Delay_DSTATE = 1.0;
}
break;
case mbdpro1_IN_ON_Mode:
/* Update for Delay: '/Delay' */
mbdpro1_ON_Mode(&mbdpro1_DW.Delay_DSTATE, &Add, &Add_h);
break;
default:
/* Update for Delay: '/Delay' */
/* case IN_STANDBY_Mode: */
mbdpro1_DW.Delay_DSTATE = 1.0;
if (mbdpro1_U.CruiseSwitch == 0.0) {
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_OFF_Mode;
/* Update for Delay: '/Delay' */
mbdpro1_DW.Delay_DSTATE = 0.0;
} else {
if (mbdpro1_U.SetSwitch == 1.0) {
mbdpro1_DW.is_c3_mbdpro1 = mbdpro1_IN_ON_Mode;
mbdpro1_DW.is_ON_Mode = IN_LeadVehicle_Detected_Follow;
/* Update for Delay: '/Delay' */
mbdpro1_DW.Delay_DSTATE = 2.0;
}
}
break;
}
}
/* End of Chart: '/Chart' */
}
/* Model initialize function */
void mbdpro1_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void mbdpro1_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/
