20 #if CONFIG_HAL_BOARD == HAL_BOARD_SITL 32 #include <sys/types.h> 33 #include <sys/socket.h> 34 #include <netinet/in.h> 35 #include <netinet/tcp.h> 36 #include <sys/select.h> 58 if (strcmp(path,
"GPS1") == 0) {
62 }
else if (strcmp(path,
"GPS2") == 0) {
75 char *saveptr =
nullptr;
76 char *s = strdup(path);
77 char *devtype = strtok_r(s,
":", &saveptr);
78 char *args1 = strtok_r(
nullptr,
":", &saveptr);
79 char *args2 = strtok_r(
nullptr,
":", &saveptr);
80 if (strcmp(devtype,
"tcp") == 0) {
81 uint16_t port = atoi(args1);
82 bool wait = (args2 && strcmp(args2,
"wait") == 0);
84 }
else if (strcmp(devtype,
"tcpclient") == 0) {
85 if (args2 ==
nullptr) {
88 uint16_t port = atoi(args2);
90 }
else if (strcmp(devtype,
"uart") == 0) {
91 uint32_t baudrate = args2? atoi(args2) : baud;
92 ::printf(
"UART connection %s:%u\n", args1, baudrate);
96 }
else if (strcmp(devtype,
"sim") == 0) {
97 ::printf(
"SIM connection %s:%s\n", args1, args2);
168 const ssize_t nwritten =
::write(
_fd, buffer, size);
190 struct sockaddr_in sockaddr;
213 memset(&sockaddr,0,
sizeof(sockaddr));
215 #ifdef HAVE_SOCK_SIN_LEN 216 sockaddr.sin_len =
sizeof(sockaddr);
219 sockaddr.sin_port = htons(port);
223 sockaddr.sin_family = AF_INET;
225 _listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
232 if (setsockopt(
_listen_fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one)) == -1) {
237 fprintf(stderr,
"bind port %u for %u\n",
238 (
unsigned)ntohs(sockaddr.sin_port),
241 ret = bind(
_listen_fd, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
243 fprintf(stderr,
"bind failed on port %u - %s\n",
244 (
unsigned)ntohs(sockaddr.sin_port),
255 fprintf(stderr,
"Serial port %u on TCP port %u\n", _portNumber,
260 if (wait_for_connection) {
261 fprintf(stdout,
"Waiting for connection ....\n");
268 setsockopt(
_fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one));
269 setsockopt(
_fd, IPPROTO_TCP, TCP_NODELAY, &one,
sizeof(one));
281 struct sockaddr_in sockaddr;
294 memset(&sockaddr,0,
sizeof(sockaddr));
296 #ifdef HAVE_SOCK_SIN_LEN 297 sockaddr.sin_len =
sizeof(sockaddr);
299 sockaddr.sin_port = htons(port);
300 sockaddr.sin_family = AF_INET;
301 sockaddr.sin_addr.s_addr = inet_addr(address);
303 _fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
310 setsockopt(
_fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one));
312 ret = connect(
_fd, (
struct sockaddr *)&sockaddr,
sizeof(sockaddr));
314 fprintf(stderr,
"connect failed on port %u - %s\n",
315 (
unsigned)ntohs(sockaddr.sin_port),
320 setsockopt(
_fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one));
321 setsockopt(
_fd, IPPROTO_TCP, TCP_NODELAY, &one,
sizeof(one));
348 int flags = fcntl(
_fd, F_GETFL, 0);
349 flags = flags | O_NONBLOCK;
350 fcntl(
_fd, F_SETFL, flags);
354 t.c_iflag &= ~(BRKINT | ICRNL | IMAXBEL | IXON | IXOFF);
355 t.c_oflag &= ~(OPOST | ONLCR);
356 t.c_lflag &= ~(ISIG | ICANON | IEXTEN | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE);
359 t.c_cflag |= CRTSCTS;
361 tcsetattr(
_fd, TCSANOW, &t);
384 setsockopt(
_fd, IPPROTO_TCP, TCP_NODELAY, &one,
sizeof(one));
385 setsockopt(
_fd, SOL_SOCKET, SO_REUSEADDR, &one,
sizeof(one));
409 if (select(fd+1, &fds,
nullptr,
nullptr, &tv) == 1) {
417 unsigned v = fcntl(fd, F_GETFL, 0);
418 fcntl(fd, F_SETFL, v | O_NONBLOCK);
428 unsigned v = fcntl(
_fd, F_GETFL, 0);
430 #if defined(__APPLE__) && defined(__MACH__) 431 fcntl(
_fd, F_SETFL | F_NOCACHE, v | O_SYNC);
433 fcntl(
_fd, F_SETFL, v | O_DIRECT | O_SYNC);
456 if (readptr && navail > 0) {
465 nwritten = send(
_fd, readptr, navail, MSG_DONTWAIT);
481 nread =
::read(fd, buf, space);
489 nread = recv(
_fd, buf, space, MSG_DONTWAIT);
527 last_receive_us -= transport_time_us;
529 return last_receive_us;
532 #endif // CONFIG_HAL_BOARD
static bool _select_check(int)
uint32_t available(void) const
int open(const char *pathname, int flags)
POSIX Open a file with integer mode flags.
const uint8_t * readptr(uint32_t &available_bytes)
bool set_unbuffered_writes(bool on) override
void _tcp_start_connection(uint16_t port, bool wait_for_connection)
static uint8_t buffer[SRXL_FRAMELEN_MAX]
char * strerror(int errnum)
POSIX strerror() - convert POSIX errno to text with user message.
void _tcp_start_client(const char *address, uint16_t port)
const char * _uart_path[6]
uint32_t space(void) const
static void _set_nonblocking(int)
bool set_speed(int speed)
virtual void printf(const char *,...) FMT_PRINTF(2
uint64_t receive_time_constraint_us(uint16_t nbytes) override
void _check_connection(void)
uint32_t available() override
int close(int fileno)
POSIX Close a file with fileno handel.
bool set_size(uint32_t size)
uint32_t read(uint8_t *data, uint32_t len)
uint32_t write(const uint8_t *data, uint32_t len)
bool use_rtscts(void) const
uint32_t txspace() override
int errno
Note: fdevopen assigns stdin,stdout,stderr.
int fprintf(FILE *fp, const char *fmt,...)
fprintf character write function
int sim_fd(const char *name, const char *arg)
uint64_t _receive_timestamp
void panic(const char *errormsg,...) FMT_PRINTF(1
void _uart_start_connection(void)
uint16_t base_port(void) const