int start() { unsigned short character = 0x00; int ipc_status; message msg; int irq_set_kb = kb_subscribe_int(); int irq_set_timer = timer_subscribe_int(); int irq_set_mouse = mouse_subscribe_int(); int r; unsigned char packet[3]; unsigned short counter = 0; space_invaders_font = font_init("spaceinvader_font_transparent.bmp"); srand(1); options_load(); mouse_init(); init_state(); highscore_load(); vg_init(VBE_VIDEO_MODE); while (1) { //TODO change condition /* Get a request message. */ if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) { printf("driver_receive failed with: %d", r); continue; } if (is_ipc_notify(ipc_status)) { /* received notification */ switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: /* hardware interrupt notification */ if (msg.NOTIFY_ARG & irq_set_kb) { /* keyboard interrupt */ character = kb_int_handler(); if (character != KB_2BYTE_SCODE) kb_event_handler(character); } if (msg.NOTIFY_ARG & irq_set_mouse){ /* mouse interrupt */ mouse_int_handler(counter, packet); if(packet[0] != MOUSE_ACK && (packet[0] & BIT(3))) counter++; if(counter == 3){ counter = 0; mouse_event_handler(packet); } } if (msg.NOTIFY_ARG & irq_set_timer){ /* timer interrupt */ timer_int_handler(); } break; default: break; /* no other notifications expected: do nothing */ } } else { /* received a standard message, not a notification */ /* no standard messages expected: do nothing */ } } return 0; }
int main_menu() { continue_condition = true; fade_condition = false; function_to_call = NULL; darken = 127; int failure = 0; initialize_main_menu_buttons(); int ipc_status; message msg; int r; char * display_name = (char*)malloc(sizeof(char) * strlen("Player name: ")+MAX_PLAYER_NAME_LENGTH); strcpy(display_name, "Player name: "); display_name = strcat(display_name, get_program_playername()); if(!failure){ do{ /* Get a request message. */ if ( (r = driver_receive(ANY, &msg, &ipc_status)) != 0 ) { printf("driver_receive failed with: %d", r); continue; } if (is_ipc_notify(ipc_status)) { /* received notification */ switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: /* hardware interrupt notification */ if (msg.NOTIFY_ARG & get_kbd_irq_set()){ /* subscribed kbd interrupt */ kbd_int_handler(); } if (msg.NOTIFY_ARG & get_rtc_irq_set()) { /* subscribed timer interrupt */ if(rtc_ih()) failure = 1; getDateString(get_date_str_ptr()); } if(msg.NOTIFY_ARG & get_timer_irq_set()){ timer_int_handler(); main_menu_render(); } if (msg.NOTIFY_ARG & get_mouse_irq_set()) { /* subscribed timer interrupt */ mouse_int_handler(); } break; default: break; /* no other notifications expected: do nothing */ } } else {/* received a standard message, not a notification */ /* no standard messages expected: do nothing */ } if(mouse_is_updated()) { assign_mouse(get_previous_mouse(), get_mouse()); assign_mouse(get_mouse(), get_mouse_state()); main_menu_mouse_event(get_previous_mouse(), get_mouse()); move_cursor(get_cursor(), get_mouse()->coords); } } while(continue_condition); } return failure; }
int test_packet(unsigned short cnt) { unsigned long mouse_byte; int ipc_status, loops = 0,contador = 0; message msg; unsigned char packets[3]; short irq_set = BIT(mouse_subscribe_int()); enable_packets(); while (loops != cnt) { /* Get a request message. */ if (driver_receive(ANY, &msg, &ipc_status) != 0) { printf("driver_receive failed with: %d"); continue; } if (is_ipc_notify(ipc_status)) { /* received notification */ switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: /* hardware interrupt notification */ if (msg.NOTIFY_ARG & irq_set) { mouse_byte = mouse_int_handler(); if (contador == 0) { if (!first_byte(mouse_byte)) { contador = 0; continue; } } packets[contador] = mouse_byte; if (contador == 2) { contador = 0; print_packet(packets); loops++; continue; } contador++; } break; default: break; /* no other notifications expected: do nothing */ } } else { /* received a standard message, not a notification */ /* no standard messages expected: do nothing */ } } return mouse_unsubscribe_int(); }
int mp_lobby() { int failure = 0; if((set_com1_irq_set(generic_ser_subscribe_int_tx_rx(COM1))) < 0) {//subscribe interrupts printf("mp_lobby(): generic_ser_subscribe_int_tx_rx() failed \n"); failure = 1; } if(SET_COMMUNICATION_PARAM()) { printf("ser_set() failed\n"); return 1; } initialize_lobby_buttons(); set_role(SEARCHING); lobby_state = NOT_READY; enable_per_second_alarm(on_rtc_alarm_int_transmission); if(im_message_log != NULL) { size_t del_i; for(del_i = 0 ; del_i < size(im_message_log); del_i++) { free(*(char**)at(im_message_log, del_i)); } delete_vector_t(im_message_log); } im_message_log = new_vector_t(sizeof(char*)); memset(current_im, 0, sizeof(char)*IM_MESSAGE_MAX); current_im_index = 0; draw_im_index = 0; int wait = 0; function_to_call = NULL; continue_condition = true; fade_condition = false; darken = FADE_MAX; int ipc_status; message msg; int r; set_program_player2name((char*)malloc(sizeof(char)*MAX_PLAYER_NAME_LENGTH+1)); if(get_program_playername2() == NULL) return 1; memset(get_program_playername2(),0,sizeof(char)*MAX_PLAYER_NAME_LENGTH+1); size_t next_char_index = 0; char last_char = 0; if(!failure){ do{ /* Get a request message. */ if ( (r = driver_receive(ANY, &msg, &ipc_status)) != 0 ) { printf("driver_receive failed with: %d", r); continue; } if (is_ipc_notify(ipc_status)) { /* received notification */ switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: /* hardware interrupt notification */ if (msg.NOTIFY_ARG & get_com1_irq_set()) { /* subscribed interrupt */ if(ser_ih(COM1)) failure = 1; } if (msg.NOTIFY_ARG & get_kbd_irq_set()){ /* subscribed kbd interrupt */ kbd_int_handler(); if(get_scancode() == ESC_BREAK) { lobby_state = NOT_READY; fade_condition = true; transmit_message(MES_BYE); } if(get_role() == SERVER || get_role() == CLIENT) { if(get_scancode() == ENTER_MAKE && current_im_index != 0) { current_im_index = 0; transmit_protocol(current_im, TYPE_STRING, strlen(current_im)+1); char* temp = (char*) calloc(IM_MESSAGE_MAX + 4,1); strcpy(temp, "me: "); strcat(temp,current_im); push_back(im_message_log, &temp); memset(current_im, 0, IM_MESSAGE_MAX); memset(transmission_message,0,IM_MESSAGE_MAX+4); } else { int action; action = process_input(get_scancode(), &last_char); if(action == CHAR_RECEIVED) { if(current_im_index < IM_MESSAGE_MAX -1) { current_im[current_im_index] = last_char; current_im_index++; } } else if(action == BACKSPACE_MAKE) { if(current_im_index > 0) { current_im_index--; current_im[current_im_index] = '\0'; } } } } } if (msg.NOTIFY_ARG & get_rtc_irq_set()) { /* subscribed timer interrupt */ if(rtc_ih()) failure = 1; getDateString(get_date_str_ptr()); } if(msg.NOTIFY_ARG & get_timer_irq_set()){ timer_int_handler(); mp_lobby_render(); //establish_connection_transmission(); } if (msg.NOTIFY_ARG & get_mouse_irq_set()) { /* subscribed timer interrupt */ mouse_int_handler(); } break; default: break; /* no other notifications expected: do nothing */ } } else { } establish_connection_reception(); if(mouse_is_updated()) { assign_mouse(get_previous_mouse(), get_mouse()); assign_mouse(get_mouse(), get_mouse_state()); if(get_role() == SERVER || get_role() == CLIENT) lobby_mouse_event(get_previous_mouse(), get_mouse()); move_cursor(get_cursor(), get_mouse()->coords); } } while(continue_condition); } if(im_message_log != NULL) { size_t del_i; for(del_i = 0 ; del_i < size(im_message_log); del_i++) { free(*(char**)at(im_message_log, del_i)); } delete_vector_t(im_message_log); im_message_log = NULL; } if(generic_ser_unsubscribe_int_tx_rx(COM1)) {//unsubscribe interrupts printf("ser_int_receive(): generic_ser_unsubscribe_int() failed \n"); failure = 1; } disable_per_second_alarm(); continue_condition = true; fade_condition = false; darken = FADE_MAX; return 0; }
int get_player_name() { continue_condition = true; fade_condition = false; darken = FADE_MAX; int failure = 0; int ipc_status; message msg; int r; if(get_program_playername() == NULL) { if(set_program_playername((char*)malloc(sizeof(char)*MAX_PLAYER_NAME_LENGTH)) ==NULL)return 1; memset(get_program_playername(),0,sizeof(char)*MAX_PLAYER_NAME_LENGTH); } size_t next_char_index = strlen(get_program_playername()); char last_char = 0; if(!failure){ do{ /* Get a request message. */ if ( (r = driver_receive(ANY, &msg, &ipc_status)) != 0 ) { printf("driver_receive failed with: %d", r); continue; } if (is_ipc_notify(ipc_status)) { /* received notification */ switch (_ENDPOINT_P(msg.m_source)) { case HARDWARE: /* hardware interrupt notification */ if (msg.NOTIFY_ARG & get_kbd_irq_set()){ /* subscribed kbd interrupt */ kbd_int_handler(); if(get_scancode() == ENTER_MAKE && next_char_index != 0) { fade_condition = true; } else { int action; action = process_input(get_scancode(), &last_char); if(action == CHAR_RECEIVED) { //printf("last_char: %c, %d\n", last_char,last_char); if(next_char_index < MAX_PLAYER_NAME_LENGTH-1) { get_program_playername()[next_char_index] = last_char; next_char_index++; } } else if(action == BACKSPACE_MAKE) { if(next_char_index > 0) { next_char_index--; get_program_playername()[next_char_index] = '\0'; } } } } if (msg.NOTIFY_ARG & get_rtc_irq_set()) { /* subscribed timer interrupt */ if(rtc_ih()) failure = 1; getDateString(get_date_str_ptr()); } if(msg.NOTIFY_ARG & get_timer_irq_set()){ timer_int_handler(); get_player_name_render(); } if (msg.NOTIFY_ARG & get_mouse_irq_set()) { /* subscribed timer interrupt */ mouse_int_handler(); } break; default: break; /* no other notifications expected: do nothing */ } } else {/* received a standard message, not a notification */ /* no standard messages expected: do nothing */ } } while(continue_condition); } get_program_playername()[next_char_index] = '\0'; continue_condition = true; fade_condition = false; darken = FADE_MAX; return 0; }