/// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*- #pragma once #include #if CONFIG_HAL_BOARD == HAL_BOARD_SITL #include #include #include "AP_HAL_SITL_Namespace.h" #include #include class HALSITL::UARTDriver : public AP_HAL::UARTDriver { public: friend class HALSITL::SITL_State; UARTDriver(const uint8_t portNumber, SITL_State *sitlState) { _portNumber = portNumber; _sitlState = sitlState; _fd = -1; _listen_fd = -1; } static UARTDriver *from(AP_HAL::UARTDriver *uart) { return static_cast(uart); } /* Implementations of UARTDriver virtual methods */ void begin(uint32_t b) { begin(b, 0, 0); } void begin(uint32_t b, uint16_t rxS, uint16_t txS); void end(); void flush(); bool is_initialized() { return true; } void set_blocking_writes(bool blocking) { _nonblocking_writes = !blocking; } bool tx_pending() { return false; } /* Implementations of Stream virtual methods */ uint32_t available() override; uint32_t txspace() override; int16_t read() override; /* Implementations of Print virtual methods */ size_t write(uint8_t c); size_t write(const uint8_t *buffer, size_t size); // file descriptor, exposed so SITL_State::loop_hook() can use it int _fd; enum flow_control get_flow_control(void) { return FLOW_CONTROL_ENABLE; } void _timer_tick(void); private: uint8_t _portNumber; bool _connected = false; // true if a client has connected bool _use_send_recv = false; int _listen_fd; // socket we are listening on int _serial_port; static bool _console; bool _nonblocking_writes; ByteBuffer _readbuffer{16384}; ByteBuffer _writebuffer{16384}; const char *_uart_path; uint32_t _uart_baudrate; // IPv4 address of target for uartC const char *_tcp_client_addr; void _tcp_start_connection(uint16_t port, bool wait_for_connection); void _uart_start_connection(void); void _check_reconnect(); void _tcp_start_client(const char *address, uint16_t port); void _check_connection(void); static bool _select_check(int ); static void _set_nonblocking(int ); SITL_State *_sitlState; }; #endif