Project 2 Adaptive Cruise Control








/*
* File: myporjmb.c
*
* Code generated for Simulink model 'myporjmb'.
*
* Model version : 1.4
* Simulink Coder version : 9.5 (R2021a) 14-Nov-2020
* C/C++ source code generated on : Fri Oct 28 14:20:25 2022
*
* Target selection: ert.tlc
* Embedded hardware selection: Intel->x86-64 (Windows64)
* Code generation objectives: Unspecified
* Validation result: Not run
*/
#include "myporjmb.h"
#include "myporjmb_private.h"
/* Named constants for Chart: '/Adaptive_Cruise_Control_Logic' */
#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 myp_IN_LeadVehicle_Not_Detected ((uint8_T)3U)
#define myporjmb_IN_ACC_OFF_MODE ((uint8_T)1U)
#define myporjmb_IN_ACC_ON_MODE ((uint8_T)2U)
#define myporjmb_IN_ACC_STANDBY_MODE ((uint8_T)3U)
#define myporjmb_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
/* Exported data definition */
/* Definition for custom storage class: ExportToFile */
uint8_T Acceleration_Mode; /* '/Adaptive_Cruise_Control_Logic' */
/* Block states (default storage) */
DW_myporjmb_T myporjmb_DW;
/* Real-time model */
static RT_MODEL_myporjmb_T myporjmb_M_;
RT_MODEL_myporjmb_T *const myporjmb_M = &myporjmb_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 myporjmb_step(void)
{
/* local block i/o variables */
uint8_T LeadVehicle_Speed;
uint8_T DriveVehicle_Speed;
uint8_T LeadVehicle_Detected;
int32_T tmp;
int32_T tmp_0;
uint8_T tmp_1;
uint8_T tmp_2;
/* Sum: '/Add' incorporates:
* Inport: '/CameraInput_LeadVehicle'
* Inport: '/RadarInput_LeadVehicle'
*/
LeadVehicle_Speed = (uint8_T)((uint32_T)CameraInput_LeadVehicle +
RadarInput_LeadVehicle);
/* Sum: '/Add' incorporates:
* Inport: '/CameraInput_DriveVehicle'
* Inport: '/RadarInput_DriveVehicle'
* UnitDelay: '/Unit_Delay'
*/
DriveVehicle_Speed = (uint8_T)((uint32_T)(uint8_T)((uint32_T)
CameraInput_DriveVehicle + Acceleration_Mode) + RadarInput_DriveVehicle);
/* SignalConversion: '/Signal Conversion' incorporates:
* Inport: '/RadarInput_DriveVehicle'
*/
LeadVehicle_Detected = RadarInput_DriveVehicle;
/* Outputs for Atomic SubSystem: '/Requirement_3_ACC_Algorithm' */
/* Chart: '/Adaptive_Cruise_Control_Logic' incorporates:
* Inport: '/CruiseSwitch'
* Inport: '/SetSwitch'
* Inport: '/Set_Gap'
* Inport: '/Set_Speed'
* Inport: '/Time_Gap'
*/
if (myporjmb_DW.is_active_c3_myporjmb == 0U) {
myporjmb_DW.is_active_c3_myporjmb = 1U;
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_OFF_MODE;
Acceleration_Mode = 0U;
} else {
switch (myporjmb_DW.is_c3_myporjmb) {
case myporjmb_IN_ACC_OFF_MODE:
Acceleration_Mode = 0U;
if (CruiseSwitch) {
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_STANDBY_MODE;
Acceleration_Mode = 1U;
}
break;
case myporjmb_IN_ACC_ON_MODE:
if (!SetSwitch) {
myporjmb_DW.is_ACC_ON_MODE = myporjmb_IN_NO_ACTIVE_CHILD;
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_STANDBY_MODE;
Acceleration_Mode = 1U;
} else if (!CruiseSwitch) {
myporjmb_DW.is_ACC_ON_MODE = myporjmb_IN_NO_ACTIVE_CHILD;
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_OFF_MODE;
Acceleration_Mode = 0U;
} else {
switch (myporjmb_DW.is_ACC_ON_MODE) {
case IN_LeadVehicle_Detected_Follow:
Acceleration_Mode = 2U;
if (LeadVehicle_Detected == 0) {
myporjmb_DW.is_ACC_ON_MODE = myp_IN_LeadVehicle_Not_Detected;
Acceleration_Mode = 1U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Acceleration_Mode = 4U;
}
break;
case IN_LeadVehicle_Detected_Resume:
Acceleration_Mode = 3U;
if ((DriveVehicle_Speed == Set_Speed) && (LeadVehicle_Speed >=
Set_Speed) && (Time_Gap >= Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Acceleration_Mode = 2U;
} else if (LeadVehicle_Detected == 0) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
Acceleration_Mode = 1U;
} else if ((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed) && (Time_Gap >= Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
Acceleration_Mode = 5U;
}
break;
case myp_IN_LeadVehicle_Not_Detected:
Acceleration_Mode = 1U;
if ((LeadVehicle_Detected == 1) && (DriveVehicle_Speed == Set_Speed) &&
(LeadVehicle_Speed >= Set_Speed) && (Time_Gap >= Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Acceleration_Mode = 2U;
} else if (((LeadVehicle_Detected == 1) && (LeadVehicle_Speed <
Set_Speed)) || (Time_Gap < Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Acceleration_Mode = 4U;
}
break;
case IN_LeadVehicle_Not_Detected_Res:
Acceleration_Mode = 1U;
break;
case IN_LeadVehicle_Speed_equal_Set_:
Acceleration_Mode = 5U;
if (((DriveVehicle_Speed < Set_Speed) && (LeadVehicle_Speed >
DriveVehicle_Speed)) || (Time_Gap >= Set_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Resume;
Acceleration_Mode = 3U;
} else if ((LeadVehicle_Detected == 0) || (DriveVehicle_Speed <=
Set_Speed)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Not_Detected_Res;
Acceleration_Mode = 1U;
} else if (((LeadVehicle_Speed < Set_Speed) && (LeadVehicle_Speed <
DriveVehicle_Speed)) || ((int32_T)rt_roundd_snf(0.75 *
(real_T)Set_Gap) == Time_Gap)) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_lessthan_S;
Acceleration_Mode = 4U;
}
break;
default:
/* case IN_LeadVehicle_Speed_lessthan_Set_Speed: */
Acceleration_Mode = 4U;
if ((LeadVehicle_Detected == 0) && (DriveVehicle_Speed == Set_Speed))
{
myporjmb_DW.is_ACC_ON_MODE = myp_IN_LeadVehicle_Not_Detected;
Acceleration_Mode = 1U;
} else {
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))) {
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Speed_equal_Set_;
Acceleration_Mode = 5U;
}
}
break;
}
}
break;
default:
/* case IN_ACC_STANDBY_MODE: */
Acceleration_Mode = 1U;
if (!CruiseSwitch) {
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_OFF_MODE;
Acceleration_Mode = 0U;
} else if (SetSwitch) {
myporjmb_DW.is_c3_myporjmb = myporjmb_IN_ACC_ON_MODE;
myporjmb_DW.is_ACC_ON_MODE = IN_LeadVehicle_Detected_Follow;
Acceleration_Mode = 2U;
}
break;
}
}
/* End of Chart: '/Adaptive_Cruise_Control_Logic' */
/* End of Outputs for SubSystem: '/Requirement_3_ACC_Algorithm' */
}
/* Model initialize function */
void myporjmb_initialize(void)
{
/* (no initialization code required) */
}
/* Model terminate function */
void myporjmb_terminate(void)
{
/* (no terminate code required) */
}
/*
* File trailer for generated code.
*
* [EOF]
*/