Project 2 Adaptive Cruise Control
Below shown is the C code for the model.
#include "ACC.h"
#include "ACC_private.h"
/* Named constants for Chart: '<S2>/ACC_Logic' */
#define ACC_IN_ACC_OFF_MODE ((uint8_T)1U)
#define ACC_IN_ACC_ON_MODE ((uint8_T)2U)
#define ACC_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define ACC_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define ACC_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#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)
/* Block states (default storage) */
DW_ACC_T ACC_DW;
/* External outputs (root outports fed by signals with default storage) */
ExtY_ACC_T ACC_Y;
/* Real-time model */
static RT_MODEL_ACC_T ACC_M_;
RT_MODEL_ACC_T *const ACC_M = &ACC_M_;
/* Model step function */
void ACC_step(void)
{
/* Sum: '<S4>/Add' incorporates:
* Inport: '<Root>/CameraInput_LeadVehicle'
* Inport: '<Root>/RadarInput_LeadVehicle'
*/
LeadVehicle_Speed = (uint8_T)((uint32_T)CameraInput_LeadVehicle +
RadarInput_LeadVehicle);
/* UnitDelay: '<S1>/Unit Delay' */
Acceleration_Mode = ACC_Y.Acceleration_Mode_n;
/* Sum: '<S3>/Add' incorporates:
* Inport: '<Root>/CameraInput_DriveVehicle'
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
DriveVehicle_Speed = (uint8_T)((uint32_T)(uint8_T)((uint32_T)
CameraInput_DriveVehicle + Acceleration_Mode) + RadarInput_DriveVehicle);
/* SignalConversion: '<S3>/Signal Conversion' incorporates:
* Inport: '<Root>/RadarInput_DriveVehicle'
*/
LeadVehicle_Detected = RadarInput_DriveVehicle;
/* Chart: '<S2>/ACC_Logic' incorporates:
* Inport: '<Root>/CruiseSwitch'
* Inport: '<Root>/SetSwitch'
* Inport: '<Root>/Set_Gap'
* Inport: '<Root>/Set_Speed'
* Inport: '<Root>/Time_Gap'
* UnitDelay: '<S1>/Unit Delay'
*/
if (ACC_DW.is_active_c3_ACC == 0U) {
ACC_DW.is_active_c3_ACC = 1U;
ACC_DW.is_c3_ACC = ACC_IN_ACC_OFF_MODE;
ACC_Y.Acceleration_Mode_n = 0U;
} else {
switch (ACC_DW.is_c3_ACC) {
case ACC_IN_ACC_OFF_MODE:
ACC_Y.Acceleration_Mode_n = 0U;
if (CruiseSwitch) {
ACC_DW.is_c3_ACC = ACC_IN_ACC_STANDBY_MODE;
ACC_Y.Acceleration_Mode_n = 1U;
}
break;
case ACC_IN_ACC_ON_MODE:
if (!SetSwitch) {
ACC_DW.is_ACC_ON_MODE = ACC_IN_NO_ACTIVE_CHILD;
ACC_DW.is_c3_ACC = ACC_IN_ACC_STANDBY_MODE;
ACC_Y.Acceleration_Mode_n = 1U;
} else if (!CruiseSwitch) {
ACC_DW.is_ACC_ON_MODE = ACC_IN_NO_ACTIVE_CHILD;
ACC_DW.is_c3_ACC = ACC_IN_ACC_OFF_MODE;
ACC_Y.Acceleration_Mode_n = 0U;
} else {
switch (ACC_DW.is_ACC_ON_MODE) {
case IN_LeadVehicle_Detected_Follow:
ACC_Y.Acceleration_Mode_n = 2U;
if (LeadVehicle_Detected == 0) {
ACC_DW.is_ACC_ON_MODE = ACC_IN_LeadVehicle_Not_Detected;
ACC_Y.Acceleration_Mode_n = 1U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
ACC_Y.Acceleration_Mode_n = 4U;
}
break;
case IN_LeadVehicle_Detected_Resume:
ACC_Y.Acceleration_Mode_n = 3U;
if ((DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >=
Set_Speed) && (Time_Gap >= Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
ACC_Y.Acceleration_Mode_n = 2U;
} else if (LeadVehicle_Detected == 0) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
ACC_Y.Acceleration_Mode_n = 1U;
} else if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
ACC_Y.Acceleration_Mode_n = 5U;
}
break;
case ACC_IN_LeadVehicle_Not_Detected:
ACC_Y.Acceleration_Mode_n = 1U;
/* */
if ((LeadVehicle_Detected == 1) && (DriveVehicle_Speed == Set_Speed) &&
(LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
ACC_Y.Acceleration_Mode_n = 2U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
ACC_Y.Acceleration_Mode_n = 4U;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
ACC_Y.Acceleration_Mode_n = 1U;
break;
case IN_LeadVehicle_Speed_equal_Set_:
ACC_Y.Acceleration_Mode_n = 5U;
if (((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume;
ACC_Y.Acceleration_Mode_n = 3U;
} else if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <=
Set_Speed)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
ACC_Y.Acceleration_Mode_n = 1U;
/* */
} else if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed <
DriveVehicle_Speed)) || (0.75 * (real_T)Set_Gap ==
Time_Gap)) {
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
ACC_Y.Acceleration_Mode_n = 4U;
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
ACC_Y.Acceleration_Mode_n = 4U;
if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_Speed))
{
ACC_DW.is_ACC_ON_MODE = ACC_IN_LeadVehicle_Not_Detected;
ACC_Y.Acceleration_Mode_n = 1U;
} else if (((real_T)LeadVehicle_Speed * 1.25 >= DriveVehicle_Speed) &&
((real_T)LeadVehicle_Speed * 0.75 <= DriveVehicle_Speed) &&
(DriveVehicle_Speed < Set_Speed) && ((Time_Gap <= 1.25 *
(real_T)Set_Gap) && (Time_Gap >= 0.75 * (real_T)Set_Gap)))
{
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
ACC_Y.Acceleration_Mode_n = 5U;
}
break;
}
}
break;
default:
/* case IN_ACC_STANDBY_MODE: */
ACC_Y.Acceleration_Mode_n = 1U;
if (!CruiseSwitch) {
ACC_DW.is_c3_ACC = ACC_IN_ACC_OFF_MODE;
ACC_Y.Acceleration_Mode_n = 0U;
} else if (SetSwitch) {
ACC_DW.is_c3_ACC = ACC_IN_ACC_ON_MODE;
ACC_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
ACC_Y.Acceleration_Mode_n = 2U;
}
break;
}
}
/* End of Chart: '<S2>/ACC_Logic' */
}
/* Model initialize function */
void ACC_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void ACC_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/
Here the image of the simulink block is shown. where 9 inputs are are taken in the part of a subsystem.
All the signals are resolved.The output comes as acceleration mode.

