demo-epb  v1.0
Elektrische Parkbremse - slohmaier Dev Process Demo
safety_manager.c
gehe zur Dokumentation dieser Datei
1 /**
2  * @file safety_manager.c
3  * @brief Safety Manager — Hill-Hold, Auto-Apply, Drive-Away Assist.
4  *
5  * @arch SWA-001
6  * @reqs SWE-007 SWE-008 SWE-009 SWE-010 SWE-011 SWE-012
7  *
8  * ASIL: D. This component decides, when the Apply Controller receives an
9  * apply or release request (hill-hold handover, auto-apply on
10  * engine-off, drive-away assist).
11  * Changes require a technical review with 2 approvals.
12  */
13 #include <stddef.h>
14 
15 #include "safety_manager.h"
16 
17 typedef struct {
19  uint16_t ticks_in_state; /* 50ms ticks in the current state */
22 } SafetyCtx;
23 
25 
26 static void enter(SafetyState s)
27 {
28  s_ctx.state = s;
29  s_ctx.ticks_in_state = 0U;
30 }
31 
32 static bool standstill(const SafetyInputs* in)
33 {
35 }
36 
37 static bool grade_steep(const SafetyInputs* in)
38 {
39  /* @reqs SWE-009: Hill-hold above |grade| > 5% */
40  float g = in->grade_percent;
41  if (g < 0.0f) {
42  g = -g;
43  }
44  return g > SAFETY_HILLHOLD_GRADE_PCT;
45 }
46 
47 /**
48  * @reqs SWE-011 (Detect drive-away intent)
49  */
50 static bool drive_intent(const SafetyInputs* in)
51 {
53  && in->gear_in_drive
54  && in->engine_running;
55 }
56 
57 /**
58  * @reqs SWE-012 (Safety check before auto-release)
59  */
60 static bool drive_away_safety_ok(const SafetyInputs* in)
61 {
62  return in->door_closed && in->seatbelt_fastened;
63 }
64 
66 {
68  s_ctx.ticks_in_state = 0U;
69  s_ctx.apply_requested = false;
70  s_ctx.release_requested = false;
71  return EPB_OK;
72 }
73 
75 {
76  if (in == NULL) {
77  return;
78  }
79 
80  if (s_ctx.ticks_in_state < UINT16_MAX) {
82  }
83 
84  /* Default: no apply/release request unless explicitly set below. */
85  s_ctx.apply_requested = false;
86  s_ctx.release_requested = false;
87 
88  switch (s_ctx.state) {
89  case SAFETY_IDLE:
90  /* @reqs SWE-009: Hill-hold activation */
91  if (grade_steep(in) && standstill(in) && in->brake_pedal_pressed) {
93  break;
94  }
95  /* @reqs SWE-007: Detect engine-off condition */
96  if (!in->engine_running && standstill(in)
100  break;
101  }
102  /* @reqs SWE-011 + SWE-012: Drive-Away Assist */
104  && drive_intent(in) && drive_away_safety_ok(in)) {
105  s_ctx.release_requested = true;
107  }
108  break;
109 
111  /* @reqs SWE-010: Trigger apply on brake release */
112  if (!in->brake_pedal_pressed) {
113  s_ctx.apply_requested = true;
115  break;
116  }
117  /* Hill-hold condition no longer met? */
118  if (!grade_steep(in) || !standstill(in)) {
120  }
121  break;
122 
124  /* Ends when vehicle rolls or brake is applied */
126  || in->current_state == EPB_STATE_APPLIED) {
128  } else {
129  s_ctx.apply_requested = true;
130  }
131  break;
132 
134  /* Condition must remain continuously satisfied */
135  if (in->engine_running || !standstill(in)) {
137  break;
138  }
139  /* @reqs SWE-008: Auto-apply after 2 s (40 ticks) delay */
141  s_ctx.apply_requested = true;
143  }
144  break;
145 
147  if (in->current_state == EPB_STATE_APPLIED) {
149  } else {
150  s_ctx.apply_requested = true;
151  }
152  break;
153 
154  case SAFETY_DRIVE_AWAY:
155  /* Ends when the brake has been released or preconditions are no longer ok. */
159  } else if (!drive_intent(in) || !drive_away_safety_ok(in)) {
161  } else {
162  s_ctx.release_requested = true;
163  }
164  break;
165 
166  default:
168  break;
169  }
170 }
171 
173 {
174  return s_ctx.apply_requested;
175 }
176 
178 {
179  return s_ctx.release_requested;
180 }
181 
183 {
184  return s_ctx.state;
185 }
@ EPB_STATE_APPLIED
Definition: epb_types.h:25
@ EPB_STATE_APPLYING
Definition: epb_types.h:24
@ EPB_STATE_RELEASED
Definition: epb_types.h:23
@ EPB_STATE_RELEASING
Definition: epb_types.h:26
EpbStatus
Definition: epb_types.h:13
@ EPB_OK
Definition: epb_types.h:14
static bool drive_intent(const SafetyInputs *in)
void safety_mgr_step_50ms(const SafetyInputs *in)
static void enter(SafetyState s)
bool safety_mgr_apply_requested(void)
EpbStatus safety_mgr_init(void)
static bool grade_steep(const SafetyInputs *in)
static bool drive_away_safety_ok(const SafetyInputs *in)
bool safety_mgr_release_requested(void)
static bool standstill(const SafetyInputs *in)
SafetyState safety_mgr_get_state(void)
static SafetyCtx s_ctx
Safety Manager — hill-hold, auto-apply, drive-away assist.
SafetyState
@ SAFETY_HILL_HOLD_ARMED
@ SAFETY_AUTO_APPLY_TRIGGERED
@ SAFETY_IDLE
@ SAFETY_HILL_HOLD_ACTIVE
@ SAFETY_AUTO_APPLY_ARMED
@ SAFETY_DRIVE_AWAY
#define SAFETY_HILLHOLD_GRADE_PCT
#define SAFETY_DRIVE_INTENT_GAS_PCT
#define SAFETY_RELEASE_KMH
#define SAFETY_AUTO_APPLY_DELAY_50MS
#define SAFETY_STANDSTILL_KMH
SafetyState state
bool release_requested
bool apply_requested
uint16_t ticks_in_state
bool seatbelt_fastened
float grade_percent
float vehicle_speed_kmh
EpbState current_state
float gas_pedal_percent
bool brake_pedal_pressed