Challenge

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]

*/

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.