#include #include "dummy_stm.h" const char* gStmEventName[] = { "activate", "deactivate", "parking_brake_off", "parking_brake_on", "car_stop", "car_run", "timer_expired", "lamp_off", "lamp_on" }; const int gStmEventNo[] = { STM_EVT_NO_ACTIVATE, STM_EVT_NO_DEACTIVATE, STM_EVT_NO_PARKING_BRAKE_OFF, STM_EVT_NO_PARKING_BRAKE_ON, STM_EVT_NO_CAR_STOP, STM_EVT_NO_CAR_RUN, STM_EVT_NO_TIMER_EXPIRED, STM_EVT_NO_LAMP_OFF, STM_EVT_NO_LAMP_ON }; const char* gStmCategoryName[] = { "homescreen", "map", "general", "splitable", "popup", "system_alert", "restriction", }; const int gStmCategoryNo[] = { STM_CTG_NO_HOMESCREEN, STM_CTG_NO_MAP, STM_CTG_NO_GENERAL, STM_CTG_NO_SPLITABLE, STM_CTG_NO_POPUP, STM_CTG_NO_SYSTEM_ALERT, STM_CTG_NO_RESTRICTION, }; const char* gStmAreaName[] = { "full", "normal", "split.main", "split.sub", "onscreen", "restriction.normal", "restriction.split.main", "restriction.split.sub", }; const int gStmAreaNo[] = { STM_ARA_NO_FULL, STM_ARA_NO_NORMAL, STM_ARA_NO_SPLIT_MAIN, STM_ARA_NO_SPLIT_SUB, STM_ARA_NO_ON_SCREEN, STM_ARA_NO_RESTRICTION_NORMAL, STM_ARA_NO_RESTRICTION_SPLIT_MAIN, STM_ARA_NO_RESTRICTION_SPLIT_SUB, }; // String for state const char* gStmParkingBrakeStateNo2Name[] = { "parking_brake_off", "parking_brake_on" }; const char* gStmCarStateNo2Name[] = { "car_stop", "car_run" }; const char* gStmLampStateNo2Name[] = { "lamp_off", "lamp_on" }; const char* gStmLayoutNo2Name[] = { "none", "pu", "sa", "m1", "m2", "mf", "s1", "s2", "g", "hs", "restriction", "restriction.split.main", "restriction.split.sub", }; stm_state_t g_crr_state; stm_state_t g_prv_state; int g_prv_apps_state_car_stop = 0; void stmInitialize() { // Initialize previous state memset(&g_prv_state, 0, sizeof(g_prv_state)); g_prv_state.layer.on_screen.state = gStmLayoutNoNone; g_prv_state.layer.restriction.state = gStmLayoutNoNone; g_prv_state.layer.apps.state = gStmLayoutNoNone; g_prv_state.layer.homescreen.state = gStmLayoutNoNone; g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn; g_prv_state.car.state = gStmCarStateNoStop; g_prv_state.lamp.state = gStmLampStateNoOff; // Initialize current state g_crr_state = g_prv_state; } int stmTransitionState(int event, stm_state_t* state) { int event_no, category_no, area_no; int restriction_state, apps_state, parking_brake_state, car_state, lamp_state; event_no = event & STM_MSK_EVT_NO; category_no = event & STM_MSK_CTG_NO; area_no = event & STM_MSK_ARA_NO; // Backup previous state g_prv_state = g_crr_state; // Get previous state restriction_state = g_prv_state.layer.restriction.state; apps_state = g_prv_state.layer.apps.state; parking_brake_state = g_prv_state.parking_brake.state; car_state = g_prv_state.car.state; lamp_state = g_prv_state.lamp.state; // Clear flags g_crr_state.layer.on_screen.is_changed = STM_FALSE; g_crr_state.layer.restriction.is_changed = STM_FALSE; g_crr_state.layer.apps.is_changed = STM_FALSE; g_crr_state.layer.homescreen.is_changed = STM_FALSE; g_crr_state.parking_brake.is_changed = STM_FALSE; g_crr_state.car.is_changed = STM_FALSE; g_crr_state.lamp.is_changed = STM_FALSE; switch (event_no) { case STM_EVT_NO_ACTIVATE: switch (category_no) { case STM_CTG_NO_HOMESCREEN: // Apps layer g_crr_state.layer.apps.state = gStmLayoutNoNone; g_crr_state.layer.apps.is_changed = STM_TRUE; // Homescreen layer g_crr_state.layer.homescreen.state = gStmLayoutNoHs; g_crr_state.layer.homescreen.is_changed = STM_TRUE; break; case STM_CTG_NO_MAP: switch (area_no) { case STM_ARA_NO_FULL: // Apps layer switch (apps_state) { case gStmLayoutNoMf: // nop break; default: g_crr_state.layer.apps.state = gStmLayoutNoMf; g_crr_state.layer.apps.is_changed = STM_TRUE; break; } break; case STM_ARA_NO_NORMAL: // Apps layer switch (apps_state) { case gStmLayoutNoM1: // nop break; case gStmLayoutNoS1: g_crr_state.layer.apps.state = gStmLayoutNoM2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; default: g_crr_state.layer.apps.state = gStmLayoutNoM1; g_crr_state.layer.apps.is_changed = STM_TRUE; } break; case STM_ARA_NO_SPLIT_MAIN: // Apps layer switch (apps_state) { case gStmLayoutNoS1: case gStmLayoutNoS2: g_crr_state.layer.apps.state = gStmLayoutNoS2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; default: // nop break; } break; } break; case STM_CTG_NO_GENERAL: switch (area_no) { case STM_ARA_NO_NORMAL: // Apps layer switch (apps_state) { case gStmLayoutNoMf: // nop break; default: g_crr_state.layer.apps.state = gStmLayoutNoG; g_crr_state.layer.apps.is_changed = STM_TRUE; break; } break; default: // nop break; } break; case STM_CTG_NO_SPLITABLE: switch (area_no) { case STM_ARA_NO_NORMAL: // Apps layer switch (apps_state) { case gStmLayoutNoM1: g_crr_state.layer.apps.state = gStmLayoutNoM2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; case gStmLayoutNoMf: case gStmLayoutNoS1: // nop break; default: g_crr_state.layer.apps.state = gStmLayoutNoS1; g_crr_state.layer.apps.is_changed = STM_TRUE; break; } break; case STM_ARA_NO_SPLIT_MAIN: // Apps layer switch (apps_state) { case gStmLayoutNoS1: g_crr_state.layer.apps.state = gStmLayoutNoS2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; case gStmLayoutNoS2: g_crr_state.layer.apps.state = gStmLayoutNoS2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; default: // nop break; } break; case STM_ARA_NO_SPLIT_SUB: // Apps layer switch (apps_state) { case gStmLayoutNoM1: g_crr_state.layer.apps.state = gStmLayoutNoM2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; case gStmLayoutNoM2: g_crr_state.layer.apps.state = gStmLayoutNoM2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; case gStmLayoutNoS1: g_crr_state.layer.apps.state = gStmLayoutNoS2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; case gStmLayoutNoS2: g_crr_state.layer.apps.state = gStmLayoutNoS2; g_crr_state.layer.apps.is_changed = STM_TRUE; break; default: // nop break; } break; default: // nop break; } break; case STM_CTG_NO_RESTRICTION: switch (area_no) { case STM_ARA_NO_RESTRICTION_NORMAL: // restriction Layer switch (restriction_state) { case gStmLayoutNoNone: g_crr_state.layer.restriction.state = gStmLayoutNoRestriction; g_crr_state.layer.restriction.is_changed = STM_TRUE; break; default: // nop break; } break; case STM_ARA_NO_RESTRICTION_SPLIT_MAIN: // restriction Layer switch (restriction_state) { case gStmLayoutNoNone: g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitMain; g_crr_state.layer.restriction.is_changed = STM_TRUE; break; default: // nop break; } break; case STM_ARA_NO_RESTRICTION_SPLIT_SUB: // restriction Layer switch (restriction_state) { case gStmLayoutNoNone: g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub; g_crr_state.layer.restriction.is_changed = STM_TRUE; break; default: // nop break; } break; default: // nop break; } break; default: // nop break; } case STM_EVT_NO_DEACTIVATE: switch (category_no) { case STM_CTG_NO_RESTRICTION: // restriction Layer switch (restriction_state) { case gStmLayoutNoRestriction: case gStmLayoutNoRestrictionSplitMain: case gStmLayoutNoRestrictionSplitSub: g_crr_state.layer.restriction.state = gStmLayoutNoNone; g_crr_state.layer.restriction.is_changed = STM_TRUE; break; default: // nop break; } default: // nop break; } break; case STM_EVT_NO_PARKING_BRAKE_OFF: if (gStmParkingBrakeStateNoOff != parking_brake_state) { g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOff; g_crr_state.parking_brake.is_changed = STM_TRUE; } break; case STM_EVT_NO_PARKING_BRAKE_ON: if (gStmParkingBrakeStateNoOn != parking_brake_state) { g_crr_state.parking_brake.state = gStmParkingBrakeStateNoOn; g_crr_state.parking_brake.is_changed = STM_TRUE; } break; case STM_EVT_NO_CAR_STOP: if (gStmCarStateNoStop != car_state) { g_crr_state.layer.apps.state = g_prv_apps_state_car_stop; g_crr_state.layer.apps.is_changed = STM_TRUE; g_crr_state.car.state = gStmCarStateNoStop; g_crr_state.car.is_changed = STM_TRUE; } break; case STM_EVT_NO_CAR_RUN: if (gStmCarStateNoRun != car_state) { g_prv_apps_state_car_stop = apps_state; g_crr_state.layer.apps.state = gStmLayoutNoM1; g_crr_state.layer.apps.is_changed = STM_TRUE; g_crr_state.car.state = gStmCarStateNoRun; g_crr_state.car.is_changed = STM_TRUE; } break; case STM_EVT_NO_LAMP_OFF: if (gStmLampStateNoOff != lamp_state) { g_crr_state.lamp.state = gStmLampStateNoOff; g_crr_state.lamp.is_changed = STM_TRUE; } break; case STM_EVT_NO_LAMP_ON: if (gStmLampStateNoOn != lamp_state) { g_crr_state.lamp.state = gStmLampStateNoOn; g_crr_state.lamp.is_changed = STM_TRUE; } break; default: // nop break; } // Copy current state for return memcpy(state, &g_crr_state, sizeof(g_crr_state)); return 0; }