5 const char* kStmEventName[] = {
10 "trans_gear_not_neutral",
17 "lightstatus_brake_off",
18 "lightstatus_brake_on",
19 "restriction_mode_off",
20 "restriction_mode_on",
23 const char* kStmCategoryName[] = {
35 const char* kStmAreaName[] = {
43 "restriction.split.main",
44 "restriction.split.sub",
48 const char* kStmTransGearStateName[] = {
53 const char* kStmParkingBrakeStateName[] = {
58 const char* kStmAccelPedalStateName[] = {
63 const char* kStmRunningSttNo2Name[] = {
68 const char* kStmLampStateName[] = {
73 const char* kStmLightstatusBrakeStateName[] = {
78 const char* kStmRestrictionModeStateName[] = {
83 const char* kStmLayoutName[] = {
95 "restriction.split.main",
96 "restriction.split.sub",
100 const char* kStmLayerName[] = {
107 const char* kStmCarElementName[] = {
117 const char** kStmCarStateNameList[] = {
118 kStmTransGearStateName,
119 kStmParkingBrakeStateName,
120 kStmAccelPedalStateName,
121 kStmRunningSttNo2Name,
123 kStmLightstatusBrakeStateName,
124 kStmRestrictionModeStateName,
127 static StmState g_crr_state;
128 static StmState g_prv_state;
129 static int g_prv_on_screen_state_car_stop = 0;
130 static int g_prv_restriction_state_car_stop = 0;
131 static int g_prv_apps_state_car_stop = 0;
132 static int g_map_is_activated = STM_FALSE;
134 void stmInitialize() {
135 // Initialize previous state
136 memset(&g_prv_state, 0, sizeof(g_prv_state));
138 g_prv_state.layer[StmLayerNoOnScreen].state = StmLayoutNoNone;
139 g_prv_state.layer[StmLayerNoRestriction].state = StmLayoutNoNone;
140 g_prv_state.layer[StmLayerNoApps].state = StmLayoutNoNone;
141 g_prv_state.layer[StmLayerNoHomescreen].state = StmLayoutNoNone;
142 g_prv_state.car_element[StmCarElementNoTransGear].state = StmTransGearSttNoN;
143 g_prv_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOn;
144 g_prv_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOff;
145 g_prv_state.car_element[StmCarElementNoRunning].state = StmRunningNoStop;
146 g_prv_state.car_element[StmCarElementNoLamp].state = StmLampSttNoOff;
147 g_prv_state.car_element[StmCarElementNoParkingBrake].state = StmParkingBrakeSttNoOn;
148 g_prv_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOff;
150 // Initialize current state
151 g_crr_state = g_prv_state;
154 int stmTransitionState(int event, StmState* state) {
155 int event_no, category_no, area_no;
156 int on_screen_state, restriction_state, apps_state;
157 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
159 event_no = STM_GET_EVENT_FROM_ID(event);
160 category_no = STM_GET_CATEGORY_FROM_ID(event);
161 area_no = STM_GET_AREA_FROM_ID(event);
163 // Backup previous state
164 g_prv_state = g_crr_state;
166 // Get previous state
167 on_screen_state = g_prv_state.layer[StmLayerNoOnScreen].state;
168 restriction_state = g_prv_state.layer[StmLayerNoRestriction].state;
169 apps_state = g_prv_state.layer[StmLayerNoApps].state;
170 trans_gear_state = g_prv_state.car_element[StmCarElementNoTransGear].state;
171 parking_brake_state = g_prv_state.car_element[StmCarElementNoParkingBrake].state;
172 accel_pedal_state = g_prv_state.car_element[StmCarElementNoAccelPedal].state;
173 car_state = g_prv_state.car_element[StmCarElementNoRunning].state;
174 lamp_state = g_prv_state.car_element[StmCarElementNoLamp].state;
175 lightstatus_brake_state = g_prv_state.car_element[StmCarElementNoLightstatusBrake].state;
176 restriction_mode_state = g_prv_state.car_element[StmCarElementNoRestrictionMode].state;
179 g_crr_state.layer[StmLayerNoOnScreen].changed = STM_FALSE;
180 g_crr_state.layer[StmLayerNoRestriction].changed = STM_FALSE;
181 g_crr_state.layer[StmLayerNoApps].changed = STM_FALSE;
182 g_crr_state.layer[StmLayerNoHomescreen].changed = STM_FALSE;
183 g_crr_state.car_element[StmCarElementNoTransGear].changed = STM_FALSE;
184 g_crr_state.car_element[StmCarElementNoParkingBrake].changed = STM_FALSE;
185 g_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_FALSE;
186 g_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_FALSE;
187 g_crr_state.car_element[StmCarElementNoRunning].changed = STM_FALSE;
188 g_crr_state.car_element[StmCarElementNoLamp].changed = STM_FALSE;
189 g_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_FALSE;
194 case StmEvtNoTransGearN:
195 if (StmTransGearSttNoN != trans_gear_state) {
196 g_crr_state.car_element[StmCarElementNoTransGear].state = StmTransGearSttNoN;
197 g_crr_state.car_element[StmCarElementNoTransGear].changed = STM_TRUE;
200 case StmEvtNoTransGearNotN:
201 if (StmTransGearSttNoNotN != trans_gear_state) {
202 g_crr_state.car_element[StmCarElementNoTransGear].state = StmTransGearSttNoNotN;
203 g_crr_state.car_element[StmCarElementNoTransGear].changed = STM_TRUE;
206 case StmEvtNoParkingBrakeOff:
207 if (StmParkingBrakeSttNoOff != parking_brake_state) {
208 g_crr_state.car_element[StmCarElementNoParkingBrake].state = StmParkingBrakeSttNoOff;
209 g_crr_state.car_element[StmCarElementNoParkingBrake].changed = STM_TRUE;
212 case StmEvtNoParkingBrakeOn:
213 if (StmParkingBrakeSttNoOn != parking_brake_state) {
214 g_crr_state.car_element[StmCarElementNoParkingBrake].state = StmParkingBrakeSttNoOn;
215 g_crr_state.car_element[StmCarElementNoParkingBrake].changed = STM_TRUE;
218 case StmEvtNoAccelPedalOff:
219 if (StmAccelPedalSttNoOff != accel_pedal_state) {
220 g_crr_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOff;
221 g_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_TRUE;
224 case StmEvtNoAccelPedalOn:
225 if (StmAccelPedalSttNoOn != accel_pedal_state) {
226 g_crr_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOn;
227 g_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_TRUE;
230 case StmEvtNoLampOff:
231 if (StmLampSttNoOff != lamp_state) {
232 g_crr_state.car_element[StmCarElementNoLamp].state = StmLampSttNoOff;
233 g_crr_state.car_element[StmCarElementNoLamp].changed = STM_TRUE;
237 if (StmLampSttNoOn != lamp_state) {
238 g_crr_state.car_element[StmCarElementNoLamp].state = StmLampSttNoOn;
239 g_crr_state.car_element[StmCarElementNoLamp].changed = STM_TRUE;
242 case StmEvtNoLightstatusBrakeOff:
243 if (StmLightstatusBrakeSttNoOff != lightstatus_brake_state) {
244 g_crr_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOff;
245 g_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_TRUE;
248 case StmEvtNoLightstatusBrakeOn:
249 if (StmLightstatusBrakeSttNoOn != lightstatus_brake_state) {
250 g_crr_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOn;
251 g_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_TRUE;
260 if (g_crr_state.car_element[StmCarElementNoLightstatusBrake].changed
261 || g_crr_state.car_element[StmCarElementNoAccelPedal].changed) {
262 if ((StmLightstatusBrakeSttNoOff == g_crr_state.car_element[StmCarElementNoLightstatusBrake].state)
263 && (StmAccelPedalSttNoOn == g_crr_state.car_element[StmCarElementNoAccelPedal].state)){
265 if (g_crr_state.car_element[StmCarElementNoParkingBrake].changed
266 || g_crr_state.car_element[StmCarElementNoTransGear].changed) {
267 if ((StmParkingBrakeSttNoOff == g_crr_state.car_element[StmCarElementNoParkingBrake].state)
268 && (StmTransGearSttNoNotN == g_crr_state.car_element[StmCarElementNoTransGear].state)){
270 if (StmRunningNoRun != car_state) {
271 // Car state is changed stop -> run
272 g_crr_state.car_element[StmCarElementNoRunning].state = StmRunningNoRun;
273 g_crr_state.car_element[StmCarElementNoRunning].changed = STM_TRUE;
277 if (StmRunningNoStop != car_state) {
278 // Car state is changed run -> stop
279 g_crr_state.car_element[StmCarElementNoRunning].state = StmRunningNoStop;
280 g_crr_state.car_element[StmCarElementNoRunning].changed = STM_TRUE;
285 // Set restriction mode
286 if ((StmEvtNoRestrictionModeOn == event_no)
287 && (StmRestrictionModeSttNoOn != restriction_mode_state)) {
288 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
290 // Restriction mode is changed OFF -> ON
291 g_crr_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOn;
292 g_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_TRUE;
294 // Update on screen layer
295 g_prv_on_screen_state_car_stop = on_screen_state;
296 g_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoNone;
297 g_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
299 // Update restriction layer
300 g_prv_restriction_state_car_stop = restriction_state;
301 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoNone;
302 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
305 g_prv_apps_state_car_stop = apps_state;
306 if ((STM_TRUE == g_map_is_activated)
307 && (StmLayoutNoSysNml != apps_state)) {
308 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapNml;
309 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
312 else if ((StmEvtNoRestrictionModeOff == event_no)
313 && (StmRestrictionModeSttNoOff != restriction_mode_state)) {
314 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
316 // Restriction mode is changed ON -> OFF
317 g_crr_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOff;
318 g_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_TRUE;
320 // Update on screen layer
321 g_crr_state.layer[StmLayerNoOnScreen].state = g_prv_on_screen_state_car_stop;
322 g_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
324 // Update restriction layer
325 g_crr_state.layer[StmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
326 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
329 if (STM_TRUE == g_map_is_activated) {
330 g_crr_state.layer[StmLayerNoApps].state = g_prv_apps_state_car_stop;
331 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
335 // Set apps/homescreen layer
337 case StmEvtNoActivate:
338 if (StmRestrictionModeSttNoOff == restriction_mode_state) {
339 switch (category_no) {
340 case StmCtgNoHomescreen:
342 g_crr_state.layer[StmLayerNoHomescreen].state = StmLayoutNoHms;
343 g_crr_state.layer[StmLayerNoHomescreen].changed = STM_TRUE;
346 if (StmLayoutNoNone != apps_state) {
347 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoNone;
348 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
353 case StmAreaNoFullscreen:
355 switch (apps_state) {
356 case StmLayoutNoMapFll:
360 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapFll;
361 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
365 case StmAreaNoNormal:
367 switch (apps_state) {
368 case StmLayoutNoMapNml:
371 case StmLayoutNoSplNml:
372 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapSpl;
373 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
376 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapNml;
377 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
380 case StmAreaNoSplitMain:
382 switch (apps_state) {
383 case StmLayoutNoSplNml:
384 case StmLayoutNoSplSpl:
385 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
386 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
395 case StmCtgNoGeneral:
397 case StmAreaNoNormal:
399 switch (apps_state) {
400 case StmLayoutNoMapFll:
404 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoGenNml;
405 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
416 case StmAreaNoNormal:
418 switch (apps_state) {
419 case StmLayoutNoMapFll:
423 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSysNml;
424 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
433 case StmCtgNoSplitable:
435 case StmAreaNoNormal:
437 switch (apps_state) {
438 case StmLayoutNoMapNml:
439 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapSpl;
440 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
442 case StmLayoutNoMapFll:
443 case StmLayoutNoSplNml:
447 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplNml;
448 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
452 case StmAreaNoSplitMain:
454 switch (apps_state) {
455 case StmLayoutNoSplNml:
456 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
457 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
459 case StmLayoutNoSplSpl:
460 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
461 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
468 case StmAreaNoSplitSub:
470 switch (apps_state) {
471 case StmLayoutNoMapNml:
472 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapSpl;
473 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
475 case StmLayoutNoMapSpl:
476 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapSpl;
477 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
479 case StmLayoutNoSplNml:
480 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
481 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
483 case StmLayoutNoSplSpl:
484 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
485 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
503 else { // (StmRestrictionModeSttNoOn == restriction_mode_state)
504 switch (category_no) {
507 case StmAreaNoFullscreen:
508 case StmAreaNoNormal:
509 case StmAreaNoSplitMain:
511 switch (apps_state) {
512 case StmLayoutNoMapNml:
516 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMapNml;
517 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
524 case StmAreaNoNormal:
526 switch (apps_state) {
527 case StmLayoutNoMapFll:
531 g_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSysNml;
532 g_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
543 case StmEvtNoDeactivate:
544 switch (category_no) {
556 // Set restriction layer
557 if (StmCtgNoRestriction == category_no) {
558 if (StmEvtNoActivate == event_no) {
559 if (StmLightstatusBrakeSttNoOff == g_crr_state.car_element[StmCarElementNoLightstatusBrake].state) {
561 case StmAreaNoRestrictionNormal:
562 switch (restriction_state) {
563 case StmLayoutNoNone:
564 if (g_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml) {
565 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstNml;
566 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
568 else if (g_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl) {
569 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstSplSub;
570 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
578 case StmAreaNoRestrictionSplitMain:
579 switch (restriction_state) {
580 case StmLayoutNoNone:
581 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstSplMain;
582 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
589 case StmAreaNoRestrictionSplitSub:
590 switch (restriction_state) {
591 case StmLayoutNoNone:
592 if (g_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl) {
593 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstSplSub;
594 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
608 else if (StmEvtNoDeactivate == event_no) {
609 switch (restriction_state) {
610 case StmLayoutNoRstNml:
611 case StmLayoutNoRstSplMain:
612 case StmLayoutNoRstSplSub:
613 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoNone;
614 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
622 else if (g_crr_state.layer[StmLayerNoApps].changed) {
623 if (StmLightstatusBrakeSttNoOff == g_crr_state.car_element[StmCarElementNoLightstatusBrake].state) {
624 if (StmLayoutNoMapSpl == g_crr_state.layer[StmLayerNoApps].state) {
625 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstSplSub;
626 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
628 else if (StmLayoutNoSplNml == g_crr_state.layer[StmLayerNoApps].state) {
629 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoRstNml;
630 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
633 if (StmLayoutNoNone != g_crr_state.layer[StmLayerNoRestriction].state) {
634 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoNone;
635 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
640 if (StmLayoutNoNone != g_crr_state.layer[StmLayerNoRestriction].state) {
641 g_crr_state.layer[StmLayerNoRestriction].state = StmLayoutNoNone;
642 g_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
647 // Set on screen layer
648 if (StmCtgNoPopUp == category_no) {
649 if (StmEvtNoActivate == event_no) {
650 switch (on_screen_state) {
651 case StmLayoutNoNone:
652 g_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoPopUp;
653 g_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
660 else if (StmEvtNoDeactivate == event_no) {
661 switch (on_screen_state) {
662 case StmLayoutNoPopUp:
663 g_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoNone;
664 g_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
673 // Copy current state for return
674 memcpy(state, &g_crr_state, sizeof(g_crr_state));
676 if ((STM_FALSE == g_map_is_activated)
677 && (STM_TRUE == g_crr_state.layer[StmLayerNoApps].changed)
678 && ((StmLayoutNoMapNml == g_crr_state.layer[StmLayerNoApps].state)
679 || (StmLayoutNoMapSpl == g_crr_state.layer[StmLayerNoApps].state)
680 || (StmLayoutNoMapFll == g_crr_state.layer[StmLayerNoApps].state))) {
681 g_map_is_activated = STM_TRUE;
687 void stmUndoState() {
688 g_crr_state = g_prv_state;