Browse Source
The changes for __PX4_POSIX are in mavlink_main.h Signed-off-by: Mark Charlebois <charlebm@gmail.com>sbg
1 changed files with 0 additions and 416 deletions
@ -1,416 +0,0 @@
@@ -1,416 +0,0 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* Copyright (c) 2012-2014 PX4 Development Team. All rights reserved. |
||||
* |
||||
* Redistribution and use in source and binary forms, with or without |
||||
* modification, are permitted provided that the following conditions |
||||
* are met: |
||||
* |
||||
* 1. Redistributions of source code must retain the above copyright |
||||
* notice, this list of conditions and the following disclaimer. |
||||
* 2. Redistributions in binary form must reproduce the above copyright |
||||
* notice, this list of conditions and the following disclaimer in |
||||
* the documentation and/or other materials provided with the |
||||
* distribution. |
||||
* 3. Neither the name PX4 nor the names of its contributors may be |
||||
* used to endorse or promote products derived from this software |
||||
* without specific prior written permission. |
||||
* |
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
* POSSIBILITY OF SUCH DAMAGE. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
/**
|
||||
* @file mavlink_main_posix.h |
||||
* MAVLink 1.0 protocol interface definition. |
||||
* |
||||
* @author Lorenz Meier <lm@inf.ethz.ch> |
||||
* @author Anton Babushkin <anton.babushkin@me.com> |
||||
* @author Mark Charlebois <charlebm@gmail.com> |
||||
*/ |
||||
|
||||
#pragma once |
||||
|
||||
#include <stdbool.h> |
||||
#include <drivers/device/device.h> |
||||
#include <systemlib/param/param.h> |
||||
#include <systemlib/perf_counter.h> |
||||
#include <pthread.h> |
||||
#include <mavlink/mavlink_log.h> |
||||
|
||||
#include <uORB/uORB.h> |
||||
#include <uORB/topics/mission.h> |
||||
#include <uORB/topics/mission_result.h> |
||||
#include <uORB/topics/telemetry_status.h> |
||||
|
||||
#include "mavlink_bridge_header.h" |
||||
#include "mavlink_orb_subscription.h" |
||||
#include "mavlink_stream.h" |
||||
#include "mavlink_messages.h" |
||||
#include "mavlink_mission.h" |
||||
#include "mavlink_parameters.h" |
||||
|
||||
class Mavlink : public device::VDev |
||||
{ |
||||
|
||||
public: |
||||
/**
|
||||
* Constructor |
||||
*/ |
||||
Mavlink(); |
||||
|
||||
/**
|
||||
* Destructor, also kills the mavlinks task. |
||||
*/ |
||||
~Mavlink(); |
||||
|
||||
/**
|
||||
* Start the mavlink task. |
||||
* |
||||
* @return OK on success. |
||||
*/ |
||||
static int start(int argc, char *argv[]); |
||||
|
||||
/**
|
||||
* Display the mavlink status. |
||||
*/ |
||||
void display_status(); |
||||
|
||||
static int stream_command(int argc, char *argv[]); |
||||
|
||||
static int instance_count(); |
||||
|
||||
static Mavlink *new_instance(); |
||||
|
||||
static Mavlink *get_instance(unsigned instance); |
||||
|
||||
static Mavlink *get_instance_for_device(const char *device_name); |
||||
|
||||
static int destroy_all_instances(); |
||||
|
||||
static int get_status_all_instances(); |
||||
|
||||
static bool instance_exists(const char *device_name, Mavlink *self); |
||||
|
||||
static void forward_message(const mavlink_message_t *msg, Mavlink *self); |
||||
|
||||
static int get_uart_fd(unsigned index); |
||||
|
||||
int get_uart_fd(); |
||||
|
||||
/**
|
||||
* Get the MAVLink system id. |
||||
* |
||||
* @return The system ID of this vehicle |
||||
*/ |
||||
int get_system_id(); |
||||
|
||||
/**
|
||||
* Get the MAVLink component id. |
||||
* |
||||
* @return The component ID of this vehicle |
||||
*/ |
||||
int get_component_id(); |
||||
|
||||
const char *_device_name; |
||||
|
||||
enum MAVLINK_MODE { |
||||
MAVLINK_MODE_NORMAL = 0, |
||||
MAVLINK_MODE_CUSTOM, |
||||
MAVLINK_MODE_ONBOARD |
||||
}; |
||||
|
||||
void set_mode(enum MAVLINK_MODE); |
||||
enum MAVLINK_MODE get_mode() { return _mode; } |
||||
|
||||
bool get_hil_enabled() { return _hil_enabled; } |
||||
|
||||
bool get_use_hil_gps() { return _use_hil_gps; } |
||||
|
||||
bool get_forward_externalsp() { return _forward_externalsp; } |
||||
|
||||
bool get_flow_control_enabled() { return _flow_control_enabled; } |
||||
|
||||
bool get_forwarding_on() { return _forwarding_on; } |
||||
|
||||
/**
|
||||
* Get the free space in the transmit buffer |
||||
* |
||||
* @return free space in the UART TX buffer |
||||
*/ |
||||
unsigned get_free_tx_buf(); |
||||
|
||||
static int start_helper(int argc, char *argv[]); |
||||
|
||||
/**
|
||||
* Handle parameter related messages. |
||||
*/ |
||||
void mavlink_pm_message_handler(const mavlink_channel_t chan, const mavlink_message_t *msg); |
||||
|
||||
void get_mavlink_mode_and_state(struct vehicle_status_s *status, struct position_setpoint_triplet_s *pos_sp_triplet, uint8_t *mavlink_state, uint8_t *mavlink_base_mode, uint32_t *mavlink_custom_mode); |
||||
|
||||
/**
|
||||
* Enable / disable Hardware in the Loop simulation mode. |
||||
* |
||||
* @param hil_enabled The new HIL enable/disable state. |
||||
* @return OK if the HIL state changed, ERROR if the |
||||
* requested change could not be made or was |
||||
* redundant. |
||||
*/ |
||||
int set_hil_enabled(bool hil_enabled); |
||||
|
||||
void send_message(const uint8_t msgid, const void *msg, uint8_t component_ID = 0); |
||||
|
||||
/**
|
||||
* Resend message as is, don't change sequence number and CRC. |
||||
*/ |
||||
void resend_message(mavlink_message_t *msg); |
||||
|
||||
void handle_message(const mavlink_message_t *msg); |
||||
|
||||
MavlinkOrbSubscription *add_orb_subscription(const orb_id_t topic, int instance=0); |
||||
|
||||
int get_instance_id(); |
||||
|
||||
/**
|
||||
* Enable / disable hardware flow control. |
||||
* |
||||
* @param enabled True if hardware flow control should be enabled |
||||
*/ |
||||
int enable_flow_control(bool enabled); |
||||
|
||||
mavlink_channel_t get_channel(); |
||||
|
||||
void configure_stream_threadsafe(const char *stream_name, float rate); |
||||
|
||||
bool _task_should_exit; /**< if true, mavlink task should exit */ |
||||
|
||||
int get_mavlink_fd() { return _mavlink_fd; } |
||||
|
||||
/**
|
||||
* Send a status text with loglevel INFO |
||||
* |
||||
* @param string the message to send (will be capped by mavlink max string length) |
||||
*/ |
||||
void send_statustext_info(const char *string); |
||||
|
||||
/**
|
||||
* Send a status text with loglevel CRITICAL |
||||
* |
||||
* @param string the message to send (will be capped by mavlink max string length) |
||||
*/ |
||||
void send_statustext_critical(const char *string); |
||||
|
||||
/**
|
||||
* Send a status text with loglevel EMERGENCY |
||||
* |
||||
* @param string the message to send (will be capped by mavlink max string length) |
||||
*/ |
||||
void send_statustext_emergency(const char *string); |
||||
|
||||
/**
|
||||
* Send a status text with loglevel, the difference from mavlink_log_xxx() is that message sent |
||||
* only on this mavlink connection. Useful for reporting communication specific, not system-wide info |
||||
* only to client interested in it. Message will be not sent immediately but queued in buffer as |
||||
* for mavlink_log_xxx(). |
||||
* |
||||
* @param string the message to send (will be capped by mavlink max string length) |
||||
* @param severity the log level |
||||
*/ |
||||
void send_statustext(unsigned char severity, const char *string); |
||||
|
||||
MavlinkStream * get_streams() const { return _streams; } |
||||
|
||||
float get_rate_mult(); |
||||
|
||||
/* Functions for waiting to start transmission until message received. */ |
||||
void set_has_received_messages(bool received_messages) { _received_messages = received_messages; } |
||||
bool get_has_received_messages() { return _received_messages; } |
||||
void set_wait_to_transmit(bool wait) { _wait_to_transmit = wait; } |
||||
bool get_wait_to_transmit() { return _wait_to_transmit; } |
||||
bool should_transmit() { return (!_wait_to_transmit || (_wait_to_transmit && _received_messages)); } |
||||
|
||||
bool message_buffer_write(const void *ptr, int size); |
||||
|
||||
void lockMessageBufferMutex(void) { pthread_mutex_lock(&_message_buffer_mutex); } |
||||
void unlockMessageBufferMutex(void) { pthread_mutex_unlock(&_message_buffer_mutex); } |
||||
|
||||
/**
|
||||
* Count a transmision error |
||||
*/ |
||||
void count_txerr(); |
||||
|
||||
/**
|
||||
* Count transmitted bytes |
||||
*/ |
||||
void count_txbytes(unsigned n) { _bytes_tx += n; }; |
||||
|
||||
/**
|
||||
* Count bytes not transmitted because of errors |
||||
*/ |
||||
void count_txerrbytes(unsigned n) { _bytes_txerr += n; }; |
||||
|
||||
/**
|
||||
* Count received bytes |
||||
*/ |
||||
void count_rxbytes(unsigned n) { _bytes_rx += n; }; |
||||
|
||||
/**
|
||||
* Get the receive status of this MAVLink link |
||||
*/ |
||||
struct telemetry_status_s& get_rx_status() { return _rstatus; } |
||||
|
||||
struct mavlink_logbuffer *get_logbuffer() { return &_logbuffer; } |
||||
|
||||
unsigned get_system_type() { return _system_type; } |
||||
|
||||
protected: |
||||
Mavlink *next; |
||||
|
||||
private: |
||||
int _instance_id; |
||||
|
||||
int _mavlink_fd; |
||||
bool _task_running; |
||||
|
||||
/* states */ |
||||
bool _hil_enabled; /**< Hardware In the Loop mode */ |
||||
bool _use_hil_gps; /**< Accept GPS HIL messages (for example from an external motion capturing system to fake indoor gps) */ |
||||
bool _forward_externalsp; /**< Forward external setpoint messages to controllers directly if in offboard mode */ |
||||
bool _is_usb_uart; /**< Port is USB */ |
||||
bool _wait_to_transmit; /**< Wait to transmit until received messages. */ |
||||
bool _received_messages; /**< Whether we've received valid mavlink messages. */ |
||||
|
||||
unsigned _main_loop_delay; /**< mainloop delay, depends on data rate */ |
||||
|
||||
MavlinkOrbSubscription *_subscriptions; |
||||
MavlinkStream *_streams; |
||||
|
||||
MavlinkMissionManager *_mission_manager; |
||||
MavlinkParametersManager *_parameters_manager; |
||||
|
||||
MAVLINK_MODE _mode; |
||||
|
||||
mavlink_channel_t _channel; |
||||
|
||||
struct mavlink_logbuffer _logbuffer; |
||||
unsigned int _total_counter; |
||||
|
||||
pthread_t _receive_thread; |
||||
|
||||
bool _verbose; |
||||
bool _forwarding_on; |
||||
bool _passing_on; |
||||
bool _ftp_on; |
||||
int _uart_fd; |
||||
int _baudrate; |
||||
int _datarate; ///< data rate for normal streams (attitude, position, etc.)
|
||||
int _datarate_events; ///< data rate for params, waypoints, text messages
|
||||
float _rate_mult; |
||||
|
||||
/**
|
||||
* If the queue index is not at 0, the queue sending |
||||
* logic will send parameters from the current index |
||||
* to len - 1, the end of the param list. |
||||
*/ |
||||
unsigned int _mavlink_param_queue_index; |
||||
|
||||
bool mavlink_link_termination_allowed; |
||||
|
||||
char *_subscribe_to_stream; |
||||
float _subscribe_to_stream_rate; |
||||
|
||||
bool _flow_control_enabled; |
||||
uint64_t _last_write_success_time; |
||||
uint64_t _last_write_try_time; |
||||
|
||||
unsigned _bytes_tx; |
||||
unsigned _bytes_txerr; |
||||
unsigned _bytes_rx; |
||||
uint64_t _bytes_timestamp; |
||||
float _rate_tx; |
||||
float _rate_txerr; |
||||
float _rate_rx; |
||||
|
||||
struct telemetry_status_s _rstatus; ///< receive status
|
||||
|
||||
struct mavlink_message_buffer { |
||||
int write_ptr; |
||||
int read_ptr; |
||||
int size; |
||||
char *data; |
||||
}; |
||||
|
||||
mavlink_message_buffer _message_buffer; |
||||
|
||||
pthread_mutex_t _message_buffer_mutex; |
||||
pthread_mutex_t _send_mutex; |
||||
|
||||
bool _param_initialized; |
||||
param_t _param_system_id; |
||||
param_t _param_component_id; |
||||
param_t _param_system_type; |
||||
param_t _param_use_hil_gps; |
||||
param_t _param_forward_externalsp; |
||||
|
||||
unsigned _system_type; |
||||
|
||||
perf_counter_t _loop_perf; /**< loop performance counter */ |
||||
perf_counter_t _txerr_perf; /**< TX error counter */ |
||||
|
||||
void mavlink_update_system(); |
||||
|
||||
int mavlink_open_uart(int baudrate, const char *uart_name, struct termios *uart_config_original, bool *is_usb); |
||||
|
||||
static unsigned int interval_from_rate(float rate); |
||||
|
||||
int configure_stream(const char *stream_name, const float rate); |
||||
|
||||
/**
|
||||
* Adjust the stream rates based on the current rate |
||||
* |
||||
* @param multiplier if greater than 1, the transmission rate will increase, if smaller than one decrease |
||||
*/ |
||||
void adjust_stream_rates(const float multiplier); |
||||
|
||||
int message_buffer_init(int size); |
||||
|
||||
void message_buffer_destroy(); |
||||
|
||||
int message_buffer_count(); |
||||
|
||||
int message_buffer_is_empty(); |
||||
|
||||
int message_buffer_get_ptr(void **ptr, bool *is_part); |
||||
|
||||
void message_buffer_mark_read(int n); |
||||
|
||||
void pass_message(const mavlink_message_t *msg); |
||||
|
||||
/**
|
||||
* Update rate mult so total bitrate will be equal to _datarate. |
||||
*/ |
||||
void update_rate_mult(); |
||||
|
||||
virtual int ioctl(device::px4_dev_handle_t *handlep, int cmd, unsigned long arg); |
||||
|
||||
/**
|
||||
* Main mavlink task. |
||||
*/ |
||||
int task_main(int argc, char *argv[]); |
||||
|
||||
/* do not allow copying this class */ |
||||
Mavlink(const Mavlink&); |
||||
Mavlink operator=(const Mavlink&); |
||||
}; |
Loading…
Reference in new issue