5 const char* gStmEventName[] = {
9 "trans_gear_not_neutral",
17 "lightstatus_brake_off",
18 "lightstatus_brake_on",
19 "restriction_mode_off",
20 "restriction_mode_on",
23 const int gStmEventNo[] = {
25 STM_EVT_NO_DEACTIVATE,
26 STM_EVT_NO_TRANS_GEAR_N,
27 STM_EVT_NO_TRANS_GEAR_NOT_N,
28 STM_EVT_NO_PARKING_BRAKE_OFF,
29 STM_EVT_NO_PARKING_BRAKE_ON,
30 STM_EVT_NO_ACCEL_PEDAL_OFF,
31 STM_EVT_NO_ACCEL_PEDAL_ON,
32 STM_EVT_NO_TIMER_EXPIRED,
35 STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF,
36 STM_EVT_NO_LIGHTSTATUS_BRAKE_ON,
37 STM_EVT_NO_RESTRICTION_MODE_OFF,
38 STM_EVT_NO_RESTRICTION_MODE_ON,
41 const char* gStmCategoryName[] = {
52 const int gStmCategoryNo[] = {
53 STM_CTG_NO_HOMESCREEN,
58 STM_CTG_NO_SYSTEM_ALERT,
59 STM_CTG_NO_RESTRICTION,
63 const char* gStmAreaName[] = {
71 "restriction.split.main",
72 "restriction.split.sub",
75 const int gStmAreaNo[] = {
79 STM_ARA_NO_SPLIT_MAIN,
82 STM_ARA_NO_RESTRICTION_NORMAL,
83 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
84 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
88 const char* gStmTransGearStateName[] = {
93 const char* gStmParkingBrakeStateName[] = {
98 const char* gStmAccelPedalStateName[] = {
103 const char* gStmRunningStateNo2Name[] = {
108 const char* gStmLampStateName[] = {
113 const char* gStmLightstatusBrakeStateName[] = {
118 const char* gStmRestrictionModeStateName[] = {
123 const char* gStmLayoutName[] = {
135 "restriction.split.main",
136 "restriction.split.sub",
140 const char* gStmLayerName[] = {
147 const char* gStmCarElementName[] = {
157 const char** gStmCarStateNameList[] = {
158 gStmTransGearStateName,
159 gStmParkingBrakeStateName,
160 gStmAccelPedalStateName,
161 gStmRunningStateNo2Name,
163 gStmLightstatusBrakeStateName,
164 gStmRestrictionModeStateName,
167 stm_state_t g_crr_state;
168 stm_state_t g_prv_state;
169 int g_prv_on_screen_state_car_stop = 0;
170 int g_prv_restriction_state_car_stop = 0;
171 int g_prv_apps_state_car_stop = 0;
172 int g_map_is_activated = STM_FALSE;
174 void stmInitialize() {
175 // Initialize previous state
176 memset(&g_prv_state, 0, sizeof(g_prv_state));
178 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
179 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
180 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
181 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
182 g_prv_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
183 g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
184 g_prv_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
185 g_prv_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
186 g_prv_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
187 g_prv_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
188 g_prv_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
190 // Initialize current state
191 g_crr_state = g_prv_state;
194 int stmTransitionState(int event, stm_state_t* state) {
195 int event_no, category_no, area_no;
196 int on_screen_state, restriction_state, apps_state;
197 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
199 event_no = event & STM_MSK_EVT_NO;
200 category_no = event & STM_MSK_CTG_NO;
201 area_no = event & STM_MSK_ARA_NO;
203 // Backup previous state
204 g_prv_state = g_crr_state;
206 // Get previous state
207 on_screen_state = g_prv_state.layer[gStmLayerNoOnScreen].state;
208 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
209 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
210 trans_gear_state = g_prv_state.car_element[gStmCarElementNoTransGear].state;
211 parking_brake_state = g_prv_state.car_element[gStmCarElementNoParkingBrake].state;
212 accel_pedal_state = g_prv_state.car_element[gStmCarElementNoAccelPedal].state;
213 car_state = g_prv_state.car_element[gStmCarElementNoRunning].state;
214 lamp_state = g_prv_state.car_element[gStmCarElementNoLamp].state;
215 lightstatus_brake_state = g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state;
216 restriction_mode_state = g_prv_state.car_element[gStmCarElementNoRestrictionMode].state;
219 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_FALSE;
220 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_FALSE;
221 g_crr_state.layer[gStmLayerNoApps].changed = STM_FALSE;
222 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_FALSE;
223 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_FALSE;
224 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_FALSE;
225 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_FALSE;
226 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_FALSE;
227 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_FALSE;
228 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_FALSE;
229 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_FALSE;
234 case STM_EVT_NO_TRANS_GEAR_N:
235 if (gStmTransGearStateNoN != trans_gear_state) {
236 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
237 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
240 case STM_EVT_NO_TRANS_GEAR_NOT_N:
241 if (gStmTransGearStateNoNotN != trans_gear_state) {
242 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoNotN;
243 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
246 case STM_EVT_NO_PARKING_BRAKE_OFF:
247 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
248 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOff;
249 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
252 case STM_EVT_NO_PARKING_BRAKE_ON:
253 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
254 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
255 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
258 case STM_EVT_NO_ACCEL_PEDAL_OFF:
259 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
260 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
261 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
264 case STM_EVT_NO_ACCEL_PEDAL_ON:
265 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
266 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOn;
267 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
270 case STM_EVT_NO_LAMP_OFF:
271 if (gStmLampStateNoOff != lamp_state) {
272 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
273 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
276 case STM_EVT_NO_LAMP_ON:
277 if (gStmLampStateNoOn != lamp_state) {
278 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOn;
279 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
282 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
283 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
284 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOff;
285 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
288 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
289 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
290 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
291 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
300 if (g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed
301 || g_crr_state.car_element[gStmCarElementNoAccelPedal].changed) {
302 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state)
303 && (gStmAccelPedalStateNoOn == g_crr_state.car_element[gStmCarElementNoAccelPedal].state)){
305 if (g_crr_state.car_element[gStmCarElementNoParkingBrake].changed
306 || g_crr_state.car_element[gStmCarElementNoTransGear].changed) {
307 if ((gStmParkingBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoParkingBrake].state)
308 && (gStmTransGearStateNoNotN == g_crr_state.car_element[gStmCarElementNoTransGear].state)){
310 if (gStmRunningNoRun != car_state) {
311 // Car state is changed stop -> run
312 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoRun;
313 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
317 if (gStmRunningNoStop != car_state) {
318 // Car state is changed run -> stop
319 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
320 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
325 // Set restriction mode
326 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
327 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
328 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
330 // Restriction mode is changed OFF -> ON
331 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOn;
332 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
334 // Update on screen layer
335 g_prv_on_screen_state_car_stop = on_screen_state;
336 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
337 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
339 // Update restriction layer
340 g_prv_restriction_state_car_stop = restriction_state;
341 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
342 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
345 g_prv_apps_state_car_stop = apps_state;
346 if ((STM_TRUE == g_map_is_activated)
347 && (gStmLayoutNoSystem != apps_state)) {
348 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
349 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
352 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
353 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
354 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
356 // Restriction mode is changed ON -> OFF
357 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
358 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
360 // Update on screen layer
361 g_crr_state.layer[gStmLayerNoOnScreen].state = g_prv_on_screen_state_car_stop;
362 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
364 // Update restriction layer
365 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
366 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
369 if (STM_TRUE == g_map_is_activated) {
370 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
371 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
375 // Set apps/homescreen layer
377 case STM_EVT_NO_ACTIVATE:
378 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
379 switch (category_no) {
380 case STM_CTG_NO_HOMESCREEN:
382 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
383 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_TRUE;
386 if (gStmLayoutNoNone != apps_state) {
387 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
388 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
393 case STM_ARA_NO_FULL:
395 switch (apps_state) {
400 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
401 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
405 case STM_ARA_NO_NORMAL:
407 switch (apps_state) {
412 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
413 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
416 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
417 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
420 case STM_ARA_NO_SPLIT_MAIN:
422 switch (apps_state) {
425 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
426 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
435 case STM_CTG_NO_GENERAL:
437 case STM_ARA_NO_NORMAL:
439 switch (apps_state) {
444 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
445 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
454 case STM_CTG_NO_SYSTEM:
456 case STM_ARA_NO_NORMAL:
458 switch (apps_state) {
463 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
464 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
473 case STM_CTG_NO_SPLITABLE:
475 case STM_ARA_NO_NORMAL:
477 switch (apps_state) {
479 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
480 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
487 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
488 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
492 case STM_ARA_NO_SPLIT_MAIN:
494 switch (apps_state) {
496 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
497 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
500 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
501 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
508 case STM_ARA_NO_SPLIT_SUB:
510 switch (apps_state) {
512 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
513 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
516 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
517 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
520 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
521 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
524 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
525 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
543 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
544 switch (category_no) {
547 case STM_ARA_NO_FULL:
548 case STM_ARA_NO_NORMAL:
549 case STM_ARA_NO_SPLIT_MAIN:
551 switch (apps_state) {
556 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
557 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
562 case STM_CTG_NO_SYSTEM:
564 case STM_ARA_NO_NORMAL:
566 switch (apps_state) {
571 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
572 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
583 case STM_EVT_NO_DEACTIVATE:
584 switch (category_no) {
596 // Set restriction layer
597 if (STM_CTG_NO_RESTRICTION == category_no) {
598 if (STM_EVT_NO_ACTIVATE == event_no) {
599 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
601 case STM_ARA_NO_RESTRICTION_NORMAL:
602 switch (restriction_state) {
603 case gStmLayoutNoNone:
604 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
605 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
606 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
614 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
615 switch (restriction_state) {
616 case gStmLayoutNoNone:
617 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
618 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
625 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
626 switch (restriction_state) {
627 case gStmLayoutNoNone:
628 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
629 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
630 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
644 else if (STM_EVT_NO_DEACTIVATE == event_no) {
645 switch (restriction_state) {
646 case gStmLayoutNoRestriction:
647 case gStmLayoutNoRestrictionSplitMain:
648 case gStmLayoutNoRestrictionSplitSub:
649 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
650 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
658 else if (g_crr_state.layer[gStmLayerNoApps].changed) {
659 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
660 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
661 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
662 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
664 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
665 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
666 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
669 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
670 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
671 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
676 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
677 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
678 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
683 // Set on screen layer
684 if (STM_CTG_NO_POPUP == category_no) {
685 if (STM_EVT_NO_ACTIVATE == event_no) {
686 switch (on_screen_state) {
687 case gStmLayoutNoNone:
688 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoPu;
689 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
696 else if (STM_EVT_NO_DEACTIVATE == event_no) {
697 switch (on_screen_state) {
699 g_crr_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
700 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_TRUE;
709 // Copy current state for return
710 memcpy(state, &g_crr_state, sizeof(g_crr_state));
712 if ((STM_FALSE == g_map_is_activated)
713 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].changed)
714 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
715 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
716 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
717 g_map_is_activated = STM_TRUE;
723 void stmUndoState() {
724 g_crr_state = g_prv_state;