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_apps_state_car_stop = 0;
115 void stmInitialize() {
116 // Initialize previous state
117 memset(&g_prv_state, 0, sizeof(g_prv_state));
119 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
120 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
121 g_prv_state.layer.apps.state = gStmLayoutNoNone;
122 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
123 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
124 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
125 g_prv_state.car.state = gStmCarStateNoStop;
126 g_prv_state.lamp.state = gStmLampStateNoOff;
128 // Initialize current state
129 g_crr_state = g_prv_state;
132 int stmTransitionState(int event, stm_state_t* state) {
133 int event_no, category_no, area_no;
134 int restriction_state, apps_state;
135 int parking_brake_state, accel_pedal_state, car_state, lamp_state;
137 event_no = event & STM_MSK_EVT_NO;
138 category_no = event & STM_MSK_CTG_NO;
139 area_no = event & STM_MSK_ARA_NO;
141 // Backup previous state
142 g_prv_state = g_crr_state;
144 // Get previous state
145 restriction_state = g_prv_state.layer.restriction.state;
146 apps_state = g_prv_state.layer.apps.state;
147 parking_brake_state = g_prv_state.parking_brake.state;
148 accel_pedal_state = g_prv_state.accel_pedal.state;
149 car_state = g_prv_state.car.state;
150 lamp_state = g_prv_state.lamp.state;
153 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
154 g_crr_state.layer.restriction.is_changed = STM_FALSE;
155 g_crr_state.layer.apps.is_changed = STM_FALSE;
156 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
157 g_crr_state.parking_brake.is_changed = STM_FALSE;
158 g_crr_state.accel_pedal.is_changed = STM_FALSE;
159 g_crr_state.car.is_changed = STM_FALSE;
160 g_crr_state.lamp.is_changed = STM_FALSE;
163 case STM_EVT_NO_ACTIVATE:
164 switch (category_no) {
165 case STM_CTG_NO_HOMESCREEN:
167 g_crr_state.layer.apps.state = gStmLayoutNoNone;
168 g_crr_state.layer.apps.is_changed = STM_TRUE;
171 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
172 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
176 case STM_ARA_NO_FULL:
178 switch (apps_state) {
183 g_crr_state.layer.apps.state = gStmLayoutNoMf;
184 g_crr_state.layer.apps.is_changed = STM_TRUE;
188 case STM_ARA_NO_NORMAL:
190 switch (apps_state) {
195 g_crr_state.layer.apps.state = gStmLayoutNoM2;
196 g_crr_state.layer.apps.is_changed = STM_TRUE;
199 g_crr_state.layer.apps.state = gStmLayoutNoM1;
200 g_crr_state.layer.apps.is_changed = STM_TRUE;
203 case STM_ARA_NO_SPLIT_MAIN:
205 switch (apps_state) {
208 g_crr_state.layer.apps.state = gStmLayoutNoS2;
209 g_crr_state.layer.apps.is_changed = STM_TRUE;
218 case STM_CTG_NO_GENERAL:
220 case STM_ARA_NO_NORMAL:
222 switch (apps_state) {
227 g_crr_state.layer.apps.state = gStmLayoutNoG;
228 g_crr_state.layer.apps.is_changed = STM_TRUE;
237 case STM_CTG_NO_SPLITABLE:
239 case STM_ARA_NO_NORMAL:
241 switch (apps_state) {
243 g_crr_state.layer.apps.state = gStmLayoutNoM2;
244 g_crr_state.layer.apps.is_changed = STM_TRUE;
251 g_crr_state.layer.apps.state = gStmLayoutNoS1;
252 g_crr_state.layer.apps.is_changed = STM_TRUE;
256 case STM_ARA_NO_SPLIT_MAIN:
258 switch (apps_state) {
260 g_crr_state.layer.apps.state = gStmLayoutNoS2;
261 g_crr_state.layer.apps.is_changed = STM_TRUE;
264 g_crr_state.layer.apps.state = gStmLayoutNoS2;
265 g_crr_state.layer.apps.is_changed = STM_TRUE;
272 case STM_ARA_NO_SPLIT_SUB:
274 switch (apps_state) {
276 g_crr_state.layer.apps.state = gStmLayoutNoM2;
277 g_crr_state.layer.apps.is_changed = STM_TRUE;
280 g_crr_state.layer.apps.state = gStmLayoutNoM2;
281 g_crr_state.layer.apps.is_changed = STM_TRUE;
284 g_crr_state.layer.apps.state = gStmLayoutNoS2;
285 g_crr_state.layer.apps.is_changed = STM_TRUE;
288 g_crr_state.layer.apps.state = gStmLayoutNoS2;
289 g_crr_state.layer.apps.is_changed = STM_TRUE;
301 case STM_CTG_NO_RESTRICTION:
303 case STM_ARA_NO_RESTRICTION_NORMAL:
305 switch (restriction_state) {
306 case gStmLayoutNoNone:
307 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
308 g_crr_state.layer.restriction.is_changed = STM_TRUE;
315 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
317 switch (restriction_state) {
318 case gStmLayoutNoNone:
319 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
320 g_crr_state.layer.restriction.is_changed = STM_TRUE;
327 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
329 switch (restriction_state) {
330 case gStmLayoutNoNone:
331 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
332 g_crr_state.layer.restriction.is_changed = STM_TRUE;
348 case STM_EVT_NO_DEACTIVATE:
349 switch (category_no) {
350 case STM_CTG_NO_RESTRICTION:
352 switch (restriction_state) {
353 case gStmLayoutNoRestriction:
354 case gStmLayoutNoRestrictionSplitMain:
355 case gStmLayoutNoRestrictionSplitSub:
356 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
357 g_crr_state.layer.restriction.is_changed = STM_TRUE;
368 case STM_EVT_NO_PARKING_BRAKE_OFF:
369 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
370 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
371 g_crr_state.parking_brake.is_changed = STM_TRUE;
374 case STM_EVT_NO_PARKING_BRAKE_ON:
375 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
376 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
377 g_crr_state.parking_brake.is_changed = STM_TRUE;
380 case STM_EVT_NO_ACCEL_PEDAL_OFF:
381 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
382 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
383 g_crr_state.layer.apps.is_changed = STM_TRUE;
385 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
386 g_crr_state.accel_pedal.is_changed = STM_TRUE;
389 case STM_EVT_NO_ACCEL_PEDAL_ON:
390 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
391 g_prv_apps_state_car_stop = apps_state;
392 g_crr_state.layer.apps.state = gStmLayoutNoM1;
393 g_crr_state.layer.apps.is_changed = STM_TRUE;
395 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
396 g_crr_state.accel_pedal.is_changed = STM_TRUE;
399 case STM_EVT_NO_CAR_STOP:
400 if (gStmCarStateNoStop != car_state) {
401 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
402 g_crr_state.layer.apps.is_changed = STM_TRUE;
404 g_crr_state.car.state = gStmCarStateNoStop;
405 g_crr_state.car.is_changed = STM_TRUE;
408 case STM_EVT_NO_CAR_RUN:
409 if (gStmCarStateNoRun != car_state) {
410 g_prv_apps_state_car_stop = apps_state;
411 g_crr_state.layer.apps.state = gStmLayoutNoM1;
412 g_crr_state.layer.apps.is_changed = STM_TRUE;
414 g_crr_state.car.state = gStmCarStateNoRun;
415 g_crr_state.car.is_changed = STM_TRUE;
418 case STM_EVT_NO_LAMP_OFF:
419 if (gStmLampStateNoOff != lamp_state) {
420 g_crr_state.lamp.state = gStmLampStateNoOff;
421 g_crr_state.lamp.is_changed = STM_TRUE;
424 case STM_EVT_NO_LAMP_ON:
425 if (gStmLampStateNoOn != lamp_state) {
426 g_crr_state.lamp.state = gStmLampStateNoOn;
427 g_crr_state.lamp.is_changed = STM_TRUE;
435 // Copy current state for return
436 memcpy(state, &g_crr_state, sizeof(g_crr_state));