/* start an instance of nsh */ bool PX4Util::run_debug_shell(AP_HAL::BetterStream *stream) { PX4UARTDriver *uart = (PX4UARTDriver *)stream; int fd; // trigger exit in the other threads. This stops use of the // various driver handles, and especially the px4io handle, // which otherwise would cause a crash if px4io is stopped in // the shell _px4_thread_should_exit = true; // take control of stream fd fd = uart->_get_fd(); // mark it blocking (nsh expects a blocking fd) unsigned v; v = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, v & ~O_NONBLOCK); // setup the UART on stdin/stdout/stderr close(0); close(1); close(2); dup2(fd, 0); dup2(fd, 1); dup2(fd, 2); nsh_consolemain(0, NULL, false); // this shouldn't happen hal.console->printf("shell exited\n"); return true; }
void HAL_PX4::run(int argc, char * const argv[], Callbacks* callbacks) const { int i; const char *deviceA = UARTA_DEFAULT_DEVICE; const char *deviceC = UARTC_DEFAULT_DEVICE; const char *deviceD = UARTD_DEFAULT_DEVICE; const char *deviceE = UARTE_DEFAULT_DEVICE; if (argc < 1) { printf("%s: missing command (try '%s start')", SKETCHNAME, SKETCHNAME); usage(); exit(1); } assert(callbacks); g_callbacks = callbacks; for (i=0; i<argc; i++) { if (strcmp(argv[i], "start") == 0) { if (thread_running) { printf("%s already running\n", SKETCHNAME); /* this is not an error */ exit(0); } uartADriver.set_device_path(deviceA); uartCDriver.set_device_path(deviceC); uartDDriver.set_device_path(deviceD); uartEDriver.set_device_path(deviceE); printf("Starting %s uartA=%s uartC=%s uartD=%s uartE=%s\n", SKETCHNAME, deviceA, deviceC, deviceD, deviceE); _px4_thread_should_exit = false; daemon_task = px4_task_spawn_cmd(SKETCHNAME, SCHED_FIFO, APM_MAIN_PRIORITY, APM_MAIN_THREAD_STACK_SIZE, main_loop, NULL); exit(0); } if (strcmp(argv[i], "stop") == 0) { _px4_thread_should_exit = true; exit(0); } if (strcmp(argv[i], "status") == 0) { if (_px4_thread_should_exit && thread_running) { printf("\t%s is exiting\n", SKETCHNAME); } else if (thread_running) { printf("\t%s is running\n", SKETCHNAME); } else { printf("\t%s is not started\n", SKETCHNAME); } exit(0); } if (strcmp(argv[i], "-d") == 0) { // set terminal device if (argc > i + 1) { deviceA = strdup(argv[i+1]); } else { printf("missing parameter to -d DEVICE\n"); usage(); exit(1); } } if (strcmp(argv[i], "-d2") == 0) { // set uartC terminal device if (argc > i + 1) { deviceC = strdup(argv[i+1]); } else { printf("missing parameter to -d2 DEVICE\n"); usage(); exit(1); } } if (strcmp(argv[i], "-d3") == 0) { // set uartD terminal device if (argc > i + 1) { deviceD = strdup(argv[i+1]); } else { printf("missing parameter to -d3 DEVICE\n"); usage(); exit(1); } } if (strcmp(argv[i], "-d4") == 0) { // set uartE 2nd GPS device if (argc > i + 1) { deviceE = strdup(argv[i+1]); } else { printf("missing parameter to -d4 DEVICE\n"); usage(); exit(1); } } } usage(); exit(1); }
void HAL_PX4::init(int argc, char * const argv[]) const { int i; const char *deviceA = UARTA_DEFAULT_DEVICE; const char *deviceC = UARTC_DEFAULT_DEVICE; if (argc < 1) { printf("%s: missing command (try '%s start')", SKETCHNAME, SKETCHNAME); usage(); exit(1); } for (i=0; i<argc; i++) { if (strcmp(argv[i], "start") == 0) { if (thread_running) { printf("%s already running\n", SKETCHNAME); /* this is not an error */ exit(0); } uartADriver.set_device_path(deviceA); uartCDriver.set_device_path(deviceC); printf("Starting %s on %s and %s\n", SKETCHNAME, deviceA, deviceC); _px4_thread_should_exit = false; daemon_task = task_spawn_cmd(SKETCHNAME, SCHED_FIFO, APM_MAIN_PRIORITY, 8192, main_loop, NULL); exit(0); } if (strcmp(argv[i], "stop") == 0) { _px4_thread_should_exit = true; exit(0); } if (strcmp(argv[i], "status") == 0) { if (_px4_thread_should_exit && thread_running) { printf("\t%s is exiting\n", SKETCHNAME); } else if (thread_running) { printf("\t%s is running\n", SKETCHNAME); } else { printf("\t%s is not started\n", SKETCHNAME); } exit(0); } if (strcmp(argv[i], "-d") == 0) { // set terminal device if (argc > i + 1) { deviceA = strdup(argv[i+1]); } else { printf("missing parameter to -d DEVICE\n"); usage(); exit(1); } } if (strcmp(argv[i], "-d2") == 0) { // set uartC terminal device if (argc > i + 1) { deviceC = strdup(argv[i+1]); } else { printf("missing parameter to -d2 DEVICE\n"); usage(); exit(1); } } } usage(); exit(1); }