4 const char* gStmEventName[] = {
8 "trans_gear_not_neutral",
18 const int gStmEventNo[] = {
20 STM_EVT_NO_DEACTIVATE,
21 STM_EVT_NO_TRANS_GEAR_N,
22 STM_EVT_NO_TRANS_GEAR_NOT_N,
23 STM_EVT_NO_PARKING_BRAKE_OFF,
24 STM_EVT_NO_PARKING_BRAKE_ON,
25 STM_EVT_NO_ACCEL_PEDAL_OFF,
26 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* gStmTransGearStateNo2Name[] = {
77 "trans_gear_not_neutral"
80 const char* gStmParkingBrakeStateNo2Name[] = {
85 const char* gStmAccelPedalStateNo2Name[] = {
90 const char* gStmCarStateNo2Name[] = {
95 const char* gStmLampStateNo2Name[] = {
100 const char* gStmLayoutNo2Name[] = {
112 "restriction.split.main",
113 "restriction.split.sub",
116 stm_state_t g_crr_state;
117 stm_state_t g_prv_state;
118 int g_prv_restriction_state_car_stop = 0;
119 int g_prv_apps_state_car_stop = 0;
121 void stmInitialize() {
122 // Initialize previous state
123 memset(&g_prv_state, 0, sizeof(g_prv_state));
125 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
126 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
127 g_prv_state.layer.apps.state = gStmLayoutNoNone;
128 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
129 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
130 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
131 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
132 g_prv_state.car.state = gStmCarStateNoStop;
133 g_prv_state.lamp.state = gStmLampStateNoOff;
135 // Initialize current state
136 g_crr_state = g_prv_state;
139 int stmTransitionState(int event, stm_state_t* state) {
140 int event_no, category_no, area_no;
141 int restriction_state, apps_state;
142 int trans_gear_state, parking_brake_state, accel_pedal_state, car_state, lamp_state;
144 event_no = event & STM_MSK_EVT_NO;
145 category_no = event & STM_MSK_CTG_NO;
146 area_no = event & STM_MSK_ARA_NO;
148 // Backup previous state
149 g_prv_state = g_crr_state;
151 // Get previous state
152 restriction_state = g_prv_state.layer.restriction.state;
153 apps_state = g_prv_state.layer.apps.state;
154 trans_gear_state = g_prv_state.trans_gear.state;
155 parking_brake_state = g_prv_state.parking_brake.state;
156 accel_pedal_state = g_prv_state.accel_pedal.state;
157 car_state = g_prv_state.car.state;
158 lamp_state = g_prv_state.lamp.state;
161 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
162 g_crr_state.layer.restriction.is_changed = STM_FALSE;
163 g_crr_state.layer.apps.is_changed = STM_FALSE;
164 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
165 g_crr_state.trans_gear.is_changed = STM_FALSE;
166 g_crr_state.parking_brake.is_changed = STM_FALSE;
167 g_crr_state.accel_pedal.is_changed = STM_FALSE;
168 g_crr_state.car.is_changed = STM_FALSE;
169 g_crr_state.lamp.is_changed = STM_FALSE;
172 case STM_EVT_NO_ACTIVATE:
173 switch (category_no) {
174 case STM_CTG_NO_HOMESCREEN:
176 g_crr_state.layer.apps.state = gStmLayoutNoNone;
177 g_crr_state.layer.apps.is_changed = STM_TRUE;
180 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
181 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
185 case STM_ARA_NO_FULL:
187 switch (apps_state) {
192 g_crr_state.layer.apps.state = gStmLayoutNoMf;
193 g_crr_state.layer.apps.is_changed = STM_TRUE;
197 case STM_ARA_NO_NORMAL:
199 switch (apps_state) {
204 g_crr_state.layer.apps.state = gStmLayoutNoM2;
205 g_crr_state.layer.apps.is_changed = STM_TRUE;
208 g_crr_state.layer.apps.state = gStmLayoutNoM1;
209 g_crr_state.layer.apps.is_changed = STM_TRUE;
212 case STM_ARA_NO_SPLIT_MAIN:
214 switch (apps_state) {
217 g_crr_state.layer.apps.state = gStmLayoutNoS2;
218 g_crr_state.layer.apps.is_changed = STM_TRUE;
227 case STM_CTG_NO_GENERAL:
229 case STM_ARA_NO_NORMAL:
231 switch (apps_state) {
236 g_crr_state.layer.apps.state = gStmLayoutNoG;
237 g_crr_state.layer.apps.is_changed = STM_TRUE;
246 case STM_CTG_NO_SPLITABLE:
248 case STM_ARA_NO_NORMAL:
250 switch (apps_state) {
252 g_crr_state.layer.apps.state = gStmLayoutNoM2;
253 g_crr_state.layer.apps.is_changed = STM_TRUE;
260 g_crr_state.layer.apps.state = gStmLayoutNoS1;
261 g_crr_state.layer.apps.is_changed = STM_TRUE;
265 case STM_ARA_NO_SPLIT_MAIN:
267 switch (apps_state) {
269 g_crr_state.layer.apps.state = gStmLayoutNoS2;
270 g_crr_state.layer.apps.is_changed = STM_TRUE;
273 g_crr_state.layer.apps.state = gStmLayoutNoS2;
274 g_crr_state.layer.apps.is_changed = STM_TRUE;
281 case STM_ARA_NO_SPLIT_SUB:
283 switch (apps_state) {
285 g_crr_state.layer.apps.state = gStmLayoutNoM2;
286 g_crr_state.layer.apps.is_changed = STM_TRUE;
289 g_crr_state.layer.apps.state = gStmLayoutNoM2;
290 g_crr_state.layer.apps.is_changed = STM_TRUE;
293 g_crr_state.layer.apps.state = gStmLayoutNoS2;
294 g_crr_state.layer.apps.is_changed = STM_TRUE;
297 g_crr_state.layer.apps.state = gStmLayoutNoS2;
298 g_crr_state.layer.apps.is_changed = STM_TRUE;
310 case STM_CTG_NO_RESTRICTION:
312 case STM_ARA_NO_RESTRICTION_NORMAL:
314 switch (restriction_state) {
315 case gStmLayoutNoNone:
316 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
317 g_crr_state.layer.restriction.is_changed = STM_TRUE;
324 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
326 switch (restriction_state) {
327 case gStmLayoutNoNone:
328 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
329 g_crr_state.layer.restriction.is_changed = STM_TRUE;
336 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
338 switch (restriction_state) {
339 case gStmLayoutNoNone:
340 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
341 g_crr_state.layer.restriction.is_changed = STM_TRUE;
357 case STM_EVT_NO_DEACTIVATE:
358 switch (category_no) {
359 case STM_CTG_NO_RESTRICTION:
361 switch (restriction_state) {
362 case gStmLayoutNoRestriction:
363 case gStmLayoutNoRestrictionSplitMain:
364 case gStmLayoutNoRestrictionSplitSub:
365 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
366 g_crr_state.layer.restriction.is_changed = STM_TRUE;
377 case STM_EVT_NO_TRANS_GEAR_N:
378 if (gStmTransGearStateNoN != trans_gear_state) {
379 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
380 g_crr_state.trans_gear.is_changed = STM_TRUE;
383 case STM_EVT_NO_TRANS_GEAR_NOT_N:
384 if (gStmTransGearStateNoNotN != trans_gear_state) {
385 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
386 g_crr_state.trans_gear.is_changed = STM_TRUE;
389 case STM_EVT_NO_PARKING_BRAKE_OFF:
390 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
391 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
392 g_crr_state.parking_brake.is_changed = STM_TRUE;
395 case STM_EVT_NO_PARKING_BRAKE_ON:
396 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
397 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
398 g_crr_state.parking_brake.is_changed = STM_TRUE;
401 case STM_EVT_NO_ACCEL_PEDAL_OFF:
402 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
403 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
404 g_crr_state.accel_pedal.is_changed = STM_TRUE;
407 case STM_EVT_NO_ACCEL_PEDAL_ON:
408 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
409 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
410 g_crr_state.accel_pedal.is_changed = STM_TRUE;
413 case STM_EVT_NO_LAMP_OFF:
414 if (gStmLampStateNoOff != lamp_state) {
415 g_crr_state.lamp.state = gStmLampStateNoOff;
416 g_crr_state.lamp.is_changed = STM_TRUE;
419 case STM_EVT_NO_LAMP_ON:
420 if (gStmLampStateNoOn != lamp_state) {
421 g_crr_state.lamp.state = gStmLampStateNoOn;
422 g_crr_state.lamp.is_changed = STM_TRUE;
432 if (g_crr_state.parking_brake.is_changed
433 || g_crr_state.accel_pedal.is_changed) {
434 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
435 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
437 if (g_crr_state.parking_brake.is_changed
438 || g_crr_state.trans_gear.is_changed) {
439 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
440 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
442 if (gStmCarStateNoRun != car_state) {
443 // Car state is changed stop -> run
444 g_crr_state.car.state = gStmCarStateNoRun;
445 g_crr_state.car.is_changed = STM_TRUE;
447 // Update restriction layer
448 g_prv_restriction_state_car_stop = restriction_state;
449 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
450 g_crr_state.layer.restriction.is_changed = STM_TRUE;
453 g_prv_apps_state_car_stop = apps_state;
454 g_crr_state.layer.apps.state = gStmLayoutNoM1;
455 g_crr_state.layer.apps.is_changed = STM_TRUE;
459 if (gStmCarStateNoStop != car_state) {
460 // Car state is changed run -> stop
461 g_crr_state.car.state = gStmCarStateNoStop;
462 g_crr_state.car.is_changed = STM_TRUE;
464 // Update restriction layer
465 g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
466 g_crr_state.layer.restriction.is_changed = STM_TRUE;
469 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
470 g_crr_state.layer.apps.is_changed = STM_TRUE;
475 // Copy current state for return
476 memcpy(state, &g_crr_state, sizeof(g_crr_state));