Пример #1
0
/*
 * 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;
}