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[gStmLayerNoHomescreen].state = gStmLayoutNoHs;
349 g_crr_state.layer[gStmLayerNoHomescreen].is_changed = STM_TRUE;
352 if (gStmLayoutNoNone != apps_state) {
353 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoNone;
354 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
359 case STM_ARA_NO_FULL:
361 switch (apps_state) {
366 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoMf;
367 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
371 case STM_ARA_NO_NORMAL:
373 switch (apps_state) {
378 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
379 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
382 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM1;
383 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
386 case STM_ARA_NO_SPLIT_MAIN:
388 switch (apps_state) {
391 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
392 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
401 case STM_CTG_NO_GENERAL:
403 case STM_ARA_NO_NORMAL:
405 switch (apps_state) {
410 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoG;
411 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
420 case STM_CTG_NO_SPLITABLE:
422 case STM_ARA_NO_NORMAL:
424 switch (apps_state) {
426 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
427 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
434 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS1;
435 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
439 case STM_ARA_NO_SPLIT_MAIN:
441 switch (apps_state) {
443 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
444 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
447 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
448 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
455 case STM_ARA_NO_SPLIT_SUB:
457 switch (apps_state) {
459 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
460 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
463 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoM2;
464 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
467 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
468 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
471 g_crr_state.layer[gStmLayerNoApps].state = gStmLayoutNoS2;
472 g_crr_state.layer[gStmLayerNoApps].is_changed = STM_TRUE;
490 case STM_EVT_NO_DEACTIVATE:
491 switch (category_no) {
503 // Set restriction layer
504 if (STM_CTG_NO_RESTRICTION == category_no) {
505 if (STM_EVT_NO_ACTIVATE == event_no) {
506 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
508 case STM_ARA_NO_RESTRICTION_NORMAL:
509 switch (restriction_state) {
510 case gStmLayoutNoNone:
511 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoS1) {
512 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
513 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
521 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
522 switch (restriction_state) {
523 case gStmLayoutNoNone:
524 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitMain;
525 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
532 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
533 switch (restriction_state) {
534 case gStmLayoutNoNone:
535 if (g_crr_state.layer[gStmLayerNoApps].state == gStmLayoutNoM2) {
536 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
537 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
551 else if (STM_EVT_NO_DEACTIVATE == event_no) {
552 switch (restriction_state) {
553 case gStmLayoutNoRestriction:
554 case gStmLayoutNoRestrictionSplitMain:
555 case gStmLayoutNoRestrictionSplitSub:
556 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
557 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
565 else if (g_crr_state.layer[gStmLayerNoApps].is_changed) {
566 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
567 if (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state) {
568 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestrictionSplitSub;
569 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
571 else if (gStmLayoutNoS1 == g_crr_state.layer[gStmLayerNoApps].state) {
572 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoRestriction;
573 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
576 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
577 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
578 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
583 if (gStmLayoutNoNone != g_crr_state.layer[gStmLayerNoRestriction].state) {
584 g_crr_state.layer[gStmLayerNoRestriction].state = gStmLayoutNoNone;
585 g_crr_state.layer[gStmLayerNoRestriction].is_changed = STM_TRUE;
590 // Copy current state for return
591 memcpy(state, &g_crr_state, sizeof(g_crr_state));
593 if ((STM_FALSE == g_map_is_activated)
594 && (STM_TRUE == g_crr_state.layer[gStmLayerNoApps].is_changed)
595 && ((gStmLayoutNoM1 == g_crr_state.layer[gStmLayerNoApps].state)
596 || (gStmLayoutNoM2 == g_crr_state.layer[gStmLayerNoApps].state)
597 || (gStmLayoutNoMf == g_crr_state.layer[gStmLayerNoApps].state))) {
598 g_map_is_activated = STM_TRUE;
604 void stmUndoState() {
605 g_crr_state = g_prv_state;