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[] = {
51 const int gStmCategoryNo[] = {
52 STM_CTG_NO_HOMESCREEN,
57 STM_CTG_NO_SYSTEM_ALERT,
58 STM_CTG_NO_RESTRICTION,
61 const char* gStmAreaName[] = {
68 "restriction.split.main",
69 "restriction.split.sub",
72 const int gStmAreaNo[] = {
75 STM_ARA_NO_SPLIT_MAIN,
78 STM_ARA_NO_RESTRICTION_NORMAL,
79 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
80 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
84 const char* gStmTransGearStateNo2Name[] = {
86 "trans_gear_not_neutral"
89 const char* gStmParkingBrakeStateNo2Name[] = {
94 const char* gStmAccelPedalStateNo2Name[] = {
99 const char* gStmCarStateNo2Name[] = {
104 const char* gStmLampStateNo2Name[] = {
109 const char* gStmLightstatusBrakeStateNo2Name[] = {
110 "lightstatus_brake_off",
111 "lightstatus_brake_on"
114 const char* gStmRestrictionModeStateNo2Name[] = {
115 "restriction_mode_off",
116 "restriction_mode_on"
119 const char* gStmLayoutNo2Name[] = {
131 "restriction.split.main",
132 "restriction.split.sub",
135 const char* gStmLayerNo2Name[] = {
142 stm_state_t g_crr_state;
143 stm_state_t g_prv_state;
144 int g_prv_restriction_state_car_stop = 0;
145 int g_prv_apps_state_car_stop = 0;
146 int g_map_is_activated = STM_FALSE;
148 void stmInitialize() {
149 // Initialize previous state
150 memset(&g_prv_state, 0, sizeof(g_prv_state));
152 g_prv_state.layer[gStmLayerNoOnScreen].state = gStmLayoutNoNone;
153 g_prv_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
154 g_prv_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
155 g_prv_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoNone;
156 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
157 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
158 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
159 g_prv_state.car.state = gStmCarStateNoStop;
160 g_prv_state.lamp.state = gStmLampStateNoOff;
161 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
162 g_prv_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
164 // Initialize current state
165 g_crr_state = g_prv_state;
168 int stmTransitionState(int event, stm_state_t* state) {
169 int event_no, category_no, area_no;
170 int restriction_state, apps_state;
171 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state, restriction_mode_state;
173 event_no = event & STM_MSK_EVT_NO;
174 category_no = event & STM_MSK_CTG_NO;
175 area_no = event & STM_MSK_ARA_NO;
177 // Backup previous state
178 g_prv_state = g_crr_state;
180 // Get previous state
181 restriction_state = g_prv_state.layer[gStmLayerNoRestriction].state;
182 apps_state = g_prv_state.layer[gStmLayerNoApps].state;
183 trans_gear_state = g_prv_state.trans_gear.state;
184 parking_brake_state = g_prv_state.parking_brake.state;
185 accel_pedal_state = g_prv_state.accel_pedal.state;
186 car_state = g_prv_state.car.state;
187 lamp_state = g_prv_state.lamp.state;
188 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
189 restriction_mode_state = g_prv_state.restriction_mode.state;
192 g_crr_state.layer[gStmLayerNoOnScreen].is_changed = STM_FALSE;
193 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_FALSE;
194 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_FALSE;
195 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_FALSE;
196 g_crr_state.trans_gear.is_changed = STM_FALSE;
197 g_crr_state.parking_brake.is_changed = STM_FALSE;
198 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
199 g_crr_state.accel_pedal.is_changed = STM_FALSE;
200 g_crr_state.car.is_changed = STM_FALSE;
201 g_crr_state.lamp.is_changed = STM_FALSE;
202 g_crr_state.restriction_mode.is_changed = STM_FALSE;
207 case STM_EVT_NO_TRANS_GEAR_N:
208 if (gStmTransGearStateNoN != trans_gear_state) {
209 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
210 g_crr_state.trans_gear.is_changed = STM_TRUE;
213 case STM_EVT_NO_TRANS_GEAR_NOT_N:
214 if (gStmTransGearStateNoNotN != trans_gear_state) {
215 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
216 g_crr_state.trans_gear.is_changed = STM_TRUE;
219 case STM_EVT_NO_PARKING_BRAKE_OFF:
220 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
221 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
222 g_crr_state.parking_brake.is_changed = STM_TRUE;
225 case STM_EVT_NO_PARKING_BRAKE_ON:
226 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
227 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
228 g_crr_state.parking_brake.is_changed = STM_TRUE;
231 case STM_EVT_NO_ACCEL_PEDAL_OFF:
232 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
233 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
234 g_crr_state.accel_pedal.is_changed = STM_TRUE;
237 case STM_EVT_NO_ACCEL_PEDAL_ON:
238 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
239 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
240 g_crr_state.accel_pedal.is_changed = STM_TRUE;
243 case STM_EVT_NO_LAMP_OFF:
244 if (gStmLampStateNoOff != lamp_state) {
245 g_crr_state.lamp.state = gStmLampStateNoOff;
246 g_crr_state.lamp.is_changed = STM_TRUE;
249 case STM_EVT_NO_LAMP_ON:
250 if (gStmLampStateNoOn != lamp_state) {
251 g_crr_state.lamp.state = gStmLampStateNoOn;
252 g_crr_state.lamp.is_changed = STM_TRUE;
255 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
256 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
257 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
258 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
261 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
262 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
263 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
264 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
273 if (g_crr_state.lightstatus_brake.is_changed
274 || g_crr_state.accel_pedal.is_changed) {
275 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
276 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
278 if (g_crr_state.parking_brake.is_changed
279 || g_crr_state.trans_gear.is_changed) {
280 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
281 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
283 if (gStmCarStateNoRun != car_state) {
284 // Car state is changed stop -> run
285 g_crr_state.car.state = gStmCarStateNoRun;
286 g_crr_state.car.is_changed = STM_TRUE;
290 if (gStmCarStateNoStop != car_state) {
291 // Car state is changed run -> stop
292 g_crr_state.car.state = gStmCarStateNoStop;
293 g_crr_state.car.is_changed = STM_TRUE;
298 // Set restriction mode
299 if ((STM_EVT_NO_RESTRICTION_MODE_ON == event_no)
300 && (gStmRestrictionModeStateNoOn != restriction_mode_state)) {
301 HMI_DEBUG("wm:pm:stm", "Restriction mode OFF -> ON");
303 // Restriction mode is changed OFF -> ON
304 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOn;
305 g_crr_state.restriction_mode.is_changed = STM_TRUE;
307 // Update restriction layer
308 g_prv_restriction_state_car_stop = restriction_state;
309 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
310 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
313 g_prv_apps_state_car_stop = apps_state;
314 if (STM_TRUE == g_map_is_activated) {
315 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
316 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
319 else if ((STM_EVT_NO_RESTRICTION_MODE_OFF == event_no)
320 && (gStmRestrictionModeStateNoOff != restriction_mode_state)) {
321 HMI_DEBUG("wm:pm:stm", "Restriction mode ON -> OFF");
323 // Restriction mode is changed ON -> OFF
324 g_crr_state.restriction_mode.state = gStmRestrictionModeStateNoOff;
325 g_crr_state.restriction_mode.is_changed = STM_TRUE;
327 // Update restriction layer
328 g_crr_state.layer[gStmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
329 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
332 if (STM_TRUE == g_map_is_activated) {
333 g_crr_state.layer[gStmLayerNoApps].state = g_prv_apps_state_car_stop;
334 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
338 // Set apps/homescreen layer
340 case STM_EVT_NO_ACTIVATE:
341 if (gStmRestrictionModeStateNoOff == restriction_mode_state) {
342 switch (category_no) {
343 case STM_CTG_NO_HOMESCREEN:
345 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
346 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
349 g_crr_state.layer[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
350 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
354 case STM_ARA_NO_FULL:
356 switch (apps_state) {
361 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
362 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
366 case STM_ARA_NO_NORMAL:
368 switch (apps_state) {
373 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
374 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
377 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
378 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
381 case STM_ARA_NO_SPLIT_MAIN:
383 switch (apps_state) {
386 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
387 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
396 case STM_CTG_NO_GENERAL:
398 case STM_ARA_NO_NORMAL:
400 switch (apps_state) {
405 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
406 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
415 case STM_CTG_NO_SPLITABLE:
417 case STM_ARA_NO_NORMAL:
419 switch (apps_state) {
421 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
422 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
429 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
430 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
434 case STM_ARA_NO_SPLIT_MAIN:
436 switch (apps_state) {
438 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
439 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
442 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
443 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
450 case STM_ARA_NO_SPLIT_SUB:
452 switch (apps_state) {
454 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
455 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
458 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
459 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
462 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
463 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
466 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
467 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
485 case STM_EVT_NO_DEACTIVATE:
486 switch (category_no) {
498 // Set restriction layer
499 if (STM_CTG_NO_RESTRICTION == category_no) {
500 if (STM_EVT_NO_ACTIVATE == event_no) {
501 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
503 case STM_ARA_NO_RESTRICTION_NORMAL:
504 switch (restriction_state) {
505 case gStmLayoutNoNone:
506 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
507 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
508 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
516 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
517 switch (restriction_state) {
518 case gStmLayoutNoNone:
519 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
520 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
527 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
528 switch (restriction_state) {
529 case gStmLayoutNoNone:
530 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
531 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
532 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
546 else if (STM_EVT_NO_DEACTIVATE == event_no) {
547 switch (restriction_state) {
548 case gStmLayoutNoRestriction:
549 case gStmLayoutNoRestrictionSplitMain:
550 case gStmLayoutNoRestrictionSplitSub:
551 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
552 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
560 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
561 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
562 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
563 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
564 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
566 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
567 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
568 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
571 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
572 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
573 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
578 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
579 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
580 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
585 // Copy current state for return
586 memcpy(state, &g_crr_state, sizeof(g_crr_state));
588 if ((STM_FALSE == g_map_is_activated)
589 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
590 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
591 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
592 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
593 g_map_is_activated = STM_TRUE;