5 const char* gStmEventName[] = {
10 "trans_gear_not_neutral",
18 "lightstatus_brake_off",
19 "lightstatus_brake_on",
20 "restriction_mode_off",
21 "restriction_mode_on",
24 const int gStmEventNo[] = {
27 STM_EVT_NO_DEACTIVATE,
28 STM_EVT_NO_TRANS_GEAR_N,
29 STM_EVT_NO_TRANS_GEAR_NOT_N,
30 STM_EVT_NO_PARKING_BRAKE_OFF,
31 STM_EVT_NO_PARKING_BRAKE_ON,
32 STM_EVT_NO_ACCEL_PEDAL_OFF,
33 STM_EVT_NO_ACCEL_PEDAL_ON,
34 STM_EVT_NO_TIMER_EXPIRED,
37 STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF,
38 STM_EVT_NO_LIGHTSTATUS_BRAKE_ON,
39 STM_EVT_NO_RESTRICTION_MODE_OFF,
40 STM_EVT_NO_RESTRICTION_MODE_ON,
43 const char* gStmCategoryName[] = {
55 const int gStmCategoryNo[] = {
57 STM_CTG_NO_HOMESCREEN,
62 STM_CTG_NO_SYSTEM_ALERT,
63 STM_CTG_NO_RESTRICTION,
67 const char* gStmAreaName[] = {
75 "restriction.split.main",
76 "restriction.split.sub",
79 const int gStmAreaNo[] = {
83 STM_ARA_NO_SPLIT_MAIN,
86 STM_ARA_NO_RESTRICTION_NORMAL,
87 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
88 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
92 const char* gStmTransGearStateNo2Name[] = {
94 "trans_gear_not_neutral"
97 const char* gStmParkingBrakeStateNo2Name[] = {
102 const char* gStmAccelPedalStateNo2Name[] = {
107 const char* gStmRunningNo2Name[] = {
112 const char* gStmLampStateNo2Name[] = {
117 const char* gStmLightstatusBrakeStateNo2Name[] = {
118 "lightstatus_brake_off",
119 "lightstatus_brake_on"
122 const char* gStmRestrictionModeStateNo2Name[] = {
123 "restriction_mode_off",
124 "restriction_mode_on"
127 const char* gStmLayoutNo2Name[] = {
139 "restriction.split.main",
140 "restriction.split.sub",
144 const char* gStmLayerName[] = {
152 const char* gStmCarElementName[] = {
162 const char** gStmCarStateNameList[] = {
163 gStmTransGearStateNo2Name,
164 gStmParkingBrakeStateNo2Name,
165 gStmAccelPedalStateNo2Name,
167 gStmLampStateNo2Name,
168 gStmLightstatusBrakeStateNo2Name,
169 gStmRestrictionModeStateNo2Name,
172 stm_state_t g_crr_state;
173 stm_state_t g_prv_state;
174 int g_prv_restriction_state_car_stop = 0;
175 int g_prv_apps_state_car_stop = 0;
176 int g_map_is_activated = STM_FALSE;
178 void stmInitialize() {
179 // Initialize previous state
180 memset(&g_prv_state, 0, sizeof(g_prv_state));
182 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
183 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
184 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
185 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
186 g_prv_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
187 g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
188 g_prv_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
189 g_prv_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
190 g_prv_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
191 g_prv_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
192 g_prv_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
194 // Initialize current state
195 g_crr_state = g_prv_state;
198 int stmTransitionState(int event, stm_state_t* state) {
199 int event_no, category_no, area_no;
200 int restriction_state, apps_state;
201 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
203 event_no = event & STM_MSK_EVT_NO;
204 category_no = event & STM_MSK_CTG_NO;
205 area_no = event & STM_MSK_ARA_NO;
207 // Backup previous state
208 g_prv_state = g_crr_state;
210 // Get previous state
211 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
212 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
213 trans_gear_state = g_prv_state.car_element[gStmCarElementNoTransGear].state;
214 parking_brake_state = g_prv_state.car_element[gStmCarElementNoParkingBrake].state;
215 accel_pedal_state = g_prv_state.car_element[gStmCarElementNoAccelPedal].state;
216 car_state = g_prv_state.car_element[gStmCarElementNoRunning].state;
217 lamp_state = g_prv_state.car_element[gStmCarElementNoLamp].state;
218 lightstatus_brake_state = g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state;
219 restriction_mode_state = g_prv_state.car_element[gStmCarElementNoRestrictionMode].state;
222 g_crr_state.layer[gStmLayerNoOnScreen].is_changed = STM_FALSE;
223 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_FALSE;
224 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_FALSE;
225 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_FALSE;
226 g_crr_state.car_element[gStmCarElementNoTransGear].is_changed = STM_FALSE;
227 g_crr_state.car_element[gStmCarElementNoParkingBrake].is_changed = STM_FALSE;
228 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].is_changed = STM_FALSE;
229 g_crr_state.car_element[gStmCarElementNoAccelPedal].is_changed = STM_FALSE;
230 g_crr_state.car_element[gStmCarElementNoRunning].is_changed = STM_FALSE;
231 g_crr_state.car_element[gStmCarElementNoLamp].is_changed = STM_FALSE;
232 g_crr_state.car_element[gStmCarElementNoRestrictionMode].is_changed = STM_FALSE;
237 case STM_EVT_NO_TRANS_GEAR_N:
238 if (gStmTransGearStateNoN != trans_gear_state) {
239 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
240 g_crr_state.car_element[gStmCarElementNoTransGear].is_changed = STM_TRUE;
243 case STM_EVT_NO_TRANS_GEAR_NOT_N:
244 if (gStmTransGearStateNoNotN != trans_gear_state) {
245 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoNotN;
246 g_crr_state.car_element[gStmCarElementNoTransGear].is_changed = STM_TRUE;
249 case STM_EVT_NO_PARKING_BRAKE_OFF:
250 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
251 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOff;
252 g_crr_state.car_element[gStmCarElementNoParkingBrake].is_changed = STM_TRUE;
255 case STM_EVT_NO_PARKING_BRAKE_ON:
256 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
257 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
258 g_crr_state.car_element[gStmCarElementNoParkingBrake].is_changed = STM_TRUE;
261 case STM_EVT_NO_ACCEL_PEDAL_OFF:
262 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
263 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
264 g_crr_state.car_element[gStmCarElementNoAccelPedal].is_changed = STM_TRUE;
267 case STM_EVT_NO_ACCEL_PEDAL_ON:
268 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
269 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOn;
270 g_crr_state.car_element[gStmCarElementNoAccelPedal].is_changed = STM_TRUE;
273 case STM_EVT_NO_LAMP_OFF:
274 if (gStmLampStateNoOff != lamp_state) {
275 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
276 g_crr_state.car_element[gStmCarElementNoLamp].is_changed = STM_TRUE;
279 case STM_EVT_NO_LAMP_ON:
280 if (gStmLampStateNoOn != lamp_state) {
281 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOn;
282 g_crr_state.car_element[gStmCarElementNoLamp].is_changed = STM_TRUE;
285 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
286 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
287 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOff;
288 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].is_changed = STM_TRUE;
291 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
292 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
293 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
294 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].is_changed = STM_TRUE;
303 if (g_crr_state.car_element[gStmCarElementNoLightstatusBrake].is_changed
304 || g_crr_state.car_element[gStmCarElementNoAccelPedal].is_changed) {
305 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state)
306 && (gStmAccelPedalStateNoOn == g_crr_state.car_element[gStmCarElementNoAccelPedal].state)){
308 if (g_crr_state.car_element[gStmCarElementNoParkingBrake].is_changed
309 || g_crr_state.car_element[gStmCarElementNoTransGear].is_changed) {
310 if ((gStmParkingBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoParkingBrake].state)
311 && (gStmTransGearStateNoNotN == g_crr_state.car_element[gStmCarElementNoTransGear].state)){
313 if (gStmRunningNoRun != car_state) {
314 // Car state is changed stop -> run
315 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoRun;
316 g_crr_state.car_element[gStmCarElementNoRunning].is_changed = STM_TRUE;
320 if (gStmRunningNoStop != car_state) {
321 // Car state is changed run -> stop
322 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
323 g_crr_state.car_element[gStmCarElementNoRunning].is_changed = STM_TRUE;
328 // Set restriction mode
329 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
330 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
331 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
333 // Restriction mode is changed OFF -> ON
334 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOn;
335 g_crr_state.car_element[gStmCarElementNoRestrictionMode].is_changed = STM_TRUE;
337 // Update restriction layer
338 g_prv_restriction_state_car_stop = restriction_state;
339 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
340 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
343 g_prv_apps_state_car_stop = apps_state;
344 if ((STM_TRUE == g_map_is_activated)
345 && (gStmLayoutNoSystem != apps_state)) {
346 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
347 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
350 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
351 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
352 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
354 // Restriction mode is changed ON -> OFF
355 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
356 g_crr_state.car_element[gStmCarElementNoRestrictionMode].is_changed = STM_TRUE;
358 // Update restriction layer
359 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
360 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
363 if (STM_TRUE == g_map_is_activated) {
364 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
365 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
369 // Set apps/homescreen layer
371 case STM_EVT_NO_ACTIVATE:
372 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
373 switch (category_no) {
374 case STM_CTG_NO_HOMESCREEN:
376 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
377 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
380 if (gStmLayoutNoNone != apps_state) {
381 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
382 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
387 case STM_ARA_NO_FULL:
389 switch (apps_state) {
394 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
395 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
399 case STM_ARA_NO_NORMAL:
401 switch (apps_state) {
406 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
407 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
410 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
411 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
414 case STM_ARA_NO_SPLIT_MAIN:
416 switch (apps_state) {
419 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
420 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
429 case STM_CTG_NO_GENERAL:
431 case STM_ARA_NO_NORMAL:
433 switch (apps_state) {
438 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
439 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
448 case STM_CTG_NO_SYSTEM:
450 case STM_ARA_NO_NORMAL:
452 switch (apps_state) {
457 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
458 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
467 case STM_CTG_NO_SPLITABLE:
469 case STM_ARA_NO_NORMAL:
471 switch (apps_state) {
473 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
474 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
481 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
482 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
486 case STM_ARA_NO_SPLIT_MAIN:
488 switch (apps_state) {
490 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
491 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
494 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
495 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
502 case STM_ARA_NO_SPLIT_SUB:
504 switch (apps_state) {
506 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
507 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
510 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
511 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
514 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
515 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
518 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
519 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
537 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
538 switch (category_no) {
541 case STM_ARA_NO_FULL:
542 case STM_ARA_NO_NORMAL:
543 case STM_ARA_NO_SPLIT_MAIN:
545 switch (apps_state) {
550 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
551 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
556 case STM_CTG_NO_SYSTEM:
558 case STM_ARA_NO_NORMAL:
560 switch (apps_state) {
565 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
566 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
577 case STM_EVT_NO_DEACTIVATE:
578 switch (category_no) {
590 // Set restriction layer
591 if (STM_CTG_NO_RESTRICTION == category_no) {
592 if (STM_EVT_NO_ACTIVATE == event_no) {
593 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
595 case STM_ARA_NO_RESTRICTION_NORMAL:
596 switch (restriction_state) {
597 case gStmLayoutNoNone:
598 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
599 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
600 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
608 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
609 switch (restriction_state) {
610 case gStmLayoutNoNone:
611 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
612 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
619 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
620 switch (restriction_state) {
621 case gStmLayoutNoNone:
622 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
623 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
624 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
638 else if (STM_EVT_NO_DEACTIVATE == event_no) {
639 switch (restriction_state) {
640 case gStmLayoutNoRestriction:
641 case gStmLayoutNoRestrictionSplitMain:
642 case gStmLayoutNoRestrictionSplitSub:
643 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
644 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
652 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
653 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
654 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
655 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
656 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
658 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
659 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
660 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
663 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
664 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
665 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
670 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
671 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
672 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
677 // Copy current state for return
678 memcpy(state, &g_crr_state, sizeof(g_crr_state));
680 if ((STM_FALSE == g_map_is_activated)
681 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
682 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
683 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
684 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
685 g_map_is_activated = STM_TRUE;
691 void stmUndoState() {
692 g_crr_state = g_prv_state;