int order() { int i; int isOrder = 0; for ( i = 0; i < N_FLOORS; ++i ) { if ( elev_get_button_signal( BUTTON_COMMAND, i ) ) { addOrder( BUTTON_COMMAND, i ); isOrder = 1; } } if ( !isStopped() && !isStoppedObstruction() ) { for ( i=0; i < (N_FLOORS-1); ++i ) { if ( elev_get_button_signal( BUTTON_CALL_UP, i ) && !isStopped() ) { addOrder( BUTTON_CALL_UP, i ); isOrder = 1; } } for ( i = 1; i < (N_FLOORS); ++i ) { if ( elev_get_button_signal( BUTTON_CALL_DOWN, i ) && !isStopped() ) { addOrder( BUTTON_CALL_DOWN, i ); isOrder = 1; } } } return isOrder; }
void Driver::event_generator() { /* Poll for floor signal */ int floor_signal = elev_get_floor_sensor_signal(); poll(last_floor_signal, floor_signal, -1, FloorSignalEvent(floor_signal)); for (int floor = 0; floor < FLOORS; floor++) { for (auto button_type : {ButtonType::UP, ButtonType::DOWN}) { /* first floor doesn't have a down button and top floor doesn't have an up button */ if ((floor == 0 && button_type == ButtonType::DOWN) || (floor == 3 && button_type == ButtonType::UP)) { continue; } int btn_index = static_cast<int>(button_type); int button_signal = elev_get_button_signal(static_cast<elev_button_type_t>(btn_index), floor); poll(last_button_signals[floor][btn_index], button_signal, 0, ExternalButtonEvent(floor, button_type)); } /* Internal buttons: */ int button_signal = elev_get_button_signal(BUTTON_COMMAND, floor); poll(last_button_signals[floor][2], button_signal, 0, InternalButtonEvent(floor)); } }
void check_call_buttons(system_state_t* system_state){ for (int i = 1; i < N_FLOORS; ++i){ if (elev_get_button_signal(BUTTON_CALL_DOWN,i)){ system_state->elev_called_floors_down[i] = 1; elev_set_button_lamp(BUTTON_CALL_DOWN, i, 1); } } for (int i = 0; i < N_FLOORS - 1; ++i){ if (elev_get_button_signal(BUTTON_CALL_UP,i)){ system_state->elev_called_floors_up[i] = 1; elev_set_button_lamp(BUTTON_CALL_UP, i, 1); } } }
void run_elevator(){ // Elevator is started and state is unknown. // Initialize timer. timer = clock(); current_state = UNDEF; initialize_elevator(); // Elevator is now at some floor and ready for orders. while(1){ // Handles io-signals, (sets/clears lights etc.) io_signals(); // Calls the state machine switch function. state_machine(); // If ... exit the main loop and terminate the program. if (elev_get_button_signal(BUTTON_CALL_UP,0) && current_state == EMERGENCY){ elev_set_speed(0); break; } } initialize_elevator(); }
void button_check(){ Message message_send; elev_button_type_t button_type; int floor; int button_is_pressed=0; puts("Button check thread started"); while (1){ for(floor = 0;floor<N_FLOORS;floor++){ for(button_type = 0;button_type<N_BUTTONS;button_type++){ if(elev_get_button_signal(button_type,floor)==1){ if(button_type==BUTTON_INSIDE){ elev_set_button_lamp(BUTTON_INSIDE,floor,1); elevator.queue[floor]=1; } pthread_mutex_lock(&mutex); button_is_pressed=1; message_send.button.floor=floor; message_send.button.type=button_type; pthread_mutex_unlock(&mutex); while(elev_get_button_signal(button_type,floor)); break; } } if(button_is_pressed) break; } if(button_is_pressed){ puts("Button is pressed, creating thread\n"); button_is_pressed=0; char transmit[BUFSIZE]; serialization(BUTTON_CHECK, message_send, transmit); pthread_t message_send_thread; pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit); if(message_send.button.type==BUTTON_INSIDE){ FILE *fp; fp = fopen("local_order_queue.txt", "w+"); fprintf(fp,"%d %d %d %d", elevator.queue[0], elevator.queue[1], elevator.queue[2], elevator.queue[3] ); fclose(fp); } } if(!connection){ break; } } }
void check_cmd_buttons(system_state_t* system_state){ for (int i = 0; i < N_FLOORS; ++i){ if(elev_get_button_signal(BUTTON_COMMAND, i)){ system_state->elev_active_floors[i] = 1; elev_set_button_lamp(BUTTON_COMMAND, i, 1); } } }
/** * check_buttons: * * Checks all UI buttons and updates the order queue. * * Returns: 1 if new orders are present, or 0. * */ int ui_check_buttons(void) { for (int button = 0; button < N_BUTTONS; button++) { for (int floor = 0; floor < N_FLOORS; floor++) { if (elev_get_button_signal(button, floor)) { elev_set_button_lamp(button, floor, 1); add_order(button, floor); } } } }
void check_internal_orders(){ //checks if we have an order, and sets the light; for (int i = 0; i < N_FLOORS; i++){ int buttonSignal = elev_get_button_signal(BUTTON_COMMAND, i); if(buttonSignal == 1){ internalButtonVector[i] = buttonSignal; elev_set_button_lamp(BUTTON_COMMAND, i, 1); } } write_to_internalOrdersText(); }
void* check_external_orders(){ //Only supports external orders on the machine return 1 if there are external orders int buttonSignal; while (1){ if(connectStatus == 1){ for (int i = 0; i < N_FLOORS; i++){ for (int x = 0; x < 2; x++){ buttonSignal = elev_get_button_signal(x, i); if(buttonSignal == 1 && externalOrdersMatrix[i][x] != 1){ udp_send_external_order_s2m(i, x); // externalOrdersMatrix[i][x] = 1; } } } // sleep(0.5); } } }
States fsm_idle_state(system_state_t* system_state, States fsm_previous_state){ int floor = elev_get_floor_sensor_signal(); system_state->next_floor = system_state->prev_floor + system_state->motor_direction; if (elev_get_stop_signal()){ return stop; } if (floor == 0){ if (elev_get_button_signal(BUTTON_COMMAND, floor) || elev_get_button_signal(BUTTON_CALL_UP, floor)){ return door_open; } } else if (floor == 3){ if (elev_get_button_signal(BUTTON_COMMAND, floor) || elev_get_button_signal(BUTTON_CALL_DOWN, floor)){ return door_open; } } else{ if (elev_get_button_signal(BUTTON_COMMAND, floor) || elev_get_button_signal(BUTTON_CALL_UP, floor) || elev_get_button_signal(BUTTON_CALL_DOWN, floor)){ return door_open; } } check_cmd_buttons(system_state); for (int i = 0; i < N_FLOORS; ++i){ if (system_state->elev_active_floors[i] == 1){ if (i < floor){ system_state->motor_direction = -1; return going_down; } else if (i > floor){ system_state->motor_direction = 1; return going_up; } } } check_call_buttons(system_state); for (int i=0; i<N_FLOORS;++i){ if (system_state->elev_called_floors_down[i] || system_state->elev_called_floors_up[i]){ if (i < floor){ system_state->motor_direction = -1; return going_down; } else if (i > floor){ system_state->motor_direction = 1; return going_up; } } } return idle; }
/* * Class: no_ntnu_stud_torbjovn_comedielevator_NativeInterface * Method: elev_get_button_signal * Signature: (II)I */ JNIEXPORT jint JNICALL Java_no_ntnu_stud_torbjovn_comedielevator_NativeInterface_elev_1get_1button_1signal (JNIEnv * env, jobject obj, jint button, jint floor) { return elev_get_button_signal(getButtonType(button), floor); }
int main() { if (!elev_init()) { printf(__FILE__ ": Unable to initialize elevator hardware\n"); return 1; } slettAlleOrdre(); elev_set_speed(0); initHeisstyring(); int forgjeEtasje = 0; int etasje; bool forgjeStopp; bool stopp; bool forgjeObstruksjon; bool obstruksjon; bool forgjeOpp[4]; bool opp[4]; bool forgjeInne[4]; bool inne[4]; bool forgjeNed[4]; bool ned[4]; while(1) { stopp = elev_get_stop_signal(); obstruksjon = elev_get_obstruction_signal(); etasje = elev_get_floor_sensor_signal(); for(int i = 0; i < N_FLOORS; i++) // poller masse, fix { if(i != N_FLOORS-1) opp[i] = elev_get_button_signal(BUTTON_CALL_UP, i); if(i != 0) ned[i] = elev_get_button_signal(BUTTON_CALL_DOWN, i); inne[i] = elev_get_button_signal(BUTTON_COMMAND, i); } for(int i = 0; i < N_FLOORS; i++) { if(opp[i] && !forgjeOpp[i]) leggTilOrdre(i, false, true); if(ned[i] && !forgjeNed[i]) leggTilOrdre(i, false, false); if(inne[i] && !forgjeInne[i]) leggTilOrdre(i, true, true); forgjeOpp[i] = opp[i]; forgjeNed[i] = ned[i]; forgjeInne[i] = inne[i]; } if(harTimetUt()) timeOut(); if (etasje != -1 && etasje != forgjeEtasje) { elev_set_floor_indicator(etasje); etasjeAnkommet(etasje); forgjeEtasje = etasje; } if(obstruksjon && !forgjeObstruksjon) { forgjeObstruksjon = obstruksjon; forgjeEtasje = -1; if(obstruksjon) obstruksjonPa(); else obstruksjonAv(); } if(stopp && !forgjeStopp) { forgjeStopp = stopp; forgjeEtasje = -1; if(stopp) nodStopp(); } } return 0; }