unsigned Mavlink::get_free_tx_buf() { /* * Check if the OS buffer is full and disable HW * flow control if it continues to be full */ int buf_free = 0; (void) ioctl(_uart_fd, FIONWRITE, (unsigned long)&buf_free); if (get_flow_control_enabled() && buf_free < FLOW_CONTROL_DISABLE_THRESHOLD) { /* Disable hardware flow control: * if no successful write since a defined time * and if the last try was not the last successful write */ if (_last_write_try_time != 0 && hrt_elapsed_time(&_last_write_success_time) > 500 * 1000UL && _last_write_success_time != _last_write_try_time) { warnx("Disabling hardware flow control"); enable_flow_control(false); } } return buf_free; }
std::string get_verbatim_kbinput(WINDOW *win) { /* Turn off flow control characters if necessary so that we can type them in verbatim */ if (ISSET(PRESERVE)) { disable_flow_control(); } std::string result = get_kbinput(win).verbatim(); /* Turn flow control characters back on if necessary */ if (ISSET(PRESERVE)) { enable_flow_control(); } return result; }
int initialise_uart() { // open uart _uart_fd = open(_device, O_RDWR | O_NOCTTY | O_NONBLOCK); int termios_state = -1; if (_uart_fd < 0) { PX4_ERR("failed to open uart device!"); return -1; } // set baud rate int speed = B250000; struct termios uart_config; tcgetattr(_uart_fd, &uart_config); // clear ONLCR flag (which appends a CR for every LF) uart_config.c_oflag &= ~ONLCR; // set baud rate if (cfsetispeed(&uart_config, speed) < 0 || cfsetospeed(&uart_config, speed) < 0) { PX4_ERR("failed to set baudrate for %s: %d\n", _device, termios_state); close(_uart_fd); return -1; } if ((termios_state = tcsetattr(_uart_fd, TCSANOW, &uart_config)) < 0) { PX4_ERR("tcsetattr failed for %s\n", _device); close(_uart_fd); return -1; } // setup output flow control if (enable_flow_control(false)) { PX4_WARN("hardware flow disable failed"); } return _uart_fd; }
unsigned Mavlink::get_free_tx_buf() { /* * Check if the OS buffer is full and disable HW * flow control if it continues to be full */ int buf_free = 0; #ifndef __PX4_POSIX // No FIONWRITE on Linux #if !defined(__PX4_LINUX) (void) ioctl(_uart_fd, FIONWRITE, (unsigned long)&buf_free); #endif if (get_flow_control_enabled() && buf_free < FLOW_CONTROL_DISABLE_THRESHOLD) { /* Disable hardware flow control: * if no successful write since a defined time * and if the last try was not the last successful write */ if (_last_write_try_time != 0 && hrt_elapsed_time(&_last_write_success_time) > 500 * 1000UL && _last_write_success_time != _last_write_try_time) { warnx("Disabling hardware flow control"); enable_flow_control(false); } } #endif // if we are using network sockets, return max lenght of one packet if (get_protocol() == UDP || get_protocol() == TCP ) { return 1500; } return buf_free; }
int Mavlink::mavlink_open_uart(int baud, const char *uart_name, struct termios *uart_config_original, bool *is_usb) { /* process baud rate */ int speed; switch (baud) { case 0: speed = B0; break; case 50: speed = B50; break; case 75: speed = B75; break; case 110: speed = B110; break; case 134: speed = B134; break; case 150: speed = B150; break; case 200: speed = B200; break; case 300: speed = B300; break; case 600: speed = B600; break; case 1200: speed = B1200; break; case 1800: speed = B1800; break; case 2400: speed = B2400; break; case 4800: speed = B4800; break; case 9600: speed = B9600; break; case 19200: speed = B19200; break; case 38400: speed = B38400; break; case 57600: speed = B57600; break; case 115200: speed = B115200; break; case 230400: speed = B230400; break; case 460800: speed = B460800; break; case 921600: speed = B921600; break; default: warnx("ERROR: Unsupported baudrate: %d\n\tsupported examples:\n\t9600, 19200, 38400, 57600\t\n115200\n230400\n460800\n921600\n", baud); return -EINVAL; } /* open uart */ _uart_fd = open(uart_name, O_RDWR | O_NOCTTY); if (_uart_fd < 0) { return _uart_fd; } /* Try to set baud rate */ struct termios uart_config; int termios_state; *is_usb = false; /* Back up the original uart configuration to restore it after exit */ if ((termios_state = tcgetattr(_uart_fd, uart_config_original)) < 0) { warnx("ERR GET CONF %s: %d\n", uart_name, termios_state); close(_uart_fd); return -1; } /* Fill the struct for the new configuration */ tcgetattr(_uart_fd, &uart_config); /* Clear ONLCR flag (which appends a CR for every LF) */ uart_config.c_oflag &= ~ONLCR; /* USB serial is indicated by /dev/ttyACM0*/ if (strcmp(uart_name, "/dev/ttyACM0") != OK && strcmp(uart_name, "/dev/ttyACM1") != OK) { /* Set baud rate */ if (cfsetispeed(&uart_config, speed) < 0 || cfsetospeed(&uart_config, speed) < 0) { warnx("ERR SET BAUD %s: %d\n", uart_name, termios_state); close(_uart_fd); return -1; } } if ((termios_state = tcsetattr(_uart_fd, TCSANOW, &uart_config)) < 0) { warnx("ERR SET CONF %s\n", uart_name); close(_uart_fd); return -1; } if (!_is_usb_uart) { /* * Setup hardware flow control. If the port has no RTS pin this call will fail, * which is not an issue, but requires a separate call so we can fail silently. */ (void)tcgetattr(_uart_fd, &uart_config); uart_config.c_cflag |= CRTS_IFLOW; (void)tcsetattr(_uart_fd, TCSANOW, &uart_config); /* setup output flow control */ if (enable_flow_control(true)) { warnx("hardware flow control not supported"); } } else { _flow_control_enabled = false; } return _uart_fd; }