Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 1701 → Rev 1702

/C-OSD/arducam-osd/ArduCAM_OSD/MAVLink.ino
0,0 → 1,154
#define MAVLINK_COMM_NUM_BUFFERS 1
#define MAVLINK_USE_CONVENIENCE_FUNCTIONS
 
// this code was moved from libraries/GCS_MAVLink to allow compile
// time selection of MAVLink 1.0
BetterStream *mavlink_comm_0_port;
BetterStream *mavlink_comm_1_port;
 
mavlink_system_t mavlink_system = {12,1,0,0};
 
#include "Mavlink_compat.h"
 
#ifdef MAVLINK10
#include "../GCS_MAVLink/include/mavlink/v1.0/mavlink_types.h"
#include "../GCS_MAVLink/include/mavlink/v1.0/ardupilotmega/mavlink.h"
#else
#include "../GCS_MAVLink/include/mavlink/v0.9/mavlink_types.h"
#include "../GCS_MAVLink/include/mavlink/v0.9/ardupilotmega/mavlink.h"
#endif
 
// true when we have received at least 1 MAVLink packet
static bool mavlink_active;
static uint8_t crlf_count = 0;
 
static int packet_drops = 0;
static int parse_error = 0;
 
void request_mavlink_rates()
{
const int maxStreams = 6;
const uint8_t MAVStreams[maxStreams] = {MAV_DATA_STREAM_RAW_SENSORS,
MAV_DATA_STREAM_EXTENDED_STATUS,
MAV_DATA_STREAM_RC_CHANNELS,
MAV_DATA_STREAM_POSITION,
MAV_DATA_STREAM_EXTRA1,
MAV_DATA_STREAM_EXTRA2};
const uint16_t MAVRates[maxStreams] = {0x02, 0x02, 0x05, 0x02, 0x05, 0x02};
for (int i=0; i < maxStreams; i++) {
mavlink_msg_request_data_stream_send(MAVLINK_COMM_0,
apm_mav_system, apm_mav_component,
MAVStreams[i], MAVRates[i], 1);
}
}
 
void read_mavlink(){
mavlink_message_t msg;
mavlink_status_t status;
//grabing data
while(Serial.available() > 0) {
uint8_t c = Serial.read();
/* allow CLI to be started by hitting enter 3 times, if no
heartbeat packets have been received */
if (mavlink_active == 0 && millis() < 20000) {
if (c == '\n' || c == '\r') {
crlf_count++;
} else {
crlf_count = 0;
}
if (crlf_count == 3) {
uploadFont();
}
}
//trying to grab msg
if(mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status)) {
mavlink_active = 1;
//handle msg
switch(msg.msgid) {
case MAVLINK_MSG_ID_HEARTBEAT:
{
mavbeat = 1;
apm_mav_system = msg.sysid;
apm_mav_component = msg.compid;
apm_mav_type = mavlink_msg_heartbeat_get_type(&msg);
#ifdef MAVLINK10
osd_mode = mavlink_msg_heartbeat_get_custom_mode(&msg);
osd_nav_mode = 0;
#endif
lastMAVBeat = millis();
if(waitingMAVBeats == 1){
enable_mav_request = 1;
}
}
break;
case MAVLINK_MSG_ID_SYS_STATUS:
{
#ifndef MAVLINK10
osd_vbat_A = (mavlink_msg_sys_status_get_vbat(&msg) / 1000.0f);
osd_mode = mavlink_msg_sys_status_get_mode(&msg);
osd_nav_mode = mavlink_msg_sys_status_get_nav_mode(&msg);
#else
osd_vbat_A = (mavlink_msg_sys_status_get_voltage_battery(&msg) / 1000.0f);
#endif
osd_battery_remaining_A = mavlink_msg_sys_status_get_battery_remaining(&msg);
//osd_mode = apm_mav_component;//Debug
//osd_nav_mode = apm_mav_system;//Debug
}
break;
#ifndef MAVLINK10
case MAVLINK_MSG_ID_GPS_RAW:
{
osd_lat = mavlink_msg_gps_raw_get_lat(&msg);
osd_lon = mavlink_msg_gps_raw_get_lon(&msg);
osd_fix_type = mavlink_msg_gps_raw_get_fix_type(&msg);
}
break;
case MAVLINK_MSG_ID_GPS_STATUS:
{
osd_satellites_visible = mavlink_msg_gps_status_get_satellites_visible(&msg);
}
break;
#else
case MAVLINK_MSG_ID_GPS_RAW_INT:
{
osd_lat = mavlink_msg_gps_raw_int_get_lat(&msg) / 10000000.0f;
osd_lon = mavlink_msg_gps_raw_int_get_lon(&msg) / 10000000.0f;
osd_fix_type = mavlink_msg_gps_raw_int_get_fix_type(&msg);
osd_satellites_visible = mavlink_msg_gps_raw_int_get_satellites_visible(&msg);
}
break;
#endif
 
case MAVLINK_MSG_ID_VFR_HUD:
{
osd_groundspeed = mavlink_msg_vfr_hud_get_groundspeed(&msg);
osd_heading = mavlink_msg_vfr_hud_get_heading(&msg);// * 3.60f;//0-100% of 360
osd_throttle = mavlink_msg_vfr_hud_get_throttle(&msg);
if(osd_throttle > 100 && osd_throttle < 150) osd_throttle = 100;//Temporary fix for ArduPlane 2.28
if(osd_throttle < 0 || osd_throttle > 150) osd_throttle = 0;//Temporary fix for ArduPlane 2.28
osd_alt = mavlink_msg_vfr_hud_get_alt(&msg);
}
break;
case MAVLINK_MSG_ID_ATTITUDE:
{
osd_pitch = ToDeg(mavlink_msg_attitude_get_pitch(&msg));
osd_roll = ToDeg(mavlink_msg_attitude_get_roll(&msg));
osd_yaw = ToDeg(mavlink_msg_attitude_get_yaw(&msg));
}
break;
default:
//Do nothing
break;
}
}
delayMicroseconds(138);
//next one
}
// Update global packet drops counter
packet_drops += status.packet_rx_drop_count;
parse_error += status.parse_error;
 
}