4 const char* gStmEventName[] = {
8 "trans_gear_not_neutral",
16 "lightstatus_brake_off",
17 "lightstatus_brake_on",
20 const int gStmEventNo[] = {
22 STM_EVT_NO_DEACTIVATE,
23 STM_EVT_NO_TRANS_GEAR_N,
24 STM_EVT_NO_TRANS_GEAR_NOT_N,
25 STM_EVT_NO_PARKING_BRAKE_OFF,
26 STM_EVT_NO_PARKING_BRAKE_ON,
27 STM_EVT_NO_ACCEL_PEDAL_OFF,
28 STM_EVT_NO_ACCEL_PEDAL_ON,
29 STM_EVT_NO_TIMER_EXPIRED,
32 STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF,
33 STM_EVT_NO_LIGHTSTATUS_BRAKE_ON,
36 const char* gStmCategoryName[] = {
46 const int gStmCategoryNo[] = {
47 STM_CTG_NO_HOMESCREEN,
52 STM_CTG_NO_SYSTEM_ALERT,
53 STM_CTG_NO_RESTRICTION,
56 const char* gStmAreaName[] = {
63 "restriction.split.main",
64 "restriction.split.sub",
67 const int gStmAreaNo[] = {
70 STM_ARA_NO_SPLIT_MAIN,
73 STM_ARA_NO_RESTRICTION_NORMAL,
74 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
75 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
79 const char* gStmTransGearStateNo2Name[] = {
81 "trans_gear_not_neutral"
84 const char* gStmParkingBrakeStateNo2Name[] = {
89 const char* gStmAccelPedalStateNo2Name[] = {
94 const char* gStmCarStateNo2Name[] = {
99 const char* gStmLampStateNo2Name[] = {
104 const char* gStmLightstatusBrakeStateNo2Name[] = {
105 "lightstatus_brake_off",
106 "lightstatus_brake_on"
109 const char* gStmLayoutNo2Name[] = {
121 "restriction.split.main",
122 "restriction.split.sub",
125 stm_state_t g_crr_state;
126 stm_state_t g_prv_state;
127 int g_prv_restriction_state_car_stop = 0;
128 int g_prv_apps_state_car_stop = 0;
129 int g_map_is_activated = STM_FALSE;
131 void stmInitialize() {
132 // Initialize previous state
133 memset(&g_prv_state, 0, sizeof(g_prv_state));
135 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
136 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
137 g_prv_state.layer.apps.state = gStmLayoutNoNone;
138 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
139 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
140 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
141 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
142 g_prv_state.car.state = gStmCarStateNoStop;
143 g_prv_state.lamp.state = gStmLampStateNoOff;
144 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
146 // Initialize current state
147 g_crr_state = g_prv_state;
150 int stmTransitionState(int event, stm_state_t* state) {
151 int event_no, category_no, area_no;
152 int restriction_state, apps_state;
153 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state;
155 event_no = event & STM_MSK_EVT_NO;
156 category_no = event & STM_MSK_CTG_NO;
157 area_no = event & STM_MSK_ARA_NO;
159 // Backup previous state
160 g_prv_state = g_crr_state;
162 // Get previous state
163 restriction_state = g_prv_state.layer.restriction.state;
164 apps_state = g_prv_state.layer.apps.state;
165 trans_gear_state = g_prv_state.trans_gear.state;
166 parking_brake_state = g_prv_state.parking_brake.state;
167 accel_pedal_state = g_prv_state.accel_pedal.state;
168 car_state = g_prv_state.car.state;
169 lamp_state = g_prv_state.lamp.state;
170 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
173 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
174 g_crr_state.layer.restriction.is_changed = STM_FALSE;
175 g_crr_state.layer.apps.is_changed = STM_FALSE;
176 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
177 g_crr_state.trans_gear.is_changed = STM_FALSE;
178 g_crr_state.parking_brake.is_changed = STM_FALSE;
179 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
180 g_crr_state.accel_pedal.is_changed = STM_FALSE;
181 g_crr_state.car.is_changed = STM_FALSE;
182 g_crr_state.lamp.is_changed = STM_FALSE;
187 case STM_EVT_NO_TRANS_GEAR_N:
188 if (gStmTransGearStateNoN != trans_gear_state) {
189 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
190 g_crr_state.trans_gear.is_changed = STM_TRUE;
193 case STM_EVT_NO_TRANS_GEAR_NOT_N:
194 if (gStmTransGearStateNoNotN != trans_gear_state) {
195 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
196 g_crr_state.trans_gear.is_changed = STM_TRUE;
199 case STM_EVT_NO_PARKING_BRAKE_OFF:
200 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
201 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
202 g_crr_state.parking_brake.is_changed = STM_TRUE;
205 case STM_EVT_NO_PARKING_BRAKE_ON:
206 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
207 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
208 g_crr_state.parking_brake.is_changed = STM_TRUE;
211 case STM_EVT_NO_ACCEL_PEDAL_OFF:
212 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
213 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
214 g_crr_state.accel_pedal.is_changed = STM_TRUE;
217 case STM_EVT_NO_ACCEL_PEDAL_ON:
218 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
219 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
220 g_crr_state.accel_pedal.is_changed = STM_TRUE;
223 case STM_EVT_NO_LAMP_OFF:
224 if (gStmLampStateNoOff != lamp_state) {
225 g_crr_state.lamp.state = gStmLampStateNoOff;
226 g_crr_state.lamp.is_changed = STM_TRUE;
229 case STM_EVT_NO_LAMP_ON:
230 if (gStmLampStateNoOn != lamp_state) {
231 g_crr_state.lamp.state = gStmLampStateNoOn;
232 g_crr_state.lamp.is_changed = STM_TRUE;
235 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
236 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
237 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
238 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
241 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
242 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
243 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
244 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
253 if (g_crr_state.lightstatus_brake.is_changed
254 || g_crr_state.accel_pedal.is_changed) {
255 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
256 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
258 if (g_crr_state.parking_brake.is_changed
259 || g_crr_state.trans_gear.is_changed) {
260 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
261 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
263 if (gStmCarStateNoRun != car_state) {
264 // Car state is changed stop -> run
265 g_crr_state.car.state = gStmCarStateNoRun;
266 g_crr_state.car.is_changed = STM_TRUE;
268 // Update restriction layer
269 g_prv_restriction_state_car_stop = restriction_state;
270 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
271 g_crr_state.layer.restriction.is_changed = STM_TRUE;
274 g_prv_apps_state_car_stop = apps_state;
275 if (STM_TRUE == g_map_is_activated) {
276 g_crr_state.layer.apps.state = gStmLayoutNoM1;
277 g_crr_state.layer.apps.is_changed = STM_TRUE;
282 if (gStmCarStateNoStop != car_state) {
283 // Car state is changed run -> stop
284 g_crr_state.car.state = gStmCarStateNoStop;
285 g_crr_state.car.is_changed = STM_TRUE;
287 // Update restriction layer
288 g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
289 g_crr_state.layer.restriction.is_changed = STM_TRUE;
292 if (STM_TRUE == g_map_is_activated) {
293 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
294 g_crr_state.layer.apps.is_changed = STM_TRUE;
300 // Set apps/homescreen layer
302 case STM_EVT_NO_ACTIVATE:
303 if (gStmCarStateNoStop == car_state) {
304 switch (category_no) {
305 case STM_CTG_NO_HOMESCREEN:
307 g_crr_state.layer.apps.state = gStmLayoutNoNone;
308 g_crr_state.layer.apps.is_changed = STM_TRUE;
311 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
312 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
316 case STM_ARA_NO_FULL:
318 switch (apps_state) {
323 g_crr_state.layer.apps.state = gStmLayoutNoMf;
324 g_crr_state.layer.apps.is_changed = STM_TRUE;
328 case STM_ARA_NO_NORMAL:
330 switch (apps_state) {
335 g_crr_state.layer.apps.state = gStmLayoutNoM2;
336 g_crr_state.layer.apps.is_changed = STM_TRUE;
339 g_crr_state.layer.apps.state = gStmLayoutNoM1;
340 g_crr_state.layer.apps.is_changed = STM_TRUE;
343 case STM_ARA_NO_SPLIT_MAIN:
345 switch (apps_state) {
348 g_crr_state.layer.apps.state = gStmLayoutNoS2;
349 g_crr_state.layer.apps.is_changed = STM_TRUE;
358 case STM_CTG_NO_GENERAL:
360 case STM_ARA_NO_NORMAL:
362 switch (apps_state) {
367 g_crr_state.layer.apps.state = gStmLayoutNoG;
368 g_crr_state.layer.apps.is_changed = STM_TRUE;
377 case STM_CTG_NO_SPLITABLE:
379 case STM_ARA_NO_NORMAL:
381 switch (apps_state) {
383 g_crr_state.layer.apps.state = gStmLayoutNoM2;
384 g_crr_state.layer.apps.is_changed = STM_TRUE;
391 g_crr_state.layer.apps.state = gStmLayoutNoS1;
392 g_crr_state.layer.apps.is_changed = STM_TRUE;
396 case STM_ARA_NO_SPLIT_MAIN:
398 switch (apps_state) {
400 g_crr_state.layer.apps.state = gStmLayoutNoS2;
401 g_crr_state.layer.apps.is_changed = STM_TRUE;
404 g_crr_state.layer.apps.state = gStmLayoutNoS2;
405 g_crr_state.layer.apps.is_changed = STM_TRUE;
412 case STM_ARA_NO_SPLIT_SUB:
414 switch (apps_state) {
416 g_crr_state.layer.apps.state = gStmLayoutNoM2;
417 g_crr_state.layer.apps.is_changed = STM_TRUE;
420 g_crr_state.layer.apps.state = gStmLayoutNoM2;
421 g_crr_state.layer.apps.is_changed = STM_TRUE;
424 g_crr_state.layer.apps.state = gStmLayoutNoS2;
425 g_crr_state.layer.apps.is_changed = STM_TRUE;
428 g_crr_state.layer.apps.state = gStmLayoutNoS2;
429 g_crr_state.layer.apps.is_changed = STM_TRUE;
447 case STM_EVT_NO_DEACTIVATE:
448 switch (category_no) {
460 // Set restriction layer
461 if (STM_CTG_NO_RESTRICTION == category_no) {
462 if (STM_EVT_NO_ACTIVATE == event_no) {
463 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
465 case STM_ARA_NO_RESTRICTION_NORMAL:
466 switch (restriction_state) {
467 case gStmLayoutNoNone:
468 if (g_crr_state.layer.apps.state == gStmLayoutNoS1) {
469 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
470 g_crr_state.layer.restriction.is_changed = STM_TRUE;
478 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
479 switch (restriction_state) {
480 case gStmLayoutNoNone:
481 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
482 g_crr_state.layer.restriction.is_changed = STM_TRUE;
489 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
490 switch (restriction_state) {
491 case gStmLayoutNoNone:
492 if (g_crr_state.layer.apps.state == gStmLayoutNoM2) {
493 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
494 g_crr_state.layer.restriction.is_changed = STM_TRUE;
508 else if (STM_EVT_NO_DEACTIVATE == event_no) {
509 switch (restriction_state) {
510 case gStmLayoutNoRestriction:
511 case gStmLayoutNoRestrictionSplitMain:
512 case gStmLayoutNoRestrictionSplitSub:
513 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
514 g_crr_state.layer.restriction.is_changed = STM_TRUE;
522 else if (g_crr_state.layer.apps.is_changed) {
523 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
524 if (gStmLayoutNoM2 == g_crr_state.layer.apps.state) {
525 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
526 g_crr_state.layer.restriction.is_changed = STM_TRUE;
528 else if (gStmLayoutNoS1 == g_crr_state.layer.apps.state) {
529 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
530 g_crr_state.layer.restriction.is_changed = STM_TRUE;
533 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
534 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
535 g_crr_state.layer.restriction.is_changed = STM_TRUE;
540 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
541 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
542 g_crr_state.layer.restriction.is_changed = STM_TRUE;
547 // Copy current state for return
548 memcpy(state, &g_crr_state, sizeof(g_crr_state));
550 if ((STM_FALSE == g_map_is_activated)
551 && (STM_TRUE == g_crr_state.layer.apps.is_changed)
552 && ((gStmLayoutNoM1 == g_crr_state.layer.apps.state)
553 || (gStmLayoutNoM2 == g_crr_state.layer.apps.state)
554 || (gStmLayoutNoMf == g_crr_state.layer.apps.state))) {
555 g_map_is_activated = STM_TRUE;