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_restriction_state_car_stop = 0;
170 int g_prv_apps_state_car_stop = 0;
171 int g_map_is_activated = STM_FALSE;
173 void stmInitialize() {
174 // Initialize previous state
175 memset(&g_prv_state, 0, sizeof(g_prv_state));
177 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
178 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
179 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
180 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
181 g_prv_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
182 g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
183 g_prv_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
184 g_prv_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
185 g_prv_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
186 g_prv_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
187 g_prv_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
189 // Initialize current state
190 g_crr_state = g_prv_state;
193 int stmTransitionState(int event, stm_state_t* state) {
194 int event_no, category_no, area_no;
195 int restriction_state, apps_state;
196 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
198 event_no = event & STM_MSK_EVT_NO;
199 category_no = event & STM_MSK_CTG_NO;
200 area_no = event & STM_MSK_ARA_NO;
202 // Backup previous state
203 g_prv_state = g_crr_state;
205 // Get previous state
206 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
207 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
208 trans_gear_state = g_prv_state.car_element[gStmCarElementNoTransGear].state;
209 parking_brake_state = g_prv_state.car_element[gStmCarElementNoParkingBrake].state;
210 accel_pedal_state = g_prv_state.car_element[gStmCarElementNoAccelPedal].state;
211 car_state = g_prv_state.car_element[gStmCarElementNoRunning].state;
212 lamp_state = g_prv_state.car_element[gStmCarElementNoLamp].state;
213 lightstatus_brake_state = g_prv_state.car_element[gStmCarElementNoLightstatusBrake].state;
214 restriction_mode_state = g_prv_state.car_element[gStmCarElementNoRestrictionMode].state;
217 g_crr_state.layer[gStmLayerNoOnScreen].changed = STM_FALSE;
218 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_FALSE;
219 g_crr_state.layer[gStmLayerNoApps].changed = STM_FALSE;
220 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_FALSE;
221 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_FALSE;
222 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_FALSE;
223 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_FALSE;
224 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_FALSE;
225 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_FALSE;
226 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_FALSE;
227 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_FALSE;
232 case STM_EVT_NO_TRANS_GEAR_N:
233 if (gStmTransGearStateNoN != trans_gear_state) {
234 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoN;
235 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
238 case STM_EVT_NO_TRANS_GEAR_NOT_N:
239 if (gStmTransGearStateNoNotN != trans_gear_state) {
240 g_crr_state.car_element[gStmCarElementNoTransGear].state = gStmTransGearStateNoNotN;
241 g_crr_state.car_element[gStmCarElementNoTransGear].changed = STM_TRUE;
244 case STM_EVT_NO_PARKING_BRAKE_OFF:
245 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
246 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOff;
247 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
250 case STM_EVT_NO_PARKING_BRAKE_ON:
251 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
252 g_crr_state.car_element[gStmCarElementNoParkingBrake].state = gStmParkingBrakeStateNoOn;
253 g_crr_state.car_element[gStmCarElementNoParkingBrake].changed = STM_TRUE;
256 case STM_EVT_NO_ACCEL_PEDAL_OFF:
257 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
258 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOff;
259 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
262 case STM_EVT_NO_ACCEL_PEDAL_ON:
263 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
264 g_crr_state.car_element[gStmCarElementNoAccelPedal].state = gStmAccelPedalStateNoOn;
265 g_crr_state.car_element[gStmCarElementNoAccelPedal].changed = STM_TRUE;
268 case STM_EVT_NO_LAMP_OFF:
269 if (gStmLampStateNoOff != lamp_state) {
270 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOff;
271 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
274 case STM_EVT_NO_LAMP_ON:
275 if (gStmLampStateNoOn != lamp_state) {
276 g_crr_state.car_element[gStmCarElementNoLamp].state = gStmLampStateNoOn;
277 g_crr_state.car_element[gStmCarElementNoLamp].changed = STM_TRUE;
280 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
281 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
282 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOff;
283 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
286 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
287 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
288 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state = gStmLightstatusBrakeStateNoOn;
289 g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed = STM_TRUE;
298 if (g_crr_state.car_element[gStmCarElementNoLightstatusBrake].changed
299 || g_crr_state.car_element[gStmCarElementNoAccelPedal].changed) {
300 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state)
301 && (gStmAccelPedalStateNoOn == g_crr_state.car_element[gStmCarElementNoAccelPedal].state)){
303 if (g_crr_state.car_element[gStmCarElementNoParkingBrake].changed
304 || g_crr_state.car_element[gStmCarElementNoTransGear].changed) {
305 if ((gStmParkingBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoParkingBrake].state)
306 && (gStmTransGearStateNoNotN == g_crr_state.car_element[gStmCarElementNoTransGear].state)){
308 if (gStmRunningNoRun != car_state) {
309 // Car state is changed stop -> run
310 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoRun;
311 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
315 if (gStmRunningNoStop != car_state) {
316 // Car state is changed run -> stop
317 g_crr_state.car_element[gStmCarElementNoRunning].state = gStmRunningNoStop;
318 g_crr_state.car_element[gStmCarElementNoRunning].changed = STM_TRUE;
323 // Set restriction mode
324 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
325 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
326 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
328 // Restriction mode is changed OFF -> ON
329 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOn;
330 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
332 // Update restriction layer
333 g_prv_restriction_state_car_stop = restriction_state;
334 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
335 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
338 g_prv_apps_state_car_stop = apps_state;
339 if ((STM_TRUE == g_map_is_activated)
340 && (gStmLayoutNoSystem != apps_state)) {
341 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
342 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
345 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
346 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
347 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
349 // Restriction mode is changed ON -> OFF
350 g_crr_state.car_element[gStmCarElementNoRestrictionMode].state = gStmRestrictionModeStateNoOff;
351 g_crr_state.car_element[gStmCarElementNoRestrictionMode].changed = STM_TRUE;
353 // Update restriction layer
354 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
355 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
358 if (STM_TRUE == g_map_is_activated) {
359 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
360 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
364 // Set apps/homescreen layer
366 case STM_EVT_NO_ACTIVATE:
367 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
368 switch (category_no) {
369 case STM_CTG_NO_HOMESCREEN:
371 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
372 g_crr_state.layer[gStmLayerNoHomescreen].changed = STM_TRUE;
375 if (gStmLayoutNoNone != apps_state) {
376 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
377 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
382 case STM_ARA_NO_FULL:
384 switch (apps_state) {
389 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
390 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
394 case STM_ARA_NO_NORMAL:
396 switch (apps_state) {
401 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
402 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
405 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
406 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
409 case STM_ARA_NO_SPLIT_MAIN:
411 switch (apps_state) {
414 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
415 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
424 case STM_CTG_NO_GENERAL:
426 case STM_ARA_NO_NORMAL:
428 switch (apps_state) {
433 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
434 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
443 case STM_CTG_NO_SYSTEM:
445 case STM_ARA_NO_NORMAL:
447 switch (apps_state) {
452 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
453 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
462 case STM_CTG_NO_SPLITABLE:
464 case STM_ARA_NO_NORMAL:
466 switch (apps_state) {
468 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
469 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
476 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
477 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
481 case STM_ARA_NO_SPLIT_MAIN:
483 switch (apps_state) {
485 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
486 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
489 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
490 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
497 case STM_ARA_NO_SPLIT_SUB:
499 switch (apps_state) {
501 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
502 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
505 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
506 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
509 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
510 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
513 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
514 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
532 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
533 switch (category_no) {
536 case STM_ARA_NO_FULL:
537 case STM_ARA_NO_NORMAL:
538 case STM_ARA_NO_SPLIT_MAIN:
540 switch (apps_state) {
545 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
546 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
551 case STM_CTG_NO_SYSTEM:
553 case STM_ARA_NO_NORMAL:
555 switch (apps_state) {
560 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
561 g_crr_state.layer[gStmLayerNoApps].changed = STM_TRUE;
572 case STM_EVT_NO_DEACTIVATE:
573 switch (category_no) {
585 // Set restriction layer
586 if (STM_CTG_NO_RESTRICTION == category_no) {
587 if (STM_EVT_NO_ACTIVATE == event_no) {
588 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
590 case STM_ARA_NO_RESTRICTION_NORMAL:
591 switch (restriction_state) {
592 case gStmLayoutNoNone:
593 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
594 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
595 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
603 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
604 switch (restriction_state) {
605 case gStmLayoutNoNone:
606 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
607 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
614 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
615 switch (restriction_state) {
616 case gStmLayoutNoNone:
617 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
618 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
619 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
633 else if (STM_EVT_NO_DEACTIVATE == event_no) {
634 switch (restriction_state) {
635 case gStmLayoutNoRestriction:
636 case gStmLayoutNoRestrictionSplitMain:
637 case gStmLayoutNoRestrictionSplitSub:
638 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
639 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
647 else if (g_crr_state.layer[gStmLayerNoApps].changed) {
648 if (gStmLightstatusBrakeStateNoOff == g_crr_state.car_element[gStmCarElementNoLightstatusBrake].state) {
649 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
650 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
651 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
653 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
654 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
655 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
658 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
659 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
660 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
665 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
666 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
667 g_crr_state.layer[gStmLayerNoRestriction].changed = STM_TRUE;
672 // Copy current state for return
673 memcpy(state, &g_crr_state, sizeof(g_crr_state));
675 if ((STM_FALSE == g_map_is_activated)
676 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].changed)
677 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
678 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
679 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
680 g_map_is_activated = STM_TRUE;
686 void stmUndoState() {
687 g_crr_state = g_prv_state;