4 const char* gStmEventName[] = {
18 const int gStmEventNo[] = {
20 STM_EVT_NO_DEACTIVATE,
21 STM_EVT_NO_PARKING_BRAKE_OFF,
22 STM_EVT_NO_PARKING_BRAKE_ON,
23 STM_EVT_NO_ACCEL_PEDAL_OFF,
24 STM_EVT_NO_ACCEL_PEDAL_ON,
27 STM_EVT_NO_TIMER_EXPIRED,
32 const char* gStmCategoryName[] = {
42 const int gStmCategoryNo[] = {
43 STM_CTG_NO_HOMESCREEN,
48 STM_CTG_NO_SYSTEM_ALERT,
49 STM_CTG_NO_RESTRICTION,
52 const char* gStmAreaName[] = {
59 "restriction.split.main",
60 "restriction.split.sub",
63 const int gStmAreaNo[] = {
66 STM_ARA_NO_SPLIT_MAIN,
69 STM_ARA_NO_RESTRICTION_NORMAL,
70 STM_ARA_NO_RESTRICTION_SPLIT_MAIN,
71 STM_ARA_NO_RESTRICTION_SPLIT_SUB,
75 const char* gStmParkingBrakeStateNo2Name[] = {
80 const char* gStmAccelPedalStateNo2Name[] = {
85 const char* gStmCarStateNo2Name[] = {
90 const char* gStmLampStateNo2Name[] = {
95 const char* gStmLayoutNo2Name[] = {
107 "restriction.split.main",
108 "restriction.split.sub",
111 stm_state_t g_crr_state;
112 stm_state_t g_prv_state;
113 int g_prv_restriction_state_car_stop = 0;
114 int g_prv_apps_state_car_stop = 0;
116 void stmInitialize() {
117 // Initialize previous state
118 memset(&g_prv_state, 0, sizeof(g_prv_state));
120 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
121 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
122 g_prv_state.layer.apps.state = gStmLayoutNoNone;
123 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
124 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
125 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
126 g_prv_state.car.state = gStmCarStateNoStop;
127 g_prv_state.lamp.state = gStmLampStateNoOff;
129 // Initialize current state
130 g_crr_state = g_prv_state;
133 int stmTransitionState(int event, stm_state_t* state) {
134 int event_no, category_no, area_no;
135 int restriction_state, apps_state;
136 int parking_brake_state, accel_pedal_state, car_state, lamp_state;
138 event_no = event & STM_MSK_EVT_NO;
139 category_no = event & STM_MSK_CTG_NO;
140 area_no = event & STM_MSK_ARA_NO;
142 // Backup previous state
143 g_prv_state = g_crr_state;
145 // Get previous state
146 restriction_state = g_prv_state.layer.restriction.state;
147 apps_state = g_prv_state.layer.apps.state;
148 parking_brake_state = g_prv_state.parking_brake.state;
149 accel_pedal_state = g_prv_state.accel_pedal.state;
150 car_state = g_prv_state.car.state;
151 lamp_state = g_prv_state.lamp.state;
154 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
155 g_crr_state.layer.restriction.is_changed = STM_FALSE;
156 g_crr_state.layer.apps.is_changed = STM_FALSE;
157 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
158 g_crr_state.parking_brake.is_changed = STM_FALSE;
159 g_crr_state.accel_pedal.is_changed = STM_FALSE;
160 g_crr_state.car.is_changed = STM_FALSE;
161 g_crr_state.lamp.is_changed = STM_FALSE;
164 case STM_EVT_NO_ACTIVATE:
165 switch (category_no) {
166 case STM_CTG_NO_HOMESCREEN:
168 g_crr_state.layer.apps.state = gStmLayoutNoNone;
169 g_crr_state.layer.apps.is_changed = STM_TRUE;
172 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
173 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
177 case STM_ARA_NO_FULL:
179 switch (apps_state) {
184 g_crr_state.layer.apps.state = gStmLayoutNoMf;
185 g_crr_state.layer.apps.is_changed = STM_TRUE;
189 case STM_ARA_NO_NORMAL:
191 switch (apps_state) {
196 g_crr_state.layer.apps.state = gStmLayoutNoM2;
197 g_crr_state.layer.apps.is_changed = STM_TRUE;
200 g_crr_state.layer.apps.state = gStmLayoutNoM1;
201 g_crr_state.layer.apps.is_changed = STM_TRUE;
204 case STM_ARA_NO_SPLIT_MAIN:
206 switch (apps_state) {
209 g_crr_state.layer.apps.state = gStmLayoutNoS2;
210 g_crr_state.layer.apps.is_changed = STM_TRUE;
219 case STM_CTG_NO_GENERAL:
221 case STM_ARA_NO_NORMAL:
223 switch (apps_state) {
228 g_crr_state.layer.apps.state = gStmLayoutNoG;
229 g_crr_state.layer.apps.is_changed = STM_TRUE;
238 case STM_CTG_NO_SPLITABLE:
240 case STM_ARA_NO_NORMAL:
242 switch (apps_state) {
244 g_crr_state.layer.apps.state = gStmLayoutNoM2;
245 g_crr_state.layer.apps.is_changed = STM_TRUE;
252 g_crr_state.layer.apps.state = gStmLayoutNoS1;
253 g_crr_state.layer.apps.is_changed = STM_TRUE;
257 case STM_ARA_NO_SPLIT_MAIN:
259 switch (apps_state) {
261 g_crr_state.layer.apps.state = gStmLayoutNoS2;
262 g_crr_state.layer.apps.is_changed = STM_TRUE;
265 g_crr_state.layer.apps.state = gStmLayoutNoS2;
266 g_crr_state.layer.apps.is_changed = STM_TRUE;
273 case STM_ARA_NO_SPLIT_SUB:
275 switch (apps_state) {
277 g_crr_state.layer.apps.state = gStmLayoutNoM2;
278 g_crr_state.layer.apps.is_changed = STM_TRUE;
281 g_crr_state.layer.apps.state = gStmLayoutNoM2;
282 g_crr_state.layer.apps.is_changed = STM_TRUE;
285 g_crr_state.layer.apps.state = gStmLayoutNoS2;
286 g_crr_state.layer.apps.is_changed = STM_TRUE;
289 g_crr_state.layer.apps.state = gStmLayoutNoS2;
290 g_crr_state.layer.apps.is_changed = STM_TRUE;
302 case STM_CTG_NO_RESTRICTION:
304 case STM_ARA_NO_RESTRICTION_NORMAL:
306 switch (restriction_state) {
307 case gStmLayoutNoNone:
308 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
309 g_crr_state.layer.restriction.is_changed = STM_TRUE;
316 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
318 switch (restriction_state) {
319 case gStmLayoutNoNone:
320 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
321 g_crr_state.layer.restriction.is_changed = STM_TRUE;
328 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
330 switch (restriction_state) {
331 case gStmLayoutNoNone:
332 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
333 g_crr_state.layer.restriction.is_changed = STM_TRUE;
349 case STM_EVT_NO_DEACTIVATE:
350 switch (category_no) {
351 case STM_CTG_NO_RESTRICTION:
353 switch (restriction_state) {
354 case gStmLayoutNoRestriction:
355 case gStmLayoutNoRestrictionSplitMain:
356 case gStmLayoutNoRestrictionSplitSub:
357 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
358 g_crr_state.layer.restriction.is_changed = STM_TRUE;
369 case STM_EVT_NO_PARKING_BRAKE_OFF:
370 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
371 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
372 g_crr_state.parking_brake.is_changed = STM_TRUE;
375 case STM_EVT_NO_PARKING_BRAKE_ON:
376 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
377 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
378 g_crr_state.parking_brake.is_changed = STM_TRUE;
381 case STM_EVT_NO_ACCEL_PEDAL_OFF:
382 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
383 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
384 g_crr_state.accel_pedal.is_changed = STM_TRUE;
387 case STM_EVT_NO_ACCEL_PEDAL_ON:
388 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
389 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
390 g_crr_state.accel_pedal.is_changed = STM_TRUE;
393 case STM_EVT_NO_CAR_STOP:
394 if (gStmCarStateNoStop != car_state) {
395 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
396 g_crr_state.layer.apps.is_changed = STM_TRUE;
398 g_crr_state.car.state = gStmCarStateNoStop;
399 g_crr_state.car.is_changed = STM_TRUE;
402 case STM_EVT_NO_CAR_RUN:
403 if (gStmCarStateNoRun != car_state) {
404 g_prv_apps_state_car_stop = apps_state;
405 g_crr_state.layer.apps.state = gStmLayoutNoM1;
406 g_crr_state.layer.apps.is_changed = STM_TRUE;
408 g_crr_state.car.state = gStmCarStateNoRun;
409 g_crr_state.car.is_changed = STM_TRUE;
412 case STM_EVT_NO_LAMP_OFF:
413 if (gStmLampStateNoOff != lamp_state) {
414 g_crr_state.lamp.state = gStmLampStateNoOff;
415 g_crr_state.lamp.is_changed = STM_TRUE;
418 case STM_EVT_NO_LAMP_ON:
419 if (gStmLampStateNoOn != lamp_state) {
420 g_crr_state.lamp.state = gStmLampStateNoOn;
421 g_crr_state.lamp.is_changed = STM_TRUE;
430 if (g_crr_state.parking_brake.is_changed
431 || g_crr_state.accel_pedal.is_changed) {
432 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
433 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
434 if (gStmCarStateNoRun != car_state) {
435 // Car state is changed stop -> run
436 g_crr_state.car.state = gStmCarStateNoRun;
437 g_crr_state.car.is_changed = STM_TRUE;
439 // Update restriction layer
440 g_prv_restriction_state_car_stop = restriction_state;
441 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
442 g_crr_state.layer.restriction.is_changed = STM_TRUE;
445 g_prv_apps_state_car_stop = apps_state;
446 g_crr_state.layer.apps.state = gStmLayoutNoM1;
447 g_crr_state.layer.apps.is_changed = STM_TRUE;
451 if (gStmCarStateNoStop != car_state) {
452 // Car state is changed run -> stop
453 g_crr_state.car.state = gStmCarStateNoStop;
454 g_crr_state.car.is_changed = STM_TRUE;
456 // Update restriction layer
457 g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
458 g_crr_state.layer.restriction.is_changed = STM_TRUE;
461 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
462 g_crr_state.layer.apps.is_changed = STM_TRUE;
467 // Copy current state for return
468 memcpy(state, &g_crr_state, sizeof(g_crr_state));