This image shows the inside part of subsystem.
There are three requirements of this addaptive cruise control system, the first requirement is named as lead_vehicle and second requirement is named as drive_vehicle and the third requirement is named as ACC_Algorithm.For requirement one two inputs are taken Camerainput_leadvehicle and Radarinput_leadvehicle. For requirement Drive_vehicle there are three inputs camerainput_drive, radarinput_drivevehicle and acceleration mode. For both the requirements the input simply gets added. Lead vehicle reiquirement is for providing leadvehiclespeed as output. drive_vehicle requirement gives two outputs as drive vehicle speed and leadvehicle_detected.

The two images below are for requirement1 and requirement2 respectively.

For requirement 2 the radarinput_driveVehicle is also converted through signal conversion block for LeadVehicle_Detected signal.
all these output signal from requirements 1 and 2 are inputs for requirements with other remaining inputs shown in the first image.

These inputs are finaly taken in the ACC logic chart.

The format of chart logic is shown below.
For ACC_OFF_MODE the acceleration_mode is 0.
and so on for other mode of operation.
The ACC_ON_MODE is of 6 mode of operation.
- LeadVehicle_Detected_Follow
- LeadVehicle_Not_Detected
- LeadVehicle_Detected_Resume
- LeadVehicle_Not_Detected_Resume
- LeadVehicle_Speed_lessthan_Set_Speed
- LeadVehicle_Speed_equal_Set_Speed
The logic mentioned below is for transition of operation from one state to other state.

Below image is the image of ACC sldd file wher all the input and output signals are linked as data dictionary to the model.
importedextern is the the storage class of input signal and exporttofile is the storage class of output signal.
All the signals have data type as uint8 except for Cruiseswitch and Setswitch which has boolean as data type.

For output signal the header file and defination file are named as ACC_func.h and ACC_def.c respectively.

Below given is the logic chart dictionary.

Process for generating code: Apps=> Embedded coder=> Build.

For generating report selecting a task of modeling standards for MAB.
