Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _DJI2MAV_MAVHEARTBEAT_H_
00010 #define _DJI2MAV_MAVHEARTBEAT_H_
00011
00012
00013 #include <mavlink/common/mavlink.h>
00014 #include <new>
00015 #include <string>
00016 #include <cstdarg>
00017
00018 #include "dji_sdk_dji2mav/modules/mavModule.h"
00019 #include "dji_sdk_dji2mav/log.h"
00020
00021 namespace dji2mav {
00022
00023 class MavHeartbeat : public MavModule {
00024 public:
00032 MavHeartbeat(MavHandler &handler, std::string name,
00033 uint16_t gcsNum, ...) : MavModule(handler, name, 4096) {
00034
00035 DJI2MAV_DEBUG("Going to construct Heartbeat module with name "
00036 "%s and gcsNum %u...", name.c_str(), gcsNum);
00037
00038 setHeartbeatData(MAV_TYPE_QUADROTOR, MAV_AUTOPILOT_GENERIC,
00039 MAV_MODE_GUIDED_DISARMED, 0, MAV_STATE_STANDBY, 3);
00040
00041 setHeartbeatHook(NULL);
00042
00043 va_list arg;
00044 va_start(arg, gcsNum);
00045 if(1 == gcsNum) {
00046 setMasterGcsIdx( (uint16_t)va_arg(arg, int) );
00047 } else {
00048 for(uint16_t i = 0; i < gcsNum; ++i) {
00049 employGcsSender( (uint16_t)va_arg(arg, int) );
00050 }
00051 }
00052 va_end(arg);
00053
00054
00055
00056 DJI2MAV_DEBUG("...finish constructing Heartbeat module.");
00057
00058 }
00059
00060
00061 ~MavHeartbeat() {
00062 DJI2MAV_DEBUG("Going to destruct Heartbeat module...");
00063 DJI2MAV_DEBUG("...finish destructing Heartbeat module.");
00064 }
00065
00066
00076 inline void setHeartbeatData(uint8_t mavType,
00077 uint8_t mavAutopilot, uint8_t mavMode,
00078 uint32_t customMode, uint8_t mavStatus,
00079 uint8_t mavVersion) {
00080
00081 m_hbMsg.type = mavType;
00082 m_hbMsg.autopilot = mavAutopilot;
00083 m_hbMsg.base_mode = mavMode;
00084 m_hbMsg.custom_mode = customMode;
00085 m_hbMsg.system_status = mavStatus;
00086 m_hbMsg.mavlink_version = mavVersion;
00087
00088 }
00089
00090
00095 inline void setType(uint8_t mavType) {
00096 m_hbMsg.type = mavType;
00097 }
00098
00099
00104 inline void setAutopilot(uint8_t mavAutopilot) {
00105 m_hbMsg.autopilot = mavAutopilot;
00106 }
00107
00108
00113 inline void setBaseMode(uint8_t mavMode) {
00114 m_hbMsg.base_mode = mavMode;
00115 }
00116
00117
00122 inline void setCustomMode(uint32_t customMode) {
00123 m_hbMsg.custom_mode = customMode;
00124 }
00125
00126
00131 inline void setSystemStatus(uint8_t mavStatus) {
00132 m_hbMsg.system_status = mavStatus;
00133 }
00134
00135
00140 inline void setMavlinkVersion(uint8_t mavVersion) {
00141 m_hbMsg.mavlink_version = mavVersion;
00142 }
00143
00144
00150 bool sendHeartbeatToGcs(uint16_t gcsIdx) {
00151
00152 mavlink_msg_heartbeat_encode(getMySysid(),
00153 MAV_COMP_ID_ALL, &m_sendMsg, &m_hbMsg);
00154
00155 if( sendMsgToGcs(gcsIdx, m_sendMsg) ) {
00156 return true;
00157 } else {
00158 DJI2MAV_ERROR("Fail to send Heartbeat to GCS #%u!", gcsIdx);
00159 return false;
00160 }
00161
00162 }
00163
00164
00169 bool sendHeartbeatToAll() {
00170
00171 mavlink_msg_heartbeat_encode(getMySysid(),
00172 MAV_COMP_ID_ALL, &m_sendMsg, &m_hbMsg);
00173
00174 if( sendMsgToAll(m_sendMsg) ) {
00175 return true;
00176 } else {
00177 DJI2MAV_ERROR("Fail to send Heartbeat to some GCS!");
00178 return false;
00179 }
00180
00181 }
00182
00183
00189 void reactToHeartbeat(uint16_t gcsIdx, const mavlink_message_t* msg) {
00190 if(NULL != m_hook) {
00191 m_hook();
00192 }
00193 }
00194
00195
00200 inline void setHeartbeatHook( void (*func)() ) {
00201 m_hook = func;
00202 }
00203
00204
00209 void passivelyReceive(mavlink_message_t &msg) {
00210 }
00211
00212
00216 void activelySend() {
00217 sendHeartbeatToAll();
00218 sleep(1);
00219 }
00220
00221
00222 private:
00223 mavlink_message_t m_sendMsg;
00224 mavlink_heartbeat_t m_hbMsg;
00225
00226 void (*m_hook)();
00227
00228 };
00229
00230 }
00231
00232
00233 #endif