Challenge

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]
 */

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.