Vincenzo Comito
/
AEB
AEB
AEB0.cpp
- Committer:
- clynamen
- Date:
- 2016-07-30
- Revision:
- 3:4bb49a5dfa47
- Parent:
- 2:5811e080f41d
File content as of revision 3:4bb49a5dfa47:
/* * Academic License - for use in teaching, academic research, and meeting * course requirements at degree granting institutions only. Not for * government, commercial, or other organizational use. * * File: AEB0.c * * Code generated for Simulink model 'AEB0'. * * Model version : 1.77 * Simulink Coder version : 8.10 (R2016a) 10-Feb-2016 * C/C++ source code generated on : Thu Jul 28 19:46:51 2016 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: Unspecified * Validation result: Not run */ #include "AEB0.h" #include "AEB0_private.h" /* Named constants for Chart: '<Root>/AEB ' */ #define AEB0_IN_AEB_misbehaviour ((uint8_T)1U) #define AEB0_IN_AEB_ok ((uint8_T)2U) #define AEB0_IN_NO_ACTIVE_CHILD ((uint8_T)0U) #define AEB0_IN_brake_fault ((uint8_T)1U) #define AEB0_IN_brake_off_ ((uint8_T)1U) #define AEB0_IN_brake_on_ ((uint8_T)2U) #define AEB0_IN_ok ((uint8_T)1U) #define AEB0_IN_ok2 ((uint8_T)3U) #define AEB0_IN_zero_dist ((uint8_T)2U) #define AEB0_IN_zero_dist_fault ((uint8_T)3U) #define AEB0_div (100.0) /* Block states (auto storage) */ DW_AEB0_T AEB0_DW; /* External inputs (root inport signals with auto storage) */ ExtU_AEB0_T AEB0_U; /* External outputs (root outports fed by signals with auto storage) */ ExtY_AEB0_T AEB0_Y; /* Real-time model */ RT_MODEL_AEB0_T AEB0_M_; RT_MODEL_AEB0_T *const AEB0_M = &AEB0_M_; /* Model step function */ void AEB0_step(void) { /* Chart: '<Root>/AEB ' incorporates: * Inport: '<Root>/distance_m' * Inport: '<Root>/speed_km_h' */ if (AEB0_DW.temporalCounter_i1 < 7U) { AEB0_DW.temporalCounter_i1++; } if (AEB0_DW.temporalCounter_i2 < 7U) { AEB0_DW.temporalCounter_i2++; } /* Gateway: AEB */ /* During: AEB */ if (AEB0_DW.is_active_c3_AEB0 == 0U) { /* Entry: AEB */ AEB0_DW.is_active_c3_AEB0 = 1U; /* Entry Internal: AEB */ /* Transition: '<S1>:37' */ AEB0_DW.is_AEB_distance_sensor_fault_de = AEB0_IN_ok; /* Outport: '<Root>/fault' */ /* Entry 'ok': '<S1>:21' */ /* '<S1>:21:1' fault=0 */ AEB0_Y.fault = 0.0; /* Entry Internal 'AEB_brake_fault_detection': '<S1>:41' */ /* Transition: '<S1>:44' */ AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_ok2; /* Entry Internal 'AEB_ALGO': '<S1>:40' */ /* Transition: '<S1>:4' */ AEB0_DW.is_AEB_ALGO = AEB0_IN_AEB_ok; AEB0_DW.is_AEB_ok = AEB0_IN_brake_off_; /* Outport: '<Root>/brake' */ /* Entry 'brake_off_': '<S1>:3' */ /* '<S1>:3:1' brake=0 */ AEB0_Y.brake = 0.0; } else { /* During 'AEB': '<S1>:39' */ /* During 'AEB_fault_detection': '<S1>:43' */ /* During 'AEB_distance_sensor_fault_detection': '<S1>:42' */ switch (AEB0_DW.is_AEB_distance_sensor_fault_de) { case AEB0_IN_ok: /* During 'ok': '<S1>:21' */ /* '<S1>:23:1' sf_internal_predicateOutput = ... */ /* '<S1>:23:1' distance_m == 0; */ if (AEB0_U.distance_m == 0.0) { /* Transition: '<S1>:23' */ AEB0_DW.is_AEB_distance_sensor_fault_de = AEB0_IN_zero_dist; AEB0_DW.temporalCounter_i1 = 0U; } break; case AEB0_IN_zero_dist: /* During 'zero_dist': '<S1>:28' */ /* '<S1>:24:1' sf_internal_predicateOutput = ... */ /* '<S1>:24:1' distance_m > 0; */ if (AEB0_U.distance_m > 0.0) { /* Transition: '<S1>:24' */ AEB0_DW.is_AEB_distance_sensor_fault_de = AEB0_IN_ok; /* Outport: '<Root>/fault' */ /* Entry 'ok': '<S1>:21' */ /* '<S1>:21:1' fault=0 */ AEB0_Y.fault = 0.0; } else { /* '<S1>:26:1' sf_internal_predicateOutput = ... */ /* '<S1>:26:1' after(500, msec); */ if (AEB0_DW.temporalCounter_i1 >= 5U) { /* Transition: '<S1>:26' */ AEB0_DW.is_AEB_distance_sensor_fault_de = AEB0_IN_zero_dist_fault; /* Outport: '<Root>/fault' */ /* Entry 'zero_dist_fault': '<S1>:25' */ /* '<S1>:25:1' fault=1 */ AEB0_Y.fault = 1.0; } } break; default: /* During 'zero_dist_fault': '<S1>:25' */ break; } /* During 'AEB_brake_fault_detection': '<S1>:41' */ switch (AEB0_DW.is_AEB_brake_fault_detection) { case AEB0_IN_brake_fault: /* During 'brake_fault': '<S1>:34' */ break; case AEB0_IN_brake_on_: /* During 'brake_on_': '<S1>:32' */ /* '<S1>:35:1' sf_internal_predicateOutput = ... */ /* '<S1>:35:1' (after(500, msec)) && (speed_km_h>=speed_at_brake_start && speed_km_h > 0 && brake>0.1); */ if ((AEB0_DW.temporalCounter_i2 >= 5U) && (AEB0_U.speed_km_h >= AEB0_DW.speed_at_brake_start) && (AEB0_U.speed_km_h > 0.0) && (AEB0_Y.brake > 0.1)) { /* Transition: '<S1>:35' */ AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_brake_fault; /* Outport: '<Root>/fault' */ /* Entry 'brake_fault': '<S1>:34' */ /* '<S1>:34:1' fault=1 */ AEB0_Y.fault = 1.0; } else { /* '<S1>:46:1' sf_internal_predicateOutput = ... */ /* '<S1>:46:1' (after(500, msec)) && (speed_km_h<speed_at_brake_start); */ if ((AEB0_DW.temporalCounter_i2 >= 5U) && (AEB0_U.speed_km_h < AEB0_DW.speed_at_brake_start)) { /* Transition: '<S1>:46' */ AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_brake_on_; AEB0_DW.temporalCounter_i2 = 0U; /* Entry 'brake_on_': '<S1>:32' */ /* '<S1>:32:1' speed_at_brake_start = speed_km_h */ AEB0_DW.speed_at_brake_start = AEB0_U.speed_km_h; } else { /* '<S1>:47:1' sf_internal_predicateOutput = ... */ /* '<S1>:47:1' brake==0; */ if (AEB0_Y.brake == 0.0) { /* Transition: '<S1>:47' */ AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_ok2; } } } break; default: /* During 'ok2': '<S1>:31' */ /* '<S1>:33:1' sf_internal_predicateOutput = ... */ /* '<S1>:33:1' brake==1; */ if (AEB0_Y.brake == 1.0) { /* Transition: '<S1>:33' */ AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_brake_on_; AEB0_DW.temporalCounter_i2 = 0U; /* Entry 'brake_on_': '<S1>:32' */ /* '<S1>:32:1' speed_at_brake_start = speed_km_h */ AEB0_DW.speed_at_brake_start = AEB0_U.speed_km_h; } break; } /* During 'AEB_ALGO': '<S1>:40' */ if (AEB0_DW.is_AEB_ALGO != AEB0_IN_AEB_misbehaviour) { /* During 'AEB_ok': '<S1>:14' */ /* '<S1>:16:1' sf_internal_predicateOutput = ... */ /* '<S1>:16:1' fault==1; */ if (AEB0_Y.fault == 1.0) { /* Transition: '<S1>:16' */ /* Exit Internal 'AEB_ok': '<S1>:14' */ AEB0_DW.is_AEB_ok = AEB0_IN_NO_ACTIVE_CHILD; AEB0_DW.is_AEB_ALGO = AEB0_IN_AEB_misbehaviour; /* Outport: '<Root>/brake' */ /* Entry 'AEB_misbehaviour': '<S1>:15' */ /* '<S1>:15:1' brake=0 */ AEB0_Y.brake = 0.0; } else if (AEB0_DW.is_AEB_ok == AEB0_IN_brake_off_) { /* During 'brake_off_': '<S1>:3' */ /* '<S1>:5:1' sf_internal_predicateOutput = ... */ /* '<S1>:5:1' speed_km_h^2/div>distance_m; */ if (AEB0_U.speed_km_h * AEB0_U.speed_km_h / AEB0_div > AEB0_U.distance_m) { /* Transition: '<S1>:5' */ AEB0_DW.is_AEB_ok = AEB0_IN_brake_on_; /* Outport: '<Root>/brake' */ /* Entry 'brake_on_': '<S1>:1' */ /* brake is proportional to the inverse of distance */ /* and to the speed. This was required */ /* since it was requested that the led frequency */ /* must be proportional to the brake request */ /* '<S1>:1:3' brake=1 */ AEB0_Y.brake = 1.0; } } else { /* During 'brake_on_': '<S1>:1' */ /* '<S1>:6:1' sf_internal_predicateOutput = ... */ /* '<S1>:6:1' speed_km_h^2/div<distance_m; */ if (AEB0_U.speed_km_h * AEB0_U.speed_km_h / AEB0_div < AEB0_U.distance_m) { /* Transition: '<S1>:6' */ AEB0_DW.is_AEB_ok = AEB0_IN_brake_off_; /* Outport: '<Root>/brake' */ /* Entry 'brake_off_': '<S1>:3' */ /* '<S1>:3:1' brake=0 */ AEB0_Y.brake = 0.0; } } } else { /* During 'AEB_misbehaviour': '<S1>:15' */ } } /* End of Chart: '<Root>/AEB ' */ } /* Model initialize function */ void AEB0_initialize(void) { /* Registration code */ /* initialize error status */ rtmSetErrorStatus(AEB0_M, (NULL)); /* states (dwork) */ (void) memset((void *)&AEB0_DW, 0, sizeof(DW_AEB0_T)); /* external inputs */ (void) memset((void *)&AEB0_U, 0, sizeof(ExtU_AEB0_T)); /* external outputs */ (void) memset((void *)&AEB0_Y, 0, sizeof(ExtY_AEB0_T)); /* SystemInitialize for Chart: '<Root>/AEB ' */ AEB0_DW.is_AEB_ALGO = AEB0_IN_NO_ACTIVE_CHILD; AEB0_DW.is_AEB_ok = AEB0_IN_NO_ACTIVE_CHILD; AEB0_DW.is_AEB_brake_fault_detection = AEB0_IN_NO_ACTIVE_CHILD; AEB0_DW.temporalCounter_i2 = 0U; AEB0_DW.is_AEB_distance_sensor_fault_de = AEB0_IN_NO_ACTIVE_CHILD; AEB0_DW.temporalCounter_i1 = 0U; AEB0_DW.is_active_c3_AEB0 = 0U; /* SystemInitialize for Outport: '<Root>/fault' incorporates: * SystemInitialize for Chart: '<Root>/AEB ' */ AEB0_Y.fault = 0.0; } /* Model terminate function */ void AEB0_terminate(void) { /* (no terminate code required) */ } /* * File trailer for generated code. * * [EOF] */