示例#1
0
static bool ltr_int_try_start_master(int *l_master_uplink, int *l_master_downlink)
{
  int master_restart_retries = master_retries;
  while(master_restart_retries > 0){

    close_master_comms(l_master_uplink, l_master_downlink);
    if(ltr_int_gui_lock(false)){

      start_master(l_master_uplink, l_master_downlink);
      --master_restart_retries;
    }else{
      master_restart_retries = master_retries;
    }

    if(open_master_comms(l_master_uplink, l_master_downlink)){
      ltr_int_log_message("Master is responding!\n");
      return true;
    }
    sleep(2);
  }
  return false;
}
示例#2
0
static bool ltr_int_try_start_master(int *l_master_uplink)
{
  int master_restart_retries = master_retries;
  while(master_restart_retries > 0){
    close_master_comms(l_master_uplink);
    if(ltr_int_gui_lock(false)){
      ltr_int_log_message("GUI lock retrieved, no GUI running.\n");
      start_master();
      usleep(100);
      --master_restart_retries;
    }else{
      master_restart_retries = master_retries;
    }

    if(open_master_comms(l_master_uplink)){
      ltr_int_log_message("Master is responding!\n");
      return true;
    }
    sleep(1);
  }
  return false;
}
示例#3
0
bool ltr_int_master(bool standalone)
{
    current_pose.pose.pitch = 0.0;
    current_pose.pose.yaw = 0.0;
    current_pose.pose.roll = 0.0;
    current_pose.pose.tx = 0.0;
    current_pose.pose.ty = 0.0;
    current_pose.pose.tz = 0.0;
    current_pose.pose.counter = 0;
    current_pose.pose.status = STOPPED;
    current_pose.blobs = 0;
    gui_shutdown_request = false;
    int socket;

    save_prefs = standalone;
    if(standalone) {
        //Detach from the caller, retaining stdin/out/err
        // Does weird things to gui ;)
        if(daemon(0, 1) != 0) {
            return false;
        }
        if(!ltr_int_gui_lock(false)) {
            ltr_int_log_message("Gui is active, quitting!\n");
            return true;
        }
        socket = ltr_int_create_server_socket(ltr_int_master_socket_name());
    } else {
        if(!ltr_int_gui_lock(true)) {
            ltr_int_log_message("Couldn't lock gui lockfile!\n");
            return false;
        }
        int counter = 10;
        while((socket = ltr_int_create_server_socket(ltr_int_master_socket_name())) <= 0) {
            if((counter--) <= 0) {
                ltr_int_log_message("The other master doesn't give up!\n");
                return false;
            }
            sleep(1);
        }
        ltr_int_log_message("Other master gave up, gui master taking over!\n");
    }

    if(socket < 0) {
        ltr_int_log_message("Master already running, quitting!\n");
        return true;
    }
    ltr_int_log_message("Starting as master!\n");
    if(ltr_int_init() != 0) {
        ltr_int_log_message("Could not initialize tracking!\n");
        ltr_int_log_message("Closing socket %d\n", socket);
        close(socket);
        unlink(ltr_int_master_socket_name());
        return false;
    }

    ltr_int_register_cbk(ltr_int_new_frame, NULL, ltr_int_state_changed, NULL);

    ltr_int_master_main_loop(socket);

    ltr_int_log_message("Shutting down tracking!\n");
    ltr_int_shutdown();
    ltr_int_log_message("Master closing socket %d\n", socket);
    close(socket);
    unlink(ltr_int_master_socket_name());
    ltr_int_gui_lock_clean();
    int cntr = 10;
    while((ltr_int_get_tracking_state() != STOPPED) && (cntr > 0)) {
        --cntr;
        ltr_int_log_message("Tracker not stopped yet, waiting for the stop...\n");
        sleep(1);
    }
    ltr_int_gui_lock_clean();
    if(standalone) {
        ltr_int_free_prefs();
    }
    return true;
}
示例#4
0
int ltr_int_master_main_loop(int socket)
{
    int res;
    int new_fd;
    bool close_conn;
    int heartbeat = 0;
    nfds_t i;
    no_slaves = false;

    struct sockaddr_un address;
    socklen_t address_len = sizeof(address);
    add_poll_desc(socket);
    while(1) {
        if(gui_shutdown_request || (!ltr_int_gui_lock(false)) ||
                no_slaves || (ltr_int_get_tracking_state() < LINUXTRACK_OK)) {
            break;
        }

        close_conn = false;
        for(i = 0; i < current_len; ++i) {
            descs[i].revents = 0;
        }
        res = poll(descs, current_len, 2000);
        if(res < 0) {
            ltr_int_my_perror("poll");
            continue;
        } else if(res == 0) {
            if(ltr_int_get_tracking_state() == PAUSED) {
                ++heartbeat;
                if(heartbeat > 5) {
                    linuxtrack_full_pose_t dummy;
                    dummy.pose.pitch = 0.0;
                    dummy.pose.yaw = 0.0;
                    dummy.pose.roll = 0.0;
                    dummy.pose.tx = 0.0;
                    dummy.pose.ty = 0.0;
                    dummy.pose.tz = 0.0;
                    dummy.pose.counter = 0;
                    dummy.pose.status = PAUSED;
                    dummy.blobs = 0;
                    ltr_int_broadcast_pose(dummy);
                    heartbeat = 0;
                }
            } else {
                heartbeat = 0;
            }
            continue;
        }
        for(i = 0; i < current_len; ++i) {
            if(descs[i].revents == 0) {
                continue;
            }
            if(descs[i].revents) {
                if(descs[i].revents & POLLIN) {
                    if(descs[i].fd == socket) {
                        do {
                            new_fd = accept(socket, (struct sockaddr*)&address, &address_len);
                            if(new_fd < 0) {
                                if(errno != EWOULDBLOCK) {
                                    ltr_int_my_perror("accept");
                                }
                                //No more connection requests
                                break;
                            } else {
                                add_poll_desc(new_fd);
                            }
                        } while(new_fd >= 0);
                    } else {
                        message_t msg;
                        msg.cmd = CMD_NOP;
                        ssize_t x = ltr_int_socket_receive(descs[i].fd, &msg, sizeof(message_t));
                        //ltr_int_log_message("Read %d bytes from fd %d.\n", (int)x, descs[i].fd);
                        if(x < 0) {
                            if(x != -EWOULDBLOCK) {
                                ltr_int_log_message("Unexpected error %d reading from fd %d.\n", x, descs[i].fd);
                                close_conn = true;
                                descs[i].fd = -1;
                            }
                        } else if(x == 0) {
                            //close_conn = true;
                            //descs[i].fd = -1;
                        } else {
                            //ltr_int_log_message("Received a message from slave (%d)!!!\n", msg.cmd);
                            switch(msg.cmd) {
                            case CMD_PAUSE:
                                ltr_int_suspend_cmd();
                                break;
                            case CMD_WAKEUP:
                                ltr_int_wakeup_cmd();
                                break;
                            case CMD_RECENTER:
                                ltr_int_recenter_cmd();
                                break;
                            case CMD_NEW_SOCKET:
                                //ltr_int_log_message("Cmd to register new slave...\n");
                                ltr_int_register_slave(descs[i].fd, msg);
                                break;
                            case CMD_FRAMES:
                                ltr_int_publish_frames_cmd();
                                break;
                            }
                        }
                    }
                }
                if(descs[i].revents & POLLHUP) {
                    ltr_int_log_message("Hangup at fd %d\n", descs[i].fd);
                    close_conn = true;
                }
            }
        }
        if(close_conn) {
            remove_poll_desc();
        }
    }
    return 0;
}