32 #include <sys/types.h>
37 #endif // HAVE_CONFIG_H
63 sigjmp_buf ctrlc_capture;
65 jmp_buf ctrlc_capture;
66 #endif // HAVE_SIGLONGJMP
68 #if defined(__MINGW32__)
69 BOOL WINAPI win32_ctrlc_handler(DWORD type)
71 fprintf(stderr,
"\n");
87 fprintf(stderr,
"\n");
89 siglongjmp(ctrlc_capture, 1);
91 longjmp(ctrlc_capture, 1);
104 #endif // HAVE_SIGLONGJMP
106 #endif // defined(__MINGW32__)
110 #if defined(__MINGW32__)
113 if (!SetConsoleCtrlHandler(win32_ctrlc_handler, TRUE))
120 if (!SetConsoleCtrlHandler(NULL, FALSE))
132 signal(SIGINT, SIG_DFL);
134 #endif // defined(__MINGW32__)
138 int main(
int argc,
char *argv[])
140 pthread_t command_thread;
141 pthread_t control_thread;
142 pthread_t update_thread;
143 int command_thread_en;
144 int control_thread_en;
145 int update_thread_en;
177 close(STDOUT_FILENO);
178 close(STDERR_FILENO);
201 fprintf(stderr,
"YamabicoProject-Spur\n");
202 fprintf(stderr,
" Ver. %s\n", PROJECT_VERSION);
229 command_thread_en = 0;
230 command_thread_en = 0;
233 FILE *temp_paramfile = NULL;
249 int device_current, device_age;
250 sscanf(YP_PROTOCOL_NAME,
"YPP:%d:%d", ¤t, &age);
253 for (i = 0; i < 3; i++)
265 sscanf(version.
protocol,
"YPP:%d:%d", &device_current, &device_age);
268 if (device_current - device_age > current ||
269 device_current < current - age)
284 yprintf(
OUTPUT_LV_ERROR,
"Error: Device doesn't have available YP protocol version.\n(Device: %s, coordinator: %s)\n",
285 version.
protocol, YP_PROTOCOL_NAME);
293 if (device_current != current)
295 if (device_current < current)
350 if (strcmp(driver_param.
robot_name,
"embedded") == 0)
355 temp_paramfile = tmpfile();
371 fprintf(temp_paramfile,
"%s", param);
372 fseek(temp_paramfile, 0L, SEEK_SET);
375 else if (strlen(driver_param.
robot_name) > 0 && strcmp(driver_param.
robot_name,
"unknown") != 0)
479 spur->wheel_mode_prev[i] = -1;
487 command_thread_en = 1;
492 control_thread_en = 1;
496 control_thread_en = 0;
506 update_thread_en = 1;
510 update_thread_en = 0;
515 if (sigsetjmp(ctrlc_capture, 1) != 0)
521 if (setjmp(ctrlc_capture) != 0)
526 #endif // HAVE_SIGLONGJMP
543 if (update_thread_en)
545 pthread_cancel(update_thread);
546 pthread_join(update_thread, NULL);
547 update_thread_en = 0;
549 if (control_thread_en)
551 pthread_cancel(control_thread);
552 pthread_join(control_thread, NULL);
553 control_thread_en = 0;
555 if (command_thread_en)
557 pthread_cancel(command_thread);
558 pthread_join(command_thread, NULL);
559 command_thread_en = 0;
593 return (quit ? EXIT_SUCCESS : EXIT_FAILURE);