#include <stdio.h> #include <termios.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <errno.h> #include <drivers/drv_hrt.h> #include <systemlib/err.h> #include <fcntl.h> #include <systemlib/mavlink_log.h>
#include <px4_platform_common/px4_config.h> #include <px4_platform_common/tasks.h> #include <px4_platform_common/posix.h> #include <poll.h> #include <math.h>
#include <drivers/drv_hrt.h> #include <uORB/topics/sensor_accel.h> #include <uORB/topics/sensor_gyro.h> #include <uORB/topics/sensor_combined.h> #include <uORB/topics/vehicle_attitude.h> #include <uORB/uORB.h>
static bool thread_should_exit = false; static bool thread_running = false; static int rw_uart_task;
static int uart_init(char * uart_name); static int set_uart_baudrate(const int fd, unsigned int baud);
__EXPORT int rw_uart_main(int argc, char *argv[]);
int rw_uart_thread_main(int argc, char *argv[]);
static void usage(const char *reason);
static void usage(const char *reason) { if (reason) { warnx("%s\n", reason); }
warnx("usage: px4_uorb_adver {start|stop|status} [-p <additional params>]\n\n"); }
int set_uart_baudrate(const int fd, unsigned int baud) { int speed;
switch (baud) { 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; default: warnx("ERR: baudrate: %d\n", baud); return -EINVAL; }
struct termios uart_config; int termios_state;
tcgetattr(fd, &uart_config);
uart_config.c_oflag &= ~ONLCR;
uart_config.c_cflag &= ~(CSTOPB | PARENB); uart_config.c_cflag |= CS8;
if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { warnx("ERR: %d (cfsetispeed)\n", termios_state); return false; }
if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { warnx("ERR: %d (cfsetospeed)\n", termios_state); return false; }
if ((termios_state = tcsetattr(fd, TCSANOW, &uart_config)) < 0) { warnx("ERR: %d (tcsetattr)\n", termios_state); return false; }
return true; }
int uart_init(char * uart_name) { int serial_fd = open(uart_name, O_RDWR | O_NOCTTY); if (serial_fd < 0) { err(1, "failed to open port: %s", uart_name); printf("failed to open port: %s\n", uart_name); return false; } printf("Open the %d\n", serial_fd); return serial_fd; }
int rw_uart_main(int argc, char *argv[]) { if (argc < 2) { usage("missing command"); return 1; }
if (!strcmp(argv[1], "start")) {
if (thread_running) { warnx("px4_uorb_subs already running\n"); return 0; }
thread_should_exit = false; rw_uart_task = px4_task_spawn_cmd("rw_uart", SCHED_DEFAULT, SCHED_PRIORITY_DEFAULT, 2000, rw_uart_thread_main, (argv) ? (char *const *)&argv[2] : (char *const *)NULL); return 0; }
if (!strcmp(argv[1], "stop")) { thread_should_exit = true; return 0; }
if (!strcmp(argv[1], "status")) { if (thread_running) { warnx("\trunning\n");
} else { warnx("\tnot started\n"); }
return 0; }
usage("unrecognized command"); return 1; }
int rw_uart_thread_main(int argc, char *argv[]) { int uart_read = uart_init("/dev/ttyS2"); if (false == uart_read) return -1; if (false == set_uart_baudrate(uart_read, 57600)) { printf("[JXF]set_uart_baudrate is failed\n"); return -1; } printf("[JXF]uart init is successful\n");
thread_running = true;
int sensor_accel_sub = orb_subscribe(ORB_ID(sensor_accel)); int sensor_gyro_sub = orb_subscribe(ORB_ID(sensor_gyro)); int sensor_combined_sub = orb_subscribe(ORB_ID(sensor_combined)); int vehicle_attitude_sub = orb_subscribe(ORB_ID(vehicle_attitude));
struct sensor_accel_s sensor_accel_data; struct sensor_gyro_s sensor_gyro_data; struct sensor_combined_s sensor_combined_data; struct vehicle_attitude_s vehicle_attitude_data;
char buffer[256];
while (!thread_should_exit) { if (orb_copy(ORB_ID(sensor_accel), sensor_accel_sub, &sensor_accel_data) == PX4_OK) { printf("sensor_accel: x: %.2f y: %.2f z: %.2f\n", (double)sensor_accel_data.x, (double)sensor_accel_data.y, (double)sensor_accel_data.z);
snprintf(buffer, sizeof(buffer), "sensor_accel: x: %.2f y: %.2f z: %.2f\n", (double)sensor_accel_data.x, (double)sensor_accel_data.y, (double)sensor_accel_data.z); write(uart_read, buffer, strlen(buffer)); }
if (orb_copy(ORB_ID(sensor_gyro), sensor_gyro_sub, &sensor_gyro_data) == PX4_OK) { printf("sensor_gyro: x: %.2f y: %.2f z: %.2f\n", (double)sensor_gyro_data.x, (double)sensor_gyro_data.y, (double)sensor_gyro_data.z);
snprintf(buffer, sizeof(buffer), "sensor_gyro: x: %.2f y: %.2f z: %.2f\n", (double)sensor_gyro_data.x, (double)sensor_gyro_data.y, (double)sensor_gyro_data.z); write(uart_read, buffer, strlen(buffer)); }
if (orb_copy(ORB_ID(sensor_combined), sensor_combined_sub, &sensor_combined_data) == PX4_OK) { printf("sensor_combined: accel: %.2f %.2f %.2f gyro: %.2f %.2f %.2f\n", (double)sensor_combined_data.accelerometer_m_s2[0], (double)sensor_combined_data.accelerometer_m_s2[1], (double)sensor_combined_data.accelerometer_m_s2[2], (double)sensor_combined_data.gyro_rad[0], (double)sensor_combined_data.gyro_rad[1], (double)sensor_combined_data.gyro_rad[2]);
snprintf(buffer, sizeof(buffer), "sensor_combined: accel: %.2f %.2f %.2f gyro: %.2f %.2f %.2f\n", (double)sensor_combined_data.accelerometer_m_s2[0], (double)sensor_combined_data.accelerometer_m_s2[1], (double)sensor_combined_data.accelerometer_m_s2[2], (double)sensor_combined_data.gyro_rad[0], (double)sensor_combined_data.gyro_rad[1], (double)sensor_combined_data.gyro_rad[2]); write(uart_read, buffer, strlen(buffer)); }
if (orb_copy(ORB_ID(vehicle_attitude), vehicle_attitude_sub, &vehicle_attitude_data) == PX4_OK) { printf("vehicle_attitude: q: %.2f %.2f %.2f %.2f\n", (double)vehicle_attitude_data.q[0], (double)vehicle_attitude_data.q[1], (double)vehicle_attitude_data.q[2], (double)vehicle_attitude_data.q[3]);
snprintf(buffer, sizeof(buffer), "vehicle_attitude: q: %.2f %.2f %.2f %.2f\n", (double)vehicle_attitude_data.q[0], (double)vehicle_attitude_data.q[1], (double)vehicle_attitude_data.q[2], (double)vehicle_attitude_data.q[3]); write(uart_read, buffer, strlen(buffer)); }
usleep(50000); }
PX4_WARN("[rw_uart] exiting."); thread_running = false;
close(uart_read); printf("UART close status: %d\n", uart_read);
return 0; }
rw-uart.c
|