#include #include "dummy_stm.h" const char* gStmEventName[] = { "activate", "deactivate", "trans_gear_neutral", "trans_gear_not_neutral", "parking_brake_off", "parking_brake_on", "accel_pedal_off", "accel_pedal_on", "timer_expired", "lamp_off", "lamp_on", "lightstatus_brake_off", "lightstatus_brake_on", }; const int gStmEventNo[] = { STM_EVT_NO_ACTIVATE, STM_EVT_NO_DEACTIVATE, STM_EVT_NO_TRANS_GEAR_N, STM_EVT_NO_TRANS_GEAR_NOT_N, STM_EVT_NO_PARKING_BRAKE_OFF, STM_EVT_NO_PARKING_BRAKE_ON, STM_EVT_NO_ACCEL_PEDAL_OFF, STM_EVT_NO_ACCEL_PEDAL_ON, STM_EVT_NO_TIMER_EXPIRED, STM_EVT_NO_LAMP_OFF, STM_EVT_NO_LAMP_ON, STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF, STM_EVT_NO_LIGHTSTATUS_BRAKE_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* gStmTransGearStateNo2Name[] = { "trans_gear_neutral", "trans_gear_not_neutral" }; const char* gStmParkingBrakeStateNo2Name[] = { "parking_brake_off", "parking_brake_on" }; const char* gStmAccelPedalStateNo2Name[] = { "accel_pedal_off", "accel_pedal_on" }; const char* gStmCarStateNo2Name[] = { "car_stop", "car_run" }; const char* gStmLampStateNo2Name[] = { "lamp_off", "lamp_on" }; const char* gStmLightstatusBrakeStateNo2Name[] = { "lightstatus_brake_off", "lightstatus_brake_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_restriction_state_car_stop = 0; int g_prv_apps_state_car_stop = 0; int g_map_is_activated = STM_FALSE; 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.trans_gear.state = gStmTransGearStateNoN; g_prv_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn; g_prv_state.accel_pedal.state = gStmAccelPedalStateNoOff; g_prv_state.car.state = gStmCarStateNoStop; g_prv_state.lamp.state = gStmLampStateNoOff; g_prv_state.parking_brake.state = gStmParkingBrakeStateNoOn; // 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; int trans_gear_state, parking_brake_state, lightstatus_brake_state, accel_pedal_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; trans_gear_state = g_prv_state.trans_gear.state; parking_brake_state = g_prv_state.parking_brake.state; accel_pedal_state = g_prv_state.accel_pedal.state; car_state = g_prv_state.car.state; lamp_state = g_prv_state.lamp.state; lightstatus_brake_state = g_prv_state.lightstatus_brake.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.trans_gear.is_changed = STM_FALSE; g_crr_state.parking_brake.is_changed = STM_FALSE; g_crr_state.lightstatus_brake.is_changed = STM_FALSE; g_crr_state.accel_pedal.is_changed = STM_FALSE; g_crr_state.car.is_changed = STM_FALSE; g_crr_state.lamp.is_changed = STM_FALSE; // Set car state switch (event_no) { case STM_EVT_NO_TRANS_GEAR_N: if (gStmTransGearStateNoN != trans_gear_state) { g_crr_state.trans_gear.state = gStmTransGearStateNoN; g_crr_state.trans_gear.is_changed = STM_TRUE; } break; case STM_EVT_NO_TRANS_GEAR_NOT_N: if (gStmTransGearStateNoNotN != trans_gear_state) { g_crr_state.trans_gear.state = gStmTransGearStateNoNotN; g_crr_state.trans_gear.is_changed = STM_TRUE; } 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_ACCEL_PEDAL_OFF: if (gStmAccelPedalStateNoOff != accel_pedal_state) { g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOff; g_crr_state.accel_pedal.is_changed = STM_TRUE; } break; case STM_EVT_NO_ACCEL_PEDAL_ON: if (gStmAccelPedalStateNoOn != accel_pedal_state) { g_crr_state.accel_pedal.state = gStmAccelPedalStateNoOn; g_crr_state.accel_pedal.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; case STM_EVT_NO_LIGHTSTATUS_BRAKE_OFF: if (gStmLightstatusBrakeStateNoOff != lightstatus_brake_state) { g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOff; g_crr_state.lightstatus_brake.is_changed = STM_TRUE; } break; case STM_EVT_NO_LIGHTSTATUS_BRAKE_ON: if (gStmLightstatusBrakeStateNoOn != lightstatus_brake_state) { g_crr_state.lightstatus_brake.state = gStmLightstatusBrakeStateNoOn; g_crr_state.lightstatus_brake.is_changed = STM_TRUE; } break; default: // nop break; } #if 1 // FOR ALS if (g_crr_state.lightstatus_brake.is_changed || g_crr_state.accel_pedal.is_changed) { if ((gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) && (gStmAccelPedalStateNoOn == g_crr_state.accel_pedal.state)){ #else if (g_crr_state.parking_brake.is_changed || g_crr_state.trans_gear.is_changed) { if ((gStmParkingBrakeStateNoOff == g_crr_state.parking_brake.state) && (gStmTransGearStateNoNotN == g_crr_state.trans_gear.state)){ #endif if (gStmCarStateNoRun != car_state) { // Car state is changed stop -> run g_crr_state.car.state = gStmCarStateNoRun; g_crr_state.car.is_changed = STM_TRUE; // Update restriction layer g_prv_restriction_state_car_stop = restriction_state; g_crr_state.layer.restriction.state = gStmLayoutNoNone; g_crr_state.layer.restriction.is_changed = STM_TRUE; // Update apps layer g_prv_apps_state_car_stop = apps_state; if (STM_TRUE == g_map_is_activated) { g_crr_state.layer.apps.state = gStmLayoutNoM1; g_crr_state.layer.apps.is_changed = STM_TRUE; } } } else { if (gStmCarStateNoStop != car_state) { // Car state is changed run -> stop g_crr_state.car.state = gStmCarStateNoStop; g_crr_state.car.is_changed = STM_TRUE; // Update restriction layer g_crr_state.layer.restriction.state = g_prv_restriction_state_car_stop; g_crr_state.layer.restriction.is_changed = STM_TRUE; // Update apps layer if (STM_TRUE == g_map_is_activated) { g_crr_state.layer.apps.state = g_prv_apps_state_car_stop; g_crr_state.layer.apps.is_changed = STM_TRUE; } } } } // Set apps/homescreen layer switch (event_no) { case STM_EVT_NO_ACTIVATE: if (gStmCarStateNoStop == car_state) { 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; default: // nop break; } break; } case STM_EVT_NO_DEACTIVATE: switch (category_no) { default: // nop break; } break; default: // nop break; } // Set restriction layer if (STM_CTG_NO_RESTRICTION == category_no) { if (STM_EVT_NO_ACTIVATE == event_no) { if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) { switch (area_no) { case STM_ARA_NO_RESTRICTION_NORMAL: switch (restriction_state) { case gStmLayoutNoNone: if (g_crr_state.layer.apps.state == gStmLayoutNoS1) { 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: 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: switch (restriction_state) { case gStmLayoutNoNone: if (g_crr_state.layer.apps.state == gStmLayoutNoM2) { g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub; g_crr_state.layer.restriction.is_changed = STM_TRUE; } break; default: // nop break; } break; default: // nop break; } } } else if (STM_EVT_NO_DEACTIVATE == event_no) { 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; } } } else if (g_crr_state.layer.apps.is_changed) { if (gStmLightstatusBrakeStateNoOff == g_crr_state.lightstatus_brake.state) { if (gStmLayoutNoM2 == g_crr_state.layer.apps.state) { g_crr_state.layer.restriction.state = gStmLayoutNoRestrictionSplitSub; g_crr_state.layer.restriction.is_changed = STM_TRUE; } else if (gStmLayoutNoS1 == g_crr_state.layer.apps.state) { g_crr_state.layer.restriction.state = gStmLayoutNoRestriction; g_crr_state.layer.restriction.is_changed = STM_TRUE; } else { if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) { g_crr_state.layer.restriction.state = gStmLayoutNoNone; g_crr_state.layer.restriction.is_changed = STM_TRUE; } } } else { if (gStmLayoutNoNone != g_crr_state.layer.restriction.state) { g_crr_state.layer.restriction.state = gStmLayoutNoNone; g_crr_state.layer.restriction.is_changed = STM_TRUE; } } } // Copy current state for return memcpy(state, &g_crr_state, sizeof(g_crr_state)); if ((STM_FALSE == g_map_is_activated) && (STM_TRUE == g_crr_state.layer.apps.is_changed) && ((gStmLayoutNoM1 == g_crr_state.layer.apps.state) || (gStmLayoutNoM2 == g_crr_state.layer.apps.state) || (gStmLayoutNoMf == g_crr_state.layer.apps.state))) { g_map_is_activated = STM_TRUE; } return 0; }