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* gStmCarStateNo2Name[] = {
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 stm_state_t g_crr_state;
153 stm_state_t g_prv_state;
154 int g_prv_restriction_state_car_stop = 0;
155 int g_prv_apps_state_car_stop = 0;
156 int g_map_is_activated = STM_FALSE;
158 void stmInitialize() {
159 // Initialize previous state
160 memset(&g_prv_state, 0, sizeof(g_prv_state));
162 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
163 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
164 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
165 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
166 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
167 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
168 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
169 g_prv_state.car.state = gStmCarStateNoStop;
170 g_prv_state.lamp.state = gStmLampStateNoOff;
171 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
172 g_prv_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
174 // Initialize current state
175 g_crr_state = g_prv_state;
178 int stmTransitionState(int event, stm_state_t* state) {
179 int event_no, category_no, area_no;
180 int restriction_state, apps_state;
181 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
183 event_no = event & STM_MSK_EVT_NO;
184 category_no = event & STM_MSK_CTG_NO;
185 area_no = event & STM_MSK_ARA_NO;
187 // Backup previous state
188 g_prv_state = g_crr_state;
190 // Get previous state
191 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
192 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
193 trans_gear_state = g_prv_state.trans_gear.state;
194 parking_brake_state = g_prv_state.parking_brake.state;
195 accel_pedal_state = g_prv_state.accel_pedal.state;
196 car_state = g_prv_state.car.state;
197 lamp_state = g_prv_state.lamp.state;
198 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
199 restriction_mode_state = g_prv_state.restriction_mode.state;
202 g_crr_state.layer[gStmLayerNoOnScreen].is_changed = STM_FALSE;
203 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_FALSE;
204 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_FALSE;
205 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_FALSE;
206 g_crr_state.trans_gear.is_changed = STM_FALSE;
207 g_crr_state.parking_brake.is_changed = STM_FALSE;
208 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
209 g_crr_state.accel_pedal.is_changed = STM_FALSE;
210 g_crr_state.car.is_changed = STM_FALSE;
211 g_crr_state.lamp.is_changed = STM_FALSE;
212 g_crr_state.restriction_mode.is_changed = STM_FALSE;
217 case STM_EVT_NO_TRANS_GEAR_N:
218 if (gStmTransGearStateNoN != trans_gear_state) {
219 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
220 g_crr_state.trans_gear.is_changed = STM_TRUE;
223 case STM_EVT_NO_TRANS_GEAR_NOT_N:
224 if (gStmTransGearStateNoNotN != trans_gear_state) {
225 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
226 g_crr_state.trans_gear.is_changed = STM_TRUE;
229 case STM_EVT_NO_PARKING_BRAKE_OFF:
230 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
231 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
232 g_crr_state.parking_brake.is_changed = STM_TRUE;
235 case STM_EVT_NO_PARKING_BRAKE_ON:
236 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
237 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
238 g_crr_state.parking_brake.is_changed = STM_TRUE;
241 case STM_EVT_NO_ACCEL_PEDAL_OFF:
242 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
243 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
244 g_crr_state.accel_pedal.is_changed = STM_TRUE;
247 case STM_EVT_NO_ACCEL_PEDAL_ON:
248 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
249 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
250 g_crr_state.accel_pedal.is_changed = STM_TRUE;
253 case STM_EVT_NO_LAMP_OFF:
254 if (gStmLampStateNoOff != lamp_state) {
255 g_crr_state.lamp.state = gStmLampStateNoOff;
256 g_crr_state.lamp.is_changed = STM_TRUE;
259 case STM_EVT_NO_LAMP_ON:
260 if (gStmLampStateNoOn != lamp_state) {
261 g_crr_state.lamp.state = gStmLampStateNoOn;
262 g_crr_state.lamp.is_changed = STM_TRUE;
265 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
266 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
267 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
268 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
271 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
272 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
273 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
274 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
283 if (g_crr_state.lightstatus_brake.is_changed
284 || g_crr_state.accel_pedal.is_changed) {
285 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
286 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
288 if (g_crr_state.parking_brake.is_changed
289 || g_crr_state.trans_gear.is_changed) {
290 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
291 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
293 if (gStmCarStateNoRun != car_state) {
294 // Car state is changed stop -> run
295 g_crr_state.car.state = gStmCarStateNoRun;
296 g_crr_state.car.is_changed = STM_TRUE;
300 if (gStmCarStateNoStop != car_state) {
301 // Car state is changed run -> stop
302 g_crr_state.car.state = gStmCarStateNoStop;
303 g_crr_state.car.is_changed = STM_TRUE;
308 // Set restriction mode
309 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
310 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
311 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
313 // Restriction mode is changed OFF -> ON
314 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOn;
315 g_crr_state.restriction_mode.is_changed = STM_TRUE;
317 // Update restriction layer
318 g_prv_restriction_state_car_stop = restriction_state;
319 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
320 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
323 g_prv_apps_state_car_stop = apps_state;
324 if ((STM_TRUE == g_map_is_activated)
325 && (gStmLayoutNoSystem != apps_state)) {
326 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
327 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
330 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
331 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
332 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
334 // Restriction mode is changed ON -> OFF
335 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
336 g_crr_state.restriction_mode.is_changed = STM_TRUE;
338 // Update restriction layer
339 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
340 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
343 if (STM_TRUE == g_map_is_activated) {
344 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
345 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
349 // Set apps/homescreen layer
351 case STM_EVT_NO_ACTIVATE:
352 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
353 switch (category_no) {
354 case STM_CTG_NO_HOMESCREEN:
356 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
357 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
360 if (gStmLayoutNoNone != apps_state) {
361 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
362 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
367 case STM_ARA_NO_FULL:
369 switch (apps_state) {
374 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
375 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
379 case STM_ARA_NO_NORMAL:
381 switch (apps_state) {
386 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
387 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
390 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
391 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
394 case STM_ARA_NO_SPLIT_MAIN:
396 switch (apps_state) {
399 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
400 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
409 case STM_CTG_NO_GENERAL:
411 case STM_ARA_NO_NORMAL:
413 switch (apps_state) {
418 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
419 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
428 case STM_CTG_NO_SYSTEM:
430 case STM_ARA_NO_NORMAL:
432 switch (apps_state) {
437 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
438 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
447 case STM_CTG_NO_SPLITABLE:
449 case STM_ARA_NO_NORMAL:
451 switch (apps_state) {
453 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
454 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
461 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
462 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
466 case STM_ARA_NO_SPLIT_MAIN:
468 switch (apps_state) {
470 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
471 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
474 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
475 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
482 case STM_ARA_NO_SPLIT_SUB:
484 switch (apps_state) {
486 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
487 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
490 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
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;
498 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
499 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
517 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
518 switch (category_no) {
521 case STM_ARA_NO_FULL:
522 case STM_ARA_NO_NORMAL:
523 case STM_ARA_NO_SPLIT_MAIN:
525 switch (apps_state) {
530 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
531 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
536 case STM_CTG_NO_SYSTEM:
538 case STM_ARA_NO_NORMAL:
540 switch (apps_state) {
545 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
546 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
557 case STM_EVT_NO_DEACTIVATE:
558 switch (category_no) {
570 // Set restriction layer
571 if (STM_CTG_NO_RESTRICTION == category_no) {
572 if (STM_EVT_NO_ACTIVATE == event_no) {
573 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
575 case STM_ARA_NO_RESTRICTION_NORMAL:
576 switch (restriction_state) {
577 case gStmLayoutNoNone:
578 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
579 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
580 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
588 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
589 switch (restriction_state) {
590 case gStmLayoutNoNone:
591 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
592 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
599 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
600 switch (restriction_state) {
601 case gStmLayoutNoNone:
602 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
603 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
604 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
618 else if (STM_EVT_NO_DEACTIVATE == event_no) {
619 switch (restriction_state) {
620 case gStmLayoutNoRestriction:
621 case gStmLayoutNoRestrictionSplitMain:
622 case gStmLayoutNoRestrictionSplitSub:
623 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
624 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
632 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
633 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
634 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
635 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
636 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
638 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
639 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
640 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
643 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
644 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
645 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
650 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
651 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
652 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
657 // Copy current state for return
658 memcpy(state, &g_crr_state, sizeof(g_crr_state));
660 if ((STM_FALSE == g_map_is_activated)
661 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
662 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
663 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
664 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
665 g_map_is_activated = STM_TRUE;
671 void stmUndoState() {
672 g_crr_state = g_prv_state;