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 Logik.
4  *
5  * @arch SWA-001
6  * @reqs SWE-007 SWE-008 SWE-009 SWE-010
7  *
8  * ASIL: D. Diese Komponente entscheidet, wann der Apply Controller eine
9  * Apply-Anforderung erhaelt (Hill-Hold-Uebergabe, Auto-Apply bei Motor-Aus).
10  * Aenderungen erfordern Technical Review mit 2 Approvals.
11  */
12 #include <stddef.h>
13 
14 #include "safety_manager.h"
15 
16 typedef struct {
18  uint16_t ticks_in_state; /* 50ms-Ticks im aktuellen Zustand */
20 } SafetyCtx;
21 
23 
24 static void enter(SafetyState s)
25 {
26  s_ctx.state = s;
27  s_ctx.ticks_in_state = 0U;
28 }
29 
30 static bool standstill(const SafetyInputs* in)
31 {
33 }
34 
35 static bool grade_steep(const SafetyInputs* in)
36 {
37  /* @reqs SWE-009: Hill-Hold ab |grade| > 5% */
38  float g = in->grade_percent;
39  if (g < 0.0f) {
40  g = -g;
41  }
42  return g > SAFETY_HILLHOLD_GRADE_PCT;
43 }
44 
46 {
48  s_ctx.ticks_in_state = 0U;
49  s_ctx.apply_requested = false;
50  return EPB_OK;
51 }
52 
54 {
55  if (in == NULL) {
56  return;
57  }
58 
59  if (s_ctx.ticks_in_state < UINT16_MAX) {
61  }
62 
63  /* Default: no apply request unless explicitly set below. */
64  s_ctx.apply_requested = false;
65 
66  switch (s_ctx.state) {
67  case SAFETY_IDLE:
68  /* @reqs SWE-009: Hill-Hold-Aktivierung */
69  if (grade_steep(in) && standstill(in) && in->brake_pedal_pressed) {
71  break;
72  }
73  /* @reqs SWE-007: Motor-Aus-Bedingung erkennen */
74  if (!in->engine_running && standstill(in)
78  }
79  break;
80 
82  /* @reqs SWE-010: Beim Loslassen des Bremspedals Apply triggern */
83  if (!in->brake_pedal_pressed) {
84  s_ctx.apply_requested = true;
86  break;
87  }
88  /* Bedingung fuer Hill-Hold nicht mehr erfuellt? */
89  if (!grade_steep(in) || !standstill(in)) {
91  }
92  break;
93 
95  /* Beendet, wenn Fahrzeug rollt oder Bremse appliziert */
97  || in->current_state == EPB_STATE_APPLIED) {
99  } else {
100  s_ctx.apply_requested = true;
101  }
102  break;
103 
105  /* Bedingung muss durchgaengig erfuellt sein */
106  if (in->engine_running || !standstill(in)) {
108  break;
109  }
110  /* @reqs SWE-008: Auto-Apply nach 2 s (40 Ticks) Verzoegerung */
112  s_ctx.apply_requested = true;
114  }
115  break;
116 
118  if (in->current_state == EPB_STATE_APPLIED) {
120  } else {
121  s_ctx.apply_requested = true;
122  }
123  break;
124 
125  default:
127  break;
128  }
129 }
130 
132 {
133  return s_ctx.apply_requested;
134 }
135 
137 {
138  return s_ctx.state;
139 }
@ EPB_STATE_APPLIED
Definition: epb_types.h:25
@ EPB_STATE_APPLYING
Definition: epb_types.h:24
EpbStatus
Definition: epb_types.h:13
@ EPB_OK
Definition: epb_types.h:14
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 standstill(const SafetyInputs *in)
SafetyState safety_mgr_get_state(void)
static SafetyCtx s_ctx
Safety Manager — Hill-Hold + Auto-Apply Logik.
SafetyState
@ SAFETY_HILL_HOLD_ARMED
@ SAFETY_AUTO_APPLY_TRIGGERED
@ SAFETY_IDLE
@ SAFETY_HILL_HOLD_ACTIVE
@ SAFETY_AUTO_APPLY_ARMED
#define SAFETY_HILLHOLD_GRADE_PCT
#define SAFETY_RELEASE_KMH
#define SAFETY_AUTO_APPLY_DELAY_50MS
#define SAFETY_STANDSTILL_KMH
SafetyState state
bool apply_requested
uint16_t ticks_in_state
float grade_percent
float vehicle_speed_kmh
EpbState current_state
bool brake_pedal_pressed