Merge branch 'master' of https://code.google.com/p/ardupilot-mega
Conflicts: libraries/APM_PI/APM_PI.cpp
This commit is contained in:
commit
003e6e06a1
@ -22,3 +22,4 @@
|
|||||||
#include "APO_DefaultSetup.h"
|
#include "APO_DefaultSetup.h"
|
||||||
|
|
||||||
#include <WProgram.h>; int main(void) {init();setup();for(;;) loop(); return 0; }
|
#include <WProgram.h>; int main(void) {init();setup();for(;;) loop(); return 0; }
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -20,3 +20,4 @@
|
|||||||
|
|
||||||
// ArduPilotOne Default Setup
|
// ArduPilotOne Default Setup
|
||||||
#include "APO_DefaultSetup.h"
|
#include "APO_DefaultSetup.h"
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Created on: May 1, 2011
|
* Created on: May 1, 2011
|
||||||
* Author: jgoppert
|
* Author: jgoppert
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BOATGENERIC_H_
|
#ifndef BOATGENERIC_H_
|
||||||
@ -27,10 +28,10 @@ static const uint8_t heartBeatTimeout = 3;
|
|||||||
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
||||||
|
|
||||||
// baud rates
|
// baud rates
|
||||||
static uint32_t debugBaud = 57600;
|
static const uint32_t debugBaud = 57600;
|
||||||
static uint32_t telemBaud = 57600;
|
static const uint32_t telemBaud = 57600;
|
||||||
static uint32_t gpsBaud = 38400;
|
static const uint32_t gpsBaud = 38400;
|
||||||
static uint32_t hilBaud = 57600;
|
static const uint32_t hilBaud = 57600;
|
||||||
|
|
||||||
// optional sensors
|
// optional sensors
|
||||||
static const bool gpsEnabled = false;
|
static const bool gpsEnabled = false;
|
||||||
@ -61,20 +62,26 @@ static const float loop2Rate = 1; // gcs slow
|
|||||||
static const float loop3Rate = 0.1;
|
static const float loop3Rate = 0.1;
|
||||||
|
|
||||||
// gains
|
// gains
|
||||||
const float steeringP = 1.0;
|
static const float steeringP = 0.1;
|
||||||
const float steeringI = 0.0;
|
static const float steeringI = 0.0;
|
||||||
const float steeringD = 0.0;
|
static const float steeringD = 0.1;
|
||||||
const float steeringIMax = 0.0;
|
static const float steeringIMax = 0.0;
|
||||||
const float steeringYMax = 3.0;
|
static const float steeringYMax = 1;
|
||||||
const float steeringDFCut = 25;
|
static const float steeringDFCut = 25.0;
|
||||||
|
|
||||||
const float throttleP = 0.0;
|
static const float throttleP = 0.1;
|
||||||
const float throttleI = 0.0;
|
static const float throttleI = 0.0;
|
||||||
const float throttleD = 0.0;
|
static const float throttleD = 0.0;
|
||||||
const float throttleIMax = 0.0;
|
static const float throttleIMax = 0.0;
|
||||||
const float throttleYMax = 0.0;
|
static const float throttleYMax = 1;
|
||||||
const float throttleDFCut = 3.0;
|
static const float throttleDFCut = 0.0;
|
||||||
|
|
||||||
|
// guidance
|
||||||
|
static const float velCmd = 5;
|
||||||
|
static const float xt = 10;
|
||||||
|
static const float xtLim = 90;
|
||||||
|
|
||||||
#include "ControllerBoat.h"
|
#include "ControllerBoat.h"
|
||||||
|
|
||||||
#endif /* BOATGENERIC_H_ */
|
#endif /* BOATGENERIC_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -13,113 +13,68 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class ControllerBoat: public AP_Controller {
|
class ControllerBoat: public AP_Controller {
|
||||||
private:
|
|
||||||
AP_Var_group _group;
|
|
||||||
AP_Uint8 _mode;
|
|
||||||
enum {
|
|
||||||
k_chMode = k_radioChannelsStart, k_chStr, k_chThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
k_pidStr = k_controllersStart, k_pidThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
CH_MODE = 0, CH_STR, CH_THR
|
|
||||||
};
|
|
||||||
BlockPIDDfb pidStr;
|
|
||||||
BlockPID pidThr;
|
|
||||||
public:
|
public:
|
||||||
ControllerBoat(AP_Navigator * nav, AP_Guide * guide,
|
ControllerBoat(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal) :
|
||||||
AP_Controller(nav, guide, hal),
|
AP_Controller(nav, guide, hal,new AP_ArmingMechanism(hal,ch_thrust,ch_str,0.1,-0.9,0.9), ch_mode),
|
||||||
_group(k_cntrl, PSTR("CNTRL_")),
|
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
||||||
_mode(&_group, 1, MAV_MODE_UNINIT, PSTR("MODE")),
|
steeringI, steeringD, steeringIMax, steeringYMax,steeringDFCut),
|
||||||
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
pidThrust(new AP_Var_group(k_pidThrust, PSTR("THR_")), 1, throttleP,
|
||||||
steeringI, steeringD, steeringIMax, steeringYMax, steeringDFCut),
|
throttleI, throttleD, throttleIMax, throttleYMax,
|
||||||
pidThr(new AP_Var_group(k_pidThr, PSTR("THR_")), 1, throttleP,
|
throttleDFCut), _strCmd(0), _thrustCmd(0)
|
||||||
throttleI, throttleD, throttleIMax, throttleYMax,
|
{
|
||||||
throttleDFCut) {
|
_hal->debug->println_P(PSTR("initializing boat controller"));
|
||||||
_hal->debug->println_P(PSTR("initializing boat controller"));
|
|
||||||
|
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 7, 1100,
|
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
||||||
1500, 1900, RC_MODE_IN, false));
|
1500, 1900, RC_MODE_IN, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 0, 1100, 1540,
|
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 3, 1100, 1500,
|
||||||
1900, RC_MODE_INOUT, false));
|
1900, RC_MODE_INOUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chThr, PSTR("THR_"), APM_RC, 1, 1100, 1500,
|
new AP_RcChannel(k_chThrust, PSTR("THR_"), APM_RC, 2, 1100, 1500,
|
||||||
1900, RC_MODE_INOUT, false));
|
1900, RC_MODE_INOUT, false));
|
||||||
}
|
}
|
||||||
virtual MAV_MODE getMode() {
|
|
||||||
return (MAV_MODE) _mode.get();
|
|
||||||
}
|
|
||||||
virtual void update(const float & dt) {
|
|
||||||
|
|
||||||
// check for heartbeat
|
private:
|
||||||
if (_hal->heartBeatLost()) {
|
// methdos
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
void manualLoop(const float dt) {
|
||||||
setAllRadioChannelsToNeutral();
|
setAllRadioChannelsManually();
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
_strCmd = _hal->rc[ch_str]->getRadioPosition();
|
||||||
_hal->debug->printf_P(PSTR("comm lost, send heartbeat from gcs\n"));
|
_thrustCmd = _hal->rc[ch_thrust]->getRadioPosition();
|
||||||
return;
|
}
|
||||||
// if throttle less than 5% cut motor power
|
void autoLoop(const float dt) {
|
||||||
} else if (_hal->rc[CH_THR]->getRadioPosition() < 0.05) {
|
_strCmd = pidStr.update(_guide->getHeadingError(), _nav->getYawRate(), dt);
|
||||||
_mode = MAV_MODE_LOCKED;
|
_thrustCmd = pidThrust.update(
|
||||||
setAllRadioChannelsToNeutral();
|
_guide->getGroundSpeedCommand()
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
- _nav->getGroundSpeed(), dt);
|
||||||
return;
|
}
|
||||||
// if in live mode then set state to active
|
void setMotorsActive() {
|
||||||
} else if (_hal->getMode() == MODE_LIVE) {
|
// turn all motors off if below 0.1 throttle
|
||||||
_hal->setState(MAV_STATE_ACTIVE);
|
if (fabs(_hal->rc[ch_thrust]->getRadioPosition()) < 0.1) {
|
||||||
// if in hardware in the loop (control) mode, set to hilsim
|
setAllRadioChannelsToNeutral();
|
||||||
} else if (_hal->getMode() == MODE_HIL_CNTL) {
|
} else {
|
||||||
_hal->setState(MAV_STATE_HILSIM);
|
_hal->rc[ch_thrust]->setPosition(_thrustCmd);
|
||||||
}
|
_hal->rc[ch_str]->setPosition(_strCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// read switch to set mode
|
// attributes
|
||||||
if (_hal->rc[CH_MODE]->getRadioPosition() > 0) {
|
enum {
|
||||||
_mode = MAV_MODE_MANUAL;
|
ch_mode = 0, ch_str, ch_thrust
|
||||||
} else {
|
};
|
||||||
_mode = MAV_MODE_AUTO;
|
enum {
|
||||||
}
|
k_chMode = k_radioChannelsStart, k_chStr, k_chThrust
|
||||||
|
};
|
||||||
// manual mode
|
enum {
|
||||||
switch (_mode) {
|
k_pidStr = k_controllersStart, k_pidThrust
|
||||||
|
};
|
||||||
case MAV_MODE_MANUAL: {
|
BlockPIDDfb pidStr;
|
||||||
setAllRadioChannelsManually();
|
BlockPID pidThrust;
|
||||||
//_hal->debug->println("manual");
|
float _strCmd, _thrustCmd;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MAV_MODE_AUTO: {
|
|
||||||
float headingError = _guide->getHeadingCommand()
|
|
||||||
- _nav->getYaw();
|
|
||||||
if (headingError > 180 * deg2Rad)
|
|
||||||
headingError -= 360 * deg2Rad;
|
|
||||||
if (headingError < -180 * deg2Rad)
|
|
||||||
headingError += 360 * deg2Rad;
|
|
||||||
_hal->rc[CH_STR]->setPosition(
|
|
||||||
pidStr.update(headingError, _nav->getYawRate(), dt));
|
|
||||||
_hal->rc[CH_THR]->setPosition(
|
|
||||||
pidThr.update(
|
|
||||||
_guide->getGroundSpeedCommand()
|
|
||||||
- _nav->getGroundSpeed(), dt));
|
|
||||||
//_hal->debug->println("automode");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
setAllRadioChannelsToNeutral();
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
_hal->debug->printf_P(PSTR("unknown controller mode\n"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* CONTROLLERBOAT_H_ */
|
#endif /* CONTROLLERBOAT_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
V_FRAME
|
V_FRAME
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
# define CH7_OPTION CH7_DO_NOTHING
|
# define CH7_OPTION CH7_DO_NOTHING
|
||||||
/*
|
/*
|
||||||
CH7_DO_NOTHING
|
CH7_DO_NOTHING
|
||||||
@ -52,8 +51,7 @@
|
|||||||
|
|
||||||
//#define RATE_ROLL_I 0.18
|
//#define RATE_ROLL_I 0.18
|
||||||
//#define RATE_PITCH_I 0.18
|
//#define RATE_PITCH_I 0.18
|
||||||
|
//#define MOTORS_JD880
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// agmatthews USERHOOKS
|
// agmatthews USERHOOKS
|
||||||
|
@ -135,10 +135,14 @@ private:
|
|||||||
uint16_t _parameter_count; ///< cache of reportable parameters
|
uint16_t _parameter_count; ///< cache of reportable parameters
|
||||||
AP_Var *_find_parameter(uint16_t index); ///< find a reportable parameter by index
|
AP_Var *_find_parameter(uint16_t index); ///< find a reportable parameter by index
|
||||||
|
|
||||||
|
|
||||||
mavlink_channel_t chan;
|
mavlink_channel_t chan;
|
||||||
uint16_t packet_drops;
|
uint16_t packet_drops;
|
||||||
|
|
||||||
|
#if CLI_ENABLED == ENABLED
|
||||||
|
// this allows us to detect the user wanting the CLI to start
|
||||||
|
uint8_t crlf_count;
|
||||||
|
#endif
|
||||||
|
|
||||||
// waypoints
|
// waypoints
|
||||||
uint16_t waypoint_request_i; // request index
|
uint16_t waypoint_request_i; // request index
|
||||||
uint16_t waypoint_dest_sysid; // where to send requests
|
uint16_t waypoint_dest_sysid; // where to send requests
|
||||||
@ -150,7 +154,6 @@ private:
|
|||||||
uint32_t waypoint_timelast_receive; // milliseconds
|
uint32_t waypoint_timelast_receive; // milliseconds
|
||||||
uint16_t waypoint_send_timeout; // milliseconds
|
uint16_t waypoint_send_timeout; // milliseconds
|
||||||
uint16_t waypoint_receive_timeout; // milliseconds
|
uint16_t waypoint_receive_timeout; // milliseconds
|
||||||
float junk; //used to return a junk value for interface
|
|
||||||
|
|
||||||
// data stream rates
|
// data stream rates
|
||||||
AP_Var_group _group;
|
AP_Var_group _group;
|
||||||
|
@ -8,6 +8,9 @@ static bool in_mavlink_delay;
|
|||||||
// messages don't block the CPU
|
// messages don't block the CPU
|
||||||
static mavlink_statustext_t pending_status;
|
static mavlink_statustext_t pending_status;
|
||||||
|
|
||||||
|
// true when we have received at least 1 MAVLink packet
|
||||||
|
static bool mavlink_active;
|
||||||
|
|
||||||
|
|
||||||
// check if a message will fit in the payload space available
|
// check if a message will fit in the payload space available
|
||||||
#define CHECK_PAYLOAD_SIZE(id) if (payload_space < MAVLINK_MSG_ID_## id ##_LEN) return false
|
#define CHECK_PAYLOAD_SIZE(id) if (payload_space < MAVLINK_MSG_ID_## id ##_LEN) return false
|
||||||
@ -539,8 +542,26 @@ GCS_MAVLINK::update(void)
|
|||||||
{
|
{
|
||||||
uint8_t c = comm_receive_ch(chan);
|
uint8_t c = comm_receive_ch(chan);
|
||||||
|
|
||||||
|
#if CLI_ENABLED == ENABLED
|
||||||
|
/* allow CLI to be started by hitting enter 3 times, if no
|
||||||
|
heartbeat packets have been received */
|
||||||
|
if (mavlink_active == false) {
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
crlf_count++;
|
||||||
|
} else {
|
||||||
|
crlf_count = 0;
|
||||||
|
}
|
||||||
|
if (crlf_count == 3) {
|
||||||
|
run_cli();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Try to get a new message
|
// Try to get a new message
|
||||||
if(mavlink_parse_char(chan, c, &msg, &status)) handleMessage(&msg);
|
if (mavlink_parse_char(chan, c, &msg, &status)) {
|
||||||
|
mavlink_active = true;
|
||||||
|
handleMessage(&msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update packet drops counter
|
// Update packet drops counter
|
||||||
|
@ -361,6 +361,19 @@
|
|||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
// Attitude Control
|
// Attitude Control
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// Extra motor values that are changed from time to time by jani @ jDrones as software
|
||||||
|
// and charachteristics changes.
|
||||||
|
#ifdef MOTORS_JD880
|
||||||
|
# define STABILIZE_ROLL_P 3.6
|
||||||
|
# define STABILIZE_ROLL_I 0.06
|
||||||
|
# define STABILIZE_ROLL_IMAX 2.0 // degrees
|
||||||
|
# define STABILIZE_PITCH_P 3.6
|
||||||
|
# define STABILIZE_PITCH_I 0.06
|
||||||
|
# define STABILIZE_PITCH_IMAX 2.0 // degrees
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Jasons default values that are good for smaller payload motors.
|
||||||
#ifndef STABILIZE_ROLL_P
|
#ifndef STABILIZE_ROLL_P
|
||||||
# define STABILIZE_ROLL_P 4.6
|
# define STABILIZE_ROLL_P 4.6
|
||||||
#endif
|
#endif
|
||||||
@ -702,6 +715,11 @@
|
|||||||
# define CLI_ENABLED ENABLED
|
# define CLI_ENABLED ENABLED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// use this to disable the CLI slider switch
|
||||||
|
#ifndef CLI_SLIDER_ENABLED
|
||||||
|
# define CLI_SLIDER_ENABLED ENABLED
|
||||||
|
#endif
|
||||||
|
|
||||||
// delay to prevent Xbee bricking, in milliseconds
|
// delay to prevent Xbee bricking, in milliseconds
|
||||||
#ifndef MAVLINK_TELEMETRY_PORT_DELAY
|
#ifndef MAVLINK_TELEMETRY_PORT_DELAY
|
||||||
# define MAVLINK_TELEMETRY_PORT_DELAY 2000
|
# define MAVLINK_TELEMETRY_PORT_DELAY 2000
|
||||||
|
@ -43,6 +43,14 @@ const struct Menu::command main_menu_commands[] PROGMEM = {
|
|||||||
// Create the top-level menu object.
|
// Create the top-level menu object.
|
||||||
MENU(main_menu, THISFIRMWARE, main_menu_commands);
|
MENU(main_menu, THISFIRMWARE, main_menu_commands);
|
||||||
|
|
||||||
|
// the user wants the CLI. It never exits
|
||||||
|
static void run_cli(void)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
main_menu.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CLI_ENABLED
|
#endif // CLI_ENABLED
|
||||||
|
|
||||||
static void init_ardupilot()
|
static void init_ardupilot()
|
||||||
@ -215,7 +223,7 @@ static void init_ardupilot()
|
|||||||
DataFlash.Init();
|
DataFlash.Init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CLI_ENABLED == ENABLED
|
#if CLI_ENABLED == ENABLED && CLI_SLIDER_ENABLED == ENABLED
|
||||||
// If the switch is in 'menu' mode, run the main menu.
|
// If the switch is in 'menu' mode, run the main menu.
|
||||||
//
|
//
|
||||||
// Since we can't be sure that the setup or test mode won't leave
|
// Since we can't be sure that the setup or test mode won't leave
|
||||||
@ -225,11 +233,10 @@ static void init_ardupilot()
|
|||||||
if (check_startup_for_CLI()) {
|
if (check_startup_for_CLI()) {
|
||||||
digitalWrite(A_LED_PIN,HIGH); // turn on setup-mode LED
|
digitalWrite(A_LED_PIN,HIGH); // turn on setup-mode LED
|
||||||
Serial.printf_P(PSTR("\nCLI:\n\n"));
|
Serial.printf_P(PSTR("\nCLI:\n\n"));
|
||||||
for (;;) {
|
run_cli();
|
||||||
//Serial.println_P(PSTR("\nMove the slide switch and reset to FLY.\n"));
|
|
||||||
main_menu.run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
Serial.printf_P(PSTR("\nPress ENTER 3 times to start interactive setup\n\n"));
|
||||||
#endif // CLI_ENABLED
|
#endif // CLI_ENABLED
|
||||||
|
|
||||||
if(g.esc_calibrate == 1){
|
if(g.esc_calibrate == 1){
|
||||||
|
@ -135,10 +135,14 @@ private:
|
|||||||
uint16_t _parameter_count; ///< cache of reportable parameters
|
uint16_t _parameter_count; ///< cache of reportable parameters
|
||||||
AP_Var *_find_parameter(uint16_t index); ///< find a reportable parameter by index
|
AP_Var *_find_parameter(uint16_t index); ///< find a reportable parameter by index
|
||||||
|
|
||||||
|
|
||||||
mavlink_channel_t chan;
|
mavlink_channel_t chan;
|
||||||
uint16_t packet_drops;
|
uint16_t packet_drops;
|
||||||
|
|
||||||
|
#if CLI_ENABLED == ENABLED
|
||||||
|
// this allows us to detect the user wanting the CLI to start
|
||||||
|
uint8_t crlf_count;
|
||||||
|
#endif
|
||||||
|
|
||||||
// waypoints
|
// waypoints
|
||||||
uint16_t waypoint_request_i; // request index
|
uint16_t waypoint_request_i; // request index
|
||||||
uint16_t waypoint_dest_sysid; // where to send requests
|
uint16_t waypoint_dest_sysid; // where to send requests
|
||||||
@ -150,7 +154,6 @@ private:
|
|||||||
uint32_t waypoint_timelast_receive; // milliseconds
|
uint32_t waypoint_timelast_receive; // milliseconds
|
||||||
uint16_t waypoint_send_timeout; // milliseconds
|
uint16_t waypoint_send_timeout; // milliseconds
|
||||||
uint16_t waypoint_receive_timeout; // milliseconds
|
uint16_t waypoint_receive_timeout; // milliseconds
|
||||||
float junk; //used to return a junk value for interface
|
|
||||||
|
|
||||||
// data stream rates
|
// data stream rates
|
||||||
AP_Var_group _group;
|
AP_Var_group _group;
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
#include "Mavlink_compat.h"
|
||||||
|
|
||||||
// use this to prevent recursion during sensor init
|
// use this to prevent recursion during sensor init
|
||||||
static bool in_mavlink_delay;
|
static bool in_mavlink_delay;
|
||||||
|
|
||||||
@ -7,6 +9,8 @@ static bool in_mavlink_delay;
|
|||||||
// messages don't block the CPU
|
// messages don't block the CPU
|
||||||
static mavlink_statustext_t pending_status;
|
static mavlink_statustext_t pending_status;
|
||||||
|
|
||||||
|
// true when we have received at least 1 MAVLink packet
|
||||||
|
static bool mavlink_active;
|
||||||
|
|
||||||
// check if a message will fit in the payload space available
|
// check if a message will fit in the payload space available
|
||||||
#define CHECK_PAYLOAD_SIZE(id) if (payload_space < MAVLINK_MSG_ID_## id ##_LEN) return false
|
#define CHECK_PAYLOAD_SIZE(id) if (payload_space < MAVLINK_MSG_ID_## id ##_LEN) return false
|
||||||
@ -23,10 +27,85 @@ static mavlink_statustext_t pending_status;
|
|||||||
|
|
||||||
static NOINLINE void send_heartbeat(mavlink_channel_t chan)
|
static NOINLINE void send_heartbeat(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
uint8_t base_mode = 0;
|
||||||
|
uint8_t system_status = MAV_STATE_ACTIVE;
|
||||||
|
|
||||||
|
// we map the custom_mode to our internal mode plus 16, to lower
|
||||||
|
// the chance that a ground station will give us 0 and we
|
||||||
|
// interpret it as manual. This is necessary as the SET_MODE
|
||||||
|
// command has no way to indicate that the custom_mode is filled in
|
||||||
|
uint32_t custom_mode = control_mode + 16;
|
||||||
|
|
||||||
|
// work out the base_mode. This value is almost completely useless
|
||||||
|
// for APM, but we calculate it as best we can so a generic
|
||||||
|
// MAVLink enabled ground station can work out something about
|
||||||
|
// what the MAV is up to. The actual bit values are highly
|
||||||
|
// ambiguous for most of the APM flight modes. In practice, you
|
||||||
|
// only get useful information from the custom_mode, which maps to
|
||||||
|
// the APM flight mode and has a well defined meaning in the
|
||||||
|
// ArduPlane documentation
|
||||||
|
switch (control_mode) {
|
||||||
|
case MANUAL:
|
||||||
|
base_mode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED;
|
||||||
|
break;
|
||||||
|
case STABILIZE:
|
||||||
|
case FLY_BY_WIRE_A:
|
||||||
|
case FLY_BY_WIRE_B:
|
||||||
|
case FLY_BY_WIRE_C:
|
||||||
|
base_mode = MAV_MODE_FLAG_STABILIZE_ENABLED;
|
||||||
|
break;
|
||||||
|
case AUTO:
|
||||||
|
case RTL:
|
||||||
|
case LOITER:
|
||||||
|
case GUIDED:
|
||||||
|
case CIRCLE:
|
||||||
|
base_mode = MAV_MODE_FLAG_GUIDED_ENABLED |
|
||||||
|
MAV_MODE_FLAG_STABILIZE_ENABLED;
|
||||||
|
// note that MAV_MODE_FLAG_AUTO_ENABLED does not match what
|
||||||
|
// APM does in any mode, as that is defined as "system finds its own goal
|
||||||
|
// positions", which APM does not currently do
|
||||||
|
break;
|
||||||
|
case INITIALISING:
|
||||||
|
system_status = MAV_STATE_CALIBRATING;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (control_mode != MANUAL && control_mode != INITIALISING) {
|
||||||
|
// stabiliser of some form is enabled
|
||||||
|
base_mode |= MAV_MODE_FLAG_STABILIZE_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ENABLE_STICK_MIXING==ENABLED
|
||||||
|
if (control_mode != INITIALISING) {
|
||||||
|
// all modes except INITIALISING have some form of manual
|
||||||
|
// override if stick mixing is enabled
|
||||||
|
base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HIL_MODE != HIL_MODE_DISABLED
|
||||||
|
base_mode |= MAV_MODE_FLAG_HIL_ENABLED;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// we are armed if we are not initialising
|
||||||
|
if (control_mode != INITIALISING) {
|
||||||
|
base_mode |= MAV_MODE_FLAG_SAFETY_ARMED;
|
||||||
|
}
|
||||||
|
|
||||||
|
mavlink_msg_heartbeat_send(
|
||||||
|
chan,
|
||||||
|
MAV_TYPE_FIXED_WING,
|
||||||
|
MAV_AUTOPILOT_ARDUPILOTMEGA,
|
||||||
|
base_mode,
|
||||||
|
custom_mode,
|
||||||
|
system_status);
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_heartbeat_send(
|
mavlink_msg_heartbeat_send(
|
||||||
chan,
|
chan,
|
||||||
mavlink_system.type,
|
mavlink_system.type,
|
||||||
MAV_AUTOPILOT_ARDUPILOTMEGA);
|
MAV_AUTOPILOT_ARDUPILOTMEGA);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static NOINLINE void send_attitude(mavlink_channel_t chan)
|
static NOINLINE void send_attitude(mavlink_channel_t chan)
|
||||||
@ -45,6 +124,103 @@ static NOINLINE void send_attitude(mavlink_channel_t chan)
|
|||||||
|
|
||||||
static NOINLINE void send_extended_status1(mavlink_channel_t chan, uint16_t packet_drops)
|
static NOINLINE void send_extended_status1(mavlink_channel_t chan, uint16_t packet_drops)
|
||||||
{
|
{
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
uint32_t control_sensors_present = 0;
|
||||||
|
uint32_t control_sensors_enabled;
|
||||||
|
uint32_t control_sensors_health;
|
||||||
|
|
||||||
|
// first what sensors/controllers we have
|
||||||
|
control_sensors_present |= (1<<0); // 3D gyro present
|
||||||
|
control_sensors_present |= (1<<1); // 3D accelerometer present
|
||||||
|
if (g.compass_enabled) {
|
||||||
|
control_sensors_present |= (1<<2); // compass present
|
||||||
|
}
|
||||||
|
control_sensors_present |= (1<<3); // absolute pressure sensor present
|
||||||
|
if (g_gps->fix) {
|
||||||
|
control_sensors_present |= (1<<5); // GPS present
|
||||||
|
}
|
||||||
|
control_sensors_present |= (1<<10); // 3D angular rate control
|
||||||
|
control_sensors_present |= (1<<11); // attitude stabilisation
|
||||||
|
control_sensors_present |= (1<<12); // yaw position
|
||||||
|
control_sensors_present |= (1<<13); // altitude control
|
||||||
|
control_sensors_present |= (1<<14); // X/Y position control
|
||||||
|
control_sensors_present |= (1<<15); // motor control
|
||||||
|
|
||||||
|
// now what sensors/controllers are enabled
|
||||||
|
|
||||||
|
// first the sensors
|
||||||
|
control_sensors_enabled = control_sensors_present & 0x1FF;
|
||||||
|
|
||||||
|
// now the controllers
|
||||||
|
control_sensors_enabled = control_sensors_present & 0x1FF;
|
||||||
|
|
||||||
|
switch (control_mode) {
|
||||||
|
case MANUAL:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STABILIZE:
|
||||||
|
case FLY_BY_WIRE_A:
|
||||||
|
control_sensors_enabled |= (1<<10); // 3D angular rate control
|
||||||
|
control_sensors_enabled |= (1<<11); // attitude stabilisation
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLY_BY_WIRE_B:
|
||||||
|
control_sensors_enabled |= (1<<10); // 3D angular rate control
|
||||||
|
control_sensors_enabled |= (1<<11); // attitude stabilisation
|
||||||
|
control_sensors_enabled |= (1<<15); // motor control
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FLY_BY_WIRE_C:
|
||||||
|
control_sensors_enabled |= (1<<10); // 3D angular rate control
|
||||||
|
control_sensors_enabled |= (1<<11); // attitude stabilisation
|
||||||
|
control_sensors_enabled |= (1<<13); // altitude control
|
||||||
|
control_sensors_enabled |= (1<<15); // motor control
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AUTO:
|
||||||
|
case RTL:
|
||||||
|
case LOITER:
|
||||||
|
case GUIDED:
|
||||||
|
case CIRCLE:
|
||||||
|
control_sensors_enabled |= (1<<10); // 3D angular rate control
|
||||||
|
control_sensors_enabled |= (1<<11); // attitude stabilisation
|
||||||
|
control_sensors_enabled |= (1<<12); // yaw position
|
||||||
|
control_sensors_enabled |= (1<<13); // altitude control
|
||||||
|
control_sensors_enabled |= (1<<14); // X/Y position control
|
||||||
|
control_sensors_enabled |= (1<<15); // motor control
|
||||||
|
break;
|
||||||
|
|
||||||
|
case INITIALISING:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// at the moment all sensors/controllers are assumed healthy
|
||||||
|
control_sensors_health = control_sensors_present;
|
||||||
|
|
||||||
|
uint16_t battery_current = -1;
|
||||||
|
uint8_t battery_remaining = -1;
|
||||||
|
|
||||||
|
if (current_total != 0 && g.pack_capacity != 0) {
|
||||||
|
battery_remaining = (100.0 * (g.pack_capacity - current_total) / g.pack_capacity);
|
||||||
|
}
|
||||||
|
if (current_total != 0) {
|
||||||
|
battery_current = current_amps * 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
mavlink_msg_sys_status_send(
|
||||||
|
chan,
|
||||||
|
control_sensors_present,
|
||||||
|
control_sensors_enabled,
|
||||||
|
control_sensors_health,
|
||||||
|
(uint16_t)(load * 1000),
|
||||||
|
battery_voltage * 1000, // mV
|
||||||
|
battery_current, // in 10mA units
|
||||||
|
battery_remaining, // in %
|
||||||
|
0, // comm drops %,
|
||||||
|
0, // comm drops in pkts,
|
||||||
|
0, 0, 0, 0);
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
uint8_t mode = MAV_MODE_UNINIT;
|
uint8_t mode = MAV_MODE_UNINIT;
|
||||||
uint8_t nav_mode = MAV_NAV_VECTOR;
|
uint8_t nav_mode = MAV_NAV_VECTOR;
|
||||||
|
|
||||||
@ -96,6 +272,7 @@ static NOINLINE void send_extended_status1(mavlink_channel_t chan, uint16_t pack
|
|||||||
battery_voltage * 1000,
|
battery_voltage * 1000,
|
||||||
battery_remaining,
|
battery_remaining,
|
||||||
packet_drops);
|
packet_drops);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_meminfo(mavlink_channel_t chan)
|
static void NOINLINE send_meminfo(mavlink_channel_t chan)
|
||||||
@ -107,6 +284,19 @@ static void NOINLINE send_meminfo(mavlink_channel_t chan)
|
|||||||
static void NOINLINE send_location(mavlink_channel_t chan)
|
static void NOINLINE send_location(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
Matrix3f rot = dcm.get_dcm_matrix(); // neglecting angle of attack for now
|
Matrix3f rot = dcm.get_dcm_matrix(); // neglecting angle of attack for now
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
mavlink_msg_global_position_int_send(
|
||||||
|
chan,
|
||||||
|
millis(),
|
||||||
|
current_loc.lat, // in 1E7 degrees
|
||||||
|
current_loc.lng, // in 1E7 degrees
|
||||||
|
g_gps->altitude*10, // millimeters above sea level
|
||||||
|
current_loc.alt * 10, // millimeters above ground
|
||||||
|
g_gps->ground_speed * rot.a.x, // X speed cm/s
|
||||||
|
g_gps->ground_speed * rot.b.x, // Y speed cm/s
|
||||||
|
g_gps->ground_speed * rot.c.x,
|
||||||
|
g_gps->ground_course); // course in 1/100 degree
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_global_position_int_send(
|
mavlink_msg_global_position_int_send(
|
||||||
chan,
|
chan,
|
||||||
current_loc.lat,
|
current_loc.lat,
|
||||||
@ -115,6 +305,7 @@ static void NOINLINE send_location(mavlink_channel_t chan)
|
|||||||
g_gps->ground_speed * rot.a.x,
|
g_gps->ground_speed * rot.a.x,
|
||||||
g_gps->ground_speed * rot.b.x,
|
g_gps->ground_speed * rot.b.x,
|
||||||
g_gps->ground_speed * rot.c.x);
|
g_gps->ground_speed * rot.c.x);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_nav_controller_output(mavlink_channel_t chan)
|
static void NOINLINE send_nav_controller_output(mavlink_channel_t chan)
|
||||||
@ -133,6 +324,28 @@ static void NOINLINE send_nav_controller_output(mavlink_channel_t chan)
|
|||||||
|
|
||||||
static void NOINLINE send_gps_raw(mavlink_channel_t chan)
|
static void NOINLINE send_gps_raw(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
uint8_t fix;
|
||||||
|
if (g_gps->status() == 2) {
|
||||||
|
fix = 3;
|
||||||
|
} else {
|
||||||
|
fix = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
mavlink_msg_gps_raw_int_send(
|
||||||
|
chan,
|
||||||
|
micros(),
|
||||||
|
fix,
|
||||||
|
g_gps->latitude, // in 1E7 degrees
|
||||||
|
g_gps->longitude, // in 1E7 degrees
|
||||||
|
g_gps->altitude * 10, // in mm
|
||||||
|
g_gps->hdop,
|
||||||
|
65535,
|
||||||
|
g_gps->ground_speed, // cm/s
|
||||||
|
g_gps->ground_course, // 1/100 degrees,
|
||||||
|
g_gps->num_sats);
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_gps_raw_send(
|
mavlink_msg_gps_raw_send(
|
||||||
chan,
|
chan,
|
||||||
micros(),
|
micros(),
|
||||||
@ -144,13 +357,31 @@ static void NOINLINE send_gps_raw(mavlink_channel_t chan)
|
|||||||
0.0,
|
0.0,
|
||||||
g_gps->ground_speed / 100.0,
|
g_gps->ground_speed / 100.0,
|
||||||
g_gps->ground_course / 100.0);
|
g_gps->ground_course / 100.0);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_servo_out(mavlink_channel_t chan)
|
static void NOINLINE send_servo_out(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
const uint8_t rssi = 1;
|
const uint8_t rssi = 1;
|
||||||
// normalized values scaled to -10000 to 10000
|
// normalized values scaled to -10000 to 10000
|
||||||
// This is used for HIL. Do not change without discussing with HIL maintainers
|
// This is used for HIL. Do not change without discussing with
|
||||||
|
// HIL maintainers
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
mavlink_msg_rc_channels_scaled_send(
|
||||||
|
chan,
|
||||||
|
millis(),
|
||||||
|
0, // port 0
|
||||||
|
10000 * g.channel_roll.norm_output(),
|
||||||
|
10000 * g.channel_pitch.norm_output(),
|
||||||
|
10000 * g.channel_throttle.norm_output(),
|
||||||
|
10000 * g.channel_rudder.norm_output(),
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
rssi);
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_rc_channels_scaled_send(
|
mavlink_msg_rc_channels_scaled_send(
|
||||||
chan,
|
chan,
|
||||||
10000 * g.channel_roll.norm_output(),
|
10000 * g.channel_roll.norm_output(),
|
||||||
@ -162,12 +393,29 @@ static void NOINLINE send_servo_out(mavlink_channel_t chan)
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
rssi);
|
rssi);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_radio_in(mavlink_channel_t chan)
|
static void NOINLINE send_radio_in(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
uint8_t rssi = 1;
|
uint8_t rssi = 1;
|
||||||
|
#ifdef MAVLINK10
|
||||||
mavlink_msg_rc_channels_raw_send(
|
mavlink_msg_rc_channels_raw_send(
|
||||||
|
chan,
|
||||||
|
millis(),
|
||||||
|
0, // port
|
||||||
|
g.channel_roll.radio_in,
|
||||||
|
g.channel_pitch.radio_in,
|
||||||
|
g.channel_throttle.radio_in,
|
||||||
|
g.channel_rudder.radio_in,
|
||||||
|
g.rc_5.radio_in, // XXX currently only 4 RC channels defined
|
||||||
|
g.rc_6.radio_in,
|
||||||
|
g.rc_7.radio_in,
|
||||||
|
g.rc_8.radio_in,
|
||||||
|
rssi);
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
|
mavlink_msg_rc_channels_raw_send(
|
||||||
chan,
|
chan,
|
||||||
g.channel_roll.radio_in,
|
g.channel_roll.radio_in,
|
||||||
g.channel_pitch.radio_in,
|
g.channel_pitch.radio_in,
|
||||||
@ -178,10 +426,25 @@ static void NOINLINE send_radio_in(mavlink_channel_t chan)
|
|||||||
g.rc_7.radio_in,
|
g.rc_7.radio_in,
|
||||||
g.rc_8.radio_in,
|
g.rc_8.radio_in,
|
||||||
rssi);
|
rssi);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_radio_out(mavlink_channel_t chan)
|
static void NOINLINE send_radio_out(mavlink_channel_t chan)
|
||||||
{
|
{
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
mavlink_msg_servo_output_raw_send(
|
||||||
|
chan,
|
||||||
|
micros(),
|
||||||
|
0, // port
|
||||||
|
g.channel_roll.radio_out,
|
||||||
|
g.channel_pitch.radio_out,
|
||||||
|
g.channel_throttle.radio_out,
|
||||||
|
g.channel_rudder.radio_out,
|
||||||
|
g.rc_5.radio_out, // XXX currently only 4 RC channels defined
|
||||||
|
g.rc_6.radio_out,
|
||||||
|
g.rc_7.radio_out,
|
||||||
|
g.rc_8.radio_out);
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_servo_output_raw_send(
|
mavlink_msg_servo_output_raw_send(
|
||||||
chan,
|
chan,
|
||||||
g.channel_roll.radio_out,
|
g.channel_roll.radio_out,
|
||||||
@ -192,6 +455,7 @@ static void NOINLINE send_radio_out(mavlink_channel_t chan)
|
|||||||
g.rc_6.radio_out,
|
g.rc_6.radio_out,
|
||||||
g.rc_7.radio_out,
|
g.rc_7.radio_out,
|
||||||
g.rc_8.radio_out);
|
g.rc_8.radio_out);
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NOINLINE send_vfr_hud(mavlink_channel_t chan)
|
static void NOINLINE send_vfr_hud(mavlink_channel_t chan)
|
||||||
@ -325,7 +589,11 @@ static bool mavlink_try_send_message(mavlink_channel_t chan, enum ap_message id,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_GPS_RAW:
|
case MSG_GPS_RAW:
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
CHECK_PAYLOAD_SIZE(GPS_RAW_INT);
|
||||||
|
#else
|
||||||
CHECK_PAYLOAD_SIZE(GPS_RAW);
|
CHECK_PAYLOAD_SIZE(GPS_RAW);
|
||||||
|
#endif
|
||||||
send_gps_raw(chan);
|
send_gps_raw(chan);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -480,10 +748,11 @@ void mavlink_send_text(mavlink_channel_t chan, gcs_severity severity, const char
|
|||||||
mavlink_send_message(chan, MSG_STATUSTEXT, 0);
|
mavlink_send_message(chan, MSG_STATUSTEXT, 0);
|
||||||
} else {
|
} else {
|
||||||
// send immediately
|
// send immediately
|
||||||
mavlink_msg_statustext_send(
|
#ifdef MAVLINK10
|
||||||
chan,
|
mavlink_msg_statustext_send(chan, severity, str);
|
||||||
severity,
|
#else
|
||||||
(const int8_t*) str);
|
mavlink_msg_statustext_send(chan, severity, (const int8_t*) str);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -538,8 +807,26 @@ GCS_MAVLINK::update(void)
|
|||||||
{
|
{
|
||||||
uint8_t c = comm_receive_ch(chan);
|
uint8_t c = comm_receive_ch(chan);
|
||||||
|
|
||||||
|
#if CLI_ENABLED == ENABLED
|
||||||
|
/* allow CLI to be started by hitting enter 3 times, if no
|
||||||
|
heartbeat packets have been received */
|
||||||
|
if (mavlink_active == 0) {
|
||||||
|
if (c == '\n' || c == '\r') {
|
||||||
|
crlf_count++;
|
||||||
|
} else {
|
||||||
|
crlf_count = 0;
|
||||||
|
}
|
||||||
|
if (crlf_count == 3) {
|
||||||
|
run_cli();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Try to get a new message
|
// Try to get a new message
|
||||||
if (mavlink_parse_char(chan, c, &msg, &status)) handleMessage(&msg);
|
if (mavlink_parse_char(chan, c, &msg, &status)) {
|
||||||
|
mavlink_active = 1;
|
||||||
|
handleMessage(&msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update packet drops counter
|
// Update packet drops counter
|
||||||
@ -721,6 +1008,68 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
case MAVLINK_MSG_ID_COMMAND_LONG:
|
||||||
|
{
|
||||||
|
// decode
|
||||||
|
mavlink_command_long_t packet;
|
||||||
|
mavlink_msg_command_long_decode(msg, &packet);
|
||||||
|
if (mavlink_check_target(packet.target_system, packet.target_component)) break;
|
||||||
|
|
||||||
|
uint8_t result;
|
||||||
|
|
||||||
|
// do command
|
||||||
|
send_text(SEVERITY_LOW,PSTR("command received: "));
|
||||||
|
|
||||||
|
switch(packet.command) {
|
||||||
|
|
||||||
|
case MAV_CMD_NAV_LOITER_UNLIM:
|
||||||
|
set_mode(LOITER);
|
||||||
|
result = MAV_RESULT_ACCEPTED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
|
set_mode(RTL);
|
||||||
|
result = MAV_RESULT_ACCEPTED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
// not implemented yet, but could implement some of them
|
||||||
|
case MAV_CMD_NAV_LAND:
|
||||||
|
case MAV_CMD_NAV_TAKEOFF:
|
||||||
|
case MAV_CMD_NAV_ROI:
|
||||||
|
case MAV_CMD_NAV_PATHPLANNING:
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
case MAV_CMD_PREFLIGHT_CALIBRATION:
|
||||||
|
if (packet.param1 == 1 ||
|
||||||
|
packet.param2 == 1 ||
|
||||||
|
packet.param3 == 1) {
|
||||||
|
startup_IMU_ground();
|
||||||
|
}
|
||||||
|
if (packet.param4 == 1) {
|
||||||
|
trim_radio();
|
||||||
|
}
|
||||||
|
result = MAV_RESULT_ACCEPTED;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
default:
|
||||||
|
result = MAV_RESULT_UNSUPPORTED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mavlink_msg_command_ack_send(
|
||||||
|
chan,
|
||||||
|
packet.command,
|
||||||
|
result);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
case MAVLINK_MSG_ID_ACTION:
|
case MAVLINK_MSG_ID_ACTION:
|
||||||
{
|
{
|
||||||
// decode
|
// decode
|
||||||
@ -840,6 +1189,7 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
case MAVLINK_MSG_ID_SET_MODE:
|
case MAVLINK_MSG_ID_SET_MODE:
|
||||||
{
|
{
|
||||||
@ -847,6 +1197,29 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
mavlink_set_mode_t packet;
|
mavlink_set_mode_t packet;
|
||||||
mavlink_msg_set_mode_decode(msg, &packet);
|
mavlink_msg_set_mode_decode(msg, &packet);
|
||||||
|
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
// we ignore base_mode as there is no sane way to map
|
||||||
|
// from that bitmap to a APM flight mode. We rely on
|
||||||
|
// custom_mode instead.
|
||||||
|
// see comment on custom_mode above
|
||||||
|
int16_t adjusted_mode = packet.custom_mode - 16;
|
||||||
|
|
||||||
|
switch (adjusted_mode) {
|
||||||
|
case MANUAL:
|
||||||
|
case CIRCLE:
|
||||||
|
case STABILIZE:
|
||||||
|
case FLY_BY_WIRE_A:
|
||||||
|
case FLY_BY_WIRE_B:
|
||||||
|
case FLY_BY_WIRE_C:
|
||||||
|
case AUTO:
|
||||||
|
case RTL:
|
||||||
|
case LOITER:
|
||||||
|
set_mode(adjusted_mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // MAVLINK10
|
||||||
|
|
||||||
switch(packet.mode){
|
switch(packet.mode){
|
||||||
|
|
||||||
case MAV_MODE_MANUAL:
|
case MAV_MODE_MANUAL:
|
||||||
@ -876,8 +1249,11 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef MAVLINK10
|
||||||
case MAVLINK_MSG_ID_SET_NAV_MODE:
|
case MAVLINK_MSG_ID_SET_NAV_MODE:
|
||||||
{
|
{
|
||||||
// decode
|
// decode
|
||||||
@ -887,6 +1263,8 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
mav_nav = packet.nav_mode;
|
mav_nav = packet.nav_mode;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif // MAVLINK10
|
||||||
|
|
||||||
|
|
||||||
case MAVLINK_MSG_ID_WAYPOINT_REQUEST_LIST:
|
case MAVLINK_MSG_ID_WAYPOINT_REQUEST_LIST:
|
||||||
{
|
{
|
||||||
@ -910,6 +1288,7 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// XXX read a WP from EEPROM and send it to the GCS
|
// XXX read a WP from EEPROM and send it to the GCS
|
||||||
case MAVLINK_MSG_ID_WAYPOINT_REQUEST:
|
case MAVLINK_MSG_ID_WAYPOINT_REQUEST:
|
||||||
{
|
{
|
||||||
@ -1021,6 +1400,7 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case MAVLINK_MSG_ID_WAYPOINT_ACK:
|
case MAVLINK_MSG_ID_WAYPOINT_ACK:
|
||||||
{
|
{
|
||||||
// decode
|
// decode
|
||||||
@ -1056,13 +1436,12 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
if (mavlink_check_target(packet.target_system, packet.target_component)) break;
|
if (mavlink_check_target(packet.target_system, packet.target_component)) break;
|
||||||
|
|
||||||
// clear all waypoints
|
// clear all waypoints
|
||||||
const uint8_t type = 0; // ok (0), error(1)
|
|
||||||
g.waypoint_total.set_and_save(0);
|
g.waypoint_total.set_and_save(0);
|
||||||
|
|
||||||
// send acknowledgement 3 times to makes sure it is received
|
// note that we don't send multiple acks, as otherwise a
|
||||||
for (uint8_t i=0;i<3;i++)
|
// GCS that is doing a clear followed by a set may see
|
||||||
mavlink_msg_waypoint_ack_send(chan, msg->sysid, msg->compid, type);
|
// the additional ACKs as ACKs of the set operations
|
||||||
|
mavlink_msg_waypoint_ack_send(chan, msg->sysid, msg->compid, MAV_MISSION_ACCEPTED);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1116,6 +1495,8 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
{
|
{
|
||||||
// decode
|
// decode
|
||||||
mavlink_waypoint_t packet;
|
mavlink_waypoint_t packet;
|
||||||
|
uint8_t result = MAV_MISSION_ACCEPTED;
|
||||||
|
|
||||||
mavlink_msg_waypoint_decode(msg, &packet);
|
mavlink_msg_waypoint_decode(msg, &packet);
|
||||||
if (mavlink_check_target(packet.target_system,packet.target_component)) break;
|
if (mavlink_check_target(packet.target_system,packet.target_component)) break;
|
||||||
|
|
||||||
@ -1134,6 +1515,19 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MAV_FRAME_LOCAL_NED
|
||||||
|
case MAV_FRAME_LOCAL_NED: // local (relative to home position)
|
||||||
|
{
|
||||||
|
tell_command.lat = 1.0e7*ToDeg(packet.x/
|
||||||
|
(radius_of_earth*cos(ToRad(home.lat/1.0e7)))) + home.lat;
|
||||||
|
tell_command.lng = 1.0e7*ToDeg(packet.y/radius_of_earth) + home.lng;
|
||||||
|
tell_command.alt = -packet.z*1.0e2;
|
||||||
|
tell_command.options = MASK_OPTIONS_RELATIVE_ALT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef MAV_FRAME_LOCAL
|
||||||
case MAV_FRAME_LOCAL: // local (relative to home position)
|
case MAV_FRAME_LOCAL: // local (relative to home position)
|
||||||
{
|
{
|
||||||
tell_command.lat = 1.0e7*ToDeg(packet.x/
|
tell_command.lat = 1.0e7*ToDeg(packet.x/
|
||||||
@ -1143,6 +1537,8 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
tell_command.options = MASK_OPTIONS_RELATIVE_ALT;
|
tell_command.options = MASK_OPTIONS_RELATIVE_ALT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT: // absolute lat/lng, relative altitude
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT: // absolute lat/lng, relative altitude
|
||||||
{
|
{
|
||||||
tell_command.lat = 1.0e7 * packet.x; // in as DD converted to * t7
|
tell_command.lat = 1.0e7 * packet.x; // in as DD converted to * t7
|
||||||
@ -1151,9 +1547,22 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
tell_command.options = MASK_OPTIONS_RELATIVE_ALT; // store altitude relative!! Always!!
|
tell_command.options = MASK_OPTIONS_RELATIVE_ALT; // store altitude relative!! Always!!
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
result = MAV_MISSION_UNSUPPORTED_FRAME;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (result != MAV_MISSION_ACCEPTED) goto mission_failed;
|
||||||
|
|
||||||
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
switch (tell_command.id) { // Switch to map APM command fields inot MAVLink command fields
|
||||||
|
case MAV_CMD_NAV_WAYPOINT:
|
||||||
|
case MAV_CMD_NAV_LOITER_UNLIM:
|
||||||
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
|
case MAV_CMD_NAV_LAND:
|
||||||
|
break;
|
||||||
|
|
||||||
case MAV_CMD_NAV_LOITER_TURNS:
|
case MAV_CMD_NAV_LOITER_TURNS:
|
||||||
case MAV_CMD_NAV_TAKEOFF:
|
case MAV_CMD_NAV_TAKEOFF:
|
||||||
case MAV_CMD_DO_SET_HOME:
|
case MAV_CMD_DO_SET_HOME:
|
||||||
@ -1193,8 +1602,16 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
tell_command.alt = packet.param2;
|
tell_command.alt = packet.param2;
|
||||||
tell_command.p1 = packet.param1;
|
tell_command.p1 = packet.param1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
result = MAV_MISSION_UNSUPPORTED;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (result != MAV_MISSION_ACCEPTED) goto mission_failed;
|
||||||
|
|
||||||
if(packet.current == 2){ //current = 2 is a flag to tell us this is a "guided mode" waypoint and not for the mission
|
if(packet.current == 2){ //current = 2 is a flag to tell us this is a "guided mode" waypoint and not for the mission
|
||||||
guided_WP = tell_command;
|
guided_WP = tell_command;
|
||||||
|
|
||||||
@ -1217,24 +1634,29 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Check if receiving waypoints (mission upload expected)
|
// Check if receiving waypoints (mission upload expected)
|
||||||
if (!waypoint_receiving) break;
|
if (!waypoint_receiving) {
|
||||||
|
result = MAV_MISSION_ERROR;
|
||||||
|
goto mission_failed;
|
||||||
|
}
|
||||||
|
|
||||||
// check if this is the requested waypoint
|
// check if this is the requested waypoint
|
||||||
if (packet.seq != waypoint_request_i) break;
|
if (packet.seq != waypoint_request_i) {
|
||||||
set_wp_with_index(tell_command, packet.seq);
|
result = MAV_MISSION_INVALID_SEQUENCE;
|
||||||
|
goto mission_failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_wp_with_index(tell_command, packet.seq);
|
||||||
|
|
||||||
// update waypoint receiving state machine
|
// update waypoint receiving state machine
|
||||||
waypoint_timelast_receive = millis();
|
waypoint_timelast_receive = millis();
|
||||||
waypoint_request_i++;
|
waypoint_request_i++;
|
||||||
|
|
||||||
if (waypoint_request_i > (uint16_t)g.waypoint_total){
|
if (waypoint_request_i > (uint16_t)g.waypoint_total){
|
||||||
uint8_t type = 0; // ok (0), error(1)
|
|
||||||
|
|
||||||
mavlink_msg_waypoint_ack_send(
|
mavlink_msg_waypoint_ack_send(
|
||||||
chan,
|
chan,
|
||||||
msg->sysid,
|
msg->sysid,
|
||||||
msg->compid,
|
msg->compid,
|
||||||
type);
|
result);
|
||||||
|
|
||||||
send_text(SEVERITY_LOW,PSTR("flight plan received"));
|
send_text(SEVERITY_LOW,PSTR("flight plan received"));
|
||||||
waypoint_receiving = false;
|
waypoint_receiving = false;
|
||||||
@ -1243,6 +1665,15 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
mission_failed:
|
||||||
|
// we are rejecting the mission/waypoint
|
||||||
|
mavlink_msg_waypoint_ack_send(
|
||||||
|
chan,
|
||||||
|
msg->sysid,
|
||||||
|
msg->compid,
|
||||||
|
result);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case MAVLINK_MSG_ID_PARAM_SET:
|
case MAVLINK_MSG_ID_PARAM_SET:
|
||||||
@ -1280,10 +1711,8 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
// handle variables with standard type IDs
|
// handle variables with standard type IDs
|
||||||
if (var_type == AP_Var::k_typeid_float) {
|
if (var_type == AP_Var::k_typeid_float) {
|
||||||
((AP_Float *)vp)->set_and_save(packet.param_value);
|
((AP_Float *)vp)->set_and_save(packet.param_value);
|
||||||
|
|
||||||
} else if (var_type == AP_Var::k_typeid_float16) {
|
} else if (var_type == AP_Var::k_typeid_float16) {
|
||||||
((AP_Float16 *)vp)->set_and_save(packet.param_value);
|
((AP_Float16 *)vp)->set_and_save(packet.param_value);
|
||||||
|
|
||||||
} else if (var_type == AP_Var::k_typeid_int32) {
|
} else if (var_type == AP_Var::k_typeid_int32) {
|
||||||
if (packet.param_value < 0) rounding_addition = -rounding_addition;
|
if (packet.param_value < 0) rounding_addition = -rounding_addition;
|
||||||
((AP_Int32 *)vp)->set_and_save(packet.param_value+rounding_addition);
|
((AP_Int32 *)vp)->set_and_save(packet.param_value+rounding_addition);
|
||||||
@ -1302,12 +1731,22 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
// we send the value we actually set, which could be
|
// we send the value we actually set, which could be
|
||||||
// different from the value sent, in case someone sent
|
// different from the value sent, in case someone sent
|
||||||
// a fractional value to an integer type
|
// a fractional value to an integer type
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
mavlink_msg_param_value_send(
|
||||||
|
chan,
|
||||||
|
key,
|
||||||
|
vp->cast_to_float(),
|
||||||
|
mav_var_type(vp->meta_type_id()),
|
||||||
|
_count_parameters(),
|
||||||
|
-1); // XXX we don't actually know what its index is...
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_param_value_send(
|
mavlink_msg_param_value_send(
|
||||||
chan,
|
chan,
|
||||||
(int8_t *)key,
|
(int8_t *)key,
|
||||||
vp->cast_to_float(),
|
vp->cast_to_float(),
|
||||||
_count_parameters(),
|
_count_parameters(),
|
||||||
-1); // XXX we don't actually know what its index is...
|
-1); // XXX we don't actually know what its index is...
|
||||||
|
#endif // MAVLINK10
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -1351,6 +1790,20 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
#if HIL_MODE != HIL_MODE_DISABLED
|
#if HIL_MODE != HIL_MODE_DISABLED
|
||||||
// This is used both as a sensor and to pass the location
|
// This is used both as a sensor and to pass the location
|
||||||
// in HIL_ATTITUDE mode.
|
// in HIL_ATTITUDE mode.
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
case MAVLINK_MSG_ID_GPS_RAW_INT:
|
||||||
|
{
|
||||||
|
// decode
|
||||||
|
mavlink_gps_raw_int_t packet;
|
||||||
|
mavlink_msg_gps_raw_int_decode(msg, &packet);
|
||||||
|
|
||||||
|
// set gps hil sensor
|
||||||
|
g_gps->setHIL(packet.time_usec/1000.0,
|
||||||
|
packet.lat*1.0e-7, packet.lon*1.0e-7, packet.alt*1.0e-3,
|
||||||
|
packet.vel*1.0e-2, packet.cog*1.0e-2, 0, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#else // MAVLINK10
|
||||||
case MAVLINK_MSG_ID_GPS_RAW:
|
case MAVLINK_MSG_ID_GPS_RAW:
|
||||||
{
|
{
|
||||||
// decode
|
// decode
|
||||||
@ -1362,6 +1815,7 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
packet.v,packet.hdg,0,0);
|
packet.v,packet.hdg,0,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif // MAVLINK10
|
||||||
|
|
||||||
// Is this resolved? - MAVLink protocol change.....
|
// Is this resolved? - MAVLink protocol change.....
|
||||||
case MAVLINK_MSG_ID_VFR_HUD:
|
case MAVLINK_MSG_ID_VFR_HUD:
|
||||||
@ -1505,12 +1959,22 @@ GCS_MAVLINK::queued_param_send()
|
|||||||
char param_name[ONBOARD_PARAM_NAME_LENGTH]; /// XXX HACK
|
char param_name[ONBOARD_PARAM_NAME_LENGTH]; /// XXX HACK
|
||||||
vp->copy_name(param_name, sizeof(param_name));
|
vp->copy_name(param_name, sizeof(param_name));
|
||||||
|
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
mavlink_msg_param_value_send(
|
||||||
|
chan,
|
||||||
|
param_name,
|
||||||
|
value,
|
||||||
|
mav_var_type(vp->meta_type_id()),
|
||||||
|
_queued_parameter_count,
|
||||||
|
_queued_parameter_index);
|
||||||
|
#else // MAVLINK10
|
||||||
mavlink_msg_param_value_send(
|
mavlink_msg_param_value_send(
|
||||||
chan,
|
chan,
|
||||||
(int8_t*)param_name,
|
(int8_t*)param_name,
|
||||||
value,
|
value,
|
||||||
_queued_parameter_count,
|
_queued_parameter_count,
|
||||||
_queued_parameter_index);
|
_queued_parameter_index);
|
||||||
|
#endif // MAVLINK10
|
||||||
|
|
||||||
_queued_parameter_index++;
|
_queued_parameter_index++;
|
||||||
}
|
}
|
||||||
|
81
ArduPlane/Mavlink_compat.h
Normal file
81
ArduPlane/Mavlink_compat.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
compatibility header during transition to MAVLink 1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef MAVLINK10
|
||||||
|
// in MAVLink 1.0 'waypoint' becomes 'mission'. We can remove these
|
||||||
|
// mappings once we are not trying to support both protocols
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_CURRENT MAVLINK_MSG_ID_MISSION_CURRENT
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_CURRENT_LEN MAVLINK_MSG_ID_MISSION_CURRENT_LEN
|
||||||
|
#define mavlink_msg_waypoint_current_send mavlink_msg_mission_current_send
|
||||||
|
#define mavlink_msg_waypoint_current_decode mavlink_msg_mission_current_decode
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_COUNT MAVLINK_MSG_ID_MISSION_COUNT
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_COUNT_LEN MAVLINK_MSG_ID_MISSION_COUNT_LEN
|
||||||
|
#define mavlink_msg_waypoint_count_send mavlink_msg_mission_count_send
|
||||||
|
#define mavlink_msg_waypoint_count_decode mavlink_msg_mission_count_decode
|
||||||
|
#define mavlink_waypoint_count_t mavlink_mission_count_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_REQUEST MAVLINK_MSG_ID_MISSION_REQUEST
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_REQUEST_LEN MAVLINK_MSG_ID_MISSION_REQUEST_LEN
|
||||||
|
#define mavlink_msg_waypoint_request_send mavlink_msg_mission_request_send
|
||||||
|
#define mavlink_msg_waypoint_request_decode mavlink_msg_mission_request_decode
|
||||||
|
#define mavlink_waypoint_request_t mavlink_mission_request_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_REQUEST_LIST MAVLINK_MSG_ID_MISSION_REQUEST_LIST
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_REQUEST_LIST_LEN MAVLINK_MSG_ID_MISSION_REQUEST_LIST_LEN
|
||||||
|
#define mavlink_msg_waypoint_request_list_send mavlink_msg_mission_request_list_send
|
||||||
|
#define mavlink_msg_waypoint_request_list_decode mavlink_msg_mission_request_list_decode
|
||||||
|
#define mavlink_waypoint_request_list_t mavlink_mission_request_list_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT MAVLINK_MSG_ID_MISSION_ITEM
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_LEN MAVLINK_MSG_ID_MISSION_ITEM_LEN
|
||||||
|
#define mavlink_msg_waypoint_send mavlink_msg_mission_item_send
|
||||||
|
#define mavlink_msg_waypoint_decode mavlink_msg_mission_item_decode
|
||||||
|
#define mavlink_waypoint_t mavlink_mission_item_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_ACK MAVLINK_MSG_ID_MISSION_ACK
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_ACK_LEN MAVLINK_MSG_ID_MISSION_ACK_LEN
|
||||||
|
#define mavlink_msg_waypoint_ack_send mavlink_msg_mission_ack_send
|
||||||
|
#define mavlink_msg_waypoint_ack_decode mavlink_msg_mission_ack_decode
|
||||||
|
#define mavlink_waypoint_ack_t mavlink_mission_ack_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_CLEAR_ALL MAVLINK_MSG_ID_MISSION_CLEAR_ALL
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_CLEAR_ALL_LEN MAVLINK_MSG_ID_MISSION_CLEAR_ALL_LEN
|
||||||
|
#define mavlink_msg_waypoint_clear_all_send mavlink_msg_mission_clear_all_send
|
||||||
|
#define mavlink_msg_waypoint_clear_all_decode mavlink_msg_mission_clear_all_decode
|
||||||
|
#define mavlink_waypoint_clear_all_t mavlink_mission_clear_all_t
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_SET_CURRENT MAVLINK_MSG_ID_MISSION_SET_CURRENT
|
||||||
|
#define MAVLINK_MSG_ID_WAYPOINT_SET_CURRENT_LEN MAVLINK_MSG_ID_MISSION_SET_CURRENT_LEN
|
||||||
|
#define mavlink_msg_waypoint_set_current_send mavlink_msg_mission_set_current_send
|
||||||
|
#define mavlink_msg_waypoint_set_current_decode mavlink_msg_mission_set_current_decode
|
||||||
|
#define mavlink_waypoint_set_current_t mavlink_mission_set_current_t
|
||||||
|
|
||||||
|
static uint8_t mav_var_type(AP_Meta_class::Type_id t)
|
||||||
|
{
|
||||||
|
if (t == AP_Var::k_typeid_int8) {
|
||||||
|
return MAV_VAR_INT8;
|
||||||
|
}
|
||||||
|
if (t == AP_Var::k_typeid_int16) {
|
||||||
|
return MAV_VAR_INT16;
|
||||||
|
}
|
||||||
|
if (t == AP_Var::k_typeid_int32) {
|
||||||
|
return MAV_VAR_INT32;
|
||||||
|
}
|
||||||
|
// treat any others as float
|
||||||
|
return MAV_VAR_FLOAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAV_FIXED_WING MAV_TYPE_FIXED_WING
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define MAV_MISSION_ACCEPTED 0
|
||||||
|
#define MAV_MISSION_UNSUPPORTED 1
|
||||||
|
#define MAV_MISSION_UNSUPPORTED_FRAME 1
|
||||||
|
#define MAV_MISSION_ERROR 1
|
||||||
|
#define MAV_MISSION_INVALID_SEQUENCE 1
|
||||||
|
|
||||||
|
#endif
|
@ -662,6 +662,11 @@
|
|||||||
# define CLI_ENABLED ENABLED
|
# define CLI_ENABLED ENABLED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// use this to disable the CLI slider switch
|
||||||
|
#ifndef CLI_SLIDER_ENABLED
|
||||||
|
# define CLI_SLIDER_ENABLED ENABLED
|
||||||
|
#endif
|
||||||
|
|
||||||
// delay to prevent Xbee bricking, in milliseconds
|
// delay to prevent Xbee bricking, in milliseconds
|
||||||
#ifndef MAVLINK_TELEMETRY_PORT_DELAY
|
#ifndef MAVLINK_TELEMETRY_PORT_DELAY
|
||||||
# define MAVLINK_TELEMETRY_PORT_DELAY 2000
|
# define MAVLINK_TELEMETRY_PORT_DELAY 2000
|
||||||
|
@ -43,6 +43,14 @@ static const struct Menu::command main_menu_commands[] PROGMEM = {
|
|||||||
// Create the top-level menu object.
|
// Create the top-level menu object.
|
||||||
MENU(main_menu, THISFIRMWARE, main_menu_commands);
|
MENU(main_menu, THISFIRMWARE, main_menu_commands);
|
||||||
|
|
||||||
|
// the user wants the CLI. It never exits
|
||||||
|
static void run_cli(void)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
main_menu.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // CLI_ENABLED
|
#endif // CLI_ENABLED
|
||||||
|
|
||||||
static void init_ardupilot()
|
static void init_ardupilot()
|
||||||
@ -185,7 +193,7 @@ static void init_ardupilot()
|
|||||||
// the system in an odd state, we don't let the user exit the top
|
// the system in an odd state, we don't let the user exit the top
|
||||||
// menu; they must reset in order to fly.
|
// menu; they must reset in order to fly.
|
||||||
//
|
//
|
||||||
#if CLI_ENABLED == ENABLED
|
#if CLI_ENABLED == ENABLED && CLI_SLIDER_ENABLED == ENABLED
|
||||||
if (digitalRead(SLIDE_SWITCH_PIN) == 0) {
|
if (digitalRead(SLIDE_SWITCH_PIN) == 0) {
|
||||||
digitalWrite(A_LED_PIN,HIGH); // turn on setup-mode LED
|
digitalWrite(A_LED_PIN,HIGH); // turn on setup-mode LED
|
||||||
Serial.printf_P(PSTR("\n"
|
Serial.printf_P(PSTR("\n"
|
||||||
@ -194,14 +202,13 @@ static void init_ardupilot()
|
|||||||
"If using the Arduino Serial Monitor, ensure Line Ending is set to Carriage Return.\n"
|
"If using the Arduino Serial Monitor, ensure Line Ending is set to Carriage Return.\n"
|
||||||
"Type 'help' to list commands, 'exit' to leave a submenu.\n"
|
"Type 'help' to list commands, 'exit' to leave a submenu.\n"
|
||||||
"Visit the 'setup' menu for first-time configuration.\n"));
|
"Visit the 'setup' menu for first-time configuration.\n"));
|
||||||
for (;;) {
|
Serial.println_P(PSTR("\nMove the slide switch and reset to FLY.\n"));
|
||||||
Serial.println_P(PSTR("\nMove the slide switch and reset to FLY.\n"));
|
run_cli();
|
||||||
main_menu.run();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
Serial.printf_P(PSTR("\nPress ENTER 3 times to start interactive setup\n\n"));
|
||||||
#endif // CLI_ENABLED
|
#endif // CLI_ENABLED
|
||||||
|
|
||||||
|
|
||||||
if(g.log_bitmask != 0){
|
if(g.log_bitmask != 0){
|
||||||
// TODO - Here we will check on the length of the last log
|
// TODO - Here we will check on the length of the last log
|
||||||
// We don't want to create a bunch of little logs due to powering on and off
|
// We don't want to create a bunch of little logs due to powering on and off
|
||||||
|
@ -23,3 +23,4 @@
|
|||||||
#include "APO_DefaultSetup.h"
|
#include "APO_DefaultSetup.h"
|
||||||
|
|
||||||
#include <WProgram.h>; int main(void) {init();setup();for(;;) loop(); return 0; }
|
#include <WProgram.h>; int main(void) {init();setup();for(;;) loop(); return 0; }
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
// Vehicle Configuration
|
// Vehicle Configuration
|
||||||
#include "CarStampede.h"
|
#include "CarStampede.h"
|
||||||
|
//#include "TankGeneric.h"
|
||||||
|
|
||||||
// ArduPilotOne Default Setup
|
// ArduPilotOne Default Setup
|
||||||
#include "APO_DefaultSetup.h"
|
#include "APO_DefaultSetup.h"
|
||||||
|
@ -28,10 +28,10 @@ static const uint8_t heartBeatTimeout = 3;
|
|||||||
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
||||||
|
|
||||||
// baud rates
|
// baud rates
|
||||||
static uint32_t debugBaud = 57600;
|
static const uint32_t debugBaud = 57600;
|
||||||
static uint32_t telemBaud = 57600;
|
static const uint32_t telemBaud = 57600;
|
||||||
static uint32_t gpsBaud = 38400;
|
static const uint32_t gpsBaud = 38400;
|
||||||
static uint32_t hilBaud = 57600;
|
static const uint32_t hilBaud = 57600;
|
||||||
|
|
||||||
// optional sensors
|
// optional sensors
|
||||||
static const bool gpsEnabled = false;
|
static const bool gpsEnabled = false;
|
||||||
@ -41,7 +41,7 @@ static const Matrix3f compassOrientation = AP_COMPASS_COMPONENTS_UP_PINS_FORWARD
|
|||||||
// compass orientation: See AP_Compass_HMC5843.h for possible values
|
// compass orientation: See AP_Compass_HMC5843.h for possible values
|
||||||
|
|
||||||
// battery monitoring
|
// battery monitoring
|
||||||
static const bool batteryMonitorEnabled = true;
|
static const bool batteryMonitorEnabled = false;
|
||||||
static const uint8_t batteryPin = 0;
|
static const uint8_t batteryPin = 0;
|
||||||
static const float batteryVoltageDivRatio = 6;
|
static const float batteryVoltageDivRatio = 6;
|
||||||
static const float batteryMinVolt = 10.0;
|
static const float batteryMinVolt = 10.0;
|
||||||
@ -62,20 +62,26 @@ static const float loop2Rate = 1; // gcs slow
|
|||||||
static const float loop3Rate = 0.1;
|
static const float loop3Rate = 0.1;
|
||||||
|
|
||||||
// gains
|
// gains
|
||||||
static const float steeringP = 1.0;
|
static const float steeringP = 0.1;
|
||||||
static const float steeringI = 0.0;
|
static const float steeringI = 0.0;
|
||||||
static const float steeringD = 0.0;
|
static const float steeringD = 0.1;
|
||||||
static const float steeringIMax = 0.0;
|
static const float steeringIMax = 0.0;
|
||||||
static const float steeringYMax = 3.0;
|
static const float steeringYMax = 1;
|
||||||
static const float steeringDFCut = 25;
|
static const float steeringDFCut = 25.0;
|
||||||
|
|
||||||
static const float throttleP = 0.0;
|
static const float throttleP = 0.1;
|
||||||
static const float throttleI = 0.0;
|
static const float throttleI = 0.0;
|
||||||
static const float throttleD = 0.0;
|
static const float throttleD = 0.0;
|
||||||
static const float throttleIMax = 0.0;
|
static const float throttleIMax = 0.0;
|
||||||
static const float throttleYMax = 0.0;
|
static const float throttleYMax = 1;
|
||||||
static const float throttleDFCut = 3.0;
|
static const float throttleDFCut = 0.0;
|
||||||
|
|
||||||
|
// guidance
|
||||||
|
static const float velCmd = 5;
|
||||||
|
static const float xt = 10;
|
||||||
|
static const float xtLim = 90;
|
||||||
|
|
||||||
#include "ControllerCar.h"
|
#include "ControllerCar.h"
|
||||||
|
|
||||||
#endif /* CARSTAMPEDE_H_ */
|
#endif /* CARSTAMPEDE_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -13,113 +13,69 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class ControllerCar: public AP_Controller {
|
class ControllerCar: public AP_Controller {
|
||||||
private:
|
|
||||||
AP_Var_group _group;
|
|
||||||
AP_Uint8 _mode;
|
|
||||||
enum {
|
|
||||||
k_chMode = k_radioChannelsStart, k_chStr, k_chThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
k_pidStr = k_controllersStart, k_pidThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
CH_MODE = 0, CH_STR, CH_THR
|
|
||||||
};
|
|
||||||
BlockPIDDfb pidStr;
|
|
||||||
BlockPID pidThr;
|
|
||||||
public:
|
public:
|
||||||
ControllerCar(AP_Navigator * nav, AP_Guide * guide,
|
ControllerCar(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal) :
|
||||||
AP_Controller(nav, guide, hal),
|
AP_Controller(nav, guide, hal,new AP_ArmingMechanism(hal,ch_thrust,ch_str,0.1,-0.9,0.9), ch_mode),
|
||||||
_group(k_cntrl, PSTR("CNTRL_")),
|
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
||||||
_mode(&_group, 1, MAV_MODE_UNINIT, PSTR("MODE")),
|
steeringI, steeringD, steeringIMax, steeringYMax,steeringDFCut),
|
||||||
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
pidThrust(new AP_Var_group(k_pidThrust, PSTR("THR_")), 1, throttleP,
|
||||||
steeringI, steeringD, steeringIMax, steeringYMax,steeringDFCut),
|
throttleI, throttleD, throttleIMax, throttleYMax,
|
||||||
pidThr(new AP_Var_group(k_pidThr, PSTR("THR_")), 1, throttleP,
|
throttleDFCut), _strCmd(0), _thrustCmd(0)
|
||||||
throttleI, throttleD, throttleIMax, throttleYMax,
|
{
|
||||||
throttleDFCut) {
|
_hal->debug->println_P(PSTR("initializing car controller"));
|
||||||
_hal->debug->println_P(PSTR("initializing car controller"));
|
|
||||||
|
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 7, 1100,
|
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
||||||
1500, 1900, RC_MODE_IN, false));
|
1500, 1900, RC_MODE_IN, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 0, 1100, 1540,
|
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 3, 1100, 1500,
|
||||||
1900, RC_MODE_INOUT, false));
|
1900, RC_MODE_INOUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chThr, PSTR("THR_"), APM_RC, 1, 1100, 1500,
|
new AP_RcChannel(k_chThrust, PSTR("THR_"), APM_RC, 2, 1100, 1500,
|
||||||
1900, RC_MODE_INOUT, false));
|
1900, RC_MODE_INOUT, false));
|
||||||
}
|
}
|
||||||
virtual MAV_MODE getMode() {
|
|
||||||
return (MAV_MODE) _mode.get();
|
|
||||||
}
|
|
||||||
virtual void update(const float & dt) {
|
|
||||||
|
|
||||||
// check for heartbeat
|
private:
|
||||||
if (_hal->heartBeatLost()) {
|
// methods
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
void manualLoop(const float dt) {
|
||||||
setAllRadioChannelsToNeutral();
|
setAllRadioChannelsManually();
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
_strCmd = _hal->rc[ch_str]->getRadioPosition();
|
||||||
_hal->debug->printf_P(PSTR("comm lost, send heartbeat from gcs\n"));
|
_thrustCmd = _hal->rc[ch_thrust]->getRadioPosition();
|
||||||
return;
|
}
|
||||||
// if throttle less than 5% cut motor power
|
void autoLoop(const float dt) {
|
||||||
} else if (_hal->rc[CH_THR]->getRadioPosition() < 0.05) {
|
//_hal->debug->printf_P(PSTR("cont: ch1: %f\tch2: %f\n"),_hal->rc[ch_thrust]->getRadioPosition(), _hal->rc[ch_str]->getRadioPosition());
|
||||||
_mode = MAV_MODE_LOCKED;
|
_strCmd = pidStr.update(_guide->getHeadingError(), _nav->getYawRate(), dt);
|
||||||
setAllRadioChannelsToNeutral();
|
_thrustCmd = pidThrust.update(
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
_guide->getGroundSpeedCommand()
|
||||||
return;
|
- _nav->getGroundSpeed(), dt);
|
||||||
// if in live mode then set state to active
|
}
|
||||||
} else if (_hal->getMode() == MODE_LIVE) {
|
void setMotorsActive() {
|
||||||
_hal->setState(MAV_STATE_ACTIVE);
|
// turn all motors off if below 0.1 throttle
|
||||||
// if in hardware in the loop (control) mode, set to hilsim
|
if (fabs(_hal->rc[ch_thrust]->getRadioPosition()) < 0.1) {
|
||||||
} else if (_hal->getMode() == MODE_HIL_CNTL) {
|
setAllRadioChannelsToNeutral();
|
||||||
_hal->setState(MAV_STATE_HILSIM);
|
} else {
|
||||||
}
|
_hal->rc[ch_thrust]->setPosition(_thrustCmd);
|
||||||
|
_hal->rc[ch_str]->setPosition(_strCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// read switch to set mode
|
// attributes
|
||||||
if (_hal->rc[CH_MODE]->getRadioPosition() > 0) {
|
enum {
|
||||||
_mode = MAV_MODE_MANUAL;
|
ch_mode = 0, ch_str, ch_thrust
|
||||||
} else {
|
};
|
||||||
_mode = MAV_MODE_AUTO;
|
enum {
|
||||||
}
|
k_chMode = k_radioChannelsStart, k_chStr, k_chThrust
|
||||||
|
};
|
||||||
// manual mode
|
enum {
|
||||||
switch (_mode) {
|
k_pidStr = k_controllersStart, k_pidThrust
|
||||||
|
};
|
||||||
case MAV_MODE_MANUAL: {
|
BlockPIDDfb pidStr;
|
||||||
setAllRadioChannelsManually();
|
BlockPID pidThrust;
|
||||||
//_hal->debug->println("manual");
|
float _strCmd, _thrustCmd;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MAV_MODE_AUTO: {
|
|
||||||
float headingError = _guide->getHeadingCommand()
|
|
||||||
- _nav->getYaw();
|
|
||||||
if (headingError > 180 * deg2Rad)
|
|
||||||
headingError -= 360 * deg2Rad;
|
|
||||||
if (headingError < -180 * deg2Rad)
|
|
||||||
headingError += 360 * deg2Rad;
|
|
||||||
_hal->rc[CH_STR]->setPosition(
|
|
||||||
pidStr.update(headingError, _nav->getYawRate(), dt));
|
|
||||||
_hal->rc[CH_THR]->setPosition(
|
|
||||||
pidThr.update(
|
|
||||||
_guide->getGroundSpeedCommand()
|
|
||||||
- _nav->getGroundSpeed(), dt));
|
|
||||||
//_hal->debug->println("automode");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
setAllRadioChannelsToNeutral();
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
_hal->debug->printf_P(PSTR("unknown controller mode\n"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* CONTROLLERCAR_H_ */
|
#endif /* CONTROLLERCAR_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -13,121 +13,79 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class ControllerTank: public AP_Controller {
|
class ControllerTank: public AP_Controller {
|
||||||
private:
|
|
||||||
AP_Var_group _group;
|
|
||||||
AP_Uint8 _mode;
|
|
||||||
enum {
|
|
||||||
k_chMode = k_radioChannelsStart, k_chLeft, k_chRight, k_chStr, k_chThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
k_pidStr = k_controllersStart, k_pidThr
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
CH_MODE = 0, CH_LEFT, CH_RIGHT, CH_STR, CH_THR
|
|
||||||
};
|
|
||||||
BlockPIDDfb pidStr;
|
|
||||||
BlockPID pidThr;
|
|
||||||
public:
|
public:
|
||||||
ControllerTank(AP_Navigator * nav, AP_Guide * guide,
|
ControllerTank(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal) :
|
||||||
AP_Controller(nav, guide, hal),
|
AP_Controller(nav, guide, hal, new AP_ArmingMechanism(hal,ch_thrust,ch_str,0.1,-0.9,0.9),ch_mode),
|
||||||
_group(k_cntrl, PSTR("CNTRL_")),
|
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
||||||
_mode(&_group, 1, MAV_MODE_UNINIT, PSTR("MODE")),
|
steeringI, steeringD, steeringIMax, steeringYMax, steeringDFCut),
|
||||||
pidStr(new AP_Var_group(k_pidStr, PSTR("STR_")), 1, steeringP,
|
pidThr(new AP_Var_group(k_pidThr, PSTR("THR_")), 1, throttleP,
|
||||||
steeringI, steeringD, steeringIMax, steeringYMax, steeringDFCut),
|
throttleI, throttleD, throttleIMax, throttleYMax,
|
||||||
pidThr(new AP_Var_group(k_pidThr, PSTR("THR_")), 1, throttleP,
|
throttleDFCut), _headingOutput(0), _throttleOutput(0) {
|
||||||
throttleI, throttleD, throttleIMax, throttleYMax,
|
_hal->debug->println_P(PSTR("initializing tank controller"));
|
||||||
throttleDFCut) {
|
|
||||||
_hal->debug->println_P(PSTR("initializing tank controller"));
|
|
||||||
|
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
||||||
1500, 1900, RC_MODE_IN, false));
|
1500, 1900, RC_MODE_IN, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chLeft, PSTR("LEFT_"), APM_RC, 0, 1100, 1500,
|
new AP_RcChannel(k_chLeft, PSTR("LEFT_"), APM_RC, 0, 1100, 1500,
|
||||||
1900, RC_MODE_OUT, false));
|
1900, RC_MODE_OUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chRight, PSTR("RIGHT_"), APM_RC, 1, 1100, 1500,
|
new AP_RcChannel(k_chRight, PSTR("RIGHT_"), APM_RC, 1, 1100, 1500,
|
||||||
1900, RC_MODE_OUT, false));
|
1900, RC_MODE_OUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 0, 1100, 1500,
|
new AP_RcChannel(k_chStr, PSTR("STR_"), APM_RC, 0, 1100, 1500,
|
||||||
1900, RC_MODE_IN, false));
|
1900, RC_MODE_IN, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chThr, PSTR("THR_"), APM_RC, 1, 1100, 1500,
|
new AP_RcChannel(k_chThr, PSTR("THR_"), APM_RC, 1, 1100, 1500,
|
||||||
1900, RC_MODE_IN, false));
|
1900, RC_MODE_IN, false));
|
||||||
}
|
}
|
||||||
virtual MAV_MODE getMode() {
|
|
||||||
return (MAV_MODE) _mode.get();
|
|
||||||
}
|
|
||||||
void mix(float headingOutput, float throttleOutput) {
|
|
||||||
_hal->rc[CH_LEFT]->setPosition(throttleOutput + headingOutput);
|
|
||||||
_hal->rc[CH_RIGHT]->setPosition(throttleOutput - headingOutput);
|
|
||||||
}
|
|
||||||
virtual void update(const float & dt) {
|
|
||||||
|
|
||||||
// check for heartbeat
|
private:
|
||||||
if (_hal->heartBeatLost()) {
|
// methods
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
void manualLoop(const float dt) {
|
||||||
setAllRadioChannelsToNeutral();
|
setAllRadioChannelsManually();
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
_headingOutput = _hal->rc[ch_str]->getPosition();
|
||||||
_hal->debug->printf_P(PSTR("comm lost, send heartbeat from gcs\n"));
|
_throttleOutput = _hal->rc[ch_thrust]->getPosition();
|
||||||
return;
|
}
|
||||||
// if throttle less than 5% cut motor power
|
void autoLoop(const float dt) {
|
||||||
} else if (_hal->rc[CH_THR]->getRadioPosition() < 0.05) {
|
float headingError = _guide->getHeadingCommand()
|
||||||
_mode = MAV_MODE_LOCKED;
|
- _nav->getYaw();
|
||||||
setAllRadioChannelsToNeutral();
|
if (headingError > 180 * deg2Rad)
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
headingError -= 360 * deg2Rad;
|
||||||
return;
|
if (headingError < -180 * deg2Rad)
|
||||||
// if in live mode then set state to active
|
headingError += 360 * deg2Rad;
|
||||||
} else if (_hal->getMode() == MODE_LIVE) {
|
_headingOutput = pidStr.update(headingError, _nav->getYawRate(), dt);
|
||||||
_hal->setState(MAV_STATE_ACTIVE);
|
_throttleOutput = pidThr.update(_guide->getGroundSpeedCommand()
|
||||||
// if in hardware in the loop (control) mode, set to hilsim
|
- _nav->getGroundSpeed(), dt);
|
||||||
} else if (_hal->getMode() == MODE_HIL_CNTL) {
|
}
|
||||||
_hal->setState(MAV_STATE_HILSIM);
|
void setMotorsActive() {
|
||||||
}
|
// turn all motors off if below 0.1 throttle
|
||||||
|
if (fabs(_hal->rc[ch_thrust]->getRadioPosition()) < 0.1) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
} else {
|
||||||
|
_hal->rc[ch_left]->setPosition(_throttleOutput + _headingOutput);
|
||||||
|
_hal->rc[ch_right]->setPosition(_throttleOutput - _headingOutput);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// read switch to set mode
|
// attributes
|
||||||
if (_hal->rc[CH_MODE]->getRadioPosition() > 0) {
|
enum {
|
||||||
_mode = MAV_MODE_MANUAL;
|
k_chMode = k_radioChannelsStart, k_chLeft, k_chRight, k_chStr, k_chThr
|
||||||
} else {
|
};
|
||||||
_mode = MAV_MODE_AUTO;
|
enum {
|
||||||
}
|
k_pidStr = k_controllersStart, k_pidThr
|
||||||
|
};
|
||||||
// manual mode
|
enum {
|
||||||
switch (_mode) {
|
ch_mode = 0, ch_left, ch_right, ch_str, ch_thrust
|
||||||
|
};
|
||||||
case MAV_MODE_MANUAL: {
|
BlockPIDDfb pidStr;
|
||||||
setAllRadioChannelsManually();
|
BlockPID pidThr;
|
||||||
mix(_hal->rc[CH_STR]->getPosition(),
|
float _headingOutput;
|
||||||
_hal->rc[CH_THR]->getPosition());
|
float _throttleOutput;
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MAV_MODE_AUTO: {
|
|
||||||
float headingError = _guide->getHeadingCommand()
|
|
||||||
- _nav->getYaw();
|
|
||||||
if (headingError > 180 * deg2Rad)
|
|
||||||
headingError -= 360 * deg2Rad;
|
|
||||||
if (headingError < -180 * deg2Rad)
|
|
||||||
headingError += 360 * deg2Rad;
|
|
||||||
mix(pidStr.update(headingError, _nav->getYawRate(), dt),
|
|
||||||
pidThr.update(_guide->getGroundSpeedCommand()
|
|
||||||
- _nav->getGroundSpeed(), dt));
|
|
||||||
//_hal->debug->println("automode");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
setAllRadioChannelsToNeutral();
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
_hal->debug->printf_P(PSTR("unknown controller mode\n"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* CONTROLLERTANK_H_ */
|
#endif /* CONTROLLERTANK_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
* Author: jgoppert
|
* Author: jgoppert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// NOT CURRENTLY WORKING
|
||||||
|
|
||||||
#ifndef TANKGENERIC_H_
|
#ifndef TANKGENERIC_H_
|
||||||
#define TANKGENERIC_H_
|
#define TANKGENERIC_H_
|
||||||
|
|
||||||
@ -27,10 +29,10 @@ static const uint8_t heartBeatTimeout = 3;
|
|||||||
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
||||||
|
|
||||||
// baud rates
|
// baud rates
|
||||||
static uint32_t debugBaud = 57600;
|
static const uint32_t debugBaud = 57600;
|
||||||
static uint32_t telemBaud = 57600;
|
static const uint32_t telemBaud = 57600;
|
||||||
static uint32_t gpsBaud = 38400;
|
static const uint32_t gpsBaud = 38400;
|
||||||
static uint32_t hilBaud = 57600;
|
static const uint32_t hilBaud = 57600;
|
||||||
|
|
||||||
// optional sensors
|
// optional sensors
|
||||||
static const bool gpsEnabled = false;
|
static const bool gpsEnabled = false;
|
||||||
@ -75,6 +77,12 @@ const float throttleIMax = 0.0;
|
|||||||
const float throttleYMax = 0.0;
|
const float throttleYMax = 0.0;
|
||||||
const float throttleDFCut = 3.0;
|
const float throttleDFCut = 3.0;
|
||||||
|
|
||||||
|
// guidance
|
||||||
|
static const float velCmd = 5;
|
||||||
|
static const float xt = 10;
|
||||||
|
static const float xtLim = 90;
|
||||||
|
|
||||||
#include "ControllerTank.h"
|
#include "ControllerTank.h"
|
||||||
|
|
||||||
#endif /* TANKGENERIC_H_ */
|
#endif /* TANKGENERIC_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -183,6 +183,12 @@
|
|||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ArduinoDetect.cs" />
|
<Compile Include="ArduinoDetect.cs" />
|
||||||
<Compile Include="AviWriter.cs" />
|
<Compile Include="AviWriter.cs" />
|
||||||
|
<Compile Include="Camera.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Camera.Designer.cs">
|
||||||
|
<DependentUpon>Camera.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Capture.cs" />
|
<Compile Include="Capture.cs" />
|
||||||
<Compile Include="CommsSerialInterface.cs" />
|
<Compile Include="CommsSerialInterface.cs" />
|
||||||
<Compile Include="CommsSerialPort.cs">
|
<Compile Include="CommsSerialPort.cs">
|
||||||
@ -350,6 +356,9 @@
|
|||||||
<DependentUpon>AGauge.cs</DependentUpon>
|
<DependentUpon>AGauge.cs</DependentUpon>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="Camera.resx">
|
||||||
|
<DependentUpon>Camera.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="GCSViews\Configuration.ru-RU.resx">
|
<EmbeddedResource Include="GCSViews\Configuration.ru-RU.resx">
|
||||||
<DependentUpon>Configuration.cs</DependentUpon>
|
<DependentUpon>Configuration.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
421
Tools/ArdupilotMegaPlanner/Camera.Designer.cs
generated
Normal file
421
Tools/ArdupilotMegaPlanner/Camera.Designer.cs
generated
Normal file
@ -0,0 +1,421 @@
|
|||||||
|
namespace ArdupilotMega
|
||||||
|
{
|
||||||
|
partial class Camera
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.num_agl = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.num_megapixel = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.label3 = new System.Windows.Forms.Label();
|
||||||
|
this.num_focallength = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.label4 = new System.Windows.Forms.Label();
|
||||||
|
this.num_focalmultip = new System.Windows.Forms.NumericUpDown();
|
||||||
|
this.TXT_fovH = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_fovV = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_fovD = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_fovAD = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_fovAV = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_fovAH = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_cmpixel = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_imgwidth = new System.Windows.Forms.TextBox();
|
||||||
|
this.TXT_imgheight = new System.Windows.Forms.TextBox();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.label5 = new System.Windows.Forms.Label();
|
||||||
|
this.label6 = new System.Windows.Forms.Label();
|
||||||
|
this.label7 = new System.Windows.Forms.Label();
|
||||||
|
this.label8 = new System.Windows.Forms.Label();
|
||||||
|
this.label9 = new System.Windows.Forms.Label();
|
||||||
|
this.label10 = new System.Windows.Forms.Label();
|
||||||
|
this.label11 = new System.Windows.Forms.Label();
|
||||||
|
this.label12 = new System.Windows.Forms.Label();
|
||||||
|
this.label13 = new System.Windows.Forms.Label();
|
||||||
|
this.label14 = new System.Windows.Forms.Label();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_agl)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_megapixel)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_focallength)).BeginInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_focalmultip)).BeginInit();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// num_agl
|
||||||
|
//
|
||||||
|
this.num_agl.Location = new System.Drawing.Point(12, 12);
|
||||||
|
this.num_agl.Maximum = new decimal(new int[] {
|
||||||
|
10000,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_agl.Name = "num_agl";
|
||||||
|
this.num_agl.Size = new System.Drawing.Size(120, 20);
|
||||||
|
this.num_agl.TabIndex = 1;
|
||||||
|
this.num_agl.Value = new decimal(new int[] {
|
||||||
|
200,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_agl.ValueChanged += new System.EventHandler(this.num_agl_ValueChanged);
|
||||||
|
//
|
||||||
|
// num_megapixel
|
||||||
|
//
|
||||||
|
this.num_megapixel.DecimalPlaces = 1;
|
||||||
|
this.num_megapixel.Increment = new decimal(new int[] {
|
||||||
|
5,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
65536});
|
||||||
|
this.num_megapixel.Location = new System.Drawing.Point(13, 38);
|
||||||
|
this.num_megapixel.Name = "num_megapixel";
|
||||||
|
this.num_megapixel.Size = new System.Drawing.Size(120, 20);
|
||||||
|
this.num_megapixel.TabIndex = 2;
|
||||||
|
this.num_megapixel.Value = new decimal(new int[] {
|
||||||
|
8,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_megapixel.ValueChanged += new System.EventHandler(this.num_megapixel_ValueChanged);
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(140, 19);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(72, 13);
|
||||||
|
this.label2.TabIndex = 4;
|
||||||
|
this.label2.Text = "Height m (agl)";
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
this.label3.AutoSize = true;
|
||||||
|
this.label3.Location = new System.Drawing.Point(140, 45);
|
||||||
|
this.label3.Name = "label3";
|
||||||
|
this.label3.Size = new System.Drawing.Size(95, 13);
|
||||||
|
this.label3.TabIndex = 5;
|
||||||
|
this.label3.Text = "MegaPixel Camera";
|
||||||
|
//
|
||||||
|
// num_focallength
|
||||||
|
//
|
||||||
|
this.num_focallength.DecimalPlaces = 1;
|
||||||
|
this.num_focallength.Increment = new decimal(new int[] {
|
||||||
|
5,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
65536});
|
||||||
|
this.num_focallength.Location = new System.Drawing.Point(245, 12);
|
||||||
|
this.num_focallength.Maximum = new decimal(new int[] {
|
||||||
|
180,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_focallength.Minimum = new decimal(new int[] {
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_focallength.Name = "num_focallength";
|
||||||
|
this.num_focallength.Size = new System.Drawing.Size(120, 20);
|
||||||
|
this.num_focallength.TabIndex = 6;
|
||||||
|
this.num_focallength.Value = new decimal(new int[] {
|
||||||
|
35,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_focallength.ValueChanged += new System.EventHandler(this.num_focallength_ValueChanged);
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
this.label4.AutoSize = true;
|
||||||
|
this.label4.Location = new System.Drawing.Point(242, 72);
|
||||||
|
this.label4.Name = "label4";
|
||||||
|
this.label4.Size = new System.Drawing.Size(99, 13);
|
||||||
|
this.label4.TabIndex = 8;
|
||||||
|
this.label4.Text = "2 x tan-1( l / (2 x f) )";
|
||||||
|
//
|
||||||
|
// num_focalmultip
|
||||||
|
//
|
||||||
|
this.num_focalmultip.DecimalPlaces = 1;
|
||||||
|
this.num_focalmultip.Increment = new decimal(new int[] {
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
65536});
|
||||||
|
this.num_focalmultip.Location = new System.Drawing.Point(245, 38);
|
||||||
|
this.num_focalmultip.Maximum = new decimal(new int[] {
|
||||||
|
5,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0});
|
||||||
|
this.num_focalmultip.Minimum = new decimal(new int[] {
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
65536});
|
||||||
|
this.num_focalmultip.Name = "num_focalmultip";
|
||||||
|
this.num_focalmultip.Size = new System.Drawing.Size(120, 20);
|
||||||
|
this.num_focalmultip.TabIndex = 9;
|
||||||
|
this.num_focalmultip.Value = new decimal(new int[] {
|
||||||
|
15,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
65536});
|
||||||
|
this.num_focalmultip.ValueChanged += new System.EventHandler(this.num_focalmultip_ValueChanged);
|
||||||
|
//
|
||||||
|
// TXT_fovH
|
||||||
|
//
|
||||||
|
this.TXT_fovH.Location = new System.Drawing.Point(72, 138);
|
||||||
|
this.TXT_fovH.Name = "TXT_fovH";
|
||||||
|
this.TXT_fovH.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovH.TabIndex = 10;
|
||||||
|
//
|
||||||
|
// TXT_fovV
|
||||||
|
//
|
||||||
|
this.TXT_fovV.Location = new System.Drawing.Point(72, 165);
|
||||||
|
this.TXT_fovV.Name = "TXT_fovV";
|
||||||
|
this.TXT_fovV.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovV.TabIndex = 11;
|
||||||
|
//
|
||||||
|
// TXT_fovD
|
||||||
|
//
|
||||||
|
this.TXT_fovD.Location = new System.Drawing.Point(72, 192);
|
||||||
|
this.TXT_fovD.Name = "TXT_fovD";
|
||||||
|
this.TXT_fovD.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovD.TabIndex = 12;
|
||||||
|
//
|
||||||
|
// TXT_fovAD
|
||||||
|
//
|
||||||
|
this.TXT_fovAD.Location = new System.Drawing.Point(286, 192);
|
||||||
|
this.TXT_fovAD.Name = "TXT_fovAD";
|
||||||
|
this.TXT_fovAD.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovAD.TabIndex = 15;
|
||||||
|
//
|
||||||
|
// TXT_fovAV
|
||||||
|
//
|
||||||
|
this.TXT_fovAV.Location = new System.Drawing.Point(286, 165);
|
||||||
|
this.TXT_fovAV.Name = "TXT_fovAV";
|
||||||
|
this.TXT_fovAV.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovAV.TabIndex = 14;
|
||||||
|
//
|
||||||
|
// TXT_fovAH
|
||||||
|
//
|
||||||
|
this.TXT_fovAH.Location = new System.Drawing.Point(286, 138);
|
||||||
|
this.TXT_fovAH.Name = "TXT_fovAH";
|
||||||
|
this.TXT_fovAH.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_fovAH.TabIndex = 13;
|
||||||
|
//
|
||||||
|
// TXT_cmpixel
|
||||||
|
//
|
||||||
|
this.TXT_cmpixel.Location = new System.Drawing.Point(176, 218);
|
||||||
|
this.TXT_cmpixel.Name = "TXT_cmpixel";
|
||||||
|
this.TXT_cmpixel.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_cmpixel.TabIndex = 16;
|
||||||
|
//
|
||||||
|
// TXT_imgwidth
|
||||||
|
//
|
||||||
|
this.TXT_imgwidth.Location = new System.Drawing.Point(93, 244);
|
||||||
|
this.TXT_imgwidth.Name = "TXT_imgwidth";
|
||||||
|
this.TXT_imgwidth.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_imgwidth.TabIndex = 17;
|
||||||
|
//
|
||||||
|
// TXT_imgheight
|
||||||
|
//
|
||||||
|
this.TXT_imgheight.Location = new System.Drawing.Point(255, 244);
|
||||||
|
this.TXT_imgheight.Name = "TXT_imgheight";
|
||||||
|
this.TXT_imgheight.Size = new System.Drawing.Size(100, 20);
|
||||||
|
this.TXT_imgheight.TabIndex = 18;
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(371, 19);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(69, 13);
|
||||||
|
this.label1.TabIndex = 19;
|
||||||
|
this.label1.Text = "Focal Length";
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
this.label5.AutoSize = true;
|
||||||
|
this.label5.Location = new System.Drawing.Point(371, 45);
|
||||||
|
this.label5.Name = "label5";
|
||||||
|
this.label5.Size = new System.Drawing.Size(88, 13);
|
||||||
|
this.label5.TabIndex = 20;
|
||||||
|
this.label5.Text = "Frame Muli factor";
|
||||||
|
//
|
||||||
|
// label6
|
||||||
|
//
|
||||||
|
this.label6.AutoSize = true;
|
||||||
|
this.label6.Location = new System.Drawing.Point(9, 145);
|
||||||
|
this.label6.Name = "label6";
|
||||||
|
this.label6.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.label6.TabIndex = 21;
|
||||||
|
this.label6.Text = "Dist H";
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
this.label7.AutoSize = true;
|
||||||
|
this.label7.Location = new System.Drawing.Point(235, 145);
|
||||||
|
this.label7.Name = "label7";
|
||||||
|
this.label7.Size = new System.Drawing.Size(45, 13);
|
||||||
|
this.label7.TabIndex = 22;
|
||||||
|
this.label7.Text = "Angle H";
|
||||||
|
//
|
||||||
|
// label8
|
||||||
|
//
|
||||||
|
this.label8.AutoSize = true;
|
||||||
|
this.label8.Location = new System.Drawing.Point(236, 172);
|
||||||
|
this.label8.Name = "label8";
|
||||||
|
this.label8.Size = new System.Drawing.Size(44, 13);
|
||||||
|
this.label8.TabIndex = 23;
|
||||||
|
this.label8.Text = "Angle V";
|
||||||
|
//
|
||||||
|
// label9
|
||||||
|
//
|
||||||
|
this.label9.AutoSize = true;
|
||||||
|
this.label9.Location = new System.Drawing.Point(235, 199);
|
||||||
|
this.label9.Name = "label9";
|
||||||
|
this.label9.Size = new System.Drawing.Size(45, 13);
|
||||||
|
this.label9.TabIndex = 24;
|
||||||
|
this.label9.Text = "Angle D";
|
||||||
|
//
|
||||||
|
// label10
|
||||||
|
//
|
||||||
|
this.label10.AutoSize = true;
|
||||||
|
this.label10.Location = new System.Drawing.Point(10, 172);
|
||||||
|
this.label10.Name = "label10";
|
||||||
|
this.label10.Size = new System.Drawing.Size(35, 13);
|
||||||
|
this.label10.TabIndex = 25;
|
||||||
|
this.label10.Text = "Dist V";
|
||||||
|
//
|
||||||
|
// label11
|
||||||
|
//
|
||||||
|
this.label11.AutoSize = true;
|
||||||
|
this.label11.Location = new System.Drawing.Point(10, 199);
|
||||||
|
this.label11.Name = "label11";
|
||||||
|
this.label11.Size = new System.Drawing.Size(36, 13);
|
||||||
|
this.label11.TabIndex = 26;
|
||||||
|
this.label11.Text = "Dist D";
|
||||||
|
//
|
||||||
|
// label12
|
||||||
|
//
|
||||||
|
this.label12.AutoSize = true;
|
||||||
|
this.label12.Location = new System.Drawing.Point(125, 225);
|
||||||
|
this.label12.Name = "label12";
|
||||||
|
this.label12.Size = new System.Drawing.Size(50, 13);
|
||||||
|
this.label12.TabIndex = 27;
|
||||||
|
this.label12.Text = "CM/Pixel";
|
||||||
|
//
|
||||||
|
// label13
|
||||||
|
//
|
||||||
|
this.label13.AutoSize = true;
|
||||||
|
this.label13.Location = new System.Drawing.Point(37, 251);
|
||||||
|
this.label13.Name = "label13";
|
||||||
|
this.label13.Size = new System.Drawing.Size(39, 13);
|
||||||
|
this.label13.TabIndex = 28;
|
||||||
|
this.label13.Text = "Pixel X";
|
||||||
|
//
|
||||||
|
// label14
|
||||||
|
//
|
||||||
|
this.label14.AutoSize = true;
|
||||||
|
this.label14.Location = new System.Drawing.Point(199, 253);
|
||||||
|
this.label14.Name = "label14";
|
||||||
|
this.label14.Size = new System.Drawing.Size(39, 13);
|
||||||
|
this.label14.TabIndex = 29;
|
||||||
|
this.label14.Text = "Pixel Y";
|
||||||
|
//
|
||||||
|
// Camera
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(473, 275);
|
||||||
|
this.Controls.Add(this.label14);
|
||||||
|
this.Controls.Add(this.label13);
|
||||||
|
this.Controls.Add(this.label12);
|
||||||
|
this.Controls.Add(this.label11);
|
||||||
|
this.Controls.Add(this.label10);
|
||||||
|
this.Controls.Add(this.label9);
|
||||||
|
this.Controls.Add(this.label8);
|
||||||
|
this.Controls.Add(this.label7);
|
||||||
|
this.Controls.Add(this.label6);
|
||||||
|
this.Controls.Add(this.label5);
|
||||||
|
this.Controls.Add(this.label1);
|
||||||
|
this.Controls.Add(this.TXT_imgheight);
|
||||||
|
this.Controls.Add(this.TXT_imgwidth);
|
||||||
|
this.Controls.Add(this.TXT_cmpixel);
|
||||||
|
this.Controls.Add(this.TXT_fovAD);
|
||||||
|
this.Controls.Add(this.TXT_fovAV);
|
||||||
|
this.Controls.Add(this.TXT_fovAH);
|
||||||
|
this.Controls.Add(this.TXT_fovD);
|
||||||
|
this.Controls.Add(this.TXT_fovV);
|
||||||
|
this.Controls.Add(this.TXT_fovH);
|
||||||
|
this.Controls.Add(this.num_focalmultip);
|
||||||
|
this.Controls.Add(this.label4);
|
||||||
|
this.Controls.Add(this.num_focallength);
|
||||||
|
this.Controls.Add(this.label3);
|
||||||
|
this.Controls.Add(this.label2);
|
||||||
|
this.Controls.Add(this.num_megapixel);
|
||||||
|
this.Controls.Add(this.num_agl);
|
||||||
|
this.Name = "Camera";
|
||||||
|
this.Text = "Camera";
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_agl)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_megapixel)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_focallength)).EndInit();
|
||||||
|
((System.ComponentModel.ISupportInitialize)(this.num_focalmultip)).EndInit();
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private System.Windows.Forms.NumericUpDown num_agl;
|
||||||
|
private System.Windows.Forms.NumericUpDown num_megapixel;
|
||||||
|
private System.Windows.Forms.Label label2;
|
||||||
|
private System.Windows.Forms.Label label3;
|
||||||
|
private System.Windows.Forms.NumericUpDown num_focallength;
|
||||||
|
private System.Windows.Forms.Label label4;
|
||||||
|
private System.Windows.Forms.NumericUpDown num_focalmultip;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovH;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovV;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovD;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovAD;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovAV;
|
||||||
|
private System.Windows.Forms.TextBox TXT_fovAH;
|
||||||
|
private System.Windows.Forms.TextBox TXT_cmpixel;
|
||||||
|
private System.Windows.Forms.TextBox TXT_imgwidth;
|
||||||
|
private System.Windows.Forms.TextBox TXT_imgheight;
|
||||||
|
private System.Windows.Forms.Label label1;
|
||||||
|
private System.Windows.Forms.Label label5;
|
||||||
|
private System.Windows.Forms.Label label6;
|
||||||
|
private System.Windows.Forms.Label label7;
|
||||||
|
private System.Windows.Forms.Label label8;
|
||||||
|
private System.Windows.Forms.Label label9;
|
||||||
|
private System.Windows.Forms.Label label10;
|
||||||
|
private System.Windows.Forms.Label label11;
|
||||||
|
private System.Windows.Forms.Label label12;
|
||||||
|
private System.Windows.Forms.Label label13;
|
||||||
|
private System.Windows.Forms.Label label14;
|
||||||
|
}
|
||||||
|
}
|
139
Tools/ArdupilotMegaPlanner/Camera.cs
Normal file
139
Tools/ArdupilotMegaPlanner/Camera.cs
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace ArdupilotMega
|
||||||
|
{
|
||||||
|
public partial class Camera : Form
|
||||||
|
{
|
||||||
|
float mm_2_feet = 1 / 304.8f;
|
||||||
|
float feet_2_mm = 304.8f;
|
||||||
|
const float rad2deg = (float)(180 / Math.PI);
|
||||||
|
const float deg2rad = (float)(1.0 / rad2deg);
|
||||||
|
|
||||||
|
public Camera()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
doCalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
void doCalc()
|
||||||
|
{
|
||||||
|
|
||||||
|
var film_width = 36.0f;
|
||||||
|
var film_height = 27.0f;
|
||||||
|
var film_diag = 0.0f;
|
||||||
|
|
||||||
|
var flen = (float)num_focallength.Value;
|
||||||
|
var flen_mult = (float)num_focalmultip.Value;
|
||||||
|
var subj_dist = (float)num_agl.Value;
|
||||||
|
|
||||||
|
//if (isNaN(flen_mult) || flen_mult<=0)
|
||||||
|
{
|
||||||
|
//f.flen_mult = 1;
|
||||||
|
//flen_mult = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert distance to mm
|
||||||
|
/*
|
||||||
|
if (f.units.value.search(/feet/i) != -1)
|
||||||
|
{
|
||||||
|
//user input in feet
|
||||||
|
subj_dist = subj_dist * feet_2_mm;
|
||||||
|
}
|
||||||
|
else */
|
||||||
|
{
|
||||||
|
//user input in m
|
||||||
|
subj_dist = subj_dist * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Account for focal length multiplier (actually, a film/sensor size multiplier)
|
||||||
|
film_width = film_width / flen_mult;
|
||||||
|
film_height = film_height / flen_mult;
|
||||||
|
film_diag = (int)(Math.Sqrt((film_width * film_width) + (film_height * film_height)));
|
||||||
|
|
||||||
|
var half_fov_h = (Math.Atan(film_width / (2 * flen)));
|
||||||
|
var fov_h = 2 * (subj_dist * Math.Tan(half_fov_h));
|
||||||
|
|
||||||
|
var half_fov_v = (Math.Atan(film_height / (2 * flen)));
|
||||||
|
var fov_v = 2 * (subj_dist * Math.Tan(half_fov_v));
|
||||||
|
|
||||||
|
var half_fov_d = (Math.Atan(film_diag / (2 * flen)));
|
||||||
|
var fov_d = 2 * (subj_dist * Math.Tan(half_fov_d));
|
||||||
|
|
||||||
|
//convert answer (currently in mm) back to feet
|
||||||
|
fov_h = fov_h * mm_2_feet;
|
||||||
|
fov_v = fov_v * mm_2_feet;
|
||||||
|
fov_d = fov_d * mm_2_feet;
|
||||||
|
/*
|
||||||
|
if (f.units.value.search(/feet/i) != -1)
|
||||||
|
{
|
||||||
|
f.fov_h.value = feet_inches(fov_h);
|
||||||
|
f.fov_v.value = feet_inches(fov_v);
|
||||||
|
f.fov_d.value = feet_inches(fov_d);
|
||||||
|
}
|
||||||
|
else */
|
||||||
|
{
|
||||||
|
TXT_fovH.Text = meters(fov_h);
|
||||||
|
TXT_fovV.Text = meters(fov_v);
|
||||||
|
TXT_fovD.Text = meters(fov_d);
|
||||||
|
|
||||||
|
TXT_fovAH.Text = (half_fov_h * 2 * rad2deg).ToString("0.00");
|
||||||
|
TXT_fovAV.Text = (half_fov_v * 2 * rad2deg).ToString("0.00");
|
||||||
|
TXT_fovAD.Text = (half_fov_d * 2 * rad2deg).ToString("0.00");
|
||||||
|
|
||||||
|
float test1 = (float)Math.Sqrt((float)num_megapixel.Value * 1000000 * (film_height / film_width));
|
||||||
|
|
||||||
|
TXT_imgwidth.Text = test1.ToString("0");
|
||||||
|
TXT_imgheight.Text = (((float)num_megapixel.Value * 1000000) / test1).ToString("0");
|
||||||
|
|
||||||
|
|
||||||
|
TXT_cmpixel.Text = (((fov_h * feet_2_mm) / 10.0) / test1).ToString("0.000 cm");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Takes a distance in feet and converts to string representation in meters/cm
|
||||||
|
string meters(double aNumber)
|
||||||
|
{
|
||||||
|
//if (isNaN(aNumber))
|
||||||
|
//return aNumber;
|
||||||
|
|
||||||
|
var mm = aNumber * feet_2_mm;
|
||||||
|
|
||||||
|
var m = Math.Floor(mm / 1000);
|
||||||
|
var cm = (mm / 10) % 100;
|
||||||
|
|
||||||
|
return m + "m " + cm.ToString("0.00") + "cm";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void num_agl_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
doCalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void num_megapixel_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
doCalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void num_focallength_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
doCalc();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void num_focalmultip_ValueChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
doCalc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
120
Tools/ArdupilotMegaPlanner/Camera.resx
Normal file
120
Tools/ArdupilotMegaPlanner/Camera.resx
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
@ -147,6 +147,10 @@ namespace ArdupilotMega
|
|||||||
public ushort rcoverridech2 { get; set; }
|
public ushort rcoverridech2 { get; set; }
|
||||||
public ushort rcoverridech3 { get; set; }
|
public ushort rcoverridech3 { get; set; }
|
||||||
public ushort rcoverridech4 { get; set; }
|
public ushort rcoverridech4 { get; set; }
|
||||||
|
public ushort rcoverridech5 { get; set; }
|
||||||
|
public ushort rcoverridech6 { get; set; }
|
||||||
|
public ushort rcoverridech7 { get; set; }
|
||||||
|
public ushort rcoverridech8 { get; set; }
|
||||||
|
|
||||||
// current firmware
|
// current firmware
|
||||||
public MainV2.Firmwares firmware = MainV2.Firmwares.ArduPlane;
|
public MainV2.Firmwares firmware = MainV2.Firmwares.ArduPlane;
|
||||||
@ -187,10 +191,15 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs)
|
public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs)
|
||||||
{
|
{
|
||||||
UpdateCurrentSettings(bs, false);
|
UpdateCurrentSettings(bs, false, MainV2.comPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs, bool updatenow)
|
public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs, bool updatenow)
|
||||||
|
{
|
||||||
|
UpdateCurrentSettings(bs, false, MainV2.comPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateCurrentSettings(System.Windows.Forms.BindingSource bs, bool updatenow, MAVLink mavinterface)
|
||||||
{
|
{
|
||||||
if (DateTime.Now > lastupdate.AddMilliseconds(19) || updatenow) // 50 hz
|
if (DateTime.Now > lastupdate.AddMilliseconds(19) || updatenow) // 50 hz
|
||||||
{
|
{
|
||||||
@ -203,10 +212,10 @@ namespace ArdupilotMega
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Console.WriteLine("Updating CurrentState " + DateTime.Now.Millisecond);
|
// Console.WriteLine("Updating CurrentState " + DateTime.Now.Millisecond);
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT] != null) // status text
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT] != null) // status text
|
||||||
{
|
{
|
||||||
|
|
||||||
string logdata = DateTime.Now + " " + Encoding.ASCII.GetString(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT], 6, MAVLink.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT].Length - 6);
|
string logdata = DateTime.Now + " " + Encoding.ASCII.GetString(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT], 6, mavinterface.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT].Length - 6);
|
||||||
|
|
||||||
int ind = logdata.IndexOf('\0');
|
int ind = logdata.IndexOf('\0');
|
||||||
if (ind != -1)
|
if (ind != -1)
|
||||||
@ -217,16 +226,16 @@ namespace ArdupilotMega
|
|||||||
}
|
}
|
||||||
messages.Add(logdata + "\n");
|
messages.Add(logdata + "\n");
|
||||||
|
|
||||||
MAVLink.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT] = null;
|
mavinterface.packets[MAVLink.MAVLINK_MSG_ID_STATUSTEXT] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] != null) // hil
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] != null) // hil
|
||||||
{
|
{
|
||||||
var hil = new ArdupilotMega.MAVLink.__mavlink_rc_channels_scaled_t();
|
var hil = new ArdupilotMega.MAVLink.__mavlink_rc_channels_scaled_t();
|
||||||
|
|
||||||
object temp = hil;
|
object temp = hil;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED], ref temp, 6);
|
||||||
|
|
||||||
hil = (MAVLink.__mavlink_rc_channels_scaled_t)(temp);
|
hil = (MAVLink.__mavlink_rc_channels_scaled_t)(temp);
|
||||||
|
|
||||||
@ -242,13 +251,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] != null)
|
||||||
{
|
{
|
||||||
MAVLink.__mavlink_nav_controller_output_t nav = new MAVLink.__mavlink_nav_controller_output_t();
|
MAVLink.__mavlink_nav_controller_output_t nav = new MAVLink.__mavlink_nav_controller_output_t();
|
||||||
|
|
||||||
object temp = nav;
|
object temp = nav;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT], ref temp, 6);
|
||||||
|
|
||||||
nav = (MAVLink.__mavlink_nav_controller_output_t)(temp);
|
nav = (MAVLink.__mavlink_nav_controller_output_t)(temp);
|
||||||
|
|
||||||
@ -264,13 +273,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS] != null)
|
if (mavinterface.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS] != null)
|
||||||
{
|
{
|
||||||
ArdupilotMega.MAVLink.__mavlink_sys_status_t sysstatus = new ArdupilotMega.MAVLink.__mavlink_sys_status_t();
|
ArdupilotMega.MAVLink.__mavlink_sys_status_t sysstatus = new ArdupilotMega.MAVLink.__mavlink_sys_status_t();
|
||||||
|
|
||||||
object temp = sysstatus;
|
object temp = sysstatus;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS], ref temp, 6);
|
||||||
|
|
||||||
sysstatus = (ArdupilotMega.MAVLink.__mavlink_sys_status_t)(temp);
|
sysstatus = (ArdupilotMega.MAVLink.__mavlink_sys_status_t)(temp);
|
||||||
|
|
||||||
@ -377,13 +386,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS] = null;
|
//MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_SYS_STATUS] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE] != null)
|
||||||
{
|
{
|
||||||
var att = new ArdupilotMega.MAVLink.__mavlink_attitude_t();
|
var att = new ArdupilotMega.MAVLink.__mavlink_attitude_t();
|
||||||
|
|
||||||
object temp = att;
|
object temp = att;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE], ref temp, 6);
|
||||||
|
|
||||||
att = (MAVLink.__mavlink_attitude_t)(temp);
|
att = (MAVLink.__mavlink_attitude_t)(temp);
|
||||||
|
|
||||||
@ -396,13 +405,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_ATTITUDE] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW] != null)
|
||||||
{
|
{
|
||||||
var gps = new MAVLink.__mavlink_gps_raw_t();
|
var gps = new MAVLink.__mavlink_gps_raw_t();
|
||||||
|
|
||||||
object temp = gps;
|
object temp = gps;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW], ref temp, 6);
|
||||||
|
|
||||||
gps = (MAVLink.__mavlink_gps_raw_t)(temp);
|
gps = (MAVLink.__mavlink_gps_raw_t)(temp);
|
||||||
|
|
||||||
@ -421,26 +430,26 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_RAW] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_STATUS] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GPS_STATUS] != null)
|
||||||
{
|
{
|
||||||
var gps = new MAVLink.__mavlink_gps_status_t();
|
var gps = new MAVLink.__mavlink_gps_status_t();
|
||||||
|
|
||||||
object temp = gps;
|
object temp = gps;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GPS_STATUS], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GPS_STATUS], ref temp, 6);
|
||||||
|
|
||||||
gps = (MAVLink.__mavlink_gps_status_t)(temp);
|
gps = (MAVLink.__mavlink_gps_status_t)(temp);
|
||||||
|
|
||||||
satcount = gps.satellites_visible;
|
satcount = gps.satellites_visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT] != null)
|
||||||
{
|
{
|
||||||
var loc = new MAVLink.__mavlink_global_position_int_t();
|
var loc = new MAVLink.__mavlink_global_position_int_t();
|
||||||
|
|
||||||
object temp = loc;
|
object temp = loc;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT], ref temp, 6);
|
||||||
|
|
||||||
loc = (MAVLink.__mavlink_global_position_int_t)(temp);
|
loc = (MAVLink.__mavlink_global_position_int_t)(temp);
|
||||||
|
|
||||||
@ -449,13 +458,13 @@ namespace ArdupilotMega
|
|||||||
lng = loc.lon / 10000000.0f;
|
lng = loc.lon / 10000000.0f;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION] != null)
|
||||||
{
|
{
|
||||||
var loc = new MAVLink.__mavlink_global_position_t();
|
var loc = new MAVLink.__mavlink_global_position_t();
|
||||||
|
|
||||||
object temp = loc;
|
object temp = loc;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION], ref temp, 6);
|
||||||
|
|
||||||
loc = (MAVLink.__mavlink_global_position_t)(temp);
|
loc = (MAVLink.__mavlink_global_position_t)(temp);
|
||||||
|
|
||||||
@ -464,13 +473,13 @@ namespace ArdupilotMega
|
|||||||
lng = loc.lon;
|
lng = loc.lon;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT] != null)
|
if (mavinterface.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT] != null)
|
||||||
{
|
{
|
||||||
ArdupilotMega.MAVLink.__mavlink_waypoint_current_t wpcur = new ArdupilotMega.MAVLink.__mavlink_waypoint_current_t();
|
ArdupilotMega.MAVLink.__mavlink_waypoint_current_t wpcur = new ArdupilotMega.MAVLink.__mavlink_waypoint_current_t();
|
||||||
|
|
||||||
object temp = wpcur;
|
object temp = wpcur;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT], ref temp, 6);
|
||||||
|
|
||||||
wpcur = (ArdupilotMega.MAVLink.__mavlink_waypoint_current_t)(temp);
|
wpcur = (ArdupilotMega.MAVLink.__mavlink_waypoint_current_t)(temp);
|
||||||
|
|
||||||
@ -486,13 +495,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT] = null;
|
//MAVLink.packets[ArdupilotMega.MAVLink.MAVLINK_MSG_ID_WAYPOINT_CURRENT] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] != null)
|
||||||
{
|
{
|
||||||
var rcin = new MAVLink.__mavlink_rc_channels_raw_t();
|
var rcin = new MAVLink.__mavlink_rc_channels_raw_t();
|
||||||
|
|
||||||
object temp = rcin;
|
object temp = rcin;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW], ref temp, 6);
|
||||||
|
|
||||||
rcin = (MAVLink.__mavlink_rc_channels_raw_t)(temp);
|
rcin = (MAVLink.__mavlink_rc_channels_raw_t)(temp);
|
||||||
|
|
||||||
@ -508,13 +517,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW] != null)
|
||||||
{
|
{
|
||||||
var servoout = new MAVLink.__mavlink_servo_output_raw_t();
|
var servoout = new MAVLink.__mavlink_servo_output_raw_t();
|
||||||
|
|
||||||
object temp = servoout;
|
object temp = servoout;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW], ref temp, 6);
|
||||||
|
|
||||||
servoout = (MAVLink.__mavlink_servo_output_raw_t)(temp);
|
servoout = (MAVLink.__mavlink_servo_output_raw_t)(temp);
|
||||||
|
|
||||||
@ -530,13 +539,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SERVO_OUTPUT_RAW] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] != null)
|
||||||
{
|
{
|
||||||
var imu = new MAVLink.__mavlink_raw_imu_t();
|
var imu = new MAVLink.__mavlink_raw_imu_t();
|
||||||
|
|
||||||
object temp = imu;
|
object temp = imu;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU], ref temp, 6);
|
||||||
|
|
||||||
imu = (MAVLink.__mavlink_raw_imu_t)(temp);
|
imu = (MAVLink.__mavlink_raw_imu_t)(temp);
|
||||||
|
|
||||||
@ -551,13 +560,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SCALED_IMU] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_SCALED_IMU] != null)
|
||||||
{
|
{
|
||||||
var imu = new MAVLink.__mavlink_scaled_imu_t();
|
var imu = new MAVLink.__mavlink_scaled_imu_t();
|
||||||
|
|
||||||
object temp = imu;
|
object temp = imu;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_SCALED_IMU], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_SCALED_IMU], ref temp, 6);
|
||||||
|
|
||||||
imu = (MAVLink.__mavlink_scaled_imu_t)(temp);
|
imu = (MAVLink.__mavlink_scaled_imu_t)(temp);
|
||||||
|
|
||||||
@ -572,13 +581,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_RAW_IMU] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD] != null)
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD] != null)
|
||||||
{
|
{
|
||||||
MAVLink.__mavlink_vfr_hud_t vfr = new MAVLink.__mavlink_vfr_hud_t();
|
MAVLink.__mavlink_vfr_hud_t vfr = new MAVLink.__mavlink_vfr_hud_t();
|
||||||
|
|
||||||
object temp = vfr;
|
object temp = vfr;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD], ref temp, 6);
|
||||||
|
|
||||||
vfr = (MAVLink.__mavlink_vfr_hud_t)(temp);
|
vfr = (MAVLink.__mavlink_vfr_hud_t)(temp);
|
||||||
|
|
||||||
@ -602,13 +611,13 @@ namespace ArdupilotMega
|
|||||||
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD] = null;
|
//MAVLink.packets[MAVLink.MAVLINK_MSG_ID_VFR_HUD] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MAVLink.packets[MAVLink.MAVLINK_MSG_ID_MEMINFO] != null) // hil
|
if (mavinterface.packets[MAVLink.MAVLINK_MSG_ID_MEMINFO] != null) // hil
|
||||||
{
|
{
|
||||||
var mem = new ArdupilotMega.MAVLink.__mavlink_meminfo_t();
|
var mem = new ArdupilotMega.MAVLink.__mavlink_meminfo_t();
|
||||||
|
|
||||||
object temp = mem;
|
object temp = mem;
|
||||||
|
|
||||||
MAVLink.ByteArrayToStructure(MAVLink.packets[MAVLink.MAVLINK_MSG_ID_MEMINFO], ref temp, 6);
|
MAVLink.ByteArrayToStructure(mavinterface.packets[MAVLink.MAVLINK_MSG_ID_MEMINFO], ref temp, 6);
|
||||||
|
|
||||||
mem = (MAVLink.__mavlink_meminfo_t)(temp);
|
mem = (MAVLink.__mavlink_meminfo_t)(temp);
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' bu
|
|||||||
autogenerated:249: warning: 'long int read_barometer()' declared 'static' but never defined
|
autogenerated:249: warning: 'long int read_barometer()' declared 'static' but never defined
|
||||||
autogenerated:250: warning: 'void read_airspeed()' declared 'static' but never defined
|
autogenerated:250: warning: 'void read_airspeed()' declared 'static' but never defined
|
||||||
autogenerated:251: warning: 'void zero_airspeed()' declared 'static' but never defined
|
autogenerated:251: warning: 'void zero_airspeed()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/system.pde:434: warning: 'void set_failsafe(boolean)' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/system.pde:438: warning: 'void set_failsafe(boolean)' defined but not used
|
||||||
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
||||||
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
||||||
|
@ -46,7 +46,7 @@ autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' bu
|
|||||||
autogenerated:249: warning: 'long int read_barometer()' declared 'static' but never defined
|
autogenerated:249: warning: 'long int read_barometer()' declared 'static' but never defined
|
||||||
autogenerated:250: warning: 'void read_airspeed()' declared 'static' but never defined
|
autogenerated:250: warning: 'void read_airspeed()' declared 'static' but never defined
|
||||||
autogenerated:251: warning: 'void zero_airspeed()' declared 'static' but never defined
|
autogenerated:251: warning: 'void zero_airspeed()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/system.pde:434: warning: 'void set_failsafe(boolean)' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/system.pde:438: warning: 'void set_failsafe(boolean)' defined but not used
|
||||||
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
||||||
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
||||||
|
@ -9,11 +9,11 @@ In file included from /root/apm/ardupilot-mega/ArduCopter/ArduCopter.pde:77:
|
|||||||
/root/apm/ardupilot-mega/ArduCopter/heli.pde: In function 'void heli_init_swash()':
|
/root/apm/ardupilot-mega/ArduCopter/heli.pde: In function 'void heli_init_swash()':
|
||||||
/root/apm/ardupilot-mega/ArduCopter/heli.pde:60: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
|
/root/apm/ardupilot-mega/ArduCopter/heli.pde:60: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde: In function 'int8_t setup_heli(uint8_t, const Menu::arg*)':
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde: In function 'int8_t setup_heli(uint8_t, const Menu::arg*)':
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_pitch' may be used uninitialized in this function
|
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_tail' may be used uninitialized in this function
|
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_tail' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_tail' may be used uninitialized in this function
|
||||||
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_tail' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_coll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_coll' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_coll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_coll' may be used uninitialized in this function
|
||||||
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_pitch' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_roll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_roll' may be used uninitialized in this function
|
||||||
autogenerated: At global scope:
|
autogenerated: At global scope:
|
||||||
autogenerated:109: warning: 'void Log_Write_Optflow()' declared 'static' but never defined
|
autogenerated:109: warning: 'void Log_Write_Optflow()' declared 'static' but never defined
|
||||||
@ -34,7 +34,7 @@ autogenerated:238: warning: 'long int get_alt_distance(Location*, Location*)' de
|
|||||||
autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' but never defined
|
autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:95: warning: 'void read_airspeed()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:95: warning: 'void read_airspeed()' defined but not used
|
||||||
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:100: warning: 'void zero_airspeed()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:100: warning: 'void zero_airspeed()' defined but not used
|
||||||
/root/apm/ardupilot-mega/ArduCopter/system.pde:434: warning: 'void set_failsafe(boolean)' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/system.pde:438: warning: 'void set_failsafe(boolean)' defined but not used
|
||||||
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
||||||
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
||||||
|
@ -677,9 +677,9 @@
|
|||||||
000003a0 t read_battery()
|
000003a0 t read_battery()
|
||||||
0000045c T update_yaw_mode()
|
0000045c T update_yaw_mode()
|
||||||
0000046e T update_roll_pitch_mode()
|
0000046e T update_roll_pitch_mode()
|
||||||
0000052e t heli_move_swash(int, int, int, int)
|
0000053e t heli_move_swash(int, int, int, int)
|
||||||
000005cc t __static_initialization_and_destruction_0(int, int)
|
000005cc t __static_initialization_and_destruction_0(int, int)
|
||||||
00000640 t init_ardupilot()
|
00000620 t init_ardupilot()
|
||||||
0000071a t update_nav_wp()
|
0000071a t update_nav_wp()
|
||||||
000007ec t setup_heli(unsigned char, Menu::arg const*)
|
000007ec t setup_heli(unsigned char, Menu::arg const*)
|
||||||
00000870 t process_next_command()
|
00000870 t process_next_command()
|
||||||
|
@ -9,11 +9,11 @@ In file included from /root/apm/ardupilot-mega/ArduCopter/ArduCopter.pde:77:
|
|||||||
/root/apm/ardupilot-mega/ArduCopter/heli.pde: In function 'void heli_init_swash()':
|
/root/apm/ardupilot-mega/ArduCopter/heli.pde: In function 'void heli_init_swash()':
|
||||||
/root/apm/ardupilot-mega/ArduCopter/heli.pde:60: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
|
/root/apm/ardupilot-mega/ArduCopter/heli.pde:60: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde: In function 'int8_t setup_heli(uint8_t, const Menu::arg*)':
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde: In function 'int8_t setup_heli(uint8_t, const Menu::arg*)':
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_pitch' may be used uninitialized in this function
|
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_tail' may be used uninitialized in this function
|
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_tail' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_tail' may be used uninitialized in this function
|
||||||
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_tail' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_coll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_coll' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_coll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'min_coll' may be used uninitialized in this function
|
||||||
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_pitch' may be used uninitialized in this function
|
||||||
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_roll' may be used uninitialized in this function
|
/root/apm/ardupilot-mega/ArduCopter/setup.pde:467: warning: 'max_roll' may be used uninitialized in this function
|
||||||
autogenerated: At global scope:
|
autogenerated: At global scope:
|
||||||
autogenerated:109: warning: 'void Log_Write_Optflow()' declared 'static' but never defined
|
autogenerated:109: warning: 'void Log_Write_Optflow()' declared 'static' but never defined
|
||||||
@ -34,7 +34,7 @@ autogenerated:238: warning: 'long int get_alt_distance(Location*, Location*)' de
|
|||||||
autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' but never defined
|
autogenerated:248: warning: 'long int read_baro_filtered()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:95: warning: 'void read_airspeed()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:95: warning: 'void read_airspeed()' defined but not used
|
||||||
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:100: warning: 'void zero_airspeed()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/sensors.pde:100: warning: 'void zero_airspeed()' defined but not used
|
||||||
/root/apm/ardupilot-mega/ArduCopter/system.pde:434: warning: 'void set_failsafe(boolean)' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/system.pde:438: warning: 'void set_failsafe(boolean)' defined but not used
|
||||||
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
autogenerated:285: warning: 'void init_optflow()' declared 'static' but never defined
|
||||||
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
autogenerated:292: warning: 'void fake_out_gps()' declared 'static' but never defined
|
||||||
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
/root/apm/ardupilot-mega/ArduCopter/test.pde:1028: warning: 'void print_motor_out()' defined but not used
|
||||||
|
@ -677,9 +677,9 @@
|
|||||||
000003a0 t read_battery()
|
000003a0 t read_battery()
|
||||||
0000045c T update_yaw_mode()
|
0000045c T update_yaw_mode()
|
||||||
0000046e T update_roll_pitch_mode()
|
0000046e T update_roll_pitch_mode()
|
||||||
0000052e t heli_move_swash(int, int, int, int)
|
0000053e t heli_move_swash(int, int, int, int)
|
||||||
000005cc t __static_initialization_and_destruction_0(int, int)
|
000005cc t __static_initialization_and_destruction_0(int, int)
|
||||||
0000063e t init_ardupilot()
|
0000061e t init_ardupilot()
|
||||||
0000071a t update_nav_wp()
|
0000071a t update_nav_wp()
|
||||||
000007e8 t setup_heli(unsigned char, Menu::arg const*)
|
000007e8 t setup_heli(unsigned char, Menu::arg const*)
|
||||||
00000870 t process_next_command()
|
00000870 t process_next_command()
|
||||||
|
@ -99,6 +99,7 @@
|
|||||||
<desc>
|
<desc>
|
||||||
#define AUTO_RESET_LOITER 0
|
#define AUTO_RESET_LOITER 0
|
||||||
#define FRAME_CONFIG HELI_FRAME
|
#define FRAME_CONFIG HELI_FRAME
|
||||||
|
#define INSTANT_PWM ENABLED
|
||||||
|
|
||||||
// DEFAULT PIDS
|
// DEFAULT PIDS
|
||||||
|
|
||||||
|
@ -1 +1,36 @@
|
|||||||
Already up-to-date.
|
From https://code.google.com/p/ardupilot-mega
|
||||||
|
8a21477..b0bfa54 APM_Camera -> origin/APM_Camera
|
||||||
|
6f44fff..076459c master -> origin/master
|
||||||
|
Updating 6f44fff..076459c
|
||||||
|
Fast-forward
|
||||||
|
ArduCopter/control_modes.pde | 16 +
|
||||||
|
ArduCopter/defines.h | 1 +
|
||||||
|
ArduCopter/system.pde | 4 +
|
||||||
|
ArduPlane/ArduPlane.pde | 10 +-
|
||||||
|
ArduPlane/Parameters.h | 3 +
|
||||||
|
ArduPlane/config.h | 8 +
|
||||||
|
Tools/ArduTracker/tags |148411 --------------------
|
||||||
|
Tools/ArdupilotMegaPlanner/GCSViews/Terminal.cs | 2 +
|
||||||
|
Tools/ArdupilotMegaPlanner/Log.cs | 174 +-
|
||||||
|
Tools/ArdupilotMegaPlanner/MainV2.cs | 9 +-
|
||||||
|
.../Properties/AssemblyInfo.cs | 2 +-
|
||||||
|
.../bin/Release/ArdupilotMegaPlanner.application | 2 +-
|
||||||
|
.../bin/Release/ArdupilotMegaPlanner.exe | Bin 2194432 -> 2194944 bytes
|
||||||
|
Tools/ArdupilotMegaPlanner/bin/Release/Updater.exe | Bin 8192 -> 8192 bytes
|
||||||
|
Tools/ArdupilotMegaPlanner/bin/Release/resedit.exe | Bin 20480 -> 20480 bytes
|
||||||
|
.../ru-RU/ArdupilotMegaPlanner.resources.dll | Bin 53248 -> 53248 bytes
|
||||||
|
.../zh-Hans/ArdupilotMegaPlanner.resources.dll | Bin 380928 -> 380928 bytes
|
||||||
|
apo/ControllerQuad.h | 51 +-
|
||||||
|
apo/QuadArducopter.h | 10 +-
|
||||||
|
libraries/APO/AP_ArmingMechanism.cpp | 57 +
|
||||||
|
libraries/APO/AP_ArmingMechanism.h | 67 +
|
||||||
|
libraries/APO/AP_BatteryMonitor.cpp | 2 +
|
||||||
|
libraries/APO/AP_BatteryMonitor.h | 58 +-
|
||||||
|
libraries/APO/AP_Guide.h | 1 +
|
||||||
|
libraries/APO/AP_HardwareAbstractionLayer.h | 13 +
|
||||||
|
libraries/APO/AP_Navigator.cpp | 20 +-
|
||||||
|
libraries/Desktop/support/FastSerial.cpp | 283 +-
|
||||||
|
27 files changed, 517 insertions(+), 148687 deletions(-)
|
||||||
|
delete mode 100644 Tools/ArduTracker/tags
|
||||||
|
create mode 100644 libraries/APO/AP_ArmingMechanism.cpp
|
||||||
|
create mode 100644 libraries/APO/AP_ArmingMechanism.h
|
||||||
|
@ -289,8 +289,6 @@ namespace ArdupilotMega.GCSViews
|
|||||||
|
|
||||||
internal void processToScreen()
|
internal void processToScreen()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
Params.Rows.Clear();
|
Params.Rows.Clear();
|
||||||
|
|
||||||
// process hashdefines and update display
|
// process hashdefines and update display
|
||||||
@ -343,7 +341,7 @@ namespace ArdupilotMega.GCSViews
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
toolTip1.SetToolTip(ctl, tooltips[value].ToString());
|
toolTip1.SetToolTip(ctl, ((paramsettings)tooltips[value]).desc);
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
@ -563,7 +563,7 @@ namespace ArdupilotMega.GCSViews
|
|||||||
this.Refresh();
|
this.Refresh();
|
||||||
Console.WriteLine("Downloaded");
|
Console.WriteLine("Downloaded");
|
||||||
}
|
}
|
||||||
catch (Exception ex) { lbl_status.Text = "Failed download"; MessageBox.Show("Failed to download new firmware : " + ex.Message); return; }
|
catch (Exception ex) { lbl_status.Text = "Failed download"; MessageBox.Show("Failed to download new firmware : " + ex.ToString()); return; }
|
||||||
|
|
||||||
UploadFlash(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"firmware.hex", board);
|
UploadFlash(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"firmware.hex", board);
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,11 @@
|
|||||||
this.BUT_playlog = new ArdupilotMega.MyButton();
|
this.BUT_playlog = new ArdupilotMega.MyButton();
|
||||||
this.BUT_loadtelem = new ArdupilotMega.MyButton();
|
this.BUT_loadtelem = new ArdupilotMega.MyButton();
|
||||||
this.tableMap = new System.Windows.Forms.TableLayoutPanel();
|
this.tableMap = new System.Windows.Forms.TableLayoutPanel();
|
||||||
|
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||||
|
this.zg1 = new ZedGraph.ZedGraphControl();
|
||||||
|
this.lbl_winddir = new ArdupilotMega.MyLabel();
|
||||||
|
this.lbl_windvel = new ArdupilotMega.MyLabel();
|
||||||
|
this.gMapControl1 = new GMap.NET.WindowsForms.GMapControl();
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
this.panel1 = new System.Windows.Forms.Panel();
|
||||||
this.TXT_lat = new ArdupilotMega.MyLabel();
|
this.TXT_lat = new ArdupilotMega.MyLabel();
|
||||||
this.Zoomlevel = new System.Windows.Forms.NumericUpDown();
|
this.Zoomlevel = new System.Windows.Forms.NumericUpDown();
|
||||||
@ -58,11 +63,6 @@
|
|||||||
this.TXT_alt = new ArdupilotMega.MyLabel();
|
this.TXT_alt = new ArdupilotMega.MyLabel();
|
||||||
this.CHK_autopan = new System.Windows.Forms.CheckBox();
|
this.CHK_autopan = new System.Windows.Forms.CheckBox();
|
||||||
this.CB_tuning = new System.Windows.Forms.CheckBox();
|
this.CB_tuning = new System.Windows.Forms.CheckBox();
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.lbl_windvel = new ArdupilotMega.MyLabel();
|
|
||||||
this.lbl_winddir = new ArdupilotMega.MyLabel();
|
|
||||||
this.gMapControl1 = new GMap.NET.WindowsForms.GMapControl();
|
|
||||||
this.zg1 = new ZedGraph.ZedGraphControl();
|
|
||||||
this.dataGridViewImageColumn1 = new System.Windows.Forms.DataGridViewImageColumn();
|
this.dataGridViewImageColumn1 = new System.Windows.Forms.DataGridViewImageColumn();
|
||||||
this.dataGridViewImageColumn2 = new System.Windows.Forms.DataGridViewImageColumn();
|
this.dataGridViewImageColumn2 = new System.Windows.Forms.DataGridViewImageColumn();
|
||||||
this.ZedGraphTimer = new System.Windows.Forms.Timer(this.components);
|
this.ZedGraphTimer = new System.Windows.Forms.Timer(this.components);
|
||||||
@ -84,9 +84,11 @@
|
|||||||
((System.ComponentModel.ISupportInitialize)(this.NUM_playbackspeed)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.NUM_playbackspeed)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.tracklog)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.tracklog)).BeginInit();
|
||||||
this.tableMap.SuspendLayout();
|
this.tableMap.SuspendLayout();
|
||||||
|
this.splitContainer1.Panel1.SuspendLayout();
|
||||||
|
this.splitContainer1.Panel2.SuspendLayout();
|
||||||
|
this.splitContainer1.SuspendLayout();
|
||||||
this.panel1.SuspendLayout();
|
this.panel1.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.Zoomlevel)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.Zoomlevel)).BeginInit();
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// contextMenuStrip1
|
// contextMenuStrip1
|
||||||
@ -1042,10 +1044,80 @@
|
|||||||
// tableMap
|
// tableMap
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.tableMap, "tableMap");
|
resources.ApplyResources(this.tableMap, "tableMap");
|
||||||
|
this.tableMap.Controls.Add(this.splitContainer1, 0, 0);
|
||||||
this.tableMap.Controls.Add(this.panel1, 0, 1);
|
this.tableMap.Controls.Add(this.panel1, 0, 1);
|
||||||
this.tableMap.Controls.Add(this.panel2, 0, 0);
|
|
||||||
this.tableMap.Name = "tableMap";
|
this.tableMap.Name = "tableMap";
|
||||||
//
|
//
|
||||||
|
// splitContainer1
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.splitContainer1, "splitContainer1");
|
||||||
|
this.splitContainer1.Name = "splitContainer1";
|
||||||
|
//
|
||||||
|
// splitContainer1.Panel1
|
||||||
|
//
|
||||||
|
this.splitContainer1.Panel1.Controls.Add(this.zg1);
|
||||||
|
this.splitContainer1.Panel1Collapsed = true;
|
||||||
|
//
|
||||||
|
// splitContainer1.Panel2
|
||||||
|
//
|
||||||
|
this.splitContainer1.Panel2.Controls.Add(this.lbl_winddir);
|
||||||
|
this.splitContainer1.Panel2.Controls.Add(this.lbl_windvel);
|
||||||
|
this.splitContainer1.Panel2.Controls.Add(this.gMapControl1);
|
||||||
|
//
|
||||||
|
// zg1
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.zg1, "zg1");
|
||||||
|
this.zg1.Name = "zg1";
|
||||||
|
this.zg1.ScrollGrace = 0D;
|
||||||
|
this.zg1.ScrollMaxX = 0D;
|
||||||
|
this.zg1.ScrollMaxY = 0D;
|
||||||
|
this.zg1.ScrollMaxY2 = 0D;
|
||||||
|
this.zg1.ScrollMinX = 0D;
|
||||||
|
this.zg1.ScrollMinY = 0D;
|
||||||
|
this.zg1.ScrollMinY2 = 0D;
|
||||||
|
this.zg1.DoubleClick += new System.EventHandler(this.zg1_DoubleClick);
|
||||||
|
//
|
||||||
|
// lbl_winddir
|
||||||
|
//
|
||||||
|
this.lbl_winddir.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "wind_dir", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, null, "Dir: 0"));
|
||||||
|
resources.ApplyResources(this.lbl_winddir, "lbl_winddir");
|
||||||
|
this.lbl_winddir.Name = "lbl_winddir";
|
||||||
|
this.lbl_winddir.resize = true;
|
||||||
|
this.toolTip1.SetToolTip(this.lbl_winddir, resources.GetString("lbl_winddir.ToolTip"));
|
||||||
|
//
|
||||||
|
// lbl_windvel
|
||||||
|
//
|
||||||
|
this.lbl_windvel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "wind_vel", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, null, "Vel: 0"));
|
||||||
|
resources.ApplyResources(this.lbl_windvel, "lbl_windvel");
|
||||||
|
this.lbl_windvel.Name = "lbl_windvel";
|
||||||
|
this.lbl_windvel.resize = true;
|
||||||
|
this.toolTip1.SetToolTip(this.lbl_windvel, resources.GetString("lbl_windvel.ToolTip"));
|
||||||
|
//
|
||||||
|
// gMapControl1
|
||||||
|
//
|
||||||
|
this.gMapControl1.BackColor = System.Drawing.Color.Transparent;
|
||||||
|
this.gMapControl1.Bearing = 0F;
|
||||||
|
this.gMapControl1.CanDragMap = true;
|
||||||
|
this.gMapControl1.ContextMenuStrip = this.contextMenuStrip1;
|
||||||
|
resources.ApplyResources(this.gMapControl1, "gMapControl1");
|
||||||
|
this.gMapControl1.GrayScaleMode = false;
|
||||||
|
this.gMapControl1.LevelsKeepInMemmory = 5;
|
||||||
|
this.gMapControl1.MarkersEnabled = true;
|
||||||
|
this.gMapControl1.MaxZoom = 2;
|
||||||
|
this.gMapControl1.MinZoom = 2;
|
||||||
|
this.gMapControl1.MouseWheelZoomType = GMap.NET.MouseWheelZoomType.MousePositionAndCenter;
|
||||||
|
this.gMapControl1.Name = "gMapControl1";
|
||||||
|
this.gMapControl1.NegativeMode = false;
|
||||||
|
this.gMapControl1.PolygonsEnabled = true;
|
||||||
|
this.gMapControl1.RetryLoadTile = 0;
|
||||||
|
this.gMapControl1.RoutesEnabled = true;
|
||||||
|
this.gMapControl1.ShowTileGridLines = false;
|
||||||
|
this.gMapControl1.streamjpg = ((System.IO.MemoryStream)(resources.GetObject("gMapControl1.streamjpg")));
|
||||||
|
this.gMapControl1.Zoom = 0D;
|
||||||
|
this.gMapControl1.Click += new System.EventHandler(this.gMapControl1_Click);
|
||||||
|
this.gMapControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.gMapControl1_MouseDown);
|
||||||
|
this.gMapControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.gMapControl1_MouseMove);
|
||||||
|
//
|
||||||
// panel1
|
// panel1
|
||||||
//
|
//
|
||||||
this.panel1.Controls.Add(this.TXT_lat);
|
this.panel1.Controls.Add(this.TXT_lat);
|
||||||
@ -1130,69 +1202,6 @@
|
|||||||
this.CB_tuning.UseVisualStyleBackColor = true;
|
this.CB_tuning.UseVisualStyleBackColor = true;
|
||||||
this.CB_tuning.CheckedChanged += new System.EventHandler(this.CB_tuning_CheckedChanged);
|
this.CB_tuning.CheckedChanged += new System.EventHandler(this.CB_tuning_CheckedChanged);
|
||||||
//
|
//
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.lbl_windvel);
|
|
||||||
this.panel2.Controls.Add(this.lbl_winddir);
|
|
||||||
this.panel2.Controls.Add(this.gMapControl1);
|
|
||||||
this.panel2.Controls.Add(this.zg1);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// lbl_windvel
|
|
||||||
//
|
|
||||||
this.lbl_windvel.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "wind_vel", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, null, "Vel: 0"));
|
|
||||||
resources.ApplyResources(this.lbl_windvel, "lbl_windvel");
|
|
||||||
this.lbl_windvel.Name = "lbl_windvel";
|
|
||||||
this.lbl_windvel.resize = true;
|
|
||||||
this.toolTip1.SetToolTip(this.lbl_windvel, resources.GetString("lbl_windvel.ToolTip"));
|
|
||||||
//
|
|
||||||
// lbl_winddir
|
|
||||||
//
|
|
||||||
this.lbl_winddir.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSource1, "wind_dir", true, System.Windows.Forms.DataSourceUpdateMode.OnValidation, null, "Dir: 0"));
|
|
||||||
resources.ApplyResources(this.lbl_winddir, "lbl_winddir");
|
|
||||||
this.lbl_winddir.Name = "lbl_winddir";
|
|
||||||
this.lbl_winddir.resize = true;
|
|
||||||
this.toolTip1.SetToolTip(this.lbl_winddir, resources.GetString("lbl_winddir.ToolTip"));
|
|
||||||
//
|
|
||||||
// gMapControl1
|
|
||||||
//
|
|
||||||
this.gMapControl1.BackColor = System.Drawing.Color.Transparent;
|
|
||||||
this.gMapControl1.Bearing = 0F;
|
|
||||||
this.gMapControl1.CanDragMap = true;
|
|
||||||
this.gMapControl1.ContextMenuStrip = this.contextMenuStrip1;
|
|
||||||
resources.ApplyResources(this.gMapControl1, "gMapControl1");
|
|
||||||
this.gMapControl1.GrayScaleMode = false;
|
|
||||||
this.gMapControl1.LevelsKeepInMemmory = 5;
|
|
||||||
this.gMapControl1.MarkersEnabled = true;
|
|
||||||
this.gMapControl1.MaxZoom = 2;
|
|
||||||
this.gMapControl1.MinZoom = 2;
|
|
||||||
this.gMapControl1.MouseWheelZoomType = GMap.NET.MouseWheelZoomType.MousePositionAndCenter;
|
|
||||||
this.gMapControl1.Name = "gMapControl1";
|
|
||||||
this.gMapControl1.NegativeMode = false;
|
|
||||||
this.gMapControl1.PolygonsEnabled = true;
|
|
||||||
this.gMapControl1.RetryLoadTile = 0;
|
|
||||||
this.gMapControl1.RoutesEnabled = true;
|
|
||||||
this.gMapControl1.ShowTileGridLines = false;
|
|
||||||
this.gMapControl1.streamjpg = ((System.IO.MemoryStream)(resources.GetObject("gMapControl1.streamjpg")));
|
|
||||||
this.gMapControl1.Zoom = 0D;
|
|
||||||
this.gMapControl1.Click += new System.EventHandler(this.gMapControl1_Click);
|
|
||||||
this.gMapControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.gMapControl1_MouseDown);
|
|
||||||
this.gMapControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.gMapControl1_MouseMove);
|
|
||||||
//
|
|
||||||
// zg1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.zg1, "zg1");
|
|
||||||
this.zg1.Name = "zg1";
|
|
||||||
this.zg1.ScrollGrace = 0D;
|
|
||||||
this.zg1.ScrollMaxX = 0D;
|
|
||||||
this.zg1.ScrollMaxY = 0D;
|
|
||||||
this.zg1.ScrollMaxY2 = 0D;
|
|
||||||
this.zg1.ScrollMinX = 0D;
|
|
||||||
this.zg1.ScrollMinY = 0D;
|
|
||||||
this.zg1.ScrollMinY2 = 0D;
|
|
||||||
this.zg1.DoubleClick += new System.EventHandler(this.zg1_DoubleClick);
|
|
||||||
//
|
|
||||||
// dataGridViewImageColumn1
|
// dataGridViewImageColumn1
|
||||||
//
|
//
|
||||||
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
|
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
|
||||||
@ -1254,10 +1263,12 @@
|
|||||||
((System.ComponentModel.ISupportInitialize)(this.NUM_playbackspeed)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.NUM_playbackspeed)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.tracklog)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.tracklog)).EndInit();
|
||||||
this.tableMap.ResumeLayout(false);
|
this.tableMap.ResumeLayout(false);
|
||||||
|
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||||
|
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||||
|
this.splitContainer1.ResumeLayout(false);
|
||||||
this.panel1.ResumeLayout(false);
|
this.panel1.ResumeLayout(false);
|
||||||
this.panel1.PerformLayout();
|
this.panel1.PerformLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.Zoomlevel)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.Zoomlevel)).EndInit();
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.ResumeLayout(false);
|
this.ResumeLayout(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1294,7 +1305,6 @@
|
|||||||
private ArdupilotMega.MyLabel TXT_long;
|
private ArdupilotMega.MyLabel TXT_long;
|
||||||
private ArdupilotMega.MyLabel TXT_alt;
|
private ArdupilotMega.MyLabel TXT_alt;
|
||||||
private System.Windows.Forms.CheckBox CHK_autopan;
|
private System.Windows.Forms.CheckBox CHK_autopan;
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private GMap.NET.WindowsForms.GMapControl gMapControl1;
|
private GMap.NET.WindowsForms.GMapControl gMapControl1;
|
||||||
private ZedGraph.ZedGraphControl zg1;
|
private ZedGraph.ZedGraphControl zg1;
|
||||||
private System.Windows.Forms.TabControl tabControl1;
|
private System.Windows.Forms.TabControl tabControl1;
|
||||||
@ -1320,5 +1330,6 @@
|
|||||||
private System.Windows.Forms.ToolStripMenuItem stopRecordToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem stopRecordToolStripMenuItem;
|
||||||
private MyLabel lbl_logpercent;
|
private MyLabel lbl_logpercent;
|
||||||
private System.Windows.Forms.ToolStripMenuItem pointCameraHereToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem pointCameraHereToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.SplitContainer splitContainer1;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -31,18 +31,33 @@ namespace ArdupilotMega.GCSViews
|
|||||||
RollingPointPairList list3 = new RollingPointPairList(1200);
|
RollingPointPairList list3 = new RollingPointPairList(1200);
|
||||||
RollingPointPairList list4 = new RollingPointPairList(1200);
|
RollingPointPairList list4 = new RollingPointPairList(1200);
|
||||||
RollingPointPairList list5 = new RollingPointPairList(1200);
|
RollingPointPairList list5 = new RollingPointPairList(1200);
|
||||||
|
RollingPointPairList list6 = new RollingPointPairList(1200);
|
||||||
|
RollingPointPairList list7 = new RollingPointPairList(1200);
|
||||||
|
RollingPointPairList list8 = new RollingPointPairList(1200);
|
||||||
|
RollingPointPairList list9 = new RollingPointPairList(1200);
|
||||||
|
RollingPointPairList list10 = new RollingPointPairList(1200);
|
||||||
|
|
||||||
System.Reflection.PropertyInfo list1item = null;
|
System.Reflection.PropertyInfo list1item = null;
|
||||||
System.Reflection.PropertyInfo list2item = null;
|
System.Reflection.PropertyInfo list2item = null;
|
||||||
System.Reflection.PropertyInfo list3item = null;
|
System.Reflection.PropertyInfo list3item = null;
|
||||||
System.Reflection.PropertyInfo list4item = null;
|
System.Reflection.PropertyInfo list4item = null;
|
||||||
System.Reflection.PropertyInfo list5item = null;
|
System.Reflection.PropertyInfo list5item = null;
|
||||||
|
System.Reflection.PropertyInfo list6item = null;
|
||||||
|
System.Reflection.PropertyInfo list7item = null;
|
||||||
|
System.Reflection.PropertyInfo list8item = null;
|
||||||
|
System.Reflection.PropertyInfo list9item = null;
|
||||||
|
System.Reflection.PropertyInfo list10item = null;
|
||||||
|
|
||||||
CurveItem list1curve;
|
CurveItem list1curve;
|
||||||
CurveItem list2curve;
|
CurveItem list2curve;
|
||||||
CurveItem list3curve;
|
CurveItem list3curve;
|
||||||
CurveItem list4curve;
|
CurveItem list4curve;
|
||||||
CurveItem list5curve;
|
CurveItem list5curve;
|
||||||
|
CurveItem list6curve;
|
||||||
|
CurveItem list7curve;
|
||||||
|
CurveItem list8curve;
|
||||||
|
CurveItem list9curve;
|
||||||
|
CurveItem list10curve;
|
||||||
|
|
||||||
bool huddropout = false;
|
bool huddropout = false;
|
||||||
bool huddropoutresize = false;
|
bool huddropoutresize = false;
|
||||||
@ -77,10 +92,22 @@ namespace ArdupilotMega.GCSViews
|
|||||||
Control.CheckForIllegalCrossThreadCalls = false; // so can update display from another thread
|
Control.CheckForIllegalCrossThreadCalls = false; // so can update display from another thread
|
||||||
|
|
||||||
// setup default tuning graph
|
// setup default tuning graph
|
||||||
chk_box_CheckedChanged((object)(new CheckBox() { Name = "roll", Checked = true }), new EventArgs());
|
if (MainV2.config["Tuning_Graph_Selected"] != null)
|
||||||
chk_box_CheckedChanged((object)(new CheckBox() { Name = "pitch", Checked = true }), new EventArgs());
|
{
|
||||||
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_roll", Checked = true }), new EventArgs());
|
string line = MainV2.config["Tuning_Graph_Selected"].ToString();
|
||||||
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_pitch", Checked = true }), new EventArgs());
|
string[] lines = line.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
foreach (string option in lines)
|
||||||
|
{
|
||||||
|
chk_box_CheckedChanged((object)(new CheckBox() { Name = option, Checked = true }), new EventArgs());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
chk_box_CheckedChanged((object)(new CheckBox() { Name = "roll", Checked = true }), new EventArgs());
|
||||||
|
chk_box_CheckedChanged((object)(new CheckBox() { Name = "pitch", Checked = true }), new EventArgs());
|
||||||
|
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_roll", Checked = true }), new EventArgs());
|
||||||
|
chk_box_CheckedChanged((object)(new CheckBox() { Name = "nav_pitch", Checked = true }), new EventArgs());
|
||||||
|
}
|
||||||
|
|
||||||
List<string> list = new List<string>();
|
List<string> list = new List<string>();
|
||||||
|
|
||||||
@ -314,6 +341,16 @@ namespace ArdupilotMega.GCSViews
|
|||||||
list4.Add(time, (float)list4item.GetValue((object)MainV2.cs, null));
|
list4.Add(time, (float)list4item.GetValue((object)MainV2.cs, null));
|
||||||
if (list5item != null)
|
if (list5item != null)
|
||||||
list5.Add(time, (float)list5item.GetValue((object)MainV2.cs, null));
|
list5.Add(time, (float)list5item.GetValue((object)MainV2.cs, null));
|
||||||
|
if (list6item != null)
|
||||||
|
list6.Add(time, (float)list6item.GetValue((object)MainV2.cs, null));
|
||||||
|
if (list7item != null)
|
||||||
|
list7.Add(time, (float)list7item.GetValue((object)MainV2.cs, null));
|
||||||
|
if (list8item != null)
|
||||||
|
list8.Add(time, (float)list8item.GetValue((object)MainV2.cs, null));
|
||||||
|
if (list9item != null)
|
||||||
|
list9.Add(time, (float)list9item.GetValue((object)MainV2.cs, null));
|
||||||
|
if (list10item != null)
|
||||||
|
list10.Add(time, (float)list10item.GetValue((object)MainV2.cs, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tracklast.AddSeconds(1) < DateTime.Now)
|
if (tracklast.AddSeconds(1) < DateTime.Now)
|
||||||
@ -681,14 +718,14 @@ namespace ArdupilotMega.GCSViews
|
|||||||
{
|
{
|
||||||
if (CB_tuning.Checked)
|
if (CB_tuning.Checked)
|
||||||
{
|
{
|
||||||
gMapControl1.Visible = false;
|
splitContainer1.Panel1Collapsed = false;
|
||||||
ZedGraphTimer.Enabled = true;
|
ZedGraphTimer.Enabled = true;
|
||||||
ZedGraphTimer.Start();
|
ZedGraphTimer.Start();
|
||||||
zg1.Visible = true;
|
zg1.Visible = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gMapControl1.Visible = true;
|
splitContainer1.Panel1Collapsed = true;
|
||||||
ZedGraphTimer.Enabled = false;
|
ZedGraphTimer.Enabled = false;
|
||||||
ZedGraphTimer.Stop();
|
ZedGraphTimer.Stop();
|
||||||
zg1.Visible = false;
|
zg1.Visible = false;
|
||||||
@ -1203,6 +1240,8 @@ namespace ArdupilotMega.GCSViews
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void zg1_DoubleClick(object sender, EventArgs e)
|
private void zg1_DoubleClick(object sender, EventArgs e)
|
||||||
@ -1210,7 +1249,7 @@ namespace ArdupilotMega.GCSViews
|
|||||||
Form selectform = new Form()
|
Form selectform = new Form()
|
||||||
{
|
{
|
||||||
Name = "select",
|
Name = "select",
|
||||||
Width = 650,
|
Width = 750,
|
||||||
Height = 250,
|
Height = 250,
|
||||||
Text = "Graph This"
|
Text = "Graph This"
|
||||||
};
|
};
|
||||||
@ -1218,6 +1257,19 @@ namespace ArdupilotMega.GCSViews
|
|||||||
int x = 10;
|
int x = 10;
|
||||||
int y = 10;
|
int y = 10;
|
||||||
|
|
||||||
|
{
|
||||||
|
CheckBox chk_box = new CheckBox();
|
||||||
|
chk_box.Text = "Logarithmic";
|
||||||
|
chk_box.Name = "Logarithmic";
|
||||||
|
chk_box.Location = new Point(x, y);
|
||||||
|
chk_box.Size = new System.Drawing.Size(100, 20);
|
||||||
|
chk_box.CheckedChanged += new EventHandler(chk_log_CheckedChanged);
|
||||||
|
|
||||||
|
selectform.Controls.Add(chk_box);
|
||||||
|
}
|
||||||
|
|
||||||
|
y += 20;
|
||||||
|
|
||||||
object thisBoxed = MainV2.cs;
|
object thisBoxed = MainV2.cs;
|
||||||
Type test = thisBoxed.GetType();
|
Type test = thisBoxed.GetType();
|
||||||
|
|
||||||
@ -1249,6 +1301,16 @@ namespace ArdupilotMega.GCSViews
|
|||||||
chk_box.Checked = true;
|
chk_box.Checked = true;
|
||||||
if (list5item != null && list5item.Name == field.Name)
|
if (list5item != null && list5item.Name == field.Name)
|
||||||
chk_box.Checked = true;
|
chk_box.Checked = true;
|
||||||
|
if (list6item != null && list6item.Name == field.Name)
|
||||||
|
chk_box.Checked = true;
|
||||||
|
if (list7item != null && list7item.Name == field.Name)
|
||||||
|
chk_box.Checked = true;
|
||||||
|
if (list8item != null && list8item.Name == field.Name)
|
||||||
|
chk_box.Checked = true;
|
||||||
|
if (list9item != null && list9item.Name == field.Name)
|
||||||
|
chk_box.Checked = true;
|
||||||
|
if (list10item != null && list10item.Name == field.Name)
|
||||||
|
chk_box.Checked = true;
|
||||||
|
|
||||||
chk_box.Text = field.Name;
|
chk_box.Text = field.Name;
|
||||||
chk_box.Name = field.Name;
|
chk_box.Name = field.Name;
|
||||||
@ -1273,6 +1335,18 @@ namespace ArdupilotMega.GCSViews
|
|||||||
selectform.Show();
|
selectform.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void chk_log_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (((CheckBox)sender).Checked)
|
||||||
|
{
|
||||||
|
zg1.GraphPane.YAxis.Type = AxisType.Log;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
zg1.GraphPane.YAxis.Type = AxisType.Linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void chk_box_CheckedChanged(object sender, EventArgs e)
|
void chk_box_CheckedChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (((CheckBox)sender).Checked)
|
if (((CheckBox)sender).Checked)
|
||||||
@ -1302,12 +1376,55 @@ namespace ArdupilotMega.GCSViews
|
|||||||
setupPropertyInfo(ref list5item, ((CheckBox)sender).Name, MainV2.cs);
|
setupPropertyInfo(ref list5item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
list5curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list5, Color.Yellow, SymbolType.None);
|
list5curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list5, Color.Yellow, SymbolType.None);
|
||||||
}
|
}
|
||||||
|
else if (list6item == null)
|
||||||
|
{
|
||||||
|
setupPropertyInfo(ref list6item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
|
list6curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list6, Color.Magenta, SymbolType.None);
|
||||||
|
}
|
||||||
|
else if (list7item == null)
|
||||||
|
{
|
||||||
|
setupPropertyInfo(ref list7item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
|
list7curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list7, Color.Purple, SymbolType.None);
|
||||||
|
}
|
||||||
|
else if (list8item == null)
|
||||||
|
{
|
||||||
|
setupPropertyInfo(ref list8item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
|
list8curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list8, Color.LimeGreen, SymbolType.None);
|
||||||
|
}
|
||||||
|
else if (list9item == null)
|
||||||
|
{
|
||||||
|
setupPropertyInfo(ref list9item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
|
list9curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list9, Color.Cyan, SymbolType.None);
|
||||||
|
}
|
||||||
|
else if (list10item == null)
|
||||||
|
{
|
||||||
|
setupPropertyInfo(ref list10item, ((CheckBox)sender).Name, MainV2.cs);
|
||||||
|
list10curve = zg1.GraphPane.AddCurve(((CheckBox)sender).Name, list10, Color.Violet, SymbolType.None);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MessageBox.Show("Max 5 at a time.");
|
MessageBox.Show("Max 10 at a time.");
|
||||||
((CheckBox)sender).Checked = false;
|
((CheckBox)sender).Checked = false;
|
||||||
}
|
}
|
||||||
MainV2.fixtheme(this);
|
MainV2.fixtheme(this);
|
||||||
|
|
||||||
|
string selected = "";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[0].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[1].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[2].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[3].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[4].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[5].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[6].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[7].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[8].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[9].Label.Text + "|";
|
||||||
|
selected = selected + zg1.GraphPane.CurveList[10].Label.Text + "|";
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
MainV2.config["Tuning_Graph_Selected"] = selected;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1337,6 +1454,31 @@ namespace ArdupilotMega.GCSViews
|
|||||||
list5item = null;
|
list5item = null;
|
||||||
zg1.GraphPane.CurveList.Remove(list5curve);
|
zg1.GraphPane.CurveList.Remove(list5curve);
|
||||||
}
|
}
|
||||||
|
if (list6item != null && list6item.Name == ((CheckBox)sender).Name)
|
||||||
|
{
|
||||||
|
list6item = null;
|
||||||
|
zg1.GraphPane.CurveList.Remove(list6curve);
|
||||||
|
}
|
||||||
|
if (list7item != null && list7item.Name == ((CheckBox)sender).Name)
|
||||||
|
{
|
||||||
|
list7item = null;
|
||||||
|
zg1.GraphPane.CurveList.Remove(list7curve);
|
||||||
|
}
|
||||||
|
if (list8item != null && list8item.Name == ((CheckBox)sender).Name)
|
||||||
|
{
|
||||||
|
list8item = null;
|
||||||
|
zg1.GraphPane.CurveList.Remove(list8curve);
|
||||||
|
}
|
||||||
|
if (list9item != null && list9item.Name == ((CheckBox)sender).Name)
|
||||||
|
{
|
||||||
|
list9item = null;
|
||||||
|
zg1.GraphPane.CurveList.Remove(list9curve);
|
||||||
|
}
|
||||||
|
if (list10item != null && list10item.Name == ((CheckBox)sender).Name)
|
||||||
|
{
|
||||||
|
list10item = null;
|
||||||
|
zg1.GraphPane.CurveList.Remove(list10curve);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@
|
|||||||
<value>Point Camera Here</value>
|
<value>Point Camera Here</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>175, 70</value>
|
<value>175, 48</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>contextMenuStrip1.Name" xml:space="preserve">
|
<data name=">>contextMenuStrip1.Name" xml:space="preserve">
|
||||||
<value>contextMenuStrip1</value>
|
<value>contextMenuStrip1</value>
|
||||||
@ -1083,290 +1083,68 @@
|
|||||||
<data name="MainH.Panel1MinSize" type="System.Int32, mscorlib">
|
<data name="MainH.Panel1MinSize" type="System.Int32, mscorlib">
|
||||||
<value>360</value>
|
<value>360</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="tableMap.CellBorderStyle" type="System.Windows.Forms.TableLayoutPanelCellBorderStyle, System.Windows.Forms">
|
||||||
|
<value>Single</value>
|
||||||
|
</data>
|
||||||
<data name="tableMap.ColumnCount" type="System.Int32, mscorlib">
|
<data name="tableMap.ColumnCount" type="System.Int32, mscorlib">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TXT_lat.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
<data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>10, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>84, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Name" xml:space="preserve">
|
|
||||||
<value>TXT_lat</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.ZOrder" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>438, 7</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>76, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>69</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.ToolTip" xml:space="preserve">
|
|
||||||
<value>Change Zoom Level</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Name" xml:space="preserve">
|
|
||||||
<value>Zoomlevel</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.ZOrder" xml:space="preserve">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>401, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>34, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>70</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Zoom</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Name" xml:space="preserve">
|
|
||||||
<value>label1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.ZOrder" xml:space="preserve">
|
|
||||||
<value>2</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>100, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>84, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>14</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Name" xml:space="preserve">
|
|
||||||
<value>TXT_long</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.ZOrder" xml:space="preserve">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>190, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>64, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>15</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Name" xml:space="preserve">
|
|
||||||
<value>TXT_alt</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.ZOrder" xml:space="preserve">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>325, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>70, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>68</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Text" xml:space="preserve">
|
|
||||||
<value>Auto Pan</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.ToolTip" xml:space="preserve">
|
|
||||||
<value>Makes the map autopan based on current location</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Name" xml:space="preserve">
|
|
||||||
<value>CHK_autopan</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.ZOrder" xml:space="preserve">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>260, 9</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>59, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>62</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Text" xml:space="preserve">
|
|
||||||
<value>Tuning</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.ToolTip" xml:space="preserve">
|
|
||||||
<value>Show the tunning graph, chowing target attitudes vs actual</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Name" xml:space="preserve">
|
|
||||||
<value>CB_tuning</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.ZOrder" xml:space="preserve">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>0, 429</value>
|
<value>4, 4</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
<data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
|
||||||
<value>0, 0, 0, 0</value>
|
<value>Horizontal</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="zg1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>585, 30</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
<data name="zg1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>0, 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||||
|
<value>4, 4, 4, 4</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>577, 210</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>67</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Visible" type="System.Boolean, mscorlib">
|
||||||
|
<value>False</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Name" xml:space="preserve">
|
||||||
|
<value>zg1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Type" xml:space="preserve">
|
||||||
|
<value>ZedGraph.ZedGraphControl, ZedGraph, Version=5.1.2.878, Culture=neutral, PublicKeyToken=02a83cbd123fcd60</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Parent" xml:space="preserve">
|
||||||
|
<value>splitContainer1.Panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Name" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Name" xml:space="preserve">
|
||||||
<value>panel1</value>
|
<value>splitContainer1.Panel1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Type" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Parent" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Parent" xml:space="preserve">
|
||||||
<value>tableMap</value>
|
<value>splitContainer1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.ZOrder" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>7, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>34, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>69</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Text" xml:space="preserve">
|
|
||||||
<value>Vel: 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.ToolTip" xml:space="preserve">
|
|
||||||
<value>Estimated Wind Velocity</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Name" xml:space="preserve">
|
|
||||||
<value>lbl_windvel</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Parent" xml:space="preserve">
|
|
||||||
<value>panel2</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.ZOrder" xml:space="preserve">
|
|
||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="lbl_winddir.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="lbl_winddir.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>7, 8</value>
|
<value>4, 7</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="lbl_winddir.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>32, 13</value>
|
<value>32, 13</value>
|
||||||
@ -1387,9 +1165,39 @@
|
|||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>lbl_winddir.Parent" xml:space="preserve">
|
<data name=">>lbl_winddir.Parent" xml:space="preserve">
|
||||||
<value>panel2</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>lbl_winddir.ZOrder" xml:space="preserve">
|
<data name=">>lbl_winddir.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>4, 20</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>34, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>69</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Text" xml:space="preserve">
|
||||||
|
<value>Vel: 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.ToolTip" xml:space="preserve">
|
||||||
|
<value>Estimated Wind Velocity</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Name" xml:space="preserve">
|
||||||
|
<value>lbl_windvel</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Parent" xml:space="preserve">
|
||||||
|
<value>splitContainer1.Panel2</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="gMapControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
@ -1402,7 +1210,7 @@
|
|||||||
<value>0, 0, 0, 0</value>
|
<value>0, 0, 0, 0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="gMapControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>585, 429</value>
|
<value>577, 420</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.streamjpg" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="gMapControl1.streamjpg" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>
|
<value>
|
||||||
@ -1559,66 +1367,288 @@
|
|||||||
<value>GMap.NET.WindowsForms.GMapControl, GMap.NET.WindowsForms, Version=1.5.5.5, Culture=neutral, PublicKeyToken=b85b9027b614afef</value>
|
<value>GMap.NET.WindowsForms.GMapControl, GMap.NET.WindowsForms, Version=1.5.5.5, Culture=neutral, PublicKeyToken=b85b9027b614afef</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>gMapControl1.Parent" xml:space="preserve">
|
<data name=">>gMapControl1.Parent" xml:space="preserve">
|
||||||
<value>panel2</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>gMapControl1.ZOrder" xml:space="preserve">
|
<data name=">>gMapControl1.ZOrder" xml:space="preserve">
|
||||||
<value>2</value>
|
<value>2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name=">>splitContainer1.Panel2.Name" xml:space="preserve">
|
||||||
<value>Fill</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name=">>splitContainer1.Panel2.Type" xml:space="preserve">
|
||||||
<value>0, 0</value>
|
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
<data name=">>splitContainer1.Panel2.Parent" xml:space="preserve">
|
||||||
<value>4, 4, 4, 4</value>
|
<value>splitContainer1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name=">>splitContainer1.Panel2.ZOrder" xml:space="preserve">
|
||||||
<value>585, 429</value>
|
|
||||||
</data>
|
|
||||||
<data name="zg1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>67</value>
|
|
||||||
</data>
|
|
||||||
<data name="zg1.Visible" type="System.Boolean, mscorlib">
|
|
||||||
<value>False</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Name" xml:space="preserve">
|
|
||||||
<value>zg1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Type" xml:space="preserve">
|
|
||||||
<value>ZedGraph.ZedGraphControl, ZedGraph, Version=5.1.2.878, Culture=neutral, PublicKeyToken=02a83cbd123fcd60</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Parent" xml:space="preserve">
|
|
||||||
<value>panel2</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.ZOrder" xml:space="preserve">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
|
||||||
<value>0, 0, 0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>585, 429</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Name" xml:space="preserve">
|
<data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>panel2</value>
|
<value>577, 420</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Type" xml:space="preserve">
|
<data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">
|
||||||
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>210</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Parent" xml:space="preserve">
|
<data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>76</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Name" xml:space="preserve">
|
||||||
|
<value>splitContainer1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Parent" xml:space="preserve">
|
||||||
<value>tableMap</value>
|
<value>tableMap</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.ZOrder" xml:space="preserve">
|
<data name=">>splitContainer1.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>10, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>84, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Name" xml:space="preserve">
|
||||||
|
<value>TXT_lat</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>438, 8</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>76, 20</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>69</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.ToolTip" xml:space="preserve">
|
||||||
|
<value>Change Zoom Level</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Name" xml:space="preserve">
|
||||||
|
<value>Zoomlevel</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.ZOrder" xml:space="preserve">
|
||||||
|
<value>1</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>401, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>34, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>70</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Text" xml:space="preserve">
|
||||||
|
<value>Zoom</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Name" xml:space="preserve">
|
||||||
|
<value>label1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.ZOrder" xml:space="preserve">
|
||||||
|
<value>2</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>100, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>84, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>14</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Name" xml:space="preserve">
|
||||||
|
<value>TXT_long</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.ZOrder" xml:space="preserve">
|
||||||
|
<value>3</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>190, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>64, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>15</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Name" xml:space="preserve">
|
||||||
|
<value>TXT_alt</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.ZOrder" xml:space="preserve">
|
||||||
|
<value>4</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>325, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>68</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Text" xml:space="preserve">
|
||||||
|
<value>Auto Pan</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.ToolTip" xml:space="preserve">
|
||||||
|
<value>Makes the map autopan based on current location</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Name" xml:space="preserve">
|
||||||
|
<value>CHK_autopan</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.ZOrder" xml:space="preserve">
|
||||||
|
<value>5</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>260, 10</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>59, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>62</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Text" xml:space="preserve">
|
||||||
|
<value>Tuning</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.ToolTip" xml:space="preserve">
|
||||||
|
<value>Show the tunning graph, chowing target attitudes vs actual</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Name" xml:space="preserve">
|
||||||
|
<value>CB_tuning</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.ZOrder" xml:space="preserve">
|
||||||
|
<value>6</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
|
<value>Fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>1, 428</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||||
|
<value>0, 0, 0, 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>583, 30</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Name" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Parent" xml:space="preserve">
|
||||||
|
<value>tableMap</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="tableMap.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="tableMap.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
@ -1649,7 +1679,7 @@
|
|||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="tableMap.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
<data name="tableMap.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="panel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="panel2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,30" /></TableLayoutSettings></value>
|
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="splitContainer1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="panel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,30,Absolute,20" /></TableLayoutSettings></value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>MainH.Panel2.Name" xml:space="preserve">
|
<data name=">>MainH.Panel2.Name" xml:space="preserve">
|
||||||
<value>MainH.Panel2</value>
|
<value>MainH.Panel2</value>
|
||||||
|
@ -277,7 +277,7 @@ namespace ArdupilotMega.GCSViews
|
|||||||
cell = Commands.Rows[selectedrow].Cells[1] as DataGridViewTextBoxCell;
|
cell = Commands.Rows[selectedrow].Cells[1] as DataGridViewTextBoxCell;
|
||||||
cell.Value = 0;
|
cell.Value = 0;
|
||||||
}
|
}
|
||||||
if (Commands.Columns[Param2.Index].HeaderText.Equals(cmdParamNames[MAVLink.MAV_CMD.WAYPOINT][1]/*"Alt"*/))
|
if (alt != -1 && Commands.Columns[Param2.Index].HeaderText.Equals(cmdParamNames[MAVLink.MAV_CMD.WAYPOINT][1]/*"Alt"*/))
|
||||||
{
|
{
|
||||||
cell = Commands.Rows[selectedrow].Cells[2] as DataGridViewTextBoxCell;
|
cell = Commands.Rows[selectedrow].Cells[2] as DataGridViewTextBoxCell;
|
||||||
|
|
||||||
@ -1719,7 +1719,7 @@ namespace ArdupilotMega.GCSViews
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
callMeDrag(CurentRectMarker.InnerMarker.Tag.ToString(), currentMarker.Position.Lat, currentMarker.Position.Lng, 0);
|
callMeDrag(CurentRectMarker.InnerMarker.Tag.ToString(), currentMarker.Position.Lat, currentMarker.Position.Lng, -1);
|
||||||
}
|
}
|
||||||
CurentRectMarker = null;
|
CurentRectMarker = null;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ namespace ArdupilotMega
|
|||||||
self = this;
|
self = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
JoyChannel[] JoyChannels = new JoyChannel[5]; // we are base 1
|
JoyChannel[] JoyChannels = new JoyChannel[9]; // we are base 1
|
||||||
JoyButton[] JoyButtons = new JoyButton[128]; // base 0
|
JoyButton[] JoyButtons = new JoyButton[128]; // base 0
|
||||||
|
|
||||||
public static DeviceList getDevices()
|
public static DeviceList getDevices()
|
||||||
@ -301,16 +301,22 @@ namespace ArdupilotMega
|
|||||||
ushort roll = pickchannel(1, JoyChannels[1].axis, false, JoyChannels[1].expo);
|
ushort roll = pickchannel(1, JoyChannels[1].axis, false, JoyChannels[1].expo);
|
||||||
ushort pitch = pickchannel(2, JoyChannels[2].axis, false, JoyChannels[2].expo);
|
ushort pitch = pickchannel(2, JoyChannels[2].axis, false, JoyChannels[2].expo);
|
||||||
|
|
||||||
MainV2.cs.rcoverridech1 = (ushort)(BOOL_TO_SIGN(JoyChannels[1].reverse) * ((int)(pitch - 1500) - (int)(roll - 1500)) / 2 + 1500);
|
if (getJoystickAxis(1) != Joystick.joystickaxis.None)
|
||||||
MainV2.cs.rcoverridech2 = (ushort)(BOOL_TO_SIGN(JoyChannels[2].reverse) * ((int)(pitch - 1500) + (int)(roll - 1500)) / 2 + 1500);
|
MainV2.cs.rcoverridech1 = (ushort)(BOOL_TO_SIGN(JoyChannels[1].reverse) * ((int)(pitch - 1500) - (int)(roll - 1500)) / 2 + 1500);
|
||||||
|
if (getJoystickAxis(2) != Joystick.joystickaxis.None)
|
||||||
|
MainV2.cs.rcoverridech2 = (ushort)(BOOL_TO_SIGN(JoyChannels[2].reverse) * ((int)(pitch - 1500) + (int)(roll - 1500)) / 2 + 1500);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MainV2.cs.rcoverridech1 = pickchannel(1, JoyChannels[1].axis, JoyChannels[1].reverse, JoyChannels[1].expo);//(ushort)(((int)state.Rz / 65.535) + 1000);
|
if (getJoystickAxis(1) != Joystick.joystickaxis.None)
|
||||||
MainV2.cs.rcoverridech2 = pickchannel(2, JoyChannels[2].axis, JoyChannels[2].reverse, JoyChannels[2].expo);//(ushort)(((int)state.Y / 65.535) + 1000);
|
MainV2.cs.rcoverridech1 = pickchannel(1, JoyChannels[1].axis, JoyChannels[1].reverse, JoyChannels[1].expo);//(ushort)(((int)state.Rz / 65.535) + 1000);
|
||||||
|
if (getJoystickAxis(2) != Joystick.joystickaxis.None)
|
||||||
|
MainV2.cs.rcoverridech2 = pickchannel(2, JoyChannels[2].axis, JoyChannels[2].reverse, JoyChannels[2].expo);//(ushort)(((int)state.Y / 65.535) + 1000);
|
||||||
}
|
}
|
||||||
MainV2.cs.rcoverridech3 = pickchannel(3, JoyChannels[3].axis, JoyChannels[3].reverse, JoyChannels[3].expo);//(ushort)(1000 - ((int)slider[0] / 65.535) + 1000);
|
if (getJoystickAxis(3) != Joystick.joystickaxis.None)
|
||||||
MainV2.cs.rcoverridech4 = pickchannel(4, JoyChannels[4].axis, JoyChannels[4].reverse, JoyChannels[4].expo);//(ushort)(((int)state.X / 65.535) + 1000);
|
MainV2.cs.rcoverridech3 = pickchannel(3, JoyChannels[3].axis, JoyChannels[3].reverse, JoyChannels[3].expo);//(ushort)(1000 - ((int)slider[0] / 65.535) + 1000);
|
||||||
|
if (getJoystickAxis(4) != Joystick.joystickaxis.None)
|
||||||
|
MainV2.cs.rcoverridech4 = pickchannel(4, JoyChannels[4].axis, JoyChannels[4].reverse, JoyChannels[4].expo);//(ushort)(((int)state.X / 65.535) + 1000);
|
||||||
|
|
||||||
foreach (JoyButton but in JoyButtons)
|
foreach (JoyButton but in JoyButtons)
|
||||||
{
|
{
|
||||||
@ -349,6 +355,7 @@ namespace ArdupilotMega
|
|||||||
public enum joystickaxis
|
public enum joystickaxis
|
||||||
{
|
{
|
||||||
None,
|
None,
|
||||||
|
Pass,
|
||||||
ARx,
|
ARx,
|
||||||
ARy,
|
ARy,
|
||||||
ARz,
|
ARz,
|
||||||
@ -462,6 +469,15 @@ namespace ArdupilotMega
|
|||||||
return joystick.Caps.NumberButtons;
|
return joystick.Caps.NumberButtons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public joystickaxis getJoystickAxis(int channel)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return JoyChannels[channel].axis;
|
||||||
|
}
|
||||||
|
catch { return joystickaxis.None; }
|
||||||
|
}
|
||||||
|
|
||||||
public bool isButtonPressed(int buttonno)
|
public bool isButtonPressed(int buttonno)
|
||||||
{
|
{
|
||||||
byte[] buts = state.GetButtons();
|
byte[] buts = state.GetButtons();
|
||||||
@ -510,6 +526,12 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
switch (axis)
|
switch (axis)
|
||||||
{
|
{
|
||||||
|
case joystickaxis.None:
|
||||||
|
working = ushort.MaxValue / 2;
|
||||||
|
break;
|
||||||
|
case joystickaxis.Pass:
|
||||||
|
working = (int)(((float)(trim - min) / range) * ushort.MaxValue);
|
||||||
|
break;
|
||||||
case joystickaxis.ARx:
|
case joystickaxis.ARx:
|
||||||
working = state.ARx;
|
working = state.ARx;
|
||||||
break;
|
break;
|
||||||
|
276
Tools/ArdupilotMegaPlanner/JoystickSetup.Designer.cs
generated
276
Tools/ArdupilotMegaPlanner/JoystickSetup.Designer.cs
generated
@ -53,6 +53,25 @@
|
|||||||
this.label8 = new System.Windows.Forms.Label();
|
this.label8 = new System.Windows.Forms.Label();
|
||||||
this.label9 = new System.Windows.Forms.Label();
|
this.label9 = new System.Windows.Forms.Label();
|
||||||
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
this.timer1 = new System.Windows.Forms.Timer(this.components);
|
||||||
|
this.CHK_elevons = new System.Windows.Forms.CheckBox();
|
||||||
|
this.revCH5 = new System.Windows.Forms.CheckBox();
|
||||||
|
this.label10 = new System.Windows.Forms.Label();
|
||||||
|
this.expo_ch5 = new System.Windows.Forms.TextBox();
|
||||||
|
this.CMB_CH5 = new System.Windows.Forms.ComboBox();
|
||||||
|
this.revCH6 = new System.Windows.Forms.CheckBox();
|
||||||
|
this.label11 = new System.Windows.Forms.Label();
|
||||||
|
this.expo_ch6 = new System.Windows.Forms.TextBox();
|
||||||
|
this.CMB_CH6 = new System.Windows.Forms.ComboBox();
|
||||||
|
this.revCH7 = new System.Windows.Forms.CheckBox();
|
||||||
|
this.label12 = new System.Windows.Forms.Label();
|
||||||
|
this.expo_ch7 = new System.Windows.Forms.TextBox();
|
||||||
|
this.CMB_CH7 = new System.Windows.Forms.ComboBox();
|
||||||
|
this.revCH8 = new System.Windows.Forms.CheckBox();
|
||||||
|
this.label13 = new System.Windows.Forms.Label();
|
||||||
|
this.expo_ch8 = new System.Windows.Forms.TextBox();
|
||||||
|
this.CMB_CH8 = new System.Windows.Forms.ComboBox();
|
||||||
|
this.BUT_detch8 = new ArdupilotMega.MyButton();
|
||||||
|
this.horizontalProgressBar4 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
this.BUT_detch4 = new ArdupilotMega.MyButton();
|
this.BUT_detch4 = new ArdupilotMega.MyButton();
|
||||||
this.BUT_detch3 = new ArdupilotMega.MyButton();
|
this.BUT_detch3 = new ArdupilotMega.MyButton();
|
||||||
this.BUT_detch2 = new ArdupilotMega.MyButton();
|
this.BUT_detch2 = new ArdupilotMega.MyButton();
|
||||||
@ -63,7 +82,12 @@
|
|||||||
this.progressBar3 = new ArdupilotMega.HorizontalProgressBar();
|
this.progressBar3 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
this.progressBar2 = new ArdupilotMega.HorizontalProgressBar();
|
this.progressBar2 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
this.progressBar1 = new ArdupilotMega.HorizontalProgressBar();
|
this.progressBar1 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
this.CHK_elevons = new System.Windows.Forms.CheckBox();
|
this.BUT_detch5 = new ArdupilotMega.MyButton();
|
||||||
|
this.horizontalProgressBar1 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
|
this.BUT_detch6 = new ArdupilotMega.MyButton();
|
||||||
|
this.horizontalProgressBar2 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
|
this.BUT_detch7 = new ArdupilotMega.MyButton();
|
||||||
|
this.horizontalProgressBar3 = new ArdupilotMega.HorizontalProgressBar();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
//
|
//
|
||||||
// CMB_joysticks
|
// CMB_joysticks
|
||||||
@ -224,6 +248,151 @@
|
|||||||
this.timer1.Enabled = true;
|
this.timer1.Enabled = true;
|
||||||
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
|
||||||
//
|
//
|
||||||
|
// CHK_elevons
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.CHK_elevons, "CHK_elevons");
|
||||||
|
this.CHK_elevons.Name = "CHK_elevons";
|
||||||
|
this.CHK_elevons.UseVisualStyleBackColor = true;
|
||||||
|
this.CHK_elevons.CheckedChanged += new System.EventHandler(this.CHK_elevons_CheckedChanged);
|
||||||
|
//
|
||||||
|
// revCH5
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.revCH5, "revCH5");
|
||||||
|
this.revCH5.Name = "revCH5";
|
||||||
|
this.revCH5.UseVisualStyleBackColor = true;
|
||||||
|
this.revCH5.CheckedChanged += new System.EventHandler(this.revCH5_CheckedChanged);
|
||||||
|
//
|
||||||
|
// label10
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.label10, "label10");
|
||||||
|
this.label10.Name = "label10";
|
||||||
|
//
|
||||||
|
// expo_ch5
|
||||||
|
//
|
||||||
|
this.expo_ch5.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
resources.ApplyResources(this.expo_ch5, "expo_ch5");
|
||||||
|
this.expo_ch5.Name = "expo_ch5";
|
||||||
|
//
|
||||||
|
// CMB_CH5
|
||||||
|
//
|
||||||
|
this.CMB_CH5.FormattingEnabled = true;
|
||||||
|
this.CMB_CH5.Items.AddRange(new object[] {
|
||||||
|
resources.GetString("CMB_CH5.Items"),
|
||||||
|
resources.GetString("CMB_CH5.Items1"),
|
||||||
|
resources.GetString("CMB_CH5.Items2"),
|
||||||
|
resources.GetString("CMB_CH5.Items3")});
|
||||||
|
resources.ApplyResources(this.CMB_CH5, "CMB_CH5");
|
||||||
|
this.CMB_CH5.Name = "CMB_CH5";
|
||||||
|
this.CMB_CH5.SelectedIndexChanged += new System.EventHandler(this.CMB_CH5_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// revCH6
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.revCH6, "revCH6");
|
||||||
|
this.revCH6.Name = "revCH6";
|
||||||
|
this.revCH6.UseVisualStyleBackColor = true;
|
||||||
|
this.revCH6.CheckedChanged += new System.EventHandler(this.revCH6_CheckedChanged);
|
||||||
|
//
|
||||||
|
// label11
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.label11, "label11");
|
||||||
|
this.label11.Name = "label11";
|
||||||
|
//
|
||||||
|
// expo_ch6
|
||||||
|
//
|
||||||
|
this.expo_ch6.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
resources.ApplyResources(this.expo_ch6, "expo_ch6");
|
||||||
|
this.expo_ch6.Name = "expo_ch6";
|
||||||
|
//
|
||||||
|
// CMB_CH6
|
||||||
|
//
|
||||||
|
this.CMB_CH6.FormattingEnabled = true;
|
||||||
|
this.CMB_CH6.Items.AddRange(new object[] {
|
||||||
|
resources.GetString("CMB_CH6.Items"),
|
||||||
|
resources.GetString("CMB_CH6.Items1"),
|
||||||
|
resources.GetString("CMB_CH6.Items2"),
|
||||||
|
resources.GetString("CMB_CH6.Items3")});
|
||||||
|
resources.ApplyResources(this.CMB_CH6, "CMB_CH6");
|
||||||
|
this.CMB_CH6.Name = "CMB_CH6";
|
||||||
|
this.CMB_CH6.SelectedIndexChanged += new System.EventHandler(this.CMB_CH6_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// revCH7
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.revCH7, "revCH7");
|
||||||
|
this.revCH7.Name = "revCH7";
|
||||||
|
this.revCH7.UseVisualStyleBackColor = true;
|
||||||
|
this.revCH7.CheckedChanged += new System.EventHandler(this.revCH7_CheckedChanged);
|
||||||
|
//
|
||||||
|
// label12
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.label12, "label12");
|
||||||
|
this.label12.Name = "label12";
|
||||||
|
//
|
||||||
|
// expo_ch7
|
||||||
|
//
|
||||||
|
this.expo_ch7.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
resources.ApplyResources(this.expo_ch7, "expo_ch7");
|
||||||
|
this.expo_ch7.Name = "expo_ch7";
|
||||||
|
//
|
||||||
|
// CMB_CH7
|
||||||
|
//
|
||||||
|
this.CMB_CH7.FormattingEnabled = true;
|
||||||
|
this.CMB_CH7.Items.AddRange(new object[] {
|
||||||
|
resources.GetString("CMB_CH7.Items"),
|
||||||
|
resources.GetString("CMB_CH7.Items1"),
|
||||||
|
resources.GetString("CMB_CH7.Items2"),
|
||||||
|
resources.GetString("CMB_CH7.Items3")});
|
||||||
|
resources.ApplyResources(this.CMB_CH7, "CMB_CH7");
|
||||||
|
this.CMB_CH7.Name = "CMB_CH7";
|
||||||
|
this.CMB_CH7.SelectedIndexChanged += new System.EventHandler(this.CMB_CH7_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// revCH8
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.revCH8, "revCH8");
|
||||||
|
this.revCH8.Name = "revCH8";
|
||||||
|
this.revCH8.UseVisualStyleBackColor = true;
|
||||||
|
this.revCH8.CheckedChanged += new System.EventHandler(this.revCH8_CheckedChanged);
|
||||||
|
//
|
||||||
|
// label13
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.label13, "label13");
|
||||||
|
this.label13.Name = "label13";
|
||||||
|
//
|
||||||
|
// expo_ch8
|
||||||
|
//
|
||||||
|
this.expo_ch8.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||||
|
resources.ApplyResources(this.expo_ch8, "expo_ch8");
|
||||||
|
this.expo_ch8.Name = "expo_ch8";
|
||||||
|
//
|
||||||
|
// CMB_CH8
|
||||||
|
//
|
||||||
|
this.CMB_CH8.FormattingEnabled = true;
|
||||||
|
this.CMB_CH8.Items.AddRange(new object[] {
|
||||||
|
resources.GetString("CMB_CH8.Items"),
|
||||||
|
resources.GetString("CMB_CH8.Items1"),
|
||||||
|
resources.GetString("CMB_CH8.Items2"),
|
||||||
|
resources.GetString("CMB_CH8.Items3")});
|
||||||
|
resources.ApplyResources(this.CMB_CH8, "CMB_CH8");
|
||||||
|
this.CMB_CH8.Name = "CMB_CH8";
|
||||||
|
this.CMB_CH8.SelectedIndexChanged += new System.EventHandler(this.CMB_CH8_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// BUT_detch8
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.BUT_detch8, "BUT_detch8");
|
||||||
|
this.BUT_detch8.Name = "BUT_detch8";
|
||||||
|
this.BUT_detch8.UseVisualStyleBackColor = true;
|
||||||
|
this.BUT_detch8.Click += new System.EventHandler(this.BUT_detch8_Click);
|
||||||
|
//
|
||||||
|
// horizontalProgressBar4
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.horizontalProgressBar4, "horizontalProgressBar4");
|
||||||
|
this.horizontalProgressBar4.Label = null;
|
||||||
|
this.horizontalProgressBar4.Maximum = 2200;
|
||||||
|
this.horizontalProgressBar4.maxline = 0;
|
||||||
|
this.horizontalProgressBar4.Minimum = 800;
|
||||||
|
this.horizontalProgressBar4.minline = 0;
|
||||||
|
this.horizontalProgressBar4.Name = "horizontalProgressBar4";
|
||||||
|
this.horizontalProgressBar4.Value = 800;
|
||||||
|
//
|
||||||
// BUT_detch4
|
// BUT_detch4
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.BUT_detch4, "BUT_detch4");
|
resources.ApplyResources(this.BUT_detch4, "BUT_detch4");
|
||||||
@ -310,17 +479,88 @@
|
|||||||
this.progressBar1.Name = "progressBar1";
|
this.progressBar1.Name = "progressBar1";
|
||||||
this.progressBar1.Value = 800;
|
this.progressBar1.Value = 800;
|
||||||
//
|
//
|
||||||
// CHK_elevons
|
// BUT_detch5
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this.CHK_elevons, "CHK_elevons");
|
resources.ApplyResources(this.BUT_detch5, "BUT_detch5");
|
||||||
this.CHK_elevons.Name = "CHK_elevons";
|
this.BUT_detch5.Name = "BUT_detch5";
|
||||||
this.CHK_elevons.UseVisualStyleBackColor = true;
|
this.BUT_detch5.UseVisualStyleBackColor = true;
|
||||||
this.CHK_elevons.CheckedChanged += new System.EventHandler(this.CHK_elevons_CheckedChanged);
|
this.BUT_detch5.Click += new System.EventHandler(this.BUT_detch5_Click);
|
||||||
|
//
|
||||||
|
// horizontalProgressBar1
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.horizontalProgressBar1, "horizontalProgressBar1");
|
||||||
|
this.horizontalProgressBar1.Label = null;
|
||||||
|
this.horizontalProgressBar1.Maximum = 2200;
|
||||||
|
this.horizontalProgressBar1.maxline = 0;
|
||||||
|
this.horizontalProgressBar1.Minimum = 800;
|
||||||
|
this.horizontalProgressBar1.minline = 0;
|
||||||
|
this.horizontalProgressBar1.Name = "horizontalProgressBar1";
|
||||||
|
this.horizontalProgressBar1.Value = 800;
|
||||||
|
//
|
||||||
|
// BUT_detch6
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.BUT_detch6, "BUT_detch6");
|
||||||
|
this.BUT_detch6.Name = "BUT_detch6";
|
||||||
|
this.BUT_detch6.UseVisualStyleBackColor = true;
|
||||||
|
this.BUT_detch6.Click += new System.EventHandler(this.BUT_detch6_Click);
|
||||||
|
//
|
||||||
|
// horizontalProgressBar2
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.horizontalProgressBar2, "horizontalProgressBar2");
|
||||||
|
this.horizontalProgressBar2.Label = null;
|
||||||
|
this.horizontalProgressBar2.Maximum = 2200;
|
||||||
|
this.horizontalProgressBar2.maxline = 0;
|
||||||
|
this.horizontalProgressBar2.Minimum = 800;
|
||||||
|
this.horizontalProgressBar2.minline = 0;
|
||||||
|
this.horizontalProgressBar2.Name = "horizontalProgressBar2";
|
||||||
|
this.horizontalProgressBar2.Value = 800;
|
||||||
|
//
|
||||||
|
// BUT_detch7
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.BUT_detch7, "BUT_detch7");
|
||||||
|
this.BUT_detch7.Name = "BUT_detch7";
|
||||||
|
this.BUT_detch7.UseVisualStyleBackColor = true;
|
||||||
|
this.BUT_detch7.Click += new System.EventHandler(this.BUT_detch7_Click);
|
||||||
|
//
|
||||||
|
// horizontalProgressBar3
|
||||||
|
//
|
||||||
|
resources.ApplyResources(this.horizontalProgressBar3, "horizontalProgressBar3");
|
||||||
|
this.horizontalProgressBar3.Label = null;
|
||||||
|
this.horizontalProgressBar3.Maximum = 2200;
|
||||||
|
this.horizontalProgressBar3.maxline = 0;
|
||||||
|
this.horizontalProgressBar3.Minimum = 800;
|
||||||
|
this.horizontalProgressBar3.minline = 0;
|
||||||
|
this.horizontalProgressBar3.Name = "horizontalProgressBar3";
|
||||||
|
this.horizontalProgressBar3.Value = 800;
|
||||||
//
|
//
|
||||||
// JoystickSetup
|
// JoystickSetup
|
||||||
//
|
//
|
||||||
resources.ApplyResources(this, "$this");
|
resources.ApplyResources(this, "$this");
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.Controls.Add(this.BUT_detch8);
|
||||||
|
this.Controls.Add(this.revCH8);
|
||||||
|
this.Controls.Add(this.label13);
|
||||||
|
this.Controls.Add(this.expo_ch8);
|
||||||
|
this.Controls.Add(this.horizontalProgressBar4);
|
||||||
|
this.Controls.Add(this.CMB_CH8);
|
||||||
|
this.Controls.Add(this.BUT_detch7);
|
||||||
|
this.Controls.Add(this.revCH7);
|
||||||
|
this.Controls.Add(this.label12);
|
||||||
|
this.Controls.Add(this.expo_ch7);
|
||||||
|
this.Controls.Add(this.horizontalProgressBar3);
|
||||||
|
this.Controls.Add(this.CMB_CH7);
|
||||||
|
this.Controls.Add(this.BUT_detch6);
|
||||||
|
this.Controls.Add(this.revCH6);
|
||||||
|
this.Controls.Add(this.label11);
|
||||||
|
this.Controls.Add(this.expo_ch6);
|
||||||
|
this.Controls.Add(this.horizontalProgressBar2);
|
||||||
|
this.Controls.Add(this.CMB_CH6);
|
||||||
|
this.Controls.Add(this.BUT_detch5);
|
||||||
|
this.Controls.Add(this.revCH5);
|
||||||
|
this.Controls.Add(this.label10);
|
||||||
|
this.Controls.Add(this.expo_ch5);
|
||||||
|
this.Controls.Add(this.horizontalProgressBar1);
|
||||||
|
this.Controls.Add(this.CMB_CH5);
|
||||||
this.Controls.Add(this.CHK_elevons);
|
this.Controls.Add(this.CHK_elevons);
|
||||||
this.Controls.Add(this.BUT_detch4);
|
this.Controls.Add(this.BUT_detch4);
|
||||||
this.Controls.Add(this.BUT_detch3);
|
this.Controls.Add(this.BUT_detch3);
|
||||||
@ -398,5 +638,29 @@
|
|||||||
private MyButton BUT_detch3;
|
private MyButton BUT_detch3;
|
||||||
private MyButton BUT_detch4;
|
private MyButton BUT_detch4;
|
||||||
private System.Windows.Forms.CheckBox CHK_elevons;
|
private System.Windows.Forms.CheckBox CHK_elevons;
|
||||||
|
private MyButton BUT_detch5;
|
||||||
|
private System.Windows.Forms.CheckBox revCH5;
|
||||||
|
private System.Windows.Forms.Label label10;
|
||||||
|
private System.Windows.Forms.TextBox expo_ch5;
|
||||||
|
private HorizontalProgressBar horizontalProgressBar1;
|
||||||
|
private System.Windows.Forms.ComboBox CMB_CH5;
|
||||||
|
private MyButton BUT_detch6;
|
||||||
|
private System.Windows.Forms.CheckBox revCH6;
|
||||||
|
private System.Windows.Forms.Label label11;
|
||||||
|
private System.Windows.Forms.TextBox expo_ch6;
|
||||||
|
private HorizontalProgressBar horizontalProgressBar2;
|
||||||
|
private System.Windows.Forms.ComboBox CMB_CH6;
|
||||||
|
private MyButton BUT_detch7;
|
||||||
|
private System.Windows.Forms.CheckBox revCH7;
|
||||||
|
private System.Windows.Forms.Label label12;
|
||||||
|
private System.Windows.Forms.TextBox expo_ch7;
|
||||||
|
private HorizontalProgressBar horizontalProgressBar3;
|
||||||
|
private System.Windows.Forms.ComboBox CMB_CH7;
|
||||||
|
private MyButton BUT_detch8;
|
||||||
|
private System.Windows.Forms.CheckBox revCH8;
|
||||||
|
private System.Windows.Forms.Label label13;
|
||||||
|
private System.Windows.Forms.TextBox expo_ch8;
|
||||||
|
private HorizontalProgressBar horizontalProgressBar4;
|
||||||
|
private System.Windows.Forms.ComboBox CMB_CH8;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -43,6 +43,10 @@ namespace ArdupilotMega
|
|||||||
CMB_CH2.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
CMB_CH2.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
CMB_CH3.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
CMB_CH3.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
CMB_CH4.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
CMB_CH4.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
|
CMB_CH5.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
|
CMB_CH6.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
|
CMB_CH7.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
|
CMB_CH8.DataSource = (Enum.GetValues(typeof(Joystick.joystickaxis)));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -51,18 +55,30 @@ namespace ArdupilotMega
|
|||||||
CMB_CH2.Text = MainV2.config["CMB_CH2"].ToString();
|
CMB_CH2.Text = MainV2.config["CMB_CH2"].ToString();
|
||||||
CMB_CH3.Text = MainV2.config["CMB_CH3"].ToString();
|
CMB_CH3.Text = MainV2.config["CMB_CH3"].ToString();
|
||||||
CMB_CH4.Text = MainV2.config["CMB_CH4"].ToString();
|
CMB_CH4.Text = MainV2.config["CMB_CH4"].ToString();
|
||||||
|
CMB_CH5.Text = MainV2.config["CMB_CH5"].ToString();
|
||||||
|
CMB_CH6.Text = MainV2.config["CMB_CH6"].ToString();
|
||||||
|
CMB_CH7.Text = MainV2.config["CMB_CH7"].ToString();
|
||||||
|
CMB_CH8.Text = MainV2.config["CMB_CH8"].ToString();
|
||||||
|
|
||||||
//revCH1
|
//revCH1
|
||||||
revCH1.Checked = bool.Parse(MainV2.config["revCH1"].ToString());
|
revCH1.Checked = bool.Parse(MainV2.config["revCH1"].ToString());
|
||||||
revCH2.Checked = bool.Parse(MainV2.config["revCH2"].ToString());
|
revCH2.Checked = bool.Parse(MainV2.config["revCH2"].ToString());
|
||||||
revCH3.Checked = bool.Parse(MainV2.config["revCH3"].ToString());
|
revCH3.Checked = bool.Parse(MainV2.config["revCH3"].ToString());
|
||||||
revCH4.Checked = bool.Parse(MainV2.config["revCH4"].ToString());
|
revCH4.Checked = bool.Parse(MainV2.config["revCH4"].ToString());
|
||||||
|
revCH5.Checked = bool.Parse(MainV2.config["revCH5"].ToString());
|
||||||
|
revCH6.Checked = bool.Parse(MainV2.config["revCH6"].ToString());
|
||||||
|
revCH7.Checked = bool.Parse(MainV2.config["revCH7"].ToString());
|
||||||
|
revCH8.Checked = bool.Parse(MainV2.config["revCH8"].ToString());
|
||||||
|
|
||||||
//expo_ch1
|
//expo_ch1
|
||||||
expo_ch1.Text = MainV2.config["expo_ch1"].ToString();
|
expo_ch1.Text = MainV2.config["expo_ch1"].ToString();
|
||||||
expo_ch2.Text = MainV2.config["expo_ch2"].ToString();
|
expo_ch2.Text = MainV2.config["expo_ch2"].ToString();
|
||||||
expo_ch3.Text = MainV2.config["expo_ch3"].ToString();
|
expo_ch3.Text = MainV2.config["expo_ch3"].ToString();
|
||||||
expo_ch4.Text = MainV2.config["expo_ch4"].ToString();
|
expo_ch4.Text = MainV2.config["expo_ch4"].ToString();
|
||||||
|
expo_ch5.Text = MainV2.config["expo_ch5"].ToString();
|
||||||
|
expo_ch6.Text = MainV2.config["expo_ch6"].ToString();
|
||||||
|
expo_ch7.Text = MainV2.config["expo_ch7"].ToString();
|
||||||
|
expo_ch8.Text = MainV2.config["expo_ch8"].ToString();
|
||||||
|
|
||||||
CHK_elevons.Checked = bool.Parse(MainV2.config["joy_elevons"].ToString());
|
CHK_elevons.Checked = bool.Parse(MainV2.config["joy_elevons"].ToString());
|
||||||
}
|
}
|
||||||
@ -104,6 +120,10 @@ namespace ArdupilotMega
|
|||||||
joy.setChannel(2, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH2.Text), revCH2.Checked, int.Parse(expo_ch2.Text));
|
joy.setChannel(2, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH2.Text), revCH2.Checked, int.Parse(expo_ch2.Text));
|
||||||
joy.setChannel(3, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH3.Text), revCH3.Checked, int.Parse(expo_ch3.Text));
|
joy.setChannel(3, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH3.Text), revCH3.Checked, int.Parse(expo_ch3.Text));
|
||||||
joy.setChannel(4, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH4.Text), revCH4.Checked, int.Parse(expo_ch4.Text));
|
joy.setChannel(4, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH4.Text), revCH4.Checked, int.Parse(expo_ch4.Text));
|
||||||
|
joy.setChannel(5, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH5.Text), revCH5.Checked, int.Parse(expo_ch5.Text));
|
||||||
|
joy.setChannel(6, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH6.Text), revCH6.Checked, int.Parse(expo_ch6.Text));
|
||||||
|
joy.setChannel(7, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH7.Text), revCH7.Checked, int.Parse(expo_ch7.Text));
|
||||||
|
joy.setChannel(8, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH8.Text), revCH8.Checked, int.Parse(expo_ch8.Text));
|
||||||
|
|
||||||
joy.elevons = CHK_elevons.Checked;
|
joy.elevons = CHK_elevons.Checked;
|
||||||
|
|
||||||
@ -153,13 +173,6 @@ namespace ArdupilotMega
|
|||||||
MainV2.joystick = null;
|
MainV2.joystick = null;
|
||||||
BUT_enable.Text = "Enable";
|
BUT_enable.Text = "Enable";
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
MainV2.cs.rcoverridech1 = pickchannel(1, CMB_CH1.Text, revCH1.Checked, int.Parse(expo_ch1.Text));//(ushort)(((int)state.Rz / 65.535) + 1000);
|
|
||||||
MainV2.cs.rcoverridech2 = pickchannel(2, CMB_CH2.Text, revCH2.Checked, int.Parse(expo_ch2.Text));//(ushort)(((int)state.Y / 65.535) + 1000);
|
|
||||||
MainV2.cs.rcoverridech3 = pickchannel(3, CMB_CH3.Text, revCH3.Checked, int.Parse(expo_ch3.Text));//(ushort)(1000 - ((int)slider[0] / 65.535) + 1000);
|
|
||||||
MainV2.cs.rcoverridech4 = pickchannel(4, CMB_CH4.Text, revCH4.Checked, int.Parse(expo_ch4.Text));//(ushort)(((int)state.X / 65.535) + 1000);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BUT_save_Click(object sender, EventArgs e)
|
private void BUT_save_Click(object sender, EventArgs e)
|
||||||
@ -169,18 +182,30 @@ namespace ArdupilotMega
|
|||||||
MainV2.config["CMB_CH2"] = CMB_CH2.Text;
|
MainV2.config["CMB_CH2"] = CMB_CH2.Text;
|
||||||
MainV2.config["CMB_CH3"] = CMB_CH3.Text;
|
MainV2.config["CMB_CH3"] = CMB_CH3.Text;
|
||||||
MainV2.config["CMB_CH4"] = CMB_CH4.Text;
|
MainV2.config["CMB_CH4"] = CMB_CH4.Text;
|
||||||
|
MainV2.config["CMB_CH5"] = CMB_CH5.Text;
|
||||||
|
MainV2.config["CMB_CH6"] = CMB_CH6.Text;
|
||||||
|
MainV2.config["CMB_CH7"] = CMB_CH7.Text;
|
||||||
|
MainV2.config["CMB_CH8"] = CMB_CH8.Text;
|
||||||
|
|
||||||
//revCH1
|
//revCH1
|
||||||
MainV2.config["revCH1"] = revCH1.Checked;
|
MainV2.config["revCH1"] = revCH1.Checked;
|
||||||
MainV2.config["revCH2"] = revCH2.Checked;
|
MainV2.config["revCH2"] = revCH2.Checked;
|
||||||
MainV2.config["revCH3"] = revCH3.Checked;
|
MainV2.config["revCH3"] = revCH3.Checked;
|
||||||
MainV2.config["revCH4"] = revCH4.Checked;
|
MainV2.config["revCH4"] = revCH4.Checked;
|
||||||
|
MainV2.config["revCH5"] = revCH5.Checked;
|
||||||
|
MainV2.config["revCH6"] = revCH6.Checked;
|
||||||
|
MainV2.config["revCH7"] = revCH7.Checked;
|
||||||
|
MainV2.config["revCH8"] = revCH8.Checked;
|
||||||
|
|
||||||
//expo_ch1
|
//expo_ch1
|
||||||
MainV2.config["expo_ch1"] = expo_ch1.Text;
|
MainV2.config["expo_ch1"] = expo_ch1.Text;
|
||||||
MainV2.config["expo_ch2"] = expo_ch2.Text;
|
MainV2.config["expo_ch2"] = expo_ch2.Text;
|
||||||
MainV2.config["expo_ch3"] = expo_ch3.Text;
|
MainV2.config["expo_ch3"] = expo_ch3.Text;
|
||||||
MainV2.config["expo_ch4"] = expo_ch4.Text;
|
MainV2.config["expo_ch4"] = expo_ch4.Text;
|
||||||
|
MainV2.config["expo_ch5"] = expo_ch5.Text;
|
||||||
|
MainV2.config["expo_ch6"] = expo_ch6.Text;
|
||||||
|
MainV2.config["expo_ch7"] = expo_ch7.Text;
|
||||||
|
MainV2.config["expo_ch8"] = expo_ch8.Text;
|
||||||
|
|
||||||
MainV2.config["joy_elevons"] = CHK_elevons.Checked;
|
MainV2.config["joy_elevons"] = CHK_elevons.Checked;
|
||||||
|
|
||||||
@ -207,6 +232,10 @@ namespace ArdupilotMega
|
|||||||
joy.setChannel(2, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH2.Text), revCH2.Checked, int.Parse(expo_ch2.Text));
|
joy.setChannel(2, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH2.Text), revCH2.Checked, int.Parse(expo_ch2.Text));
|
||||||
joy.setChannel(3, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH3.Text), revCH3.Checked, int.Parse(expo_ch3.Text));
|
joy.setChannel(3, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH3.Text), revCH3.Checked, int.Parse(expo_ch3.Text));
|
||||||
joy.setChannel(4, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH4.Text), revCH4.Checked, int.Parse(expo_ch4.Text));
|
joy.setChannel(4, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH4.Text), revCH4.Checked, int.Parse(expo_ch4.Text));
|
||||||
|
joy.setChannel(5, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH5.Text), revCH5.Checked, int.Parse(expo_ch5.Text));
|
||||||
|
joy.setChannel(6, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH6.Text), revCH6.Checked, int.Parse(expo_ch6.Text));
|
||||||
|
joy.setChannel(7, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH7.Text), revCH7.Checked, int.Parse(expo_ch7.Text));
|
||||||
|
joy.setChannel(8, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), CMB_CH8.Text), revCH8.Checked, int.Parse(expo_ch8.Text));
|
||||||
|
|
||||||
joy.elevons = CHK_elevons.Checked;
|
joy.elevons = CHK_elevons.Checked;
|
||||||
|
|
||||||
@ -218,7 +247,7 @@ namespace ArdupilotMega
|
|||||||
{
|
{
|
||||||
string name = (f + 1).ToString();
|
string name = (f + 1).ToString();
|
||||||
|
|
||||||
doButtontoUI(name, 10, 195 + f * 25);
|
doButtontoUI(name, 10, 290 + f * 25);
|
||||||
|
|
||||||
joy.setButton(f, int.Parse(this.Controls.Find("cmbbutton" + name, false)[0].Text), this.Controls.Find("cmbaction" + name, false)[0].Text);
|
joy.setButton(f, int.Parse(this.Controls.Find("cmbbutton" + name, false)[0].Text), this.Controls.Find("cmbaction" + name, false)[0].Text);
|
||||||
}
|
}
|
||||||
@ -236,6 +265,10 @@ namespace ArdupilotMega
|
|||||||
MainV2.cs.rcoverridech2 = joy.getValueForChannel(2, CMB_joysticks.Text);
|
MainV2.cs.rcoverridech2 = joy.getValueForChannel(2, CMB_joysticks.Text);
|
||||||
MainV2.cs.rcoverridech3 = joy.getValueForChannel(3, CMB_joysticks.Text);
|
MainV2.cs.rcoverridech3 = joy.getValueForChannel(3, CMB_joysticks.Text);
|
||||||
MainV2.cs.rcoverridech4 = joy.getValueForChannel(4, CMB_joysticks.Text);
|
MainV2.cs.rcoverridech4 = joy.getValueForChannel(4, CMB_joysticks.Text);
|
||||||
|
MainV2.cs.rcoverridech5 = joy.getValueForChannel(5, CMB_joysticks.Text);
|
||||||
|
MainV2.cs.rcoverridech6 = joy.getValueForChannel(6, CMB_joysticks.Text);
|
||||||
|
MainV2.cs.rcoverridech7 = joy.getValueForChannel(7, CMB_joysticks.Text);
|
||||||
|
MainV2.cs.rcoverridech8 = joy.getValueForChannel(8, CMB_joysticks.Text);
|
||||||
|
|
||||||
//Console.WriteLine(DateTime.Now.Millisecond + " end ");
|
//Console.WriteLine(DateTime.Now.Millisecond + " end ");
|
||||||
}
|
}
|
||||||
@ -246,6 +279,10 @@ namespace ArdupilotMega
|
|||||||
progressBar2.Value = MainV2.cs.rcoverridech2;
|
progressBar2.Value = MainV2.cs.rcoverridech2;
|
||||||
progressBar3.Value = MainV2.cs.rcoverridech3;
|
progressBar3.Value = MainV2.cs.rcoverridech3;
|
||||||
progressBar4.Value = MainV2.cs.rcoverridech4;
|
progressBar4.Value = MainV2.cs.rcoverridech4;
|
||||||
|
horizontalProgressBar1.Value = MainV2.cs.rcoverridech5;
|
||||||
|
horizontalProgressBar2.Value = MainV2.cs.rcoverridech6;
|
||||||
|
horizontalProgressBar3.Value = MainV2.cs.rcoverridech7;
|
||||||
|
horizontalProgressBar4.Value = MainV2.cs.rcoverridech8;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -432,5 +469,77 @@ namespace ArdupilotMega
|
|||||||
{
|
{
|
||||||
MainV2.joystick.elevons = CHK_elevons.Checked;
|
MainV2.joystick.elevons = CHK_elevons.Checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CMB_CH5_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (startup || MainV2.joystick == null)
|
||||||
|
return;
|
||||||
|
MainV2.joystick.setAxis(5, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), ((ComboBox)sender).Text));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CMB_CH6_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (startup || MainV2.joystick == null)
|
||||||
|
return;
|
||||||
|
MainV2.joystick.setAxis(6, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), ((ComboBox)sender).Text));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CMB_CH7_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (startup || MainV2.joystick == null)
|
||||||
|
return;
|
||||||
|
MainV2.joystick.setAxis(7, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), ((ComboBox)sender).Text));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CMB_CH8_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (startup || MainV2.joystick == null)
|
||||||
|
return;
|
||||||
|
MainV2.joystick.setAxis(8, (Joystick.joystickaxis)Enum.Parse(typeof(Joystick.joystickaxis), ((ComboBox)sender).Text));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BUT_detch5_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CMB_CH5.Text = Joystick.getMovingAxis(CMB_joysticks.Text, 16000).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BUT_detch6_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CMB_CH6.Text = Joystick.getMovingAxis(CMB_joysticks.Text, 16000).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BUT_detch7_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CMB_CH7.Text = Joystick.getMovingAxis(CMB_joysticks.Text, 16000).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BUT_detch8_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
CMB_CH8.Text = Joystick.getMovingAxis(CMB_joysticks.Text, 16000).ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void revCH5_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (MainV2.joystick != null)
|
||||||
|
MainV2.joystick.setReverse(5, ((CheckBox)sender).Checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void revCH6_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (MainV2.joystick != null)
|
||||||
|
MainV2.joystick.setReverse(6, ((CheckBox)sender).Checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void revCH7_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (MainV2.joystick != null)
|
||||||
|
MainV2.joystick.setReverse(7, ((CheckBox)sender).Checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void revCH8_CheckedChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (MainV2.joystick != null)
|
||||||
|
MainV2.joystick.setReverse(8, ((CheckBox)sender).Checked);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_joysticks.ZOrder" xml:space="preserve">
|
<data name=">>CMB_joysticks.ZOrder" xml:space="preserve">
|
||||||
<value>32</value>
|
<value>56</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH1.Items" xml:space="preserve">
|
<data name="CMB_CH1.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -171,7 +171,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH1.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH1.ZOrder" xml:space="preserve">
|
||||||
<value>31</value>
|
<value>55</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH2.Items" xml:space="preserve">
|
<data name="CMB_CH2.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -204,7 +204,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH2.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH2.ZOrder" xml:space="preserve">
|
||||||
<value>30</value>
|
<value>54</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH3.Items" xml:space="preserve">
|
<data name="CMB_CH3.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -237,7 +237,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH3.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH3.ZOrder" xml:space="preserve">
|
||||||
<value>29</value>
|
<value>53</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH4.Items" xml:space="preserve">
|
<data name="CMB_CH4.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -270,7 +270,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH4.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH4.ZOrder" xml:space="preserve">
|
||||||
<value>28</value>
|
<value>52</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 70</value>
|
<value>307, 70</value>
|
||||||
@ -294,7 +294,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch1.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch1.ZOrder" xml:space="preserve">
|
||||||
<value>23</value>
|
<value>47</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch2.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch2.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 97</value>
|
<value>307, 97</value>
|
||||||
@ -318,7 +318,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch2.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch2.ZOrder" xml:space="preserve">
|
||||||
<value>22</value>
|
<value>46</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch3.Enabled" type="System.Boolean, mscorlib">
|
<data name="expo_ch3.Enabled" type="System.Boolean, mscorlib">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
@ -345,7 +345,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch3.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch3.ZOrder" xml:space="preserve">
|
||||||
<value>21</value>
|
<value>45</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch4.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch4.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 151</value>
|
<value>307, 151</value>
|
||||||
@ -369,7 +369,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch4.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch4.ZOrder" xml:space="preserve">
|
||||||
<value>20</value>
|
<value>44</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -400,7 +400,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label1.ZOrder" xml:space="preserve">
|
<data name=">>label1.ZOrder" xml:space="preserve">
|
||||||
<value>19</value>
|
<value>43</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -430,7 +430,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label2.ZOrder" xml:space="preserve">
|
<data name=">>label2.ZOrder" xml:space="preserve">
|
||||||
<value>18</value>
|
<value>42</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -460,7 +460,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label3.ZOrder" xml:space="preserve">
|
<data name=">>label3.ZOrder" xml:space="preserve">
|
||||||
<value>17</value>
|
<value>41</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -490,7 +490,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label4.ZOrder" xml:space="preserve">
|
<data name=">>label4.ZOrder" xml:space="preserve">
|
||||||
<value>16</value>
|
<value>40</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH1.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH1.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -517,7 +517,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH1.ZOrder" xml:space="preserve">
|
<data name=">>revCH1.ZOrder" xml:space="preserve">
|
||||||
<value>15</value>
|
<value>39</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH2.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH2.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -544,7 +544,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH2.ZOrder" xml:space="preserve">
|
<data name=">>revCH2.ZOrder" xml:space="preserve">
|
||||||
<value>14</value>
|
<value>38</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH3.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH3.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -571,7 +571,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH3.ZOrder" xml:space="preserve">
|
<data name=">>revCH3.ZOrder" xml:space="preserve">
|
||||||
<value>13</value>
|
<value>37</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH4.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH4.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -598,7 +598,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH4.ZOrder" xml:space="preserve">
|
<data name=">>revCH4.ZOrder" xml:space="preserve">
|
||||||
<value>12</value>
|
<value>36</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -628,7 +628,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label5.ZOrder" xml:space="preserve">
|
<data name=">>label5.ZOrder" xml:space="preserve">
|
||||||
<value>9</value>
|
<value>33</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -658,7 +658,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label6.ZOrder" xml:space="preserve">
|
<data name=">>label6.ZOrder" xml:space="preserve">
|
||||||
<value>8</value>
|
<value>32</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label7.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label7.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -688,7 +688,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label7.ZOrder" xml:space="preserve">
|
<data name=">>label7.ZOrder" xml:space="preserve">
|
||||||
<value>7</value>
|
<value>31</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label8.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label8.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -718,7 +718,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label8.ZOrder" xml:space="preserve">
|
<data name=">>label8.ZOrder" xml:space="preserve">
|
||||||
<value>6</value>
|
<value>30</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -748,11 +748,548 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label9.ZOrder" xml:space="preserve">
|
<data name=">>label9.ZOrder" xml:space="preserve">
|
||||||
<value>5</value>
|
<value>29</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<data name="CHK_elevons.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>434, 81</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>64, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>32</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Text" xml:space="preserve">
|
||||||
|
<value>Elevons</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Name" xml:space="preserve">
|
||||||
|
<value>CHK_elevons</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.ZOrder" xml:space="preserve">
|
||||||
|
<value>24</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 179</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>37</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Name" xml:space="preserve">
|
||||||
|
<value>revCH5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.ZOrder" xml:space="preserve">
|
||||||
|
<value>19</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 181</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>36</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Text" xml:space="preserve">
|
||||||
|
<value>CH 5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Name" xml:space="preserve">
|
||||||
|
<value>label10</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.ZOrder" xml:space="preserve">
|
||||||
|
<value>20</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 180</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>35</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.ZOrder" xml:space="preserve">
|
||||||
|
<value>21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 176</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>33</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.ZOrder" xml:space="preserve">
|
||||||
|
<value>23</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 208</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>43</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Name" xml:space="preserve">
|
||||||
|
<value>revCH6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.ZOrder" xml:space="preserve">
|
||||||
|
<value>13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 210</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>42</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Text" xml:space="preserve">
|
||||||
|
<value>CH 6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Name" xml:space="preserve">
|
||||||
|
<value>label11</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.ZOrder" xml:space="preserve">
|
||||||
|
<value>14</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 209</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>41</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.ZOrder" xml:space="preserve">
|
||||||
|
<value>15</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 205</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>39</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.ZOrder" xml:space="preserve">
|
||||||
|
<value>17</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 237</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>49</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Name" xml:space="preserve">
|
||||||
|
<value>revCH7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.ZOrder" xml:space="preserve">
|
||||||
|
<value>7</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 239</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>48</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Text" xml:space="preserve">
|
||||||
|
<value>CH 7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Name" xml:space="preserve">
|
||||||
|
<value>label12</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.ZOrder" xml:space="preserve">
|
||||||
|
<value>8</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 238</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>47</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.ZOrder" xml:space="preserve">
|
||||||
|
<value>9</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 234</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>45</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.ZOrder" xml:space="preserve">
|
||||||
|
<value>11</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 266</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>55</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Name" xml:space="preserve">
|
||||||
|
<value>revCH8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.ZOrder" xml:space="preserve">
|
||||||
|
<value>1</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 268</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>54</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Text" xml:space="preserve">
|
||||||
|
<value>CH 8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Name" xml:space="preserve">
|
||||||
|
<value>label13</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.ZOrder" xml:space="preserve">
|
||||||
|
<value>2</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 267</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>53</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.ZOrder" xml:space="preserve">
|
||||||
|
<value>3</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 263</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>51</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.ZOrder" xml:space="preserve">
|
||||||
|
<value>5</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 263</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>56</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 262</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>52</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar4</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.ZOrder" xml:space="preserve">
|
||||||
|
<value>4</value>
|
||||||
|
</data>
|
||||||
<data name="BUT_detch4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
@ -778,7 +1315,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch4.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch4.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>25</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -805,7 +1342,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch3.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch3.ZOrder" xml:space="preserve">
|
||||||
<value>2</value>
|
<value>26</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -832,7 +1369,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch2.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch2.ZOrder" xml:space="preserve">
|
||||||
<value>3</value>
|
<value>27</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -859,7 +1396,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch1.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch1.ZOrder" xml:space="preserve">
|
||||||
<value>4</value>
|
<value>28</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_enable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_enable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -886,7 +1423,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_enable.ZOrder" xml:space="preserve">
|
<data name=">>BUT_enable.ZOrder" xml:space="preserve">
|
||||||
<value>10</value>
|
<value>34</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_save.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_save.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -913,7 +1450,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_save.ZOrder" xml:space="preserve">
|
<data name=">>BUT_save.ZOrder" xml:space="preserve">
|
||||||
<value>11</value>
|
<value>35</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -937,7 +1474,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar4.ZOrder" xml:space="preserve">
|
<data name=">>progressBar4.ZOrder" xml:space="preserve">
|
||||||
<value>24</value>
|
<value>48</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -961,7 +1498,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar3.ZOrder" xml:space="preserve">
|
<data name=">>progressBar3.ZOrder" xml:space="preserve">
|
||||||
<value>25</value>
|
<value>49</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -985,7 +1522,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar2.ZOrder" xml:space="preserve">
|
<data name=">>progressBar2.ZOrder" xml:space="preserve">
|
||||||
<value>26</value>
|
<value>50</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -1009,34 +1546,160 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar1.ZOrder" xml:space="preserve">
|
<data name=">>progressBar1.ZOrder" xml:space="preserve">
|
||||||
<value>27</value>
|
<value>51</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.AutoSize" type="System.Boolean, mscorlib">
|
<data name="BUT_detch5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>True</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="BUT_detch5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>434, 81</value>
|
<value>148, 176</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="BUT_detch5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>64, 17</value>
|
<value>45, 23</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.TabIndex" type="System.Int32, mscorlib">
|
<data name="BUT_detch5.TabIndex" type="System.Int32, mscorlib">
|
||||||
<value>32</value>
|
<value>38</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Text" xml:space="preserve">
|
<data name="BUT_detch5.Text" xml:space="preserve">
|
||||||
<value>Elevons</value>
|
<value>Auto Detect</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Name" xml:space="preserve">
|
<data name=">>BUT_detch5.Name" xml:space="preserve">
|
||||||
<value>CHK_elevons</value>
|
<value>BUT_detch5</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Type" xml:space="preserve">
|
<data name=">>BUT_detch5.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Parent" xml:space="preserve">
|
<data name=">>BUT_detch5.Parent" xml:space="preserve">
|
||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch5.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
<value>18</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 175</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>34</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.ZOrder" xml:space="preserve">
|
||||||
|
<value>22</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 205</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>44</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.ZOrder" xml:space="preserve">
|
||||||
|
<value>12</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 204</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>40</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar2</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.ZOrder" xml:space="preserve">
|
||||||
|
<value>16</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 234</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>50</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.ZOrder" xml:space="preserve">
|
||||||
|
<value>6</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 233</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>46</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar3</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.ZOrder" xml:space="preserve">
|
||||||
|
<value>10</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -1045,7 +1708,7 @@
|
|||||||
<value>6, 13</value>
|
<value>6, 13</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>498, 220</value>
|
<value>498, 331</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
|
@ -23,11 +23,11 @@ namespace ArdupilotMega
|
|||||||
public byte sysid = 0;
|
public byte sysid = 0;
|
||||||
public byte compid = 0;
|
public byte compid = 0;
|
||||||
public Hashtable param = new Hashtable();
|
public Hashtable param = new Hashtable();
|
||||||
public static byte[][] packets = new byte[256][];
|
public byte[][] packets = new byte[256][];
|
||||||
public double[] packetspersecond = new double[256];
|
public double[] packetspersecond = new double[256];
|
||||||
DateTime[] packetspersecondbuild = new DateTime[256];
|
DateTime[] packetspersecondbuild = new DateTime[256];
|
||||||
static object objlock = new object();
|
object objlock = new object();
|
||||||
static object readlock = new object();
|
object readlock = new object();
|
||||||
object logwritelock = new object();
|
object logwritelock = new object();
|
||||||
public DateTime lastvalidpacket = DateTime.Now;
|
public DateTime lastvalidpacket = DateTime.Now;
|
||||||
bool oldlogformat = false;
|
bool oldlogformat = false;
|
||||||
@ -44,7 +44,7 @@ namespace ArdupilotMega
|
|||||||
public BinaryReader logplaybackfile = null;
|
public BinaryReader logplaybackfile = null;
|
||||||
public BinaryWriter logfile = null;
|
public BinaryWriter logfile = null;
|
||||||
|
|
||||||
public static byte[] streams = new byte[256];
|
public byte[] streams = new byte[256];
|
||||||
|
|
||||||
int bps1 = 0;
|
int bps1 = 0;
|
||||||
int bps2 = 0;
|
int bps2 = 0;
|
||||||
|
@ -66,10 +66,10 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
GCSViews.FlightData FlightData;
|
GCSViews.FlightData FlightData;
|
||||||
GCSViews.FlightPlanner FlightPlanner;
|
GCSViews.FlightPlanner FlightPlanner;
|
||||||
//GCSViews.Configuration Configuration;
|
GCSViews.Configuration Configuration;
|
||||||
GCSViews.Simulation Simulation;
|
GCSViews.Simulation Simulation;
|
||||||
GCSViews.Firmware Firmware;
|
GCSViews.Firmware Firmware;
|
||||||
//GCSViews.Terminal Terminal;
|
GCSViews.Terminal Terminal;
|
||||||
|
|
||||||
public MainV2()
|
public MainV2()
|
||||||
{
|
{
|
||||||
@ -221,6 +221,22 @@ namespace ArdupilotMega
|
|||||||
splash.Close();
|
splash.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void ScreenShot()
|
||||||
|
{
|
||||||
|
Rectangle bounds = Screen.GetBounds(Point.Empty);
|
||||||
|
using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
|
||||||
|
{
|
||||||
|
using (Graphics g = Graphics.FromImage(bitmap))
|
||||||
|
{
|
||||||
|
g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
|
||||||
|
}
|
||||||
|
string name = "ss" + DateTime.Now.ToString("hhmmss") + ".jpg";
|
||||||
|
bitmap.Save(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + name, System.Drawing.Imaging.ImageFormat.Jpeg);
|
||||||
|
MessageBox.Show("Screenshot saved to " + name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void CMB_serialport_Click(object sender, EventArgs e)
|
private void CMB_serialport_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
string oldport = CMB_serialport.Text;
|
string oldport = CMB_serialport.Text;
|
||||||
@ -456,7 +472,19 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
GCSViews.Terminal.threadrun = false;
|
GCSViews.Terminal.threadrun = false;
|
||||||
|
|
||||||
UserControl temp = new GCSViews.Configuration();
|
// dispose of old else memory leak
|
||||||
|
if (Configuration != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Configuration.Dispose();
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration = new GCSViews.Configuration();
|
||||||
|
|
||||||
|
UserControl temp = Configuration;
|
||||||
|
|
||||||
temp.SuspendLayout();
|
temp.SuspendLayout();
|
||||||
|
|
||||||
@ -633,6 +661,8 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
cs.firmware = APMFirmware;
|
cs.firmware = APMFirmware;
|
||||||
|
|
||||||
|
config[CMB_serialport.Text + "_BAUD"] = CMB_baudrate.Text;
|
||||||
|
|
||||||
if (config["loadwpsonconnect"] != null && bool.Parse(config["loadwpsonconnect"].ToString()) == true)
|
if (config["loadwpsonconnect"] != null && bool.Parse(config["loadwpsonconnect"].ToString()) == true)
|
||||||
{
|
{
|
||||||
MenuFlightPlanner_Click(null, null);
|
MenuFlightPlanner_Click(null, null);
|
||||||
@ -697,6 +727,9 @@ namespace ArdupilotMega
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
comPort.BaseStream.PortName = CMB_serialport.Text;
|
comPort.BaseStream.PortName = CMB_serialport.Text;
|
||||||
|
|
||||||
|
if (config[CMB_serialport.Text + "_BAUD"] != null)
|
||||||
|
CMB_baudrate.Text = config[CMB_serialport.Text + "_BAUD"].ToString();
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
@ -874,10 +907,22 @@ namespace ArdupilotMega
|
|||||||
rc.target_component = comPort.compid;
|
rc.target_component = comPort.compid;
|
||||||
rc.target_system = comPort.sysid;
|
rc.target_system = comPort.sysid;
|
||||||
|
|
||||||
rc.chan1_raw = cs.rcoverridech1;//(ushort)(((int)state.Rz / 65.535) + 1000);
|
if (joystick.getJoystickAxis(1) != Joystick.joystickaxis.None)
|
||||||
rc.chan2_raw = cs.rcoverridech2;//(ushort)(((int)state.Y / 65.535) + 1000);
|
rc.chan1_raw = cs.rcoverridech1;//(ushort)(((int)state.Rz / 65.535) + 1000);
|
||||||
rc.chan3_raw = cs.rcoverridech3;//(ushort)(1000 - ((int)slider[0] / 65.535 ) + 1000);
|
if (joystick.getJoystickAxis(2) != Joystick.joystickaxis.None)
|
||||||
rc.chan4_raw = cs.rcoverridech4;//(ushort)(((int)state.X / 65.535) + 1000);
|
rc.chan2_raw = cs.rcoverridech2;//(ushort)(((int)state.Y / 65.535) + 1000);
|
||||||
|
if (joystick.getJoystickAxis(3) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan3_raw = cs.rcoverridech3;//(ushort)(1000 - ((int)slider[0] / 65.535 ) + 1000);
|
||||||
|
if (joystick.getJoystickAxis(4) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan4_raw = cs.rcoverridech4;//(ushort)(((int)state.X / 65.535) + 1000);
|
||||||
|
if (joystick.getJoystickAxis(5) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan5_raw = cs.rcoverridech5;
|
||||||
|
if (joystick.getJoystickAxis(6) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan6_raw = cs.rcoverridech6;
|
||||||
|
if (joystick.getJoystickAxis(7) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan7_raw = cs.rcoverridech7;
|
||||||
|
if (joystick.getJoystickAxis(8) != Joystick.joystickaxis.None)
|
||||||
|
rc.chan8_raw = cs.rcoverridech8;
|
||||||
|
|
||||||
if (lastjoystick.AddMilliseconds(50) < DateTime.Now)
|
if (lastjoystick.AddMilliseconds(50) < DateTime.Now)
|
||||||
{
|
{
|
||||||
@ -1545,6 +1590,11 @@ namespace ArdupilotMega
|
|||||||
frm.Show();
|
frm.Show();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (keyData == (Keys.Control | Keys.S))
|
||||||
|
{
|
||||||
|
ScreenShot();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (keyData == (Keys.Control | Keys.G)) // test
|
if (keyData == (Keys.Control | Keys.G)) // test
|
||||||
{
|
{
|
||||||
Form frm = new SerialOutput();
|
Form frm = new SerialOutput();
|
||||||
|
@ -137,7 +137,7 @@ namespace ArdupilotMega
|
|||||||
flyto.Duration = (cs.datetime - lasttime).TotalMilliseconds / 1000.0;
|
flyto.Duration = (cs.datetime - lasttime).TotalMilliseconds / 1000.0;
|
||||||
|
|
||||||
flyto.Mode = FlyToMode.Smooth;
|
flyto.Mode = FlyToMode.Smooth;
|
||||||
Camera cam = new Camera();
|
SharpKml.Dom.Camera cam = new SharpKml.Dom.Camera();
|
||||||
cam.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute;
|
cam.AltitudeMode = SharpKml.Dom.AltitudeMode.Absolute;
|
||||||
cam.Latitude = cs.lat;
|
cam.Latitude = cs.lat;
|
||||||
cam.Longitude = cs.lng;
|
cam.Longitude = cs.lng;
|
||||||
@ -316,7 +316,7 @@ namespace ArdupilotMega
|
|||||||
mine.logplaybackfile = new BinaryReader(File.Open(logfile, FileMode.Open, FileAccess.Read, FileShare.Read));
|
mine.logplaybackfile = new BinaryReader(File.Open(logfile, FileMode.Open, FileAccess.Read, FileShare.Read));
|
||||||
mine.logreadmode = true;
|
mine.logreadmode = true;
|
||||||
|
|
||||||
MAVLink.packets.Initialize(); // clear
|
mine.packets.Initialize(); // clear
|
||||||
|
|
||||||
CurrentState cs = new CurrentState();
|
CurrentState cs = new CurrentState();
|
||||||
|
|
||||||
@ -422,7 +422,7 @@ namespace ArdupilotMega
|
|||||||
mine.logplaybackfile = new BinaryReader(File.Open(logfile, FileMode.Open, FileAccess.Read, FileShare.Read));
|
mine.logplaybackfile = new BinaryReader(File.Open(logfile, FileMode.Open, FileAccess.Read, FileShare.Read));
|
||||||
mine.logreadmode = true;
|
mine.logreadmode = true;
|
||||||
|
|
||||||
MAVLink.packets.Initialize(); // clear
|
mine.packets.Initialize(); // clear
|
||||||
|
|
||||||
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(logfile)+ Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(logfile) + ".txt");
|
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(logfile)+ Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(logfile) + ".txt");
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ namespace ArdupilotMega
|
|||||||
|
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
//Application.Run(new Camera());
|
||||||
Application.Run(new MainV2());
|
Application.Run(new MainV2());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,5 +34,5 @@ using System.Resources;
|
|||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.84")]
|
[assembly: AssemblyFileVersion("1.0.86")]
|
||||||
[assembly: NeutralResourcesLanguageAttribute("")]
|
[assembly: NeutralResourcesLanguageAttribute("")]
|
||||||
|
@ -14,7 +14,8 @@ namespace ArdupilotMega
|
|||||||
{
|
{
|
||||||
System.Threading.Thread t12;
|
System.Threading.Thread t12;
|
||||||
static bool threadrun = false;
|
static bool threadrun = false;
|
||||||
static SerialPort comPort = new SerialPort();
|
static internal SerialPort comPort = new SerialPort();
|
||||||
|
static internal PointLatLngAlt HomeLoc = new PointLatLngAlt(0,0,0,"Home");
|
||||||
|
|
||||||
public SerialOutput()
|
public SerialOutput()
|
||||||
{
|
{
|
||||||
@ -62,6 +63,7 @@ namespace ArdupilotMega
|
|||||||
void mainloop()
|
void mainloop()
|
||||||
{
|
{
|
||||||
threadrun = true;
|
threadrun = true;
|
||||||
|
int counter = 0;
|
||||||
while (threadrun)
|
while (threadrun)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -78,7 +80,16 @@ namespace ArdupilotMega
|
|||||||
checksum = GetChecksum(line);
|
checksum = GetChecksum(line);
|
||||||
comPort.WriteLine(line + "*" + checksum);
|
comPort.WriteLine(line + "*" + checksum);
|
||||||
|
|
||||||
|
if (counter % 5 == 0 && HomeLoc.Lat != 0 && HomeLoc.Lng != 0)
|
||||||
|
{
|
||||||
|
line = string.Format("$GP{0},{1:HHmmss},{2},{3},{4},{5},{6},{7},", "HOM", DateTime.Now.ToUniversalTime(), Math.Abs(HomeLoc.Lat * 100), HomeLoc.Lat < 0 ? "S" : "N", Math.Abs(HomeLoc.Lng * 100), HomeLoc.Lng < 0 ? "W" : "E", HomeLoc.Alt, "M");
|
||||||
|
|
||||||
|
checksum = GetChecksum(line);
|
||||||
|
comPort.WriteLine(line + "*" + checksum);
|
||||||
|
}
|
||||||
|
|
||||||
System.Threading.Thread.Sleep(500);
|
System.Threading.Thread.Sleep(500);
|
||||||
|
counter++;
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
<StartupObject />
|
<StartupObject />
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>false</SignAssembly>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<AssemblyOriginatorKeyFile>mykey.pfx</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>mykey.pfx</AssemblyOriginatorKeyFile>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
<dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
|
||||||
</dsig:Transforms>
|
</dsig:Transforms>
|
||||||
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
|
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
|
||||||
<dsig:DigestValue>sVd4w+f3LroCsyok5UsAi4Bq9eI=</dsig:DigestValue>
|
<dsig:DigestValue>FgyYFBDKA+EmX+ZazsEdbI/ME7o=</dsig:DigestValue>
|
||||||
</hash>
|
</hash>
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@ -134,7 +134,7 @@
|
|||||||
<value>Point Camera Here</value>
|
<value>Point Camera Here</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>175, 70</value>
|
<value>175, 48</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>contextMenuStrip1.Name" xml:space="preserve">
|
<data name=">>contextMenuStrip1.Name" xml:space="preserve">
|
||||||
<value>contextMenuStrip1</value>
|
<value>contextMenuStrip1</value>
|
||||||
@ -1083,290 +1083,68 @@
|
|||||||
<data name="MainH.Panel1MinSize" type="System.Int32, mscorlib">
|
<data name="MainH.Panel1MinSize" type="System.Int32, mscorlib">
|
||||||
<value>360</value>
|
<value>360</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="tableMap.CellBorderStyle" type="System.Windows.Forms.TableLayoutPanelCellBorderStyle, System.Windows.Forms">
|
||||||
|
<value>Single</value>
|
||||||
|
</data>
|
||||||
<data name="tableMap.ColumnCount" type="System.Int32, mscorlib">
|
<data name="tableMap.ColumnCount" type="System.Int32, mscorlib">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="TXT_lat.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
<data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>10, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>84, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_lat.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Name" xml:space="preserve">
|
|
||||||
<value>TXT_lat</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_lat.ZOrder" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>438, 7</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>76, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>69</value>
|
|
||||||
</data>
|
|
||||||
<data name="Zoomlevel.ToolTip" xml:space="preserve">
|
|
||||||
<value>Change Zoom Level</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Name" xml:space="preserve">
|
|
||||||
<value>Zoomlevel</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>Zoomlevel.ZOrder" xml:space="preserve">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>401, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>34, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>70</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Zoom</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Name" xml:space="preserve">
|
|
||||||
<value>label1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>label1.ZOrder" xml:space="preserve">
|
|
||||||
<value>2</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>100, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>84, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>14</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_long.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Name" xml:space="preserve">
|
|
||||||
<value>TXT_long</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_long.ZOrder" xml:space="preserve">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>190, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>64, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>15</value>
|
|
||||||
</data>
|
|
||||||
<data name="TXT_alt.Text" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Name" xml:space="preserve">
|
|
||||||
<value>TXT_alt</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>TXT_alt.ZOrder" xml:space="preserve">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>325, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>70, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>68</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.Text" xml:space="preserve">
|
|
||||||
<value>Auto Pan</value>
|
|
||||||
</data>
|
|
||||||
<data name="CHK_autopan.ToolTip" xml:space="preserve">
|
|
||||||
<value>Makes the map autopan based on current location</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Name" xml:space="preserve">
|
|
||||||
<value>CHK_autopan</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CHK_autopan.ZOrder" xml:space="preserve">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
|
||||||
<value>Bottom, Left</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>260, 9</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>59, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>62</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.Text" xml:space="preserve">
|
|
||||||
<value>Tuning</value>
|
|
||||||
</data>
|
|
||||||
<data name="CB_tuning.ToolTip" xml:space="preserve">
|
|
||||||
<value>Show the tunning graph, chowing target attitudes vs actual</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Name" xml:space="preserve">
|
|
||||||
<value>CB_tuning</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.Parent" xml:space="preserve">
|
|
||||||
<value>panel1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>CB_tuning.ZOrder" xml:space="preserve">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>0, 429</value>
|
<value>4, 4</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
<data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">
|
||||||
<value>0, 0, 0, 0</value>
|
<value>Horizontal</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="zg1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
<value>585, 30</value>
|
<value>Fill</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
<data name="zg1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>0, 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||||
|
<value>4, 4, 4, 4</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>577, 210</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>67</value>
|
||||||
|
</data>
|
||||||
|
<data name="zg1.Visible" type="System.Boolean, mscorlib">
|
||||||
|
<value>False</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Name" xml:space="preserve">
|
||||||
|
<value>zg1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Type" xml:space="preserve">
|
||||||
|
<value>ZedGraph.ZedGraphControl, ZedGraph, Version=5.1.2.878, Culture=neutral, PublicKeyToken=02a83cbd123fcd60</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.Parent" xml:space="preserve">
|
||||||
|
<value>splitContainer1.Panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>zg1.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Name" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Name" xml:space="preserve">
|
||||||
<value>panel1</value>
|
<value>splitContainer1.Panel1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Type" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.Parent" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.Parent" xml:space="preserve">
|
||||||
<value>tableMap</value>
|
<value>splitContainer1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel1.ZOrder" xml:space="preserve">
|
<data name=">>splitContainer1.Panel1.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>7, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>34, 13</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>69</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.Text" xml:space="preserve">
|
|
||||||
<value>Vel: 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbl_windvel.ToolTip" xml:space="preserve">
|
|
||||||
<value>Estimated Wind Velocity</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Name" xml:space="preserve">
|
|
||||||
<value>lbl_windvel</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Type" xml:space="preserve">
|
|
||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.Parent" xml:space="preserve">
|
|
||||||
<value>panel2</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>lbl_windvel.ZOrder" xml:space="preserve">
|
|
||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="lbl_winddir.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="lbl_winddir.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>7, 8</value>
|
<value>4, 7</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="lbl_winddir.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="lbl_winddir.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>32, 13</value>
|
<value>32, 13</value>
|
||||||
@ -1387,9 +1165,39 @@
|
|||||||
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>lbl_winddir.Parent" xml:space="preserve">
|
<data name=">>lbl_winddir.Parent" xml:space="preserve">
|
||||||
<value>panel2</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>lbl_winddir.ZOrder" xml:space="preserve">
|
<data name=">>lbl_winddir.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>4, 20</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>34, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>69</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.Text" xml:space="preserve">
|
||||||
|
<value>Vel: 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="lbl_windvel.ToolTip" xml:space="preserve">
|
||||||
|
<value>Estimated Wind Velocity</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Name" xml:space="preserve">
|
||||||
|
<value>lbl_windvel</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.Parent" xml:space="preserve">
|
||||||
|
<value>splitContainer1.Panel2</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>lbl_windvel.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="gMapControl1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
@ -1402,7 +1210,7 @@
|
|||||||
<value>0, 0, 0, 0</value>
|
<value>0, 0, 0, 0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="gMapControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>585, 429</value>
|
<value>577, 420</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="gMapControl1.streamjpg" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="gMapControl1.streamjpg" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>
|
<value>
|
||||||
@ -1559,66 +1367,288 @@
|
|||||||
<value>GMap.NET.WindowsForms.GMapControl, GMap.NET.WindowsForms, Version=1.5.5.5, Culture=neutral, PublicKeyToken=b85b9027b614afef</value>
|
<value>GMap.NET.WindowsForms.GMapControl, GMap.NET.WindowsForms, Version=1.5.5.5, Culture=neutral, PublicKeyToken=b85b9027b614afef</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>gMapControl1.Parent" xml:space="preserve">
|
<data name=">>gMapControl1.Parent" xml:space="preserve">
|
||||||
<value>panel2</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>gMapControl1.ZOrder" xml:space="preserve">
|
<data name=">>gMapControl1.ZOrder" xml:space="preserve">
|
||||||
<value>2</value>
|
<value>2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name=">>splitContainer1.Panel2.Name" xml:space="preserve">
|
||||||
<value>Fill</value>
|
<value>splitContainer1.Panel2</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name=">>splitContainer1.Panel2.Type" xml:space="preserve">
|
||||||
<value>0, 0</value>
|
<value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
<data name=">>splitContainer1.Panel2.Parent" xml:space="preserve">
|
||||||
<value>4, 4, 4, 4</value>
|
<value>splitContainer1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="zg1.Size" type="System.Drawing.Size, System.Drawing">
|
<data name=">>splitContainer1.Panel2.ZOrder" xml:space="preserve">
|
||||||
<value>585, 429</value>
|
|
||||||
</data>
|
|
||||||
<data name="zg1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>67</value>
|
|
||||||
</data>
|
|
||||||
<data name="zg1.Visible" type="System.Boolean, mscorlib">
|
|
||||||
<value>False</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Name" xml:space="preserve">
|
|
||||||
<value>zg1</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Type" xml:space="preserve">
|
|
||||||
<value>ZedGraph.ZedGraphControl, ZedGraph, Version=5.1.2.878, Culture=neutral, PublicKeyToken=02a83cbd123fcd60</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.Parent" xml:space="preserve">
|
|
||||||
<value>panel2</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>zg1.ZOrder" xml:space="preserve">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
|
||||||
<value>0, 0, 0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>585, 429</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Name" xml:space="preserve">
|
<data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>panel2</value>
|
<value>577, 420</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Type" xml:space="preserve">
|
<data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">
|
||||||
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>210</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.Parent" xml:space="preserve">
|
<data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>76</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Name" xml:space="preserve">
|
||||||
|
<value>splitContainer1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>splitContainer1.Parent" xml:space="preserve">
|
||||||
<value>tableMap</value>
|
<value>tableMap</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>panel2.ZOrder" xml:space="preserve">
|
<data name=">>splitContainer1.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>10, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>84, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_lat.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Name" xml:space="preserve">
|
||||||
|
<value>TXT_lat</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_lat.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>438, 8</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>76, 20</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>69</value>
|
||||||
|
</data>
|
||||||
|
<data name="Zoomlevel.ToolTip" xml:space="preserve">
|
||||||
|
<value>Change Zoom Level</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Name" xml:space="preserve">
|
||||||
|
<value>Zoomlevel</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.NumericUpDown, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>Zoomlevel.ZOrder" xml:space="preserve">
|
||||||
|
<value>1</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>401, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>34, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>70</value>
|
||||||
|
</data>
|
||||||
|
<data name="label1.Text" xml:space="preserve">
|
||||||
|
<value>Zoom</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Name" xml:space="preserve">
|
||||||
|
<value>label1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label1.ZOrder" xml:space="preserve">
|
||||||
|
<value>2</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>100, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>84, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>14</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_long.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Name" xml:space="preserve">
|
||||||
|
<value>TXT_long</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_long.ZOrder" xml:space="preserve">
|
||||||
|
<value>3</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>190, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>64, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>15</value>
|
||||||
|
</data>
|
||||||
|
<data name="TXT_alt.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Name" xml:space="preserve">
|
||||||
|
<value>TXT_alt</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyLabel, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>TXT_alt.ZOrder" xml:space="preserve">
|
||||||
|
<value>4</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>325, 11</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>68</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.Text" xml:space="preserve">
|
||||||
|
<value>Auto Pan</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_autopan.ToolTip" xml:space="preserve">
|
||||||
|
<value>Makes the map autopan based on current location</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Name" xml:space="preserve">
|
||||||
|
<value>CHK_autopan</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_autopan.ZOrder" xml:space="preserve">
|
||||||
|
<value>5</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
|
||||||
|
<value>Bottom, Left</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>260, 10</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>59, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>62</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.Text" xml:space="preserve">
|
||||||
|
<value>Tuning</value>
|
||||||
|
</data>
|
||||||
|
<data name="CB_tuning.ToolTip" xml:space="preserve">
|
||||||
|
<value>Show the tunning graph, chowing target attitudes vs actual</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Name" xml:space="preserve">
|
||||||
|
<value>CB_tuning</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.Parent" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CB_tuning.ZOrder" xml:space="preserve">
|
||||||
|
<value>6</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
|
<value>Fill</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>1, 428</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||||
|
<value>0, 0, 0, 0</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>583, 30</value>
|
||||||
|
</data>
|
||||||
|
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Name" xml:space="preserve">
|
||||||
|
<value>panel1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.Parent" xml:space="preserve">
|
||||||
|
<value>tableMap</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>panel1.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>1</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="tableMap.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
<data name="tableMap.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||||
@ -1649,7 +1679,7 @@
|
|||||||
<value>0</value>
|
<value>0</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="tableMap.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
<data name="tableMap.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="panel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="panel2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,30" /></TableLayoutSettings></value>
|
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="splitContainer1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="panel1" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,Absolute,30,Absolute,20" /></TableLayoutSettings></value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>MainH.Panel2.Name" xml:space="preserve">
|
<data name=">>MainH.Panel2.Name" xml:space="preserve">
|
||||||
<value>MainH.Panel2</value>
|
<value>MainH.Panel2</value>
|
||||||
|
@ -138,7 +138,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_joysticks.ZOrder" xml:space="preserve">
|
<data name=">>CMB_joysticks.ZOrder" xml:space="preserve">
|
||||||
<value>32</value>
|
<value>56</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH1.Items" xml:space="preserve">
|
<data name="CMB_CH1.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -171,7 +171,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH1.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH1.ZOrder" xml:space="preserve">
|
||||||
<value>31</value>
|
<value>55</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH2.Items" xml:space="preserve">
|
<data name="CMB_CH2.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -204,7 +204,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH2.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH2.ZOrder" xml:space="preserve">
|
||||||
<value>30</value>
|
<value>54</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH3.Items" xml:space="preserve">
|
<data name="CMB_CH3.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -237,7 +237,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH3.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH3.ZOrder" xml:space="preserve">
|
||||||
<value>29</value>
|
<value>53</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CMB_CH4.Items" xml:space="preserve">
|
<data name="CMB_CH4.Items" xml:space="preserve">
|
||||||
<value>RZ</value>
|
<value>RZ</value>
|
||||||
@ -270,7 +270,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CMB_CH4.ZOrder" xml:space="preserve">
|
<data name=">>CMB_CH4.ZOrder" xml:space="preserve">
|
||||||
<value>28</value>
|
<value>52</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch1.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 70</value>
|
<value>307, 70</value>
|
||||||
@ -294,7 +294,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch1.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch1.ZOrder" xml:space="preserve">
|
||||||
<value>23</value>
|
<value>47</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch2.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch2.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 97</value>
|
<value>307, 97</value>
|
||||||
@ -318,7 +318,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch2.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch2.ZOrder" xml:space="preserve">
|
||||||
<value>22</value>
|
<value>46</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch3.Enabled" type="System.Boolean, mscorlib">
|
<data name="expo_ch3.Enabled" type="System.Boolean, mscorlib">
|
||||||
<value>False</value>
|
<value>False</value>
|
||||||
@ -345,7 +345,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch3.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch3.ZOrder" xml:space="preserve">
|
||||||
<value>21</value>
|
<value>45</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="expo_ch4.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="expo_ch4.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>307, 151</value>
|
<value>307, 151</value>
|
||||||
@ -369,7 +369,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>expo_ch4.ZOrder" xml:space="preserve">
|
<data name=">>expo_ch4.ZOrder" xml:space="preserve">
|
||||||
<value>20</value>
|
<value>44</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -400,7 +400,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label1.ZOrder" xml:space="preserve">
|
<data name=">>label1.ZOrder" xml:space="preserve">
|
||||||
<value>19</value>
|
<value>43</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -430,7 +430,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label2.ZOrder" xml:space="preserve">
|
<data name=">>label2.ZOrder" xml:space="preserve">
|
||||||
<value>18</value>
|
<value>42</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -460,7 +460,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label3.ZOrder" xml:space="preserve">
|
<data name=">>label3.ZOrder" xml:space="preserve">
|
||||||
<value>17</value>
|
<value>41</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -490,7 +490,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label4.ZOrder" xml:space="preserve">
|
<data name=">>label4.ZOrder" xml:space="preserve">
|
||||||
<value>16</value>
|
<value>40</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH1.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH1.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -517,7 +517,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH1.ZOrder" xml:space="preserve">
|
<data name=">>revCH1.ZOrder" xml:space="preserve">
|
||||||
<value>15</value>
|
<value>39</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH2.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH2.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -544,7 +544,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH2.ZOrder" xml:space="preserve">
|
<data name=">>revCH2.ZOrder" xml:space="preserve">
|
||||||
<value>14</value>
|
<value>38</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH3.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH3.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -571,7 +571,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH3.ZOrder" xml:space="preserve">
|
<data name=">>revCH3.ZOrder" xml:space="preserve">
|
||||||
<value>13</value>
|
<value>37</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="revCH4.AutoSize" type="System.Boolean, mscorlib">
|
<data name="revCH4.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -598,7 +598,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>revCH4.ZOrder" xml:space="preserve">
|
<data name=">>revCH4.ZOrder" xml:space="preserve">
|
||||||
<value>12</value>
|
<value>36</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -628,7 +628,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label5.ZOrder" xml:space="preserve">
|
<data name=">>label5.ZOrder" xml:space="preserve">
|
||||||
<value>9</value>
|
<value>33</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -658,7 +658,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label6.ZOrder" xml:space="preserve">
|
<data name=">>label6.ZOrder" xml:space="preserve">
|
||||||
<value>8</value>
|
<value>32</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label7.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label7.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -688,7 +688,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label7.ZOrder" xml:space="preserve">
|
<data name=">>label7.ZOrder" xml:space="preserve">
|
||||||
<value>7</value>
|
<value>31</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label8.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label8.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -718,7 +718,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label8.ZOrder" xml:space="preserve">
|
<data name=">>label8.ZOrder" xml:space="preserve">
|
||||||
<value>6</value>
|
<value>30</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
|
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -748,11 +748,548 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>label9.ZOrder" xml:space="preserve">
|
<data name=">>label9.ZOrder" xml:space="preserve">
|
||||||
<value>5</value>
|
<value>29</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>17, 17</value>
|
<value>17, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<data name="CHK_elevons.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>434, 81</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>64, 17</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>32</value>
|
||||||
|
</data>
|
||||||
|
<data name="CHK_elevons.Text" xml:space="preserve">
|
||||||
|
<value>Elevons</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Name" xml:space="preserve">
|
||||||
|
<value>CHK_elevons</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CHK_elevons.ZOrder" xml:space="preserve">
|
||||||
|
<value>24</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 179</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>37</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Name" xml:space="preserve">
|
||||||
|
<value>revCH5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH5.ZOrder" xml:space="preserve">
|
||||||
|
<value>19</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 181</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>36</value>
|
||||||
|
</data>
|
||||||
|
<data name="label10.Text" xml:space="preserve">
|
||||||
|
<value>CH 5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Name" xml:space="preserve">
|
||||||
|
<value>label10</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label10.ZOrder" xml:space="preserve">
|
||||||
|
<value>20</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 180</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>35</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch5.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch5.ZOrder" xml:space="preserve">
|
||||||
|
<value>21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 176</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH5.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>33</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH5</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH5.ZOrder" xml:space="preserve">
|
||||||
|
<value>23</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 208</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>43</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Name" xml:space="preserve">
|
||||||
|
<value>revCH6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH6.ZOrder" xml:space="preserve">
|
||||||
|
<value>13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 210</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>42</value>
|
||||||
|
</data>
|
||||||
|
<data name="label11.Text" xml:space="preserve">
|
||||||
|
<value>CH 6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Name" xml:space="preserve">
|
||||||
|
<value>label11</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label11.ZOrder" xml:space="preserve">
|
||||||
|
<value>14</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 209</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>41</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch6.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch6.ZOrder" xml:space="preserve">
|
||||||
|
<value>15</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 205</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>39</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH6.ZOrder" xml:space="preserve">
|
||||||
|
<value>17</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 237</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>49</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Name" xml:space="preserve">
|
||||||
|
<value>revCH7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH7.ZOrder" xml:space="preserve">
|
||||||
|
<value>7</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 239</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>48</value>
|
||||||
|
</data>
|
||||||
|
<data name="label12.Text" xml:space="preserve">
|
||||||
|
<value>CH 7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Name" xml:space="preserve">
|
||||||
|
<value>label12</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label12.ZOrder" xml:space="preserve">
|
||||||
|
<value>8</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 238</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>47</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch7.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch7.ZOrder" xml:space="preserve">
|
||||||
|
<value>9</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 234</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>45</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH7.ZOrder" xml:space="preserve">
|
||||||
|
<value>11</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>413, 266</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>15, 14</value>
|
||||||
|
</data>
|
||||||
|
<data name="revCH8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>55</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Name" xml:space="preserve">
|
||||||
|
<value>revCH8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>revCH8.ZOrder" xml:space="preserve">
|
||||||
|
<value>1</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
||||||
|
<value>True</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>9, 268</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>31, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>54</value>
|
||||||
|
</data>
|
||||||
|
<data name="label13.Text" xml:space="preserve">
|
||||||
|
<value>CH 8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Name" xml:space="preserve">
|
||||||
|
<value>label13</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>label13.ZOrder" xml:space="preserve">
|
||||||
|
<value>2</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>307, 267</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 13</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>53</value>
|
||||||
|
</data>
|
||||||
|
<data name="expo_ch8.Text" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Name" xml:space="preserve">
|
||||||
|
<value>expo_ch8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>expo_ch8.ZOrder" xml:space="preserve">
|
||||||
|
<value>3</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items" xml:space="preserve">
|
||||||
|
<value>RZ</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items1" xml:space="preserve">
|
||||||
|
<value>X</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items2" xml:space="preserve">
|
||||||
|
<value>Y</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Items3" xml:space="preserve">
|
||||||
|
<value>SL1</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>72, 263</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>70, 21</value>
|
||||||
|
</data>
|
||||||
|
<data name="CMB_CH8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>51</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Name" xml:space="preserve">
|
||||||
|
<value>CMB_CH8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Type" xml:space="preserve">
|
||||||
|
<value>System.Windows.Forms.ComboBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>CMB_CH8.ZOrder" xml:space="preserve">
|
||||||
|
<value>5</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 263</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>56</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch8.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch8</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch8.ZOrder" xml:space="preserve">
|
||||||
|
<value>0</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 262</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar4.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>52</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar4</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar4.ZOrder" xml:space="preserve">
|
||||||
|
<value>4</value>
|
||||||
|
</data>
|
||||||
<data name="BUT_detch4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
@ -778,7 +1315,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch4.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch4.ZOrder" xml:space="preserve">
|
||||||
<value>1</value>
|
<value>25</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -805,7 +1342,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch3.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch3.ZOrder" xml:space="preserve">
|
||||||
<value>2</value>
|
<value>26</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -832,7 +1369,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch2.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch2.ZOrder" xml:space="preserve">
|
||||||
<value>3</value>
|
<value>27</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_detch1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_detch1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -859,7 +1396,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_detch1.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch1.ZOrder" xml:space="preserve">
|
||||||
<value>4</value>
|
<value>28</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_enable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_enable.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -886,7 +1423,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_enable.ZOrder" xml:space="preserve">
|
<data name=">>BUT_enable.ZOrder" xml:space="preserve">
|
||||||
<value>10</value>
|
<value>34</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BUT_save.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="BUT_save.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -913,7 +1450,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>BUT_save.ZOrder" xml:space="preserve">
|
<data name=">>BUT_save.ZOrder" xml:space="preserve">
|
||||||
<value>11</value>
|
<value>35</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -937,7 +1474,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar4.ZOrder" xml:space="preserve">
|
<data name=">>progressBar4.ZOrder" xml:space="preserve">
|
||||||
<value>24</value>
|
<value>48</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -961,7 +1498,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar3.ZOrder" xml:space="preserve">
|
<data name=">>progressBar3.ZOrder" xml:space="preserve">
|
||||||
<value>25</value>
|
<value>49</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -985,7 +1522,7 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar2.ZOrder" xml:space="preserve">
|
<data name=">>progressBar2.ZOrder" xml:space="preserve">
|
||||||
<value>26</value>
|
<value>50</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="progressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
<data name="progressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>NoControl</value>
|
<value>NoControl</value>
|
||||||
@ -1009,34 +1546,160 @@
|
|||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>progressBar1.ZOrder" xml:space="preserve">
|
<data name=">>progressBar1.ZOrder" xml:space="preserve">
|
||||||
<value>27</value>
|
<value>51</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.AutoSize" type="System.Boolean, mscorlib">
|
<data name="BUT_detch5.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
<value>True</value>
|
<value>NoControl</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Location" type="System.Drawing.Point, System.Drawing">
|
<data name="BUT_detch5.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
<value>434, 81</value>
|
<value>148, 176</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Size" type="System.Drawing.Size, System.Drawing">
|
<data name="BUT_detch5.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>64, 17</value>
|
<value>45, 23</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.TabIndex" type="System.Int32, mscorlib">
|
<data name="BUT_detch5.TabIndex" type="System.Int32, mscorlib">
|
||||||
<value>32</value>
|
<value>38</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="CHK_elevons.Text" xml:space="preserve">
|
<data name="BUT_detch5.Text" xml:space="preserve">
|
||||||
<value>Elevons</value>
|
<value>Auto Detect</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Name" xml:space="preserve">
|
<data name=">>BUT_detch5.Name" xml:space="preserve">
|
||||||
<value>CHK_elevons</value>
|
<value>BUT_detch5</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Type" xml:space="preserve">
|
<data name=">>BUT_detch5.Type" xml:space="preserve">
|
||||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.Parent" xml:space="preserve">
|
<data name=">>BUT_detch5.Parent" xml:space="preserve">
|
||||||
<value>$this</value>
|
<value>$this</value>
|
||||||
</data>
|
</data>
|
||||||
<data name=">>CHK_elevons.ZOrder" xml:space="preserve">
|
<data name=">>BUT_detch5.ZOrder" xml:space="preserve">
|
||||||
<value>0</value>
|
<value>18</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 175</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar1.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>34</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar1</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar1.ZOrder" xml:space="preserve">
|
||||||
|
<value>22</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 205</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>44</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch6.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch6</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch6.ZOrder" xml:space="preserve">
|
||||||
|
<value>12</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 204</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar2.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>40</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar2</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar2.ZOrder" xml:space="preserve">
|
||||||
|
<value>16</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>148, 234</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>45, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>50</value>
|
||||||
|
</data>
|
||||||
|
<data name="BUT_detch7.Text" xml:space="preserve">
|
||||||
|
<value>Auto Detect</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Name" xml:space="preserve">
|
||||||
|
<value>BUT_detch7</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.MyButton, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>BUT_detch7.ZOrder" xml:space="preserve">
|
||||||
|
<value>6</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||||
|
<value>NoControl</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.Location" type="System.Drawing.Point, System.Drawing">
|
||||||
|
<value>199, 233</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.Size" type="System.Drawing.Size, System.Drawing">
|
||||||
|
<value>100, 23</value>
|
||||||
|
</data>
|
||||||
|
<data name="horizontalProgressBar3.TabIndex" type="System.Int32, mscorlib">
|
||||||
|
<value>46</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Name" xml:space="preserve">
|
||||||
|
<value>horizontalProgressBar3</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Type" xml:space="preserve">
|
||||||
|
<value>ArdupilotMega.HorizontalProgressBar, ArdupilotMegaPlanner, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff91852278f5092c</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.Parent" xml:space="preserve">
|
||||||
|
<value>$this</value>
|
||||||
|
</data>
|
||||||
|
<data name=">>horizontalProgressBar3.ZOrder" xml:space="preserve">
|
||||||
|
<value>10</value>
|
||||||
</data>
|
</data>
|
||||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
<value>True</value>
|
<value>True</value>
|
||||||
@ -1045,7 +1708,7 @@
|
|||||||
<value>6, 13</value>
|
<value>6, 13</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||||
<value>498, 220</value>
|
<value>498, 331</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
<value>
|
<value>
|
||||||
|
@ -13,203 +13,146 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class ControllerPlane: public AP_Controller {
|
class ControllerPlane: public AP_Controller {
|
||||||
private:
|
|
||||||
AP_Var_group _group;
|
|
||||||
AP_Var_group _trimGroup;
|
|
||||||
AP_Uint8 _mode;
|
|
||||||
AP_Uint8 _rdrAilMix;
|
|
||||||
bool _needsTrim;
|
|
||||||
AP_Float _ailTrim;
|
|
||||||
AP_Float _elvTrim;
|
|
||||||
AP_Float _rdrTrim;
|
|
||||||
AP_Float _thrTrim;
|
|
||||||
enum {
|
|
||||||
ch_mode = 0, ch_roll, ch_pitch, ch_thr, ch_yaw
|
|
||||||
};
|
|
||||||
enum {
|
|
||||||
k_chMode = k_radioChannelsStart,
|
|
||||||
k_chRoll,
|
|
||||||
k_chPitch,
|
|
||||||
k_chYaw,
|
|
||||||
k_chThr,
|
|
||||||
|
|
||||||
k_pidBnkRll = k_controllersStart,
|
|
||||||
k_pidSpdPit,
|
|
||||||
k_pidPitPit,
|
|
||||||
k_pidYwrYaw,
|
|
||||||
k_pidHdgBnk,
|
|
||||||
k_pidAltThr,
|
|
||||||
|
|
||||||
k_trim = k_customStart
|
|
||||||
};
|
|
||||||
BlockPID pidBnkRll; // bank error to roll servo deflection
|
|
||||||
BlockPID pidSpdPit; // speed error to pitch command
|
|
||||||
BlockPID pidPitPit; // pitch error to pitch servo deflection
|
|
||||||
BlockPID pidYwrYaw; // yaw rate error to yaw servo deflection
|
|
||||||
BlockPID pidHdgBnk; // heading error to bank command
|
|
||||||
BlockPID pidAltThr; // altitude error to throttle deflection
|
|
||||||
bool requireRadio;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ControllerPlane(AP_Navigator * nav, AP_Guide * guide,
|
ControllerPlane(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal) :
|
||||||
AP_Controller(nav, guide, hal),
|
AP_Controller(nav, guide, hal, new AP_ArmingMechanism(hal,ch_thrust,ch_yaw,0.1,-0.9,0.9),ch_mode),
|
||||||
_group(k_cntrl, PSTR("cntrl_")),
|
_trimGroup(k_trim, PSTR("trim_")),
|
||||||
_trimGroup(k_trim, PSTR("trim_")),
|
_rdrAilMix(&_group, 2, rdrAilMix, PSTR("rdrAilMix")),
|
||||||
_mode(&_group, 1, MAV_MODE_UNINIT, PSTR("mode")),
|
_needsTrim(false),
|
||||||
_rdrAilMix(&_group, 2, rdrAilMix, PSTR("rdrAilMix")),
|
_ailTrim(&_trimGroup, 1, ailTrim, PSTR("ail")),
|
||||||
_needsTrim(false),
|
_elvTrim(&_trimGroup, 2, elvTrim, PSTR("elv")),
|
||||||
_ailTrim(&_trimGroup, 1, ailTrim, PSTR("ail")),
|
_rdrTrim(&_trimGroup, 3, rdrTrim, PSTR("rdr")),
|
||||||
_elvTrim(&_trimGroup, 2, elvTrim, PSTR("elv")),
|
_thrTrim(&_trimGroup, 4, thrTrim, PSTR("thr")),
|
||||||
_rdrTrim(&_trimGroup, 3, rdrTrim, PSTR("rdr")),
|
pidBnkRll(new AP_Var_group(k_pidBnkRll, PSTR("bnkRll_")), 1,
|
||||||
_thrTrim(&_trimGroup, 4, thrTrim, PSTR("thr")),
|
pidBnkRllP, pidBnkRllI, pidBnkRllD, pidBnkRllAwu,
|
||||||
pidBnkRll(new AP_Var_group(k_pidBnkRll, PSTR("bnkRll_")), 1,
|
pidBnkRllLim, pidBnkRllDFCut),
|
||||||
pidBnkRllP, pidBnkRllI, pidBnkRllD, pidBnkRllAwu,
|
pidPitPit(new AP_Var_group(k_pidPitPit, PSTR("pitPit_")), 1,
|
||||||
pidBnkRllLim, pidBnkRllDFCut),
|
pidPitPitP, pidPitPitI, pidPitPitD, pidPitPitAwu,
|
||||||
pidPitPit(new AP_Var_group(k_pidPitPit, PSTR("pitPit_")), 1,
|
pidPitPitLim, pidPitPitDFCut),
|
||||||
pidPitPitP, pidPitPitI, pidPitPitD, pidPitPitAwu,
|
pidSpdPit(new AP_Var_group(k_pidSpdPit, PSTR("spdPit_")), 1,
|
||||||
pidPitPitLim, pidPitPitDFCut),
|
pidSpdPitP, pidSpdPitI, pidSpdPitD, pidSpdPitAwu,
|
||||||
pidSpdPit(new AP_Var_group(k_pidSpdPit, PSTR("spdPit_")), 1,
|
pidSpdPitLim, pidSpdPitDFCut),
|
||||||
pidSpdPitP, pidSpdPitI, pidSpdPitD, pidSpdPitAwu,
|
pidYwrYaw(new AP_Var_group(k_pidYwrYaw, PSTR("ywrYaw_")), 1,
|
||||||
pidSpdPitLim, pidSpdPitDFCut),
|
pidYwrYawP, pidYwrYawI, pidYwrYawD, pidYwrYawAwu,
|
||||||
pidYwrYaw(new AP_Var_group(k_pidYwrYaw, PSTR("ywrYaw_")), 1,
|
pidYwrYawLim, pidYwrYawDFCut),
|
||||||
pidYwrYawP, pidYwrYawI, pidYwrYawD, pidYwrYawAwu,
|
pidHdgBnk(new AP_Var_group(k_pidHdgBnk, PSTR("hdgBnk_")), 1,
|
||||||
pidYwrYawLim, pidYwrYawDFCut),
|
pidHdgBnkP, pidHdgBnkI, pidHdgBnkD, pidHdgBnkAwu,
|
||||||
pidHdgBnk(new AP_Var_group(k_pidHdgBnk, PSTR("hdgBnk_")), 1,
|
pidHdgBnkLim, pidHdgBnkDFCut),
|
||||||
pidHdgBnkP, pidHdgBnkI, pidHdgBnkD, pidHdgBnkAwu,
|
pidAltThr(new AP_Var_group(k_pidAltThr, PSTR("altThr_")), 1,
|
||||||
pidHdgBnkLim, pidHdgBnkDFCut),
|
pidAltThrP, pidAltThrI, pidAltThrD, pidAltThrAwu,
|
||||||
pidAltThr(new AP_Var_group(k_pidAltThr, PSTR("altThr_")), 1,
|
pidAltThrLim, pidAltThrDFCut),
|
||||||
pidAltThrP, pidAltThrI, pidAltThrD, pidAltThrAwu,
|
requireRadio(false), _aileron(0), _elevator(0), _rudder(0), _throttle(0) {
|
||||||
pidAltThrLim, pidAltThrDFCut),
|
|
||||||
requireRadio(false) {
|
|
||||||
|
|
||||||
_hal->debug->println_P(PSTR("initializing plane controller"));
|
_hal->debug->println_P(PSTR("initializing plane controller"));
|
||||||
|
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chMode, PSTR("mode_"), APM_RC, 5, 1100,
|
new AP_RcChannel(k_chMode, PSTR("mode_"), APM_RC, 5, 1100,
|
||||||
1500, 1900, RC_MODE_IN, false));
|
1500, 1900, RC_MODE_IN, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chRoll, PSTR("roll_"), APM_RC, 0, 1200,
|
new AP_RcChannel(k_chRoll, PSTR("roll_"), APM_RC, 0, 1200,
|
||||||
1500, 1800, RC_MODE_INOUT, false));
|
1500, 1800, RC_MODE_INOUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chPitch, PSTR("pitch_"), APM_RC, 1, 1200,
|
new AP_RcChannel(k_chPitch, PSTR("pitch_"), APM_RC, 1, 1200,
|
||||||
1500, 1800, RC_MODE_INOUT, false));
|
1500, 1800, RC_MODE_INOUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chThr, PSTR("thr_"), APM_RC, 2, 1100, 1100,
|
new AP_RcChannel(k_chThr, PSTR("thr_"), APM_RC, 2, 1100, 1100,
|
||||||
1900, RC_MODE_INOUT, false));
|
1900, RC_MODE_INOUT, false));
|
||||||
_hal->rc.push_back(
|
_hal->rc.push_back(
|
||||||
new AP_RcChannel(k_chYaw, PSTR("yaw_"), APM_RC, 3, 1200, 1500,
|
new AP_RcChannel(k_chYaw, PSTR("yaw_"), APM_RC, 3, 1200, 1500,
|
||||||
1800, RC_MODE_INOUT, false));
|
1800, RC_MODE_INOUT, false));
|
||||||
}
|
}
|
||||||
virtual MAV_MODE getMode() {
|
|
||||||
return (MAV_MODE) _mode.get();
|
|
||||||
}
|
|
||||||
virtual void update(const float & dt) {
|
|
||||||
|
|
||||||
// check for heartbeat
|
private:
|
||||||
if (_hal->heartBeatLost()) {
|
// methdos
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
void manualLoop(const float dt) {
|
||||||
setAllRadioChannelsToNeutral();
|
setAllRadioChannelsManually();
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
// force auto to read new manual trim
|
||||||
_hal->debug->printf_P(PSTR("comm lost, send heartbeat from gcs\n"));
|
if (_needsTrim == false)
|
||||||
return;
|
_needsTrim = true;
|
||||||
// if the value of the throttle is less than 5% cut motor power
|
}
|
||||||
} else if (requireRadio && _hal->rc[ch_thr]->getRadioPosition() < 0.05) {
|
void autoLoop(const float dt) {
|
||||||
_mode = MAV_MODE_LOCKED;
|
_aileron = pidBnkRll.update(
|
||||||
setAllRadioChannelsToNeutral();
|
pidHdgBnk.update(_guide->getHeadingError(), dt) - _nav->getRoll(), dt);
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
_elevator = pidPitPit.update(
|
||||||
return;
|
-pidSpdPit.update(
|
||||||
// if in live mode then set state to active
|
_guide->getAirSpeedCommand() - _nav->getAirSpeed(),
|
||||||
} else if (_hal->getMode() == MODE_LIVE) {
|
dt) - _nav->getPitch(), dt);
|
||||||
_hal->setState(MAV_STATE_ACTIVE);
|
_rudder = pidYwrYaw.update(-_nav->getYawRate(), dt);
|
||||||
// if in hardware in the loop (control) mode, set to hilsim
|
|
||||||
} else if (_hal->getMode() == MODE_HIL_CNTL) {
|
|
||||||
_hal->setState(MAV_STATE_HILSIM);
|
|
||||||
}
|
|
||||||
|
|
||||||
// read switch to set mode
|
// desired yaw rate is zero, needs washout
|
||||||
if (_hal->rc[ch_mode]->getRadioPosition() > 0) {
|
_throttle = pidAltThr.update(
|
||||||
_mode = MAV_MODE_MANUAL;
|
_guide->getAltitudeCommand() - _nav->getAlt(), dt);
|
||||||
} else {
|
|
||||||
_mode = MAV_MODE_AUTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
// manual mode
|
if (_needsTrim) {
|
||||||
switch (_mode) {
|
// need to subtract current controller deflections so control
|
||||||
|
// surfaces are actually at the same position as manual flight
|
||||||
|
_ailTrim = _hal->rc[ch_roll]->getRadioPosition() - _aileron;
|
||||||
|
_elvTrim = _hal->rc[ch_pitch]->getRadioPosition() - _elevator;
|
||||||
|
_rdrTrim = _hal->rc[ch_yaw]->getRadioPosition() - _rudder;
|
||||||
|
_thrTrim = _hal->rc[ch_thrust]->getRadioPosition() - _throttle;
|
||||||
|
_needsTrim = false;
|
||||||
|
}
|
||||||
|
|
||||||
case MAV_MODE_MANUAL: {
|
// actuator mixing/ output
|
||||||
setAllRadioChannelsManually();
|
_aileron += _rdrAilMix * _rudder + _ailTrim;
|
||||||
|
_elevator += _elvTrim;
|
||||||
|
_rudder += _rdrTrim;
|
||||||
|
_throttle += _thrTrim;
|
||||||
|
}
|
||||||
|
void setMotorsActive() {
|
||||||
|
// turn all motors off if below 0.1 throttle
|
||||||
|
if (fabs(_hal->rc[ch_thrust]->getRadioPosition()) < 0.1) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
} else {
|
||||||
|
_hal->rc[ch_roll]->setPosition(_aileron);
|
||||||
|
_hal->rc[ch_yaw]->setPosition(_rudder);
|
||||||
|
_hal->rc[ch_pitch]->setPosition(_elevator);
|
||||||
|
_hal->rc[ch_thrust]->setPosition(_throttle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// force auto to read new manual trim
|
// attributes
|
||||||
if (_needsTrim == false)
|
enum {
|
||||||
_needsTrim = true;
|
ch_mode = 0, ch_roll, ch_pitch, ch_thrust, ch_yaw
|
||||||
//_hal->debug->println("manual");
|
};
|
||||||
break;
|
enum {
|
||||||
}
|
k_chMode = k_radioChannelsStart,
|
||||||
case MAV_MODE_AUTO: {
|
k_chRoll,
|
||||||
float headingError = _guide->getHeadingCommand()
|
k_chPitch,
|
||||||
- _nav->getYaw();
|
k_chYaw,
|
||||||
if (headingError > 180 * deg2Rad)
|
k_chThr,
|
||||||
headingError -= 360 * deg2Rad;
|
|
||||||
if (headingError < -180 * deg2Rad)
|
|
||||||
headingError += 360 * deg2Rad;
|
|
||||||
|
|
||||||
float aileron = pidBnkRll.update(
|
k_pidBnkRll = k_controllersStart,
|
||||||
pidHdgBnk.update(headingError, dt) - _nav->getRoll(), dt);
|
k_pidSpdPit,
|
||||||
float elevator = pidPitPit.update(
|
k_pidPitPit,
|
||||||
-pidSpdPit.update(
|
k_pidYwrYaw,
|
||||||
_guide->getAirSpeedCommand() - _nav->getAirSpeed(),
|
k_pidHdgBnk,
|
||||||
dt) - _nav->getPitch(), dt);
|
k_pidAltThr,
|
||||||
float rudder = pidYwrYaw.update(-_nav->getYawRate(), dt);
|
|
||||||
// desired yaw rate is zero, needs washout
|
|
||||||
float throttle = pidAltThr.update(
|
|
||||||
_guide->getAltitudeCommand() - _nav->getAlt(), dt);
|
|
||||||
|
|
||||||
// if needs trim
|
k_trim = k_customStart
|
||||||
if (_needsTrim) {
|
};
|
||||||
// need to subtract current controller deflections so control
|
AP_Var_group _trimGroup;
|
||||||
// surfaces are actually at the same position as manual flight
|
AP_Uint8 _rdrAilMix;
|
||||||
_ailTrim = _hal->rc[ch_roll]->getRadioPosition() - aileron;
|
bool _needsTrim;
|
||||||
_elvTrim = _hal->rc[ch_pitch]->getRadioPosition() - elevator;
|
AP_Float _ailTrim;
|
||||||
_rdrTrim = _hal->rc[ch_yaw]->getRadioPosition() - rudder;
|
AP_Float _elvTrim;
|
||||||
_thrTrim = _hal->rc[ch_thr]->getRadioPosition() - throttle;
|
AP_Float _rdrTrim;
|
||||||
_needsTrim = false;
|
AP_Float _thrTrim;
|
||||||
}
|
BlockPID pidBnkRll; // bank error to roll servo deflection
|
||||||
|
BlockPID pidSpdPit; // speed error to pitch command
|
||||||
// actuator mixing/ output
|
BlockPID pidPitPit; // pitch error to pitch servo deflection
|
||||||
_hal->rc[ch_roll]->setPosition(
|
BlockPID pidYwrYaw; // yaw rate error to yaw servo deflection
|
||||||
aileron + _rdrAilMix * rudder + _ailTrim);
|
BlockPID pidHdgBnk; // heading error to bank command
|
||||||
_hal->rc[ch_yaw]->setPosition(rudder + _rdrTrim);
|
BlockPID pidAltThr; // altitude error to throttle deflection
|
||||||
_hal->rc[ch_pitch]->setPosition(elevator + _elvTrim);
|
bool requireRadio;
|
||||||
_hal->rc[ch_thr]->setPosition(throttle + _thrTrim);
|
float _aileron;
|
||||||
|
float _elevator;
|
||||||
//_hal->debug->println("automode");
|
float _rudder;
|
||||||
|
float _throttle;
|
||||||
|
|
||||||
// heading debug
|
|
||||||
// Serial.print("heading command: "); Serial.println(_guide->getHeadingCommand());
|
|
||||||
// Serial.print("heading: "); Serial.println(_nav->getYaw());
|
|
||||||
// Serial.print("heading error: "); Serial.println(headingError);
|
|
||||||
|
|
||||||
// alt debug
|
|
||||||
// Serial.print("alt command: "); Serial.println(_guide->getAltitudeCommand());
|
|
||||||
// Serial.print("alt: "); Serial.println(_nav->getAlt());
|
|
||||||
// Serial.print("alt error: "); Serial.println(_guide->getAltitudeCommand() - _nav->getAlt());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
setAllRadioChannelsToNeutral();
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
_hal->debug->printf_P(PSTR("unknown controller mode\n"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* CONTROLLERPLANE_H_ */
|
#endif /* CONTROLLERPLANE_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -10,310 +10,179 @@
|
|||||||
|
|
||||||
#include "../APO/AP_Controller.h"
|
#include "../APO/AP_Controller.h"
|
||||||
#include "../APO/AP_BatteryMonitor.h"
|
#include "../APO/AP_BatteryMonitor.h"
|
||||||
|
#include "../APO/AP_ArmingMechanism.h"
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class ControllerQuad: public AP_Controller {
|
class ControllerQuad: public AP_Controller {
|
||||||
public:
|
public:
|
||||||
|
ControllerQuad(AP_Navigator * nav, AP_Guide * guide,
|
||||||
|
AP_HardwareAbstractionLayer * hal) :
|
||||||
|
AP_Controller(nav, guide, hal, new AP_ArmingMechanism(hal,ch_thrust,ch_yaw,0.1,-0.9,0.9), ch_mode),
|
||||||
|
pidRoll(new AP_Var_group(k_pidRoll, PSTR("ROLL_")), 1,
|
||||||
|
PID_ATT_P, PID_ATT_I, PID_ATT_D, PID_ATT_AWU,
|
||||||
|
PID_ATT_LIM, PID_ATT_DFCUT),
|
||||||
|
pidPitch(new AP_Var_group(k_pidPitch, PSTR("PITCH_")), 1,
|
||||||
|
PID_ATT_P, PID_ATT_I, PID_ATT_D, PID_ATT_AWU,
|
||||||
|
PID_ATT_LIM, PID_ATT_DFCUT),
|
||||||
|
pidYaw(new AP_Var_group(k_pidYaw, PSTR("YAW_")), 1,
|
||||||
|
PID_YAWPOS_P, PID_YAWPOS_I, PID_YAWPOS_D,
|
||||||
|
PID_YAWPOS_AWU, PID_YAWPOS_LIM, PID_ATT_DFCUT),
|
||||||
|
pidYawRate(new AP_Var_group(k_pidYawRate, PSTR("YAWRT_")), 1,
|
||||||
|
PID_YAWSPEED_P, PID_YAWSPEED_I, PID_YAWSPEED_D,
|
||||||
|
PID_YAWSPEED_AWU, PID_YAWSPEED_LIM, PID_YAWSPEED_DFCUT),
|
||||||
|
pidPN(new AP_Var_group(k_pidPN, PSTR("NORTH_")), 1, PID_POS_P,
|
||||||
|
PID_POS_I, PID_POS_D, PID_POS_AWU, PID_POS_LIM, PID_POS_DFCUT),
|
||||||
|
pidPE(new AP_Var_group(k_pidPE, PSTR("EAST_")), 1, PID_POS_P,
|
||||||
|
PID_POS_I, PID_POS_D, PID_POS_AWU, PID_POS_LIM, PID_POS_DFCUT),
|
||||||
|
pidPD(new AP_Var_group(k_pidPD, PSTR("DOWN_")), 1, PID_POS_Z_P,
|
||||||
|
PID_POS_Z_I, PID_POS_Z_D, PID_POS_Z_AWU, PID_POS_Z_LIM, PID_POS_DFCUT),
|
||||||
|
_thrustMix(0), _pitchMix(0), _rollMix(0), _yawMix(0),
|
||||||
|
_cmdRoll(0), _cmdPitch(0), _cmdYawRate(0) {
|
||||||
|
_hal->debug->println_P(PSTR("initializing quad controller"));
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* note that these are not the controller radio channel numbers, they are just
|
* allocate radio channels
|
||||||
* unique keys so they can be reaccessed from the hal rc vector
|
* the order of the channels has to match the enumeration above
|
||||||
*/
|
*/
|
||||||
enum {
|
_hal->rc.push_back(
|
||||||
CH_MODE = 0, // note scicoslab channels set mode, left, right, front, back order
|
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
||||||
CH_RIGHT,
|
1500, 1900, RC_MODE_IN, false));
|
||||||
CH_LEFT,
|
_hal->rc.push_back(
|
||||||
CH_FRONT,
|
new AP_RcChannel(k_chRight, PSTR("RIGHT_"), APM_RC, 0, 1100,
|
||||||
CH_BACK,
|
1100, 1900, RC_MODE_OUT, false));
|
||||||
CH_ROLL,
|
_hal->rc.push_back(
|
||||||
CH_PITCH,
|
new AP_RcChannel(k_chLeft, PSTR("LEFT_"), APM_RC, 1, 1100,
|
||||||
CH_THRUST,
|
1100, 1900, RC_MODE_OUT, false));
|
||||||
CH_YAW
|
|
||||||
};
|
|
||||||
|
|
||||||
// must match channel enum
|
_hal->rc.push_back(
|
||||||
enum {
|
new AP_RcChannel(k_chFront, PSTR("FRONT_"), APM_RC, 2, 1100,
|
||||||
k_chMode = k_radioChannelsStart,
|
1100, 1900, RC_MODE_OUT, false));
|
||||||
k_chRight,
|
_hal->rc.push_back(
|
||||||
k_chLeft,
|
new AP_RcChannel(k_chBack, PSTR("BACK_"), APM_RC, 3, 1100,
|
||||||
k_chFront,
|
1100, 1900, RC_MODE_OUT, false));
|
||||||
k_chBack,
|
_hal->rc.push_back(
|
||||||
k_chRoll,
|
new AP_RcChannel(k_chRoll, PSTR("ROLL_"), APM_RC, 0, 1100,
|
||||||
k_chPitch,
|
1500, 1900, RC_MODE_IN, false));
|
||||||
k_chThr,
|
_hal->rc.push_back(
|
||||||
k_chYaw
|
new AP_RcChannel(k_chPitch, PSTR("PITCH_"), APM_RC, 1, 1100,
|
||||||
};
|
1500, 1900, RC_MODE_IN, false));
|
||||||
|
_hal->rc.push_back(
|
||||||
enum {
|
new AP_RcChannel(k_chThr, PSTR("THRUST_"), APM_RC, 2, 1100,
|
||||||
k_pidGroundSpeed2Throttle = k_controllersStart,
|
1100, 1900, RC_MODE_IN, false));
|
||||||
k_pidStr,
|
_hal->rc.push_back(
|
||||||
k_pidPN,
|
new AP_RcChannel(k_chYaw, PSTR("YAW_"), APM_RC, 3, 1100, 1500,
|
||||||
k_pidPE,
|
1900, RC_MODE_IN, false));
|
||||||
k_pidPD,
|
}
|
||||||
k_pidRoll,
|
|
||||||
k_pidPitch,
|
|
||||||
k_pidYawRate,
|
|
||||||
k_pidYaw,
|
|
||||||
};
|
|
||||||
|
|
||||||
ControllerQuad(AP_Navigator * nav, AP_Guide * guide,
|
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
|
||||||
AP_Controller(nav, guide, hal),
|
|
||||||
pidRoll(new AP_Var_group(k_pidRoll, PSTR("ROLL_")), 1,
|
|
||||||
PID_ATT_P, PID_ATT_I, PID_ATT_D, PID_ATT_AWU,
|
|
||||||
PID_ATT_LIM, PID_ATT_DFCUT),
|
|
||||||
pidPitch(new AP_Var_group(k_pidPitch, PSTR("PITCH_")), 1,
|
|
||||||
PID_ATT_P, PID_ATT_I, PID_ATT_D, PID_ATT_AWU,
|
|
||||||
PID_ATT_LIM, PID_ATT_DFCUT),
|
|
||||||
pidYaw(new AP_Var_group(k_pidYaw, PSTR("YAW_")), 1,
|
|
||||||
PID_YAWPOS_P, PID_YAWPOS_I, PID_YAWPOS_D,
|
|
||||||
PID_YAWPOS_AWU, PID_YAWPOS_LIM, PID_ATT_DFCUT),
|
|
||||||
pidYawRate(new AP_Var_group(k_pidYawRate, PSTR("YAWRT_")), 1,
|
|
||||||
PID_YAWSPEED_P, PID_YAWSPEED_I, PID_YAWSPEED_D,
|
|
||||||
PID_YAWSPEED_AWU, PID_YAWSPEED_LIM, PID_YAWSPEED_DFCUT),
|
|
||||||
pidPN(new AP_Var_group(k_pidPN, PSTR("NORTH_")), 1, PID_POS_P,
|
|
||||||
PID_POS_I, PID_POS_D, PID_POS_AWU, PID_POS_LIM, PID_POS_DFCUT),
|
|
||||||
pidPE(new AP_Var_group(k_pidPE, PSTR("EAST_")), 1, PID_POS_P,
|
|
||||||
PID_POS_I, PID_POS_D, PID_POS_AWU, PID_POS_LIM, PID_POS_DFCUT),
|
|
||||||
pidPD(new AP_Var_group(k_pidPD, PSTR("DOWN_")), 1, PID_POS_Z_P,
|
|
||||||
PID_POS_Z_I, PID_POS_Z_D, PID_POS_Z_AWU, PID_POS_Z_LIM, PID_POS_DFCUT),
|
|
||||||
_armingClock(0), _thrustMix(0), _pitchMix(0), _rollMix(0), _yawMix(0),
|
|
||||||
_cmdRoll(0), _cmdPitch(0), _cmdYawRate(0), _mode(MAV_MODE_LOCKED) {
|
|
||||||
/*
|
|
||||||
* allocate radio channels
|
|
||||||
* the order of the channels has to match the enumeration above
|
|
||||||
*/
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chMode, PSTR("MODE_"), APM_RC, 5, 1100,
|
|
||||||
1500, 1900, RC_MODE_IN, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chRight, PSTR("RIGHT_"), APM_RC, 0, 1100,
|
|
||||||
1100, 1900, RC_MODE_OUT, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chLeft, PSTR("LEFT_"), APM_RC, 1, 1100,
|
|
||||||
1100, 1900, RC_MODE_OUT, false));
|
|
||||||
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chFront, PSTR("FRONT_"), APM_RC, 2, 1100,
|
|
||||||
1100, 1900, RC_MODE_OUT, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chBack, PSTR("BACK_"), APM_RC, 3, 1100,
|
|
||||||
1100, 1900, RC_MODE_OUT, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chRoll, PSTR("ROLL_"), APM_RC, 0, 1100,
|
|
||||||
1500, 1900, RC_MODE_IN, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chPitch, PSTR("PITCH_"), APM_RC, 1, 1100,
|
|
||||||
1500, 1900, RC_MODE_IN, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chThr, PSTR("THRUST_"), APM_RC, 2, 1100,
|
|
||||||
1100, 1900, RC_MODE_IN, false));
|
|
||||||
_hal->rc.push_back(
|
|
||||||
new AP_RcChannel(k_chYaw, PSTR("YAW_"), APM_RC, 3, 1100, 1500,
|
|
||||||
1900, RC_MODE_IN, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void update(const float & dt) {
|
|
||||||
//_hal->debug->printf_P(PSTR("thr: %f, yaw: %f\n"),_hal->rc[CH_THRUST]->getRadioPosition(),_hal->rc[CH_YAW]->getRadioPosition());
|
|
||||||
|
|
||||||
// arming
|
|
||||||
//
|
|
||||||
// to arm: put stick to bottom right for 100 controller cycles
|
|
||||||
// (max yaw, min throttle)
|
|
||||||
//
|
|
||||||
// didn't use clock here in case of millis() roll over
|
|
||||||
// for long runs
|
|
||||||
if ( (_hal->getState() != MAV_STATE_ACTIVE) &
|
|
||||||
(_hal->rc[CH_THRUST]->getRadioPosition() < 0.1) &&
|
|
||||||
(_hal->rc[CH_YAW]->getRadioPosition() < -0.9) ) {
|
|
||||||
|
|
||||||
// always start clock at 0
|
|
||||||
if (_armingClock<0) _armingClock = 0;
|
|
||||||
|
|
||||||
if (_armingClock++ >= 100) {
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("armed"));
|
|
||||||
_hal->setState(MAV_STATE_ACTIVE);
|
|
||||||
} else {
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("arming"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// disarming
|
|
||||||
//
|
|
||||||
// to disarm: put stick to bottom left for 100 controller cycles
|
|
||||||
// (min yaw, min throttle)
|
|
||||||
else if ( (_hal->getState() == MAV_STATE_ACTIVE) &
|
|
||||||
(_hal->rc[CH_THRUST]->getRadioPosition() < 0.1) &&
|
|
||||||
(_hal->rc[CH_YAW]->getRadioPosition() > 0.9) ) {
|
|
||||||
|
|
||||||
// always start clock at 0
|
|
||||||
if (_armingClock>0) _armingClock = 0;
|
|
||||||
|
|
||||||
if (_armingClock-- <= -100) {
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarmed"));
|
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
|
||||||
} else {
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarming"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// reset arming clock and report status
|
|
||||||
else if (_armingClock != 0) {
|
|
||||||
_armingClock = 0;
|
|
||||||
if (_hal->getState()==MAV_STATE_ACTIVE) _hal->gcs->sendText(SEVERITY_HIGH, PSTR("armed"));
|
|
||||||
else if (_hal->getState()!=MAV_STATE_ACTIVE) _hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarmed"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine flight mode
|
|
||||||
//
|
|
||||||
// check for heartbeat from gcs, if not found go to failsafe
|
|
||||||
if (_hal->heartBeatLost()) {
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("configure gcs to send heartbeat"));
|
|
||||||
// if battery less than 5%, go to failsafe
|
|
||||||
} else if (_hal->batteryMonitor->getPercentage() < 5) {
|
|
||||||
_mode = MAV_MODE_FAILSAFE;
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("recharge battery"));
|
|
||||||
// manual/auto switch
|
|
||||||
} else {
|
|
||||||
// if all emergencies cleared, fall back to standby
|
|
||||||
if (_hal->getState()==MAV_STATE_EMERGENCY) _hal->setState(MAV_STATE_STANDBY);
|
|
||||||
if (_hal->rc[CH_MODE]->getRadioPosition() > 0) _mode = MAV_MODE_MANUAL;
|
|
||||||
else _mode = MAV_MODE_AUTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle flight modes
|
|
||||||
switch(_mode) {
|
|
||||||
|
|
||||||
case MAV_MODE_LOCKED: {
|
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MAV_MODE_FAILSAFE: {
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MAV_MODE_MANUAL: {
|
|
||||||
manualPositionLoop();
|
|
||||||
autoAttitudeLoop(dt);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MAV_MODE_AUTO: {
|
|
||||||
// until position loop is tested just
|
|
||||||
// go to standby
|
|
||||||
_hal->setState(MAV_STATE_STANDBY);
|
|
||||||
|
|
||||||
//attitudeLoop();
|
|
||||||
// XXX autoPositionLoop NOT TESTED, don't uncomment yet
|
|
||||||
//autoPositionLoop(dt);
|
|
||||||
//autoAttitudeLoop(dt);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default: {
|
|
||||||
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("unknown mode"));
|
|
||||||
_hal->setState(MAV_STATE_EMERGENCY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// this sends commands to motors
|
|
||||||
setMotors();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual MAV_MODE getMode() {
|
|
||||||
return (MAV_MODE) _mode.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// methods
|
||||||
|
void manualLoop(const float dt) {
|
||||||
|
setAllRadioChannelsManually();
|
||||||
|
_cmdRoll = -0.5 * _hal->rc[ch_roll]->getPosition();
|
||||||
|
_cmdPitch = -0.5 * _hal->rc[ch_pitch]->getPosition();
|
||||||
|
_cmdYawRate = -1 * _hal->rc[ch_yaw]->getPosition();
|
||||||
|
_thrustMix = _hal->rc[ch_thrust]->getPosition();
|
||||||
|
autoAttitudeLoop(dt);
|
||||||
|
}
|
||||||
|
void autoLoop(const float dt) {
|
||||||
|
autoPositionLoop(dt);
|
||||||
|
autoAttitudeLoop(dt);
|
||||||
|
|
||||||
AP_Uint8 _mode;
|
// XXX currently auto loop not tested, so
|
||||||
BlockPIDDfb pidRoll, pidPitch, pidYaw;
|
// put vehicle in standby
|
||||||
BlockPID pidYawRate;
|
_hal->setState(MAV_STATE_STANDBY);
|
||||||
BlockPIDDfb pidPN, pidPE, pidPD;
|
}
|
||||||
int32_t _armingClock;
|
void autoPositionLoop(float dt) {
|
||||||
|
float cmdNorthTilt = pidPN.update(_nav->getPN(),_nav->getVN(),dt);
|
||||||
|
float cmdEastTilt = pidPE.update(_nav->getPE(),_nav->getVE(),dt);
|
||||||
|
float cmdDown = pidPD.update(_nav->getPD(),_nav->getVD(),dt);
|
||||||
|
|
||||||
float _thrustMix, _pitchMix, _rollMix, _yawMix;
|
// "transform-to-body"
|
||||||
float _cmdRoll, _cmdPitch, _cmdYawRate;
|
{
|
||||||
|
float trigSin = sin(-_nav->getYaw());
|
||||||
|
float trigCos = cos(-_nav->getYaw());
|
||||||
|
_cmdPitch = cmdEastTilt * trigCos - cmdNorthTilt * trigSin;
|
||||||
|
_cmdRoll = -cmdEastTilt * trigSin + cmdNorthTilt * trigCos;
|
||||||
|
// note that the north tilt is negative of the pitch
|
||||||
|
}
|
||||||
|
_cmdYawRate = 0;
|
||||||
|
|
||||||
void manualPositionLoop() {
|
_thrustMix = THRUST_HOVER_OFFSET + cmdDown;
|
||||||
setAllRadioChannelsManually();
|
|
||||||
_cmdRoll = -0.5 * _hal->rc[CH_ROLL]->getPosition();
|
|
||||||
_cmdPitch = -0.5 * _hal->rc[CH_PITCH]->getPosition();
|
|
||||||
_cmdYawRate = -1 * _hal->rc[CH_YAW]->getPosition();
|
|
||||||
_thrustMix = _hal->rc[CH_THRUST]->getPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
void autoPositionLoop(float dt) {
|
// "thrust-trim-adjust"
|
||||||
float cmdNorthTilt = pidPN.update(_nav->getPN(),_nav->getVN(),dt);
|
if (fabs(_cmdRoll) > 0.5) _thrustMix *= 1.13949393;
|
||||||
float cmdEastTilt = pidPE.update(_nav->getPE(),_nav->getVE(),dt);
|
else _thrustMix /= cos(_cmdRoll);
|
||||||
float cmdDown = pidPD.update(_nav->getPD(),_nav->getVD(),dt);
|
|
||||||
|
|
||||||
// "transform-to-body"
|
if (fabs(_cmdPitch) > 0.5) _thrustMix *= 1.13949393;
|
||||||
{
|
else _thrustMix /= cos(_cmdPitch);
|
||||||
float trigSin = sin(-_nav->getYaw());
|
}
|
||||||
float trigCos = cos(-_nav->getYaw());
|
void autoAttitudeLoop(float dt) {
|
||||||
_cmdPitch = cmdEastTilt * trigCos - cmdNorthTilt * trigSin;
|
_rollMix = pidRoll.update(_cmdRoll - _nav->getRoll(),
|
||||||
_cmdRoll = -cmdEastTilt * trigSin + cmdNorthTilt * trigCos;
|
_nav->getRollRate(), dt);
|
||||||
// note that the north tilt is negative of the pitch
|
_pitchMix = pidPitch.update(_cmdPitch - _nav->getPitch(),
|
||||||
}
|
_nav->getPitchRate(), dt);
|
||||||
_cmdYawRate = 0;
|
_yawMix = pidYawRate.update(_cmdYawRate - _nav->getYawRate(), dt);
|
||||||
|
}
|
||||||
|
void setMotorsActive() {
|
||||||
|
// turn all motors off if below 0.1 throttle
|
||||||
|
if (fabs(_hal->rc[ch_thrust]->getRadioPosition()) < 0.1) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
} else {
|
||||||
|
_hal->rc[ch_right]->setPosition(_thrustMix - _rollMix + _yawMix);
|
||||||
|
_hal->rc[ch_left]->setPosition(_thrustMix + _rollMix + _yawMix);
|
||||||
|
_hal->rc[ch_front]->setPosition(_thrustMix + _pitchMix - _yawMix);
|
||||||
|
_hal->rc[ch_back]->setPosition(_thrustMix - _pitchMix - _yawMix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_thrustMix = THRUST_HOVER_OFFSET + cmdDown;
|
// attributes
|
||||||
|
/**
|
||||||
// "thrust-trim-adjust"
|
* note that these are not the controller radio channel numbers, they are just
|
||||||
if (fabs(_cmdRoll) > 0.5) _thrustMix *= 1.13949393;
|
* unique keys so they can be reaccessed from the hal rc vector
|
||||||
else _thrustMix /= cos(_cmdRoll);
|
*/
|
||||||
|
enum {
|
||||||
if (fabs(_cmdPitch) > 0.5) _thrustMix *= 1.13949393;
|
ch_mode = 0, // note scicoslab channels set mode, left, right, front, back order
|
||||||
else _thrustMix /= cos(_cmdPitch);
|
ch_right,
|
||||||
}
|
ch_left,
|
||||||
|
ch_front,
|
||||||
void autoAttitudeLoop(float dt) {
|
ch_back,
|
||||||
_rollMix = pidRoll.update(_cmdRoll - _nav->getRoll(),
|
ch_roll,
|
||||||
_nav->getRollRate(), dt);
|
ch_pitch,
|
||||||
_pitchMix = pidPitch.update(_cmdPitch - _nav->getPitch(),
|
ch_thrust,
|
||||||
_nav->getPitchRate(), dt);
|
ch_yaw
|
||||||
_yawMix = pidYawRate.update(_cmdYawRate - _nav->getYawRate(), dt);
|
};
|
||||||
}
|
// must match channel enum
|
||||||
|
enum {
|
||||||
void setMotors() {
|
k_chMode = k_radioChannelsStart,
|
||||||
|
k_chRight,
|
||||||
switch (_hal->getState()) {
|
k_chLeft,
|
||||||
|
k_chFront,
|
||||||
case MAV_STATE_ACTIVE: {
|
k_chBack,
|
||||||
digitalWrite(_hal->aLedPin, HIGH);
|
k_chRoll,
|
||||||
// turn all motors off if below 0.1 throttle
|
k_chPitch,
|
||||||
if (_hal->rc[CH_THRUST]->getRadioPosition() < 0.1) {
|
k_chThr,
|
||||||
setAllRadioChannelsToNeutral();
|
k_chYaw
|
||||||
} else {
|
};
|
||||||
_hal->rc[CH_RIGHT]->setPosition(_thrustMix - _rollMix + _yawMix);
|
enum {
|
||||||
_hal->rc[CH_LEFT]->setPosition(_thrustMix + _rollMix + _yawMix);
|
k_pidGroundSpeed2Throttle = k_controllersStart,
|
||||||
_hal->rc[CH_FRONT]->setPosition(_thrustMix + _pitchMix - _yawMix);
|
k_pidStr,
|
||||||
_hal->rc[CH_BACK]->setPosition(_thrustMix - _pitchMix - _yawMix);
|
k_pidPN,
|
||||||
}
|
k_pidPE,
|
||||||
break;
|
k_pidPD,
|
||||||
}
|
k_pidRoll,
|
||||||
case MAV_STATE_EMERGENCY: {
|
k_pidPitch,
|
||||||
digitalWrite(_hal->aLedPin, LOW);
|
k_pidYawRate,
|
||||||
setAllRadioChannelsToNeutral();
|
k_pidYaw,
|
||||||
break;
|
};
|
||||||
}
|
BlockPIDDfb pidRoll, pidPitch, pidYaw;
|
||||||
case MAV_STATE_STANDBY: {
|
BlockPID pidYawRate;
|
||||||
digitalWrite(_hal->aLedPin,LOW);
|
BlockPIDDfb pidPN, pidPE, pidPD;
|
||||||
setAllRadioChannelsToNeutral();
|
float _thrustMix, _pitchMix, _rollMix, _yawMix;
|
||||||
break;
|
float _cmdRoll, _cmdPitch, _cmdYawRate;
|
||||||
}
|
|
||||||
default: {
|
|
||||||
digitalWrite(_hal->aLedPin, LOW);
|
|
||||||
setAllRadioChannelsToNeutral();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* CONTROLLERQUAD_H_ */
|
#endif /* CONTROLLERQUAD_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
// vehicle options
|
// vehicle options
|
||||||
static const apo::vehicle_t vehicle = apo::VEHICLE_PLANE;
|
static const apo::vehicle_t vehicle = apo::VEHICLE_PLANE;
|
||||||
static const apo::halMode_t halMode = apo::MODE_LIVE;
|
static const apo::halMode_t halMode = apo::MODE_LIVE;
|
||||||
static const apo::board_t board = apo::BOARD_ARDUPILOTMEGA_2560;
|
static const apo::board_t board = apo::BOARD_ARDUPILOTMEGA_1280;
|
||||||
static const uint8_t heartBeatTimeout = 3;
|
static const uint8_t heartBeatTimeout = 3;
|
||||||
|
|
||||||
// algorithm selection
|
// algorithm selection
|
||||||
@ -27,10 +27,10 @@ static const uint8_t heartBeatTimeout = 3;
|
|||||||
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
||||||
|
|
||||||
// baud rates
|
// baud rates
|
||||||
static uint32_t debugBaud = 57600;
|
static const uint32_t debugBaud = 57600;
|
||||||
static uint32_t telemBaud = 57600;
|
static const uint32_t telemBaud = 57600;
|
||||||
static uint32_t gpsBaud = 38400;
|
static const uint32_t gpsBaud = 38400;
|
||||||
static uint32_t hilBaud = 57600;
|
static const uint32_t hilBaud = 57600;
|
||||||
|
|
||||||
// optional sensors
|
// optional sensors
|
||||||
static const bool gpsEnabled = false;
|
static const bool gpsEnabled = false;
|
||||||
@ -40,7 +40,7 @@ static const Matrix3f compassOrientation = AP_COMPASS_COMPONENTS_UP_PINS_FORWARD
|
|||||||
// compass orientation: See AP_Compass_HMC5843.h for possible values
|
// compass orientation: See AP_Compass_HMC5843.h for possible values
|
||||||
|
|
||||||
// battery monitoring
|
// battery monitoring
|
||||||
static const bool batteryMonitorEnabled = true;
|
static const bool batteryMonitorEnabled = false;
|
||||||
static const uint8_t batteryPin = 0;
|
static const uint8_t batteryPin = 0;
|
||||||
static const float batteryVoltageDivRatio = 6;
|
static const float batteryVoltageDivRatio = 6;
|
||||||
static const float batteryMinVolt = 10.0;
|
static const float batteryMinVolt = 10.0;
|
||||||
@ -117,6 +117,12 @@ static const float elvTrim = 0.0;
|
|||||||
static const float rdrTrim = 0.0;
|
static const float rdrTrim = 0.0;
|
||||||
static const float thrTrim = 0.5;
|
static const float thrTrim = 0.5;
|
||||||
|
|
||||||
|
// guidance
|
||||||
|
static const float velCmd = 1; // m/s
|
||||||
|
static const float xt = 10; // cross track gain
|
||||||
|
static const float xtLim = 90; // cross track angle limit, deg
|
||||||
|
|
||||||
#include "ControllerPlane.h"
|
#include "ControllerPlane.h"
|
||||||
|
|
||||||
#endif /* PLANEEASYSTAR_H_ */
|
#endif /* PLANEEASYSTAR_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -27,10 +27,10 @@ static const uint8_t heartBeatTimeout = 3;
|
|||||||
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
#define RANGE_FINDER_CLASS AP_RangeFinder_MaxsonarXL
|
||||||
|
|
||||||
// baud rates
|
// baud rates
|
||||||
static uint32_t debugBaud = 57600;
|
static const uint32_t debugBaud = 57600;
|
||||||
static uint32_t telemBaud = 57600;
|
static const uint32_t telemBaud = 57600;
|
||||||
static uint32_t gpsBaud = 38400;
|
static const uint32_t gpsBaud = 38400;
|
||||||
static uint32_t hilBaud = 57600;
|
static const uint32_t hilBaud = 57600;
|
||||||
|
|
||||||
// optional sensors
|
// optional sensors
|
||||||
static const bool gpsEnabled = false;
|
static const bool gpsEnabled = false;
|
||||||
@ -54,7 +54,7 @@ static const bool rangeFinderUpEnabled = false;
|
|||||||
static const bool rangeFinderDownEnabled = false;
|
static const bool rangeFinderDownEnabled = false;
|
||||||
|
|
||||||
// loop rates
|
// loop rates
|
||||||
static const float loopRate = 400; // attitude nav
|
static const float loopRate = 250; // attitude nav
|
||||||
static const float loop0Rate = 50; // controller
|
static const float loop0Rate = 50; // controller
|
||||||
static const float loop1Rate = 10; // pos nav/ gcs fast
|
static const float loop1Rate = 10; // pos nav/ gcs fast
|
||||||
static const float loop2Rate = 1; // gcs slow
|
static const float loop2Rate = 1; // gcs slow
|
||||||
@ -91,9 +91,14 @@ static const float PID_YAWSPEED_D = 0;
|
|||||||
static const float PID_YAWSPEED_LIM = .05; // 5 % motors
|
static const float PID_YAWSPEED_LIM = .05; // 5 % motors
|
||||||
static const float PID_YAWSPEED_AWU = 0.0;
|
static const float PID_YAWSPEED_AWU = 0.0;
|
||||||
static const float PID_YAWSPEED_DFCUT = 3.0; // 3 Radians, about 1 Hz
|
static const float PID_YAWSPEED_DFCUT = 3.0; // 3 Radians, about 1 Hz
|
||||||
|
|
||||||
static const float THRUST_HOVER_OFFSET = 0.475;
|
static const float THRUST_HOVER_OFFSET = 0.475;
|
||||||
|
|
||||||
|
// guidance
|
||||||
|
static const float velCmd = 1; // m/s
|
||||||
|
static const float xt = 10; // cross track gain
|
||||||
|
static const float xtLim = 90; // cross track angle limit, deg
|
||||||
|
|
||||||
#include "ControllerQuad.h"
|
#include "ControllerQuad.h"
|
||||||
|
|
||||||
#endif /* QUADARDUCOPTER_H_ */
|
#endif /* QUADARDUCOPTER_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
#include <WProgram.h>
|
#include <WProgram.h>
|
||||||
|
|
||||||
// Vehicle Configuration
|
// Vehicle Configuration
|
||||||
#include "QuadArducopter.h"
|
//#include "QuadArducopter.h"
|
||||||
//#include "PlaneEasystar.h"
|
#include "PlaneEasystar.h"
|
||||||
|
|
||||||
// ArduPilotOne Default Setup
|
// ArduPilotOne Default Setup
|
||||||
#include "APO_DefaultSetup.h"
|
#include "APO_DefaultSetup.h"
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#define TEMP_FILTER_SIZE 16
|
#define TEMP_FILTER_SIZE 16
|
||||||
#define PRESS_FILTER_SIZE 10
|
#define PRESS_FILTER_SIZE 10
|
||||||
|
|
||||||
#include <APM_BMP085_hil.h>
|
#include "APM_BMP085_hil.h"
|
||||||
|
|
||||||
class APM_BMP085_Class
|
class APM_BMP085_Class
|
||||||
{
|
{
|
||||||
|
@ -16,6 +16,10 @@
|
|||||||
#include "AP_Navigator.h"
|
#include "AP_Navigator.h"
|
||||||
#include "AP_RcChannel.h"
|
#include "AP_RcChannel.h"
|
||||||
#include "AP_BatteryMonitor.h"
|
#include "AP_BatteryMonitor.h"
|
||||||
//#include "AP_Var_keys.h"
|
#include "AP_ArmingMechanism.h"
|
||||||
|
#include "AP_CommLink.h"
|
||||||
|
#include "AP_Var_keys.h"
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
#endif /* APO_H_ */
|
#endif /* APO_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -14,168 +14,171 @@ static apo::AP_Autopilot * autoPilot;
|
|||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|
||||||
using namespace apo;
|
using namespace apo;
|
||||||
|
|
||||||
AP_Var::load_all();
|
AP_Var::load_all();
|
||||||
|
|
||||||
// Declare all parts of the system
|
// Declare all parts of the system
|
||||||
AP_Navigator * navigator = NULL;
|
AP_Navigator * navigator = NULL;
|
||||||
AP_Guide * guide = NULL;
|
AP_Guide * guide = NULL;
|
||||||
AP_Controller * controller = NULL;
|
AP_Controller * controller = NULL;
|
||||||
AP_HardwareAbstractionLayer * hal = NULL;
|
AP_HardwareAbstractionLayer * hal = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Communications
|
* Communications
|
||||||
*/
|
*/
|
||||||
Serial.begin(debugBaud, 128, 128); // debug
|
Serial.begin(debugBaud, 128, 128); // debug
|
||||||
|
|
||||||
// hardware abstraction layer
|
// hardware abstraction layer
|
||||||
hal = new AP_HardwareAbstractionLayer(
|
hal = new AP_HardwareAbstractionLayer(
|
||||||
halMode, board, vehicle, heartBeatTimeout);
|
halMode, board, vehicle, heartBeatTimeout);
|
||||||
|
|
||||||
// debug serial
|
// debug serial
|
||||||
hal->debug = &Serial;
|
hal->debug = &Serial;
|
||||||
hal->debug->println_P(PSTR("initializing debug line"));
|
hal->debug->println_P(PSTR("initializing debug line"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sensor initialization
|
* Sensor initialization
|
||||||
*/
|
*/
|
||||||
if (hal->getMode() == MODE_LIVE) {
|
if (hal->getMode() == MODE_LIVE) {
|
||||||
|
|
||||||
hal->debug->println_P(PSTR("initializing adc"));
|
hal->debug->println_P(PSTR("initializing adc"));
|
||||||
hal->adc = new ADC_CLASS;
|
hal->adc = new ADC_CLASS;
|
||||||
hal->adc->Init();
|
hal->adc->Init();
|
||||||
|
|
||||||
if (batteryMonitorEnabled) {
|
if (batteryMonitorEnabled) {
|
||||||
hal->batteryMonitor = new AP_BatteryMonitor(batteryPin,batteryVoltageDivRatio,batteryMinVolt,batteryMaxVolt);
|
hal->batteryMonitor = new AP_BatteryMonitor(batteryPin,batteryVoltageDivRatio,batteryMinVolt,batteryMaxVolt);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gpsEnabled) {
|
if (gpsEnabled) {
|
||||||
Serial1.begin(gpsBaud, 128, 16); // gps
|
Serial1.begin(gpsBaud, 128, 16); // gps
|
||||||
hal->debug->println_P(PSTR("initializing gps"));
|
hal->debug->println_P(PSTR("initializing gps"));
|
||||||
AP_GPS_Auto gpsDriver(&Serial1, &(hal->gps));
|
AP_GPS_Auto gpsDriver(&Serial1, &(hal->gps));
|
||||||
hal->gps = &gpsDriver;
|
hal->gps = &gpsDriver;
|
||||||
hal->gps->callback = delay;
|
hal->gps->callback = delay;
|
||||||
hal->gps->init();
|
hal->gps->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (baroEnabled) {
|
if (baroEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing baro"));
|
hal->debug->println_P(PSTR("initializing baro"));
|
||||||
hal->baro = new BARO_CLASS;
|
hal->baro = new BARO_CLASS;
|
||||||
hal->baro->Init();
|
hal->baro->Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compassEnabled) {
|
if (compassEnabled) {
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
hal->debug->println_P(PSTR("initializing compass"));
|
hal->debug->println_P(PSTR("initializing compass"));
|
||||||
hal->compass = new COMPASS_CLASS;
|
hal->compass = new COMPASS_CLASS;
|
||||||
hal->compass->set_orientation(compassOrientation);
|
hal->compass->set_orientation(compassOrientation);
|
||||||
hal->compass->set_offsets(0,0,0);
|
hal->compass->set_offsets(0,0,0);
|
||||||
hal->compass->set_declination(0.0);
|
hal->compass->set_declination(0.0);
|
||||||
hal->compass->init();
|
hal->compass->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize ultrasonic sensors. If sensors are not plugged in, the navigator will not
|
* Initialize ultrasonic sensors. If sensors are not plugged in, the navigator will not
|
||||||
* initialize them and NULL will be assigned to those corresponding pointers.
|
* initialize them and NULL will be assigned to those corresponding pointers.
|
||||||
* On detecting NULL assigned to any ultrasonic sensor, its corresponding block of code
|
* On detecting NULL assigned to any ultrasonic sensor, its corresponding block of code
|
||||||
* will not be executed by the navigator.
|
* will not be executed by the navigator.
|
||||||
* The coordinate system is assigned by the right hand rule with the thumb pointing down.
|
* The coordinate system is assigned by the right hand rule with the thumb pointing down.
|
||||||
* In set_orientation, it is defined as (front/back,left/right,down,up)
|
* In set_orientation, it is defined as (front/back,left/right,down,up)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (rangeFinderFrontEnabled) {
|
if (rangeFinderFrontEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing front range finder"));
|
hal->debug->println_P(PSTR("initializing front range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(1);
|
rangeFinder->set_analog_port(1);
|
||||||
rangeFinder->set_orientation(1, 0, 0);
|
rangeFinder->set_orientation(1, 0, 0);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rangeFinderBackEnabled) {
|
if (rangeFinderBackEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing back range finder"));
|
hal->debug->println_P(PSTR("initializing back range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(2);
|
rangeFinder->set_analog_port(2);
|
||||||
rangeFinder->set_orientation(-1, 0, 0);
|
rangeFinder->set_orientation(-1, 0, 0);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rangeFinderLeftEnabled) {
|
if (rangeFinderLeftEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing left range finder"));
|
hal->debug->println_P(PSTR("initializing left range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(3);
|
rangeFinder->set_analog_port(3);
|
||||||
rangeFinder->set_orientation(0, -1, 0);
|
rangeFinder->set_orientation(0, -1, 0);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rangeFinderRightEnabled) {
|
if (rangeFinderRightEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing right range finder"));
|
hal->debug->println_P(PSTR("initializing right range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(4);
|
rangeFinder->set_analog_port(4);
|
||||||
rangeFinder->set_orientation(0, 1, 0);
|
rangeFinder->set_orientation(0, 1, 0);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rangeFinderUpEnabled) {
|
if (rangeFinderUpEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing up range finder"));
|
hal->debug->println_P(PSTR("initializing up range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(5);
|
rangeFinder->set_analog_port(5);
|
||||||
rangeFinder->set_orientation(0, 0, -1);
|
rangeFinder->set_orientation(0, 0, -1);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rangeFinderDownEnabled) {
|
if (rangeFinderDownEnabled) {
|
||||||
hal->debug->println_P(PSTR("initializing down range finder"));
|
hal->debug->println_P(PSTR("initializing down range finder"));
|
||||||
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
RangeFinder * rangeFinder = new RANGE_FINDER_CLASS(hal->adc,new ModeFilter);
|
||||||
rangeFinder->set_analog_port(6);
|
rangeFinder->set_analog_port(6);
|
||||||
rangeFinder->set_orientation(0, 0, 1);
|
rangeFinder->set_orientation(0, 0, 1);
|
||||||
hal->rangeFinders.push_back(rangeFinder);
|
hal->rangeFinders.push_back(rangeFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Select guidance, navigation, control algorithms
|
* Select guidance, navigation, control algorithms
|
||||||
*/
|
*/
|
||||||
navigator = new NAVIGATOR_CLASS(hal);
|
navigator = new NAVIGATOR_CLASS(hal);
|
||||||
guide = new GUIDE_CLASS(navigator, hal);
|
guide = new GUIDE_CLASS(navigator, hal, velCmd, xt, xtLim);
|
||||||
controller = new CONTROLLER_CLASS(navigator, guide, hal);
|
controller = new CONTROLLER_CLASS(navigator,guide,hal);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CommLinks
|
* CommLinks
|
||||||
*/
|
*/
|
||||||
if (board==BOARD_ARDUPILOTMEGA_2)
|
if (board==BOARD_ARDUPILOTMEGA_2)
|
||||||
{
|
{
|
||||||
Serial2.begin(telemBaud, 128, 128); // gcs
|
Serial2.begin(telemBaud, 128, 128); // gcs
|
||||||
hal->gcs = new COMMLINK_CLASS(&Serial2, navigator, guide, controller, hal);
|
hal->gcs = new COMMLINK_CLASS(&Serial2, navigator, guide, controller, hal);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Serial3.begin(telemBaud, 128, 128); // gcs
|
Serial3.begin(telemBaud, 128, 128); // gcs
|
||||||
hal->gcs = new COMMLINK_CLASS(&Serial3, navigator, guide, controller, hal);
|
hal->gcs = new COMMLINK_CLASS(&Serial3, navigator, guide, controller, hal);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hardware in the Loop
|
* Hardware in the Loop
|
||||||
*/
|
*/
|
||||||
if (hal->getMode() == MODE_HIL_CNTL) {
|
if (hal->getMode() == MODE_HIL_CNTL) {
|
||||||
Serial.println("HIL line setting up");
|
Serial.println("HIL line setting up");
|
||||||
Serial1.begin(hilBaud, 128, 128);
|
Serial1.begin(hilBaud, 128, 128);
|
||||||
hal->hil = new COMMLINK_CLASS(&Serial1, navigator, guide, controller, hal);
|
delay(1000);
|
||||||
}
|
Serial1.println("starting hil");
|
||||||
|
hal->hil = new COMMLINK_CLASS(&Serial1, navigator, guide, controller, hal);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start the autopilot
|
* Start the autopilot
|
||||||
*/
|
*/
|
||||||
hal->debug->printf_P(PSTR("initializing autopilot\n"));
|
hal->debug->printf_P(PSTR("initializing autopilot\n"));
|
||||||
hal->debug->printf_P(PSTR("free ram: %d bytes\n"),freeMemory());
|
hal->debug->printf_P(PSTR("free ram: %d bytes\n"),freeMemory());
|
||||||
|
|
||||||
autoPilot = new apo::AP_Autopilot(navigator, guide, controller, hal,
|
autoPilot = new apo::AP_Autopilot(navigator, guide, controller, hal,
|
||||||
loopRate, loop0Rate, loop1Rate, loop2Rate, loop3Rate);
|
loopRate, loop0Rate, loop1Rate, loop2Rate, loop3Rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
autoPilot->update();
|
autoPilot->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //_APO_COMMON_H
|
#endif //_APO_COMMON_H
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
57
libraries/APO/AP_ArmingMechanism.cpp
Normal file
57
libraries/APO/AP_ArmingMechanism.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* AP_ArmingMechanism.cpp
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "AP_ArmingMechanism.h"
|
||||||
|
#include "AP_RcChannel.h"
|
||||||
|
#include "../FastSerial/FastSerial.h"
|
||||||
|
#include "AP_HardwareAbstractionLayer.h"
|
||||||
|
#include "AP_CommLink.h"
|
||||||
|
|
||||||
|
namespace apo {
|
||||||
|
|
||||||
|
void AP_ArmingMechanism::update(const float dt) {
|
||||||
|
//_hal->debug->printf_P(PSTR("ch1: %f\tch2: %f\n"),_hal->rc[_ch1]->getRadioPosition(), _hal->rc[_ch2]->getRadioPosition());
|
||||||
|
// arming
|
||||||
|
if ( (_hal->getState() != MAV_STATE_ACTIVE) &&
|
||||||
|
(fabs(_hal->rc[_ch1]->getRadioPosition()) < _ch1Min) &&
|
||||||
|
(_hal->rc[_ch2]->getRadioPosition() < _ch2Min) ) {
|
||||||
|
|
||||||
|
// always start clock at 0
|
||||||
|
if (_armingClock<0) _armingClock = 0;
|
||||||
|
|
||||||
|
if (_armingClock++ >= 100) {
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("armed"));
|
||||||
|
_hal->setState(MAV_STATE_ACTIVE);
|
||||||
|
} else {
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("arming"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// disarming
|
||||||
|
else if ( (_hal->getState() == MAV_STATE_ACTIVE) &&
|
||||||
|
(fabs(_hal->rc[_ch1]->getRadioPosition()) < _ch1Min) &&
|
||||||
|
(_hal->rc[_ch2]->getRadioPosition() > _ch2Max) ) {
|
||||||
|
|
||||||
|
// always start clock at 0
|
||||||
|
if (_armingClock>0) _armingClock = 0;
|
||||||
|
|
||||||
|
if (_armingClock-- <= -100) {
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarmed"));
|
||||||
|
_hal->setState(MAV_STATE_STANDBY);
|
||||||
|
} else {
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarming"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// reset arming clock and report status
|
||||||
|
else if (_armingClock != 0) {
|
||||||
|
_armingClock = 0;
|
||||||
|
if (_hal->getState()==MAV_STATE_ACTIVE) _hal->gcs->sendText(SEVERITY_HIGH, PSTR("armed"));
|
||||||
|
else if (_hal->getState()!=MAV_STATE_ACTIVE) _hal->gcs->sendText(SEVERITY_HIGH, PSTR("disarmed"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // apo
|
||||||
|
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
67
libraries/APO/AP_ArmingMechanism.h
Normal file
67
libraries/APO/AP_ArmingMechanism.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* AP_ArmingMechanism.h
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AP_ARMINGMECHANISM_H_
|
||||||
|
#define AP_ARMINGMECHANISM_H_
|
||||||
|
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <wiring.h>
|
||||||
|
|
||||||
|
namespace apo {
|
||||||
|
|
||||||
|
class AP_HardwareAbstractionLayer;
|
||||||
|
|
||||||
|
class AP_ArmingMechanism {
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param ch1: typically throttle channel
|
||||||
|
* @param ch2: typically yaw channel
|
||||||
|
* @param ch1Min: disarms/arms belows this
|
||||||
|
* @param ch2Min: disarms below this
|
||||||
|
* @param ch2Max: arms above this
|
||||||
|
*/
|
||||||
|
AP_ArmingMechanism(AP_HardwareAbstractionLayer * hal,
|
||||||
|
uint8_t ch1, uint8_t ch2, float ch1Min, float ch2Min,
|
||||||
|
float ch2Max) : _armingClock(0), _hal(hal), _ch1(ch1), _ch2(ch2),
|
||||||
|
_ch1Min(ch1Min), _ch2Min(ch2Min), _ch2Max(ch2Max) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update
|
||||||
|
*
|
||||||
|
* arming:
|
||||||
|
*
|
||||||
|
* to arm: put stick to bottom right for 100 controller cycles
|
||||||
|
* (max yaw, min throttle)
|
||||||
|
*
|
||||||
|
* didn't use clock here in case of millis() roll over
|
||||||
|
* for long runs
|
||||||
|
*
|
||||||
|
* disarming:
|
||||||
|
*
|
||||||
|
* to disarm: put stick to bottom left for 100 controller cycles
|
||||||
|
* (min yaw, min throttle)
|
||||||
|
*/
|
||||||
|
void update(const float dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
|
int8_t _armingClock;
|
||||||
|
uint8_t _ch1; /// typically throttle channel
|
||||||
|
uint8_t _ch2; /// typically yaw channel
|
||||||
|
float _ch1Min; /// arms/disarms below this on ch1
|
||||||
|
float _ch2Min; /// disarms below this on ch2
|
||||||
|
float _ch2Max; /// arms above this on ch2
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace apo
|
||||||
|
|
||||||
|
#endif /* AP_ARMINGMECHANISM */
|
||||||
|
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
@ -5,250 +5,269 @@
|
|||||||
* Author: jgoppert
|
* Author: jgoppert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AVR runtime
|
||||||
|
*/
|
||||||
|
//#include <avr/io.h>
|
||||||
|
//#include <avr/eeprom.h>
|
||||||
|
//#include <avr/pgmspace.h>
|
||||||
|
//#include <math.h>
|
||||||
|
|
||||||
|
#include "../FastSerial/FastSerial.h"
|
||||||
#include "AP_Autopilot.h"
|
#include "AP_Autopilot.h"
|
||||||
|
#include "../AP_GPS/AP_GPS.h"
|
||||||
|
#include "../APM_RC/APM_RC.h"
|
||||||
|
#include "AP_HardwareAbstractionLayer.h"
|
||||||
|
#include "AP_CommLink.h"
|
||||||
|
#include "AP_MavlinkCommand.h"
|
||||||
|
#include "AP_Navigator.h"
|
||||||
|
#include "AP_Controller.h"
|
||||||
|
#include "AP_Guide.h"
|
||||||
#include "AP_BatteryMonitor.h"
|
#include "AP_BatteryMonitor.h"
|
||||||
|
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class AP_HardwareAbstractionLayer;
|
class AP_HardwareAbstractionLayer;
|
||||||
|
|
||||||
AP_Autopilot::AP_Autopilot(AP_Navigator * navigator, AP_Guide * guide,
|
AP_Autopilot::AP_Autopilot(AP_Navigator * navigator, AP_Guide * guide,
|
||||||
AP_Controller * controller, AP_HardwareAbstractionLayer * hal,
|
AP_Controller * controller, AP_HardwareAbstractionLayer * hal,
|
||||||
float loopRate, float loop0Rate, float loop1Rate, float loop2Rate, float loop3Rate) :
|
float loopRate, float loop0Rate, float loop1Rate, float loop2Rate, float loop3Rate) :
|
||||||
Loop(loopRate, callback, this), _navigator(navigator), _guide(guide),
|
Loop(loopRate, callback, this), _navigator(navigator), _guide(guide),
|
||||||
_controller(controller), _hal(hal),
|
_controller(controller), _hal(hal),
|
||||||
callbackCalls(0) {
|
callbackCalls(0) {
|
||||||
|
|
||||||
hal->setState(MAV_STATE_BOOT);
|
hal->setState(MAV_STATE_BOOT);
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Radio setup
|
* Radio setup
|
||||||
*/
|
*/
|
||||||
hal->debug->println_P(PSTR("initializing radio"));
|
hal->debug->println_P(PSTR("initializing radio"));
|
||||||
APM_RC.Init(); // APM Radio initialization,
|
APM_RC.Init(); // APM Radio initialization,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calibration
|
* Calibration
|
||||||
*/
|
*/
|
||||||
hal->setState(MAV_STATE_CALIBRATING);
|
hal->setState(MAV_STATE_CALIBRATING);
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
||||||
|
|
||||||
if (navigator) navigator->calibrate();
|
if (navigator) navigator->calibrate();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Look for valid initial state
|
* Look for valid initial state
|
||||||
*/
|
*/
|
||||||
while (_navigator) {
|
while (_navigator) {
|
||||||
// letc gcs known we are alive
|
// letc gcs known we are alive
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
||||||
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
hal->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
||||||
if (hal->getMode() == MODE_LIVE) {
|
if (hal->getMode() == MODE_LIVE) {
|
||||||
_navigator->updateSlow(0);
|
_navigator->updateSlow(0);
|
||||||
if (hal->gps) {
|
if (hal->gps) {
|
||||||
if (hal->gps->fix) {
|
if (hal->gps->fix) {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
hal->gps->update();
|
hal->gps->update();
|
||||||
hal->gcs->sendText(SEVERITY_LOW,
|
hal->gcs->sendText(SEVERITY_LOW,
|
||||||
PSTR("waiting for gps lock\n"));
|
PSTR("waiting for gps lock\n"));
|
||||||
hal->debug->printf_P(PSTR("waiting for gps lock\n"));
|
hal->debug->printf_P(PSTR("waiting for gps lock\n"));
|
||||||
}
|
}
|
||||||
} else { // no gps, can skip
|
} else { // no gps, can skip
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (hal->getMode() == MODE_HIL_CNTL) { // hil
|
} else if (hal->getMode() == MODE_HIL_CNTL) { // hil
|
||||||
hal->hil->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
hal->hil->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
||||||
hal->hil->receive();
|
hal->hil->receive();
|
||||||
Serial.println("HIL Receive Called");
|
Serial.println("HIL Receive Called");
|
||||||
if (_navigator->getTimeStamp() != 0) {
|
if (_navigator->getTimeStamp() != 0) {
|
||||||
// give hil a chance to send some packets
|
// give hil a chance to send some packets
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
hal->debug->println_P(PSTR("reading initial hil packets"));
|
hal->debug->println_P(PSTR("reading initial hil packets"));
|
||||||
hal->gcs->sendText(SEVERITY_LOW,
|
hal->gcs->sendText(SEVERITY_LOW,
|
||||||
PSTR("reading initial hil packets"));
|
PSTR("reading initial hil packets"));
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
hal->debug->println_P(PSTR("waiting for hil packet"));
|
hal->debug->println_P(PSTR("waiting for hil packet"));
|
||||||
}
|
}
|
||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
AP_MavlinkCommand::home.setAlt(_navigator->getAlt());
|
AP_MavlinkCommand::home.setAlt(_navigator->getAlt());
|
||||||
AP_MavlinkCommand::home.setLat(_navigator->getLat());
|
AP_MavlinkCommand::home.setLat(_navigator->getLat());
|
||||||
AP_MavlinkCommand::home.setLon(_navigator->getLon());
|
AP_MavlinkCommand::home.setLon(_navigator->getLon());
|
||||||
AP_MavlinkCommand::home.setCommand(MAV_CMD_NAV_WAYPOINT);
|
AP_MavlinkCommand::home.setCommand(MAV_CMD_NAV_WAYPOINT);
|
||||||
AP_MavlinkCommand::home.save();
|
AP_MavlinkCommand::home.save();
|
||||||
_hal->debug->printf_P(PSTR("\nhome before load lat: %f deg, lon: %f deg, cmd: %d\n"),
|
_hal->debug->printf_P(PSTR("\nhome before load lat: %f deg, lon: %f deg, cmd: %d\n"),
|
||||||
AP_MavlinkCommand::home.getLat()*rad2Deg,
|
AP_MavlinkCommand::home.getLat()*rad2Deg,
|
||||||
AP_MavlinkCommand::home.getLon()*rad2Deg,
|
AP_MavlinkCommand::home.getLon()*rad2Deg,
|
||||||
AP_MavlinkCommand::home.getCommand());
|
AP_MavlinkCommand::home.getCommand());
|
||||||
AP_MavlinkCommand::home.load();
|
AP_MavlinkCommand::home.load();
|
||||||
_hal->debug->printf_P(PSTR("\nhome after load lat: %f deg, lon: %f deg, cmd: %d\n"),
|
_hal->debug->printf_P(PSTR("\nhome after load lat: %f deg, lon: %f deg, cmd: %d\n"),
|
||||||
AP_MavlinkCommand::home.getLat()*rad2Deg,
|
AP_MavlinkCommand::home.getLat()*rad2Deg,
|
||||||
AP_MavlinkCommand::home.getLon()*rad2Deg,
|
AP_MavlinkCommand::home.getLon()*rad2Deg,
|
||||||
AP_MavlinkCommand::home.getCommand());
|
AP_MavlinkCommand::home.getCommand());
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attach loops
|
* Attach loops, stacking for priority
|
||||||
*/
|
*/
|
||||||
hal->debug->println_P(PSTR("attaching loops"));
|
hal->debug->println_P(PSTR("attaching loops"));
|
||||||
subLoops().push_back(new Loop(loop0Rate, callback0, this));
|
subLoops().push_back(new Loop(loop0Rate, callback0, this));
|
||||||
subLoops().push_back(new Loop(loop1Rate, callback1, this));
|
subLoops().push_back(new Loop(loop1Rate, callback1, this));
|
||||||
subLoops().push_back(new Loop(loop2Rate, callback2, this));
|
subLoops().push_back(new Loop(loop2Rate, callback2, this));
|
||||||
subLoops().push_back(new Loop(loop3Rate, callback3, this));
|
subLoops().push_back(new Loop(loop3Rate, callback3, this));
|
||||||
|
|
||||||
hal->debug->println_P(PSTR("running"));
|
hal->debug->println_P(PSTR("running"));
|
||||||
hal->gcs->sendText(SEVERITY_LOW, PSTR("running"));
|
hal->gcs->sendText(SEVERITY_LOW, PSTR("running"));
|
||||||
hal->setState(MAV_STATE_STANDBY);
|
hal->setState(MAV_STATE_STANDBY);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Autopilot::callback(void * data) {
|
void AP_Autopilot::callback(void * data) {
|
||||||
AP_Autopilot * apo = (AP_Autopilot *) data;
|
AP_Autopilot * apo = (AP_Autopilot *) data;
|
||||||
//apo->hal()->debug->println_P(PSTR("callback"));
|
//apo->hal()->debug->println_P(PSTR("callback"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ahrs update
|
* ahrs update
|
||||||
*/
|
*/
|
||||||
apo->callbackCalls++;
|
apo->callbackCalls++;
|
||||||
if (apo->getNavigator())
|
if (apo->getNavigator())
|
||||||
apo->getNavigator()->updateFast(apo->dt());
|
apo->getNavigator()->updateFast(apo->dt());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Autopilot::callback0(void * data) {
|
void AP_Autopilot::callback0(void * data) {
|
||||||
AP_Autopilot * apo = (AP_Autopilot *) data;
|
AP_Autopilot * apo = (AP_Autopilot *) data;
|
||||||
//apo->getHal()->debug->println_P(PSTR("callback 0"));
|
//apo->getHal()->debug->println_P(PSTR("callback 0"));
|
||||||
|
|
||||||
/*
|
|
||||||
* hardware in the loop
|
|
||||||
*/
|
|
||||||
if (apo->getHal()->hil && apo->getHal()->getMode() != MODE_LIVE) {
|
|
||||||
apo->getHal()->hil->receive();
|
|
||||||
apo->getHal()->hil->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_SCALED);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update control laws
|
* hardware in the loop
|
||||||
*/
|
*/
|
||||||
if (apo->getController()) {
|
if (apo->getHal()->hil && apo->getHal()->getMode() != MODE_LIVE) {
|
||||||
//apo->getHal()->debug->println_P(PSTR("updating controller"));
|
apo->getHal()->hil->receive();
|
||||||
apo->getController()->update(apo->subLoops()[0]->dt());
|
apo->getHal()->hil->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_SCALED);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
char msg[50];
|
/*
|
||||||
sprintf(msg, "c_hdg: %f, c_thr: %f", apo->guide()->headingCommand, apo->guide()->groundSpeedCommand);
|
* update control laws
|
||||||
apo->hal()->gcs->sendText(AP_CommLink::SEVERITY_LOW, msg);
|
*/
|
||||||
*/
|
if (apo->getController()) {
|
||||||
|
//apo->getHal()->debug->println_P(PSTR("updating controller"));
|
||||||
|
apo->getController()->update(apo->subLoops()[0]->dt());
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
char msg[50];
|
||||||
|
sprintf(msg, "c_hdg: %f, c_thr: %f", apo->guide()->headingCommand, apo->guide()->groundSpeedCommand);
|
||||||
|
apo->hal()->gcs->sendText(AP_CommLink::SEVERITY_LOW, msg);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Autopilot::callback1(void * data) {
|
void AP_Autopilot::callback1(void * data) {
|
||||||
AP_Autopilot * apo = (AP_Autopilot *) data;
|
AP_Autopilot * apo = (AP_Autopilot *) data;
|
||||||
//apo->getHal()->debug->println_P(PSTR("callback 1"));
|
//apo->getHal()->debug->println_P(PSTR("callback 1"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update guidance laws
|
* update guidance laws
|
||||||
*/
|
*/
|
||||||
if (apo->getGuide())
|
if (apo->getGuide())
|
||||||
{
|
{
|
||||||
//apo->getHal()->debug->println_P(PSTR("updating guide"));
|
//apo->getHal()->debug->println_P(PSTR("updating guide"));
|
||||||
apo->getGuide()->update();
|
apo->getGuide()->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* slow navigation loop update
|
* slow navigation loop update
|
||||||
*/
|
*/
|
||||||
if (apo->getNavigator()) {
|
if (apo->getNavigator()) {
|
||||||
apo->getNavigator()->updateSlow(apo->subLoops()[1]->dt());
|
apo->getNavigator()->updateSlow(apo->subLoops()[1]->dt());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* send telemetry
|
* send telemetry
|
||||||
*/
|
*/
|
||||||
if (apo->getHal()->gcs) {
|
if (apo->getHal()->gcs) {
|
||||||
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_ATTITUDE);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_ATTITUDE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* handle ground control station communication
|
* handle ground control station communication
|
||||||
*/
|
*/
|
||||||
if (apo->getHal()->gcs) {
|
if (apo->getHal()->gcs) {
|
||||||
// send messages
|
// send messages
|
||||||
apo->getHal()->gcs->requestCmds();
|
apo->getHal()->gcs->requestCmds();
|
||||||
apo->getHal()->gcs->sendParameters();
|
apo->getHal()->gcs->sendParameters();
|
||||||
|
|
||||||
// receive messages
|
// receive messages
|
||||||
apo->getHal()->gcs->receive();
|
apo->getHal()->gcs->receive();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* navigator debug
|
* navigator debug
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
if (apo->navigator()) {
|
if (apo->navigator()) {
|
||||||
apo->getHal()->debug->printf_P(PSTR("roll: %f deg\tpitch: %f deg\tyaw: %f deg\n"),
|
apo->getHal()->debug->printf_P(PSTR("roll: %f deg\tpitch: %f deg\tyaw: %f deg\n"),
|
||||||
apo->navigator()->getRoll()*rad2Deg,
|
apo->navigator()->getRoll()*rad2Deg,
|
||||||
apo->navigator()->getPitch()*rad2Deg,
|
apo->navigator()->getPitch()*rad2Deg,
|
||||||
apo->navigator()->getYaw()*rad2Deg);
|
apo->navigator()->getYaw()*rad2Deg);
|
||||||
apo->getHal()->debug->printf_P(PSTR("lat: %f deg\tlon: %f deg\talt: %f m\n"),
|
apo->getHal()->debug->printf_P(PSTR("lat: %f deg\tlon: %f deg\talt: %f m\n"),
|
||||||
apo->navigator()->getLat()*rad2Deg,
|
apo->navigator()->getLat()*rad2Deg,
|
||||||
apo->navigator()->getLon()*rad2Deg,
|
apo->navigator()->getLon()*rad2Deg,
|
||||||
apo->navigator()->getAlt());
|
apo->navigator()->getAlt());
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Autopilot::callback2(void * data) {
|
void AP_Autopilot::callback2(void * data) {
|
||||||
AP_Autopilot * apo = (AP_Autopilot *) data;
|
AP_Autopilot * apo = (AP_Autopilot *) data;
|
||||||
//apo->getHal()->debug->println_P(PSTR("callback 2"));
|
//apo->getHal()->debug->println_P(PSTR("callback 2"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* send telemetry
|
* send telemetry
|
||||||
*/
|
*/
|
||||||
if (apo->getHal()->gcs) {
|
if (apo->getHal()->gcs) {
|
||||||
// send messages
|
// send messages
|
||||||
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_GPS_RAW);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_GPS_RAW);
|
||||||
//apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_SCALED);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_SCALED);
|
||||||
//apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_GLOBAL_POSITION);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_RAW);
|
||||||
//apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_RC_CHANNELS_RAW);
|
//apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_GLOBAL_POSITION);
|
||||||
//apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_SCALED_IMU);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_SCALED_IMU);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update battery monitor
|
* update battery monitor
|
||||||
*/
|
*/
|
||||||
if (apo->getHal()->batteryMonitor) apo->getHal()->batteryMonitor->update();
|
if (apo->getHal()->batteryMonitor) apo->getHal()->batteryMonitor->update();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* send heartbeat
|
* send heartbeat
|
||||||
*/
|
*/
|
||||||
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_HEARTBEAT);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load/loop rate/ram debug
|
* load/loop rate/ram debug
|
||||||
*/
|
*/
|
||||||
apo->getHal()->load = apo->load();
|
apo->getHal()->load = apo->load();
|
||||||
apo->getHal()->debug->printf_P(PSTR("callback calls: %d\n"),apo->callbackCalls);
|
apo->getHal()->debug->printf_P(PSTR("callback calls: %d\n"),apo->callbackCalls);
|
||||||
apo->callbackCalls = 0;
|
apo->callbackCalls = 0;
|
||||||
apo->getHal()->debug->printf_P(PSTR("load: %d%%\trate: %f Hz\tfree ram: %d bytes\n"),
|
apo->getHal()->debug->printf_P(PSTR("load: %d%%\trate: %f Hz\tfree ram: %d bytes\n"),
|
||||||
apo->load(),1.0/apo->dt(),freeMemory());
|
apo->load(),1.0/apo->dt(),freeMemory());
|
||||||
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
apo->getHal()->gcs->sendMessage(MAVLINK_MSG_ID_SYS_STATUS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* adc debug
|
* adc debug
|
||||||
*/
|
*/
|
||||||
//apo->getDebug().printf_P(PSTR("adc: %d %d %d %d %d %d %d %d\n"),
|
//apo->getDebug().printf_P(PSTR("adc: %d %d %d %d %d %d %d %d\n"),
|
||||||
//apo->adc()->Ch(0), apo->adc()->Ch(1), apo->adc()->Ch(2),
|
//apo->adc()->Ch(0), apo->adc()->Ch(1), apo->adc()->Ch(2),
|
||||||
//apo->adc()->Ch(3), apo->adc()->Ch(4), apo->adc()->Ch(5),
|
//apo->adc()->Ch(3), apo->adc()->Ch(4), apo->adc()->Ch(5),
|
||||||
//apo->adc()->Ch(6), apo->adc()->Ch(7), apo->adc()->Ch(8));
|
//apo->adc()->Ch(6), apo->adc()->Ch(7), apo->adc()->Ch(8));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Autopilot::callback3(void * data) {
|
void AP_Autopilot::callback3(void * data) {
|
||||||
//AP_Autopilot * apo = (AP_Autopilot *) data;
|
//AP_Autopilot * apo = (AP_Autopilot *) data;
|
||||||
//apo->getHal()->debug->println_P(PSTR("callback 3"));
|
//apo->getHal()->debug->println_P(PSTR("callback 3"));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // apo
|
} // apo
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -8,38 +8,7 @@
|
|||||||
#ifndef AP_AUTOPILOT_H_
|
#ifndef AP_AUTOPILOT_H_
|
||||||
#define AP_AUTOPILOT_H_
|
#define AP_AUTOPILOT_H_
|
||||||
|
|
||||||
/*
|
|
||||||
* AVR runtime
|
|
||||||
*/
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <avr/eeprom.h>
|
|
||||||
#include <avr/pgmspace.h>
|
|
||||||
#include <math.h>
|
|
||||||
/*
|
|
||||||
* Libraries
|
|
||||||
*/
|
|
||||||
#include "../AP_Common/AP_Common.h"
|
|
||||||
#include "../FastSerial/FastSerial.h"
|
|
||||||
#include "../AP_GPS/GPS.h"
|
|
||||||
#include "../APM_RC/APM_RC.h"
|
|
||||||
#include "../AP_ADC/AP_ADC.h"
|
|
||||||
#include "../APM_BMP085/APM_BMP085.h"
|
|
||||||
#include "../AP_Compass/AP_Compass.h"
|
|
||||||
#include "../AP_Math/AP_Math.h"
|
|
||||||
#include "../AP_IMU/AP_IMU.h"
|
|
||||||
#include "../AP_DCM/AP_DCM.h"
|
|
||||||
#include "../AP_Common/AP_Loop.h"
|
#include "../AP_Common/AP_Loop.h"
|
||||||
#include "../GCS_MAVLink/GCS_MAVLink.h"
|
|
||||||
#include "../AP_RangeFinder/AP_RangeFinder.h"
|
|
||||||
/*
|
|
||||||
* Local Modules
|
|
||||||
*/
|
|
||||||
#include "AP_HardwareAbstractionLayer.h"
|
|
||||||
#include "AP_RcChannel.h"
|
|
||||||
#include "AP_Controller.h"
|
|
||||||
#include "AP_Navigator.h"
|
|
||||||
#include "AP_Guide.h"
|
|
||||||
#include "AP_CommLink.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ArduPilotOne namespace to protect variables
|
* ArduPilotOne namespace to protect variables
|
||||||
@ -50,7 +19,10 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
// forward declarations
|
// forward declarations
|
||||||
class AP_CommLink;
|
class AP_Navigator;
|
||||||
|
class AP_Guide;
|
||||||
|
class AP_Controller;
|
||||||
|
class AP_HardwareAbstractionLayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class encapsulates the entire autopilot system
|
* This class encapsulates the entire autopilot system
|
||||||
@ -65,90 +37,91 @@ class AP_CommLink;
|
|||||||
*/
|
*/
|
||||||
class AP_Autopilot: public Loop {
|
class AP_Autopilot: public Loop {
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Default constructor
|
* Default constructor
|
||||||
*/
|
*/
|
||||||
AP_Autopilot(AP_Navigator * navigator, AP_Guide * guide,
|
AP_Autopilot(AP_Navigator * navigator, AP_Guide * guide,
|
||||||
AP_Controller * controller, AP_HardwareAbstractionLayer * hal,
|
AP_Controller * controller, AP_HardwareAbstractionLayer * hal,
|
||||||
float loopRate, float loop0Rate, float loop1Rate, float loop2Rate, float loop3Rate);
|
float loopRate, float loop0Rate, float loop1Rate, float loop2Rate, float loop3Rate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
AP_Navigator * getNavigator() {
|
AP_Navigator * getNavigator() {
|
||||||
return _navigator;
|
return _navigator;
|
||||||
}
|
}
|
||||||
AP_Guide * getGuide() {
|
AP_Guide * getGuide() {
|
||||||
return _guide;
|
return _guide;
|
||||||
}
|
}
|
||||||
AP_Controller * getController() {
|
AP_Controller * getController() {
|
||||||
return _controller;
|
return _controller;
|
||||||
}
|
}
|
||||||
AP_HardwareAbstractionLayer * getHal() {
|
AP_HardwareAbstractionLayer * getHal() {
|
||||||
return _hal;
|
return _hal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop Monitoring
|
* Loop Monitoring
|
||||||
*/
|
*/
|
||||||
uint32_t callbackCalls;
|
uint32_t callbackCalls;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop Callbacks (fastest)
|
* Loop Callbacks (fastest)
|
||||||
* - inertial navigation
|
* - inertial navigation
|
||||||
* @param data A void pointer used to pass the apo class
|
* @param data A void pointer used to pass the apo class
|
||||||
* so that the apo public interface may be accessed.
|
* so that the apo public interface may be accessed.
|
||||||
*/
|
*/
|
||||||
static void callback(void * data);
|
static void callback(void * data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop 0 Callbacks
|
* Loop 0 Callbacks
|
||||||
* - control
|
* - control
|
||||||
* - compass reading
|
* - compass reading
|
||||||
* @see callback
|
* @see callback
|
||||||
*/
|
*/
|
||||||
static void callback0(void * data);
|
static void callback0(void * data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop 1 Callbacks
|
* Loop 1 Callbacks
|
||||||
* - gps sensor fusion
|
* - gps sensor fusion
|
||||||
* - compass sensor fusion
|
* - compass sensor fusion
|
||||||
* @see callback
|
* @see callback
|
||||||
*/
|
*/
|
||||||
static void callback1(void * data);
|
static void callback1(void * data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop 2 Callbacks
|
* Loop 2 Callbacks
|
||||||
* - slow messages
|
* - slow messages
|
||||||
* @see callback
|
* @see callback
|
||||||
*/
|
*/
|
||||||
static void callback2(void * data);
|
static void callback2(void * data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loop 3 Callbacks
|
* Loop 3 Callbacks
|
||||||
* - super slow messages
|
* - super slow messages
|
||||||
* - log writing
|
* - log writing
|
||||||
* @see callback
|
* @see callback
|
||||||
*/
|
*/
|
||||||
static void callback3(void * data);
|
static void callback3(void * data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Components
|
* Components
|
||||||
*/
|
*/
|
||||||
AP_Navigator * _navigator;
|
AP_Navigator * _navigator;
|
||||||
AP_Guide * _guide;
|
AP_Guide * _guide;
|
||||||
AP_Controller * _controller;
|
AP_Controller * _controller;
|
||||||
AP_HardwareAbstractionLayer * _hal;
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constants
|
* Constants
|
||||||
*/
|
*/
|
||||||
static const float deg2rad = M_PI / 180;
|
static const float deg2rad = M_PI / 180;
|
||||||
static const float rad2deg = 180 / M_PI;
|
static const float rad2deg = 180 / M_PI;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* AP_AUTOPILOT_H_ */
|
#endif /* AP_AUTOPILOT_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -8,3 +8,5 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
} // apo
|
} // apo
|
||||||
|
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -13,39 +13,40 @@ namespace apo {
|
|||||||
|
|
||||||
class AP_BatteryMonitor {
|
class AP_BatteryMonitor {
|
||||||
public:
|
public:
|
||||||
AP_BatteryMonitor(uint8_t pin, float voltageDivRatio, float minVolt, float maxVolt) :
|
AP_BatteryMonitor(uint8_t pin, float voltageDivRatio, float minVolt, float maxVolt) :
|
||||||
_pin(pin), _voltageDivRatio(voltageDivRatio),
|
_pin(pin), _voltageDivRatio(voltageDivRatio),
|
||||||
_minVolt(minVolt), _maxVolt(maxVolt), _voltage(maxVolt) {
|
_minVolt(minVolt), _maxVolt(maxVolt), _voltage(maxVolt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void update() {
|
void update() {
|
||||||
// low pass filter on voltage
|
// low pass filter on voltage
|
||||||
_voltage = _voltage*.9 + (analogRead(_pin)/255)*_voltageDivRatio*0.1;
|
_voltage = _voltage*.9 + (analogRead(_pin)/255)*_voltageDivRatio*0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
float getVoltage() {
|
float getVoltage() {
|
||||||
return _voltage;
|
return _voltage;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getPercentage() {
|
uint8_t getPercentage() {
|
||||||
float norm = (_voltage-_minVolt)/(_maxVolt-_minVolt);
|
float norm = (_voltage-_minVolt)/(_maxVolt-_minVolt);
|
||||||
if (norm < 0) norm = 0;
|
if (norm < 0) norm = 0;
|
||||||
else if (norm > 1) norm = 1;
|
else if (norm > 1) norm = 1;
|
||||||
return 100*norm;
|
return 100*norm;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
uint8_t _pin;
|
uint8_t _pin;
|
||||||
float _voltageDivRatio;
|
float _voltageDivRatio;
|
||||||
float _voltage;
|
float _voltage;
|
||||||
float _minVolt;
|
float _minVolt;
|
||||||
float _maxVolt;
|
float _maxVolt;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* AP_BATTERYMONITOR_H_ */
|
#endif /* AP_BATTERYMONITOR_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "../AP_Common/AP_Common.h"
|
#include "../AP_Common/AP_Common.h"
|
||||||
#include "../AP_Common/AP_Vector.h"
|
#include "../AP_Common/AP_Vector.h"
|
||||||
#include "AP_MavlinkCommand.h"
|
#include "../GCS_MAVLink/GCS_MAVLink.h"
|
||||||
|
|
||||||
class FastSerial;
|
class FastSerial;
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ class AP_Guide;
|
|||||||
class AP_HardwareAbstractionLayer;
|
class AP_HardwareAbstractionLayer;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SEVERITY_LOW, SEVERITY_MED, SEVERITY_HIGH
|
SEVERITY_LOW, SEVERITY_MED, SEVERITY_HIGH
|
||||||
};
|
};
|
||||||
|
|
||||||
// forward declarations
|
// forward declarations
|
||||||
@ -45,83 +45,83 @@ enum {
|
|||||||
class AP_CommLink {
|
class AP_CommLink {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
AP_CommLink(FastSerial * link, AP_Navigator * navigator, AP_Guide * guide,
|
AP_CommLink(FastSerial * link, AP_Navigator * navigator, AP_Guide * guide,
|
||||||
AP_Controller * controller, AP_HardwareAbstractionLayer * hal);
|
AP_Controller * controller, AP_HardwareAbstractionLayer * hal);
|
||||||
virtual void send() = 0;
|
virtual void send() = 0;
|
||||||
virtual void receive() = 0;
|
virtual void receive() = 0;
|
||||||
virtual void sendMessage(uint8_t id, uint32_t param = 0) = 0;
|
virtual void sendMessage(uint8_t id, uint32_t param = 0) = 0;
|
||||||
virtual void sendText(uint8_t severity, const char *str) = 0;
|
virtual void sendText(uint8_t severity, const char *str) = 0;
|
||||||
virtual void sendText(uint8_t severity, const prog_char_t *str) = 0;
|
virtual void sendText(uint8_t severity, const prog_char_t *str) = 0;
|
||||||
virtual void acknowledge(uint8_t id, uint8_t sum1, uint8_t sum2) = 0;
|
virtual void acknowledge(uint8_t id, uint8_t sum1, uint8_t sum2) = 0;
|
||||||
virtual void sendParameters() = 0;
|
virtual void sendParameters() = 0;
|
||||||
virtual void requestCmds() = 0;
|
virtual void requestCmds() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
FastSerial * _link;
|
FastSerial * _link;
|
||||||
AP_Navigator * _navigator;
|
AP_Navigator * _navigator;
|
||||||
AP_Guide * _guide;
|
AP_Guide * _guide;
|
||||||
AP_Controller * _controller;
|
AP_Controller * _controller;
|
||||||
AP_HardwareAbstractionLayer * _hal;
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MavlinkComm: public AP_CommLink {
|
class MavlinkComm: public AP_CommLink {
|
||||||
public:
|
public:
|
||||||
MavlinkComm(FastSerial * link, AP_Navigator * nav, AP_Guide * guide,
|
MavlinkComm(FastSerial * link, AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_Controller * controller, AP_HardwareAbstractionLayer * hal);
|
AP_Controller * controller, AP_HardwareAbstractionLayer * hal);
|
||||||
|
|
||||||
virtual void send();
|
virtual void send();
|
||||||
void sendMessage(uint8_t id, uint32_t param = 0);
|
void sendMessage(uint8_t id, uint32_t param = 0);
|
||||||
virtual void receive();
|
virtual void receive();
|
||||||
void sendText(uint8_t severity, const char *str);
|
void sendText(uint8_t severity, const char *str);
|
||||||
void sendText(uint8_t severity, const prog_char_t *str);
|
void sendText(uint8_t severity, const prog_char_t *str);
|
||||||
void acknowledge(uint8_t id, uint8_t sum1, uint8_t sum2);
|
void acknowledge(uint8_t id, uint8_t sum1, uint8_t sum2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sends parameters one at a time
|
* sends parameters one at a time
|
||||||
*/
|
*/
|
||||||
void sendParameters();
|
void sendParameters();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* request commands one at a time
|
* request commands one at a time
|
||||||
*/
|
*/
|
||||||
void requestCmds();
|
void requestCmds();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// options
|
// options
|
||||||
bool _useRelativeAlt;
|
bool _useRelativeAlt;
|
||||||
|
|
||||||
// commands
|
// commands
|
||||||
bool _sendingCmds;
|
bool _sendingCmds;
|
||||||
bool _receivingCmds;
|
bool _receivingCmds;
|
||||||
uint16_t _cmdTimeLastSent;
|
uint16_t _cmdTimeLastSent;
|
||||||
uint16_t _cmdTimeLastReceived;
|
uint16_t _cmdTimeLastReceived;
|
||||||
uint16_t _cmdDestSysId;
|
uint16_t _cmdDestSysId;
|
||||||
uint16_t _cmdDestCompId;
|
uint16_t _cmdDestCompId;
|
||||||
uint16_t _cmdRequestIndex;
|
uint16_t _cmdRequestIndex;
|
||||||
uint16_t _cmdNumberRequested;
|
uint16_t _cmdNumberRequested;
|
||||||
uint16_t _cmdMax;
|
uint16_t _cmdMax;
|
||||||
Vector<mavlink_command_t *> _cmdList;
|
Vector<mavlink_command_t *> _cmdList;
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
static uint8_t _paramNameLengthMax;
|
static uint8_t _paramNameLengthMax;
|
||||||
uint16_t _parameterCount;
|
uint16_t _parameterCount;
|
||||||
AP_Var * _queuedParameter;
|
AP_Var * _queuedParameter;
|
||||||
uint16_t _queuedParameterIndex;
|
uint16_t _queuedParameterIndex;
|
||||||
|
|
||||||
// channel
|
// channel
|
||||||
mavlink_channel_t _channel;
|
mavlink_channel_t _channel;
|
||||||
uint16_t _packetDrops;
|
uint16_t _packetDrops;
|
||||||
static uint8_t _nChannels;
|
static uint8_t _nChannels;
|
||||||
|
|
||||||
void _handleMessage(mavlink_message_t * msg);
|
void _handleMessage(mavlink_message_t * msg);
|
||||||
|
|
||||||
uint16_t _countParameters();
|
uint16_t _countParameters();
|
||||||
|
|
||||||
AP_Var * _findParameter(uint16_t index);
|
AP_Var * _findParameter(uint16_t index);
|
||||||
|
|
||||||
// check the target
|
// check the target
|
||||||
uint8_t _checkTarget(uint8_t sysid, uint8_t compid);
|
uint8_t _checkTarget(uint8_t sysid, uint8_t compid);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,28 +6,118 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AP_Controller.h"
|
#include "AP_Controller.h"
|
||||||
|
#include "../FastSerial/FastSerial.h"
|
||||||
|
#include "AP_ArmingMechanism.h"
|
||||||
|
#include "AP_BatteryMonitor.h"
|
||||||
#include "AP_HardwareAbstractionLayer.h"
|
#include "AP_HardwareAbstractionLayer.h"
|
||||||
#include "../AP_Common/include/menu.h"
|
#include "../AP_Common/include/menu.h"
|
||||||
#include "AP_RcChannel.h"
|
#include "AP_RcChannel.h"
|
||||||
|
#include "../GCS_MAVLink/include/mavlink_types.h"
|
||||||
|
#include "constants.h"
|
||||||
|
#include "AP_CommLink.h"
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
AP_Controller::AP_Controller(AP_Navigator * nav, AP_Guide * guide,
|
AP_Controller::AP_Controller(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal, AP_ArmingMechanism * armingMechanism,
|
||||||
_nav(nav), _guide(guide), _hal(hal) {
|
const uint8_t chMode, const uint16_t key, const prog_char_t * name) :
|
||||||
setAllRadioChannelsToNeutral();
|
_nav(nav), _guide(guide), _hal(hal), _armingMechanism(armingMechanism),
|
||||||
|
_group(key, name ? : PSTR("CNTRL_")),
|
||||||
|
_chMode(chMode),
|
||||||
|
_mode(&_group, 1, MAV_MODE_LOCKED, PSTR("MODE")) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Controller::setAllRadioChannelsToNeutral() {
|
void AP_Controller::setAllRadioChannelsToNeutral() {
|
||||||
for (uint8_t i = 0; i < _hal->rc.getSize(); i++) {
|
for (uint8_t i = 0; i < _hal->rc.getSize(); i++) {
|
||||||
_hal->rc[i]->setPosition(0.0);
|
_hal->rc[i]->setPosition(0.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Controller::setAllRadioChannelsManually() {
|
void AP_Controller::setAllRadioChannelsManually() {
|
||||||
for (uint8_t i = 0; i < _hal->rc.getSize(); i++) {
|
for (uint8_t i = 0; i < _hal->rc.getSize(); i++) {
|
||||||
_hal->rc[i]->setUsingRadio();
|
_hal->rc[i]->setUsingRadio();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AP_Controller::update(const float dt) {
|
||||||
|
if (_armingMechanism) _armingMechanism->update(dt);
|
||||||
|
|
||||||
|
// determine flight mode
|
||||||
|
//
|
||||||
|
// check for heartbeat from gcs, if not found go to failsafe
|
||||||
|
if (_hal->heartBeatLost()) {
|
||||||
|
_mode = MAV_MODE_FAILSAFE;
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("configure gcs to send heartbeat"));
|
||||||
|
// if battery less than 5%, go to failsafe
|
||||||
|
} else if (_hal->batteryMonitor && _hal->batteryMonitor->getPercentage() < 5) {
|
||||||
|
_mode = MAV_MODE_FAILSAFE;
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("recharge battery"));
|
||||||
|
// manual/auto switch
|
||||||
|
} else {
|
||||||
|
// if all emergencies cleared, fall back to standby
|
||||||
|
if (_hal->getState()==MAV_STATE_EMERGENCY) _hal->setState(MAV_STATE_STANDBY);
|
||||||
|
if (_hal->rc[_chMode]->getRadioPosition() > 0) _mode = MAV_MODE_MANUAL;
|
||||||
|
else _mode = MAV_MODE_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle flight modes
|
||||||
|
switch(_mode) {
|
||||||
|
|
||||||
|
case MAV_MODE_LOCKED: {
|
||||||
|
_hal->setState(MAV_STATE_STANDBY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MAV_MODE_FAILSAFE: {
|
||||||
|
_hal->setState(MAV_STATE_EMERGENCY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MAV_MODE_MANUAL: {
|
||||||
|
manualLoop(dt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MAV_MODE_AUTO: {
|
||||||
|
autoLoop(dt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
_hal->gcs->sendText(SEVERITY_HIGH, PSTR("unknown mode"));
|
||||||
|
_hal->setState(MAV_STATE_EMERGENCY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this sends commands to motors
|
||||||
|
setMotors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AP_Controller::setMotors() {
|
||||||
|
switch (_hal->getState()) {
|
||||||
|
|
||||||
|
case MAV_STATE_ACTIVE: {
|
||||||
|
digitalWrite(_hal->aLedPin, HIGH);
|
||||||
|
setMotorsActive();
|
||||||
|
}
|
||||||
|
case MAV_STATE_EMERGENCY: {
|
||||||
|
digitalWrite(_hal->aLedPin, LOW);
|
||||||
|
setMotorsEmergency();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MAV_STATE_STANDBY: {
|
||||||
|
digitalWrite(_hal->aLedPin,LOW);
|
||||||
|
setMotorsStandby();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
setMotorsStandby();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace apo
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include "../GCS_MAVLink/GCS_MAVLink.h"
|
#include "../GCS_MAVLink/GCS_MAVLink.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "../AP_Common/AP_Var.h"
|
||||||
|
#include "AP_Var_keys.h"
|
||||||
|
|
||||||
class AP_Var_group;
|
class AP_Var_group;
|
||||||
|
|
||||||
@ -31,269 +33,293 @@ class AP_HardwareAbstractionLayer;
|
|||||||
class AP_Guide;
|
class AP_Guide;
|
||||||
class AP_Navigator;
|
class AP_Navigator;
|
||||||
class Menu;
|
class Menu;
|
||||||
|
class AP_ArmingMechanism;
|
||||||
|
|
||||||
/// Controller class
|
/// Controller class
|
||||||
class AP_Controller {
|
class AP_Controller {
|
||||||
public:
|
public:
|
||||||
AP_Controller(AP_Navigator * nav, AP_Guide * guide,
|
AP_Controller(AP_Navigator * nav, AP_Guide * guide,
|
||||||
AP_HardwareAbstractionLayer * hal);
|
AP_HardwareAbstractionLayer * hal,
|
||||||
virtual void update(const float & dt) = 0;
|
AP_ArmingMechanism * armingMechanism,
|
||||||
virtual MAV_MODE getMode() = 0;
|
const uint8_t _chMode,
|
||||||
void setAllRadioChannelsToNeutral();
|
const uint16_t key = k_cntrl,
|
||||||
void setAllRadioChannelsManually();
|
const prog_char_t * name = NULL);
|
||||||
|
virtual void update(const float dt);
|
||||||
|
void setAllRadioChannelsToNeutral();
|
||||||
|
void setAllRadioChannelsManually();
|
||||||
|
virtual void setMotors();
|
||||||
|
virtual void setMotorsActive() = 0;
|
||||||
|
virtual void setMotorsEmergency() {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
};
|
||||||
|
virtual void setMotorsStandby() {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
};
|
||||||
|
virtual void manualLoop(const float dt) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
};
|
||||||
|
virtual void autoLoop(const float dt) {
|
||||||
|
setAllRadioChannelsToNeutral();
|
||||||
|
};
|
||||||
|
AP_Uint8 getMode() {
|
||||||
|
return _mode;
|
||||||
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Navigator * _nav;
|
AP_Navigator * _nav;
|
||||||
AP_Guide * _guide;
|
AP_Guide * _guide;
|
||||||
AP_HardwareAbstractionLayer * _hal;
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
|
AP_ArmingMechanism * _armingMechanism;
|
||||||
|
uint8_t _chMode;
|
||||||
|
AP_Var_group _group;
|
||||||
|
AP_Uint8 _mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AP_ControllerBlock {
|
class AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
AP_ControllerBlock(AP_Var_group * group, uint8_t groupStart,
|
AP_ControllerBlock(AP_Var_group * group, uint8_t groupStart,
|
||||||
uint8_t groupLength) :
|
uint8_t groupLength) :
|
||||||
_group(group), _groupStart(groupStart),
|
_group(group), _groupStart(groupStart),
|
||||||
_groupEnd(groupStart + groupLength) {
|
_groupEnd(groupStart + groupLength) {
|
||||||
}
|
}
|
||||||
uint8_t getGroupEnd() {
|
uint8_t getGroupEnd() {
|
||||||
return _groupEnd;
|
return _groupEnd;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Var_group * _group; /// helps with parameter management
|
AP_Var_group * _group; /// helps with parameter management
|
||||||
uint8_t _groupStart;
|
uint8_t _groupStart;
|
||||||
uint8_t _groupEnd;
|
uint8_t _groupEnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockLowPass: public AP_ControllerBlock {
|
class BlockLowPass: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockLowPass(AP_Var_group * group, uint8_t groupStart, float fCut,
|
BlockLowPass(AP_Var_group * group, uint8_t groupStart, float fCut,
|
||||||
const prog_char_t * fCutLabel = NULL) :
|
const prog_char_t * fCutLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 1),
|
AP_ControllerBlock(group, groupStart, 1),
|
||||||
_fCut(group, groupStart, fCut, fCutLabel ? : PSTR("fCut")),
|
_fCut(group, groupStart, fCut, fCutLabel ? : PSTR("fCut")),
|
||||||
_y(0) {
|
_y(0) {
|
||||||
}
|
}
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
float RC = 1 / (2 * M_PI * _fCut); // low pass filter
|
float RC = 1 / (2 * M_PI * _fCut); // low pass filter
|
||||||
_y = _y + (input - _y) * (dt / (dt + RC));
|
_y = _y + (input - _y) * (dt / (dt + RC));
|
||||||
return _y;
|
return _y;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Float _fCut;
|
AP_Float _fCut;
|
||||||
float _y;
|
float _y;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockSaturation: public AP_ControllerBlock {
|
class BlockSaturation: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockSaturation(AP_Var_group * group, uint8_t groupStart, float yMax,
|
BlockSaturation(AP_Var_group * group, uint8_t groupStart, float yMax,
|
||||||
const prog_char_t * yMaxLabel = NULL) :
|
const prog_char_t * yMaxLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 1),
|
AP_ControllerBlock(group, groupStart, 1),
|
||||||
_yMax(group, groupStart, yMax, yMaxLabel ? : PSTR("yMax")) {
|
_yMax(group, groupStart, yMax, yMaxLabel ? : PSTR("yMax")) {
|
||||||
}
|
}
|
||||||
float update(const float & input) {
|
float update(const float & input) {
|
||||||
|
|
||||||
// pid sum
|
// pid sum
|
||||||
float y = input;
|
float y = input;
|
||||||
|
|
||||||
// saturation
|
// saturation
|
||||||
if (y > _yMax)
|
if (y > _yMax)
|
||||||
y = _yMax;
|
y = _yMax;
|
||||||
if (y < -_yMax)
|
if (y < -_yMax)
|
||||||
y = -_yMax;
|
y = -_yMax;
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Float _yMax; /// output saturation
|
AP_Float _yMax; /// output saturation
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockDerivative {
|
class BlockDerivative {
|
||||||
public:
|
public:
|
||||||
BlockDerivative() :
|
BlockDerivative() :
|
||||||
_lastInput(0), firstRun(true) {
|
_lastInput(0), firstRun(true) {
|
||||||
}
|
}
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
float derivative = (input - _lastInput) / dt;
|
float derivative = (input - _lastInput) / dt;
|
||||||
_lastInput = input;
|
_lastInput = input;
|
||||||
if (firstRun) {
|
if (firstRun) {
|
||||||
firstRun = false;
|
firstRun = false;
|
||||||
return 0;
|
return 0;
|
||||||
} else
|
} else
|
||||||
return derivative;
|
return derivative;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
float _lastInput; /// last input
|
float _lastInput; /// last input
|
||||||
bool firstRun;
|
bool firstRun;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockIntegral {
|
class BlockIntegral {
|
||||||
public:
|
public:
|
||||||
BlockIntegral() :
|
BlockIntegral() :
|
||||||
_i(0) {
|
_i(0) {
|
||||||
}
|
}
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
_i += input * dt;
|
_i += input * dt;
|
||||||
return _i;
|
return _i;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
float _i; /// integral
|
float _i; /// integral
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockP: public AP_ControllerBlock {
|
class BlockP: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockP(AP_Var_group * group, uint8_t groupStart, float kP,
|
BlockP(AP_Var_group * group, uint8_t groupStart, float kP,
|
||||||
const prog_char_t * kPLabel = NULL) :
|
const prog_char_t * kPLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 1),
|
AP_ControllerBlock(group, groupStart, 1),
|
||||||
_kP(group, groupStart, kP, kPLabel ? : PSTR("p")) {
|
_kP(group, groupStart, kP, kPLabel ? : PSTR("p")) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float update(const float & input) {
|
float update(const float & input) {
|
||||||
return _kP * input;
|
return _kP * input;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Float _kP; /// proportional gain
|
AP_Float _kP; /// proportional gain
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockI: public AP_ControllerBlock {
|
class BlockI: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockI(AP_Var_group * group, uint8_t groupStart, float kI, float iMax,
|
BlockI(AP_Var_group * group, uint8_t groupStart, float kI, float iMax,
|
||||||
const prog_char_t * kILabel = NULL,
|
const prog_char_t * kILabel = NULL,
|
||||||
const prog_char_t * iMaxLabel = NULL) :
|
const prog_char_t * iMaxLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 2),
|
AP_ControllerBlock(group, groupStart, 2),
|
||||||
_kI(group, groupStart, kI, kILabel ? : PSTR("i")),
|
_kI(group, groupStart, kI, kILabel ? : PSTR("i")),
|
||||||
_blockSaturation(group, groupStart + 1, iMax, iMaxLabel ? : PSTR("iMax")),
|
_blockSaturation(group, groupStart + 1, iMax, iMaxLabel ? : PSTR("iMax")),
|
||||||
_eI(0) {
|
_eI(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
// integral
|
// integral
|
||||||
_eI += input * dt;
|
_eI += input * dt;
|
||||||
_eI = _blockSaturation.update(_eI);
|
_eI = _blockSaturation.update(_eI);
|
||||||
return _kI * _eI;
|
return _kI * _eI;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
AP_Float _kI; /// integral gain
|
AP_Float _kI; /// integral gain
|
||||||
BlockSaturation _blockSaturation; /// integrator saturation
|
BlockSaturation _blockSaturation; /// integrator saturation
|
||||||
float _eI; /// integral of input
|
float _eI; /// integral of input
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockD: public AP_ControllerBlock {
|
class BlockD: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockD(AP_Var_group * group, uint8_t groupStart, float kD, uint8_t dFCut,
|
BlockD(AP_Var_group * group, uint8_t groupStart, float kD, uint8_t dFCut,
|
||||||
const prog_char_t * kDLabel = NULL,
|
const prog_char_t * kDLabel = NULL,
|
||||||
const prog_char_t * dFCutLabel = NULL) :
|
const prog_char_t * dFCutLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 2),
|
AP_ControllerBlock(group, groupStart, 2),
|
||||||
_blockLowPass(group, groupStart, dFCut,
|
_blockLowPass(group, groupStart, dFCut,
|
||||||
dFCutLabel ? : PSTR("dFCut")),
|
dFCutLabel ? : PSTR("dFCut")),
|
||||||
_kD(group, _blockLowPass.getGroupEnd(), kD,
|
_kD(group, _blockLowPass.getGroupEnd(), kD,
|
||||||
kDLabel ? : PSTR("d")), _eP(0) {
|
kDLabel ? : PSTR("d")), _eP(0) {
|
||||||
}
|
}
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
// derivative with low pass
|
// derivative with low pass
|
||||||
float _eD = _blockLowPass.update((_eP - input) / dt, dt);
|
float _eD = _blockLowPass.update((_eP - input) / dt, dt);
|
||||||
// proportional, note must come after derivative
|
// proportional, note must come after derivative
|
||||||
// because derivatve uses _eP as previous value
|
// because derivatve uses _eP as previous value
|
||||||
_eP = input;
|
_eP = input;
|
||||||
return _kD * _eD;
|
return _kD * _eD;
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
BlockLowPass _blockLowPass;
|
BlockLowPass _blockLowPass;
|
||||||
AP_Float _kD; /// derivative gain
|
AP_Float _kD; /// derivative gain
|
||||||
float _eP; /// input
|
float _eP; /// input
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockPID: public AP_ControllerBlock {
|
class BlockPID: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockPID(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
BlockPID(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
||||||
float kD, float iMax, float yMax, uint8_t dFcut) :
|
float kD, float iMax, float yMax, uint8_t dFcut) :
|
||||||
AP_ControllerBlock(group, groupStart, 6),
|
AP_ControllerBlock(group, groupStart, 6),
|
||||||
_blockP(group, groupStart, kP),
|
_blockP(group, groupStart, kP),
|
||||||
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
||||||
_blockD(group, _blockI.getGroupEnd(), kD, dFcut),
|
_blockD(group, _blockI.getGroupEnd(), kD, dFcut),
|
||||||
_blockSaturation(group, _blockD.getGroupEnd(), yMax) {
|
_blockSaturation(group, _blockD.getGroupEnd(), yMax) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
return _blockSaturation.update(
|
return _blockSaturation.update(
|
||||||
_blockP.update(input) + _blockI.update(input, dt)
|
_blockP.update(input) + _blockI.update(input, dt)
|
||||||
+ _blockD.update(input, dt));
|
+ _blockD.update(input, dt));
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
BlockP _blockP;
|
BlockP _blockP;
|
||||||
BlockI _blockI;
|
BlockI _blockI;
|
||||||
BlockD _blockD;
|
BlockD _blockD;
|
||||||
BlockSaturation _blockSaturation;
|
BlockSaturation _blockSaturation;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockPI: public AP_ControllerBlock {
|
class BlockPI: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockPI(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
BlockPI(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
||||||
float iMax, float yMax) :
|
float iMax, float yMax) :
|
||||||
AP_ControllerBlock(group, groupStart, 4),
|
AP_ControllerBlock(group, groupStart, 4),
|
||||||
_blockP(group, groupStart, kP),
|
_blockP(group, groupStart, kP),
|
||||||
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
||||||
_blockSaturation(group, _blockI.getGroupEnd(), yMax) {
|
_blockSaturation(group, _blockI.getGroupEnd(), yMax) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
|
|
||||||
float y = _blockP.update(input) + _blockI.update(input, dt);
|
float y = _blockP.update(input) + _blockI.update(input, dt);
|
||||||
return _blockSaturation.update(y);
|
return _blockSaturation.update(y);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
BlockP _blockP;
|
BlockP _blockP;
|
||||||
BlockI _blockI;
|
BlockI _blockI;
|
||||||
BlockSaturation _blockSaturation;
|
BlockSaturation _blockSaturation;
|
||||||
};
|
};
|
||||||
|
|
||||||
class BlockPD: public AP_ControllerBlock {
|
class BlockPD: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockPD(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
BlockPD(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
||||||
float kD, float iMax, float yMax, uint8_t dFcut) :
|
float kD, float iMax, float yMax, uint8_t dFcut) :
|
||||||
AP_ControllerBlock(group, groupStart, 4),
|
AP_ControllerBlock(group, groupStart, 4),
|
||||||
_blockP(group, groupStart, kP),
|
_blockP(group, groupStart, kP),
|
||||||
_blockD(group, _blockP.getGroupEnd(), kD, dFcut),
|
_blockD(group, _blockP.getGroupEnd(), kD, dFcut),
|
||||||
_blockSaturation(group, _blockD.getGroupEnd(), yMax) {
|
_blockSaturation(group, _blockD.getGroupEnd(), yMax) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float update(const float & input, const float & dt) {
|
float update(const float & input, const float & dt) {
|
||||||
|
|
||||||
float y = _blockP.update(input) + _blockD.update(input, dt);
|
float y = _blockP.update(input) + _blockD.update(input, dt);
|
||||||
return _blockSaturation.update(y);
|
return _blockSaturation.update(y);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
BlockP _blockP;
|
BlockP _blockP;
|
||||||
BlockD _blockD;
|
BlockD _blockD;
|
||||||
BlockSaturation _blockSaturation;
|
BlockSaturation _blockSaturation;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// PID with derivative feedback (ignores reference derivative)
|
/// PID with derivative feedback (ignores reference derivative)
|
||||||
class BlockPIDDfb: public AP_ControllerBlock {
|
class BlockPIDDfb: public AP_ControllerBlock {
|
||||||
public:
|
public:
|
||||||
BlockPIDDfb(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
BlockPIDDfb(AP_Var_group * group, uint8_t groupStart, float kP, float kI,
|
||||||
float kD, float iMax, float yMax, float dFCut,
|
float kD, float iMax, float yMax, float dFCut,
|
||||||
const prog_char_t * dFCutLabel = NULL,
|
const prog_char_t * dFCutLabel = NULL,
|
||||||
const prog_char_t * dLabel = NULL) :
|
const prog_char_t * dLabel = NULL) :
|
||||||
AP_ControllerBlock(group, groupStart, 5),
|
AP_ControllerBlock(group, groupStart, 5),
|
||||||
_blockP(group, groupStart, kP),
|
_blockP(group, groupStart, kP),
|
||||||
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
_blockI(group, _blockP.getGroupEnd(), kI, iMax),
|
||||||
_blockSaturation(group, _blockI.getGroupEnd(), yMax),
|
_blockSaturation(group, _blockI.getGroupEnd(), yMax),
|
||||||
_blockLowPass(group, _blockSaturation.getGroupEnd(), dFCut,
|
_blockLowPass(group, _blockSaturation.getGroupEnd(), dFCut,
|
||||||
dFCutLabel ? : PSTR("dFCut")),
|
dFCutLabel ? : PSTR("dFCut")),
|
||||||
_kD(group, _blockLowPass.getGroupEnd(), kD, dLabel ? : PSTR("d"))
|
_kD(group, _blockLowPass.getGroupEnd(), kD, dLabel ? : PSTR("d"))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
float update(const float & input, const float & derivative,
|
float update(const float & input, const float & derivative,
|
||||||
const float & dt) {
|
const float & dt) {
|
||||||
|
|
||||||
float y = _blockP.update(input) + _blockI.update(input, dt) - _kD
|
float y = _blockP.update(input) + _blockI.update(input, dt) - _kD
|
||||||
* _blockLowPass.update(derivative,dt);
|
* _blockLowPass.update(derivative,dt);
|
||||||
return _blockSaturation.update(y);
|
return _blockSaturation.update(y);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
BlockP _blockP;
|
BlockP _blockP;
|
||||||
BlockI _blockI;
|
BlockI _blockI;
|
||||||
BlockSaturation _blockSaturation;
|
BlockSaturation _blockSaturation;
|
||||||
BlockLowPass _blockLowPass;
|
BlockLowPass _blockLowPass;
|
||||||
AP_Float _kD; /// derivative gain
|
AP_Float _kD; /// derivative gain
|
||||||
};
|
};
|
||||||
|
|
||||||
} // apo
|
} // apo
|
||||||
|
@ -15,65 +15,75 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
AP_Guide::AP_Guide(AP_Navigator * navigator, AP_HardwareAbstractionLayer * hal) :
|
AP_Guide::AP_Guide(AP_Navigator * navigator, AP_HardwareAbstractionLayer * hal) :
|
||||||
_navigator(navigator), _hal(hal), _command(AP_MavlinkCommand::home),
|
_navigator(navigator), _hal(hal), _command(AP_MavlinkCommand::home),
|
||||||
_previousCommand(AP_MavlinkCommand::home),
|
_previousCommand(AP_MavlinkCommand::home),
|
||||||
_headingCommand(0), _airSpeedCommand(0),
|
_headingCommand(0), _airSpeedCommand(0),
|
||||||
_groundSpeedCommand(0), _altitudeCommand(0), _pNCmd(0),
|
_groundSpeedCommand(0), _altitudeCommand(0), _pNCmd(0),
|
||||||
_pECmd(0), _pDCmd(0), _mode(MAV_NAV_LOST),
|
_pECmd(0), _pDCmd(0), _mode(MAV_NAV_LOST),
|
||||||
_numberOfCommands(1), _cmdIndex(0), _nextCommandCalls(0),
|
_numberOfCommands(1), _cmdIndex(0), _nextCommandCalls(0),
|
||||||
_nextCommandTimer(0) {
|
_nextCommandTimer(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Guide::setCurrentIndex(uint8_t val){
|
void AP_Guide::setCurrentIndex(uint8_t val) {
|
||||||
_cmdIndex.set_and_save(val);
|
_cmdIndex.set_and_save(val);
|
||||||
_command = AP_MavlinkCommand(getCurrentIndex());
|
_command = AP_MavlinkCommand(getCurrentIndex());
|
||||||
_previousCommand = AP_MavlinkCommand(getPreviousIndex());
|
_previousCommand = AP_MavlinkCommand(getPreviousIndex());
|
||||||
_hal->gcs->sendMessage(MAVLINK_MSG_ID_WAYPOINT_CURRENT);
|
_hal->gcs->sendMessage(MAVLINK_MSG_ID_WAYPOINT_CURRENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
float AP_Guide::getHeadingError() {
|
||||||
|
float headingError = getHeadingCommand()
|
||||||
|
- _navigator->getYaw();
|
||||||
|
if (headingError > 180 * deg2Rad)
|
||||||
|
headingError -= 360 * deg2Rad;
|
||||||
|
if (headingError < -180 * deg2Rad)
|
||||||
|
headingError += 360 * deg2Rad;
|
||||||
|
return headingError;
|
||||||
}
|
}
|
||||||
|
|
||||||
MavlinkGuide::MavlinkGuide(AP_Navigator * navigator,
|
MavlinkGuide::MavlinkGuide(AP_Navigator * navigator,
|
||||||
AP_HardwareAbstractionLayer * hal) :
|
AP_HardwareAbstractionLayer * hal, float velCmd, float xt, float xtLim) :
|
||||||
AP_Guide(navigator, hal), _rangeFinderFront(), _rangeFinderBack(),
|
AP_Guide(navigator, hal), _rangeFinderFront(), _rangeFinderBack(),
|
||||||
_rangeFinderLeft(), _rangeFinderRight(),
|
_rangeFinderLeft(), _rangeFinderRight(),
|
||||||
_group(k_guide, PSTR("guide_")),
|
_group(k_guide, PSTR("guide_")),
|
||||||
_velocityCommand(&_group, 1, 1, PSTR("velCmd")),
|
_velocityCommand(&_group, 1, velCmd, PSTR("velCmd")),
|
||||||
_crossTrackGain(&_group, 2, 1, PSTR("xt")),
|
_crossTrackGain(&_group, 2, xt, PSTR("xt")),
|
||||||
_crossTrackLim(&_group, 3, 90, PSTR("xtLim")) {
|
_crossTrackLim(&_group, 3, xtLim, PSTR("xtLim")) {
|
||||||
|
|
||||||
for (uint8_t i = 0; i < _hal->rangeFinders.getSize(); i++) {
|
for (uint8_t i = 0; i < _hal->rangeFinders.getSize(); i++) {
|
||||||
RangeFinder * rF = _hal->rangeFinders[i];
|
RangeFinder * rF = _hal->rangeFinders[i];
|
||||||
if (rF == NULL)
|
if (rF == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (rF->orientation_x == 1 && rF->orientation_y == 0
|
if (rF->orientation_x == 1 && rF->orientation_y == 0
|
||||||
&& rF->orientation_z == 0)
|
&& rF->orientation_z == 0)
|
||||||
_rangeFinderFront = rF;
|
_rangeFinderFront = rF;
|
||||||
else if (rF->orientation_x == -1 && rF->orientation_y == 0
|
else if (rF->orientation_x == -1 && rF->orientation_y == 0
|
||||||
&& rF->orientation_z == 0)
|
&& rF->orientation_z == 0)
|
||||||
_rangeFinderBack = rF;
|
_rangeFinderBack = rF;
|
||||||
else if (rF->orientation_x == 0 && rF->orientation_y == 1
|
else if (rF->orientation_x == 0 && rF->orientation_y == 1
|
||||||
&& rF->orientation_z == 0)
|
&& rF->orientation_z == 0)
|
||||||
_rangeFinderRight = rF;
|
_rangeFinderRight = rF;
|
||||||
else if (rF->orientation_x == 0 && rF->orientation_y == -1
|
else if (rF->orientation_x == 0 && rF->orientation_y == -1
|
||||||
&& rF->orientation_z == 0)
|
&& rF->orientation_z == 0)
|
||||||
_rangeFinderLeft = rF;
|
_rangeFinderLeft = rF;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MavlinkGuide::update() {
|
void MavlinkGuide::update() {
|
||||||
// process mavlink commands
|
// process mavlink commands
|
||||||
handleCommand();
|
handleCommand();
|
||||||
|
|
||||||
// obstacle avoidance overrides
|
// obstacle avoidance overrides
|
||||||
// stop if your going to drive into something in front of you
|
// stop if your going to drive into something in front of you
|
||||||
for (uint8_t i = 0; i < _hal->rangeFinders.getSize(); i++)
|
for (uint8_t i = 0; i < _hal->rangeFinders.getSize(); i++)
|
||||||
_hal->rangeFinders[i]->read();
|
_hal->rangeFinders[i]->read();
|
||||||
float frontDistance = _rangeFinderFront->distance / 200.0; //convert for other adc
|
float frontDistance = _rangeFinderFront->distance / 200.0; //convert for other adc
|
||||||
if (_rangeFinderFront && frontDistance < 2) {
|
if (_rangeFinderFront && frontDistance < 2) {
|
||||||
_mode = MAV_NAV_VECTOR;
|
_mode = MAV_NAV_VECTOR;
|
||||||
|
|
||||||
//airSpeedCommand = 0;
|
//airSpeedCommand = 0;
|
||||||
//groundSpeedCommand = 0;
|
//groundSpeedCommand = 0;
|
||||||
// _headingCommand -= 45 * deg2Rad;
|
// _headingCommand -= 45 * deg2Rad;
|
||||||
// _hal->debug->print("Obstacle Distance (m): ");
|
// _hal->debug->print("Obstacle Distance (m): ");
|
||||||
// _hal->debug->println(frontDistance);
|
// _hal->debug->println(frontDistance);
|
||||||
@ -82,120 +92,120 @@ void MavlinkGuide::update() {
|
|||||||
// _hal->debug->printf_P(
|
// _hal->debug->printf_P(
|
||||||
// PSTR("Front Distance, %f\n"),
|
// PSTR("Front Distance, %f\n"),
|
||||||
// frontDistance);
|
// frontDistance);
|
||||||
}
|
}
|
||||||
if (_rangeFinderBack && _rangeFinderBack->distance < 5) {
|
if (_rangeFinderBack && _rangeFinderBack->distance < 5) {
|
||||||
_airSpeedCommand = 0;
|
_airSpeedCommand = 0;
|
||||||
_groundSpeedCommand = 0;
|
_groundSpeedCommand = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_rangeFinderLeft && _rangeFinderLeft->distance < 5) {
|
if (_rangeFinderLeft && _rangeFinderLeft->distance < 5) {
|
||||||
_airSpeedCommand = 0;
|
_airSpeedCommand = 0;
|
||||||
_groundSpeedCommand = 0;
|
_groundSpeedCommand = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_rangeFinderRight && _rangeFinderRight->distance < 5) {
|
if (_rangeFinderRight && _rangeFinderRight->distance < 5) {
|
||||||
_airSpeedCommand = 0;
|
_airSpeedCommand = 0;
|
||||||
_groundSpeedCommand = 0;
|
_groundSpeedCommand = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MavlinkGuide::nextCommand() {
|
void MavlinkGuide::nextCommand() {
|
||||||
// within 1 seconds, check if more than 5 calls to next command occur
|
// within 1 seconds, check if more than 5 calls to next command occur
|
||||||
// if they do, go to home waypoint
|
// if they do, go to home waypoint
|
||||||
if (millis() - _nextCommandTimer < 1000) {
|
if (millis() - _nextCommandTimer < 1000) {
|
||||||
if (_nextCommandCalls > 5) {
|
if (_nextCommandCalls > 5) {
|
||||||
Serial.println("commands loading too fast, returning home");
|
Serial.println("commands loading too fast, returning home");
|
||||||
setCurrentIndex(0);
|
setCurrentIndex(0);
|
||||||
setNumberOfCommands(1);
|
setNumberOfCommands(1);
|
||||||
_nextCommandCalls = 0;
|
_nextCommandCalls = 0;
|
||||||
_nextCommandTimer = millis();
|
_nextCommandTimer = millis();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_nextCommandCalls++;
|
_nextCommandCalls++;
|
||||||
} else {
|
} else {
|
||||||
_nextCommandTimer = millis();
|
_nextCommandTimer = millis();
|
||||||
_nextCommandCalls = 0;
|
_nextCommandCalls = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_cmdIndex = getNextIndex();
|
_cmdIndex = getNextIndex();
|
||||||
//Serial.print("cmd : "); Serial.println(int(_cmdIndex));
|
//Serial.print("cmd : "); Serial.println(int(_cmdIndex));
|
||||||
//Serial.print("cmd prev : "); Serial.println(int(getPreviousIndex()));
|
//Serial.print("cmd prev : "); Serial.println(int(getPreviousIndex()));
|
||||||
//Serial.print("cmd num : "); Serial.println(int(getNumberOfCommands()));
|
//Serial.print("cmd num : "); Serial.println(int(getNumberOfCommands()));
|
||||||
_command = AP_MavlinkCommand(getCurrentIndex());
|
_command = AP_MavlinkCommand(getCurrentIndex());
|
||||||
_previousCommand = AP_MavlinkCommand(getPreviousIndex());
|
_previousCommand = AP_MavlinkCommand(getPreviousIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
void MavlinkGuide::handleCommand() {
|
void MavlinkGuide::handleCommand() {
|
||||||
|
|
||||||
// TODO handle more commands
|
// TODO handle more commands
|
||||||
switch (_command.getCommand()) {
|
switch (_command.getCommand()) {
|
||||||
|
|
||||||
case MAV_CMD_NAV_WAYPOINT: {
|
case MAV_CMD_NAV_WAYPOINT: {
|
||||||
|
|
||||||
// if we don't have enough waypoint for cross track calcs
|
// if we don't have enough waypoint for cross track calcs
|
||||||
// go home
|
// go home
|
||||||
if (_numberOfCommands == 1) {
|
if (_numberOfCommands == 1) {
|
||||||
_mode = MAV_NAV_RETURNING;
|
_mode = MAV_NAV_RETURNING;
|
||||||
_altitudeCommand = AP_MavlinkCommand::home.getAlt();
|
_altitudeCommand = AP_MavlinkCommand::home.getAlt();
|
||||||
_headingCommand = AP_MavlinkCommand::home.bearingTo(
|
_headingCommand = AP_MavlinkCommand::home.bearingTo(
|
||||||
_navigator->getLat_degInt(), _navigator->getLon_degInt())
|
_navigator->getLat_degInt(), _navigator->getLon_degInt())
|
||||||
+ 180 * deg2Rad;
|
+ 180 * deg2Rad;
|
||||||
if (_headingCommand > 360 * deg2Rad)
|
if (_headingCommand > 360 * deg2Rad)
|
||||||
_headingCommand -= 360 * deg2Rad;
|
_headingCommand -= 360 * deg2Rad;
|
||||||
|
|
||||||
//_hal->debug->printf_P(PSTR("going home: bearing: %f distance: %f\n"),
|
//_hal->debug->printf_P(PSTR("going home: bearing: %f distance: %f\n"),
|
||||||
//headingCommand,AP_MavlinkCommand::home.distanceTo(_navigator->getLat_degInt(),_navigator->getLon_degInt()));
|
//headingCommand,AP_MavlinkCommand::home.distanceTo(_navigator->getLat_degInt(),_navigator->getLon_degInt()));
|
||||||
|
|
||||||
// if we have 2 or more waypoints do x track navigation
|
// if we have 2 or more waypoints do x track navigation
|
||||||
} else {
|
} else {
|
||||||
_mode = MAV_NAV_WAYPOINT;
|
_mode = MAV_NAV_WAYPOINT;
|
||||||
float alongTrack = _command.alongTrack(_previousCommand,
|
float alongTrack = _command.alongTrack(_previousCommand,
|
||||||
_navigator->getLat_degInt(),
|
_navigator->getLat_degInt(),
|
||||||
_navigator->getLon_degInt());
|
_navigator->getLon_degInt());
|
||||||
float distanceToNext = _command.distanceTo(
|
float distanceToNext = _command.distanceTo(
|
||||||
_navigator->getLat_degInt(), _navigator->getLon_degInt());
|
_navigator->getLat_degInt(), _navigator->getLon_degInt());
|
||||||
float segmentLength = _previousCommand.distanceTo(_command);
|
float segmentLength = _previousCommand.distanceTo(_command);
|
||||||
if (distanceToNext < _command.getRadius() || alongTrack
|
if (distanceToNext < _command.getRadius() || alongTrack
|
||||||
> segmentLength)
|
> segmentLength)
|
||||||
{
|
{
|
||||||
Serial.println("waypoint reached");
|
Serial.println("waypoint reached");
|
||||||
nextCommand();
|
nextCommand();
|
||||||
}
|
}
|
||||||
_altitudeCommand = _command.getAlt();
|
_altitudeCommand = _command.getAlt();
|
||||||
float dXt = _command.crossTrack(_previousCommand,
|
float dXt = _command.crossTrack(_previousCommand,
|
||||||
_navigator->getLat_degInt(),
|
_navigator->getLat_degInt(),
|
||||||
_navigator->getLon_degInt());
|
_navigator->getLon_degInt());
|
||||||
float temp = dXt * _crossTrackGain * deg2Rad; // crosstrack gain, rad/m
|
float temp = dXt * _crossTrackGain * deg2Rad; // crosstrack gain, rad/m
|
||||||
if (temp > _crossTrackLim * deg2Rad)
|
if (temp > _crossTrackLim * deg2Rad)
|
||||||
temp = _crossTrackLim * deg2Rad;
|
temp = _crossTrackLim * deg2Rad;
|
||||||
if (temp < -_crossTrackLim * deg2Rad)
|
if (temp < -_crossTrackLim * deg2Rad)
|
||||||
temp = -_crossTrackLim * deg2Rad;
|
temp = -_crossTrackLim * deg2Rad;
|
||||||
float bearing = _previousCommand.bearingTo(_command);
|
float bearing = _previousCommand.bearingTo(_command);
|
||||||
_headingCommand = bearing - temp;
|
_headingCommand = bearing - temp;
|
||||||
//_hal->debug->printf_P(
|
//_hal->debug->printf_P(
|
||||||
//PSTR("nav: bCurrent2Dest: %f\tdXt: %f\tcmdHeading: %f\tnextWpDistance: %f\talongTrack: %f\n"),
|
//PSTR("nav: bCurrent2Dest: %f\tdXt: %f\tcmdHeading: %f\tnextWpDistance: %f\talongTrack: %f\n"),
|
||||||
//bearing * rad2Deg, dXt, _headingCommand * rad2Deg, distanceToNext, alongTrack);
|
//bearing * rad2Deg, dXt, _headingCommand * rad2Deg, distanceToNext, alongTrack);
|
||||||
}
|
}
|
||||||
|
|
||||||
_groundSpeedCommand = _velocityCommand;
|
_groundSpeedCommand = _velocityCommand;
|
||||||
|
|
||||||
// calculate pN,pE,pD from home and gps coordinates
|
// calculate pN,pE,pD from home and gps coordinates
|
||||||
_pNCmd = _command.getPN(_navigator->getLat_degInt(),
|
_pNCmd = _command.getPN(_navigator->getLat_degInt(),
|
||||||
_navigator->getLon_degInt());
|
_navigator->getLon_degInt());
|
||||||
_pECmd = _command.getPE(_navigator->getLat_degInt(),
|
_pECmd = _command.getPE(_navigator->getLat_degInt(),
|
||||||
_navigator->getLon_degInt());
|
_navigator->getLon_degInt());
|
||||||
_pDCmd = _command.getPD(_navigator->getAlt_intM());
|
_pDCmd = _command.getPD(_navigator->getAlt_intM());
|
||||||
|
|
||||||
// debug
|
// debug
|
||||||
//_hal->debug->printf_P(
|
//_hal->debug->printf_P(
|
||||||
//PSTR("guide loop, number: %d, current index: %d, previous index: %d\n"),
|
//PSTR("guide loop, number: %d, current index: %d, previous index: %d\n"),
|
||||||
//getNumberOfCommands(),
|
//getNumberOfCommands(),
|
||||||
//getCurrentIndex(),
|
//getCurrentIndex(),
|
||||||
//getPreviousIndex());
|
//getPreviousIndex());
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// case MAV_CMD_CONDITION_CHANGE_ALT:
|
// case MAV_CMD_CONDITION_CHANGE_ALT:
|
||||||
// case MAV_CMD_CONDITION_DELAY:
|
// case MAV_CMD_CONDITION_DELAY:
|
||||||
// case MAV_CMD_CONDITION_DISTANCE:
|
// case MAV_CMD_CONDITION_DISTANCE:
|
||||||
@ -224,12 +234,12 @@ void MavlinkGuide::handleCommand() {
|
|||||||
// case MAV_CMD_NAV_PATHPLANNING:
|
// case MAV_CMD_NAV_PATHPLANNING:
|
||||||
// case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
// case MAV_CMD_NAV_RETURN_TO_LAUNCH:
|
||||||
// case MAV_CMD_NAV_TAKEOFF:
|
// case MAV_CMD_NAV_TAKEOFF:
|
||||||
default:
|
default:
|
||||||
// unhandled command, skip
|
// unhandled command, skip
|
||||||
Serial.println("unhandled command");
|
Serial.println("unhandled command");
|
||||||
nextCommand();
|
nextCommand();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
@ -33,116 +33,117 @@ class AP_HardwareAbstractionLayer;
|
|||||||
class AP_Guide {
|
class AP_Guide {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the constructor, which requires a link to the navigator.
|
* This is the constructor, which requires a link to the navigator.
|
||||||
* @param navigator This is the navigator pointer.
|
* @param navigator This is the navigator pointer.
|
||||||
*/
|
*/
|
||||||
AP_Guide(AP_Navigator * navigator, AP_HardwareAbstractionLayer * hal);
|
AP_Guide(AP_Navigator * navigator, AP_HardwareAbstractionLayer * hal);
|
||||||
|
|
||||||
virtual void update() = 0;
|
virtual void update() = 0;
|
||||||
|
|
||||||
virtual void nextCommand() = 0;
|
virtual void nextCommand() = 0;
|
||||||
|
|
||||||
MAV_NAV getMode() const {
|
MAV_NAV getMode() const {
|
||||||
return _mode;
|
return _mode;
|
||||||
}
|
}
|
||||||
uint8_t getCurrentIndex() {
|
uint8_t getCurrentIndex() {
|
||||||
return _cmdIndex;
|
return _cmdIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentIndex(uint8_t val);
|
void setCurrentIndex(uint8_t val);
|
||||||
|
|
||||||
uint8_t getNumberOfCommands() {
|
uint8_t getNumberOfCommands() {
|
||||||
return _numberOfCommands;
|
return _numberOfCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setNumberOfCommands(uint8_t val) {
|
void setNumberOfCommands(uint8_t val) {
|
||||||
_numberOfCommands.set_and_save(val);
|
_numberOfCommands.set_and_save(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getPreviousIndex() {
|
uint8_t getPreviousIndex() {
|
||||||
// find previous waypoint, TODO, handle non-nav commands
|
// find previous waypoint, TODO, handle non-nav commands
|
||||||
int16_t prevIndex = int16_t(getCurrentIndex()) - 1;
|
int16_t prevIndex = int16_t(getCurrentIndex()) - 1;
|
||||||
if (prevIndex < 0)
|
if (prevIndex < 0)
|
||||||
prevIndex = getNumberOfCommands() - 1;
|
prevIndex = getNumberOfCommands() - 1;
|
||||||
return (uint8_t) prevIndex;
|
return (uint8_t) prevIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getNextIndex() {
|
uint8_t getNextIndex() {
|
||||||
// find previous waypoint, TODO, handle non-nav commands
|
// find previous waypoint, TODO, handle non-nav commands
|
||||||
int16_t nextIndex = int16_t(getCurrentIndex()) + 1;
|
int16_t nextIndex = int16_t(getCurrentIndex()) + 1;
|
||||||
if (nextIndex > (getNumberOfCommands() - 1))
|
if (nextIndex > (getNumberOfCommands() - 1))
|
||||||
nextIndex = 0;
|
nextIndex = 0;
|
||||||
return nextIndex;
|
return nextIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getHeadingCommand() {
|
float getHeadingError();
|
||||||
return _headingCommand;
|
|
||||||
}
|
float getHeadingCommand() {
|
||||||
float getAirSpeedCommand() {
|
return _headingCommand;
|
||||||
return _airSpeedCommand;
|
}
|
||||||
}
|
float getAirSpeedCommand() {
|
||||||
float getGroundSpeedCommand() {
|
return _airSpeedCommand;
|
||||||
return _groundSpeedCommand;
|
}
|
||||||
}
|
float getGroundSpeedCommand() {
|
||||||
float getAltitudeCommand() {
|
return _groundSpeedCommand;
|
||||||
return _altitudeCommand;
|
}
|
||||||
}
|
float getAltitudeCommand() {
|
||||||
float getPNCmd() {
|
return _altitudeCommand;
|
||||||
return _pNCmd;
|
}
|
||||||
}
|
float getPNCmd() {
|
||||||
float getPECmd() {
|
return _pNCmd;
|
||||||
return _pECmd;
|
}
|
||||||
}
|
float getPECmd() {
|
||||||
float getPDCmd() {
|
return _pECmd;
|
||||||
return _pDCmd;
|
}
|
||||||
}
|
float getPDCmd() {
|
||||||
MAV_NAV getMode() {
|
return _pDCmd;
|
||||||
return _mode;
|
}
|
||||||
}
|
MAV_NAV getMode() {
|
||||||
uint8_t getCommandIndex() {
|
return _mode;
|
||||||
return _cmdIndex;
|
}
|
||||||
}
|
uint8_t getCommandIndex() {
|
||||||
|
return _cmdIndex;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AP_Navigator * _navigator;
|
AP_Navigator * _navigator;
|
||||||
AP_HardwareAbstractionLayer * _hal;
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
AP_MavlinkCommand _command, _previousCommand;
|
AP_MavlinkCommand _command, _previousCommand;
|
||||||
float _headingCommand;
|
float _headingCommand;
|
||||||
float _airSpeedCommand;
|
float _airSpeedCommand;
|
||||||
float _groundSpeedCommand;
|
float _groundSpeedCommand;
|
||||||
float _altitudeCommand;
|
float _altitudeCommand;
|
||||||
float _pNCmd;
|
float _pNCmd;
|
||||||
float _pECmd;
|
float _pECmd;
|
||||||
float _pDCmd;
|
float _pDCmd;
|
||||||
MAV_NAV _mode;
|
MAV_NAV _mode;
|
||||||
AP_Uint8 _numberOfCommands;
|
AP_Uint8 _numberOfCommands;
|
||||||
AP_Uint8 _cmdIndex;
|
AP_Uint8 _cmdIndex;
|
||||||
uint16_t _nextCommandCalls;
|
uint16_t _nextCommandCalls;
|
||||||
uint16_t _nextCommandTimer;
|
uint16_t _nextCommandTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MavlinkGuide: public AP_Guide {
|
class MavlinkGuide: public AP_Guide {
|
||||||
public:
|
public:
|
||||||
MavlinkGuide(AP_Navigator * navigator,
|
MavlinkGuide(AP_Navigator * navigator,
|
||||||
AP_HardwareAbstractionLayer * hal);
|
AP_HardwareAbstractionLayer * hal, float velCmd, float xt, float xtLim);
|
||||||
virtual void update();
|
virtual void update();
|
||||||
void nextCommand();
|
void nextCommand();
|
||||||
void handleCommand();
|
void handleCommand();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RangeFinder * _rangeFinderFront;
|
RangeFinder * _rangeFinderFront;
|
||||||
RangeFinder * _rangeFinderBack;
|
RangeFinder * _rangeFinderBack;
|
||||||
RangeFinder * _rangeFinderLeft;
|
RangeFinder * _rangeFinderLeft;
|
||||||
RangeFinder * _rangeFinderRight;
|
RangeFinder * _rangeFinderRight;
|
||||||
AP_Var_group _group;
|
AP_Var_group _group;
|
||||||
AP_Float _velocityCommand;
|
AP_Float _velocityCommand;
|
||||||
AP_Float _crossTrackGain;
|
AP_Float _crossTrackGain;
|
||||||
AP_Float _crossTrackLim;
|
AP_Float _crossTrackLim;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
#endif // AP_Guide_H
|
#endif // AP_Guide_H
|
||||||
|
|
||||||
// vim:ts=4:sw=4:expandtab
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -6,3 +6,4 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AP_HardwareAbstractionLayer.h"
|
#include "AP_HardwareAbstractionLayer.h"
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -28,134 +28,149 @@ class AP_BatteryMonitor;
|
|||||||
|
|
||||||
// enumerations
|
// enumerations
|
||||||
enum halMode_t {
|
enum halMode_t {
|
||||||
MODE_LIVE, MODE_HIL_CNTL,
|
MODE_LIVE, MODE_HIL_CNTL,
|
||||||
/*MODE_HIL_NAV*/};
|
/*MODE_HIL_NAV*/
|
||||||
|
};
|
||||||
enum board_t {
|
enum board_t {
|
||||||
BOARD_ARDUPILOTMEGA_1280, BOARD_ARDUPILOTMEGA_2560, BOARD_ARDUPILOTMEGA_2
|
BOARD_ARDUPILOTMEGA_1280, BOARD_ARDUPILOTMEGA_2560, BOARD_ARDUPILOTMEGA_2
|
||||||
};
|
};
|
||||||
enum vehicle_t {
|
enum vehicle_t {
|
||||||
VEHICLE_CAR, VEHICLE_QUAD, VEHICLE_PLANE, VEHICLE_BOAT, VEHICLE_TANK
|
VEHICLE_CAR, VEHICLE_QUAD, VEHICLE_PLANE, VEHICLE_BOAT, VEHICLE_TANK
|
||||||
};
|
};
|
||||||
|
|
||||||
class AP_HardwareAbstractionLayer {
|
class AP_HardwareAbstractionLayer {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// default ctors on pointers called on pointers here, this
|
// default ctors on pointers called on pointers here, this
|
||||||
// allows NULL to be used as a boolean for if the device was
|
// allows NULL to be used as a boolean for if the device was
|
||||||
// initialized
|
// initialized
|
||||||
AP_HardwareAbstractionLayer(halMode_t mode, board_t board,
|
AP_HardwareAbstractionLayer(halMode_t mode, board_t board,
|
||||||
vehicle_t vehicle, uint8_t heartBeatTimeout) :
|
vehicle_t vehicle, uint8_t heartBeatTimeout) :
|
||||||
adc(), gps(), baro(), compass(), rangeFinders(), imu(), batteryMonitor(), rc(), gcs(),
|
adc(), gps(), baro(), compass(), rangeFinders(), imu(), batteryMonitor(), rc(), gcs(),
|
||||||
hil(), debug(), load(), lastHeartBeat(),
|
hil(), debug(), load(), lastHeartBeat(),
|
||||||
_heartBeatTimeout(heartBeatTimeout), _mode(mode),
|
_heartBeatTimeout(heartBeatTimeout), _mode(mode),
|
||||||
_board(board), _vehicle(vehicle), _state(MAV_STATE_UNINIT) {
|
_board(board), _vehicle(vehicle), _state(MAV_STATE_UNINIT) {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Board specific hardware initialization
|
* Board specific hardware initialization
|
||||||
*/
|
*/
|
||||||
if (board == BOARD_ARDUPILOTMEGA_1280) {
|
if (board == BOARD_ARDUPILOTMEGA_1280) {
|
||||||
slideSwitchPin = 40;
|
slideSwitchPin = 40;
|
||||||
pushButtonPin = 41;
|
pushButtonPin = 41;
|
||||||
aLedPin = 37;
|
aLedPin = 37;
|
||||||
bLedPin = 36;
|
bLedPin = 36;
|
||||||
cLedPin = 35;
|
cLedPin = 35;
|
||||||
eepromMaxAddr = 1024;
|
eepromMaxAddr = 1024;
|
||||||
pinMode(aLedPin, OUTPUT); // extra led
|
pinMode(aLedPin, OUTPUT); // extra led
|
||||||
pinMode(bLedPin, OUTPUT); // imu ledclass AP_CommLink;
|
pinMode(bLedPin, OUTPUT); // imu ledclass AP_CommLink;
|
||||||
pinMode(cLedPin, OUTPUT); // gps led
|
pinMode(cLedPin, OUTPUT); // gps led
|
||||||
pinMode(slideSwitchPin, INPUT);
|
pinMode(slideSwitchPin, INPUT);
|
||||||
pinMode(pushButtonPin, INPUT);
|
pinMode(pushButtonPin, INPUT);
|
||||||
DDRL |= B00000100; // set port L, pint 2 to output for the relay
|
DDRL |= B00000100; // set port L, pint 2 to output for the relay
|
||||||
} else if (board == BOARD_ARDUPILOTMEGA_2560) {
|
} else if (board == BOARD_ARDUPILOTMEGA_2560) {
|
||||||
slideSwitchPin = 40;
|
slideSwitchPin = 40;
|
||||||
pushButtonPin = 41;
|
pushButtonPin = 41;
|
||||||
aLedPin = 37;
|
aLedPin = 37;
|
||||||
bLedPin = 36;
|
bLedPin = 36;
|
||||||
cLedPin = 35;
|
cLedPin = 35;
|
||||||
eepromMaxAddr = 2048;
|
eepromMaxAddr = 2048;
|
||||||
pinMode(aLedPin, OUTPUT); // extra led
|
pinMode(aLedPin, OUTPUT); // extra led
|
||||||
pinMode(bLedPin, OUTPUT); // imu ledclass AP_CommLink;
|
pinMode(bLedPin, OUTPUT); // imu ledclass AP_CommLink;
|
||||||
pinMode(cLedPin, OUTPUT); // gps led
|
pinMode(cLedPin, OUTPUT); // gps led
|
||||||
pinMode(slideSwitchPin, INPUT);
|
pinMode(slideSwitchPin, INPUT);
|
||||||
pinMode(pushButtonPin, INPUT);
|
pinMode(pushButtonPin, INPUT);
|
||||||
DDRL |= B00000100; // set port L, pint 2 to output for the relay
|
DDRL |= B00000100; // set port L, pint 2 to output for the relay
|
||||||
}
|
} else if (board == BOARD_ARDUPILOTMEGA_2) {
|
||||||
}
|
slideSwitchPin = 40;
|
||||||
|
pushButtonPin = 41;
|
||||||
|
aLedPin = 37;
|
||||||
|
bLedPin = 36;
|
||||||
|
cLedPin = 35;
|
||||||
|
eepromMaxAddr = 2048;
|
||||||
|
pinMode(aLedPin, OUTPUT); // extra led
|
||||||
|
pinMode(bLedPin, OUTPUT); // imu ledclass AP_CommLink;
|
||||||
|
pinMode(cLedPin, OUTPUT); // gps led
|
||||||
|
pinMode(slideSwitchPin, INPUT);
|
||||||
|
pinMode(pushButtonPin, INPUT);
|
||||||
|
DDRL |= B00000100; // set port L, pint 2 to output for the relay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sensors
|
* Sensors
|
||||||
*/
|
*/
|
||||||
AP_ADC * adc;
|
AP_ADC * adc;
|
||||||
GPS * gps;
|
GPS * gps;
|
||||||
APM_BMP085_Class * baro;
|
APM_BMP085_Class * baro;
|
||||||
Compass * compass;
|
Compass * compass;
|
||||||
Vector<RangeFinder *> rangeFinders;
|
Vector<RangeFinder *> rangeFinders;
|
||||||
IMU * imu;
|
IMU * imu;
|
||||||
AP_BatteryMonitor * batteryMonitor;
|
AP_BatteryMonitor * batteryMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Radio Channels
|
* Radio Channels
|
||||||
*/
|
*/
|
||||||
Vector<AP_RcChannel *> rc;
|
Vector<AP_RcChannel *> rc;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Communication Channels
|
* Communication Channels
|
||||||
*/
|
*/
|
||||||
AP_CommLink * gcs;
|
AP_CommLink * gcs;
|
||||||
AP_CommLink * hil;
|
AP_CommLink * hil;
|
||||||
FastSerial * debug;
|
FastSerial * debug;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* data
|
* data
|
||||||
*/
|
*/
|
||||||
uint8_t load;
|
uint8_t load;
|
||||||
uint32_t lastHeartBeat;
|
uint32_t lastHeartBeat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* settings
|
* settings
|
||||||
*/
|
*/
|
||||||
uint8_t slideSwitchPin;
|
uint8_t slideSwitchPin;
|
||||||
uint8_t pushButtonPin;
|
uint8_t pushButtonPin;
|
||||||
uint8_t aLedPin;
|
uint8_t aLedPin;
|
||||||
uint8_t bLedPin;
|
uint8_t bLedPin;
|
||||||
uint8_t cLedPin;
|
uint8_t cLedPin;
|
||||||
uint16_t eepromMaxAddr;
|
uint16_t eepromMaxAddr;
|
||||||
|
|
||||||
// accessors
|
// accessors
|
||||||
halMode_t getMode() {
|
halMode_t getMode() {
|
||||||
return _mode;
|
return _mode;
|
||||||
}
|
}
|
||||||
board_t getBoard() {
|
board_t getBoard() {
|
||||||
return _board;
|
return _board;
|
||||||
}
|
}
|
||||||
vehicle_t getVehicle() {
|
vehicle_t getVehicle() {
|
||||||
return _vehicle;
|
return _vehicle;
|
||||||
}
|
}
|
||||||
MAV_STATE getState() {
|
MAV_STATE getState() {
|
||||||
return _state;
|
return _state;
|
||||||
}
|
}
|
||||||
void setState(MAV_STATE state) {
|
void setState(MAV_STATE state) {
|
||||||
_state = state;
|
_state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool heartBeatLost() {
|
bool heartBeatLost() {
|
||||||
if (_heartBeatTimeout == 0)
|
if (_heartBeatTimeout == 0)
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return ((micros() - lastHeartBeat) / 1e6) > _heartBeatTimeout;
|
return ((micros() - lastHeartBeat) / 1e6) > _heartBeatTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// enumerations
|
// enumerations
|
||||||
uint8_t _heartBeatTimeout;
|
uint8_t _heartBeatTimeout;
|
||||||
halMode_t _mode;
|
halMode_t _mode;
|
||||||
board_t _board;
|
board_t _board;
|
||||||
vehicle_t _vehicle;
|
vehicle_t _vehicle;
|
||||||
MAV_STATE _state;
|
MAV_STATE _state;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
} // namespace apo
|
||||||
|
|
||||||
#endif /* AP_HARDWAREABSTRACTIONLAYER_H_ */
|
#endif /* AP_HARDWAREABSTRACTIONLAYER_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -5,183 +5,205 @@
|
|||||||
* Author: jgoppert
|
* Author: jgoppert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "../FastSerial/FastSerial.h"
|
||||||
#include "AP_MavlinkCommand.h"
|
#include "AP_MavlinkCommand.h"
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
AP_MavlinkCommand::AP_MavlinkCommand(const AP_MavlinkCommand & v) :
|
AP_MavlinkCommand::AP_MavlinkCommand(const AP_MavlinkCommand & v) :
|
||||||
_data(v._data), _seq(v._seq) {
|
_data(v._data), _seq(v._seq) {
|
||||||
//if (FastSerial::getInitialized(0)) Serial.println("copy ctor");
|
//if (FastSerial::getInitialized(0)) Serial.println("copy ctor");
|
||||||
}
|
}
|
||||||
|
|
||||||
AP_MavlinkCommand::AP_MavlinkCommand(uint16_t index, bool doLoad) :
|
AP_MavlinkCommand::AP_MavlinkCommand(uint16_t index, bool doLoad) :
|
||||||
_data(k_commands + index), _seq(index) {
|
_data(k_commands + index), _seq(index) {
|
||||||
|
|
||||||
if (FastSerial::getInitialized(0)) {
|
if (FastSerial::getInitialized(0)) {
|
||||||
Serial.println("index ctor");
|
Serial.println("index ctor");
|
||||||
Serial.println("++");
|
Serial.println("++");
|
||||||
Serial.print("index: "); Serial.println(index);
|
Serial.print("index: ");
|
||||||
Serial.print("key: "); Serial.println(k_commands + index);
|
Serial.println(index);
|
||||||
Serial.println("++");
|
Serial.print("key: ");
|
||||||
}
|
Serial.println(k_commands + index);
|
||||||
|
Serial.println("++");
|
||||||
|
}
|
||||||
|
|
||||||
// default values for structure
|
// default values for structure
|
||||||
_data.get().command = MAV_CMD_NAV_WAYPOINT;
|
_data.get().command = MAV_CMD_NAV_WAYPOINT;
|
||||||
_data.get().autocontinue = true;
|
_data.get().autocontinue = true;
|
||||||
_data.get().frame = MAV_FRAME_GLOBAL;
|
_data.get().frame = MAV_FRAME_GLOBAL;
|
||||||
_data.get().param1 = 0;
|
_data.get().param1 = 0;
|
||||||
_data.get().param2 = 10; // radius of 10 meters
|
_data.get().param2 = 10; // radius of 10 meters
|
||||||
_data.get().param3 = 0;
|
_data.get().param3 = 0;
|
||||||
_data.get().param4 = 0;
|
_data.get().param4 = 0;
|
||||||
_data.get().x = 0;
|
_data.get().x = 0;
|
||||||
_data.get().y = 0;
|
_data.get().y = 0;
|
||||||
_data.get().z = 1000;
|
_data.get().z = 1000;
|
||||||
|
|
||||||
// This is a failsafe measure to stop trying to load a command if it can't load
|
// This is a failsafe measure to stop trying to load a command if it can't load
|
||||||
if (doLoad && !load()) {
|
if (doLoad && !load()) {
|
||||||
Serial.println("load failed, reverting to home waypoint");
|
Serial.println("load failed, reverting to home waypoint");
|
||||||
_data = AP_MavlinkCommand::home._data;
|
_data = AP_MavlinkCommand::home._data;
|
||||||
_seq = AP_MavlinkCommand::home._seq;
|
_seq = AP_MavlinkCommand::home._seq;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AP_MavlinkCommand::AP_MavlinkCommand(const mavlink_waypoint_t & cmd) :
|
AP_MavlinkCommand::AP_MavlinkCommand(const mavlink_waypoint_t & cmd) :
|
||||||
_data(k_commands + cmd.seq), _seq(cmd.seq) {
|
_data(k_commands + cmd.seq), _seq(cmd.seq) {
|
||||||
setCommand(MAV_CMD(cmd.command));
|
setCommand(MAV_CMD(cmd.command));
|
||||||
setAutocontinue(cmd.autocontinue);
|
setAutocontinue(cmd.autocontinue);
|
||||||
setFrame(MAV_FRAME(cmd.frame));
|
setFrame(MAV_FRAME(cmd.frame));
|
||||||
setParam1(cmd.param1);
|
setParam1(cmd.param1);
|
||||||
setParam2(cmd.param2);
|
setParam2(cmd.param2);
|
||||||
setParam3(cmd.param3);
|
setParam3(cmd.param3);
|
||||||
setParam4(cmd.param4);
|
setParam4(cmd.param4);
|
||||||
setX(cmd.x);
|
setX(cmd.x);
|
||||||
setY(cmd.y);
|
setY(cmd.y);
|
||||||
setZ(cmd.z);
|
setZ(cmd.z);
|
||||||
save();
|
save();
|
||||||
|
|
||||||
// reload home if sent
|
// reload home if sent
|
||||||
if (cmd.seq == 0) home.load();
|
if (cmd.seq == 0) home.load();
|
||||||
|
|
||||||
Serial.println("============================================================");
|
Serial.println("============================================================");
|
||||||
Serial.println("storing new command from mavlink_waypoint_t");
|
Serial.println("storing new command from mavlink_waypoint_t");
|
||||||
Serial.print("key: "); Serial.println(_data.key(),DEC);
|
Serial.print("key: ");
|
||||||
Serial.print("number: "); Serial.println(cmd.seq,DEC);
|
Serial.println(_data.key(),DEC);
|
||||||
Serial.print("command: "); Serial.println(getCommand());
|
Serial.print("number: ");
|
||||||
Serial.print("autocontinue: "); Serial.println(getAutocontinue(),DEC);
|
Serial.println(cmd.seq,DEC);
|
||||||
Serial.print("frame: "); Serial.println(getFrame(),DEC);
|
Serial.print("command: ");
|
||||||
Serial.print("1000*param1: "); Serial.println(int(1000*getParam1()),DEC);
|
Serial.println(getCommand());
|
||||||
Serial.print("1000*param2: "); Serial.println(int(1000*getParam2()),DEC);
|
Serial.print("autocontinue: ");
|
||||||
Serial.print("1000*param3: "); Serial.println(int(1000*getParam3()),DEC);
|
Serial.println(getAutocontinue(),DEC);
|
||||||
Serial.print("1000*param4: "); Serial.println(int(1000*getParam4()),DEC);
|
Serial.print("frame: ");
|
||||||
Serial.print("1000*x0: "); Serial.println(int(1000*cmd.x),DEC);
|
Serial.println(getFrame(),DEC);
|
||||||
Serial.print("1000*y0: "); Serial.println(int(1000*cmd.y),DEC);
|
Serial.print("1000*param1: ");
|
||||||
Serial.print("1000*z0: "); Serial.println(int(1000*cmd.z),DEC);
|
Serial.println(int(1000*getParam1()),DEC);
|
||||||
Serial.print("1000*x: "); Serial.println(int(1000*getX()),DEC);
|
Serial.print("1000*param2: ");
|
||||||
Serial.print("1000*y: "); Serial.println(int(1000*getY()),DEC);
|
Serial.println(int(1000*getParam2()),DEC);
|
||||||
Serial.print("1000*z: "); Serial.println(int(1000*getZ()),DEC);
|
Serial.print("1000*param3: ");
|
||||||
|
Serial.println(int(1000*getParam3()),DEC);
|
||||||
|
Serial.print("1000*param4: ");
|
||||||
|
Serial.println(int(1000*getParam4()),DEC);
|
||||||
|
Serial.print("1000*x0: ");
|
||||||
|
Serial.println(int(1000*cmd.x),DEC);
|
||||||
|
Serial.print("1000*y0: ");
|
||||||
|
Serial.println(int(1000*cmd.y),DEC);
|
||||||
|
Serial.print("1000*z0: ");
|
||||||
|
Serial.println(int(1000*cmd.z),DEC);
|
||||||
|
Serial.print("1000*x: ");
|
||||||
|
Serial.println(int(1000*getX()),DEC);
|
||||||
|
Serial.print("1000*y: ");
|
||||||
|
Serial.println(int(1000*getY()),DEC);
|
||||||
|
Serial.print("1000*z: ");
|
||||||
|
Serial.println(int(1000*getZ()),DEC);
|
||||||
|
|
||||||
load();
|
load();
|
||||||
|
|
||||||
Serial.print("1000*x1: "); Serial.println(int(1000*getX()),DEC);
|
Serial.print("1000*x1: ");
|
||||||
Serial.print("1000*y1: "); Serial.println(int(1000*getY()),DEC);
|
Serial.println(int(1000*getX()),DEC);
|
||||||
Serial.print("1000*z1: "); Serial.println(int(1000*getZ()),DEC);
|
Serial.print("1000*y1: ");
|
||||||
Serial.println("============================================================");
|
Serial.println(int(1000*getY()),DEC);
|
||||||
Serial.flush();
|
Serial.print("1000*z1: ");
|
||||||
|
Serial.println(int(1000*getZ()),DEC);
|
||||||
|
Serial.println("============================================================");
|
||||||
|
Serial.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
mavlink_waypoint_t AP_MavlinkCommand::convert(uint8_t current) const {
|
mavlink_waypoint_t AP_MavlinkCommand::convert(uint8_t current) const {
|
||||||
mavlink_waypoint_t mavCmd;
|
mavlink_waypoint_t mavCmd;
|
||||||
mavCmd.seq = getSeq();
|
mavCmd.seq = getSeq();
|
||||||
mavCmd.command = getCommand();
|
mavCmd.command = getCommand();
|
||||||
mavCmd.frame = getFrame();
|
mavCmd.frame = getFrame();
|
||||||
mavCmd.param1 = getParam1();
|
mavCmd.param1 = getParam1();
|
||||||
mavCmd.param2 = getParam2();
|
mavCmd.param2 = getParam2();
|
||||||
mavCmd.param3 = getParam3();
|
mavCmd.param3 = getParam3();
|
||||||
mavCmd.param4 = getParam4();
|
mavCmd.param4 = getParam4();
|
||||||
mavCmd.x = getX();
|
mavCmd.x = getX();
|
||||||
mavCmd.y = getY();
|
mavCmd.y = getY();
|
||||||
mavCmd.z = getZ();
|
mavCmd.z = getZ();
|
||||||
mavCmd.autocontinue = getAutocontinue();
|
mavCmd.autocontinue = getAutocontinue();
|
||||||
mavCmd.current = (getSeq() == current);
|
mavCmd.current = (getSeq() == current);
|
||||||
mavCmd.target_component = mavlink_system.compid;
|
mavCmd.target_component = mavlink_system.compid;
|
||||||
mavCmd.target_system = mavlink_system.sysid;
|
mavCmd.target_system = mavlink_system.sysid;
|
||||||
return mavCmd;
|
return mavCmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_MavlinkCommand::bearingTo(const AP_MavlinkCommand & next) const {
|
float AP_MavlinkCommand::bearingTo(const AP_MavlinkCommand & next) const {
|
||||||
float deltaLon = next.getLon() - getLon();
|
float deltaLon = next.getLon() - getLon();
|
||||||
/*
|
/*
|
||||||
Serial.print("Lon: "); Serial.println(getLon());
|
Serial.print("Lon: "); Serial.println(getLon());
|
||||||
Serial.print("nextLon: "); Serial.println(next.getLon());
|
Serial.print("nextLon: "); Serial.println(next.getLon());
|
||||||
Serial.print("deltaLonDeg * 1e7: "); Serial.println(deltaLon*rad2DegInt);
|
Serial.print("deltaLonDeg * 1e7: "); Serial.println(deltaLon*rad2DegInt);
|
||||||
*/
|
*/
|
||||||
float bearing = atan2(
|
float bearing = atan2(
|
||||||
sin(deltaLon) * cos(next.getLat()),
|
sin(deltaLon) * cos(next.getLat()),
|
||||||
cos(getLat()) * sin(next.getLat()) - sin(getLat()) * cos(
|
cos(getLat()) * sin(next.getLat()) - sin(getLat()) * cos(
|
||||||
next.getLat()) * cos(deltaLon));
|
next.getLat()) * cos(deltaLon));
|
||||||
return bearing;
|
return bearing;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_MavlinkCommand::bearingTo(int32_t latDegInt, int32_t lonDegInt) const {
|
float AP_MavlinkCommand::bearingTo(int32_t latDegInt, int32_t lonDegInt) const {
|
||||||
// have to be careful to maintain the precision of the gps coordinate
|
// have to be careful to maintain the precision of the gps coordinate
|
||||||
float deltaLon = (lonDegInt - getLon_degInt()) * degInt2Rad;
|
float deltaLon = (lonDegInt - getLon_degInt()) * degInt2Rad;
|
||||||
float nextLat = latDegInt * degInt2Rad;
|
float nextLat = latDegInt * degInt2Rad;
|
||||||
float bearing = atan2(
|
float bearing = atan2(
|
||||||
sin(deltaLon) * cos(nextLat),
|
sin(deltaLon) * cos(nextLat),
|
||||||
cos(getLat()) * sin(nextLat) - sin(getLat()) * cos(nextLat)
|
cos(getLat()) * sin(nextLat) - sin(getLat()) * cos(nextLat)
|
||||||
* cos(deltaLon));
|
* cos(deltaLon));
|
||||||
if (bearing < 0)
|
if (bearing < 0)
|
||||||
bearing += 2 * M_PI;
|
bearing += 2 * M_PI;
|
||||||
return bearing;
|
return bearing;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_MavlinkCommand::distanceTo(const AP_MavlinkCommand & next) const {
|
float AP_MavlinkCommand::distanceTo(const AP_MavlinkCommand & next) const {
|
||||||
float sinDeltaLat2 = sin((getLat() - next.getLat()) / 2);
|
float sinDeltaLat2 = sin((getLat() - next.getLat()) / 2);
|
||||||
float sinDeltaLon2 = sin((getLon() - next.getLon()) / 2);
|
float sinDeltaLon2 = sin((getLon() - next.getLon()) / 2);
|
||||||
float a = sinDeltaLat2 * sinDeltaLat2 + cos(getLat()) * cos(
|
float a = sinDeltaLat2 * sinDeltaLat2 + cos(getLat()) * cos(
|
||||||
next.getLat()) * sinDeltaLon2 * sinDeltaLon2;
|
next.getLat()) * sinDeltaLon2 * sinDeltaLon2;
|
||||||
float c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
float c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
||||||
return rEarth * c;
|
return rEarth * c;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_MavlinkCommand::distanceTo(int32_t lat_degInt, int32_t lon_degInt) const {
|
float AP_MavlinkCommand::distanceTo(int32_t lat_degInt, int32_t lon_degInt) const {
|
||||||
float sinDeltaLat2 = sin(
|
float sinDeltaLat2 = sin(
|
||||||
(lat_degInt - getLat_degInt()) * degInt2Rad / 2);
|
(lat_degInt - getLat_degInt()) * degInt2Rad / 2);
|
||||||
float sinDeltaLon2 = sin(
|
float sinDeltaLon2 = sin(
|
||||||
(lon_degInt - getLon_degInt()) * degInt2Rad / 2);
|
(lon_degInt - getLon_degInt()) * degInt2Rad / 2);
|
||||||
float a = sinDeltaLat2 * sinDeltaLat2 + cos(getLat()) * cos(
|
float a = sinDeltaLat2 * sinDeltaLat2 + cos(getLat()) * cos(
|
||||||
lat_degInt * degInt2Rad) * sinDeltaLon2 * sinDeltaLon2;
|
lat_degInt * degInt2Rad) * sinDeltaLon2 * sinDeltaLon2;
|
||||||
float c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
float c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
||||||
/*
|
/*
|
||||||
Serial.print("wp lat_degInt: "); Serial.println(getLat_degInt());
|
Serial.print("wp lat_degInt: "); Serial.println(getLat_degInt());
|
||||||
Serial.print("wp lon_degInt: "); Serial.println(getLon_degInt());
|
Serial.print("wp lon_degInt: "); Serial.println(getLon_degInt());
|
||||||
Serial.print("lat_degInt: "); Serial.println(lat_degInt);
|
Serial.print("lat_degInt: "); Serial.println(lat_degInt);
|
||||||
Serial.print("lon_degInt: "); Serial.println(lon_degInt);
|
Serial.print("lon_degInt: "); Serial.println(lon_degInt);
|
||||||
Serial.print("sinDeltaLat2: "); Serial.println(sinDeltaLat2);
|
Serial.print("sinDeltaLat2: "); Serial.println(sinDeltaLat2);
|
||||||
Serial.print("sinDeltaLon2: "); Serial.println(sinDeltaLon2);
|
Serial.print("sinDeltaLon2: "); Serial.println(sinDeltaLon2);
|
||||||
*/
|
*/
|
||||||
return rEarth * c;
|
return rEarth * c;
|
||||||
}
|
}
|
||||||
|
|
||||||
//calculates cross track of a current location
|
//calculates cross track of a current location
|
||||||
float AP_MavlinkCommand::crossTrack(const AP_MavlinkCommand & previous,
|
float AP_MavlinkCommand::crossTrack(const AP_MavlinkCommand & previous,
|
||||||
int32_t lat_degInt, int32_t lon_degInt) const {
|
int32_t lat_degInt, int32_t lon_degInt) const {
|
||||||
float d = previous.distanceTo(lat_degInt, lon_degInt);
|
float d = previous.distanceTo(lat_degInt, lon_degInt);
|
||||||
float bCurrent = previous.bearingTo(lat_degInt, lon_degInt);
|
float bCurrent = previous.bearingTo(lat_degInt, lon_degInt);
|
||||||
float bNext = previous.bearingTo(*this);
|
float bNext = previous.bearingTo(*this);
|
||||||
return asin(sin(d / rEarth) * sin(bCurrent - bNext)) * rEarth;
|
return asin(sin(d / rEarth) * sin(bCurrent - bNext)) * rEarth;
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculates along track distance of a current location
|
// calculates along track distance of a current location
|
||||||
float AP_MavlinkCommand::alongTrack(const AP_MavlinkCommand & previous,
|
float AP_MavlinkCommand::alongTrack(const AP_MavlinkCommand & previous,
|
||||||
int32_t lat_degInt, int32_t lon_degInt) const {
|
int32_t lat_degInt, int32_t lon_degInt) const {
|
||||||
// ignores lat/lon since single prec.
|
// ignores lat/lon since single prec.
|
||||||
float dXt = this->crossTrack(previous,lat_degInt, lon_degInt);
|
float dXt = this->crossTrack(previous,lat_degInt, lon_degInt);
|
||||||
float d = previous.distanceTo(lat_degInt, lon_degInt);
|
float d = previous.distanceTo(lat_degInt, lon_degInt);
|
||||||
return dXt / tan(asin(dXt / d));
|
return dXt / tan(asin(dXt / d));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AP_MavlinkCommand AP_MavlinkCommand::home = AP_MavlinkCommand(0,false);
|
AP_MavlinkCommand AP_MavlinkCommand::home = AP_MavlinkCommand(0,false);
|
||||||
|
|
||||||
}
|
} // namespace apo
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -12,364 +12,364 @@
|
|||||||
#include "../AP_Common/AP_Common.h"
|
#include "../AP_Common/AP_Common.h"
|
||||||
#include "AP_Var_keys.h"
|
#include "AP_Var_keys.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "../FastSerial/FastSerial.h"
|
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
class AP_MavlinkCommand {
|
class AP_MavlinkCommand {
|
||||||
private:
|
private:
|
||||||
struct CommandStorage {
|
struct CommandStorage {
|
||||||
MAV_CMD command;
|
MAV_CMD command;
|
||||||
bool autocontinue;
|
bool autocontinue;
|
||||||
MAV_FRAME frame;
|
MAV_FRAME frame;
|
||||||
float param1;
|
float param1;
|
||||||
float param2;
|
float param2;
|
||||||
float param3;
|
float param3;
|
||||||
float param4;
|
float param4;
|
||||||
float x;
|
float x;
|
||||||
float y;
|
float y;
|
||||||
float z;
|
float z;
|
||||||
};
|
};
|
||||||
AP_VarS<CommandStorage> _data;
|
AP_VarS<CommandStorage> _data;
|
||||||
uint16_t _seq;
|
uint16_t _seq;
|
||||||
public:
|
public:
|
||||||
static AP_MavlinkCommand home;
|
static AP_MavlinkCommand home;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy Constructor
|
* Copy Constructor
|
||||||
*/
|
*/
|
||||||
AP_MavlinkCommand(const AP_MavlinkCommand & v);
|
AP_MavlinkCommand(const AP_MavlinkCommand & v);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Basic Constructor
|
* Basic Constructor
|
||||||
* @param index Start at zero.
|
* @param index Start at zero.
|
||||||
*/
|
*/
|
||||||
AP_MavlinkCommand(uint16_t index, bool doLoad = true);
|
AP_MavlinkCommand(uint16_t index, bool doLoad = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for copying/ saving from a mavlink waypoint.
|
* Constructor for copying/ saving from a mavlink waypoint.
|
||||||
* @param cmd The mavlink_waopint_t structure for the command.
|
* @param cmd The mavlink_waopint_t structure for the command.
|
||||||
*/
|
*/
|
||||||
AP_MavlinkCommand(const mavlink_waypoint_t & cmd);
|
AP_MavlinkCommand(const mavlink_waypoint_t & cmd);
|
||||||
|
|
||||||
bool save() {
|
bool save() {
|
||||||
return _data.save();
|
return _data.save();
|
||||||
}
|
}
|
||||||
bool load() {
|
bool load() {
|
||||||
return _data.load();
|
return _data.load();
|
||||||
}
|
}
|
||||||
uint8_t getSeq() const {
|
uint8_t getSeq() const {
|
||||||
return _seq;
|
return _seq;
|
||||||
}
|
}
|
||||||
bool getAutocontinue() const {
|
bool getAutocontinue() const {
|
||||||
return _data.get().autocontinue;
|
return _data.get().autocontinue;
|
||||||
}
|
}
|
||||||
void setAutocontinue( bool val) {
|
void setAutocontinue( bool val) {
|
||||||
_data.get().autocontinue = val;
|
_data.get().autocontinue = val;
|
||||||
}
|
}
|
||||||
void setSeq(uint8_t val) {
|
void setSeq(uint8_t val) {
|
||||||
_seq = val;
|
_seq = val;
|
||||||
}
|
}
|
||||||
MAV_CMD getCommand() const {
|
MAV_CMD getCommand() const {
|
||||||
return _data.get().command;
|
return _data.get().command;
|
||||||
}
|
}
|
||||||
void setCommand(MAV_CMD val) {
|
void setCommand(MAV_CMD val) {
|
||||||
_data.get().command = val;
|
_data.get().command = val;
|
||||||
}
|
}
|
||||||
MAV_FRAME getFrame() const {
|
MAV_FRAME getFrame() const {
|
||||||
return _data.get().frame;
|
return _data.get().frame;
|
||||||
}
|
}
|
||||||
void setFrame(MAV_FRAME val) {
|
void setFrame(MAV_FRAME val) {
|
||||||
_data.get().frame = val;
|
_data.get().frame = val;
|
||||||
}
|
}
|
||||||
float getParam1() const {
|
float getParam1() const {
|
||||||
return _data.get().param1;
|
return _data.get().param1;
|
||||||
}
|
}
|
||||||
void setParam1(float val) {
|
void setParam1(float val) {
|
||||||
_data.get().param1 = val;
|
_data.get().param1 = val;
|
||||||
}
|
}
|
||||||
float getParam2() const {
|
float getParam2() const {
|
||||||
return _data.get().param2;
|
return _data.get().param2;
|
||||||
}
|
}
|
||||||
void setParam2(float val) {
|
void setParam2(float val) {
|
||||||
_data.get().param2 = val;
|
_data.get().param2 = val;
|
||||||
}
|
}
|
||||||
float getParam3() const {
|
float getParam3() const {
|
||||||
return _data.get().param3;
|
return _data.get().param3;
|
||||||
}
|
}
|
||||||
void setParam3(float val) {
|
void setParam3(float val) {
|
||||||
_data.get().param3 = val;
|
_data.get().param3 = val;
|
||||||
}
|
}
|
||||||
float getParam4() const {
|
float getParam4() const {
|
||||||
return _data.get().param4;
|
return _data.get().param4;
|
||||||
}
|
}
|
||||||
void setParam4(float val) {
|
void setParam4(float val) {
|
||||||
_data.get().param4 = val;
|
_data.get().param4 = val;
|
||||||
}
|
}
|
||||||
float getX() const {
|
float getX() const {
|
||||||
return _data.get().x;
|
return _data.get().x;
|
||||||
}
|
}
|
||||||
void setX(float val) {
|
void setX(float val) {
|
||||||
_data.get().x = val;
|
_data.get().x = val;
|
||||||
}
|
}
|
||||||
float getY() const {
|
float getY() const {
|
||||||
return _data.get().y;
|
return _data.get().y;
|
||||||
}
|
}
|
||||||
void setY(float val) {
|
void setY(float val) {
|
||||||
_data.get().y = val;
|
_data.get().y = val;
|
||||||
}
|
}
|
||||||
float getZ() const {
|
float getZ() const {
|
||||||
return _data.get().z;
|
return _data.get().z;
|
||||||
}
|
}
|
||||||
void setZ(float val) {
|
void setZ(float val) {
|
||||||
_data.get().z = val;
|
_data.get().z = val;
|
||||||
}
|
}
|
||||||
float getLatDeg() const {
|
float getLatDeg() const {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
return getX();
|
return getX();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setLatDeg(float val) {
|
void setLatDeg(float val) {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
setX(val);
|
setX(val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float getLonDeg() const {
|
float getLonDeg() const {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
return getY();
|
return getY();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setLonDeg(float val) {
|
void setLonDeg(float val) {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
setY(val);
|
setY(val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setLon(float val) {
|
void setLon(float val) {
|
||||||
setLonDeg(val * rad2Deg);
|
setLonDeg(val * rad2Deg);
|
||||||
}
|
}
|
||||||
void setLon_degInt(int32_t val) {
|
void setLon_degInt(int32_t val) {
|
||||||
setLonDeg(val / 1.0e7);
|
setLonDeg(val / 1.0e7);
|
||||||
}
|
}
|
||||||
void setLat_degInt(int32_t val) {
|
void setLat_degInt(int32_t val) {
|
||||||
setLatDeg(val / 1.0e7);
|
setLatDeg(val / 1.0e7);
|
||||||
}
|
}
|
||||||
int32_t getLon_degInt() const {
|
int32_t getLon_degInt() const {
|
||||||
return getLonDeg() * 1e7;
|
return getLonDeg() * 1e7;
|
||||||
}
|
}
|
||||||
int32_t getLat_degInt() const {
|
int32_t getLat_degInt() const {
|
||||||
return getLatDeg() * 1e7;
|
return getLatDeg() * 1e7;
|
||||||
}
|
}
|
||||||
float getLon() const {
|
float getLon() const {
|
||||||
return getLonDeg() * deg2Rad;
|
return getLonDeg() * deg2Rad;
|
||||||
}
|
}
|
||||||
float getLat() const {
|
float getLat() const {
|
||||||
return getLatDeg() * deg2Rad;
|
return getLatDeg() * deg2Rad;
|
||||||
}
|
}
|
||||||
void setLat(float val) {
|
void setLat(float val) {
|
||||||
setLatDeg(val * rad2Deg);
|
setLatDeg(val * rad2Deg);
|
||||||
}
|
}
|
||||||
float getAlt() const {
|
float getAlt() const {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
return getZ();
|
return getZ();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
return -getZ() + home.getAlt();
|
return -getZ() + home.getAlt();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
return getZ() + home.getAlt();
|
return getZ() + home.getAlt();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* set the altitude in meters
|
* set the altitude in meters
|
||||||
*/
|
*/
|
||||||
void setAlt(float val) {
|
void setAlt(float val) {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
setZ(val);
|
setZ(val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
setZ(home.getLonDeg() - val);
|
setZ(home.getLonDeg() - val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
setZ(val - home.getLonDeg());
|
setZ(val - home.getLonDeg());
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Get the relative altitude to home
|
* Get the relative altitude to home
|
||||||
* @return relative altitude in meters
|
* @return relative altitude in meters
|
||||||
*/
|
*/
|
||||||
float getRelAlt() const {
|
float getRelAlt() const {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
return getZ() - home.getAlt();
|
return getZ() - home.getAlt();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
return -getZ();
|
return -getZ();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
return getZ();
|
return getZ();
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* set the relative altitude in meters from home (up)
|
* set the relative altitude in meters from home (up)
|
||||||
*/
|
*/
|
||||||
void setRelAlt(float val) {
|
void setRelAlt(float val) {
|
||||||
switch (getFrame()) {
|
switch (getFrame()) {
|
||||||
case MAV_FRAME_GLOBAL:
|
case MAV_FRAME_GLOBAL:
|
||||||
setZ(val + home.getAlt());
|
setZ(val + home.getAlt());
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
case MAV_FRAME_GLOBAL_RELATIVE_ALT:
|
||||||
case MAV_FRAME_LOCAL:
|
case MAV_FRAME_LOCAL:
|
||||||
setZ(-val);
|
setZ(-val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_LOCAL_ENU:
|
case MAV_FRAME_LOCAL_ENU:
|
||||||
setZ(val);
|
setZ(val);
|
||||||
break;
|
break;
|
||||||
case MAV_FRAME_MISSION:
|
case MAV_FRAME_MISSION:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float getRadius() const {
|
float getRadius() const {
|
||||||
return getParam2();
|
return getParam2();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRadius(float val) {
|
void setRadius(float val) {
|
||||||
setParam2(val);
|
setParam2(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* conversion for outbound packets to ground station
|
* conversion for outbound packets to ground station
|
||||||
* @return output the mavlink_waypoint_t packet
|
* @return output the mavlink_waypoint_t packet
|
||||||
*/
|
*/
|
||||||
mavlink_waypoint_t convert(uint8_t current) const;
|
mavlink_waypoint_t convert(uint8_t current) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate the bearing from this command to the next command
|
* Calculate the bearing from this command to the next command
|
||||||
* @param next The command to calculate the bearing to.
|
* @param next The command to calculate the bearing to.
|
||||||
* @return the bearing
|
* @return the bearing
|
||||||
*/
|
*/
|
||||||
float bearingTo(const AP_MavlinkCommand & next) const;
|
float bearingTo(const AP_MavlinkCommand & next) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bearing form this command to a gps coordinate in integer units
|
* Bearing form this command to a gps coordinate in integer units
|
||||||
* @param latDegInt latitude in degrees E-7
|
* @param latDegInt latitude in degrees E-7
|
||||||
* @param lonDegInt longitude in degrees E-7
|
* @param lonDegInt longitude in degrees E-7
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
float bearingTo(int32_t latDegInt, int32_t lonDegInt) const;
|
float bearingTo(int32_t latDegInt, int32_t lonDegInt) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Distance to another command
|
* Distance to another command
|
||||||
* @param next The command to measure to.
|
* @param next The command to measure to.
|
||||||
* @return The distance in meters.
|
* @return The distance in meters.
|
||||||
*/
|
*/
|
||||||
float distanceTo(const AP_MavlinkCommand & next) const;
|
float distanceTo(const AP_MavlinkCommand & next) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Distance to a gps coordinate in integer units
|
* Distance to a gps coordinate in integer units
|
||||||
* @param latDegInt latitude in degrees E-7
|
* @param latDegInt latitude in degrees E-7
|
||||||
* @param lonDegInt longitude in degrees E-7
|
* @param lonDegInt longitude in degrees E-7
|
||||||
* @return The distance in meters.
|
* @return The distance in meters.
|
||||||
*/
|
*/
|
||||||
float distanceTo(int32_t lat_degInt, int32_t lon_degInt) const;
|
float distanceTo(int32_t lat_degInt, int32_t lon_degInt) const;
|
||||||
|
|
||||||
float getPN(int32_t lat_degInt, int32_t lon_degInt) const {
|
float getPN(int32_t lat_degInt, int32_t lon_degInt) const {
|
||||||
// local tangent approximation at this waypoint
|
// local tangent approximation at this waypoint
|
||||||
float deltaLat = (lat_degInt - getLat_degInt()) * degInt2Rad;
|
float deltaLat = (lat_degInt - getLat_degInt()) * degInt2Rad;
|
||||||
return deltaLat * rEarth;
|
return deltaLat * rEarth;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getPE(int32_t lat_degInt, int32_t lon_degInt) const {
|
float getPE(int32_t lat_degInt, int32_t lon_degInt) const {
|
||||||
// local tangent approximation at this waypoint
|
// local tangent approximation at this waypoint
|
||||||
float deltaLon = (lon_degInt - getLon_degInt()) * degInt2Rad;
|
float deltaLon = (lon_degInt - getLon_degInt()) * degInt2Rad;
|
||||||
return cos(getLat()) * deltaLon * rEarth;
|
return cos(getLat()) * deltaLon * rEarth;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getPD(int32_t alt_intM) const {
|
float getPD(int32_t alt_intM) const {
|
||||||
return -(alt_intM / scale_m - getAlt());
|
return -(alt_intM / scale_m - getAlt());
|
||||||
}
|
}
|
||||||
|
|
||||||
float getLat(float pN) const {
|
float getLat(float pN) const {
|
||||||
|
|
||||||
return pN / rEarth + getLat();
|
return pN / rEarth + getLat();
|
||||||
}
|
}
|
||||||
|
|
||||||
float getLon(float pE) const {
|
float getLon(float pE) const {
|
||||||
|
|
||||||
return pE / rEarth / cos(getLat()) + getLon();
|
return pE / rEarth / cos(getLat()) + getLon();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets altitude in meters
|
* Gets altitude in meters
|
||||||
* @param pD alt in meters
|
* @param pD alt in meters
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
float getAlt(float pD) const {
|
float getAlt(float pD) const {
|
||||||
|
|
||||||
return getAlt() - pD;
|
return getAlt() - pD;
|
||||||
}
|
}
|
||||||
|
|
||||||
//calculates cross track of a current location
|
//calculates cross track of a current location
|
||||||
float crossTrack(const AP_MavlinkCommand & previous, int32_t lat_degInt, int32_t lon_degInt) const;
|
float crossTrack(const AP_MavlinkCommand & previous, int32_t lat_degInt, int32_t lon_degInt) const;
|
||||||
|
|
||||||
// calculates along track distance of a current location
|
// calculates along track distance of a current location
|
||||||
float alongTrack(const AP_MavlinkCommand & previous, int32_t lat_degInt, int32_t lon_degInt) const;
|
float alongTrack(const AP_MavlinkCommand & previous, int32_t lat_degInt, int32_t lon_degInt) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
|
||||||
|
|
||||||
#endif /* AP_MAVLINKCOMMAND_H_ */
|
#endif /* AP_MAVLINKCOMMAND_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -15,180 +15,194 @@
|
|||||||
#include "AP_Var_keys.h"
|
#include "AP_Var_keys.h"
|
||||||
#include "../AP_RangeFinder/AP_RangeFinder.h"
|
#include "../AP_RangeFinder/AP_RangeFinder.h"
|
||||||
#include "../AP_IMU/AP_IMU.h"
|
#include "../AP_IMU/AP_IMU.h"
|
||||||
|
#include "../APM_BMP085/APM_BMP085_hil.h"
|
||||||
#include "../APM_BMP085/APM_BMP085.h"
|
#include "../APM_BMP085/APM_BMP085.h"
|
||||||
|
|
||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
AP_Navigator::AP_Navigator(AP_HardwareAbstractionLayer * hal) :
|
AP_Navigator::AP_Navigator(AP_HardwareAbstractionLayer * hal) :
|
||||||
_hal(hal), _timeStamp(0), _roll(0), _rollRate(0), _pitch(0),
|
_hal(hal), _timeStamp(0), _roll(0), _rollRate(0), _pitch(0),
|
||||||
_pitchRate(0), _yaw(0), _yawRate(0), _airSpeed(0),
|
_pitchRate(0), _yaw(0), _yawRate(0), _airSpeed(0),
|
||||||
_groundSpeed(0), _vD(0), _lat_degInt(0),
|
_groundSpeed(0), _vD(0), _lat_degInt(0),
|
||||||
_lon_degInt(0), _alt_intM(0) {
|
_lon_degInt(0), _alt_intM(0) {
|
||||||
}
|
}
|
||||||
void AP_Navigator::calibrate() {
|
void AP_Navigator::calibrate() {
|
||||||
}
|
}
|
||||||
float AP_Navigator::getPD() const {
|
float AP_Navigator::getPD() const {
|
||||||
return AP_MavlinkCommand::home.getPD(getAlt_intM());
|
return AP_MavlinkCommand::home.getPD(getAlt_intM());
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_Navigator::getPE() const {
|
float AP_Navigator::getPE() const {
|
||||||
return AP_MavlinkCommand::home.getPE(getLat_degInt(), getLon_degInt());
|
return AP_MavlinkCommand::home.getPE(getLat_degInt(), getLon_degInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_Navigator::getPN() const {
|
float AP_Navigator::getPN() const {
|
||||||
return AP_MavlinkCommand::home.getPN(getLat_degInt(), getLon_degInt());
|
return AP_MavlinkCommand::home.getPN(getLat_degInt(), getLon_degInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Navigator::setPD(float _pD) {
|
void AP_Navigator::setPD(float _pD) {
|
||||||
setAlt(AP_MavlinkCommand::home.getAlt(_pD));
|
setAlt(AP_MavlinkCommand::home.getAlt(_pD));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Navigator::setPE(float _pE) {
|
void AP_Navigator::setPE(float _pE) {
|
||||||
setLat(AP_MavlinkCommand::home.getLat(_pE));
|
setLat(AP_MavlinkCommand::home.getLat(_pE));
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_Navigator::setPN(float _pN) {
|
void AP_Navigator::setPN(float _pN) {
|
||||||
setLon(AP_MavlinkCommand::home.getLon(_pN));
|
setLon(AP_MavlinkCommand::home.getLon(_pN));
|
||||||
}
|
}
|
||||||
|
|
||||||
DcmNavigator::DcmNavigator(AP_HardwareAbstractionLayer * hal) :
|
DcmNavigator::DcmNavigator(AP_HardwareAbstractionLayer * hal) :
|
||||||
AP_Navigator(hal), _dcm(), _imuOffsetAddress(0) {
|
AP_Navigator(hal), _dcm(), _imuOffsetAddress(0) {
|
||||||
|
|
||||||
// if orientation equal to front, store as front
|
// if orientation equal to front, store as front
|
||||||
/**
|
/**
|
||||||
* rangeFinder<direction> is assigned values based on orientation which
|
* rangeFinder<direction> is assigned values based on orientation which
|
||||||
* is specified in ArduPilotOne.pde.
|
* is specified in ArduPilotOne.pde.
|
||||||
*/
|
*/
|
||||||
for (uint8_t i = 0; i < _hal-> rangeFinders.getSize(); i++) {
|
for (uint8_t i = 0; i < _hal-> rangeFinders.getSize(); i++) {
|
||||||
if (_hal->rangeFinders[i] == NULL)
|
if (_hal->rangeFinders[i] == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (_hal->rangeFinders[i]->orientation_x == 0
|
if (_hal->rangeFinders[i]->orientation_x == 0
|
||||||
&& _hal->rangeFinders[i]->orientation_y == 0
|
&& _hal->rangeFinders[i]->orientation_y == 0
|
||||||
&& _hal->rangeFinders[i]->orientation_z == 1)
|
&& _hal->rangeFinders[i]->orientation_z == 1)
|
||||||
_rangeFinderDown = _hal->rangeFinders[i];
|
_rangeFinderDown = _hal->rangeFinders[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_hal->getMode() == MODE_LIVE) {
|
if (_hal->getMode() == MODE_LIVE) {
|
||||||
if (_hal->adc)
|
|
||||||
_hal->imu = new AP_IMU_Oilpan(_hal->adc, k_sensorCalib);
|
|
||||||
if (_hal->imu)
|
|
||||||
_dcm = new AP_DCM(_hal->imu, _hal->gps, _hal->compass);
|
|
||||||
if (_hal->compass) {
|
|
||||||
_dcm->set_compass(_hal->compass);
|
|
||||||
|
|
||||||
}
|
if (_hal->adc) {
|
||||||
}
|
_hal->imu = new AP_IMU_Oilpan(_hal->adc, k_sensorCalib);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_hal->imu) {
|
||||||
|
_dcm = new AP_DCM(_hal->imu, _hal->gps, _hal->compass);
|
||||||
|
|
||||||
|
// tune down dcm
|
||||||
|
_dcm->kp_roll_pitch(0.030000);
|
||||||
|
_dcm->ki_roll_pitch(0.00001278), // 50 hz I term
|
||||||
|
|
||||||
|
// tune down compass in dcm
|
||||||
|
_dcm->kp_yaw(0.08);
|
||||||
|
_dcm->ki_yaw(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_hal->compass) {
|
||||||
|
_dcm->set_compass(_hal->compass);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void DcmNavigator::calibrate() {
|
void DcmNavigator::calibrate() {
|
||||||
|
|
||||||
AP_Navigator::calibrate();
|
AP_Navigator::calibrate();
|
||||||
|
|
||||||
// TODO: handle cold/warm restart
|
// TODO: handle cold/warm restart
|
||||||
if (_hal->imu) {
|
if (_hal->imu) {
|
||||||
_hal->imu->init(IMU::COLD_START,delay);
|
_hal->imu->init(IMU::COLD_START,delay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void DcmNavigator::updateFast(float dt) {
|
void DcmNavigator::updateFast(float dt) {
|
||||||
|
|
||||||
if (_hal->getMode() != MODE_LIVE)
|
if (_hal->getMode() != MODE_LIVE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setTimeStamp(micros()); // if running in live mode, record new time stamp
|
setTimeStamp(micros()); // if running in live mode, record new time stamp
|
||||||
|
|
||||||
|
|
||||||
//_hal->debug->println_P(PSTR("nav loop"));
|
//_hal->debug->println_P(PSTR("nav loop"));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The altitued is read off the barometer by implementing the following formula:
|
* The altitued is read off the barometer by implementing the following formula:
|
||||||
* altitude (in m) = 44330*(1-(p/po)^(1/5.255)),
|
* altitude (in m) = 44330*(1-(p/po)^(1/5.255)),
|
||||||
* where, po is pressure in Pa at sea level (101325 Pa).
|
* where, po is pressure in Pa at sea level (101325 Pa).
|
||||||
* See http://www.sparkfun.com/tutorials/253 or type this formula
|
* See http://www.sparkfun.com/tutorials/253 or type this formula
|
||||||
* in a search engine for more information.
|
* in a search engine for more information.
|
||||||
* altInt contains the altitude in meters.
|
* altInt contains the altitude in meters.
|
||||||
*/
|
*/
|
||||||
if (_hal->baro) {
|
if (_hal->baro) {
|
||||||
|
|
||||||
if (_rangeFinderDown != NULL && _rangeFinderDown->distance <= 695)
|
if (_rangeFinderDown != NULL && _rangeFinderDown->distance <= 695)
|
||||||
setAlt(_rangeFinderDown->distance);
|
setAlt(_rangeFinderDown->distance);
|
||||||
|
|
||||||
else {
|
else {
|
||||||
float tmp = (_hal->baro->Press / 101325.0);
|
float tmp = (_hal->baro->Press / 101325.0);
|
||||||
tmp = pow(tmp, 0.190295);
|
tmp = pow(tmp, 0.190295);
|
||||||
//setAlt(44330 * (1.0 - tmp)); //sets the altitude in meters XXX wrong, baro reads 0 press
|
//setAlt(44330 * (1.0 - tmp)); //sets the altitude in meters XXX wrong, baro reads 0 press
|
||||||
setAlt(0.0);
|
setAlt(0.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// dcm class for attitude
|
// dcm class for attitude
|
||||||
if (_dcm) {
|
if (_dcm) {
|
||||||
_dcm->update_DCM_fast();
|
_dcm->update_DCM_fast();
|
||||||
setRoll(_dcm->roll);
|
setRoll(_dcm->roll);
|
||||||
setPitch(_dcm->pitch);
|
setPitch(_dcm->pitch);
|
||||||
setYaw(_dcm->yaw);
|
setYaw(_dcm->yaw);
|
||||||
setRollRate(_dcm->get_gyro().x);
|
setRollRate(_dcm->get_gyro().x);
|
||||||
setPitchRate(_dcm->get_gyro().y);
|
setPitchRate(_dcm->get_gyro().y);
|
||||||
setYawRate(_dcm->get_gyro().z);
|
setYawRate(_dcm->get_gyro().z);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* accel/gyro debug
|
* accel/gyro debug
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
Vector3f accel = _hal->imu->get_accel();
|
Vector3f accel = _hal->imu->get_accel();
|
||||||
Vector3f gyro = _hal->imu->get_gyro();
|
Vector3f gyro = _hal->imu->get_gyro();
|
||||||
Serial.printf_P(PSTR("accel: %f %f %f gyro: %f %f %f\n"),
|
Serial.printf_P(PSTR("accel: %f %f %f gyro: %f %f %f\n"),
|
||||||
accel.x,accel.y,accel.z,gyro.x,gyro.y,gyro.z);
|
accel.x,accel.y,accel.z,gyro.x,gyro.y,gyro.z);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void DcmNavigator::updateSlow(float dt) {
|
void DcmNavigator::updateSlow(float dt) {
|
||||||
if (_hal->getMode() != MODE_LIVE)
|
if (_hal->getMode() != MODE_LIVE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
setTimeStamp(micros()); // if running in live mode, record new time stamp
|
setTimeStamp(micros()); // if running in live mode, record new time stamp
|
||||||
|
|
||||||
if (_hal->gps) {
|
if (_hal->gps) {
|
||||||
_hal->gps->update();
|
_hal->gps->update();
|
||||||
updateGpsLight();
|
updateGpsLight();
|
||||||
if (_hal->gps->fix && _hal->gps->new_data) {
|
if (_hal->gps->fix && _hal->gps->new_data) {
|
||||||
setLat_degInt(_hal->gps->latitude);
|
setLat_degInt(_hal->gps->latitude);
|
||||||
setLon_degInt(_hal->gps->longitude);
|
setLon_degInt(_hal->gps->longitude);
|
||||||
setAlt_intM(_hal->gps->altitude * 10); // gps in cm, intM in mm
|
setAlt_intM(_hal->gps->altitude * 10); // gps in cm, intM in mm
|
||||||
setGroundSpeed(_hal->gps->ground_speed / 100.0); // gps is in cm/s
|
setGroundSpeed(_hal->gps->ground_speed / 100.0); // gps is in cm/s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_hal->compass) {
|
if (_hal->compass) {
|
||||||
_hal->compass->read();
|
_hal->compass->read();
|
||||||
_hal->compass->calculate(_dcm->get_dcm_matrix());
|
_hal->compass->calculate(_dcm->get_dcm_matrix());
|
||||||
_hal->compass->null_offsets(_dcm->get_dcm_matrix());
|
_hal->compass->null_offsets(_dcm->get_dcm_matrix());
|
||||||
//_hal->debug->printf_P(PSTR("heading: %f"), _hal->compass->heading);
|
//_hal->debug->printf_P(PSTR("heading: %f"), _hal->compass->heading);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void DcmNavigator::updateGpsLight(void) {
|
void DcmNavigator::updateGpsLight(void) {
|
||||||
// GPS LED on if we have a fix or Blink GPS LED if we are receiving data
|
// GPS LED on if we have a fix or Blink GPS LED if we are receiving data
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
static bool GPS_light = false;
|
static bool GPS_light = false;
|
||||||
switch (_hal->gps->status()) {
|
switch (_hal->gps->status()) {
|
||||||
case (2):
|
case (2):
|
||||||
//digitalWrite(C_LED_PIN, HIGH); //Turn LED C on when gps has valid fix.
|
//digitalWrite(C_LED_PIN, HIGH); //Turn LED C on when gps has valid fix.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (1):
|
case (1):
|
||||||
if (_hal->gps->valid_read == true) {
|
if (_hal->gps->valid_read == true) {
|
||||||
GPS_light = !GPS_light; // Toggle light on and off to indicate gps messages being received, but no GPS fix lock
|
GPS_light = !GPS_light; // Toggle light on and off to indicate gps messages being received, but no GPS fix lock
|
||||||
if (GPS_light) {
|
if (GPS_light) {
|
||||||
digitalWrite(_hal->cLedPin, LOW);
|
digitalWrite(_hal->cLedPin, LOW);
|
||||||
} else {
|
} else {
|
||||||
digitalWrite(_hal->cLedPin, HIGH);
|
digitalWrite(_hal->cLedPin, HIGH);
|
||||||
}
|
}
|
||||||
_hal->gps->valid_read = false;
|
_hal->gps->valid_read = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
digitalWrite(_hal->cLedPin, LOW);
|
digitalWrite(_hal->cLedPin, LOW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -33,195 +33,195 @@ class AP_HardwareAbstractionLayer;
|
|||||||
/// Navigator class
|
/// Navigator class
|
||||||
class AP_Navigator {
|
class AP_Navigator {
|
||||||
public:
|
public:
|
||||||
AP_Navigator(AP_HardwareAbstractionLayer * hal);
|
AP_Navigator(AP_HardwareAbstractionLayer * hal);
|
||||||
virtual void calibrate();
|
virtual void calibrate();
|
||||||
virtual void updateFast(float dt) = 0;
|
virtual void updateFast(float dt) = 0;
|
||||||
virtual void updateSlow(float dt) = 0;
|
virtual void updateSlow(float dt) = 0;
|
||||||
float getPD() const;
|
float getPD() const;
|
||||||
float getPE() const;
|
float getPE() const;
|
||||||
float getPN() const;
|
float getPN() const;
|
||||||
void setPD(float _pD);
|
void setPD(float _pD);
|
||||||
void setPE(float _pE);
|
void setPE(float _pE);
|
||||||
void setPN(float _pN);
|
void setPN(float _pN);
|
||||||
|
|
||||||
float getAirSpeed() const {
|
float getAirSpeed() const {
|
||||||
return _airSpeed;
|
return _airSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getAlt_intM() const {
|
int32_t getAlt_intM() const {
|
||||||
return _alt_intM;
|
return _alt_intM;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getAlt() const {
|
float getAlt() const {
|
||||||
return _alt_intM / scale_m;
|
return _alt_intM / scale_m;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setAlt(float _alt) {
|
void setAlt(float _alt) {
|
||||||
this->_alt_intM = _alt * scale_m;
|
this->_alt_intM = _alt * scale_m;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getLat() const {
|
float getLat() const {
|
||||||
//Serial.print("getLatfirst");
|
//Serial.print("getLatfirst");
|
||||||
//Serial.println(_lat_degInt * degInt2Rad);
|
//Serial.println(_lat_degInt * degInt2Rad);
|
||||||
return _lat_degInt * degInt2Rad;
|
return _lat_degInt * degInt2Rad;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLat(float _lat) {
|
void setLat(float _lat) {
|
||||||
//Serial.print("setLatfirst");
|
//Serial.print("setLatfirst");
|
||||||
//Serial.println(_lat * rad2DegInt);
|
//Serial.println(_lat * rad2DegInt);
|
||||||
setLat_degInt(_lat*rad2DegInt);
|
setLat_degInt(_lat*rad2DegInt);
|
||||||
}
|
}
|
||||||
|
|
||||||
float getLon() const {
|
float getLon() const {
|
||||||
return _lon_degInt * degInt2Rad;
|
return _lon_degInt * degInt2Rad;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLon(float _lon) {
|
void setLon(float _lon) {
|
||||||
this->_lon_degInt = _lon * rad2DegInt;
|
this->_lon_degInt = _lon * rad2DegInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getVD() const {
|
float getVD() const {
|
||||||
return _vD;
|
return _vD;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getVE() const {
|
float getVE() const {
|
||||||
return sin(getYaw()) * getGroundSpeed();
|
return sin(getYaw()) * getGroundSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
float getGroundSpeed() const {
|
float getGroundSpeed() const {
|
||||||
return _groundSpeed;
|
return _groundSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getLat_degInt() const {
|
int32_t getLat_degInt() const {
|
||||||
//Serial.print("getLat_degInt");
|
//Serial.print("getLat_degInt");
|
||||||
//Serial.println(_lat_degInt);
|
//Serial.println(_lat_degInt);
|
||||||
return _lat_degInt;
|
return _lat_degInt;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getLon_degInt() const {
|
int32_t getLon_degInt() const {
|
||||||
return _lon_degInt;
|
return _lon_degInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getVN() const {
|
float getVN() const {
|
||||||
return cos(getYaw()) * getGroundSpeed();
|
return cos(getYaw()) * getGroundSpeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
float getPitch() const {
|
float getPitch() const {
|
||||||
return _pitch;
|
return _pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getPitchRate() const {
|
float getPitchRate() const {
|
||||||
return _pitchRate;
|
return _pitchRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getRoll() const {
|
float getRoll() const {
|
||||||
return _roll;
|
return _roll;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getRollRate() const {
|
float getRollRate() const {
|
||||||
return _rollRate;
|
return _rollRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getYaw() const {
|
float getYaw() const {
|
||||||
return _yaw;
|
return _yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getYawRate() const {
|
float getYawRate() const {
|
||||||
return _yawRate;
|
return _yawRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setAirSpeed(float airSpeed) {
|
void setAirSpeed(float airSpeed) {
|
||||||
_airSpeed = airSpeed;
|
_airSpeed = airSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setAlt_intM(int32_t alt_intM) {
|
void setAlt_intM(int32_t alt_intM) {
|
||||||
_alt_intM = alt_intM;
|
_alt_intM = alt_intM;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setVD(float vD) {
|
void setVD(float vD) {
|
||||||
_vD = vD;
|
_vD = vD;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGroundSpeed(float groundSpeed) {
|
void setGroundSpeed(float groundSpeed) {
|
||||||
_groundSpeed = groundSpeed;
|
_groundSpeed = groundSpeed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLat_degInt(int32_t lat_degInt) {
|
void setLat_degInt(int32_t lat_degInt) {
|
||||||
_lat_degInt = lat_degInt;
|
_lat_degInt = lat_degInt;
|
||||||
//Serial.print("setLat_degInt");
|
//Serial.print("setLat_degInt");
|
||||||
//Serial.println(_lat_degInt);
|
//Serial.println(_lat_degInt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLon_degInt(int32_t lon_degInt) {
|
void setLon_degInt(int32_t lon_degInt) {
|
||||||
_lon_degInt = lon_degInt;
|
_lon_degInt = lon_degInt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPitch(float pitch) {
|
void setPitch(float pitch) {
|
||||||
_pitch = pitch;
|
_pitch = pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPitchRate(float pitchRate) {
|
void setPitchRate(float pitchRate) {
|
||||||
_pitchRate = pitchRate;
|
_pitchRate = pitchRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRoll(float roll) {
|
void setRoll(float roll) {
|
||||||
_roll = roll;
|
_roll = roll;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRollRate(float rollRate) {
|
void setRollRate(float rollRate) {
|
||||||
_rollRate = rollRate;
|
_rollRate = rollRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setYaw(float yaw) {
|
void setYaw(float yaw) {
|
||||||
_yaw = yaw;
|
_yaw = yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setYawRate(float yawRate) {
|
void setYawRate(float yawRate) {
|
||||||
_yawRate = yawRate;
|
_yawRate = yawRate;
|
||||||
}
|
}
|
||||||
void setTimeStamp(int32_t timeStamp) {
|
void setTimeStamp(int32_t timeStamp) {
|
||||||
_timeStamp = timeStamp;
|
_timeStamp = timeStamp;
|
||||||
}
|
}
|
||||||
int32_t getTimeStamp() const {
|
int32_t getTimeStamp() const {
|
||||||
return _timeStamp;
|
return _timeStamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AP_HardwareAbstractionLayer * _hal;
|
AP_HardwareAbstractionLayer * _hal;
|
||||||
private:
|
private:
|
||||||
int32_t _timeStamp; // micros clock
|
int32_t _timeStamp; // micros clock
|
||||||
float _roll; // rad
|
float _roll; // rad
|
||||||
float _rollRate; //rad/s
|
float _rollRate; //rad/s
|
||||||
float _pitch; // rad
|
float _pitch; // rad
|
||||||
float _pitchRate; // rad/s
|
float _pitchRate; // rad/s
|
||||||
float _yaw; // rad
|
float _yaw; // rad
|
||||||
float _yawRate; // rad/s
|
float _yawRate; // rad/s
|
||||||
float _airSpeed; // m/s
|
float _airSpeed; // m/s
|
||||||
float _groundSpeed; // m/s
|
float _groundSpeed; // m/s
|
||||||
float _vD; // m/s
|
float _vD; // m/s
|
||||||
int32_t _lat_degInt; // deg / 1e7
|
int32_t _lat_degInt; // deg / 1e7
|
||||||
int32_t _lon_degInt; // deg / 1e7
|
int32_t _lon_degInt; // deg / 1e7
|
||||||
int32_t _alt_intM; // meters / 1e3
|
int32_t _alt_intM; // meters / 1e3
|
||||||
};
|
};
|
||||||
|
|
||||||
class DcmNavigator: public AP_Navigator {
|
class DcmNavigator: public AP_Navigator {
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Sensors
|
* Sensors
|
||||||
*/
|
*/
|
||||||
|
|
||||||
RangeFinder * _rangeFinderDown;
|
RangeFinder * _rangeFinderDown;
|
||||||
AP_DCM * _dcm;
|
AP_DCM * _dcm;
|
||||||
IMU * _imu;
|
IMU * _imu;
|
||||||
uint16_t _imuOffsetAddress;
|
uint16_t _imuOffsetAddress;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DcmNavigator(AP_HardwareAbstractionLayer * hal);
|
DcmNavigator(AP_HardwareAbstractionLayer * hal);
|
||||||
virtual void calibrate();
|
virtual void calibrate();
|
||||||
virtual void updateFast(float dt);
|
virtual void updateFast(float dt);
|
||||||
virtual void updateSlow(float dt);
|
virtual void updateSlow(float dt);
|
||||||
void updateGpsLight(void);
|
void updateGpsLight(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
@ -18,85 +18,86 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
AP_RcChannel::AP_RcChannel(AP_Var::Key keyValue, const prog_char_t * name,
|
AP_RcChannel::AP_RcChannel(AP_Var::Key keyValue, const prog_char_t * name,
|
||||||
APM_RC_Class & rc, const uint8_t & ch, const uint16_t & pwmMin,
|
APM_RC_Class & rc, const uint8_t & ch, const uint16_t & pwmMin,
|
||||||
const uint16_t & pwmNeutral, const uint16_t & pwmMax,
|
const uint16_t & pwmNeutral, const uint16_t & pwmMax,
|
||||||
const rcMode_t & rcMode, const bool & reverse, const float & scale) :
|
const rcMode_t & rcMode, const bool & reverse, const float & scale) :
|
||||||
AP_Var_group(keyValue, name), _ch(this, 1, ch, PSTR("ch")),
|
AP_Var_group(keyValue, name), _ch(this, 1, ch, PSTR("ch")),
|
||||||
_pwmMin(this, 2, pwmMin, PSTR("pMin")),
|
_pwmMin(this, 2, pwmMin, PSTR("pMin")),
|
||||||
_pwmNeutral(this, 3, pwmNeutral, PSTR("pNtrl")),
|
_pwmNeutral(this, 3, pwmNeutral, PSTR("pNtrl")),
|
||||||
_pwmMax(this, 4, pwmMax, PSTR("pMax")),
|
_pwmMax(this, 4, pwmMax, PSTR("pMax")),
|
||||||
_reverse(this, 5, reverse, PSTR("rev")),
|
_reverse(this, 5, reverse, PSTR("rev")),
|
||||||
_scale(scale == 0 ? AP_Float(0) : AP_Float(this,6,reverse,PSTR("scale"))),
|
_scale(scale == 0 ? AP_Float(0) : AP_Float(this,6,reverse,PSTR("scale"))),
|
||||||
_rcMode(rcMode), _rc(rc), _pwm(pwmNeutral) {
|
_rcMode(rcMode), _rc(rc), _pwm(pwmNeutral) {
|
||||||
//Serial.print("pwm after ctor: "); Serial.println(pwmNeutral);
|
//Serial.print("pwm after ctor: "); Serial.println(pwmNeutral);
|
||||||
if (rcMode == RC_MODE_IN)
|
if (rcMode == RC_MODE_IN)
|
||||||
return;
|
return;
|
||||||
//Serial.print("pwm set for ch: "); Serial.println(int(ch));
|
//Serial.print("pwm set for ch: "); Serial.println(int(ch));
|
||||||
rc.OutputCh(ch, pwmNeutral);
|
rc.OutputCh(ch, pwmNeutral);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t AP_RcChannel::getRadioPwm() {
|
uint16_t AP_RcChannel::getRadioPwm() {
|
||||||
if (_rcMode == RC_MODE_OUT) {
|
if (_rcMode == RC_MODE_OUT) {
|
||||||
Serial.print("tryng to read from output channel: ");
|
Serial.print("tryng to read from output channel: ");
|
||||||
Serial.println(int(_ch));
|
Serial.println(int(_ch));
|
||||||
return _pwmNeutral; // if this happens give a safe value of neutral
|
return _pwmNeutral; // if this happens give a safe value of neutral
|
||||||
}
|
}
|
||||||
return _rc.InputCh(_ch);
|
return _rc.InputCh(_ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_RcChannel::setPwm(uint16_t pwm) {
|
void AP_RcChannel::setPwm(uint16_t pwm) {
|
||||||
//Serial.printf("pwm in setPwm: %d\n", pwm);
|
//Serial.printf("pwm in setPwm: %d\n", pwm);
|
||||||
//Serial.printf("reverse: %s\n", (reverse)?"true":"false");
|
//Serial.printf("reverse: %s\n", (reverse)?"true":"false");
|
||||||
|
|
||||||
// apply reverse
|
// apply reverse
|
||||||
if (_reverse)
|
if (_reverse)
|
||||||
pwm = int16_t(_pwmNeutral - pwm) + _pwmNeutral;
|
pwm = int16_t(_pwmNeutral - pwm) + _pwmNeutral;
|
||||||
//Serial.printf("pwm after reverse: %d\n", pwm);
|
//Serial.printf("pwm after reverse: %d\n", pwm);
|
||||||
|
|
||||||
// apply saturation
|
// apply saturation
|
||||||
if (_pwm > uint8_t(_pwmMax))
|
if (_pwm > uint8_t(_pwmMax))
|
||||||
_pwm = _pwmMax;
|
_pwm = _pwmMax;
|
||||||
if (_pwm < uint8_t(_pwmMin))
|
if (_pwm < uint8_t(_pwmMin))
|
||||||
_pwm = _pwmMin;
|
_pwm = _pwmMin;
|
||||||
_pwm = pwm;
|
_pwm = pwm;
|
||||||
|
|
||||||
//Serial.print("ch: "); Serial.print(ch); Serial.print(" pwm: "); Serial.println(pwm);
|
//Serial.print("ch: "); Serial.print(ch); Serial.print(" pwm: "); Serial.println(pwm);
|
||||||
if (_rcMode == RC_MODE_IN)
|
if (_rcMode == RC_MODE_IN)
|
||||||
return;
|
return;
|
||||||
_rc.OutputCh(_ch, _pwm);
|
_rc.OutputCh(_ch, _pwm);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t AP_RcChannel::_positionToPwm(const float & position) {
|
uint16_t AP_RcChannel::_positionToPwm(const float & position) {
|
||||||
uint16_t pwm;
|
uint16_t pwm;
|
||||||
//Serial.printf("position: %f\n", position);
|
//Serial.printf("position: %f\n", position);
|
||||||
if (position < 0)
|
if (position < 0)
|
||||||
pwm = position * int16_t(_pwmNeutral - _pwmMin) + _pwmNeutral;
|
pwm = position * int16_t(_pwmNeutral - _pwmMin) + _pwmNeutral;
|
||||||
else
|
else
|
||||||
pwm = position * int16_t(_pwmMax - _pwmNeutral) + _pwmNeutral;
|
pwm = position * int16_t(_pwmMax - _pwmNeutral) + _pwmNeutral;
|
||||||
|
|
||||||
if (pwm > uint16_t(_pwmMax))
|
if (pwm > uint16_t(_pwmMax))
|
||||||
pwm = _pwmMax;
|
pwm = _pwmMax;
|
||||||
if (pwm < uint16_t(_pwmMin))
|
if (pwm < uint16_t(_pwmMin))
|
||||||
pwm = _pwmMin;
|
pwm = _pwmMin;
|
||||||
return pwm;
|
return pwm;
|
||||||
}
|
}
|
||||||
|
|
||||||
float AP_RcChannel::_pwmToPosition(const uint16_t & pwm) {
|
float AP_RcChannel::_pwmToPosition(const uint16_t & pwm) {
|
||||||
float position;
|
float position;
|
||||||
// note a piece-wise linear mapping occurs if the pwm ranges
|
// note a piece-wise linear mapping occurs if the pwm ranges
|
||||||
// are not symmetric about pwmNeutral
|
// are not symmetric about pwmNeutral
|
||||||
if (pwm < uint8_t(_pwmNeutral))
|
if (pwm < uint8_t(_pwmNeutral))
|
||||||
position = 1.0 * int16_t(pwm - _pwmNeutral) / int16_t(
|
position = 1.0 * int16_t(pwm - _pwmNeutral) / int16_t(
|
||||||
_pwmNeutral - _pwmMin);
|
_pwmNeutral - _pwmMin);
|
||||||
else
|
else
|
||||||
position = 1.0 * int16_t(pwm - _pwmNeutral) / int16_t(
|
position = 1.0 * int16_t(pwm - _pwmNeutral) / int16_t(
|
||||||
_pwmMax - _pwmNeutral);
|
_pwmMax - _pwmNeutral);
|
||||||
if (position > 1)
|
if (position > 1)
|
||||||
position = 1;
|
position = 1;
|
||||||
if (position < -1)
|
if (position < -1)
|
||||||
position = -1;
|
position = -1;
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace apo
|
} // namespace apo
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
namespace apo {
|
namespace apo {
|
||||||
|
|
||||||
enum rcMode_t {
|
enum rcMode_t {
|
||||||
RC_MODE_IN, RC_MODE_OUT, RC_MODE_INOUT
|
RC_MODE_IN, RC_MODE_OUT, RC_MODE_INOUT
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @class AP_RcChannel
|
/// @class AP_RcChannel
|
||||||
@ -23,62 +23,63 @@ class AP_RcChannel: public AP_Var_group {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
AP_RcChannel(AP_Var::Key keyValue, const prog_char_t * name, APM_RC_Class & rc,
|
AP_RcChannel(AP_Var::Key keyValue, const prog_char_t * name, APM_RC_Class & rc,
|
||||||
const uint8_t & ch, const uint16_t & pwmMin,
|
const uint8_t & ch, const uint16_t & pwmMin,
|
||||||
const uint16_t & pwmNeutral, const uint16_t & pwmMax,
|
const uint16_t & pwmNeutral, const uint16_t & pwmMax,
|
||||||
const rcMode_t & rcMode,
|
const rcMode_t & rcMode,
|
||||||
const bool & reverse, const float & scale = 0);
|
const bool & reverse, const float & scale = 0);
|
||||||
|
|
||||||
// configuration
|
// configuration
|
||||||
AP_Uint8 _ch;
|
AP_Uint8 _ch;
|
||||||
AP_Uint16 _pwmMin;
|
AP_Uint16 _pwmMin;
|
||||||
AP_Uint16 _pwmNeutral;
|
AP_Uint16 _pwmNeutral;
|
||||||
AP_Uint16 _pwmMax;
|
AP_Uint16 _pwmMax;
|
||||||
rcMode_t _rcMode;
|
rcMode_t _rcMode;
|
||||||
AP_Bool _reverse;
|
AP_Bool _reverse;
|
||||||
AP_Float _scale;
|
AP_Float _scale;
|
||||||
|
|
||||||
// get
|
// get
|
||||||
uint16_t getPwm() {
|
uint16_t getPwm() {
|
||||||
return _pwm;
|
return _pwm;
|
||||||
}
|
}
|
||||||
uint16_t getRadioPwm();
|
uint16_t getRadioPwm();
|
||||||
float getPosition() {
|
float getPosition() {
|
||||||
return _pwmToPosition(getPwm());
|
return _pwmToPosition(getPwm());
|
||||||
}
|
}
|
||||||
float getRadioPosition() {
|
float getRadioPosition() {
|
||||||
return _pwmToPosition(getRadioPwm());
|
return _pwmToPosition(getRadioPwm());
|
||||||
}
|
}
|
||||||
float getScaled() {
|
float getScaled() {
|
||||||
return _scale*getPwm();
|
return _scale*getPwm();
|
||||||
}
|
}
|
||||||
|
|
||||||
// set
|
// set
|
||||||
void setUsingRadio() {
|
void setUsingRadio() {
|
||||||
if (_rcMode != RC_MODE_OUT) setPwm(getRadioPwm());
|
if (_rcMode != RC_MODE_OUT) setPwm(getRadioPwm());
|
||||||
}
|
}
|
||||||
void setPwm(uint16_t pwm);
|
void setPwm(uint16_t pwm);
|
||||||
void setPosition(float position) {
|
void setPosition(float position) {
|
||||||
setPwm(_positionToPwm(position));
|
setPwm(_positionToPwm(position));
|
||||||
}
|
}
|
||||||
void setScaled(float val) {
|
void setScaled(float val) {
|
||||||
setPwm(val/_scale);
|
setPwm(val/_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// configuration
|
// configuration
|
||||||
APM_RC_Class & _rc;
|
APM_RC_Class & _rc;
|
||||||
|
|
||||||
// internal states
|
// internal states
|
||||||
uint16_t _pwm; // this is the internal state, position is just created when needed
|
uint16_t _pwm; // this is the internal state, position is just created when needed
|
||||||
|
|
||||||
// private methods
|
// private methods
|
||||||
uint16_t _positionToPwm(const float & position);
|
uint16_t _positionToPwm(const float & position);
|
||||||
float _pwmToPosition(const uint16_t & pwm);
|
float _pwmToPosition(const uint16_t & pwm);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // apo
|
} // apo
|
||||||
|
|
||||||
#endif // AP_RCCHANNEL_H
|
#endif // AP_RCCHANNEL_H
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -3,22 +3,23 @@
|
|||||||
|
|
||||||
enum keys {
|
enum keys {
|
||||||
|
|
||||||
// general
|
// general
|
||||||
k_config = 0,
|
k_config = 0,
|
||||||
k_cntrl,
|
k_cntrl,
|
||||||
k_guide,
|
k_guide,
|
||||||
k_sensorCalib,
|
k_sensorCalib,
|
||||||
|
|
||||||
k_radioChannelsStart=10,
|
k_radioChannelsStart=10,
|
||||||
|
|
||||||
k_controllersStart=30,
|
k_controllersStart=30,
|
||||||
|
|
||||||
k_customStart=100,
|
k_customStart=100,
|
||||||
|
|
||||||
// 200-256 reserved for commands
|
// 200-256 reserved for commands
|
||||||
k_commands = 200
|
k_commands = 200
|
||||||
};
|
};
|
||||||
|
|
||||||
// max 256 keys
|
// max 256 keys
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -21,3 +21,4 @@ const float degInt2Rad = deg2Rad / scale_deg; // degrees x 1e7 to radians
|
|||||||
#define MAV_MODE_FAILSAFE MAV_MODE_TEST3
|
#define MAV_MODE_FAILSAFE MAV_MODE_TEST3
|
||||||
|
|
||||||
#endif /* CONSTANTS_H_ */
|
#endif /* CONSTANTS_H_ */
|
||||||
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -10,40 +10,40 @@
|
|||||||
int packetDrops = 0;
|
int packetDrops = 0;
|
||||||
|
|
||||||
void handleMessage(mavlink_message_t * msg) {
|
void handleMessage(mavlink_message_t * msg) {
|
||||||
Serial.print(", received mavlink message: ");
|
Serial.print(", received mavlink message: ");
|
||||||
Serial.print(msg->msgid, DEC);
|
Serial.print(msg->msgid, DEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(57600);
|
Serial.begin(57600);
|
||||||
Serial3.begin(57600);
|
Serial3.begin(57600);
|
||||||
mavlink_comm_0_port = &Serial3;
|
mavlink_comm_0_port = &Serial3;
|
||||||
packetDrops = 0;
|
packetDrops = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
mavlink_msg_heartbeat_send(MAVLINK_COMM_0, mavlink_system.type,
|
mavlink_msg_heartbeat_send(MAVLINK_COMM_0, mavlink_system.type,
|
||||||
MAV_AUTOPILOT_ARDUPILOTMEGA);
|
MAV_AUTOPILOT_ARDUPILOTMEGA);
|
||||||
Serial.print("heartbeat sent");
|
Serial.print("heartbeat sent");
|
||||||
|
|
||||||
// receive new packets
|
// receive new packets
|
||||||
mavlink_message_t msg;
|
mavlink_message_t msg;
|
||||||
mavlink_status_t status;
|
mavlink_status_t status;
|
||||||
|
|
||||||
Serial.print(", bytes available: ");
|
Serial.print(", bytes available: ");
|
||||||
Serial.print(comm_get_available(MAVLINK_COMM_0));
|
Serial.print(comm_get_available(MAVLINK_COMM_0));
|
||||||
while (comm_get_available( MAVLINK_COMM_0)) {
|
while (comm_get_available( MAVLINK_COMM_0)) {
|
||||||
uint8_t c = comm_receive_ch(MAVLINK_COMM_0);
|
uint8_t c = comm_receive_ch(MAVLINK_COMM_0);
|
||||||
|
|
||||||
// Try to get a new message
|
// Try to get a new message
|
||||||
if (mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status))
|
if (mavlink_parse_char(MAVLINK_COMM_0, c, &msg, &status))
|
||||||
handleMessage(&msg);
|
handleMessage(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update packet drops counter
|
// Update packet drops counter
|
||||||
packetDrops += status.packet_rx_drop_count;
|
packetDrops += status.packet_rx_drop_count;
|
||||||
|
|
||||||
Serial.print(", dropped packets: ");
|
Serial.print(", dropped packets: ");
|
||||||
Serial.println(packetDrops);
|
Serial.println(packetDrops);
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
|
@ -19,91 +19,91 @@ using namespace apo;
|
|||||||
|
|
||||||
class RadioTest {
|
class RadioTest {
|
||||||
private:
|
private:
|
||||||
float testPosition;
|
float testPosition;
|
||||||
int8_t testSign;
|
int8_t testSign;
|
||||||
enum {
|
enum {
|
||||||
version,
|
version,
|
||||||
rollKey,
|
rollKey,
|
||||||
pitchKey,
|
pitchKey,
|
||||||
thrKey,
|
thrKey,
|
||||||
yawKey,
|
yawKey,
|
||||||
ch5Key,
|
ch5Key,
|
||||||
ch6Key,
|
ch6Key,
|
||||||
ch7Key,
|
ch7Key,
|
||||||
ch8Key
|
ch8Key
|
||||||
};
|
};
|
||||||
Vector<AP_RcChannel *> ch;
|
Vector<AP_RcChannel *> ch;
|
||||||
public:
|
public:
|
||||||
RadioTest() :
|
RadioTest() :
|
||||||
testPosition(2), testSign(1) {
|
testPosition(2), testSign(1) {
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(rollKey, PSTR("ROLL"), APM_RC, 0, 1100, 1500,
|
new AP_RcChannel(rollKey, PSTR("ROLL"), APM_RC, 0, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(pitchKey, PSTR("PITCH"), APM_RC, 1, 1100,
|
new AP_RcChannel(pitchKey, PSTR("PITCH"), APM_RC, 1, 1100,
|
||||||
1500, 1900));
|
1500, 1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(thrKey, PSTR("THR"), APM_RC, 2, 1100, 1500,
|
new AP_RcChannel(thrKey, PSTR("THR"), APM_RC, 2, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(yawKey, PSTR("YAW"), APM_RC, 3, 1100, 1500,
|
new AP_RcChannel(yawKey, PSTR("YAW"), APM_RC, 3, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch5Key, PSTR("CH5"), APM_RC, 4, 1100, 1500,
|
new AP_RcChannel(ch5Key, PSTR("CH5"), APM_RC, 4, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch6Key, PSTR("CH6"), APM_RC, 5, 1100, 1500,
|
new AP_RcChannel(ch6Key, PSTR("CH6"), APM_RC, 5, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch7Key, PSTR("CH7"), APM_RC, 6, 1100, 1500,
|
new AP_RcChannel(ch7Key, PSTR("CH7"), APM_RC, 6, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch8Key, PSTR("CH8"), APM_RC, 7, 1100, 1500,
|
new AP_RcChannel(ch8Key, PSTR("CH8"), APM_RC, 7, 1100, 1500,
|
||||||
1900));
|
1900, RC_MODE_INOUT, false));
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
delay(2000);
|
delay(2000);
|
||||||
Serial.println("ArduPilot RC Channel test");
|
Serial.println("ArduPilot RC Channel test");
|
||||||
APM_RC.Init(); // APM Radio initialization
|
APM_RC.Init(); // APM Radio initialization
|
||||||
delay(2000);
|
delay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update() {
|
void update() {
|
||||||
// read the radio
|
// read the radio
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
ch[i]->setUsingRadio();
|
ch[i]->setUsingRadio();
|
||||||
|
|
||||||
// print channel names
|
// print channel names
|
||||||
Serial.print("\t\t");
|
Serial.print("\t\t");
|
||||||
static char name[7];
|
static char name[7];
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++) {
|
for (uint8_t i = 0; i < ch.getSize(); i++) {
|
||||||
ch[i]->copy_name(name, 7);
|
ch[i]->copy_name(name, 7);
|
||||||
Serial.printf("%7s\t", name);
|
Serial.printf("%7s\t", name);
|
||||||
}
|
}
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
// print pwm
|
// print pwm
|
||||||
Serial.printf("pwm :\t");
|
Serial.printf("pwm :\t");
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
Serial.printf("%7d\t", ch[i]->getPwm());
|
Serial.printf("%7d\t", ch[i]->getPwm());
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
// print position
|
// print position
|
||||||
Serial.printf("position :\t");
|
Serial.printf("position :\t");
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
Serial.printf("%7.2f\t", ch[i]->getPosition());
|
Serial.printf("%7.2f\t", ch[i]->getPosition());
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
RadioTest * test;
|
RadioTest * test;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
test = new RadioTest;
|
test = new RadioTest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
test->update();
|
test->update();
|
||||||
}
|
}
|
||||||
|
@ -19,107 +19,107 @@ using namespace apo;
|
|||||||
|
|
||||||
class RadioTest {
|
class RadioTest {
|
||||||
private:
|
private:
|
||||||
float testPosition;
|
float testPosition;
|
||||||
int8_t testSign;
|
int8_t testSign;
|
||||||
enum {
|
enum {
|
||||||
version,
|
version,
|
||||||
rollKey,
|
rollKey,
|
||||||
pitchKey,
|
pitchKey,
|
||||||
thrKey,
|
thrKey,
|
||||||
yawKey,
|
yawKey,
|
||||||
ch5Key,
|
ch5Key,
|
||||||
ch6Key,
|
ch6Key,
|
||||||
ch7Key,
|
ch7Key,
|
||||||
ch8Key
|
ch8Key
|
||||||
};
|
};
|
||||||
Vector<AP_RcChannel *> ch;
|
Vector<AP_RcChannel *> ch;
|
||||||
public:
|
public:
|
||||||
RadioTest() :
|
RadioTest() :
|
||||||
testPosition(2), testSign(1) {
|
testPosition(2), testSign(1) {
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(rollKey, PSTR("ROLL"), APM_RC, 0, 1100, 1500,
|
new AP_RcChannel(rollKey, PSTR("ROLL"), APM_RC, 0, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(pitchKey, PSTR("PITCH"), APM_RC, 1, 1100,
|
new AP_RcChannel(pitchKey, PSTR("PITCH"), APM_RC, 1, 1100,
|
||||||
1500, 1900));
|
1500, 1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(thrKey, PSTR("THR"), APM_RC, 2, 1100, 1500,
|
new AP_RcChannel(thrKey, PSTR("THR"), APM_RC, 2, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(yawKey, PSTR("YAW"), APM_RC, 3, 1100, 1500,
|
new AP_RcChannel(yawKey, PSTR("YAW"), APM_RC, 3, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch5Key, PSTR("CH5"), APM_RC, 4, 1100, 1500,
|
new AP_RcChannel(ch5Key, PSTR("CH5"), APM_RC, 4, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch6Key, PSTR("CH6"), APM_RC, 5, 1100, 1500,
|
new AP_RcChannel(ch6Key, PSTR("CH6"), APM_RC, 5, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch7Key, PSTR("CH7"), APM_RC, 6, 1100, 1500,
|
new AP_RcChannel(ch7Key, PSTR("CH7"), APM_RC, 6, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
ch.push_back(
|
ch.push_back(
|
||||||
new AP_RcChannel(ch8Key, PSTR("CH8"), APM_RC, 7, 1100, 1500,
|
new AP_RcChannel(ch8Key, PSTR("CH8"), APM_RC, 7, 1100, 1500,
|
||||||
1900));
|
1900,RC_MODE_INOUT,false));
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
delay(2000);
|
delay(2000);
|
||||||
Serial.println("ArduPilot RC Channel test");
|
Serial.println("ArduPilot RC Channel test");
|
||||||
APM_RC.Init(); // APM Radio initialization
|
APM_RC.Init(); // APM Radio initialization
|
||||||
delay(2000);
|
delay(2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update() {
|
void update() {
|
||||||
// update test value
|
// update test value
|
||||||
testPosition += testSign * .1;
|
testPosition += testSign * .1;
|
||||||
if (testPosition > 1) {
|
if (testPosition > 1) {
|
||||||
//eepromRegistry.print(Serial); // show eeprom map
|
//eepromRegistry.print(Serial); // show eeprom map
|
||||||
testPosition = 1;
|
testPosition = 1;
|
||||||
testSign = -1;
|
testSign = -1;
|
||||||
} else if (testPosition < -1) {
|
} else if (testPosition < -1) {
|
||||||
testPosition = -1;
|
testPosition = -1;
|
||||||
testSign = 1;
|
testSign = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set channel positions
|
// set channel positions
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
ch[i]->setPosition(testPosition);
|
ch[i]->setPosition(testPosition);
|
||||||
|
|
||||||
// print test position
|
// print test position
|
||||||
Serial.printf("\nnormalized position (%f)\n", testPosition);
|
Serial.printf("\nnormalized position (%f)\n", testPosition);
|
||||||
|
|
||||||
// print channel names
|
// print channel names
|
||||||
Serial.print("\t\t");
|
Serial.print("\t\t");
|
||||||
static char name[7];
|
static char name[7];
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++) {
|
for (uint8_t i = 0; i < ch.getSize(); i++) {
|
||||||
ch[i]->copy_name(name, 7);
|
ch[i]->copy_name(name, 7);
|
||||||
Serial.printf("%7s\t", name);
|
Serial.printf("%7s\t", name);
|
||||||
}
|
}
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
// print pwm
|
// print pwm
|
||||||
Serial.printf("pwm :\t");
|
Serial.printf("pwm :\t");
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
Serial.printf("%7d\t", ch[i]->getRadioPwm());
|
Serial.printf("%7d\t", ch[i]->getRadioPwm());
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
// print position
|
// print position
|
||||||
Serial.printf("position :\t");
|
Serial.printf("position :\t");
|
||||||
for (uint8_t i = 0; i < ch.getSize(); i++)
|
for (uint8_t i = 0; i < ch.getSize(); i++)
|
||||||
Serial.printf("%7.2f\t", ch[i]->getRadioPosition());
|
Serial.printf("%7.2f\t", ch[i]->getRadioPosition());
|
||||||
Serial.println();
|
Serial.println();
|
||||||
|
|
||||||
delay(500);
|
delay(500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
RadioTest * test;
|
RadioTest * test;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
test = new RadioTest;
|
test = new RadioTest;
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
test->update();
|
test->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim:ts=4:sw=4:expandtab
|
// vim:ts=4:sw=4:expandtab
|
||||||
|
@ -171,7 +171,7 @@ else
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
# these are library objects we don't want in the desktop build (maybe we'll add them later)
|
# these are library objects we don't want in the desktop build (maybe we'll add them later)
|
||||||
NODESKTOP := FastSerial/FastSerial.cpp AP_Compass/AP_Compass_HMC5843.cpp APM_BMP085/APM_BMP085.cpp AP_IMU/AP_IMU_Oilpan.cpp AP_OpticalFlow/AP_OpticalFlow_ADNS3080.cpp RC_Channel/RC_Channel_aux.cpp
|
NODESKTOP := FastSerial/FastSerial.cpp AP_Compass/AP_Compass_HMC5843.cpp APM_BMP085/APM_BMP085.cpp AP_IMU/AP_IMU_Oilpan.cpp AP_OpticalFlow/AP_OpticalFlow_ADNS3080.cpp
|
||||||
|
|
||||||
#
|
#
|
||||||
# Find sketchbook libraries referenced by the sketch.
|
# Find sketchbook libraries referenced by the sketch.
|
||||||
|
@ -25,3 +25,6 @@ heli:
|
|||||||
|
|
||||||
helihil:
|
helihil:
|
||||||
make -f $(DESKTOP)/Makefile.desktop EXTRAFLAGS="-DFRAME_CONFIG=HELI_FRAME -DHIL_MODE=HIL_MODE_ATTITUDE -DCLI_ENABLED=DISABLED -DLOGGING_ENABLED=DISABLED"
|
make -f $(DESKTOP)/Makefile.desktop EXTRAFLAGS="-DFRAME_CONFIG=HELI_FRAME -DHIL_MODE=HIL_MODE_ATTITUDE -DCLI_ENABLED=DISABLED -DLOGGING_ENABLED=DISABLED"
|
||||||
|
|
||||||
|
mavlink10:
|
||||||
|
make -f $(DESKTOP)/Makefile.desktop EXTRAFLAGS="-DHIL_MODE=HIL_MODE_ATTITUDE -DMAVLINK10 -DCLI_ENABLED=DISABLED -DLOGGING_ENABLED=DISABLED"
|
||||||
|
@ -11,7 +11,11 @@ BetterStream *mavlink_comm_1_port;
|
|||||||
// this might need to move to the flight software
|
// this might need to move to the flight software
|
||||||
mavlink_system_t mavlink_system = {7,1,0,0};
|
mavlink_system_t mavlink_system = {7,1,0,0};
|
||||||
|
|
||||||
#include "include/mavlink_helpers.h"
|
#ifdef MAVLINK10
|
||||||
|
# include "include_v1.0/mavlink_helpers.h"
|
||||||
|
#else
|
||||||
|
# include "include/mavlink_helpers.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid)
|
uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid)
|
||||||
{
|
{
|
||||||
|
@ -10,13 +10,21 @@
|
|||||||
|
|
||||||
#define MAVLINK_SEPARATE_HELPERS
|
#define MAVLINK_SEPARATE_HELPERS
|
||||||
|
|
||||||
#include "include/ardupilotmega/version.h"
|
#ifdef MAVLINK10
|
||||||
|
# include "include_v1.0/ardupilotmega/version.h"
|
||||||
|
#else
|
||||||
|
# include "include/ardupilotmega/version.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
// this allows us to make mavlink_message_t much smaller
|
// this allows us to make mavlink_message_t much smaller
|
||||||
#define MAVLINK_MAX_PAYLOAD_LEN MAVLINK_MAX_DIALECT_PAYLOAD_SIZE
|
#define MAVLINK_MAX_PAYLOAD_LEN MAVLINK_MAX_DIALECT_PAYLOAD_SIZE
|
||||||
|
|
||||||
#define MAVLINK_COMM_NUM_BUFFERS 2
|
#define MAVLINK_COMM_NUM_BUFFERS 2
|
||||||
#include "include/mavlink_types.h"
|
#ifdef MAVLINK10
|
||||||
|
# include "include_v1.0/mavlink_types.h"
|
||||||
|
#else
|
||||||
|
# include "include/mavlink_types.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/// MAVLink stream used for HIL interaction
|
/// MAVLink stream used for HIL interaction
|
||||||
extern BetterStream *mavlink_comm_0_port;
|
extern BetterStream *mavlink_comm_0_port;
|
||||||
@ -109,7 +117,11 @@ static inline int comm_get_txspace(mavlink_channel_t chan)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define MAVLINK_USE_CONVENIENCE_FUNCTIONS
|
#define MAVLINK_USE_CONVENIENCE_FUNCTIONS
|
||||||
#include "include/ardupilotmega/mavlink.h"
|
#ifdef MAVLINK10
|
||||||
|
# include "include_v1.0/ardupilotmega/mavlink.h"
|
||||||
|
#else
|
||||||
|
# include "include/ardupilotmega/mavlink.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid);
|
uint8_t mavlink_check_target(uint8_t sysid, uint8_t compid);
|
||||||
|
|
||||||
|
@ -12,15 +12,15 @@ extern "C" {
|
|||||||
// MESSAGE LENGTHS AND CRCS
|
// MESSAGE LENGTHS AND CRCS
|
||||||
|
|
||||||
#ifndef MAVLINK_MESSAGE_LENGTHS
|
#ifndef MAVLINK_MESSAGE_LENGTHS
|
||||||
#define MAVLINK_MESSAGE_LENGTHS {3, 4, 8, 14, 8, 28, 3, 32, 0, 2, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 19, 2, 23, 21, 0, 37, 26, 101, 26, 16, 32, 32, 37, 32, 11, 17, 17, 16, 18, 36, 4, 4, 2, 2, 4, 2, 2, 3, 14, 12, 18, 16, 8, 27, 25, 18, 18, 24, 24, 0, 0, 0, 26, 16, 36, 5, 6, 56, 26, 21, 18, 0, 0, 18, 20, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 14, 14, 51, 5}
|
#define MAVLINK_MESSAGE_LENGTHS {3, 4, 8, 14, 8, 28, 3, 32, 0, 2, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 19, 2, 23, 21, 0, 37, 26, 101, 26, 16, 32, 32, 37, 32, 11, 17, 17, 16, 18, 36, 4, 4, 2, 2, 4, 2, 2, 3, 14, 12, 18, 16, 8, 27, 25, 18, 18, 24, 24, 0, 0, 0, 26, 16, 36, 5, 6, 56, 26, 21, 18, 0, 0, 18, 20, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 14, 14, 51, 5}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAVLINK_MESSAGE_CRCS
|
#ifndef MAVLINK_MESSAGE_CRCS
|
||||||
#define MAVLINK_MESSAGE_CRCS {72, 39, 190, 92, 191, 217, 104, 119, 0, 219, 60, 186, 10, 0, 0, 0, 0, 0, 0, 0, 89, 159, 162, 121, 0, 149, 222, 110, 179, 136, 66, 126, 185, 147, 112, 252, 162, 215, 229, 128, 9, 106, 101, 213, 4, 229, 21, 214, 215, 14, 206, 50, 157, 126, 108, 213, 95, 5, 127, 0, 0, 0, 57, 126, 130, 119, 193, 191, 236, 158, 143, 0, 0, 104, 123, 131, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 29, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 224, 60, 106, 7}
|
#define MAVLINK_MESSAGE_CRCS {72, 39, 190, 92, 191, 217, 104, 119, 0, 219, 60, 186, 10, 0, 0, 0, 0, 0, 0, 0, 89, 159, 162, 121, 0, 149, 222, 110, 179, 136, 66, 126, 185, 147, 112, 252, 162, 215, 229, 128, 9, 106, 101, 213, 4, 229, 21, 214, 215, 14, 206, 50, 157, 126, 108, 213, 95, 5, 127, 0, 0, 0, 57, 126, 130, 119, 193, 191, 236, 158, 143, 0, 0, 104, 123, 131, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 29, 208, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 224, 60, 106, 7}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAVLINK_MESSAGE_INFO
|
#ifndef MAVLINK_MESSAGE_INFO
|
||||||
#define MAVLINK_MESSAGE_INFO {MAVLINK_MESSAGE_INFO_HEARTBEAT, MAVLINK_MESSAGE_INFO_BOOT, MAVLINK_MESSAGE_INFO_SYSTEM_TIME, MAVLINK_MESSAGE_INFO_PING, MAVLINK_MESSAGE_INFO_SYSTEM_TIME_UTC, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL_ACK, MAVLINK_MESSAGE_INFO_AUTH_KEY, {NULL}, MAVLINK_MESSAGE_INFO_ACTION_ACK, MAVLINK_MESSAGE_INFO_ACTION, MAVLINK_MESSAGE_INFO_SET_MODE, MAVLINK_MESSAGE_INFO_SET_NAV_MODE, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_READ, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_LIST, MAVLINK_MESSAGE_INFO_PARAM_VALUE, MAVLINK_MESSAGE_INFO_PARAM_SET, {NULL}, MAVLINK_MESSAGE_INFO_GPS_RAW_INT, MAVLINK_MESSAGE_INFO_SCALED_IMU, MAVLINK_MESSAGE_INFO_GPS_STATUS, MAVLINK_MESSAGE_INFO_RAW_IMU, MAVLINK_MESSAGE_INFO_RAW_PRESSURE, MAVLINK_MESSAGE_INFO_ATTITUDE, MAVLINK_MESSAGE_INFO_LOCAL_POSITION, MAVLINK_MESSAGE_INFO_GPS_RAW, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION, MAVLINK_MESSAGE_INFO_SYS_STATUS, MAVLINK_MESSAGE_INFO_RC_CHANNELS_RAW, MAVLINK_MESSAGE_INFO_RC_CHANNELS_SCALED, MAVLINK_MESSAGE_INFO_SERVO_OUTPUT_RAW, MAVLINK_MESSAGE_INFO_SCALED_PRESSURE, MAVLINK_MESSAGE_INFO_WAYPOINT, MAVLINK_MESSAGE_INFO_WAYPOINT_REQUEST, MAVLINK_MESSAGE_INFO_WAYPOINT_SET_CURRENT, MAVLINK_MESSAGE_INFO_WAYPOINT_CURRENT, MAVLINK_MESSAGE_INFO_WAYPOINT_REQUEST_LIST, MAVLINK_MESSAGE_INFO_WAYPOINT_COUNT, MAVLINK_MESSAGE_INFO_WAYPOINT_CLEAR_ALL, MAVLINK_MESSAGE_INFO_WAYPOINT_REACHED, MAVLINK_MESSAGE_INFO_WAYPOINT_ACK, MAVLINK_MESSAGE_INFO_GPS_SET_GLOBAL_ORIGIN, MAVLINK_MESSAGE_INFO_GPS_LOCAL_ORIGIN_SET, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_SETPOINT_SET, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_SETPOINT, MAVLINK_MESSAGE_INFO_CONTROL_STATUS, MAVLINK_MESSAGE_INFO_SAFETY_SET_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SAFETY_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_THRUST, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_SPEED_THRUST, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_THRUST_SETPOINT, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_NAV_CONTROLLER_OUTPUT, MAVLINK_MESSAGE_INFO_POSITION_TARGET, MAVLINK_MESSAGE_INFO_STATE_CORRECTION, MAVLINK_MESSAGE_INFO_SET_ALTITUDE, MAVLINK_MESSAGE_INFO_REQUEST_DATA_STREAM, MAVLINK_MESSAGE_INFO_HIL_STATE, MAVLINK_MESSAGE_INFO_HIL_CONTROLS, MAVLINK_MESSAGE_INFO_MANUAL_CONTROL, MAVLINK_MESSAGE_INFO_RC_CHANNELS_OVERRIDE, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION_INT, MAVLINK_MESSAGE_INFO_VFR_HUD, MAVLINK_MESSAGE_INFO_COMMAND, MAVLINK_MESSAGE_INFO_COMMAND_ACK, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_OPTICAL_FLOW, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_OBJECT_DETECTION_EVENT, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_SENSOR_OFFSETS, MAVLINK_MESSAGE_INFO_SET_MAG_OFFSETS, MAVLINK_MESSAGE_INFO_MEMINFO, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_DEBUG_VECT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_FLOAT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_INT, MAVLINK_MESSAGE_INFO_STATUSTEXT, MAVLINK_MESSAGE_INFO_DEBUG}
|
#define MAVLINK_MESSAGE_INFO {MAVLINK_MESSAGE_INFO_HEARTBEAT, MAVLINK_MESSAGE_INFO_BOOT, MAVLINK_MESSAGE_INFO_SYSTEM_TIME, MAVLINK_MESSAGE_INFO_PING, MAVLINK_MESSAGE_INFO_SYSTEM_TIME_UTC, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL_ACK, MAVLINK_MESSAGE_INFO_AUTH_KEY, {NULL}, MAVLINK_MESSAGE_INFO_ACTION_ACK, MAVLINK_MESSAGE_INFO_ACTION, MAVLINK_MESSAGE_INFO_SET_MODE, MAVLINK_MESSAGE_INFO_SET_NAV_MODE, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_READ, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_LIST, MAVLINK_MESSAGE_INFO_PARAM_VALUE, MAVLINK_MESSAGE_INFO_PARAM_SET, {NULL}, MAVLINK_MESSAGE_INFO_GPS_RAW_INT, MAVLINK_MESSAGE_INFO_SCALED_IMU, MAVLINK_MESSAGE_INFO_GPS_STATUS, MAVLINK_MESSAGE_INFO_RAW_IMU, MAVLINK_MESSAGE_INFO_RAW_PRESSURE, MAVLINK_MESSAGE_INFO_ATTITUDE, MAVLINK_MESSAGE_INFO_LOCAL_POSITION, MAVLINK_MESSAGE_INFO_GPS_RAW, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION, MAVLINK_MESSAGE_INFO_SYS_STATUS, MAVLINK_MESSAGE_INFO_RC_CHANNELS_RAW, MAVLINK_MESSAGE_INFO_RC_CHANNELS_SCALED, MAVLINK_MESSAGE_INFO_SERVO_OUTPUT_RAW, MAVLINK_MESSAGE_INFO_SCALED_PRESSURE, MAVLINK_MESSAGE_INFO_WAYPOINT, MAVLINK_MESSAGE_INFO_WAYPOINT_REQUEST, MAVLINK_MESSAGE_INFO_WAYPOINT_SET_CURRENT, MAVLINK_MESSAGE_INFO_WAYPOINT_CURRENT, MAVLINK_MESSAGE_INFO_WAYPOINT_REQUEST_LIST, MAVLINK_MESSAGE_INFO_WAYPOINT_COUNT, MAVLINK_MESSAGE_INFO_WAYPOINT_CLEAR_ALL, MAVLINK_MESSAGE_INFO_WAYPOINT_REACHED, MAVLINK_MESSAGE_INFO_WAYPOINT_ACK, MAVLINK_MESSAGE_INFO_GPS_SET_GLOBAL_ORIGIN, MAVLINK_MESSAGE_INFO_GPS_LOCAL_ORIGIN_SET, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_SETPOINT_SET, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_SETPOINT, MAVLINK_MESSAGE_INFO_CONTROL_STATUS, MAVLINK_MESSAGE_INFO_SAFETY_SET_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SAFETY_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_THRUST, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_SPEED_THRUST, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_THRUST_SETPOINT, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_NAV_CONTROLLER_OUTPUT, MAVLINK_MESSAGE_INFO_POSITION_TARGET, MAVLINK_MESSAGE_INFO_STATE_CORRECTION, MAVLINK_MESSAGE_INFO_SET_ALTITUDE, MAVLINK_MESSAGE_INFO_REQUEST_DATA_STREAM, MAVLINK_MESSAGE_INFO_HIL_STATE, MAVLINK_MESSAGE_INFO_HIL_CONTROLS, MAVLINK_MESSAGE_INFO_MANUAL_CONTROL, MAVLINK_MESSAGE_INFO_RC_CHANNELS_OVERRIDE, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION_INT, MAVLINK_MESSAGE_INFO_VFR_HUD, MAVLINK_MESSAGE_INFO_COMMAND, MAVLINK_MESSAGE_INFO_COMMAND_ACK, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_OPTICAL_FLOW, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_OBJECT_DETECTION_EVENT, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_SENSOR_OFFSETS, MAVLINK_MESSAGE_INFO_SET_MAG_OFFSETS, MAVLINK_MESSAGE_INFO_MEMINFO, MAVLINK_MESSAGE_INFO_AP_ADC, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_DEBUG_VECT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_FLOAT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_INT, MAVLINK_MESSAGE_INFO_STATUSTEXT, MAVLINK_MESSAGE_INFO_DEBUG}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../protocol.h"
|
#include "../protocol.h"
|
||||||
@ -48,6 +48,7 @@ extern "C" {
|
|||||||
#include "./mavlink_msg_sensor_offsets.h"
|
#include "./mavlink_msg_sensor_offsets.h"
|
||||||
#include "./mavlink_msg_set_mag_offsets.h"
|
#include "./mavlink_msg_set_mag_offsets.h"
|
||||||
#include "./mavlink_msg_meminfo.h"
|
#include "./mavlink_msg_meminfo.h"
|
||||||
|
#include "./mavlink_msg_ap_adc.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
254
libraries/GCS_MAVLink/include/ardupilotmega/mavlink_msg_ap_adc.h
Normal file
254
libraries/GCS_MAVLink/include/ardupilotmega/mavlink_msg_ap_adc.h
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
// MESSAGE AP_ADC PACKING
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_ADC 153
|
||||||
|
|
||||||
|
typedef struct __mavlink_ap_adc_t
|
||||||
|
{
|
||||||
|
uint16_t adc1; ///< ADC output 1
|
||||||
|
uint16_t adc2; ///< ADC output 2
|
||||||
|
uint16_t adc3; ///< ADC output 3
|
||||||
|
uint16_t adc4; ///< ADC output 4
|
||||||
|
uint16_t adc5; ///< ADC output 5
|
||||||
|
uint16_t adc6; ///< ADC output 6
|
||||||
|
} mavlink_ap_adc_t;
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_ADC_LEN 12
|
||||||
|
#define MAVLINK_MSG_ID_153_LEN 12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MAVLINK_MESSAGE_INFO_AP_ADC { \
|
||||||
|
"AP_ADC", \
|
||||||
|
6, \
|
||||||
|
{ { "adc1", NULL, MAVLINK_TYPE_UINT16_T, 0, 0, offsetof(mavlink_ap_adc_t, adc1) }, \
|
||||||
|
{ "adc2", NULL, MAVLINK_TYPE_UINT16_T, 0, 2, offsetof(mavlink_ap_adc_t, adc2) }, \
|
||||||
|
{ "adc3", NULL, MAVLINK_TYPE_UINT16_T, 0, 4, offsetof(mavlink_ap_adc_t, adc3) }, \
|
||||||
|
{ "adc4", NULL, MAVLINK_TYPE_UINT16_T, 0, 6, offsetof(mavlink_ap_adc_t, adc4) }, \
|
||||||
|
{ "adc5", NULL, MAVLINK_TYPE_UINT16_T, 0, 8, offsetof(mavlink_ap_adc_t, adc5) }, \
|
||||||
|
{ "adc6", NULL, MAVLINK_TYPE_UINT16_T, 0, 10, offsetof(mavlink_ap_adc_t, adc6) }, \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_adc message
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
*
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
|
||||||
|
uint16_t adc1, uint16_t adc2, uint16_t adc3, uint16_t adc4, uint16_t adc5, uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 12);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 12);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_ADC;
|
||||||
|
return mavlink_finalize_message(msg, system_id, component_id, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_adc message on a channel
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param chan The MAVLink channel this message was sent over
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
|
||||||
|
mavlink_message_t* msg,
|
||||||
|
uint16_t adc1,uint16_t adc2,uint16_t adc3,uint16_t adc4,uint16_t adc5,uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 12);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 12);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_ADC;
|
||||||
|
return mavlink_finalize_message_chan(msg, system_id, component_id, chan, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Encode a ap_adc struct into a message
|
||||||
|
*
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param ap_adc C-struct to read the message contents from
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_encode(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg, const mavlink_ap_adc_t* ap_adc)
|
||||||
|
{
|
||||||
|
return mavlink_msg_ap_adc_pack(system_id, component_id, msg, ap_adc->adc1, ap_adc->adc2, ap_adc->adc3, ap_adc->adc4, ap_adc->adc5, ap_adc->adc6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a ap_adc message
|
||||||
|
* @param chan MAVLink channel to send the message
|
||||||
|
*
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
*/
|
||||||
|
#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
|
||||||
|
|
||||||
|
static inline void mavlink_msg_ap_adc_send(mavlink_channel_t chan, uint16_t adc1, uint16_t adc2, uint16_t adc3, uint16_t adc4, uint16_t adc5, uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_ADC, buf, 12);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_ADC, (const char *)&packet, 12);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// MESSAGE AP_ADC UNPACKING
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc1 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 1
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc1(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc2 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 2
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc2(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc3 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 3
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc3(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc4 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 4
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc4(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc5 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 5
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc5(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc6 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 6
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc6(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode a ap_adc message into a struct
|
||||||
|
*
|
||||||
|
* @param msg The message to decode
|
||||||
|
* @param ap_adc C-struct to decode the message contents into
|
||||||
|
*/
|
||||||
|
static inline void mavlink_msg_ap_adc_decode(const mavlink_message_t* msg, mavlink_ap_adc_t* ap_adc)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP
|
||||||
|
ap_adc->adc1 = mavlink_msg_ap_adc_get_adc1(msg);
|
||||||
|
ap_adc->adc2 = mavlink_msg_ap_adc_get_adc2(msg);
|
||||||
|
ap_adc->adc3 = mavlink_msg_ap_adc_get_adc3(msg);
|
||||||
|
ap_adc->adc4 = mavlink_msg_ap_adc_get_adc4(msg);
|
||||||
|
ap_adc->adc5 = mavlink_msg_ap_adc_get_adc5(msg);
|
||||||
|
ap_adc->adc6 = mavlink_msg_ap_adc_get_adc6(msg);
|
||||||
|
#else
|
||||||
|
memcpy(ap_adc, _MAV_PAYLOAD(msg), 12);
|
||||||
|
#endif
|
||||||
|
}
|
@ -0,0 +1,210 @@
|
|||||||
|
// MESSAGE AP_TIMING PACKING
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_TIMING 155
|
||||||
|
|
||||||
|
typedef struct __mavlink_ap_timing_t
|
||||||
|
{
|
||||||
|
uint16_t min_50Hz_delta; ///< mininum delta for 50Hz loop
|
||||||
|
uint16_t max_50Hz_delta; ///< maximum delta for 50Hz loop
|
||||||
|
uint16_t min_200Hz_delta; ///< mininum delta for 200Hz loop
|
||||||
|
uint16_t max_200Hz_delta; ///< maximum delta for 200Hz loop
|
||||||
|
} mavlink_ap_timing_t;
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_TIMING_LEN 8
|
||||||
|
#define MAVLINK_MSG_ID_155_LEN 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MAVLINK_MESSAGE_INFO_AP_TIMING { \
|
||||||
|
"AP_TIMING", \
|
||||||
|
4, \
|
||||||
|
{ { "min_50Hz_delta", NULL, MAVLINK_TYPE_UINT16_T, 0, 0, offsetof(mavlink_ap_timing_t, min_50Hz_delta) }, \
|
||||||
|
{ "max_50Hz_delta", NULL, MAVLINK_TYPE_UINT16_T, 0, 2, offsetof(mavlink_ap_timing_t, max_50Hz_delta) }, \
|
||||||
|
{ "min_200Hz_delta", NULL, MAVLINK_TYPE_UINT16_T, 0, 4, offsetof(mavlink_ap_timing_t, min_200Hz_delta) }, \
|
||||||
|
{ "max_200Hz_delta", NULL, MAVLINK_TYPE_UINT16_T, 0, 6, offsetof(mavlink_ap_timing_t, max_200Hz_delta) }, \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_timing message
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
*
|
||||||
|
* @param min_50Hz_delta mininum delta for 50Hz loop
|
||||||
|
* @param max_50Hz_delta maximum delta for 50Hz loop
|
||||||
|
* @param min_200Hz_delta mininum delta for 200Hz loop
|
||||||
|
* @param max_200Hz_delta maximum delta for 200Hz loop
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
|
||||||
|
uint16_t min_50Hz_delta, uint16_t max_50Hz_delta, uint16_t min_200Hz_delta, uint16_t max_200Hz_delta)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[8];
|
||||||
|
_mav_put_uint16_t(buf, 0, min_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 2, max_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 4, min_200Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 6, max_200Hz_delta);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 8);
|
||||||
|
#else
|
||||||
|
mavlink_ap_timing_t packet;
|
||||||
|
packet.min_50Hz_delta = min_50Hz_delta;
|
||||||
|
packet.max_50Hz_delta = max_50Hz_delta;
|
||||||
|
packet.min_200Hz_delta = min_200Hz_delta;
|
||||||
|
packet.max_200Hz_delta = max_200Hz_delta;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_TIMING;
|
||||||
|
return mavlink_finalize_message(msg, system_id, component_id, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_timing message on a channel
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param chan The MAVLink channel this message was sent over
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param min_50Hz_delta mininum delta for 50Hz loop
|
||||||
|
* @param max_50Hz_delta maximum delta for 50Hz loop
|
||||||
|
* @param min_200Hz_delta mininum delta for 200Hz loop
|
||||||
|
* @param max_200Hz_delta maximum delta for 200Hz loop
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
|
||||||
|
mavlink_message_t* msg,
|
||||||
|
uint16_t min_50Hz_delta,uint16_t max_50Hz_delta,uint16_t min_200Hz_delta,uint16_t max_200Hz_delta)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[8];
|
||||||
|
_mav_put_uint16_t(buf, 0, min_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 2, max_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 4, min_200Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 6, max_200Hz_delta);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 8);
|
||||||
|
#else
|
||||||
|
mavlink_ap_timing_t packet;
|
||||||
|
packet.min_50Hz_delta = min_50Hz_delta;
|
||||||
|
packet.max_50Hz_delta = max_50Hz_delta;
|
||||||
|
packet.min_200Hz_delta = min_200Hz_delta;
|
||||||
|
packet.max_200Hz_delta = max_200Hz_delta;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 8);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_TIMING;
|
||||||
|
return mavlink_finalize_message_chan(msg, system_id, component_id, chan, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Encode a ap_timing struct into a message
|
||||||
|
*
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param ap_timing C-struct to read the message contents from
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_encode(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg, const mavlink_ap_timing_t* ap_timing)
|
||||||
|
{
|
||||||
|
return mavlink_msg_ap_timing_pack(system_id, component_id, msg, ap_timing->min_50Hz_delta, ap_timing->max_50Hz_delta, ap_timing->min_200Hz_delta, ap_timing->max_200Hz_delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a ap_timing message
|
||||||
|
* @param chan MAVLink channel to send the message
|
||||||
|
*
|
||||||
|
* @param min_50Hz_delta mininum delta for 50Hz loop
|
||||||
|
* @param max_50Hz_delta maximum delta for 50Hz loop
|
||||||
|
* @param min_200Hz_delta mininum delta for 200Hz loop
|
||||||
|
* @param max_200Hz_delta maximum delta for 200Hz loop
|
||||||
|
*/
|
||||||
|
#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
|
||||||
|
|
||||||
|
static inline void mavlink_msg_ap_timing_send(mavlink_channel_t chan, uint16_t min_50Hz_delta, uint16_t max_50Hz_delta, uint16_t min_200Hz_delta, uint16_t max_200Hz_delta)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[8];
|
||||||
|
_mav_put_uint16_t(buf, 0, min_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 2, max_50Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 4, min_200Hz_delta);
|
||||||
|
_mav_put_uint16_t(buf, 6, max_200Hz_delta);
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_TIMING, buf, 8);
|
||||||
|
#else
|
||||||
|
mavlink_ap_timing_t packet;
|
||||||
|
packet.min_50Hz_delta = min_50Hz_delta;
|
||||||
|
packet.max_50Hz_delta = max_50Hz_delta;
|
||||||
|
packet.min_200Hz_delta = min_200Hz_delta;
|
||||||
|
packet.max_200Hz_delta = max_200Hz_delta;
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_TIMING, (const char *)&packet, 8);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// MESSAGE AP_TIMING UNPACKING
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field min_50Hz_delta from ap_timing message
|
||||||
|
*
|
||||||
|
* @return mininum delta for 50Hz loop
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_get_min_50Hz_delta(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field max_50Hz_delta from ap_timing message
|
||||||
|
*
|
||||||
|
* @return maximum delta for 50Hz loop
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_get_max_50Hz_delta(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field min_200Hz_delta from ap_timing message
|
||||||
|
*
|
||||||
|
* @return mininum delta for 200Hz loop
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_get_min_200Hz_delta(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field max_200Hz_delta from ap_timing message
|
||||||
|
*
|
||||||
|
* @return maximum delta for 200Hz loop
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_timing_get_max_200Hz_delta(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode a ap_timing message into a struct
|
||||||
|
*
|
||||||
|
* @param msg The message to decode
|
||||||
|
* @param ap_timing C-struct to decode the message contents into
|
||||||
|
*/
|
||||||
|
static inline void mavlink_msg_ap_timing_decode(const mavlink_message_t* msg, mavlink_ap_timing_t* ap_timing)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP
|
||||||
|
ap_timing->min_50Hz_delta = mavlink_msg_ap_timing_get_min_50Hz_delta(msg);
|
||||||
|
ap_timing->max_50Hz_delta = mavlink_msg_ap_timing_get_max_50Hz_delta(msg);
|
||||||
|
ap_timing->min_200Hz_delta = mavlink_msg_ap_timing_get_min_200Hz_delta(msg);
|
||||||
|
ap_timing->max_200Hz_delta = mavlink_msg_ap_timing_get_max_200Hz_delta(msg);
|
||||||
|
#else
|
||||||
|
memcpy(ap_timing, _MAV_PAYLOAD(msg), 8);
|
||||||
|
#endif
|
||||||
|
}
|
@ -185,11 +185,65 @@ static void mavlink_test_meminfo(uint8_t system_id, uint8_t component_id, mavlin
|
|||||||
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mavlink_test_ap_adc(uint8_t system_id, uint8_t component_id, mavlink_message_t *last_msg)
|
||||||
|
{
|
||||||
|
mavlink_message_t msg;
|
||||||
|
uint8_t buffer[MAVLINK_MAX_PACKET_LEN];
|
||||||
|
uint16_t i;
|
||||||
|
mavlink_ap_adc_t packet_in = {
|
||||||
|
17235,
|
||||||
|
17339,
|
||||||
|
17443,
|
||||||
|
17547,
|
||||||
|
17651,
|
||||||
|
17755,
|
||||||
|
};
|
||||||
|
mavlink_ap_adc_t packet1, packet2;
|
||||||
|
memset(&packet1, 0, sizeof(packet1));
|
||||||
|
packet1.adc1 = packet_in.adc1;
|
||||||
|
packet1.adc2 = packet_in.adc2;
|
||||||
|
packet1.adc3 = packet_in.adc3;
|
||||||
|
packet1.adc4 = packet_in.adc4;
|
||||||
|
packet1.adc5 = packet_in.adc5;
|
||||||
|
packet1.adc6 = packet_in.adc6;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
memset(&packet2, 0, sizeof(packet2));
|
||||||
|
mavlink_msg_ap_adc_encode(system_id, component_id, &msg, &packet1);
|
||||||
|
mavlink_msg_ap_adc_decode(&msg, &packet2);
|
||||||
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
|
|
||||||
|
memset(&packet2, 0, sizeof(packet2));
|
||||||
|
mavlink_msg_ap_adc_pack(system_id, component_id, &msg , packet1.adc1 , packet1.adc2 , packet1.adc3 , packet1.adc4 , packet1.adc5 , packet1.adc6 );
|
||||||
|
mavlink_msg_ap_adc_decode(&msg, &packet2);
|
||||||
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
|
|
||||||
|
memset(&packet2, 0, sizeof(packet2));
|
||||||
|
mavlink_msg_ap_adc_pack_chan(system_id, component_id, MAVLINK_COMM_0, &msg , packet1.adc1 , packet1.adc2 , packet1.adc3 , packet1.adc4 , packet1.adc5 , packet1.adc6 );
|
||||||
|
mavlink_msg_ap_adc_decode(&msg, &packet2);
|
||||||
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
|
|
||||||
|
memset(&packet2, 0, sizeof(packet2));
|
||||||
|
mavlink_msg_to_send_buffer(buffer, &msg);
|
||||||
|
for (i=0; i<mavlink_msg_get_send_buffer_length(&msg); i++) {
|
||||||
|
comm_send_ch(MAVLINK_COMM_0, buffer[i]);
|
||||||
|
}
|
||||||
|
mavlink_msg_ap_adc_decode(last_msg, &packet2);
|
||||||
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
|
|
||||||
|
memset(&packet2, 0, sizeof(packet2));
|
||||||
|
mavlink_msg_ap_adc_send(MAVLINK_COMM_1 , packet1.adc1 , packet1.adc2 , packet1.adc3 , packet1.adc4 , packet1.adc5 , packet1.adc6 );
|
||||||
|
mavlink_msg_ap_adc_decode(last_msg, &packet2);
|
||||||
|
MAVLINK_ASSERT(memcmp(&packet1, &packet2, sizeof(packet1)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void mavlink_test_ardupilotmega(uint8_t system_id, uint8_t component_id, mavlink_message_t *last_msg)
|
static void mavlink_test_ardupilotmega(uint8_t system_id, uint8_t component_id, mavlink_message_t *last_msg)
|
||||||
{
|
{
|
||||||
mavlink_test_sensor_offsets(system_id, component_id, last_msg);
|
mavlink_test_sensor_offsets(system_id, component_id, last_msg);
|
||||||
mavlink_test_set_mag_offsets(system_id, component_id, last_msg);
|
mavlink_test_set_mag_offsets(system_id, component_id, last_msg);
|
||||||
mavlink_test_meminfo(system_id, component_id, last_msg);
|
mavlink_test_meminfo(system_id, component_id, last_msg);
|
||||||
|
mavlink_test_ap_adc(system_id, component_id, last_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#ifndef MAVLINK_VERSION_H
|
#ifndef MAVLINK_VERSION_H
|
||||||
#define MAVLINK_VERSION_H
|
#define MAVLINK_VERSION_H
|
||||||
|
|
||||||
#define MAVLINK_BUILD_DATE "Sun Sep 4 18:16:41 2011"
|
#define MAVLINK_BUILD_DATE "Sun Oct 16 13:23:41 2011"
|
||||||
#define MAVLINK_WIRE_PROTOCOL_VERSION "0.9"
|
#define MAVLINK_WIRE_PROTOCOL_VERSION "0.9"
|
||||||
#define MAVLINK_MAX_DIALECT_PAYLOAD_SIZE 101
|
#define MAVLINK_MAX_DIALECT_PAYLOAD_SIZE 101
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#ifndef MAVLINK_VERSION_H
|
#ifndef MAVLINK_VERSION_H
|
||||||
#define MAVLINK_VERSION_H
|
#define MAVLINK_VERSION_H
|
||||||
|
|
||||||
#define MAVLINK_BUILD_DATE "Sun Sep 4 18:16:41 2011"
|
#define MAVLINK_BUILD_DATE "Sun Oct 16 13:23:42 2011"
|
||||||
#define MAVLINK_WIRE_PROTOCOL_VERSION "0.9"
|
#define MAVLINK_WIRE_PROTOCOL_VERSION "0.9"
|
||||||
#define MAVLINK_MAX_DIALECT_PAYLOAD_SIZE 101
|
#define MAVLINK_MAX_DIALECT_PAYLOAD_SIZE 101
|
||||||
|
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
/** @file
|
||||||
|
* @brief MAVLink comm protocol generated from ardupilotmega.xml
|
||||||
|
* @see http://qgroundcontrol.org/mavlink/
|
||||||
|
*/
|
||||||
|
#ifndef ARDUPILOTMEGA_H
|
||||||
|
#define ARDUPILOTMEGA_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// MESSAGE LENGTHS AND CRCS
|
||||||
|
|
||||||
|
#ifndef MAVLINK_MESSAGE_LENGTHS
|
||||||
|
#define MAVLINK_MESSAGE_LENGTHS {9, 31, 12, 0, 14, 28, 3, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 25, 23, 30, 101, 22, 26, 16, 14, 28, 32, 28, 0, 28, 22, 22, 21, 0, 36, 4, 4, 2, 2, 4, 2, 2, 3, 13, 12, 19, 17, 15, 15, 27, 25, 18, 18, 20, 20, 0, 0, 26, 0, 36, 0, 6, 4, 0, 21, 18, 0, 0, 0, 20, 20, 32, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 42, 33, 0, 0, 0, 0, 0, 0, 0, 18, 32, 32, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 8, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 30, 18, 18, 51, 9, 3}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAVLINK_MESSAGE_CRCS
|
||||||
|
#define MAVLINK_MESSAGE_CRCS {50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 0, 104, 244, 237, 222, 0, 158, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 0, 0, 183, 0, 130, 0, 148, 21, 0, 52, 124, 0, 0, 0, 20, 160, 168, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 19, 102, 158, 208, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 219, 208, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 247}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAVLINK_MESSAGE_INFO
|
||||||
|
#define MAVLINK_MESSAGE_INFO {MAVLINK_MESSAGE_INFO_HEARTBEAT, MAVLINK_MESSAGE_INFO_SYS_STATUS, MAVLINK_MESSAGE_INFO_SYSTEM_TIME, {NULL}, MAVLINK_MESSAGE_INFO_PING, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL, MAVLINK_MESSAGE_INFO_CHANGE_OPERATOR_CONTROL_ACK, MAVLINK_MESSAGE_INFO_AUTH_KEY, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_SET_MODE, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_READ, MAVLINK_MESSAGE_INFO_PARAM_REQUEST_LIST, MAVLINK_MESSAGE_INFO_PARAM_VALUE, MAVLINK_MESSAGE_INFO_PARAM_SET, MAVLINK_MESSAGE_INFO_GPS_RAW_INT, MAVLINK_MESSAGE_INFO_GPS_STATUS, MAVLINK_MESSAGE_INFO_SCALED_IMU, MAVLINK_MESSAGE_INFO_RAW_IMU, MAVLINK_MESSAGE_INFO_RAW_PRESSURE, MAVLINK_MESSAGE_INFO_SCALED_PRESSURE, MAVLINK_MESSAGE_INFO_ATTITUDE, MAVLINK_MESSAGE_INFO_ATTITUDE_QUATERNION, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_NED, {NULL}, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION_INT, MAVLINK_MESSAGE_INFO_RC_CHANNELS_RAW, MAVLINK_MESSAGE_INFO_RC_CHANNELS_SCALED, MAVLINK_MESSAGE_INFO_SERVO_OUTPUT_RAW, {NULL}, MAVLINK_MESSAGE_INFO_MISSION_ITEM, MAVLINK_MESSAGE_INFO_MISSION_REQUEST, MAVLINK_MESSAGE_INFO_MISSION_SET_CURRENT, MAVLINK_MESSAGE_INFO_MISSION_CURRENT, MAVLINK_MESSAGE_INFO_MISSION_REQUEST_LIST, MAVLINK_MESSAGE_INFO_MISSION_COUNT, MAVLINK_MESSAGE_INFO_MISSION_CLEAR_ALL, MAVLINK_MESSAGE_INFO_MISSION_ITEM_REACHED, MAVLINK_MESSAGE_INFO_MISSION_ACK, MAVLINK_MESSAGE_INFO_SET_GPS_GLOBAL_ORIGIN, MAVLINK_MESSAGE_INFO_GPS_GLOBAL_ORIGIN, MAVLINK_MESSAGE_INFO_SET_LOCAL_POSITION_SETPOINT, MAVLINK_MESSAGE_INFO_LOCAL_POSITION_SETPOINT, MAVLINK_MESSAGE_INFO_GLOBAL_POSITION_SETPOINT_INT, MAVLINK_MESSAGE_INFO_SET_GLOBAL_POSITION_SETPOINT_INT, MAVLINK_MESSAGE_INFO_SAFETY_SET_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SAFETY_ALLOWED_AREA, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_THRUST, MAVLINK_MESSAGE_INFO_SET_ROLL_PITCH_YAW_SPEED_THRUST, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_THRUST_SETPOINT, MAVLINK_MESSAGE_INFO_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_NAV_CONTROLLER_OUTPUT, {NULL}, MAVLINK_MESSAGE_INFO_STATE_CORRECTION, {NULL}, MAVLINK_MESSAGE_INFO_REQUEST_DATA_STREAM, MAVLINK_MESSAGE_INFO_DATA_STREAM, {NULL}, MAVLINK_MESSAGE_INFO_MANUAL_CONTROL, MAVLINK_MESSAGE_INFO_RC_CHANNELS_OVERRIDE, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_VFR_HUD, MAVLINK_MESSAGE_INFO_COMMAND_SHORT, MAVLINK_MESSAGE_INFO_COMMAND_LONG, MAVLINK_MESSAGE_INFO_COMMAND_ACK, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_HIL_STATE, MAVLINK_MESSAGE_INFO_HIL_CONTROLS, MAVLINK_MESSAGE_INFO_HIL_RC_INPUTS_RAW, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_OPTICAL_FLOW, MAVLINK_MESSAGE_INFO_GLOBAL_VISION_POSITION_ESTIMATE, MAVLINK_MESSAGE_INFO_VISION_POSITION_ESTIMATE, MAVLINK_MESSAGE_INFO_VISION_SPEED_ESTIMATE, MAVLINK_MESSAGE_INFO_VICON_POSITION_ESTIMATE, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_SENSOR_OFFSETS, MAVLINK_MESSAGE_INFO_SET_MAG_OFFSETS, MAVLINK_MESSAGE_INFO_MEMINFO, MAVLINK_MESSAGE_INFO_AP_ADC, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, {NULL}, MAVLINK_MESSAGE_INFO_MEMORY_VECT, MAVLINK_MESSAGE_INFO_DEBUG_VECT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_FLOAT, MAVLINK_MESSAGE_INFO_NAMED_VALUE_INT, MAVLINK_MESSAGE_INFO_STATUSTEXT, MAVLINK_MESSAGE_INFO_DEBUG, MAVLINK_MESSAGE_INFO_EXTENDED_MESSAGE}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "../protocol.h"
|
||||||
|
|
||||||
|
#define MAVLINK_ENABLED_ARDUPILOTMEGA
|
||||||
|
|
||||||
|
#include "../common/common.h"
|
||||||
|
|
||||||
|
// MAVLINK VERSION
|
||||||
|
|
||||||
|
#ifndef MAVLINK_VERSION
|
||||||
|
#define MAVLINK_VERSION 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (MAVLINK_VERSION == 0)
|
||||||
|
#undef MAVLINK_VERSION
|
||||||
|
#define MAVLINK_VERSION 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ENUM DEFINITIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// MESSAGE DEFINITIONS
|
||||||
|
#include "./mavlink_msg_sensor_offsets.h"
|
||||||
|
#include "./mavlink_msg_set_mag_offsets.h"
|
||||||
|
#include "./mavlink_msg_meminfo.h"
|
||||||
|
#include "./mavlink_msg_ap_adc.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif // __cplusplus
|
||||||
|
#endif // ARDUPILOTMEGA_H
|
@ -0,0 +1,22 @@
|
|||||||
|
/** @file
|
||||||
|
* @brief MAVLink comm protocol testsuite generated from ardupilotmega.xml
|
||||||
|
* @see http://qgroundcontrol.org/mavlink/
|
||||||
|
* Generated on Wed Aug 24 17:14:16 2011
|
||||||
|
*/
|
||||||
|
#ifndef ARDUPILOTMEGA_TESTSUITE_H
|
||||||
|
#define ARDUPILOTMEGA_TESTSUITE_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void mavtest_generate_outputs(mavlink_channel_t chan)
|
||||||
|
{
|
||||||
|
mavlink_msg_sensor_offsets_send(chan , 19107 , 19211 , 19315 , 17.0 , 963497672 , 963497880 , 101.0 , 129.0 , 157.0 , 185.0 , 213.0 , 241.0 );
|
||||||
|
mavlink_msg_set_mag_offsets_send(chan , 151 , 218 , 17235 , 17339 , 17443 );
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif // __cplusplus
|
||||||
|
#endif // ARDUPILOTMEGA_TESTSUITE_H
|
27
libraries/GCS_MAVLink/include_v1.0/ardupilotmega/mavlink.h
Normal file
27
libraries/GCS_MAVLink/include_v1.0/ardupilotmega/mavlink.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/** @file
|
||||||
|
* @brief MAVLink comm protocol built from ardupilotmega.xml
|
||||||
|
* @see http://pixhawk.ethz.ch/software/mavlink
|
||||||
|
*/
|
||||||
|
#ifndef MAVLINK_H
|
||||||
|
#define MAVLINK_H
|
||||||
|
|
||||||
|
#ifndef MAVLINK_STX
|
||||||
|
#define MAVLINK_STX 254
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAVLINK_ENDIAN
|
||||||
|
#define MAVLINK_ENDIAN MAVLINK_LITTLE_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAVLINK_ALIGNED_FIELDS
|
||||||
|
#define MAVLINK_ALIGNED_FIELDS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAVLINK_CRC_EXTRA
|
||||||
|
#define MAVLINK_CRC_EXTRA 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "version.h"
|
||||||
|
#include "ardupilotmega.h"
|
||||||
|
|
||||||
|
#endif // MAVLINK_H
|
@ -0,0 +1,254 @@
|
|||||||
|
// MESSAGE AP_ADC PACKING
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_ADC 153
|
||||||
|
|
||||||
|
typedef struct __mavlink_ap_adc_t
|
||||||
|
{
|
||||||
|
uint16_t adc1; ///< ADC output 1
|
||||||
|
uint16_t adc2; ///< ADC output 2
|
||||||
|
uint16_t adc3; ///< ADC output 3
|
||||||
|
uint16_t adc4; ///< ADC output 4
|
||||||
|
uint16_t adc5; ///< ADC output 5
|
||||||
|
uint16_t adc6; ///< ADC output 6
|
||||||
|
} mavlink_ap_adc_t;
|
||||||
|
|
||||||
|
#define MAVLINK_MSG_ID_AP_ADC_LEN 12
|
||||||
|
#define MAVLINK_MSG_ID_153_LEN 12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define MAVLINK_MESSAGE_INFO_AP_ADC { \
|
||||||
|
"AP_ADC", \
|
||||||
|
6, \
|
||||||
|
{ { "adc1", NULL, MAVLINK_TYPE_UINT16_T, 0, 0, offsetof(mavlink_ap_adc_t, adc1) }, \
|
||||||
|
{ "adc2", NULL, MAVLINK_TYPE_UINT16_T, 0, 2, offsetof(mavlink_ap_adc_t, adc2) }, \
|
||||||
|
{ "adc3", NULL, MAVLINK_TYPE_UINT16_T, 0, 4, offsetof(mavlink_ap_adc_t, adc3) }, \
|
||||||
|
{ "adc4", NULL, MAVLINK_TYPE_UINT16_T, 0, 6, offsetof(mavlink_ap_adc_t, adc4) }, \
|
||||||
|
{ "adc5", NULL, MAVLINK_TYPE_UINT16_T, 0, 8, offsetof(mavlink_ap_adc_t, adc5) }, \
|
||||||
|
{ "adc6", NULL, MAVLINK_TYPE_UINT16_T, 0, 10, offsetof(mavlink_ap_adc_t, adc6) }, \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_adc message
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
*
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_pack(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg,
|
||||||
|
uint16_t adc1, uint16_t adc2, uint16_t adc3, uint16_t adc4, uint16_t adc5, uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 12);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 12);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_ADC;
|
||||||
|
return mavlink_finalize_message(msg, system_id, component_id, 12, 188);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Pack a ap_adc message on a channel
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param chan The MAVLink channel this message was sent over
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
* @return length of the message in bytes (excluding serial stream start sign)
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_pack_chan(uint8_t system_id, uint8_t component_id, uint8_t chan,
|
||||||
|
mavlink_message_t* msg,
|
||||||
|
uint16_t adc1,uint16_t adc2,uint16_t adc3,uint16_t adc4,uint16_t adc5,uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), buf, 12);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
memcpy(_MAV_PAYLOAD(msg), &packet, 12);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msg->msgid = MAVLINK_MSG_ID_AP_ADC;
|
||||||
|
return mavlink_finalize_message_chan(msg, system_id, component_id, chan, 12, 188);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Encode a ap_adc struct into a message
|
||||||
|
*
|
||||||
|
* @param system_id ID of this system
|
||||||
|
* @param component_id ID of this component (e.g. 200 for IMU)
|
||||||
|
* @param msg The MAVLink message to compress the data into
|
||||||
|
* @param ap_adc C-struct to read the message contents from
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_encode(uint8_t system_id, uint8_t component_id, mavlink_message_t* msg, const mavlink_ap_adc_t* ap_adc)
|
||||||
|
{
|
||||||
|
return mavlink_msg_ap_adc_pack(system_id, component_id, msg, ap_adc->adc1, ap_adc->adc2, ap_adc->adc3, ap_adc->adc4, ap_adc->adc5, ap_adc->adc6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a ap_adc message
|
||||||
|
* @param chan MAVLink channel to send the message
|
||||||
|
*
|
||||||
|
* @param adc1 ADC output 1
|
||||||
|
* @param adc2 ADC output 2
|
||||||
|
* @param adc3 ADC output 3
|
||||||
|
* @param adc4 ADC output 4
|
||||||
|
* @param adc5 ADC output 5
|
||||||
|
* @param adc6 ADC output 6
|
||||||
|
*/
|
||||||
|
#ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
|
||||||
|
|
||||||
|
static inline void mavlink_msg_ap_adc_send(mavlink_channel_t chan, uint16_t adc1, uint16_t adc2, uint16_t adc3, uint16_t adc4, uint16_t adc5, uint16_t adc6)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP || !MAVLINK_ALIGNED_FIELDS
|
||||||
|
char buf[12];
|
||||||
|
_mav_put_uint16_t(buf, 0, adc1);
|
||||||
|
_mav_put_uint16_t(buf, 2, adc2);
|
||||||
|
_mav_put_uint16_t(buf, 4, adc3);
|
||||||
|
_mav_put_uint16_t(buf, 6, adc4);
|
||||||
|
_mav_put_uint16_t(buf, 8, adc5);
|
||||||
|
_mav_put_uint16_t(buf, 10, adc6);
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_ADC, buf, 12, 188);
|
||||||
|
#else
|
||||||
|
mavlink_ap_adc_t packet;
|
||||||
|
packet.adc1 = adc1;
|
||||||
|
packet.adc2 = adc2;
|
||||||
|
packet.adc3 = adc3;
|
||||||
|
packet.adc4 = adc4;
|
||||||
|
packet.adc5 = adc5;
|
||||||
|
packet.adc6 = adc6;
|
||||||
|
|
||||||
|
_mav_finalize_message_chan_send(chan, MAVLINK_MSG_ID_AP_ADC, (const char *)&packet, 12, 188);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// MESSAGE AP_ADC UNPACKING
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc1 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 1
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc1(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc2 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 2
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc2(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc3 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 3
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc3(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc4 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 4
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc4(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc5 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 5
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc5(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get field adc6 from ap_adc message
|
||||||
|
*
|
||||||
|
* @return ADC output 6
|
||||||
|
*/
|
||||||
|
static inline uint16_t mavlink_msg_ap_adc_get_adc6(const mavlink_message_t* msg)
|
||||||
|
{
|
||||||
|
return _MAV_RETURN_uint16_t(msg, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Decode a ap_adc message into a struct
|
||||||
|
*
|
||||||
|
* @param msg The message to decode
|
||||||
|
* @param ap_adc C-struct to decode the message contents into
|
||||||
|
*/
|
||||||
|
static inline void mavlink_msg_ap_adc_decode(const mavlink_message_t* msg, mavlink_ap_adc_t* ap_adc)
|
||||||
|
{
|
||||||
|
#if MAVLINK_NEED_BYTE_SWAP
|
||||||
|
ap_adc->adc1 = mavlink_msg_ap_adc_get_adc1(msg);
|
||||||
|
ap_adc->adc2 = mavlink_msg_ap_adc_get_adc2(msg);
|
||||||
|
ap_adc->adc3 = mavlink_msg_ap_adc_get_adc3(msg);
|
||||||
|
ap_adc->adc4 = mavlink_msg_ap_adc_get_adc4(msg);
|
||||||
|
ap_adc->adc5 = mavlink_msg_ap_adc_get_adc5(msg);
|
||||||
|
ap_adc->adc6 = mavlink_msg_ap_adc_get_adc6(msg);
|
||||||
|
#else
|
||||||
|
memcpy(ap_adc, _MAV_PAYLOAD(msg), 12);
|
||||||
|
#endif
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user