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 char* gStmCategoryName[] = {
36 const char* gStmAreaName[] = {
44 "restriction.split.main",
45 "restriction.split.sub",
49 const char* gStmTransGearStateName[] = {
54 const char* gStmParkingBrakeStateName[] = {
59 const char* gStmAccelPedalStateName[] = {
64 const char* gStmRunningStateNo2Name[] = {
69 const char* gStmLampStateName[] = {
74 const char* gStmLightstatusBrakeStateName[] = {
79 const char* gStmRestrictionModeStateName[] = {
84 const char* gStmLayoutName[] = {
96 "restriction.split.main",
97 "restriction.split.sub",
101 const char* gStmLayerName[] = {
108 const char* gStmCarElementName[] = {
118 const char** gStmCarStateNameList[] = {
119 gStmTransGearStateName,
120 gStmParkingBrakeStateName,
121 gStmAccelPedalStateName,
122 gStmRunningStateNo2Name,
124 gStmLightstatusBrakeStateName,
125 gStmRestrictionModeStateName,
128 stm_state_t g_crr_state;
129 stm_state_t g_prv_state;
130 int g_prv_on_screen_state_car_stop = 0;
131 int g_prv_restriction_state_car_stop = 0;
132 int g_prv_apps_state_car_stop = 0;
133 int g_map_is_activated = STM_FALSE;
135 void stmInitialize() {
136 // Initialize previous state
137 memset(&g_prv_state, 0, sizeof(g_prv_state));
139 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
140 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
141 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
142 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
143 g_prv_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
144 g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
145 g_prv_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
146 g_prv_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
147 g_prv_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
148 g_prv_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
149 g_prv_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
151 // Initialize current state
152 g_crr_state = g_prv_state;
155 int stmTransitionState(int event, stm_state_t* state) {
156 int event_no, category_no, area_no;
157 int on_screen_state, restriction_state, apps_state;
158 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
160 event_no = GET_EVENT_FROM_ID(event);
161 category_no = GET_CATEGORY_FROM_ID(event);
162 area_no = GET_AREA_FROM_ID(event);
164 // Backup previous state
165 g_prv_state = g_crr_state;
167 // Get previous state
168 on_screen_state = g_prv_state.layer[gStmLayerNoOnScreen].state;
169 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
170 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
171 trans_gear_state = g_prv_state.car_element[gStmCarElementNoTransGear].state;
172 parking_brake_state = g_prv_state.car_element[gStmCarElementNoParkingBrake].state;
173 accel_pedal_state = g_prv_state.car_element[gStmCarElementNoAccelPedal].state;
174 car_state = g_prv_state.car_element[gStmCarElementNoRunning].state;
175 lamp_state = g_prv_state.car_element[gStmCarElementNoLamp].state;
176 lightstatus_brake_state = g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state;
177 restriction_mode_state = g_prv_state.car_element[gStmCarElementNoRestrictionMode].state;
180 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_FALSE;
181 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_FALSE;
182 g_crr_state.layer[gStmLayerNoApps].changed = STM_FALSE;
183 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_FALSE;
184 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_FALSE;
185 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_FALSE;
186 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_FALSE;
187 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_FALSE;
188 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_FALSE;
189 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_FALSE;
190 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_FALSE;
195 case STM_EVT_NO_TRANS_GEAR_N:
196 if (gStmTransGearStateNoN != trans_gear_state) {
197 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
198 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
201 case STM_EVT_NO_TRANS_GEAR_NOT_N:
202 if (gStmTransGearStateNoNotN != trans_gear_state) {
203 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoNotN;
204 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
207 case STM_EVT_NO_PARKING_BRAKE_OFF:
208 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
209 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOff;
210 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
213 case STM_EVT_NO_PARKING_BRAKE_ON:
214 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
215 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
216 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
219 case STM_EVT_NO_ACCEL_PEDAL_OFF:
220 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
221 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
222 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
225 case STM_EVT_NO_ACCEL_PEDAL_ON:
226 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
227 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOn;
228 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
231 case STM_EVT_NO_LAMP_OFF:
232 if (gStmLampStateNoOff != lamp_state) {
233 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
234 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
237 case STM_EVT_NO_LAMP_ON:
238 if (gStmLampStateNoOn != lamp_state) {
239 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOn;
240 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
243 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
244 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
245 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOff;
246 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
249 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
250 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
251 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
252 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
261 if (g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed
262 || g_crr_state.car_element[gStmCarElementNoAccelPedal].changed) {
263 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state)
264 && (gStmAccelPedalStateNoOn == g_crr_state.car_element[gStmCarElementNoAccelPedal].state)){
266 if (g_crr_state.car_element[gStmCarElementNoParkingBrake].changed
267 || g_crr_state.car_element[gStmCarElementNoTransGear].changed) {
268 if ((gStmParkingBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoParkingBrake].state)
269 && (gStmTransGearStateNoNotN == g_crr_state.car_element[gStmCarElementNoTransGear].state)){
271 if (gStmRunningNoRun != car_state) {
272 // Car state is changed stop -> run
273 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoRun;
274 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
278 if (gStmRunningNoStop != car_state) {
279 // Car state is changed run -> stop
280 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
281 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
286 // Set restriction mode
287 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
288 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
289 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
291 // Restriction mode is changed OFF -> ON
292 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOn;
293 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
295 // Update on screen layer
296 g_prv_on_screen_state_car_stop = on_screen_state;
297 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
298 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
300 // Update restriction layer
301 g_prv_restriction_state_car_stop = restriction_state;
302 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
303 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
306 g_prv_apps_state_car_stop = apps_state;
307 if ((STM_TRUE == g_map_is_activated)
308 && (gStmLayoutNoSysNml != apps_state)) {
309 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapNml;
310 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
313 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
314 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
315 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
317 // Restriction mode is changed ON -> OFF
318 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
319 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
321 // Update on screen layer
322 g_crr_state.layer[gStmLayerNoOnScreen].state = g_prv_on_screen_state_car_stop;
323 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
325 // Update restriction layer
326 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
327 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
330 if (STM_TRUE == g_map_is_activated) {
331 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
332 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
336 // Set apps/homescreen layer
338 case STM_EVT_NO_ACTIVATE:
339 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
340 switch (category_no) {
341 case STM_CTG_NO_HOMESCREEN:
343 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHms;
344 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_TRUE;
347 if (gStmLayoutNoNone != apps_state) {
348 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
349 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
354 case STM_AREA_NO_FULL:
356 switch (apps_state) {
357 case gStmLayoutNoMapFll:
361 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapFll;
362 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
366 case STM_AREA_NO_NORMAL:
368 switch (apps_state) {
369 case gStmLayoutNoMapNml:
372 case gStmLayoutNoSplNml:
373 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapSpl;
374 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
377 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapNml;
378 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
381 case STM_AREA_NO_SPLIT_MAIN:
383 switch (apps_state) {
384 case gStmLayoutNoSplNml:
385 case gStmLayoutNoSplSpl:
386 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplSpl;
387 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
396 case STM_CTG_NO_GENERAL:
398 case STM_AREA_NO_NORMAL:
400 switch (apps_state) {
401 case gStmLayoutNoMapFll:
405 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoGenNml;
406 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
415 case STM_CTG_NO_SYSTEM:
417 case STM_AREA_NO_NORMAL:
419 switch (apps_state) {
420 case gStmLayoutNoMapFll:
424 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSysNml;
425 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
434 case STM_CTG_NO_SPLITABLE:
436 case STM_AREA_NO_NORMAL:
438 switch (apps_state) {
439 case gStmLayoutNoMapNml:
440 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapSpl;
441 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
443 case gStmLayoutNoMapFll:
444 case gStmLayoutNoSplNml:
448 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplNml;
449 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
453 case STM_AREA_NO_SPLIT_MAIN:
455 switch (apps_state) {
456 case gStmLayoutNoSplNml:
457 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplSpl;
458 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
460 case gStmLayoutNoSplSpl:
461 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplSpl;
462 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
469 case STM_AREA_NO_SPLIT_SUB:
471 switch (apps_state) {
472 case gStmLayoutNoMapNml:
473 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapSpl;
474 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
476 case gStmLayoutNoMapSpl:
477 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapSpl;
478 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
480 case gStmLayoutNoSplNml:
481 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplSpl;
482 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
484 case gStmLayoutNoSplSpl:
485 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSplSpl;
486 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
504 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
505 switch (category_no) {
508 case STM_AREA_NO_FULL:
509 case STM_AREA_NO_NORMAL:
510 case STM_AREA_NO_SPLIT_MAIN:
512 switch (apps_state) {
513 case gStmLayoutNoMapNml:
517 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMapNml;
518 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
523 case STM_CTG_NO_SYSTEM:
525 case STM_AREA_NO_NORMAL:
527 switch (apps_state) {
528 case gStmLayoutNoMapFll:
532 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSysNml;
533 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
544 case STM_EVT_NO_DEACTIVATE:
545 switch (category_no) {
557 // Set restriction layer
558 if (STM_CTG_NO_RESTRICTION == category_no) {
559 if (STM_EVT_NO_ACTIVATE == event_no) {
560 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
562 case STM_AREA_NO_RESTRICTION_NORMAL:
563 switch (restriction_state) {
564 case gStmLayoutNoNone:
565 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoSplNml) {
566 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstNml;
567 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
569 else if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoMapSpl) {
570 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstSplSub;
571 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
579 case STM_AREA_NO_RESTRICTION_SPLIT_MAIN:
580 switch (restriction_state) {
581 case gStmLayoutNoNone:
582 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstSplMain;
583 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
590 case STM_AREA_NO_RESTRICTION_SPLIT_SUB:
591 switch (restriction_state) {
592 case gStmLayoutNoNone:
593 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoMapSpl) {
594 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstSplSub;
595 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
609 else if (STM_EVT_NO_DEACTIVATE == event_no) {
610 switch (restriction_state) {
611 case gStmLayoutNoRstNml:
612 case gStmLayoutNoRstSplMain:
613 case gStmLayoutNoRstSplSub:
614 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
615 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
623 else if (g_crr_state.layer[gStmLayerNoApps].changed) {
624 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
625 if (gStmLayoutNoMapSpl == g_crr_state.layer[gStmLayerNoApps].state) {
626 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstSplSub;
627 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
629 else if (gStmLayoutNoSplNml == g_crr_state.layer[gStmLayerNoApps].state) {
630 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRstNml;
631 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
634 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
635 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
636 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
641 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
642 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
643 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
648 // Set on screen layer
649 if (STM_CTG_NO_POPUP == category_no) {
650 if (STM_EVT_NO_ACTIVATE == event_no) {
651 switch (on_screen_state) {
652 case gStmLayoutNoNone:
653 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoPopUp;
654 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
661 else if (STM_EVT_NO_DEACTIVATE == event_no) {
662 switch (on_screen_state) {
663 case gStmLayoutNoPopUp:
664 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
665 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
674 // Copy current state for return
675 memcpy(state, &g_crr_state, sizeof(g_crr_state));
677 if ((STM_FALSE == g_map_is_activated)
678 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].changed)
679 && ((gStmLayoutNoMapNml == g_crr_state.layer[gStmLayerNoApps].state)
680 || (gStmLayoutNoMapSpl == g_crr_state.layer[gStmLayerNoApps].state)
681 || (gStmLayoutNoMapFll == g_crr_state.layer[gStmLayerNoApps].state))) {
682 g_map_is_activated = STM_TRUE;
688 void stmUndoState() {
689 g_crr_state = g_prv_state;