Project 2 Adaptive Cruise Control
Aim:
- To develop the Adaptive Cruise Control feature as per the Requirement Document using MATLAB Simulink.
- To follow all the MBD related processes such as Requirement Tagging & Traceability, SLDD creation, Configuration Parameter changes, Model Advisor check & Code Generation.
Code Generation:
/*
* Event Support License -- for demonstration use and event support. Not
* for government, research, commercial, or other organizational use.
*
* File: Adaptive_Cruise_Control.c
*
* Code generated for Simulink model 'Adaptive_Cruise_Control'.
*
* Model version : 1.97
* Simulink Coder version : 9.7 (R2022a) 13-Nov-2021
* C/C++ source code generated on : Sun Dec 11 18:17:23 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "Adaptive_Cruise_Control.h"
#include "rtwtypes.h"
#include "Adaptive_Cruise_Control_private.h"
#include <math.h>
/* Named constants for Chart: '<S2>/Chart' */
#define Ada_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define Adaptive_Cru_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define Adaptive_Cruise_Con_IN_OFF_MODE ((uint8_T)1U)
#define Adaptive_Cruise_Cont_IN_ON_MODE ((uint8_T)2U)
#define Adaptive_Cruise_IN_STANDBY_MODE ((uint8_T)3U)
#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)
/* Exported data definition */
/* Definition for custom storage class: ExportToFile */
uint8_T Acceleration_Mode; /* '<S1>/Unit Delay' */
uint8_T DriveVehicle_Speed; /* '<S3>/Add1' */
uint8_T LeadVehicle_Detected; /* '<S3>/Signal Conversion' */
uint8_T LeadVehicle_Speed; /* '<S4>/Add' */
/* Block states (default storage) */
DW_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_DW;
/* External outputs (root outports fed by signals with default storage) */
ExtY_Adaptive_Cruise_Control_T Adaptive_Cruise_Control_Y;
/* Real-time model */
static RT_MODEL_Adaptive_Cruise_Cont_T Adaptive_Cruise_Control_M_;
RT_MODEL_Adaptive_Cruise_Cont_T *const Adaptive_Cruise_Control_M =
&Adaptive_Cruise_Control_M_;
real_T rt_roundd_snf(real_T u)
{
real_T y;
if (fabs(u) < 4.503599627370496E+15) {
if (u >= 0.5) {
y = floor(u + 0.5);
} else if (u > -0.5) {
y = u * 0.0;
} else {
y = ceil(u - 0.5);
}
} else {
y = u;
}
return y;
}
/* Model step function */
void Adaptive_Cruise_Control_step(void)
{
/* Sum: '<S4>/Add' incorporates:
* Inport: '<Root>/CameraInput_LeadVehicle '
* Inport: '<Root>/RadarInput_LeadVehicle'
*/
LeadVehicle_Speed = (uint8_T)(CameraInput_LeadVehicle + RadarInput_LeadVehicle);
/* UnitDelay: '<S1>/Unit Delay' */
Acceleration_Mode = Adaptive_Cruise_Control_Y.Acceleration_Mode_d;
/* Sum: '<S3>/Add1' incorporates:
* Inport: '<Root>/CameraInput_DriveVehicle'
* Inport: '<Root>/RadarInput_DriveVehicle'
* Sum: '<S3>/Add'
*/
DriveVehicle_Speed = (uint8_T)((uint8_T)(CameraInput_DriveVehicle +
RadarInput_DriveVehicle) + Acceleration_Mode);
/* SignalConversion: '<S3>/Signal Conversion' incorporates:
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
LeadVehicle_Detected = RadarInput_DriveVehicle;
/* Chart: '<S2>/Chart' incorporates:
* Inport: '<Root>/CruiseSwitch'
* Inport: '<Root>/SetSwitch'
* Inport: '<Root>/Set_Gap'
* Inport: '<Root>/Set_Speed'
* Inport: '<Root>/Time_Gap'
* UnitDelay: '<S1>/Unit Delay'
*/
if (Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co == 0U) {
Adaptive_Cruise_Control_DW.is_active_c3_Adaptive_Cruise_Co = 1U;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Con_IN_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 0U;
} else {
switch (Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control) {
case Adaptive_Cruise_Con_IN_OFF_MODE:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 0U;
if (CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_IN_STANDBY_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
}
break;
case Adaptive_Cruise_Cont_IN_ON_MODE:
{
if (!SetSwitch) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_IN_STANDBY_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
} else if (!CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
Adaptive_Cru_IN_NO_ACTIVE_CHILD;
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Con_IN_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 0U;
} else {
switch (Adaptive_Cruise_Control_DW.is_ON_MODE) {
case IN_LeadVehicle_Detected_Follow:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 2U;
if (LeadVehicle_Detected == 0) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
Ada_IN_LeadVehicle_Not_Detected;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 4U;
}
break;
case IN_LeadVehicle_Detected_Resume:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 3U;
if ((DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >=
Set_Speed) && (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Detected_Follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 2U;
} else if (LeadVehicle_Detected == 0) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Not_Detected_Res;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
} else if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Speed_equal_Set_;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 5U;
}
break;
case Ada_IN_LeadVehicle_Not_Detected:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
if ((LeadVehicle_Detected == 1) && (DriveVehicle_Speed == Set_Speed)
&& (LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Detected_Follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 2U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 4U;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
break;
case IN_LeadVehicle_Speed_equal_Set_:
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 5U;
if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <= Set_Speed))
{
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Not_Detected_Res;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
} else if (((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Detected_Resume;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 3U;
} else if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed <
DriveVehicle_Speed)) || ((int32_T)rt_roundd_snf(0.75 *
(real_T)Set_Gap) == Time_Gap)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Speed_lessthan_S;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 4U;
}
break;
default:
{
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 4U;
if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed ==
Set_Speed)) {
Adaptive_Cruise_Control_DW.is_ON_MODE =
Ada_IN_LeadVehicle_Not_Detected;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
} else {
int32_T tmp;
int32_T tmp_0;
uint8_T tmp_1;
uint8_T tmp_2;
tmp = (int32_T)rt_roundd_snf((real_T)LeadVehicle_Speed * 1.25);
tmp_0 = (int32_T)rt_roundd_snf(1.25 * (real_T)Set_Gap);
if (tmp < 256) {
tmp_1 = (uint8_T)tmp;
} else {
tmp_1 = MAX_uint8_T;
}
if (tmp_0 < 256) {
tmp_2 = (uint8_T)tmp_0;
} else {
tmp_2 = MAX_uint8_T;
}
if ((tmp_1 >= DriveVehicle_Speed) && ((int32_T)rt_roundd_snf
((real_T)LeadVehicle_Speed * 0.75) <= DriveVehicle_Speed) &&
(DriveVehicle_Speed < Set_Speed) && (Time_Gap <= tmp_2) &&
(Time_Gap >= (int32_T)rt_roundd_snf(0.75 * (real_T)Set_Gap)))
{
Adaptive_Cruise_Control_DW.is_ON_MODE =
IN_LeadVehicle_Speed_equal_Set_;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 5U;
}
}
}
break;
}
}
}
break;
default:
/* case IN_STANDBY_MODE: */
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 1U;
if (!CruiseSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Con_IN_OFF_MODE;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 0U;
} else if (SetSwitch) {
Adaptive_Cruise_Control_DW.is_c3_Adaptive_Cruise_Control =
Adaptive_Cruise_Cont_IN_ON_MODE;
Adaptive_Cruise_Control_DW.is_ON_MODE = IN_LeadVehicle_Detected_Follow;
Adaptive_Cruise_Control_Y.Acceleration_Mode_d = 2U;
}
break;
}
}
/* End of Chart: '<S2>/Chart' */
}
/* Model initialize function */
void Adaptive_Cruise_Control_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void Adaptive_Cruise_Control_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/