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;
130 void stmInitialize() {
131 // Initialize previous state
132 memset(&g_prv_state, 0, sizeof(g_prv_state));
134 g_prv_state.layer.on_screen.state = gStmLayoutNoNone;
135 g_prv_state.layer.restriction.state = gStmLayoutNoNone;
136 g_prv_state.layer.apps.state = gStmLayoutNoNone;
137 g_prv_state.layer.homescreen.state = gStmLayoutNoNone;
138 g_prv_state.trans_gear.state = gStmTransGearStateNoN;
139 g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
140 g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff;
141 g_prv_state.car.state = gStmCarStateNoStop;
142 g_prv_state.lamp.state = gStmLampStateNoOff;
143 g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn;
145 // Initialize current state
146 g_crr_state = g_prv_state;
149 int stmTransitionState(int event, stm_state_t* state) {
150 int event_no, category_no, area_no;
151 int restriction_state, apps_state;
152 int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_state, car_state, lamp_state;
154 event_no = event & STM_MSK_EVT_NO;
155 category_no = event & STM_MSK_CTG_NO;
156 area_no = event & STM_MSK_ARA_NO;
158 // Backup previous state
159 g_prv_state = g_crr_state;
161 // Get previous state
162 restriction_state = g_prv_state.layer.restriction.state;
163 apps_state = g_prv_state.layer.apps.state;
164 trans_gear_state = g_prv_state.trans_gear.state;
165 parking_brake_state = g_prv_state.parking_brake.state;
166 accel_pedal_state = g_prv_state.accel_pedal.state;
167 car_state = g_prv_state.car.state;
168 lamp_state = g_prv_state.lamp.state;
169 lightstatus_brake_state = g_prv_state.lightstatus_brake.state;
172 g_crr_state.layer.on_screen.is_changed = STM_FALSE;
173 g_crr_state.layer.restriction.is_changed = STM_FALSE;
174 g_crr_state.layer.apps.is_changed = STM_FALSE;
175 g_crr_state.layer.homescreen.is_changed = STM_FALSE;
176 g_crr_state.trans_gear.is_changed = STM_FALSE;
177 g_crr_state.parking_brake.is_changed = STM_FALSE;
178 g_crr_state.lightstatus_brake.is_changed = STM_FALSE;
179 g_crr_state.accel_pedal.is_changed = STM_FALSE;
180 g_crr_state.car.is_changed = STM_FALSE;
181 g_crr_state.lamp.is_changed = STM_FALSE;
186 case STM_EVT_NO_TRANS_GEAR_N:
187 if (gStmTransGearStateNoN != trans_gear_state) {
188 g_crr_state.trans_gear.state = gStmTransGearStateNoN;
189 g_crr_state.trans_gear.is_changed = STM_TRUE;
192 case STM_EVT_NO_TRANS_GEAR_NOT_N:
193 if (gStmTransGearStateNoNotN != trans_gear_state) {
194 g_crr_state.trans_gear.state = gStmTransGearStateNoNotN;
195 g_crr_state.trans_gear.is_changed = STM_TRUE;
198 case STM_EVT_NO_PARKING_BRAKE_OFF:
199 if (gStmParkingBrakeStateNoOff != parking_brake_state) {
200 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff;
201 g_crr_state.parking_brake.is_changed = STM_TRUE;
204 case STM_EVT_NO_PARKING_BRAKE_ON:
205 if (gStmParkingBrakeStateNoOn != parking_brake_state) {
206 g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn;
207 g_crr_state.parking_brake.is_changed = STM_TRUE;
210 case STM_EVT_NO_ACCEL_PEDAL_OFF:
211 if (gStmAccelPedalStateNoOff != accel_pedal_state) {
212 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff;
213 g_crr_state.accel_pedal.is_changed = STM_TRUE;
216 case STM_EVT_NO_ACCEL_PEDAL_ON:
217 if (gStmAccelPedalStateNoOn != accel_pedal_state) {
218 g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn;
219 g_crr_state.accel_pedal.is_changed = STM_TRUE;
222 case STM_EVT_NO_LAMP_OFF:
223 if (gStmLampStateNoOff != lamp_state) {
224 g_crr_state.lamp.state = gStmLampStateNoOff;
225 g_crr_state.lamp.is_changed = STM_TRUE;
228 case STM_EVT_NO_LAMP_ON:
229 if (gStmLampStateNoOn != lamp_state) {
230 g_crr_state.lamp.state = gStmLampStateNoOn;
231 g_crr_state.lamp.is_changed = STM_TRUE;
234 case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF:
235 if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) {
236 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff;
237 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
240 case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON:
241 if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) {
242 g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn;
243 g_crr_state.lightstatus_brake.is_changed = STM_TRUE;
252 if (g_crr_state.lightstatus_brake.is_changed
253 || g_crr_state.accel_pedal.is_changed) {
254 if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state)
255 && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){
257 if (g_crr_state.parking_brake.is_changed
258 || g_crr_state.trans_gear.is_changed) {
259 if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state)
260 && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){
262 if (gStmCarStateNoRun != car_state) {
263 // Car state is changed stop -> run
264 g_crr_state.car.state = gStmCarStateNoRun;
265 g_crr_state.car.is_changed = STM_TRUE;
267 // Update restriction layer
268 g_prv_restriction_state_car_stop = restriction_state;
269 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
270 g_crr_state.layer.restriction.is_changed = STM_TRUE;
273 g_prv_apps_state_car_stop = apps_state;
274 g_crr_state.layer.apps.state = gStmLayoutNoM1;
275 g_crr_state.layer.apps.is_changed = STM_TRUE;
279 if (gStmCarStateNoStop != car_state) {
280 // Car state is changed run -> stop
281 g_crr_state.car.state = gStmCarStateNoStop;
282 g_crr_state.car.is_changed = STM_TRUE;
284 // Update restriction layer
285 g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop;
286 g_crr_state.layer.restriction.is_changed = STM_TRUE;
289 g_crr_state.layer.apps.state = g_prv_apps_state_car_stop;
290 g_crr_state.layer.apps.is_changed = STM_TRUE;
295 // Set apps/homescreen layer
297 case STM_EVT_NO_ACTIVATE:
298 if (gStmCarStateNoStop == car_state) {
299 switch (category_no) {
300 case STM_CTG_NO_HOMESCREEN:
302 g_crr_state.layer.apps.state = gStmLayoutNoNone;
303 g_crr_state.layer.apps.is_changed = STM_TRUE;
306 g_crr_state.layer.homescreen.state = gStmLayoutNoHs;
307 g_crr_state.layer.homescreen.is_changed = STM_TRUE;
311 case STM_ARA_NO_FULL:
313 switch (apps_state) {
318 g_crr_state.layer.apps.state = gStmLayoutNoMf;
319 g_crr_state.layer.apps.is_changed = STM_TRUE;
323 case STM_ARA_NO_NORMAL:
325 switch (apps_state) {
330 g_crr_state.layer.apps.state = gStmLayoutNoM2;
331 g_crr_state.layer.apps.is_changed = STM_TRUE;
334 g_crr_state.layer.apps.state = gStmLayoutNoM1;
335 g_crr_state.layer.apps.is_changed = STM_TRUE;
338 case STM_ARA_NO_SPLIT_MAIN:
340 switch (apps_state) {
343 g_crr_state.layer.apps.state = gStmLayoutNoS2;
344 g_crr_state.layer.apps.is_changed = STM_TRUE;
353 case STM_CTG_NO_GENERAL:
355 case STM_ARA_NO_NORMAL:
357 switch (apps_state) {
362 g_crr_state.layer.apps.state = gStmLayoutNoG;
363 g_crr_state.layer.apps.is_changed = STM_TRUE;
372 case STM_CTG_NO_SPLITABLE:
374 case STM_ARA_NO_NORMAL:
376 switch (apps_state) {
378 g_crr_state.layer.apps.state = gStmLayoutNoM2;
379 g_crr_state.layer.apps.is_changed = STM_TRUE;
386 g_crr_state.layer.apps.state = gStmLayoutNoS1;
387 g_crr_state.layer.apps.is_changed = STM_TRUE;
391 case STM_ARA_NO_SPLIT_MAIN:
393 switch (apps_state) {
395 g_crr_state.layer.apps.state = gStmLayoutNoS2;
396 g_crr_state.layer.apps.is_changed = STM_TRUE;
399 g_crr_state.layer.apps.state = gStmLayoutNoS2;
400 g_crr_state.layer.apps.is_changed = STM_TRUE;
407 case STM_ARA_NO_SPLIT_SUB:
409 switch (apps_state) {
411 g_crr_state.layer.apps.state = gStmLayoutNoM2;
412 g_crr_state.layer.apps.is_changed = STM_TRUE;
415 g_crr_state.layer.apps.state = gStmLayoutNoM2;
416 g_crr_state.layer.apps.is_changed = STM_TRUE;
419 g_crr_state.layer.apps.state = gStmLayoutNoS2;
420 g_crr_state.layer.apps.is_changed = STM_TRUE;
423 g_crr_state.layer.apps.state = gStmLayoutNoS2;
424 g_crr_state.layer.apps.is_changed = STM_TRUE;
442 case STM_EVT_NO_DEACTIVATE:
443 switch (category_no) {
455 // Set restriction layer
456 if (STM_CTG_NO_RESTRICTION == category_no) {
457 if (STM_EVT_NO_ACTIVATE == event_no) {
458 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
460 case STM_ARA_NO_RESTRICTION_NORMAL:
461 switch (restriction_state) {
462 case gStmLayoutNoNone:
463 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
464 g_crr_state.layer.restriction.is_changed = STM_TRUE;
471 case STM_ARA_NO_RESTRICTION_SPLIT_MAIN:
472 switch (restriction_state) {
473 case gStmLayoutNoNone:
474 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain;
475 g_crr_state.layer.restriction.is_changed = STM_TRUE;
482 case STM_ARA_NO_RESTRICTION_SPLIT_SUB:
483 switch (restriction_state) {
484 case gStmLayoutNoNone:
485 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
486 g_crr_state.layer.restriction.is_changed = STM_TRUE;
499 else if (STM_EVT_NO_DEACTIVATE == event_no) {
500 switch (restriction_state) {
501 case gStmLayoutNoRestriction:
502 case gStmLayoutNoRestrictionSplitMain:
503 case gStmLayoutNoRestrictionSplitSub:
504 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
505 g_crr_state.layer.restriction.is_changed = STM_TRUE;
513 else if (g_crr_state.layer.apps.is_changed) {
514 if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) {
515 if (gStmLayoutNoM2 == g_crr_state.layer.apps.state) {
516 g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub;
517 g_crr_state.layer.restriction.is_changed = STM_TRUE;
519 else if (gStmLayoutNoS1 == g_crr_state.layer.apps.state) {
520 g_crr_state.layer.restriction.state = gStmLayoutNoRestriction;
521 g_crr_state.layer.restriction.is_changed = STM_TRUE;
524 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
525 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
526 g_crr_state.layer.restriction.is_changed = STM_TRUE;
531 if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) {
532 g_crr_state.layer.restriction.state = gStmLayoutNoNone;
533 g_crr_state.layer.restriction.is_changed = STM_TRUE;
538 // Copy current state for return
539 memcpy(state, &g_crr_state, sizeof(g_crr_state));