4 const char* gStmEventName[] = {
8 "trans_gear_not_neutral",
18 const int gStmEventNo[] = {
20 STM_EVT_NO_DEACTIVATE,
21 STM_EVT_NO_TRANS_GEAR_N,
22 STM_EVT_NO_TRANS_GEAR_NOT_N,
23 STM_EVT_NO_PARKING_BRAKE_OFF,
24 STM_EVT_NO_PARKING_BRAKE_ON,
25 STM_EVT_NO_ACCEL_PEDAL_OFF,
26 STM_EVT_NO_ACCEL_PEDAL_ON,
27 STM_EVT_NO_TIMER_EXPIRED,
32 const char* gStmCategoryName[] = {
42 const int gStmCategoryNo[] = {
43 STM_CTG_NO_HOMESCREEN,
48 STM_CTG_NO_SYSTEM_ALERT,
49 STM_CTG_NO_RESTRICTION,
52 const char* gStmAreaName[] = {
59 "restriction.split.main",
60 "restriction.split.sub",
63 const int gStmAreaNo[] = {
66 STM_ARA_NO_SPLIT_MAIN,
69 STM_ARA_NO_RESTRICTION_NORMAL,
70 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
71 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
75 const char* gStmTransGearStateNo2Name[] = {
77 "trans_gear_not_neutral"
80 const char* gStmParkingBrakeStateNo2Name[] = {
85 const char* gStmAccelPedalStateNo2Name[] = {
90 const char* gStmCarStateNo2Name[] = {
95 const char* gStmLampStateNo2Name[] = {
100 const char* gStmLayoutNo2Name[] = {
112 "restriction.split.main",
113 "restriction.split.sub",
116 stm_state_t g_crr_state;
117 stm_state_t g_prv_state;
118 int g_prv_restriction_state_car_stop = 0;
119 int g_prv_apps_state_car_stop = 0;
121 void stmInitialize() {
122 // Initialize previous state
123 memset(&g_prv_state, 0, sizeof(g_prv_state));
125 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
126 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
127 g_prv_state.layer.apps.state = gStmLayoutNoNone;
128 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
129 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
130 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
131 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
132 g_prv_state.car.state = gStmCarStateNoStop;
133 g_prv_state.lamp.state = gStmLampStateNoOff;
135 // Initialize current state
136 g_crr_state = g_prv_state;
139 int stmTransitionState(int event, stm_state_t* state) {
140 int event_no, category_no, area_no;
141 int restriction_state, apps_state;
142 int trans_gear_state, parking_brake_state, accel_pedal_state, car_state, lamp_state;
144 event_no = event & STM_MSK_EVT_NO;
145 category_no = event & STM_MSK_CTG_NO;
146 area_no = event & STM_MSK_ARA_NO;
148 // Backup previous state
149 g_prv_state = g_crr_state;
151 // Get previous state
152 restriction_state = g_prv_state.layer.restriction.state;
153 apps_state = g_prv_state.layer.apps.state;
154 trans_gear_state = g_prv_state.trans_gear.state;
155 parking_brake_state = g_prv_state.parking_brake.state;
156 accel_pedal_state = g_prv_state.accel_pedal.state;
157 car_state = g_prv_state.car.state;
158 lamp_state = g_prv_state.lamp.state;
161 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
162 g_crr_state.layer.restriction.is_changed = STM_FALSE;
163 g_crr_state.layer.apps.is_changed = STM_FALSE;
164 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
165 g_crr_state.trans_gear.is_changed = STM_FALSE;
166 g_crr_state.parking_brake.is_changed = STM_FALSE;
167 g_crr_state.accel_pedal.is_changed = STM_FALSE;
168 g_crr_state.car.is_changed = STM_FALSE;
169 g_crr_state.lamp.is_changed = STM_FALSE;
174 case STM_EVT_NO_TRANS_GEAR_N:
175 if (gStmTransGearStateNoN != trans_gear_state) {
176 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
177 g_crr_state.trans_gear.is_changed = STM_TRUE;
180 case STM_EVT_NO_TRANS_GEAR_NOT_N:
181 if (gStmTransGearStateNoNotN != trans_gear_state) {
182 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
183 g_crr_state.trans_gear.is_changed = STM_TRUE;
186 case STM_EVT_NO_PARKING_BRAKE_OFF:
187 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
188 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
189 g_crr_state.parking_brake.is_changed = STM_TRUE;
192 case STM_EVT_NO_PARKING_BRAKE_ON:
193 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
194 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
195 g_crr_state.parking_brake.is_changed = STM_TRUE;
198 case STM_EVT_NO_ACCEL_PEDAL_OFF:
199 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
200 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
201 g_crr_state.accel_pedal.is_changed = STM_TRUE;
204 case STM_EVT_NO_ACCEL_PEDAL_ON:
205 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
206 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
207 g_crr_state.accel_pedal.is_changed = STM_TRUE;
210 case STM_EVT_NO_LAMP_OFF:
211 if (gStmLampStateNoOff != lamp_state) {
212 g_crr_state.lamp.state = gStmLampStateNoOff;
213 g_crr_state.lamp.is_changed = STM_TRUE;
216 case STM_EVT_NO_LAMP_ON:
217 if (gStmLampStateNoOn != lamp_state) {
218 g_crr_state.lamp.state = gStmLampStateNoOn;
219 g_crr_state.lamp.is_changed = STM_TRUE;
228 if (g_crr_state.parking_brake.is_changed
229 || g_crr_state.accel_pedal.is_changed) {
230 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
231 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
233 if (g_crr_state.parking_brake.is_changed
234 || g_crr_state.trans_gear.is_changed) {
235 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
236 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
238 if (gStmCarStateNoRun != car_state) {
239 // Car state is changed stop -> run
240 g_crr_state.car.state = gStmCarStateNoRun;
241 g_crr_state.car.is_changed = STM_TRUE;
243 // Update restriction layer
244 g_prv_restriction_state_car_stop = restriction_state;
245 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
246 g_crr_state.layer.restriction.is_changed = STM_TRUE;
249 g_prv_apps_state_car_stop = apps_state;
250 g_crr_state.layer.apps.state = gStmLayoutNoM1;
251 g_crr_state.layer.apps.is_changed = STM_TRUE;
255 if (gStmCarStateNoStop != car_state) {
256 // Car state is changed run -> stop
257 g_crr_state.car.state = gStmCarStateNoStop;
258 g_crr_state.car.is_changed = STM_TRUE;
260 // Update restriction layer
261 g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
262 g_crr_state.layer.restriction.is_changed = STM_TRUE;
265 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
266 g_crr_state.layer.apps.is_changed = STM_TRUE;
271 // Set apps/homescreen layer
273 case STM_EVT_NO_ACTIVATE:
274 if (gStmCarStateNoStop == car_state) {
275 switch (category_no) {
276 case STM_CTG_NO_HOMESCREEN:
278 g_crr_state.layer.apps.state = gStmLayoutNoNone;
279 g_crr_state.layer.apps.is_changed = STM_TRUE;
282 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
283 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
287 case STM_ARA_NO_FULL:
289 switch (apps_state) {
294 g_crr_state.layer.apps.state = gStmLayoutNoMf;
295 g_crr_state.layer.apps.is_changed = STM_TRUE;
299 case STM_ARA_NO_NORMAL:
301 switch (apps_state) {
306 g_crr_state.layer.apps.state = gStmLayoutNoM2;
307 g_crr_state.layer.apps.is_changed = STM_TRUE;
310 g_crr_state.layer.apps.state = gStmLayoutNoM1;
311 g_crr_state.layer.apps.is_changed = STM_TRUE;
314 case STM_ARA_NO_SPLIT_MAIN:
316 switch (apps_state) {
319 g_crr_state.layer.apps.state = gStmLayoutNoS2;
320 g_crr_state.layer.apps.is_changed = STM_TRUE;
329 case STM_CTG_NO_GENERAL:
331 case STM_ARA_NO_NORMAL:
333 switch (apps_state) {
338 g_crr_state.layer.apps.state = gStmLayoutNoG;
339 g_crr_state.layer.apps.is_changed = STM_TRUE;
348 case STM_CTG_NO_SPLITABLE:
350 case STM_ARA_NO_NORMAL:
352 switch (apps_state) {
354 g_crr_state.layer.apps.state = gStmLayoutNoM2;
355 g_crr_state.layer.apps.is_changed = STM_TRUE;
362 g_crr_state.layer.apps.state = gStmLayoutNoS1;
363 g_crr_state.layer.apps.is_changed = STM_TRUE;
367 case STM_ARA_NO_SPLIT_MAIN:
369 switch (apps_state) {
371 g_crr_state.layer.apps.state = gStmLayoutNoS2;
372 g_crr_state.layer.apps.is_changed = STM_TRUE;
375 g_crr_state.layer.apps.state = gStmLayoutNoS2;
376 g_crr_state.layer.apps.is_changed = STM_TRUE;
383 case STM_ARA_NO_SPLIT_SUB:
385 switch (apps_state) {
387 g_crr_state.layer.apps.state = gStmLayoutNoM2;
388 g_crr_state.layer.apps.is_changed = STM_TRUE;
391 g_crr_state.layer.apps.state = gStmLayoutNoM2;
392 g_crr_state.layer.apps.is_changed = STM_TRUE;
395 g_crr_state.layer.apps.state = gStmLayoutNoS2;
396 g_crr_state.layer.apps.is_changed = STM_TRUE;
399 g_crr_state.layer.apps.state = gStmLayoutNoS2;
400 g_crr_state.layer.apps.is_changed = STM_TRUE;
418 case STM_EVT_NO_DEACTIVATE:
419 switch (category_no) {
431 // Set restriction layer
432 if (STM_CTG_NO_RESTRICTION == category_no) {
433 if (STM_EVT_NO_ACTIVATE == event_no) {
434 if (gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state) {
436 case STM_ARA_NO_RESTRICTION_NORMAL:
437 switch (restriction_state) {
438 case gStmLayoutNoNone:
439 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
440 g_crr_state.layer.restriction.is_changed = STM_TRUE;
447 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
448 switch (restriction_state) {
449 case gStmLayoutNoNone:
450 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
451 g_crr_state.layer.restriction.is_changed = STM_TRUE;
458 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
459 switch (restriction_state) {
460 case gStmLayoutNoNone:
461 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
462 g_crr_state.layer.restriction.is_changed = STM_TRUE;
475 else if (STM_EVT_NO_DEACTIVATE == event_no) {
476 switch (restriction_state) {
477 case gStmLayoutNoRestriction:
478 case gStmLayoutNoRestrictionSplitMain:
479 case gStmLayoutNoRestrictionSplitSub:
480 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
481 g_crr_state.layer.restriction.is_changed = STM_TRUE;
489 else if (g_crr_state.layer.apps.is_changed) {
490 if (gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state) {
491 if (gStmLayoutNoM2 == g_crr_state.layer.apps.state) {
492 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
493 g_crr_state.layer.restriction.is_changed = STM_TRUE;
495 else if (gStmLayoutNoS1 == g_crr_state.layer.apps.state) {
496 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
497 g_crr_state.layer.restriction.is_changed = STM_TRUE;
500 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
501 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
502 g_crr_state.layer.restriction.is_changed = STM_TRUE;
507 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
508 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
509 g_crr_state.layer.restriction.is_changed = STM_TRUE;
514 // Copy current state for return
515 memcpy(state, &g_crr_state, sizeof(g_crr_state));