/* * Function: init_server * Implementation comments: * Initializes a server opening a TCP socket, binding his address to the specified port (argument), * and setting the queue length to max_connections (argument). * Returns the socket descriptor or an error code and writes a message in the system log describing such error. */ int init_server(int port, int max_connections) { int fd, ret; syslog(LOG_NOTICE, "Creating a new TCP socket"); fd = open_TCP_socket(); if (fd <= 0) { syslog(LOG_ERR, "Error creating a new TCP socket: %s", strerror(errno)); return ERROR; } syslog(LOG_NOTICE, "Binding port %d to TCP socket", port); if (bind_socket(fd, port) != OK) { syslog(LOG_ERR, "Error binding port %d to TCP socket: %s", port, strerror(errno)); return ERROR; } syslog(LOG_NOTICE, "Setting connections queue length to %d", max_connections); ret = set_queue_length(fd, max_connections); if (ret != OK) { if (ret == ERROR_Q_LENGTH) { syslog(LOG_ERR, "Error setting queue length: Invalid queue length (<1)"); } else { syslog(LOG_ERR, "Error setting queue length: %s", strerror(errno)); } return ret; } return fd; }
int main(int argc, char *argv[]) { /* int argi; for (argi=1; argi < argc; argi++) {printf("parameter: %s\n", argv[argi]);} */ gst_init(&argc, &argv); gtk_init(&argc, &argv); start_GUI(); g_signal_connect(G_OBJECT(drawing_area), "draw", G_CALLBACK(on_draw_event), NULL); g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(main_window, "key_press_event", G_CALLBACK(klawisz), 1); g_signal_connect(main_window, "key_release_event", G_CALLBACK(klawisz), 0); g_signal_connect(servocontroller_enable_button, "clicked", G_CALLBACK(toggle_servocontroller), TRUE); g_signal_connect(servocontroller_disable_button, "clicked", G_CALLBACK(toggle_servocontroller), FALSE); g_signal_connect(check_button_regulator, "clicked", G_CALLBACK(toggle_ESC_callback), NULL); g_signal_connect(record_start_button, "clicked", G_CALLBACK(switch_Recording), NULL); g_signal_connect(record_stop_button, "clicked", G_CALLBACK(switch_Recording), NULL); g_signal_connect(check_button_video, "clicked", G_CALLBACK(toggle_video_button_callback), NULL); g_signal_connect_swapped(G_OBJECT(main_window), "destroy", G_CALLBACK(zamknij), NULL); switch (tryb_wysylania) { case 1: g_signal_connect(reconnect_button, "clicked", G_CALLBACK(open_TCP_socket), NULL); break; default: //TODO: close socket, reopen socket break; } /* wczytuje wartości zmiennych z pliku config.cfg */ open_config(argv[1]); /* distinguishes between USB and Bluetooth connection */ //TODO: https://linux.die.net/man/8/udevadm if (0 == access("/dev/input/by-id/usb-Sony_Computer_Entertainment_Wireless_Controller-joystick", 0)) { g_print("Joystick file exists - USB mapping\n"); gtk_progress_bar_set_text(progress3, "touchpad X:"); gtk_progress_bar_set_text(progress4, "touchpad Y:"); gtk_progress_bar_set_text(progress5, "axis 8:"); } else if (access("/dev/input/by-id/usb-Microsoft_Controller_0000000000000000000000000000-joystick", 0) == 0) { g_print("Xbox One controller - USB mapping\n"); button[2] = 3; // "triangle" - "Y" button[3] = 2; // "square" - "X" button[8] = 6; // share - view button[9] = 7; // options - menu button[10] = 8; // PlayStation - Xbox button[11] = 9; // left stick press button[12] = 10; // right stick press } else { g_print("Joystick file doesn't exist - Bluetooth mapping\n"); axis[6] = 6; axis[7] = 7; axis[9] = 9; axis[10] = 10; axis[11] = 11; gtk_progress_bar_set_text(progress3, "gyro X?"); gtk_progress_bar_set_text(progress4, "gyro Y?"); gtk_progress_bar_set_text(progress5, "gyro Z?"); } /* wyświetla wszystkie elementy okna */ gtk_widget_show_all(main_window); // UDP if (tryb_wysylania == 0) { open_UDP_socket(); video_start(); video_receive(); } // TCP if (tryb_wysylania == 1) { // connect on startup open_TCP_socket(); /* wysyła pakiet z numerem kamery i adresem IP na jaki ma być streamingowany obraz z kamery */ introduce_yourself_TCP(); } // UDP, old if (tryb_wysylania == 2) { open_UDP_socket(); /* wysyła pakiet z numerem kamery i adresem IP na jaki ma być streamowany obraz z kamery */ video_start(); /* rozpoczyna wyświetlanie obrazu */ video_receive(); } /* uruchamia "audio_receive" z opóźnieniem 100 milisekund (właściwie co 100 milisekund) wymaga tego specyfika protokołu TCP */ g_timeout_add(100, audio_receive, NULL); /* FIXME: są problemy z dźwiękiem, chyba chodzi o synchronizację dźwięku z obrazem */ /* wykrywanie joysticka przy starcie programu */ wykryj_joystick(); /* hides one of fullscreen buttons and recording stop button */ if (isFullscreen) { gtk_widget_hide(fullscreen_enable_button); gtk_window_fullscreen(GTK_WINDOW(main_window)); } else { gtk_widget_hide(fullscreen_disable_button); /* gtk_window_unfullscreen(GTK_WINDOW(main_window)); */ } gtk_widget_hide(servocontroller_enable_button); gtk_widget_hide(record_stop_button); gtk_main(); /* Out of the main loop, clean up nicely */ g_print("Stopping playback\n"); gst_element_set_state(pipeline, GST_STATE_NULL); g_print("Deleting pipeline\n"); gst_object_unref(GST_OBJECT(pipeline)); return 0; }