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; }
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; }
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; }
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; }