@ -25,21 +25,36 @@ static uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid)
@@ -25,21 +25,36 @@ static uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid)
}
}
void mavlink _send_message( mavlink_channel_t chan , uint8_t id , uint32_t param , uint16_t packet_drops )
// try to send a message, return false if it won't fit in the serial tx buffer
static bool mavlink_try _send_message( mavlink_channel_t chan , uint8_t id , uint16_t packet_drops )
{
uint64_t timeStamp = micros ( ) ;
int payload_space = comm_get_txspace ( chan ) - MAVLINK_NUM_NON_PAYLOAD_BYTES ;
# define CHECK_PAYLOAD_SIZE(id) if (payload_space < MAVLINK_MSG_ID_## id ##_LEN) return false
if ( chan = = MAVLINK_COMM_1 & & millis ( ) < 1000 ) {
// defer any messages on the telemetry port for 1 second after
// bootup, to try to prevent bricking of Xbees
return false ;
}
switch ( id ) {
case MSG_HEARTBEAT :
{
CHECK_PAYLOAD_SIZE ( HEARTBEAT ) ;
mavlink_msg_heartbeat_send (
chan ,
mavlink_system . type ,
MAV_AUTOPILOT_ARDUPILOTMEGA ) ;
break ;
}
case MSG_EXTENDED_STATUS :
case MSG_EXTENDED_STATUS1 :
{
CHECK_PAYLOAD_SIZE ( SYS_STATUS ) ;
uint8_t mode = MAV_MODE_UNINIT ;
uint8_t nav_mode = MAV_NAV_VECTOR ;
@ -76,17 +91,21 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -76,17 +91,21 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
battery_voltage * 1000 ,
battery_remaining ,
packet_drops ) ;
break ;
}
# ifdef MAVLINK_MSG_ID_MEMINFO
case MSG_EXTENDED_STATUS2 :
{
CHECK_PAYLOAD_SIZE ( MEMINFO ) ;
extern unsigned __brkval ;
mavlink_msg_meminfo_send ( chan , __brkval , memcheck_available_memory ( ) ) ;
# endif
break ;
}
case MSG_ATTITUDE :
{
//Vector3f omega = dcm.get_gyro();
CHECK_PAYLOAD_SIZE ( ATTITUDE ) ;
mavlink_msg_attitude_send (
chan ,
timeStamp ,
@ -101,6 +120,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -101,6 +120,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_LOCATION :
{
CHECK_PAYLOAD_SIZE ( GLOBAL_POSITION_INT ) ;
Matrix3f rot = dcm . get_dcm_matrix ( ) ; // neglecting angle of attack for now
mavlink_msg_global_position_int_send (
chan ,
@ -117,6 +137,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -117,6 +137,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_NAV_CONTROLLER_OUTPUT :
{
//if (control_mode != MANUAL) {
CHECK_PAYLOAD_SIZE ( NAV_CONTROLLER_OUTPUT ) ;
mavlink_msg_nav_controller_output_send (
chan ,
nav_roll / 1.0e2 ,
@ -133,6 +154,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -133,6 +154,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_LOCAL_LOCATION :
{
CHECK_PAYLOAD_SIZE ( LOCAL_POSITION ) ;
Matrix3f rot = dcm . get_dcm_matrix ( ) ; // neglecting angle of attack for now
mavlink_msg_local_position_send (
chan ,
@ -148,6 +170,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -148,6 +170,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_GPS_RAW :
{
CHECK_PAYLOAD_SIZE ( GPS_RAW ) ;
mavlink_msg_gps_raw_send (
chan ,
timeStamp ,
@ -164,6 +187,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -164,6 +187,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_SERVO_OUT :
{
CHECK_PAYLOAD_SIZE ( RC_CHANNELS_SCALED ) ;
uint8_t rssi = 1 ;
// normalized values scaled to -10000 to 10000
// This is used for HIL. Do not change without discussing with HIL maintainers
@ -183,6 +207,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -183,6 +207,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_RADIO_IN :
{
CHECK_PAYLOAD_SIZE ( RC_CHANNELS_RAW ) ;
uint8_t rssi = 1 ;
mavlink_msg_rc_channels_raw_send (
chan ,
@ -200,6 +225,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -200,6 +225,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_RADIO_OUT :
{
CHECK_PAYLOAD_SIZE ( SERVO_OUTPUT_RAW ) ;
mavlink_msg_servo_output_raw_send (
chan ,
motor_out [ 0 ] ,
@ -215,6 +241,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -215,6 +241,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_VFR_HUD :
{
CHECK_PAYLOAD_SIZE ( VFR_HUD ) ;
mavlink_msg_vfr_hud_send (
chan ,
( float ) airspeed / 100.0 ,
@ -228,8 +255,9 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -228,8 +255,9 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
}
# if HIL_MODE != HIL_MODE_ATTITUDE
case MSG_RAW_IMU :
case MSG_RAW_IMU1 :
{
CHECK_PAYLOAD_SIZE ( RAW_IMU ) ;
Vector3f accel = imu . get_accel ( ) ;
Vector3f gyro = imu . get_gyro ( ) ;
//Serial.printf_P(PSTR("sending accel: %f %f %f\n"), accel.x, accel.y, accel.z);
@ -246,21 +274,42 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -246,21 +274,42 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
compass . mag_x ,
compass . mag_y ,
compass . mag_z ) ;
break ;
}
/* This message is not working. Why?
case MSG_RAW_IMU2 :
{
CHECK_PAYLOAD_SIZE ( SCALED_PRESSURE ) ;
mavlink_msg_scaled_pressure_send (
chan ,
timeStamp ,
( float ) barometer . Press / 100. ,
( float ) adc . Ch ( AIRSPEED_CH ) , // We don't calculate the differential pressure value anywhere, so use raw
( int ) ( barometer . Temp * 100 ) ) ;
*/
( float ) barometer . Press / 100.0 ,
( float ) ( barometer . Press - ground_pressure ) / 100.0 ,
( int ) ( barometer . Temp * 10 ) ) ;
break ;
}
case MSG_RAW_IMU3 :
{
CHECK_PAYLOAD_SIZE ( SENSOR_OFFSETS ) ;
Vector3f mag_offsets = compass . get_offsets ( ) ;
mavlink_msg_sensor_offsets_send ( chan ,
mag_offsets . x ,
mag_offsets . y ,
mag_offsets . z ,
compass . get_declination ( ) ,
barometer . RawPress ,
barometer . RawTemp ,
imu . gx ( ) , imu . gy ( ) , imu . gz ( ) ,
imu . ax ( ) , imu . ay ( ) , imu . az ( ) ) ;
break ;
}
# endif // HIL_PROTOCOL != HIL_PROTOCOL_ATTITUDE
case MSG_GPS_STATUS :
{
CHECK_PAYLOAD_SIZE ( GPS_STATUS ) ;
mavlink_msg_gps_status_send (
chan ,
g_gps - > num_sats ,
@ -274,6 +323,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -274,6 +323,7 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
case MSG_CURRENT_WAYPOINT :
{
CHECK_PAYLOAD_SIZE ( WAYPOINT_CURRENT ) ;
mavlink_msg_waypoint_current_send (
chan ,
g . waypoint_index ) ;
@ -283,10 +333,77 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
@@ -283,10 +333,77 @@ void mavlink_send_message(mavlink_channel_t chan, uint8_t id, uint32_t param, ui
default :
break ;
}
return true ;
}
# define MAX_DEFERRED_MESSAGES 17 // should be at least equal to number of
// switch types in mavlink_try_send_message()
static struct mavlink_queue {
uint8_t deferred_messages [ MAX_DEFERRED_MESSAGES ] ;
uint8_t next_deferred_message ;
uint8_t num_deferred_messages ;
} mavlink_queue [ 2 ] ;
// send a message using mavlink
static void mavlink_send_message ( mavlink_channel_t chan , uint8_t id , uint16_t packet_drops )
{
uint8_t i , nextid ;
struct mavlink_queue * q = & mavlink_queue [ ( uint8_t ) chan ] ;
// see if we can send the deferred messages, if any
while ( q - > num_deferred_messages ! = 0 ) {
if ( ! mavlink_try_send_message ( chan ,
q - > deferred_messages [ q - > next_deferred_message ] ,
packet_drops ) ) {
break ;
}
q - > next_deferred_message + + ;
if ( q - > next_deferred_message = = MAX_DEFERRED_MESSAGES ) {
q - > next_deferred_message = 0 ;
}
q - > num_deferred_messages - - ;
}
if ( id = = MSG_RETRY_DEFERRED ) {
return ;
}
// this message id might already be deferred
for ( i = 0 , nextid = q - > next_deferred_message ; i < q - > num_deferred_messages ; i + + ) {
if ( q - > deferred_messages [ nextid ] = = id ) {
// its already deferred, discard
return ;
}
nextid + + ;
if ( nextid = = MAX_DEFERRED_MESSAGES ) {
nextid = 0 ;
}
}
if ( q - > num_deferred_messages ! = 0 | |
! mavlink_try_send_message ( chan , id , packet_drops ) ) {
// can't send it now, so defer it
if ( q - > num_deferred_messages = = MAX_DEFERRED_MESSAGES ) {
// the defer buffer is full, discard
return ;
}
nextid = q - > next_deferred_message + q - > num_deferred_messages ;
if ( nextid > = MAX_DEFERRED_MESSAGES ) {
nextid - = MAX_DEFERRED_MESSAGES ;
}
q - > deferred_messages [ nextid ] = id ;
q - > num_deferred_messages + + ;
}
}
void mavlink_send_text ( mavlink_channel_t chan , uint8_t severity , const char * str )
{
if ( chan = = MAVLINK_COMM_0 & & millis ( ) < 1000 ) {
// don't send status MAVLink messages for 1 second after
// bootup, to try to prevent Xbee bricking
return ;
}
mavlink_msg_statustext_send (
chan ,
severity ,