void MENUS::render_background() { //gfx_clear(1,1,1); //render_sunrays(0,0); if(texture_blob == -1) texture_blob = gfx_load_texture("blob.png", IMG_AUTO, 0); float sw = 300*gfx_screenaspect(); float sh = 300; gfx_mapscreen(0, 0, sw, sh); RECT s = *ui_screen(); // render background color gfx_texture_set(-1); gfx_quads_begin(); //vec4 bottom(gui_color.r*0.3f, gui_color.g*0.3f, gui_color.b*0.3f, 1.0f); //vec4 bottom(0, 0, 0, 1.0f); vec4 bottom(gui_color.r, gui_color.g, gui_color.b, 1.0f); vec4 top(gui_color.r, gui_color.g, gui_color.b, 1.0f); gfx_setcolorvertex(0, top.r, top.g, top.b, top.a); gfx_setcolorvertex(1, top.r, top.g, top.b, top.a); gfx_setcolorvertex(2, bottom.r, bottom.g, bottom.b, bottom.a); gfx_setcolorvertex(3, bottom.r, bottom.g, bottom.b, bottom.a); gfx_quads_drawTL(0, 0, sw, sh); gfx_quads_end(); // render the tiles gfx_texture_set(-1); gfx_quads_begin(); float size = 15.0f; float offset_time = fmod(client_localtime()*0.15f, 2.0f); for(int y = -2; y < (int)(sw/size); y++) for(int x = -2; x < (int)(sh/size); x++) { gfx_setcolor(0,0,0,0.045f); gfx_quads_drawTL((x-offset_time)*size*2+(y&1)*size, (y+offset_time)*size, size, size); } gfx_quads_end(); // render border fade gfx_texture_set(texture_blob); gfx_quads_begin(); gfx_setcolor(0,0,0,0.5f); gfx_quads_drawTL(-100, -100, sw+200, sh+200); gfx_quads_end(); // restore screen {RECT screen = *ui_screen(); gfx_mapscreen(screen.x, screen.y, screen.w, screen.h);} }
void p2p_pincode(struct p2p *p, char *ins_no, char *ins_no_again) { int pin_check=0; p->p2p_get=0; ui_screen(p); printf("%s", ins_no); scanf("%d",&pin_check); while( wps_pin_checksum(pin_check) != 0 ) { ui_screen(p); printf("%s", ins_no_again); scanf("%d",&pin_check); } p->pin = pin_check; }
void p2p_listen_ch(struct p2p *p, char *msg) { ui_screen(p); printf("%s", msg); scanf("%d",&p->listen_ch); memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set listen_ch=%d ", p->ifname, p->listen_ch); system( p->cmd ); }
void MENUS::render_loading(float percent) { static int64 last_load_render = 0; // make sure that we don't render for each little thing we load // because that will slow down loading if we have vsync if(time_get()-last_load_render < time_freq()/60) return; last_load_render = time_get(); // need up date this here to get correct vec3 rgb = hsl_to_rgb(vec3(config.ui_color_hue/255.0f, config.ui_color_sat/255.0f, config.ui_color_lht/255.0f)); gui_color = vec4(rgb.r, rgb.g, rgb.b, config.ui_color_alpha/255.0f); RECT screen = *ui_screen(); gfx_mapscreen(screen.x, screen.y, screen.w, screen.h); render_background(); float tw; float w = 700; float h = 200; float x = screen.w/2-w/2; float y = screen.h/2-h/2; gfx_blend_normal(); gfx_texture_set(-1); gfx_quads_begin(); gfx_setcolor(0,0,0,0.50f); draw_round_rect(x, y, w, h, 40.0f); gfx_quads_end(); const char *caption = localize("Loading"); tw = gfx_text_width(0, 48.0f, caption, -1); RECT r; r.x = x; r.y = y+20; r.w = w; r.h = h; ui_do_label(&r, caption, 48.0f, 0, -1); gfx_texture_set(-1); gfx_quads_begin(); gfx_setcolor(1,1,1,0.75f); draw_round_rect(x+40, y+h-75, (w-80)*percent, 25, 5.0f); gfx_quads_end(); gfx_swap(); }
//If p2p device becomes GO, we still polling driver status //to check whether some other p2p devices connected void *polling_client(void *arg) { struct p2p *p=(struct p2p*)arg; while( p->res_go == 0 ){ if( p->no_sta_connected > 0 && ( p->wpsing == _FALSE ) ) { if( read_all_sta(p) == _FALSE ) { p->no_sta_connected--; } } p2p_status(p, 0); if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ || p->status == P2P_STATE_GONEGO_FAIL || p->status == P2P_STATE_GONEGO_ING ) { p->thread_trigger = THREAD_GO ; char peer_devaddr[18]; char peer_req_cm[4]; memset( peer_devaddr, 0x00, 18); memset( peer_req_cm, 0x00, 4); p2p_peer_devaddr(p, peer_devaddr); p2p_peer_req_cm(p, peer_req_cm); p2p_peer_info(p, p->peer_devaddr, peer_req_cm); ui_screen(p); //strncpy(p->peer_devaddr, peer_devaddr, 17); if( (strncmp( peer_req_cm, "dis", 3) == 0) || (strncmp( peer_req_cm, "lab", 3) == 0) ) { printf("Here is your PIN, insert c to continue: %d\n", p->pin); } else if( (strncmp( peer_req_cm, "pbc", 3) == 0) ) { printf("Please push b to accept:\n", p->status); } else if( (strncmp( peer_req_cm, "pad", 3) == 0) ) { printf("Please insert peer PIN code:\n"); } break; } usleep( POLLING_INTERVAL ); } return NULL; }
void p2p_softap_ssid(struct p2p *p, char *msg, int print) { if(print == 1) { ui_screen(p); printf("%s", msg); scanf("%s",p->apd_ssid); } memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set ssid=%s ", p->ifname, p->apd_ssid); system( p->cmd ); }
void p2p_set_opch(struct p2p *p, char *msg, int print) { if(print == 1) { ui_screen(p); printf("%s", msg); scanf("%d",&p->op_ch); } memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set op_ch=%d", p->ifname, p->op_ch); system( p->cmd ); }
//Successively query local device status with interval "POLLING_INTERVAL" //when status == P2P_STATE_RX_PROVISION_DIS_REQ, //it require user to insert corresponding WPS config method void *polling_status(void *arg) { struct p2p *p=(struct p2p*)arg; while( p->res == 0 ){ p2p_status(p, 0); if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ ) { p->thread_trigger = THREAD_DEVICE ; char peer_devaddr[18]; char peer_req_cm[4]; memset( peer_devaddr, 0x00, 18); memset( peer_req_cm, 0x00, 4); p2p_peer_devaddr(p, peer_devaddr); p2p_peer_req_cm(p, peer_req_cm); p2p_peer_info(p, p->peer_devaddr, peer_req_cm); ui_screen(p); //strncpy(p->peer_devaddr, peer_devaddr, 17); if( (strncmp( peer_req_cm, "dis", 3) == 0) || (strncmp( peer_req_cm, "lab", 3) == 0) ) { printf("Here is your PIN, insert c to continue: %d\n", p->pin); } else if( (strncmp( peer_req_cm, "pbc", 3) == 0) ) { printf("Please push b to accept:\n"); } else if( (strncmp( peer_req_cm, "pad", 3) == 0) ) { printf("Please insert peer PIN code:\n"); } break; } usleep( POLLING_INTERVAL ); } return NULL; }
// This mode is without the following procedures: // 1.set config method // 2.start group negotiation // 3.start wpa_supplicant or hostapd void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg) { int wps_cm; p->p2p_get=0; ui_screen(p); printf("%s", msg); scanf("%d",&wps_cm); memset( p->cmd, 0x00, CMD_SZ ); if( wps_cm == 0 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_display", p->ifname, p->peer_devaddr); else if( wps_cm == 1 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_keypad", p->ifname, p->peer_devaddr); else if( wps_cm == 2 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_pbc", p->ifname, p->peer_devaddr); else if( wps_cm == 3 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_label", p->ifname, p->peer_devaddr); system( p->cmd ); }
void CONSOLE::on_render() { RECT screen = *ui_screen(); float console_max_height = screen.h*3/5.0f; float console_height; float progress = (time_now()-(state_change_end-state_change_duration))/float(state_change_duration); if (progress >= 1.0f) { if (console_state == CONSOLE_CLOSING) console_state = CONSOLE_CLOSED; else if (console_state == CONSOLE_OPENING) console_state = CONSOLE_OPEN; progress = 1.0f; } if (console_state == CONSOLE_CLOSED) return; if (console_state == CONSOLE_OPEN) inp_mouse_mode_absolute(); float console_height_scale; if (console_state == CONSOLE_OPENING) console_height_scale = console_scale_func(progress); else if (console_state == CONSOLE_CLOSING) console_height_scale = console_scale_func(1.0f-progress); else //if (console_state == CONSOLE_OPEN) console_height_scale = console_scale_func(1.0f); console_height = console_height_scale*console_max_height; gfx_mapscreen(screen.x, screen.y, screen.w, screen.h); // do console shadow gfx_texture_set(-1); gfx_quads_begin(); gfx_setcolorvertex(0, 0,0,0, 0.5f); gfx_setcolorvertex(1, 0,0,0, 0.5f); gfx_setcolorvertex(2, 0,0,0, 0.0f); gfx_setcolorvertex(3, 0,0,0, 0.0f); gfx_quads_drawTL(0,console_height,screen.w,10.0f); gfx_quads_end(); // do background gfx_texture_set(data->images[IMAGE_CONSOLE_BG].id); gfx_quads_begin(); gfx_setcolor(0.2f, 0.2f, 0.2f,0.9f); if(console_type != 0) gfx_setcolor(0.4f, 0.2f, 0.2f,0.9f); gfx_quads_setsubset(0,-console_height*0.075f,screen.w*0.075f*0.5f,0); gfx_quads_drawTL(0,0,screen.w,console_height); gfx_quads_end(); // do small bar shadow gfx_texture_set(-1); gfx_quads_begin(); gfx_setcolorvertex(0, 0,0,0, 0.0f); gfx_setcolorvertex(1, 0,0,0, 0.0f); gfx_setcolorvertex(2, 0,0,0, 0.25f); gfx_setcolorvertex(3, 0,0,0, 0.25f); gfx_quads_drawTL(0,console_height-20,screen.w,10); gfx_quads_end(); // do the lower bar gfx_texture_set(data->images[IMAGE_CONSOLE_BAR].id); gfx_quads_begin(); gfx_setcolor(1.0f, 1.0f, 1.0f, 0.9f); gfx_quads_setsubset(0,0.1f,screen.w*0.015f,1-0.1f); gfx_quads_drawTL(0,console_height-10.0f,screen.w,10.0f); gfx_quads_end(); console_height -= 22.0f; INSTANCE *console = current_console(); { float font_size = 10.0f; float row_height = font_size*1.25f; float x = 3; float y = console_height - row_height - 2; // render prompt TEXT_CURSOR cursor; gfx_text_set_cursor(&cursor, x, y, font_size, TEXTFLAG_RENDER); RENDERINFO info; info.wanted_completion = console->completion_chosen; info.enum_count = 0; info.current_cmd = console->completion_buffer; gfx_text_set_cursor(&info.cursor, x, y+12.0f, font_size, TEXTFLAG_RENDER); const char *prompt = "> "; if(console_type) { if(client_state() == CLIENTSTATE_ONLINE) { if(client_rcon_authed()) prompt = "rcon> "; else prompt = "ENTER PASSWORD> "; } else prompt = "NOT CONNECTED> "; } gfx_text_ex(&cursor, prompt, -1); // render console input gfx_text_ex(&cursor, console->input.get_string(), console->input.cursor_offset()); TEXT_CURSOR marker = cursor; gfx_text_ex(&marker, "|", -1); gfx_text_ex(&cursor, console->input.get_string()+console->input.cursor_offset(), -1); // render version char buf[128]; str_format(buf, sizeof(buf), "v%s", GAME_VERSION); float version_width = gfx_text_width(0, font_size, buf, -1); gfx_text(0, screen.w-version_width-5, y, font_size, buf, -1); // render possible commands if(console->input.get_string()[0] != 0) { console_possible_commands(console->completion_buffer, console->completion_flagmask, possible_commands_render_callback, &info); if(info.enum_count <= 0) { if(console->command) { char buf[512]; str_format(buf, sizeof(buf), "Help: %s ", console->command->help); gfx_text_ex(&info.cursor, buf, -1); gfx_text_color(0.75f, 0.75f, 0.75f, 1); str_format(buf, sizeof(buf), "Syntax: %s %s", console->command->name, console->command->params); gfx_text_ex(&info.cursor, buf, -1); } } } gfx_text_color(1,1,1,1); // render log y -= row_height; char *entry = (char *)ringbuf_last(console->backlog); while (y > 0.0f && entry) { gfx_text(0, x, y, font_size, entry, -1); y -= row_height; entry = (char *)ringbuf_prev(console->backlog, entry); } } }
void p2p_client_mode(struct p2p *p) { FILE *pf = NULL; int count = 0, ret = 0; if(p->wpa_open==1) return; else p->wpa_open = 1; p2p_ifaddr(p); memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s -i %s -c %s -B ",p->wpa_path, p->ifname, p->wpa_conf); system( p->cmd ); p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, "Start wpa_supplicant"); ui_screen(p); usleep( SUPPLICANT_INIT_TIME ); if(p->wps_info==1 || p->wps_info==2) { do { memset( p->cmd, 0x00, CMD_SZ ); if(p->connect_go == 1) sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_devaddr, p->pin); else sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_ifaddr, p->pin); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset(p->parse, 0x00, CMD_SZ); fgets(p->parse, CMD_SZ, pf); if(strncmp(p->parse, "Selected", 8) == 0) { ret = 1; p->wpsing = 1; } } fclose( pf ); } if( ret == 0 ) usleep( SUPPLICANT_INIT_TIME ); } while( ret == 0 ); } else if(p->wps_info==3) { do { memset( p->cmd, 0x00, CMD_SZ ); if(p->connect_go == 1) sprintf( p->cmd, "%s wps_pbc %s > supp_status.txt ", p->wpacli_path, p->peer_devaddr); else sprintf( p->cmd, "%s wps_pbc %s > supp_status.txt ", p->wpacli_path, p->peer_ifaddr); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset(p->parse, 0x00, CMD_SZ); fgets(p->parse, CMD_SZ, pf); if(strncmp(p->parse, "OK", 2) == 0) { ret = 1; p->wpsing = 1; } } fclose( pf ); } if( ret == 0 ) usleep( SUPPLICANT_INIT_TIME ); } while( ret == 0 ); } usleep( SUPPLICANT_INTERVAL ); while( count < WPS_RETRY ) //query status { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s status > supp_status.txt", p->wpacli_path); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset( p->parse, 0x00, CMD_SZ ); fgets( p->parse, CMD_SZ, pf ); if( strncmp( p->parse, "wpa_state=", 10) == 0 ) { int i; if( strncmp( p->parse, "wpa_state=COMPLETED", 19) == 0 ){ count = WPS_RETRY; p->wpsing=0; #ifdef DHCP memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "dhclient %s", p->ifname); system( p->cmd ); #endif //DHCP } p->p2p_get=1; memset(p->print_line, 0x00, CMD_SZ); for(i=0; i<CMD_SZ; i++){ if(p->parse[i] == '\n'){ p->parse[i] = ' '; } } sprintf(p->print_line, "%s", p->parse); ui_screen(p); break; } } fclose( pf ); } count++; usleep( SUPPLICANT_INTERVAL ); } }
void wifi_direct_connect() { int ipfd,sockfd, n; struct ifreq ifr; struct sockaddr_in servaddr,cliaddr; char peerifa[40] = { 0x00 }; char scan[CMD_SZ]; struct p2p p2pstruct; struct p2p *p=NULL; p = &p2pstruct; if( p != NULL) { memset(p, 0x00, sizeof(struct p2p)); init_p2p(p); } strcpy(p->ifname, "wlan0" ); p->enable=P2P_ROLE_DISABLE; p2p_enable(p); p2p_get_hostapd_conf(p); //get hostapd.conf //usleep(50000); rename_intf(p); ui_screen(p); //p->show_scan_result = 1; //ui_screen(p); p->enable = 1; p2p_enable(p); //p->show_scan_result = 1; //ui_screen(p); printf("==> p2p_enable(p)\n"); p->thread_trigger = THREAD_NONE ; p->wps_info=3; p2p_wpsinfo(p); printf("==> p2p_wpsinfor(p)\n"); p2p_status(p, 0); //printf("==> p2p_status(p)\n"); //usleep(10000); if(p->status != P2P_STATE_GONEGO_OK) { p2p_set_nego(p); printf("...Negotiated\n"); } else { p2p_role(p,0); if( p->role == P2P_ROLE_CLIENT ) { printf("==>P2P_ROLE_CLIENT\n"); p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { printf("==>P2P_ROLE_GO\n"); p2p_go_mode(p); } } system("dhclient wlan0"); /********* Want to get IP address, you should be wait!*/ /* because it takes a little bit time ****/ printf("WIFI DIRECT SUCCESS, Wait 2sec...\n"); sleep(2); ipfd= socket(PF_INET, SOCK_DGRAM, 0); ifr.ifr_addr.sa_family = PF_INET; strncpy(ifr.ifr_name, "wlan0", IFNAMSIZ-1); ioctl(ipfd, SIOCGIFADDR, &ifr); close(ipfd); sockfd=socket(PF_INET, SOCK_DGRAM, 0); strcpy(ipaddr, inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr)); printf(" ==> ip : %s\n",ipaddr); }
int MENUS::render() { RECT screen = *ui_screen(); gfx_mapscreen(screen.x, screen.y, screen.w, screen.h); static bool first = true; if(first) { if(config.ui_page == PAGE_INTERNET) client_serverbrowse_refresh(0); else if(config.ui_page == PAGE_LAN) client_serverbrowse_refresh(1); first = false; } if(client_state() == CLIENTSTATE_ONLINE) { color_tabbar_inactive = color_tabbar_inactive_ingame; color_tabbar_active = color_tabbar_active_ingame; } else { render_background(); color_tabbar_inactive = color_tabbar_inactive_outgame; color_tabbar_active = color_tabbar_active_outgame; } RECT tab_bar; RECT main_view; // some margin around the screen ui_margin(&screen, 10.0f, &screen); if(popup == POPUP_NONE) { // do tab bar ui_hsplit_t(&screen, 24.0f, &tab_bar, &main_view); ui_vmargin(&tab_bar, 20.0f, &tab_bar); render_menubar(tab_bar); // news is not implemented yet if(config.ui_page <= PAGE_NEWS || config.ui_page > PAGE_SETTINGS || (client_state() == CLIENTSTATE_OFFLINE && config.ui_page >= PAGE_GAME && config.ui_page <= PAGE_CALLVOTE)) { client_serverbrowse_refresh(BROWSETYPE_INTERNET); config.ui_page = PAGE_INTERNET; } // render current page if(client_state() != CLIENTSTATE_OFFLINE) { if(game_page == PAGE_GAME) render_game(main_view); else if(game_page == PAGE_SERVER_INFO) render_serverinfo(main_view); else if(game_page == PAGE_CALLVOTE) render_servercontrol(main_view); else if(game_page == PAGE_SETTINGS) render_settings(main_view); } else if(config.ui_page == PAGE_NEWS) render_news(main_view); else if(config.ui_page == PAGE_INTERNET) render_serverbrowser(main_view); else if(config.ui_page == PAGE_LAN) render_serverbrowser(main_view); else if(config.ui_page == PAGE_DEMOS) render_demolist(main_view); else if(config.ui_page == PAGE_FAVORITES) render_serverbrowser(main_view); else if(config.ui_page == PAGE_SETTINGS) render_settings(main_view); // else if(config.ui_page == PAGE_TEE-NG) // renger_settings(main_teeng); } else { // make sure that other windows doesn't do anything funnay! //ui_set_hot_item(0); //ui_set_active_item(0); char buf[128]; const char *title = ""; const char *extra_text = ""; const char *button_text = ""; int extra_align = 0; if(popup == POPUP_MESSAGE) { title = message_topic; extra_text = message_body; button_text = message_button; } else if(popup == POPUP_CONNECTING) { title = localize("Connecting to"); extra_text = config.ui_server_address; // TODO: query the client about the address button_text = localize("Abort"); if(client_mapdownload_totalsize() > 0) { title = localize("Downloading map"); str_format(buf, sizeof(buf), "%d/%d KiB", client_mapdownload_amount()/1024, client_mapdownload_totalsize()/1024); extra_text = buf; } } else if(popup == POPUP_DISCONNECTED) { title = localize("Disconnected"); extra_text = client_error_string(); button_text = localize("Ok"); extra_align = -1; } else if(popup == POPUP_PURE) { title = localize("Disconnected"); extra_text = localize("The server is running a non-standard tuning on a pure game type."); button_text = localize("Ok"); extra_align = -1; } else if(popup == POPUP_PASSWORD) { title = localize("Password Incorrect"); extra_text = client_error_string(); button_text = localize("Try again"); } else if(popup == POPUP_QUIT) { title = localize("Quit"); extra_text = localize("Are you sure that you want to quit?"); } else if(popup == POPUP_FIRST_LAUNCH) { title = localize("Welcome to Teeworlds"); extra_text = localize("As this is the first time you launch the game, please enter your nick name below. It's recommended that you check the settings to adjust them to your liking before joining a server."); button_text = localize("Ok"); extra_align = -1; } RECT box, part; box = screen; ui_vmargin(&box, 150.0f, &box); ui_hmargin(&box, 150.0f, &box); // render the box ui_draw_rect(&box, vec4(0,0,0,0.5f), CORNER_ALL, 15.0f); ui_hsplit_t(&box, 20.f, &part, &box); ui_hsplit_t(&box, 24.f, &part, &box); ui_do_label(&part, title, 24.f, 0); ui_hsplit_t(&box, 20.f, &part, &box); ui_hsplit_t(&box, 24.f, &part, &box); ui_vmargin(&part, 20.f, &part); if(extra_align == -1) ui_do_label(&part, extra_text, 20.f, -1, (int)part.w); else ui_do_label(&part, extra_text, 20.f, 0, -1); if(popup == POPUP_QUIT) { RECT yes, no; ui_hsplit_b(&box, 20.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vmargin(&part, 80.0f, &part); ui_vsplit_mid(&part, &no, &yes); ui_vmargin(&yes, 20.0f, &yes); ui_vmargin(&no, 20.0f, &no); static int button_abort = 0; if(ui_do_button(&button_abort, localize("No"), 0, &no, ui_draw_menu_button, 0) || escape_pressed) popup = POPUP_NONE; static int button_tryagain = 0; if(ui_do_button(&button_tryagain, localize("Yes"), 0, &yes, ui_draw_menu_button, 0) || enter_pressed) client_quit(); } else if(popup == POPUP_PASSWORD) { RECT label, textbox, tryagain, abort; ui_hsplit_b(&box, 20.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vmargin(&part, 80.0f, &part); ui_vsplit_mid(&part, &abort, &tryagain); ui_vmargin(&tryagain, 20.0f, &tryagain); ui_vmargin(&abort, 20.0f, &abort); static int button_abort = 0; if(ui_do_button(&button_abort, localize("Abort"), 0, &abort, ui_draw_menu_button, 0) || escape_pressed) { if(config.cl_autoconnect) config.cl_autoconnect == 0; else popup = POPUP_NONE; } static int button_tryagain = 0; if(ui_do_button(&button_tryagain, localize("Try again"), 0, &tryagain, ui_draw_menu_button, 0) || enter_pressed) { client_connect(config.ui_server_address); } ui_hsplit_b(&box, 60.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vsplit_l(&part, 60.0f, 0, &label); ui_vsplit_l(&label, 100.0f, 0, &textbox); ui_vsplit_l(&textbox, 20.0f, 0, &textbox); ui_vsplit_r(&textbox, 60.0f, &textbox, 0); ui_do_label(&label, localize("Password"), 20, -1); ui_do_edit_box(&config.password, &textbox, config.password, sizeof(config.password), 14.0f, true); } else if(popup == POPUP_FIRST_LAUNCH) { RECT label, textbox; ui_hsplit_b(&box, 20.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vmargin(&part, 80.0f, &part); static int enter_button = 0; if(ui_do_button(&enter_button, localize("Enter"), 0, &part, ui_draw_menu_button, 0) || enter_pressed) popup = POPUP_NONE; ui_hsplit_b(&box, 40.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vsplit_l(&part, 60.0f, 0, &label); ui_vsplit_l(&label, 100.0f, 0, &textbox); ui_vsplit_l(&textbox, 20.0f, 0, &textbox); ui_vsplit_r(&textbox, 60.0f, &textbox, 0); ui_do_label(&label, localize("Nickname"), 20, -1); ui_do_edit_box(&config.player_name, &textbox, config.player_name, sizeof(config.player_name), 14.0f); } else { ui_hsplit_b(&box, 20.f, &box, &part); ui_hsplit_b(&box, 24.f, &box, &part); ui_vmargin(&part, 120.0f, &part); static int button = 0; if(ui_do_button(&button, button_text, 0, &part, ui_draw_menu_button, 0) || escape_pressed || enter_pressed) { if(popup == POPUP_CONNECTING) client_disconnect(); popup = POPUP_NONE; } } } return 0; }
void MENUS::on_render() { /* // text rendering test stuff render_background(); TEXT_CURSOR cursor; gfx_text_set_cursor(&cursor, 10, 10, 20, TEXTFLAG_RENDER); gfx_text_ex(&cursor, "ようこそ - ガイド", -1); gfx_text_set_cursor(&cursor, 10, 30, 15, TEXTFLAG_RENDER); gfx_text_ex(&cursor, "ようこそ - ガイド", -1); //gfx_texture_set(-1); gfx_quads_begin(); gfx_quads_drawTL(60, 60, 5000, 5000); gfx_quads_end(); return;*/ if(client_state() != CLIENTSTATE_ONLINE && client_state() != CLIENTSTATE_DEMOPLAYBACK) set_active(true); if(client_state() == CLIENTSTATE_DEMOPLAYBACK) { RECT screen = *ui_screen(); gfx_mapscreen(screen.x, screen.y, screen.w, screen.h); render_demoplayer(screen); } if(client_state() == CLIENTSTATE_ONLINE && gameclient.servermode == gameclient.SERVERMODE_PUREMOD) { client_disconnect(); set_active(true); popup = POPUP_PURE; } if(!is_active()) { escape_pressed = false; enter_pressed = false; num_inputevents = 0; return; } // update colors vec3 rgb = hsl_to_rgb(vec3(config.ui_color_hue/255.0f, config.ui_color_sat/255.0f, config.ui_color_lht/255.0f)); gui_color = vec4(rgb.r, rgb.g, rgb.b, config.ui_color_alpha/255.0f); color_tabbar_inactive_outgame = vec4(0,0,0,0.25f); color_tabbar_active_outgame = vec4(0,0,0,0.5f); float color_ingame_scale_i = 0.5f; float color_ingame_scale_a = 0.2f; color_tabbar_inactive_ingame = vec4( gui_color.r*color_ingame_scale_i, gui_color.g*color_ingame_scale_i, gui_color.b*color_ingame_scale_i, gui_color.a*0.8f); color_tabbar_active_ingame = vec4( gui_color.r*color_ingame_scale_a, gui_color.g*color_ingame_scale_a, gui_color.b*color_ingame_scale_a, gui_color.a); // update the ui RECT *screen = ui_screen(); float mx = (mouse_pos.x/(float)gfx_screenwidth())*screen->w; float my = (mouse_pos.y/(float)gfx_screenheight())*screen->h; int buttons = 0; if(inp_key_pressed(KEY_MOUSE_1)) buttons |= 1; if(inp_key_pressed(KEY_MOUSE_2)) buttons |= 2; if(inp_key_pressed(KEY_MOUSE_3)) buttons |= 4; ui_update(mx,my,mx*3.0f,my*3.0f,buttons); // render if(client_state() != CLIENTSTATE_DEMOPLAYBACK) render(); // render cursor gfx_texture_set(data->images[IMAGE_CURSOR].id); gfx_quads_begin(); gfx_setcolor(1,1,1,1); gfx_quads_drawTL(mx,my,24,24); gfx_quads_end(); // render debug information if(config.debug) { RECT screen = *ui_screen(); gfx_mapscreen(screen.x, screen.y, screen.w, screen.h); char buf[512]; str_format(buf, sizeof(buf), "%p %p %p", ui_hot_item(), ui_active_item(), ui_last_active_item()); TEXT_CURSOR cursor; gfx_text_set_cursor(&cursor, 10, 10, 10, TEXTFLAG_RENDER); gfx_text_ex(&cursor, buf, -1); } escape_pressed = false; enter_pressed = false; num_inputevents = 0; }
void p2p_set_nego(struct p2p *p) { FILE *pf=NULL; int retry_count = 0, success = 0; int retry = NEGO_RETRY_INTERVAL, query = NEGO_QUERY_INTERVAL; p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, p->nego_msg); ui_screen(p); memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); system( p->cmd ); usleep( PRE_NEGO_INTERVAL ); p2p_status(p, 0); while( !p2p_check_success(p) && (retry_count < 120 / NEGO_QUERY_INTERVAL )) { retry_count++; if( (retry_count % ( retry / query ) )==0 ) { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); system( p->cmd ); usleep( NEGO_QUERY_INTERVAL ); p2p_status(p, 1); } else { ui_screen(p); usleep( NEGO_QUERY_INTERVAL ); p2p_status(p, 1); } } if( p2p_check_success(p) ) { p2p_role(p ,0); p->p2p_get = 1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "%s", p->ok_msg ); p2p_ifaddr(p); ui_screen(p); if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_get_opch(p); p2p_go_mode(p); } } else { p->p2p_get = 1; p2p_status(p, 0); memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Status= %d, %s", p->status, p->fail_msg ); ui_screen(p); #ifdef P2P_ATUO pthread_create(&p->pthread, NULL, &polling_status, (void *)p); #endif } }
void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg) { int wps_cm, retry_count=0; char prov[100] = { 0x00 }; p->p2p_get=0; ui_screen(p); printf("%s", msg); scanf("%d",&wps_cm); if(p->res == 0) { p->res = 1; } memset( p->cmd, 0x00, CMD_SZ ); if( wps_cm == 0 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_display", p->ifname, p->peer_devaddr); else if( wps_cm == 1 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_keypad", p->ifname, p->peer_devaddr); else if( wps_cm == 2 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_pbc", p->ifname, p->peer_devaddr); else if( wps_cm == 3 ) sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_label", p->ifname, p->peer_devaddr); system( p->cmd ); strcpy( prov, p->cmd ); usleep(500000); p2p_status( p, 0 ); while(p->status != P2P_STATE_RX_PROVISION_DIS_RSP && retry_count < MAX_PROV_RETRY) { usleep( PROV_WAIT_TIME ); retry_count++; p2p_status( p, 0 ); if( (retry_count % PROV_RETRY_INTERVAL) == 0) system( prov ); } if( p->status == P2P_STATE_RX_PROVISION_DIS_RSP ) { switch(wps_cm) { case 0: p->wps_info=1; break; case 1: p->wps_info=2; break; case 2: p->wps_info=3; break; case 3: p->wps_info=1; break; } if( wps_cm==1 || wps_cm==2 ) { p2p_wpsinfo(p); if(p->connect_go == 1) p2p_client_mode(p); else p2p_set_nego(p); } else if( wps_cm==0 || wps_cm==3 ) { ui_screen(p); if( wps_cm ==0 ) printf("%s", dis_msg); else if( wps_cm == 3 ) printf("%s", label_msg); scanf("%d",&p->pin); p2p_wpsinfo(p); if(p->connect_go == 1) p2p_client_mode(p); else p2p_set_nego(p); } } else { p->p2p_get = 1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Issue provision discovery fail" ); ui_screen(p); #ifdef P2P_AUTO pthread_create(&p->pthread, NULL, &polling_status, (void *)p); #endif } }
void p2p_client_mode(struct p2p *p) { FILE *pf = NULL; int count = 0, ret = 0; int inactive_count = 0, inactive_restart = 0; if(p->wpa_open==_TRUE) return; else p->wpa_open = _TRUE; p2p_ifaddr(p); memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s -i %s -c %s -B ",p->wpa_path, p->ifname, p->wpa_conf); system( p->cmd ); p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, "Start wpa_supplicant"); ui_screen(p); usleep( SUPPLICANT_INIT_TIME ); do_wps(p); usleep( SUPPLICANT_INTERVAL ); while( count < WPS_RETRY ) //query status { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s status > supp_status.txt", p->wpacli_path); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset( p->parse, 0x00, CMD_SZ ); fgets( p->parse, CMD_SZ, pf ); if( strncmp( p->parse, "wpa_state=", 10) == 0 ) { int i; if( strncmp( p->parse, "wpa_state=COMPLETED", 19) == 0 ){ count = WPS_RETRY; p->wpsing = _FALSE; #ifdef DHCP memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "dhclient %s", p->ifname); system( p->cmd ); #endif //DHCP } else if( strncmp( p->parse, "wpa_state=INACTIVE", 18) == 0 ){ inactive_count++; if( (inactive_count % 5)== 0) { if( p->wps_info == 2 ) { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_ifaddr, p->pin); system( p->cmd ); inactive_restart = 1; } } } if( inactive_restart == 1 ) { inactive_restart = 0; p->p2p_get=1; memset(p->print_line, 0x00, CMD_SZ); sprintf(p->print_line, "Restart WPS"); ui_screen(p); } else { p->p2p_get=1; memset(p->print_line, 0x00, CMD_SZ); for(i=0; i<CMD_SZ; i++){ if(p->parse[i] == '\n'){ p->parse[i] = ' '; } } sprintf(p->print_line, "%s", p->parse); ui_screen(p); } break; } } fclose( pf ); } count++; usleep( SUPPLICANT_INTERVAL ); } p->wpsing = _FALSE; }
void p2p_set_nego(struct p2p *p) { FILE *pf=NULL; int retry_count = 0, success = 0; p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, p->nego_msg); ui_screen(p); memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); system( p->cmd ); usleep( PRE_NEGO_INTERVAL ); do { p2p_status(p, 0); p2p_role(p, 0); if( p->status != P2P_STATE_GONEGO_OK ){ if( p->role == P2P_ROLE_CLIENT || p->role == P2P_ROLE_GO ) break; if( retry_count > 0) { int check_status = 0; while(check_status < (NEGO_RETRY_INTERVAL/500000) && p->status != P2P_STATE_GONEGO_OK ) { p2p_status(p, 1); if( check_status == 0 ) ui_screen(p); if( p->status == P2P_STATE_GONEGO_OK ) { success = 1; break; } usleep(500000); check_status++; } //usleep( NEGO_RETRY_INTERVAL ); } if( success ==0 ){ //need to re-fine memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); system( p->cmd ); usleep(10000); retry_count++; } } else { p->p2p_get = 1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "%s", p->ok_msg ); p2p_ifaddr(p); ui_screen(p); break; } } while( p->status != P2P_STATE_GONEGO_OK && retry_count < MAX_NEGO_RETRY ); if( p->status == P2P_STATE_GONEGO_OK || p->role == P2P_ROLE_CLIENT || p->role == P2P_ROLE_GO ) { p2p_role(p ,0); if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_go_mode(p); } } else { p->p2p_get = 1; p2p_status(p, 0); memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Status= %d, %s", p->status, p->fail_msg ); ui_screen(p); #ifdef P2P_ATUO pthread_create(&p->pthread, NULL, &polling_status, (void *)p); #endif } }
void p2p_go_mode(struct p2p *p) { int count = 0, i = -1; char addr_lower[18]; p2p_ifaddr(p); p->no_sta_connected++; p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, "Start hostapd"); ui_screen(p); if(p->ap_open != _TRUE) { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s -B %s > temp.txt",p->ap_path, p->ap_conf); system( p->cmd ); usleep( HOSTAPD_INIT_TIME ); p->ap_open = _TRUE; } do_wps(p); usleep( HOSTAPD_INTERVAL ); while( count < WPS_RETRY ) //query status { if( read_all_sta(p) == _TRUE ) { count = WPS_RETRY; p->wpsing = _FALSE; p->p2p_get=1; memset(p->print_line, 0x00, CMD_SZ); for(i=0; i<CMD_SZ; i++){ if(p->parse[i] == '\n'){ p->parse[i] = ' '; } } sprintf(p->print_line, "%s", p->parse); ui_screen(p); #ifdef DHCP memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "ifconfig %s 192.168.1.254", p->ifname); system( p->cmd ); usleep(50000); system( "/etc/rc.d/init.d/dhcpd start" ); system( "clear" ); #endif //DHCP //After starting hostapd and doing WPS connection successful, //We create a thread to query driver if some other p2p devices connected. p2p_status(p, 0); usleep(50000); #ifdef P2P_AUTO p->res_go = pthread_create(&p->pthread_go, NULL, &polling_client, (void *)p); if( p->res_go != 0 ) { p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Thread creation failed" ); } #endif break; } else { if( count == WPS_RETRY) break; count++; usleep( HOSTAPD_INTERVAL ); p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "hostapd open, count:%d", count); ui_screen(p); } } p->wpsing = _FALSE; }
void p2p_go_mode(struct p2p *p) { FILE *pf = NULL; int count = 0, ret = 0, i = -1; char addr_lower[18]; p2p_ifaddr(p); p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); strcpy( p->print_line, "Start hostapd"); ui_screen(p); if(p->ap_open != 1) { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s -B %s > temp.txt",p->ap_path, p->ap_conf); system( p->cmd ); usleep( HOSTAPD_INIT_TIME ); } if(p->wps_info==1 || p->wps_info==2) { do { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s wps_pin any %d > supp_status.txt", p->apcli_path, p->pin); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset(p->parse, 0x00, CMD_SZ); fgets(p->parse, CMD_SZ, pf); if(strncmp(p->parse, "", 2) == 0) { ret = 1; p->wpsing = 1; } } fclose( pf ); } if( ret == 0 ) usleep( HOSTAPD_INIT_TIME ); } while( ret == 0 ); } else if(p->wps_info==3) { do { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s wps_pbc any > supp_status.txt", p->apcli_path); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { while( !feof( pf ) ){ memset(p->parse, 0x00, CMD_SZ); fgets(p->parse, CMD_SZ, pf); if(strncmp(p->parse, "OK", 2) == 0) { ret = 1; p->wpsing = 1; } } fclose( pf ); } if( ret == 0 ) usleep( HOSTAPD_INIT_TIME ); } while( ret == 0 ); } usleep( HOSTAPD_INTERVAL ); while( count < WPS_RETRY ) //query status { memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "%s all_sta > supp_status.txt", p->apcli_path); system( p->cmd ); pf = fopen( "./supp_status.txt", "r" ); if ( pf ) { for(i=0;i<17;i++) { if( p->ap_open != 1 ) addr_lower[i] = lower(p->peer_ifaddr[i]); else addr_lower[i] = lower(p->peer_devaddr[i]); } addr_lower[17]='\0'; while( !feof( pf ) ){ memset( p->parse, 0x00, CMD_SZ ); fgets( p->parse, CMD_SZ, pf ); if( strncmp( p->parse, "dot11RSNAStatsSTAAddress=", 25) == 0 ) { if( strncmp( p->parse+25, addr_lower, 17) == 0 ) { count = WPS_RETRY; p->wpsing = 0; p->p2p_get=1; memset(p->print_line, 0x00, CMD_SZ); for(i=0; i<CMD_SZ; i++){ if(p->parse[i] == '\n'){ p->parse[i] = ' '; } } sprintf(p->print_line, "%s", p->parse); ui_screen(p); #ifdef DHCP memset( p->cmd, 0x00, CMD_SZ ); sprintf( p->cmd, "ifconfig %s 192.168.1.254", p->ifname); system( p->cmd ); usleep(50000); system( "/etc/rc.d/init.d/dhcpd start" ); system( "clear" ); #endif //DHCP //After starting hostapd and doing WPS connection successful, //We create a thread to query driver if some other p2p devices connected. p2p_status(p, 0); usleep(50000); #ifdef P2P_AUTO p->res_go = pthread_create(&p->pthread_go, NULL, &polling_client, (void *)p); if( p->res_go != 0 ) { p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "Thread creation failed" ); } #endif break; } } } fclose( pf ); } if( count == WPS_RETRY) break; count++; usleep( HOSTAPD_INTERVAL ); p->p2p_get=1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, "hostapd open, count:%d", count); ui_screen(p); } if(p->ap_open != 1) p->ap_open = 1; }
//int main() int main(int argc, char **argv) { char peerifa[40] = { 0x00 }; char scan[CMD_SZ]; struct p2p p2pstruct; struct p2p *p=NULL; p = &p2pstruct; if( p != NULL) { memset(p, 0x00, sizeof(struct p2p)); init_p2p(p); } strcpy(p->ifname, argv[1] ); /* Disable P2P functionalities at first*/ p->enable=P2P_ROLE_DISABLE; p2p_enable(p); p2p_get_hostapd_conf(p); usleep(50000); rename_intf(p); do { ui_screen(p); printf("*insert cmd:"); memset( scan, 0x00, CMD_SZ ); scanf("%s", scan); if( p->thread_trigger == THREAD_NONE ) //Active mode for user interface { if( strncmp(scan, "e", 1) == 0 ) //Enable { p->show_scan_result = 1; ui_screen(p); printf("Please insert enable mode;[0]Disable, [1]Device, [2]Client, [3]GO:"); scanf("%d",&p->enable); p2p_enable(p); p->show_scan_result = 1; } else if( strncmp(scan, "a", 1) == 0 ) // Scan P2P device { p2p_scan(p); p->show_scan_result = 1; } else if( strncmp(scan, "d", 1) == 0 ) // Set device name { p->p2p_get = 0; printf("Please insert device name :"); scanf("\n%[^\n]", p->dev_name); p2p_setDN(p); p->show_scan_result = 1; } else if( strncmp(scan, "i", 1) == 0 ) // Intent { p->show_scan_result = 1; ui_screen(p); printf("Please insert intent from [0~15(must be softap)] :"); scanf("%d",&p->intent); p2p_intent(p); p->show_scan_result = 1; } else if( strncmp(scan, "w", 1) == 0 ) // WPS_info { p->show_scan_result = 1; ui_screen(p); printf("Please insert WPS method\n"); printf("[0]None, [1]Peer Display PIN, [2]Self Display Pin, [3]PBC :"); scanf("%d",&p->wps_info); p2p_wpsinfo(p); p->show_scan_result = 1; } else if( strncmp(scan, "c", 1) == 0 ) // PIN_code { char ins_no[CMD_SZ], ins_no_again[CMD_SZ]; memset(ins_no, 0x00, CMD_SZ); strcpy(ins_no, "Please insert 8-digit number, eg:12345670 :" ); memset(ins_no_again, 0x00, CMD_SZ); strcpy(ins_no_again, "Invalid number, insert again, eg:12345670 :" ); p2p_pincode(p, ins_no, ins_no_again); p->show_scan_result = 1; } else if( strncmp(scan, "m", 1) == 0 ) // Set peer device address { p->show_scan_result = 1; ui_screen(p); printf("Please insert number in scan list:"); p2p_devaddr(p); p->show_scan_result = 1; } else if( strncmp(scan, "r", 1) == 0 ) // Get role { p2p_role(p,1); p->show_scan_result = 1; } else if( strncmp(scan, "s", 1) == 0 ) // Get status { p2p_status(p, 1); p->show_scan_result = 1; } else if( strncmp(scan, "p", 1) == 0 ) // Provision discovery { char msg[CMD_SZ]; memset( msg, 0x00, CMD_SZ ); char dis_msg[CMD_SZ]; memset( dis_msg, 0x00, CMD_SZ ); char label_msg[CMD_SZ]; memset( label_msg, 0x00, CMD_SZ ); if(strncmp(p->peer_devaddr, "00:00:00:00:00:00", 17) == 0) { strcpy( msg, "Please insert peer P2P device at first" ); p2p_prov_disc_no_addr(p, msg); p->show_scan_result = 1; } else { strcpy( msg, "Please insert WPS configuration method ;[0]display, [1]keypad, [2]pbc, [3]label:\n" ); strcpy( dis_msg, "Please insert PIN code displays on peer device screen:" ); strcpy( label_msg, "Please insert PIN code displays on peer label:" ); p2p_prov_disc(p, msg, dis_msg, label_msg); } } else if( strncmp(scan, "n", 1) == 0 ) // Set negotiation { p2p_set_nego(p); } else if( strncmp(scan, "f", 1) == 0 ) // Reflash current state { p->show_scan_result = 1; p2p_status(p, 0); p2p_role(p, 0); p2p_ifaddr(p); if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ ) { char peer_devaddr[18]; char peer_req_cm[4]; memset( peer_devaddr, 0x00, 18); memset( peer_req_cm, 0x00, 4); p2p_peer_devaddr(p, peer_devaddr); p2p_peer_req_cm(p, peer_req_cm); p2p_peer_info(p, p->peer_devaddr, peer_req_cm); } #ifndef P2P_AUTO else { if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_go_mode(p); } } #endif //P2P_AUTO } else if( strncmp(scan, "x", 1) == 0 ) // Start wpa_supplicant/hostapd { if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_go_mode(p); } } else if( strncmp(scan, "h", 1) == 0 ) // Set operation channel { char msg[CMD_SZ]; memset( msg, 0x00, CMD_SZ ); strcpy( msg, "Please insert desired operation channel:" ); p2p_set_opch(p, msg, 1); p->show_scan_result = 1; } else if( strncmp(scan, "t", 1) == 0 ) // Set SoftAP ssid { char msg[CMD_SZ]; memset( msg, 0x00, CMD_SZ ); strcpy( msg, "Please insert desired SoftAP ssid:" ); p2p_softap_ssid(p, msg, 1); p->show_scan_result = 1; } else if( strncmp(scan, "l", 1) == 0 ) // Set Listen channel { char msg[CMD_SZ]; memset( msg, 0x00, CMD_SZ ); strcpy( msg, "Please insert desired Listen channel, only ch.1.6.11 are available:" ); p2p_listen_ch(p, msg); p->show_scan_result = 1; } else if( strncmp(scan, "q", 1) == 0 ) // Quit { if( p->res == 0 ) p->res = 1; if( p->res_go == 0 ) p->res_go = 1; break; } else // Insert wrong commamd { p->p2p_get=1; p->show_scan_result = 1; memset( p->print_line, 0x00, CMD_SZ ); sprintf( p->print_line, " BAD argument"); } } else if( p->thread_trigger == THREAD_DEVICE ) //Passive mode for user interface { p->thread_trigger = THREAD_NONE ; if( strncmp(scan, "b", 1) == 0 ) { p->wps_info=3; p2p_wpsinfo(p); p2p_status(p, 0); if(p->status != P2P_STATE_GONEGO_OK) { p2p_set_nego(p); } else { p2p_role(p,0); if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_go_mode(p); } } } else if( strncmp(scan, "c", 1) == 0 ) { p->wps_info=2; p2p_wpsinfo(p); p2p_status(p, 0); if(p->status != P2P_STATE_GONEGO_OK) { p2p_set_nego(p); } else { p2p_role(p,0); p2p_ifaddr(p); if( p->role == P2P_ROLE_CLIENT ) { p2p_client_mode(p); } else if( p->role == P2P_ROLE_GO ) { p2p_go_mode(p); } } } else if( ('0' <= *scan ) && ( *scan <= '9') ) { printf("In passive pin code\n"); p->pin = atoi(scan); p->wps_info=1; p2p_wpsinfo(p); p2p_set_nego(p); } } else if( p->thread_trigger == THREAD_GO ) //Passive mode for user interface { p->thread_trigger = THREAD_NONE ; if( strncmp(scan, "b", 1) == 0 ) { p->wps_info=3; p2p_wpsinfo(p); } else if( strncmp(scan, "c", 1) == 0 ) { p->wps_info=2; p2p_wpsinfo(p); } else if( ('0' <= *scan ) && ( *scan <= '9') ) { printf("In passive pin code\n"); p->pin = atoi(scan); p->wps_info=1; p2p_wpsinfo(p); } p2p_go_mode(p); } } while( 1 ); /* Disable P2P functionalities when exits*/ p->enable= -1 ; p2p_enable(p); system( "rm -f ./supp_status.txt" ); system( "rm -f ./temp.txt" ); system( "rm -f ./scan.txt" ); system( "rm -f ./peer.txt" ); system( "rm -f ./status.txt" ); system( "rm -f ./cm.txt" ); return 0; }