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[] = {
54 STM_CTG_NO_HOMESCREEN,
59 STM_CTG_NO_SYSTEM_ALERT,
60 STM_CTG_NO_RESTRICTION,
63 const char* gStmAreaName[] = {
70 "restriction.split.main",
71 "restriction.split.sub",
74 const int gStmAreaNo[] = {
77 STM_ARA_NO_SPLIT_MAIN,
80 STM_ARA_NO_RESTRICTION_NORMAL,
81 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
82 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
86 const char* gStmTransGearStateNo2Name[] = {
88 "trans_gear_not_neutral"
91 const char* gStmParkingBrakeStateNo2Name[] = {
96 const char* gStmAccelPedalStateNo2Name[] = {
101 const char* gStmCarStateNo2Name[] = {
106 const char* gStmLampStateNo2Name[] = {
111 const char* gStmLightstatusBrakeStateNo2Name[] = {
112 "lightstatus_brake_off",
113 "lightstatus_brake_on"
116 const char* gStmRestrictionModeStateNo2Name[] = {
117 "restriction_mode_off",
118 "restriction_mode_on"
121 const char* gStmLayoutNo2Name[] = {
133 "restriction.split.main",
134 "restriction.split.sub",
137 const char* gStmLayerName[] = {
145 stm_state_t g_crr_state;
146 stm_state_t g_prv_state;
147 int g_prv_restriction_state_car_stop = 0;
148 int g_prv_apps_state_car_stop = 0;
149 int g_map_is_activated = STM_FALSE;
151 void stmInitialize() {
152 // Initialize previous state
153 memset(&g_prv_state, 0, sizeof(g_prv_state));
155 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
156 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
157 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
158 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
159 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
160 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
161 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
162 g_prv_state.car.state = gStmCarStateNoStop;
163 g_prv_state.lamp.state = gStmLampStateNoOff;
164 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
165 g_prv_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
167 // Initialize current state
168 g_crr_state = g_prv_state;
171 int stmTransitionState(int event, stm_state_t* state) {
172 int event_no, category_no, area_no;
173 int restriction_state, apps_state;
174 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
176 event_no = event & STM_MSK_EVT_NO;
177 category_no = event & STM_MSK_CTG_NO;
178 area_no = event & STM_MSK_ARA_NO;
180 // Backup previous state
181 g_prv_state = g_crr_state;
183 // Get previous state
184 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
185 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
186 trans_gear_state = g_prv_state.trans_gear.state;
187 parking_brake_state = g_prv_state.parking_brake.state;
188 accel_pedal_state = g_prv_state.accel_pedal.state;
189 car_state = g_prv_state.car.state;
190 lamp_state = g_prv_state.lamp.state;
191 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
192 restriction_mode_state = g_prv_state.restriction_mode.state;
195 g_crr_state.layer[gStmLayerNoOnScreen].is_changed = STM_FALSE;
196 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_FALSE;
197 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_FALSE;
198 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_FALSE;
199 g_crr_state.trans_gear.is_changed = STM_FALSE;
200 g_crr_state.parking_brake.is_changed = STM_FALSE;
201 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
202 g_crr_state.accel_pedal.is_changed = STM_FALSE;
203 g_crr_state.car.is_changed = STM_FALSE;
204 g_crr_state.lamp.is_changed = STM_FALSE;
205 g_crr_state.restriction_mode.is_changed = STM_FALSE;
210 case STM_EVT_NO_TRANS_GEAR_N:
211 if (gStmTransGearStateNoN != trans_gear_state) {
212 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
213 g_crr_state.trans_gear.is_changed = STM_TRUE;
216 case STM_EVT_NO_TRANS_GEAR_NOT_N:
217 if (gStmTransGearStateNoNotN != trans_gear_state) {
218 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
219 g_crr_state.trans_gear.is_changed = STM_TRUE;
222 case STM_EVT_NO_PARKING_BRAKE_OFF:
223 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
224 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
225 g_crr_state.parking_brake.is_changed = STM_TRUE;
228 case STM_EVT_NO_PARKING_BRAKE_ON:
229 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
230 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
231 g_crr_state.parking_brake.is_changed = STM_TRUE;
234 case STM_EVT_NO_ACCEL_PEDAL_OFF:
235 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
236 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
237 g_crr_state.accel_pedal.is_changed = STM_TRUE;
240 case STM_EVT_NO_ACCEL_PEDAL_ON:
241 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
242 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
243 g_crr_state.accel_pedal.is_changed = STM_TRUE;
246 case STM_EVT_NO_LAMP_OFF:
247 if (gStmLampStateNoOff != lamp_state) {
248 g_crr_state.lamp.state = gStmLampStateNoOff;
249 g_crr_state.lamp.is_changed = STM_TRUE;
252 case STM_EVT_NO_LAMP_ON:
253 if (gStmLampStateNoOn != lamp_state) {
254 g_crr_state.lamp.state = gStmLampStateNoOn;
255 g_crr_state.lamp.is_changed = STM_TRUE;
258 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
259 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
260 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
261 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
264 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
265 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
266 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
267 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
276 if (g_crr_state.lightstatus_brake.is_changed
277 || g_crr_state.accel_pedal.is_changed) {
278 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
279 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
281 if (g_crr_state.parking_brake.is_changed
282 || g_crr_state.trans_gear.is_changed) {
283 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
284 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
286 if (gStmCarStateNoRun != car_state) {
287 // Car state is changed stop -> run
288 g_crr_state.car.state = gStmCarStateNoRun;
289 g_crr_state.car.is_changed = STM_TRUE;
293 if (gStmCarStateNoStop != car_state) {
294 // Car state is changed run -> stop
295 g_crr_state.car.state = gStmCarStateNoStop;
296 g_crr_state.car.is_changed = STM_TRUE;
301 // Set restriction mode
302 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
303 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
304 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
306 // Restriction mode is changed OFF -> ON
307 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOn;
308 g_crr_state.restriction_mode.is_changed = STM_TRUE;
310 // Update restriction layer
311 g_prv_restriction_state_car_stop = restriction_state;
312 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
313 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
316 g_prv_apps_state_car_stop = apps_state;
317 if (STM_TRUE == g_map_is_activated) {
318 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
319 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
322 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
323 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
324 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
326 // Restriction mode is changed ON -> OFF
327 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
328 g_crr_state.restriction_mode.is_changed = STM_TRUE;
330 // Update restriction layer
331 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
332 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
335 if (STM_TRUE == g_map_is_activated) {
336 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
337 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
341 // Set apps/homescreen layer
343 case STM_EVT_NO_ACTIVATE:
344 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
345 switch (category_no) {
346 case STM_CTG_NO_HOMESCREEN:
348 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
349 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
352 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
353 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
357 case STM_ARA_NO_FULL:
359 switch (apps_state) {
364 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
365 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
369 case STM_ARA_NO_NORMAL:
371 switch (apps_state) {
376 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
377 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
380 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
381 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
384 case STM_ARA_NO_SPLIT_MAIN:
386 switch (apps_state) {
389 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
390 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
399 case STM_CTG_NO_GENERAL:
401 case STM_ARA_NO_NORMAL:
403 switch (apps_state) {
408 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
409 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
418 case STM_CTG_NO_SPLITABLE:
420 case STM_ARA_NO_NORMAL:
422 switch (apps_state) {
424 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
425 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
432 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
433 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
437 case STM_ARA_NO_SPLIT_MAIN:
439 switch (apps_state) {
441 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
442 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
445 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
446 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
453 case STM_ARA_NO_SPLIT_SUB:
455 switch (apps_state) {
457 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
458 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
461 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
462 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
465 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
466 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
469 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
470 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
488 case STM_EVT_NO_DEACTIVATE:
489 switch (category_no) {
501 // Set restriction layer
502 if (STM_CTG_NO_RESTRICTION == category_no) {
503 if (STM_EVT_NO_ACTIVATE == event_no) {
504 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
506 case STM_ARA_NO_RESTRICTION_NORMAL:
507 switch (restriction_state) {
508 case gStmLayoutNoNone:
509 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
510 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
511 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
519 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
520 switch (restriction_state) {
521 case gStmLayoutNoNone:
522 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
523 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
530 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
531 switch (restriction_state) {
532 case gStmLayoutNoNone:
533 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
534 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
535 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
549 else if (STM_EVT_NO_DEACTIVATE == event_no) {
550 switch (restriction_state) {
551 case gStmLayoutNoRestriction:
552 case gStmLayoutNoRestrictionSplitMain:
553 case gStmLayoutNoRestrictionSplitSub:
554 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
555 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
563 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
564 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
565 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
566 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
567 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
569 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
570 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
571 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
574 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
575 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
576 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
581 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
582 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
583 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
588 // Copy current state for return
589 memcpy(state, &g_crr_state, sizeof(g_crr_state));
591 if ((STM_FALSE == g_map_is_activated)
592 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
593 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
594 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
595 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
596 g_map_is_activated = STM_TRUE;