States fsm_going_up(system_state_t* system_state, States fsm_previous_state){ if (elev_get_stop_signal()){ return stop; } system_state->next_floor = system_state->current_floor + system_state->motor_direction; elev_set_door_open_lamp(0); elev_set_motor_direction(DIRN_UP); check_cmd_buttons(system_state); check_call_buttons(system_state); check_floor(system_state); if (elev_get_floor_sensor_signal() >= 0) { elev_set_floor_indicator(system_state->current_floor); if (should_stop(system_state, system_state->current_floor)){ elev_set_direction(system_state, 0); orders_clearAt(system_state, system_state->current_floor); reset_button_indicators(system_state); return door_open; } } return going_up; }
static void sse2_test (void) { check_round (); check_rint (); check_floor (); check_ceil (); check_trunc (); }
States fsm_door_open(system_state_t* system_state, States fsm_previous_state){ elev_set_direction(system_state, 0); elev_set_door_open_lamp(1); if (!fsm_pause_3_sec(system_state)) return stop; elev_set_door_open_lamp(0); check_floor(system_state); if (fsm_previous_state == idle){ elev_set_button_lamp (BUTTON_COMMAND, system_state->current_floor,0); orders_clearAt(system_state, system_state->current_floor); if (system_state->current_floor < 3) elev_set_button_lamp (BUTTON_CALL_UP, system_state->current_floor,0); if (system_state->current_floor > 0) elev_set_button_lamp (BUTTON_CALL_DOWN, system_state->current_floor,0); return idle; } else if (fsm_previous_state == going_down) { for (int i = system_state->current_floor; i >= 0; --i){ if (system_state->elev_active_floors[i] || system_state->elev_called_floors_up[i] || system_state->elev_called_floors_down[i]){ system_state->motor_direction = -1; return going_down; } } return idle; } else if (fsm_previous_state == going_up){ for (int i = system_state->current_floor; i < N_FLOORS; ++i){ if (system_state->elev_active_floors[i] || system_state->elev_called_floors_up[i] || system_state->elev_called_floors_down[i]){ system_state->motor_direction = 1; return going_up; } } } return idle; }