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[] = {
53 const int gStmCategoryNo[] = {
55 STM_CTG_NO_HOMESCREEN,
60 STM_CTG_NO_SYSTEM_ALERT,
61 STM_CTG_NO_RESTRICTION,
65 const char* gStmAreaName[] = {
72 "restriction.split.main",
73 "restriction.split.sub",
76 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* gStmTransGearStateNo2Name[] = {
90 "trans_gear_not_neutral"
93 const char* gStmParkingBrakeStateNo2Name[] = {
98 const char* gStmAccelPedalStateNo2Name[] = {
103 const char* gStmCarStateNo2Name[] = {
108 const char* gStmLampStateNo2Name[] = {
113 const char* gStmLightstatusBrakeStateNo2Name[] = {
114 "lightstatus_brake_off",
115 "lightstatus_brake_on"
118 const char* gStmRestrictionModeStateNo2Name[] = {
119 "restriction_mode_off",
120 "restriction_mode_on"
123 const char* gStmLayoutNo2Name[] = {
135 "restriction.split.main",
136 "restriction.split.sub",
140 const char* gStmLayerName[] = {
148 stm_state_t g_crr_state;
149 stm_state_t g_prv_state;
150 int g_prv_restriction_state_car_stop = 0;
151 int g_prv_apps_state_car_stop = 0;
152 int g_map_is_activated = STM_FALSE;
154 void stmInitialize() {
155 // Initialize previous state
156 memset(&g_prv_state, 0, sizeof(g_prv_state));
158 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
159 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
160 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
161 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
162 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
163 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
164 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
165 g_prv_state.car.state = gStmCarStateNoStop;
166 g_prv_state.lamp.state = gStmLampStateNoOff;
167 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
168 g_prv_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
170 // Initialize current state
171 g_crr_state = g_prv_state;
174 int stmTransitionState(int event, stm_state_t* state) {
175 int event_no, category_no, area_no;
176 int restriction_state, apps_state;
177 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
179 event_no = event & STM_MSK_EVT_NO;
180 category_no = event & STM_MSK_CTG_NO;
181 area_no = event & STM_MSK_ARA_NO;
183 // Backup previous state
184 g_prv_state = g_crr_state;
186 // Get previous state
187 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
188 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
189 trans_gear_state = g_prv_state.trans_gear.state;
190 parking_brake_state = g_prv_state.parking_brake.state;
191 accel_pedal_state = g_prv_state.accel_pedal.state;
192 car_state = g_prv_state.car.state;
193 lamp_state = g_prv_state.lamp.state;
194 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
195 restriction_mode_state = g_prv_state.restriction_mode.state;
198 g_crr_state.layer[gStmLayerNoOnScreen].is_changed = STM_FALSE;
199 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_FALSE;
200 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_FALSE;
201 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_FALSE;
202 g_crr_state.trans_gear.is_changed = STM_FALSE;
203 g_crr_state.parking_brake.is_changed = STM_FALSE;
204 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
205 g_crr_state.accel_pedal.is_changed = STM_FALSE;
206 g_crr_state.car.is_changed = STM_FALSE;
207 g_crr_state.lamp.is_changed = STM_FALSE;
208 g_crr_state.restriction_mode.is_changed = STM_FALSE;
213 case STM_EVT_NO_TRANS_GEAR_N:
214 if (gStmTransGearStateNoN != trans_gear_state) {
215 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
216 g_crr_state.trans_gear.is_changed = STM_TRUE;
219 case STM_EVT_NO_TRANS_GEAR_NOT_N:
220 if (gStmTransGearStateNoNotN != trans_gear_state) {
221 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
222 g_crr_state.trans_gear.is_changed = STM_TRUE;
225 case STM_EVT_NO_PARKING_BRAKE_OFF:
226 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
227 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
228 g_crr_state.parking_brake.is_changed = STM_TRUE;
231 case STM_EVT_NO_PARKING_BRAKE_ON:
232 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
233 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
234 g_crr_state.parking_brake.is_changed = STM_TRUE;
237 case STM_EVT_NO_ACCEL_PEDAL_OFF:
238 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
239 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
240 g_crr_state.accel_pedal.is_changed = STM_TRUE;
243 case STM_EVT_NO_ACCEL_PEDAL_ON:
244 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
245 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
246 g_crr_state.accel_pedal.is_changed = STM_TRUE;
249 case STM_EVT_NO_LAMP_OFF:
250 if (gStmLampStateNoOff != lamp_state) {
251 g_crr_state.lamp.state = gStmLampStateNoOff;
252 g_crr_state.lamp.is_changed = STM_TRUE;
255 case STM_EVT_NO_LAMP_ON:
256 if (gStmLampStateNoOn != lamp_state) {
257 g_crr_state.lamp.state = gStmLampStateNoOn;
258 g_crr_state.lamp.is_changed = STM_TRUE;
261 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
262 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
263 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
264 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
267 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
268 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
269 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
270 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
279 if (g_crr_state.lightstatus_brake.is_changed
280 || g_crr_state.accel_pedal.is_changed) {
281 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
282 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
284 if (g_crr_state.parking_brake.is_changed
285 || g_crr_state.trans_gear.is_changed) {
286 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
287 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
289 if (gStmCarStateNoRun != car_state) {
290 // Car state is changed stop -> run
291 g_crr_state.car.state = gStmCarStateNoRun;
292 g_crr_state.car.is_changed = STM_TRUE;
296 if (gStmCarStateNoStop != car_state) {
297 // Car state is changed run -> stop
298 g_crr_state.car.state = gStmCarStateNoStop;
299 g_crr_state.car.is_changed = STM_TRUE;
304 // Set restriction mode
305 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
306 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
307 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
309 // Restriction mode is changed OFF -> ON
310 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOn;
311 g_crr_state.restriction_mode.is_changed = STM_TRUE;
313 // Update restriction layer
314 g_prv_restriction_state_car_stop = restriction_state;
315 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
316 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
319 g_prv_apps_state_car_stop = apps_state;
320 if ((STM_TRUE == g_map_is_activated)
321 && (gStmLayoutNoSystem != apps_state)) {
322 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
323 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
326 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
327 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
328 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
330 // Restriction mode is changed ON -> OFF
331 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
332 g_crr_state.restriction_mode.is_changed = STM_TRUE;
334 // Update restriction layer
335 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
336 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
339 if (STM_TRUE == g_map_is_activated) {
340 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
341 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
345 // Set apps/homescreen layer
347 case STM_EVT_NO_ACTIVATE:
348 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
349 switch (category_no) {
350 case STM_CTG_NO_HOMESCREEN:
352 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
353 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
356 if (gStmLayoutNoNone != apps_state) {
357 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
358 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
363 case STM_ARA_NO_FULL:
365 switch (apps_state) {
370 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
371 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
375 case STM_ARA_NO_NORMAL:
377 switch (apps_state) {
382 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
383 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
386 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
387 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
390 case STM_ARA_NO_SPLIT_MAIN:
392 switch (apps_state) {
395 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
396 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
405 case STM_CTG_NO_GENERAL:
407 case STM_ARA_NO_NORMAL:
409 switch (apps_state) {
414 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
415 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
424 case STM_CTG_NO_SYSTEM:
426 case STM_ARA_NO_NORMAL:
428 switch (apps_state) {
433 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
434 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
443 case STM_CTG_NO_SPLITABLE:
445 case STM_ARA_NO_NORMAL:
447 switch (apps_state) {
449 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
450 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
457 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
458 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
462 case STM_ARA_NO_SPLIT_MAIN:
464 switch (apps_state) {
466 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
467 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
470 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
471 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
478 case STM_ARA_NO_SPLIT_SUB:
480 switch (apps_state) {
482 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
483 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
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 = gStmLayoutNoS2;
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;
513 else { // (gStmRestrictionModeStateNoOn == restriction_mode_state)
514 switch (category_no) {
517 case STM_ARA_NO_FULL:
518 case STM_ARA_NO_NORMAL:
519 case STM_ARA_NO_SPLIT_MAIN:
521 switch (apps_state) {
526 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
527 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
532 case STM_CTG_NO_SYSTEM:
534 case STM_ARA_NO_NORMAL:
536 switch (apps_state) {
541 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoSystem;
542 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
553 case STM_EVT_NO_DEACTIVATE:
554 switch (category_no) {
566 // Set restriction layer
567 if (STM_CTG_NO_RESTRICTION == category_no) {
568 if (STM_EVT_NO_ACTIVATE == event_no) {
569 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
571 case STM_ARA_NO_RESTRICTION_NORMAL:
572 switch (restriction_state) {
573 case gStmLayoutNoNone:
574 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
575 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
576 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
584 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
585 switch (restriction_state) {
586 case gStmLayoutNoNone:
587 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
588 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
595 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
596 switch (restriction_state) {
597 case gStmLayoutNoNone:
598 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
599 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
600 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
614 else if (STM_EVT_NO_DEACTIVATE == event_no) {
615 switch (restriction_state) {
616 case gStmLayoutNoRestriction:
617 case gStmLayoutNoRestrictionSplitMain:
618 case gStmLayoutNoRestrictionSplitSub:
619 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
620 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
628 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
629 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
630 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
631 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
632 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
634 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
635 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
636 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
639 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
640 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
641 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
646 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
647 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
648 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
653 // Copy current state for return
654 memcpy(state, &g_crr_state, sizeof(g_crr_state));
656 if ((STM_FALSE == g_map_is_activated)
657 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
658 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
659 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
660 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
661 g_map_is_activated = STM_TRUE;
667 void stmUndoState() {
668 g_crr_state = g_prv_state;